index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. <template>
  2. <div class="calendar-dialog">
  3. <el-row :gutter="10">
  4. <!--table数据-->
  5. <el-col :span="24" :xs="24">
  6. <div class="main-right-box">
  7. <!-- 搜索条件 -->
  8. <div class="main-search-box">
  9. <el-form
  10. :model="queryParams"
  11. ref="queryForm"
  12. size="small"
  13. :inline="true"
  14. v-show="showSearch"
  15. >
  16. <el-form-item label="机构名称">
  17. <org-tree
  18. v-model="queryParams.orgId"
  19. @defaultKey="getDefaultKey"
  20. @checkChange="changeCheckBox"
  21. @click="handleNodeClick"
  22. :showCheckSub="false"
  23. :defaultCheckSub="false"
  24. ref="orgTree"
  25. ></org-tree>
  26. </el-form-item>
  27. </el-form>
  28. </div>
  29. <div style="display: flex">
  30. <div style="width: 65%">
  31. <el-calendar v-model="calendarDate">
  32. <!-- <template
  33. slot="dateCell"
  34. slot-scope="{date, data}">
  35. <p :class="data.isSelected ? 'is-selected' : ''">
  36. {{ data.day.split('-').slice(1).join('-') }} {{ data.isSelected ? '✔️' : ''}}
  37. </p>
  38. </template> -->
  39. <template slot="dateCell" slot-scope="{ data }">
  40. <div class="card-group" @click="selectedDate(data)">
  41. <div
  42. :class="
  43. data.isSelected
  44. ? 'is-selected card-calendar-text'
  45. : 'card-calendar-text'
  46. "
  47. >
  48. <span>{{ getDate(data.day) }}</span>
  49. <el-icon
  50. class="el-icon-check"
  51. v-if="data.isSelected"
  52. ></el-icon>
  53. </div>
  54. <div v-if="isSetedWorkTime(data)" style="height: 100%">
  55. <span
  56. v-for="(item, index) in tableList"
  57. :key="index"
  58. class="card"
  59. >
  60. <div v-if="item.ymdDate === data.day" class="card-flag">
  61. <div :class="getDayClass(data, item)">
  62. <span>{{ getDate(data.day) }}</span>
  63. <el-icon
  64. class="el-icon-check"
  65. v-if="data.isSelected"
  66. ></el-icon>
  67. </div>
  68. <div :class="'card' + getColorIndexByWorkTime(item)">
  69. <div class="visits-val">
  70. {{ item.isDuty === "1" ? "值班" : "" }}
  71. </div>
  72. </div>
  73. </div>
  74. </span>
  75. </div>
  76. <div v-else style="height: 100%">
  77. <span class="card">
  78. <div class="card-flag">
  79. <div :class="getDayClass(data, null)">
  80. <span>{{ getDate(data.day) }}</span>
  81. <el-icon
  82. class="el-icon-check"
  83. v-if="data.isSelected"
  84. ></el-icon>
  85. </div>
  86. <div :class="'card' + getColorIndexByWorkTime(null)">
  87. <div class="visits-val">{{ "" }}</div>
  88. </div>
  89. </div>
  90. </span>
  91. </div>
  92. </div>
  93. </template>
  94. </el-calendar>
  95. </div>
  96. <div
  97. style="
  98. width: 35%;
  99. background-color: #fff;
  100. margin-left: 10px;
  101. box-shadow: 2px 2px 8px #ccc;
  102. "
  103. >
  104. <el-form
  105. :model="formData"
  106. :rules="formData.isEnable ? currentRules : {}"
  107. size="small"
  108. ref="form"
  109. label-position="right"
  110. label-width="120px"
  111. label-prefix=":"
  112. >
  113. <el-row :gutter="20">
  114. <!-- <el-col :span="24">
  115. <el-form-item prop="orgName" label="机构:" >
  116. <span>{{formData.orgName}}</span>
  117. </el-form-item>
  118. </el-col> -->
  119. <el-col :span="24">
  120. <el-form-item label="日期:">
  121. <span>{{ formData.ymdDate }}</span>
  122. </el-form-item>
  123. </el-col>
  124. <el-col :span="24">
  125. <el-form-item label="星期:">
  126. <span>{{ parseTime(formData.ymdDate, "dddd") }}</span>
  127. </el-form-item>
  128. </el-col>
  129. <el-col :span="24">
  130. <el-form-item prop="isEnable" label="状态:">
  131. <template>
  132. <el-radio-group
  133. v-model="formData.isEnable"
  134. @change="onEnableChange(formData)"
  135. >
  136. <el-radio text-color="#48bb78" label="1"
  137. >营业</el-radio
  138. >
  139. <el-radio text-color="#f56565" label="0"
  140. >歇业</el-radio
  141. >
  142. </el-radio-group>
  143. </template>
  144. </el-form-item>
  145. </el-col>
  146. <el-col :span="24">
  147. <el-form-item prop="isEnable" label="值班打卡:">
  148. <template>
  149. <el-radio-group v-model="formData.isDuty">
  150. <el-radio text-color="#48bb78" label="1">是</el-radio>
  151. <el-radio text-color="#f56565" label="0">否</el-radio>
  152. </el-radio-group>
  153. </template>
  154. </el-form-item>
  155. </el-col>
  156. <el-col v-if="formData.isEnable == '1'" :span="24">
  157. <el-form-item prop="workTime" label="上班时间:">
  158. <template>
  159. <el-time-select
  160. :picker-options="pickerOptions"
  161. v-model="formData.workTime"
  162. />
  163. </template>
  164. </el-form-item>
  165. </el-col>
  166. <el-col v-if="formData.isEnable == '1'" :span="24">
  167. <el-form-item prop="workOffTime" label="下班时间:">
  168. <template>
  169. <el-time-select
  170. :picker-options="pickerOptions"
  171. v-model="formData.workOffTime"
  172. />
  173. </template>
  174. </el-form-item>
  175. </el-col>
  176. <el-col v-if="formData.isEnable == '1'" :span="24">
  177. <el-form-item prop="openTime" label="营业开始:">
  178. <template>
  179. <el-time-select
  180. :picker-options="pickerOptions"
  181. v-model="formData.openTime"
  182. />
  183. </template>
  184. </el-form-item>
  185. </el-col>
  186. <el-col v-if="formData.isEnable == '1'" :span="24">
  187. <el-form-item prop="closeTime" label="营业结束:">
  188. <template>
  189. <el-time-select
  190. :picker-options="pickerOptions"
  191. v-model="formData.closeTime"
  192. />
  193. </template>
  194. </el-form-item>
  195. </el-col>
  196. <el-col v-if="canSave()" :span="24">
  197. <el-form-item>
  198. <el-button type="primary" @click="onSubmit"
  199. >保存</el-button
  200. >
  201. </el-form-item>
  202. </el-col>
  203. <el-col v-if="canSave()" :span="24">
  204. <el-form-item>
  205. <el-button type="primary" @click="submitCopyMouth"
  206. >复制到全月并保存</el-button
  207. >
  208. </el-form-item>
  209. </el-col>
  210. </el-row>
  211. </el-form>
  212. </div>
  213. </div>
  214. </div>
  215. </el-col>
  216. </el-row>
  217. <dialog-template ref="modalTemplate" @ok="getList"></dialog-template>
  218. </div>
  219. </template>
  220. <script>
  221. import OrgTree from "@/components/orgTree/orgQuerySelector.vue";
  222. import { mapGetters } from "vuex";
  223. import { tableList } from "./api";
  224. import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
  225. import dayjs from "dayjs";
  226. import { timeCheck } from "@/utils/ruoyi";
  227. import { editWorkTime, addWorkTimeDay } from "@/views/system/workTimeSet/api";
  228. import DialogTemplate from "./dialog.template";
  229. //初始化查询日期
  230. // let sDate =new Date(dayjs().subtract(1, 'month').startOf('month'));
  231. // let eDate = new Date(dayjs().add(1, 'month').endOf('month'));
  232. export default {
  233. // emits: ['selectedDate'],
  234. /** 得先引入字典才能使用 */
  235. dicts: ["sys_business_type", "sys_org_type"],
  236. /** 引入基础minxins*/
  237. components: { DataRangePicker, OrgTree, DialogTemplate },
  238. data() {
  239. return {
  240. nowTime: null,
  241. isLoadedCalendarDate: false,
  242. // 遮罩层
  243. loading: false,
  244. calendarDate: new Date(),
  245. tableList: null,
  246. // 显示搜索条件
  247. showSearch: true,
  248. // 查询参数
  249. queryParams: {
  250. checkSub: false,
  251. orgId: null,
  252. pageNum: 1,
  253. pageSize: 200,
  254. range: [
  255. new Date(dayjs().subtract(1, "month").startOf("month")),
  256. new Date(dayjs().add(1, "month").endOf("month")),
  257. ],
  258. noWorkTime: false,
  259. },
  260. formData: {},
  261. // formDataRules: {
  262. // isEnable: [{ required: true, message: "请选择状态" }],
  263. // workTime: [{ required: true, message: "请输入上班时间" }],
  264. // workOffTime: [{ required: true, message: "请输入下班时间" }],
  265. // openTime: [{ required: true, message: "请输入营业开始时间" }],
  266. // closeTime: [{ required: true, message: "请输入营业结束时间" }],
  267. // },
  268. };
  269. },
  270. mounted() {
  271. let prevBtn = document.querySelector(
  272. ".el-calendar__button-group .el-button-group>button:nth-child(1)"
  273. );
  274. prevBtn.addEventListener("click", () => {
  275. this.judgeDate(this.calendarDate);
  276. });
  277. let dayBtn = document.querySelector(
  278. ".el-calendar__button-group .el-button-group>button:nth-child(2)"
  279. );
  280. dayBtn.addEventListener("click", () => {
  281. this.judgeDate(this.calendarDate);
  282. });
  283. let nextBtn = document.querySelector(
  284. ".el-calendar__button-group .el-button-group>button:nth-child(3)"
  285. );
  286. nextBtn.addEventListener("click", () => {
  287. this.judgeDate(this.calendarDate);
  288. });
  289. let parent = document.querySelector(
  290. ".el-calendar__header .el-calendar__button-group .el-button-group"
  291. );
  292. // 创建一个颜色含义图示
  293. let btnDuty = this.createButton("营业", "btnDuty", "10px");
  294. let btnUnDuty = this.createButton("歇业", "btnUnDuty", "10px");
  295. let btnUnSetWorkTime = this.createButton("未配置", "btnUnSetWorkTime", "100px");
  296. let btnTemplate = this.createButton("模板配置", "btnTemplate", "10px");
  297. btnTemplate.onclick = function () {
  298. // 触发事件
  299. showWorkTimeTemp();
  300. };
  301. var that = this;
  302. function showWorkTimeTemp() {
  303. // 事件内容
  304. that.showTemplateDailog();
  305. }
  306. parent.insertBefore(btnTemplate, parent.firstChild);
  307. parent.insertBefore(btnUnSetWorkTime, parent.firstChild);
  308. parent.insertBefore(btnUnDuty, parent.firstChild);
  309. parent.insertBefore(btnDuty, parent.firstChild);
  310. },
  311. computed: {
  312. ...mapGetters(["orgId"]),
  313. pickerOptions() {
  314. return {
  315. start: "00:00",
  316. end: "24:00",
  317. step: "00:05",
  318. };
  319. },
  320. currentRules: function () {
  321. if (!this.canSave()) {
  322. return {};
  323. } else {
  324. return {
  325. isEnable: [{ required: true, message: "请选择状态" }],
  326. workTime: [{ required: true, message: "请输入上班时间" }],
  327. workOffTime: [{ required: true, message: "请输入下班时间" }],
  328. openTime: [{ required: true, message: "请输入营业开始时间" }],
  329. closeTime: [{ required: true, message: "请输入营业结束时间" }],
  330. };
  331. }
  332. },
  333. },
  334. created() {
  335. this.getNowTime();
  336. },
  337. watch: {
  338. calendarDate(val, oldVal) {
  339. if (
  340. val &&
  341. dayjs(val).format("YYYY-MM") != dayjs(oldVal).format("YYYY-MM")
  342. ) {
  343. console.log("calendarDate", val);
  344. this.judgeDate(val);
  345. }
  346. },
  347. },
  348. methods: {
  349. dayjs,
  350. createButton(btnContent, backgroundColorCss, marginRight) {
  351. let button = document.createElement("button");
  352. button.type = "button"; // 类型
  353. button.className = `el-button el-button--plain el-button--mini ${backgroundColorCss}`; // Calendar默认按钮样式
  354. button.textContent = btnContent; // 文本
  355. button.style.cssText = `color:white;margin-left:auto;margin-right:${marginRight}`; // 样式
  356. return button;
  357. },
  358. showTemplateDailog() {
  359. this.$refs.modalTemplate.show(this.queryParams.orgId);
  360. },
  361. judgeDate(calendarDate) {
  362. console.log(
  363. "judgeDate calendarDate",
  364. dayjs(calendarDate).format("YYYY-MM-DD")
  365. );
  366. let sDate = new Date(
  367. dayjs(calendarDate).subtract(1, "month").startOf("month")
  368. );
  369. let eDate = new Date(dayjs(calendarDate).add(1, "month").endOf("month"));
  370. this.queryParams.range = [sDate, eDate];
  371. this.getList();
  372. },
  373. selectedDate(data) {
  374. console.log("selectedDate--->prefix", data);
  375. this.loadFormData(data.day);
  376. },
  377. loadFormData(day) {
  378. // console.log('selectedDate--->prefix', data)
  379. let selectedData = null;
  380. if (this.tableList && this.tableList.length > 0) {
  381. let index = this.tableList.findIndex((x) => x.ymdDate === day);
  382. if (index > -1) {
  383. selectedData = this.tableList[index];
  384. this.formData = selectedData;
  385. } else {
  386. this.formData = this.reset(day);
  387. }
  388. } else {
  389. this.formData = this.reset(day);
  390. }
  391. this.$nextTick(() => {
  392. this.$refs.form.clearValidate();
  393. });
  394. // this.$refs.form.clearValidate();
  395. console.log("selectedDate--->suffix", selectedData);
  396. },
  397. firstLoadFormData() {
  398. if (!this.isLoadedCalendarDate) {
  399. this.loadFormData(dayjs().format("YYYY-MM-DD"));
  400. this.isLoadedCalendarDate = true;
  401. }
  402. },
  403. reset(day) {
  404. return {
  405. orgId: this.queryParams.orgId,
  406. isEnable: "1",
  407. isDuty: "0",
  408. openTime: null,
  409. closeTime: null,
  410. workTime: null,
  411. workOffTime: null,
  412. ymdDate: day,
  413. };
  414. },
  415. isSetedWorkTime(data) {
  416. // console.log("isSetedWorkTime",data,this.tableList)
  417. if (this.tableList && this.tableList.length > 0) {
  418. // console.log("isSetedWorkTime indexOf",this.tableList.findIndex(x=>x.ymdDate === data.day))
  419. if (this.tableList.findIndex((x) => x.ymdDate === data.day) > -1) {
  420. return true;
  421. }
  422. }
  423. return false;
  424. },
  425. getDayClass(data, item) {
  426. let tempColorIndex = this.getColorIndexByWorkTime(item);
  427. return data.isSelected
  428. ? "is-selected" + " " + "card-text" + tempColorIndex
  429. : "card-text" + tempColorIndex;
  430. },
  431. getColorIndexByWorkTime(item) {
  432. if (item) return item.isEnable == "1" ? "2" : "3";
  433. else return "1";
  434. },
  435. getDate(day) {
  436. return dayjs(day).format("DD");
  437. },
  438. getNowTime() {
  439. const dateObj = new Date(); // 获取当前时间对象
  440. const year = dateObj.getFullYear(); // 获取年份
  441. const month = String(dateObj.getMonth() + 1).padStart(2, "0"); // 获取月份,并补齐两位数
  442. const day = String(dateObj.getDate()).padStart(2, "0"); // 获取日期,并补齐两位数
  443. this.nowTime = `${year}-${month}-${day}`;
  444. },
  445. getDefaultKey(key) {
  446. this.queryParams.orgId = key;
  447. this.getList();
  448. },
  449. /** 下穿状态改变*/
  450. changeCheckBox() {
  451. this.queryParams.checkSub = !this.queryParams.checkSub;
  452. this.getList();
  453. },
  454. /** 查询列表 */
  455. getList() {
  456. this.loading = true;
  457. console.log(this.queryParams, "pages");
  458. tableList(this.queryParams)
  459. .then((response) => {
  460. this.tableList = response.rows;
  461. this.total = response.total;
  462. this.loading = false;
  463. this.firstLoadFormData();
  464. })
  465. .catch((err) => {
  466. this.loading = false;
  467. });
  468. },
  469. // 节点单击事件
  470. handleNodeClick(data) {
  471. this.queryParams.orgId = data.id;
  472. this.getList();
  473. },
  474. canSave() {
  475. console.log(
  476. "canSave",
  477. this.calendarDate,
  478. dayjs(this.calendarDate).startOf("day"),
  479. dayjs(this.calendarDate).startOf("day").isBefore(dayjs())
  480. );
  481. if (dayjs(this.calendarDate).startOf("day").isBefore(dayjs())) {
  482. return false;
  483. }
  484. return true;
  485. },
  486. onSubmit() {
  487. this.$refs.form.validate((isValidate) => {
  488. if (!isValidate) return;
  489. if (
  490. !timeCheck([
  491. this.formData.workTime,
  492. this.formData.openTime,
  493. this.formData.closeTime,
  494. this.formData.workOffTime,
  495. ])
  496. ) {
  497. this.$message.error(
  498. `请按照(上班时间<营业时间<营业结束<下班时间)顺序配置`
  499. );
  500. return false;
  501. }
  502. editWorkTime(this.formData).then((res) => {
  503. this.$message.success("保存成功");
  504. this.getList();
  505. });
  506. });
  507. },
  508. /* 重置搜索 */
  509. resetForm(name) {
  510. this.queryParams.isEnable = null;
  511. this.queryParams.pageNum = 1;
  512. this.queryParams.pageSize = 10;
  513. this.queryParams.orgId = this.orgId;
  514. this.queryParams.checkSub = true;
  515. this.queryParams.noWorkTime = false;
  516. this.$refs["orgTree"].setCheckSub(this.queryParams.checkSub);
  517. this.queryParams.range = [
  518. dayjs().startOf("month"),
  519. dayjs().endOf("month"),
  520. ];
  521. this.getList();
  522. },
  523. submitCopyMouth() {
  524. if (!this.formData.ymdDate) return this.$message.error("请选择日期");
  525. if (this.formData.isEnable === null)
  526. return this.$message.error("请选择营业状态");
  527. if (this.formData.isEnable == "1") {
  528. if (!this.formData.openTime)
  529. return this.$message.error("请选择开始时间");
  530. if (!this.formData.closeTime)
  531. return this.$message.error("请选择结束时间");
  532. if (!this.formData.workTime)
  533. return this.$message.error("请选择上班时间");
  534. if (!this.formData.workOffTime)
  535. return this.$message.error("请选择下班时间");
  536. if (!timeCheck([this.formData.openTime, this.formData.closeTime]))
  537. return this.$message.error("开始时间不能大于结束时间");
  538. if (!timeCheck([this.formData.workTime, this.formData.workOffTime]))
  539. return this.$message.error("上班时间不能大于下班时间");
  540. }
  541. let data = {
  542. orgIdList: [this.formData.orgId],
  543. workTimeList: this.copyDataToMonth(),
  544. };
  545. console.log("submitCopyMouth", data);
  546. addWorkTimeDay(data).then((res) => {
  547. this.$message.success("保存成功");
  548. this.getList();
  549. });
  550. },
  551. copyDataToMonth() {
  552. let startOfMonthDay = dayjs(this.formData.ymdDate).startOf("month");
  553. let endOfMonthDay = dayjs(this.formData.ymdDate).endOf("month");
  554. let dataList = [];
  555. while (startOfMonthDay.isBefore(endOfMonthDay)) {
  556. let temp = { ...this.formData };
  557. temp.ymdDate = startOfMonthDay.format("YYYY-MM-DD");
  558. dataList.push(temp);
  559. startOfMonthDay = startOfMonthDay.add(1, "day");
  560. }
  561. return dataList;
  562. },
  563. },
  564. };
  565. </script>
  566. <style lang="scss">
  567. // 更改elementplus组件的样式
  568. .calendar-dialog {
  569. .el-calendar-table .el-calendar-day {
  570. padding: 0;
  571. }
  572. .el-icon {
  573. height: 8px;
  574. }
  575. .card-group.card-calendar-text {
  576. display: flex;
  577. justify-content: space-between;
  578. }
  579. .el-calendar {
  580. box-shadow: 0 0 12px 0 #e4e7ed;
  581. .el-calendar-table {
  582. thead {
  583. background-color: #f5f7fa;
  584. }
  585. }
  586. }
  587. }
  588. </style>
  589. <style lang="scss" scoped>
  590. $titleHeight: 20px;
  591. $dutyColor: rgb(47, 133, 90);
  592. $unSetWorkTime: #bdbdbd;
  593. $unDutyColor: rgb(183, 121, 31);
  594. $btnTemplate: #008CD6;
  595. @mixin btn-o($btnBgColor) {
  596. background-color: $btnBgColor;
  597. }
  598. @mixin card-o($bgColor) {
  599. position: relative;
  600. display: block;
  601. width: 100%;
  602. height: 100%;
  603. font-size: 15px;
  604. color: #fff;
  605. background-color: $bgColor;
  606. }
  607. @mixin card-text-o($bgColor) {
  608. display: flex;
  609. justify-content: space-between;
  610. height: $titleHeight;
  611. max-height: $titleHeight;
  612. min-height: $titleHeight;
  613. font-size: 20px;
  614. color: #fff;
  615. background-color: $bgColor;
  616. }
  617. .calendar-dialog {
  618. ::v-deep .el-calendar{
  619. .el-calendar__header{
  620. .el-calendar__button-group{
  621. .el-button-group{
  622. .btnDuty{
  623. @include btn-o($dutyColor);
  624. }
  625. .btnUnDuty{
  626. @include btn-o($unDutyColor);
  627. }
  628. .btnUnSetWorkTime{
  629. @include btn-o($unSetWorkTime);
  630. }
  631. .btnTemplate{
  632. @include btn-o($btnTemplate);
  633. }
  634. }
  635. }
  636. }
  637. }
  638. .card-group {
  639. width: 100%;
  640. height: 100%;
  641. .card-calendar-text {
  642. height: $titleHeight;
  643. max-height: $titleHeight;
  644. min-height: $titleHeight;
  645. }
  646. .card {
  647. position: relative;
  648. top: -$titleHeight;
  649. }
  650. .card-flag {
  651. height: calc(100% - $titleHeight);
  652. }
  653. .card1 {
  654. @include card-o($unSetWorkTime);
  655. }
  656. .card-text1 {
  657. @include card-text-o($unSetWorkTime);
  658. }
  659. .card2 {
  660. @include card-o($dutyColor);
  661. }
  662. .card-text2 {
  663. @include card-text-o($dutyColor);
  664. }
  665. .card3 {
  666. @include card-o($unDutyColor);
  667. }
  668. .card-text3 {
  669. @include card-text-o($unDutyColor);
  670. }
  671. // .card1:focus, .card1:hover {
  672. // background-color:#33a3de
  673. // }
  674. // .card-text1:focus, .card-text1:hover {
  675. // background-color:#33a3de
  676. // }
  677. .visits-val {
  678. position: absolute;
  679. right: 0;
  680. bottom: 0;
  681. }
  682. }
  683. .card-group:focus,
  684. .card-group:hover {
  685. background-color: #33a3de;
  686. }
  687. }
  688. </style>