gantt.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. <template>
  2. <div class="ganttContainerBox">
  3. <div ref="ganttContainer" style="height: 100%;">
  4. </div>
  5. <!-- 任务详情信息弹出框 -->
  6. <el-dialog :class="''" :title="title" v-if="addFormVisible" append-to-body
  7. :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="840px" :top="'6vh'">
  8. <taskComponent ref="thskComponents" :integrationTask="integrationTask" :showOrNot="showOrNot"
  9. @closeBounced="closeBounced" :showMmeiLaiDe="true" :showMmeiLaiDeData="showMmeiLaiDeData"></taskComponent>
  10. <div slot="title" v-if="addForm.parentTid != null">
  11. <el-page-header @back="backToParentTask" :title="$t('parenttask')"
  12. :content="addForm.parentTname"></el-page-header>
  13. </div>
  14. </el-dialog>
  15. <!-- tooltip -->
  16. <div
  17. v-if="tooltip.visible"
  18. :style="`top:${tooltip.y}px;left:${tooltip.x}px;`"
  19. class="custom-tooltip-customize"
  20. >
  21. <div><b>开始时间:</b> {{ tooltip.task.start_date }}</div>
  22. <div><b>结束时间:</b> {{ tooltip.task.end_date }}</div>
  23. <div><b>计划工时:</b> {{ tooltip.task.dayDifference }} 天 {{ tooltip.task.time }} 小时</div>
  24. <div><b>项目名称:</b> {{ tooltip.task.projectName }}</div>
  25. <div><b>计划名称:</b> {{ tooltip.task.planName }}</div>
  26. </div>
  27. </div>
  28. </template>
  29. <script>
  30. import { gantt } from 'dhtmlx-gantt';
  31. // import 'dhtmlx-gantt/codebase/dhtmlxgantt.css'
  32. // import 'dhtmlx-gantt/codebase/locale/locale_cn' // 本地化
  33. import taskComponent from "@/components/taskComponent.vue"
  34. export default {
  35. name: 'gantt',
  36. components: {
  37. taskComponent
  38. },
  39. props: {
  40. tasks: {
  41. type: Object,
  42. default() {
  43. return { data: [], links: [] }
  44. }
  45. },
  46. stafforpro: '',
  47. valueDate: [],
  48. },
  49. data() {
  50. return {
  51. containerRect: null,
  52. taskFormVisible: false,
  53. addForm: {},
  54. addLoading: false,
  55. title: '创建计划',
  56. commentList: [],
  57. dynamicTab: true,
  58. showOrNot: false,
  59. integrationTask: null,
  60. taskComponentFlg: false,
  61. addFormVisible: false,
  62. integrationTaskNingwai: {},
  63. integrationTask: {},
  64. user: JSON.parse(sessionStorage.getItem("user")),
  65. showMmeiLaiDeData: {},
  66. tooltip: {
  67. visible: false,
  68. task: null,
  69. x: 0,
  70. y: 0,
  71. }
  72. };
  73. },
  74. created: function () {
  75. // gantt.clearAll()
  76. // console.log("tasks",this.$props.tasks);
  77. },
  78. methods: {
  79. detaliTaskExposure(row) {
  80. const { taskId, ganttData } = row
  81. this.title = '编辑计划'
  82. this.showMmeiLaiDeData = JSON.parse(ganttData || '{}')
  83. setTimeout(() => {
  84. this.editTask({ taskId })
  85. }, 1000)
  86. },
  87. getDistanceToParent(element, parent) {
  88. let distance = 0;
  89. while (element && element !== parent) {
  90. distance += element.offsetTop; // 获取当前元素相对于父元素顶部的距离
  91. element = element.offsetParent; // 获取上一级父元素
  92. }
  93. return distance;
  94. },
  95. closeBounced(obj) {
  96. console.log(obj, '<======== 点击事件')
  97. if (!obj.backToParentTaskSub) {
  98. this.addFormVisible = false
  99. this.taskComponentFlg = false
  100. if (obj.submitInsert) {
  101. this.$emit('closeBounced', obj)
  102. }
  103. if(obj.deleteTask) {
  104. this.$emit('closeBounced', obj)
  105. }
  106. }
  107. },
  108. backToParentTask() {
  109. console.log('点击, <======== 点击了backToParentTask')
  110. },
  111. addTask(row) {
  112. this.showOrNot = true
  113. this.addForm = {
  114. projectId: '', groupId: '', stagesId: '', taskLevel: 0, planHours: 8, taskType: 0, startDate: row.date
  115. }
  116. const userIdList = (row.userId && row.userId.split(',')) || []
  117. const executorListFront = userIdList.map(item => {
  118. return {
  119. executorId: item,
  120. planHours: 8
  121. }
  122. })
  123. let obj = {
  124. create: true,
  125. addForm: this.addForm,
  126. executorListFront,
  127. stage: this.addForm,
  128. integrationTaskNingwai: this.integrationTaskNingwai,
  129. taskVue: true,
  130. meetingId: this.addForm.meetingId
  131. }
  132. this.integrationTask = obj
  133. this.addFormVisible = true
  134. },
  135. editTask(row) {
  136. this.showOrNot = true
  137. this.http.post('/task/getTask', { id: row.taskId },
  138. res => {
  139. if (res.code == "ok") {
  140. const data = res.data
  141. if(this.user.roleId != 2283 && !data.executorId) {
  142. this.$message({
  143. message: '这条数据只有区域经理才能分配',
  144. type: 'warning'
  145. });
  146. return
  147. }
  148. this.addForm = {
  149. id: data.id
  150. }
  151. this.integrationTask = {
  152. id: data.id,
  153. task: data,
  154. num: 1,
  155. curProjectId: data.projectId || '',
  156. create: false,
  157. integrationTaskNingwai: {
  158. groupId: data.groupId,
  159. isDesc: false,
  160. order: "seq",
  161. projectId: data.projectId || '',
  162. },
  163. taskVue: data.projectId ? false : true,
  164. meetingId: this.addForm.meetingId
  165. }
  166. this.addFormVisible = true
  167. } else {
  168. this.$message({ message: res.msg, type: "error" });
  169. }
  170. },
  171. error => {
  172. this.$message({ message: error, type: "error" });
  173. });
  174. },
  175. handleEmptyClick(row) {
  176. if (row.taskId) {
  177. // 编辑任务
  178. this.title = '编辑计划'
  179. this.editTask(row)
  180. } else {
  181. // 新增任务
  182. this.title = '创建计划'
  183. this.addTask(row)
  184. }
  185. },
  186. // 定位数据
  187. focusAndSelectTaskFull(taskId) {
  188. if (gantt.isTaskExists(taskId)) {
  189. var task = gantt.getTask(taskId);
  190. gantt.showTask(taskId);
  191. gantt.selectTask(taskId);
  192. // 检查日期有效性
  193. if (!(task.start_date instanceof Date) || !(task.end_date instanceof Date)) {
  194. console.error("Invalid date format in task:", task);
  195. return;
  196. }
  197. var midTime = (task.start_date.getTime() + task.end_date.getTime()) / 2;
  198. var midDate = new Date(midTime);
  199. gantt.scrollTo(gantt.posFromDate(midDate) - 200, gantt.getScrollState().y);
  200. }
  201. },
  202. observeTaskLines(gantt) {
  203. console.log(gantt, '<==== gantt')
  204. const taskContainer = gantt.$task_data;
  205. this.observer = new MutationObserver(() => {
  206. this.bindTooltipEvents();
  207. });
  208. this.observer.observe(taskContainer, {
  209. childList: true,
  210. subtree: true
  211. });
  212. this.bindTooltipEvents(); // 初次执行
  213. },
  214. bindTooltipEvents() {
  215. console.log('开始执行')
  216. const taskLines = this.$refs.ganttContainer.querySelectorAll(".gantt_task_line");
  217. taskLines.forEach(line => {
  218. const taskId = line.getAttribute("task_id");
  219. if (!taskId || line.dataset.bound === "true") return;
  220. line.dataset.bound = "true";
  221. line.addEventListener("mouseenter", (e) => {
  222. const rect = line.getBoundingClientRect();
  223. const task = gantt.getTask(taskId);
  224. if(!task.taskId) {
  225. this.tooltip.visible = false;
  226. return
  227. }
  228. console.log(task)
  229. const list = task.text.split('/')
  230. const d1 = this.dayjs(task.start_date);
  231. const d2 = this.dayjs(task.end_date);
  232. this.tooltip.task = {
  233. ...task,
  234. end_date: this.dayjs(task.endDateStr).format('YYYY-MM-DD HH:mm:ss'),
  235. start_date: this.dayjs(task.startDateStr).format('YYYY-MM-DD HH:mm:ss'),
  236. projectName: list[0],
  237. planName: list[1],
  238. dayDifference: d2.diff(d1, 'day'),
  239. };
  240. this.tooltip.x = rect.left + window.scrollX;
  241. this.tooltip.y = (rect.top - 180) - 10 + window.scrollY;
  242. this.tooltip.visible = true;
  243. });
  244. line.addEventListener("mouseleave", () => {
  245. this.tooltip.visible = false;
  246. });
  247. });
  248. },
  249. bindTaskLineEvents() {
  250. console.log("bindTaskLineEvents", this.$refs.ganttContainer)
  251. if(!this.$refs.ganttContainer) {
  252. return
  253. }
  254. const taskLines = this.$refs.ganttContainer.querySelectorAll(".gantt_task_line");
  255. taskLines.forEach(line => {
  256. const taskId = line.getAttribute("task_id");
  257. if (!taskId) return;
  258. // 避免重复绑定
  259. if (line.dataset.tooltipBound) return;
  260. line.dataset.tooltipBound = "true";
  261. line.addEventListener("mouseenter", (e) => {
  262. const task = gantt.getTask(taskId);
  263. this.tooltip.task = task;
  264. this.tooltip.visible = true;
  265. const updateMouse = (moveEvent) => {
  266. this.tooltip.x = moveEvent.pageX;
  267. this.tooltip.y = moveEvent.pageY;
  268. };
  269. document.addEventListener("mousemove", updateMouse);
  270. line.addEventListener("mouseleave", () => {
  271. this.tooltip.visible = false;
  272. document.removeEventListener("mousemove", updateMouse);
  273. }, { once: true });
  274. });
  275. });
  276. }
  277. },
  278. mounted: function () {
  279. const userInfo = JSON.parse(sessionStorage.getItem("user"));
  280. gantt.clearAll()
  281. gantt.locale = {
  282. date: {
  283. month_full: [this.$t('yiYue'), this.$t('erYue'), this.$t('sanYue'), this.$t('siYue'), this.$t('thisTWuyue'), this.$t('liuYue'), this.$t('qiYue'), this.$t('baYue'), this.$t('jiuYue'), this.$t('shiYue'), this.$t('shiYiYue'), this.$t('shiErYue')],
  284. month_short: [this.$t('1Yue'), this.$t('2Yue'), this.$t('3Yue'), this.$t('4Yue'), this.$t('5Yue'), this.$t('6Yue'), this.$t('7Yue'), this.$t('8Yue'), this.$t('9Yue'), this.$t('10Yue'), this.$t('11Yue'), this.$t('12Yue')],
  285. day_full: [this.$t('xingQiRi'), this.$t('xingQiYi'), this.$t('xingQiEr'), this.$t('xingQiSan'), this.$t('xingQiSi'), this.$t('xingQiWu'), this.$t('xingQiLiu')],
  286. day_short: [this.$t('ri'), "一", "二", "三", "四", "五", "六"]
  287. },
  288. labels: {
  289. dhx_cal_today_button: this.$t('jinTian'),
  290. day_tab: this.$t('weekDay.day'),
  291. week_tab: this.$t('zhou'),
  292. month_tab: this.$t('weekDay.month'),
  293. new_event: this.$t('xinJianRiCheng'),
  294. icon_save: this.$t('save'),
  295. icon_cancel: this.$t('Shutdown'),
  296. icon_details: this.$t('xiangXi'),
  297. icon_edit: this.$t('bian-ji'),
  298. icon_delete: this.$t('btn.delete'),
  299. confirm_closing: this.$t('qingQueRenShiFouCheXiaoXiuGai'), //Your changes will be lost, are your sure?
  300. confirm_deleting: this.$t('shiFouShanChuRiCheng'),
  301. section_description: this.$t('other.describe'),
  302. section_time: this.$t('shiJianFanWei'),
  303. section_type: this.$t('types'),
  304. /* grid columns */
  305. column_text: this.$t('renWuMing'),
  306. column_start_date: this.$t('starttimes'),
  307. column_duration: this.$t('chiXuShiJian'),
  308. column_add: "",
  309. /* link confirmation */
  310. link: this.$t('guanLian'),
  311. confirm_link_deleting: this.$t('jiangBeiShanChu'),
  312. link_start: this.$t('kaiShi'),
  313. link_end: this.$t('jieShu'),
  314. type_task: this.$t('other.task'),
  315. type_project: this.$t('other.project'),
  316. type_milestone: this.$t('other.milestone'),
  317. minutes: this.$t('fenZhong'),
  318. hours: this.$t('time.hour'),
  319. days: this.$t('time.day'),
  320. weeks: this.$t('zhou'),
  321. months: this.$t('weekDay.month'),
  322. years: this.$t('nian')
  323. }
  324. };
  325. // gantt.config.autosize = true;
  326. // gantt.config.duration_unit = "hour";
  327. gantt.config.fit_tasks = true;
  328. gantt.config.drag_move = false;
  329. gantt.config.xml_date = "%Y-%m-%d";
  330. gantt.config.columns = [
  331. { name: "text", label: (this.stafforpro == this.$t('anRenYuanChaKan') ? this.$t('lable.name') : this.$t('headerTop.projectName')), align: "left", tree: true },
  332. // {name:"time",label:"计划工时(h)", align: "center" }
  333. // {name:"start_date", label:"开始时间", width:'*' , align: "center" },
  334. // {name:"duration", label:"工时(天)", width:'*' , align: "center" }
  335. ];
  336. gantt.config.scale_unit = "month"; //按月显示
  337. gantt.config.date_scale = "%F, %Y"; //设置时间刻度的格式(X轴) 多个尺度
  338. gantt.config.scale_height = 50; //设置时间刻度的高度和网格的标题
  339. gantt.config.open_tree_initially = true;
  340. gantt.config.subscales = [
  341. { unit: "day", step: 1, date: "周%D,%d" }
  342. ];
  343. gantt.config.buttons_left = []
  344. gantt.config.buttons_right = ["gantt_cancel_btn"]
  345. gantt.config.drag_links = false
  346. gantt.config.drag_resize = false
  347. gantt.config.drag_progress = false
  348. gantt.config.details_on_dblclick = false
  349. gantt.config.lightbox.sections = [
  350. { name: "description", height: 76, map_to: "text", type: "textarea", focus: true }
  351. ];
  352. gantt.config.start_date = new Date(this.valueDate[0]);
  353. gantt.config.end_date = new Date(this.valueDate[1]);
  354. const that = this
  355. // 设置任务条内容显示
  356. gantt.templates.task_text = function (start, end, task) {
  357. const { leaderOrManager, taskPlan, taskStatus, checkFirstId, checkSecondId } = task
  358. const userIds = that.user.id
  359. // 都审核通过
  360. if(taskPlan == 1 && taskStatus == 0 && task.text == '请假') {
  361. return `<div class="task_text">
  362. <div style="background: '#ff5757'">${task.text}</div>
  363. </div>`
  364. }
  365. if(taskPlan == 1 && taskStatus == 0) {
  366. return `<div class="task_text">
  367. <div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div>
  368. <div class="exclamation-circle circle" style="color: ${task.taskPlanType == 3 ? '#f56c6c' : '#8ecaf8'}">V</div>
  369. <div>${task.text}</div>
  370. </div>`
  371. }
  372. // 更改为统一的
  373. if([3,4,5,6].includes(taskStatus)) {
  374. return `<div class="task_text">
  375. ${task.taskStatus == 3 ? `<div class="circle"></div> <div class="circle"></div>` : ''}
  376. ${task.taskStatus == 4 ? `<div class="exclamation-circle circle" style="color: #8ecaf8">V</div> <div class="circle"></div>` : ''}
  377. ${task.taskStatus == 5 ? `<div class="exclamation-circle circle" style="color: #f56c6c">!</div> <div class="circle"></div>` : ''}
  378. ${task.taskStatus == 6 ? `<div class="exclamation-circle circle" style="color: #8ecaf8">V</div> <div class="exclamation-circle circle" style="color: #f56c6c">!</div>` : ''}
  379. <div>${task.text}</div>
  380. </div>`;
  381. }
  382. // 正常人
  383. return `<div class="task_text">
  384. <div>${task.text}</div>
  385. </div>`;
  386. };
  387. gantt.config.grid_width = 350;
  388. gantt.plugins({ tooltip: true });
  389. gantt.templates.tooltip_text = function (start, end, task) {
  390. return
  391. };
  392. gantt.ext.tooltips.attach({
  393. selector: '.gantt_grid [' + gantt.config.task_attribute + ']',
  394. onmouseenter: (event, node) => {
  395. if (node.textContent.length > 19) {
  396. let sdom = document.createElement('span')
  397. sdom.innerText = node.innerText
  398. sdom.className = 'tooltiptext'
  399. node.appendChild(sdom)
  400. }
  401. },
  402. onmousemove: () => { },
  403. onmouseleave: (event, node) => {
  404. let sdom = document.getElementsByClassName('tooltiptext')[0]
  405. if (sdom) { node.removeChild(sdom) }
  406. },
  407. global: true
  408. })
  409. // 双击事件
  410. this.$refs.ganttContainer.addEventListener('dblclick', (event) => {
  411. const taskIdStr = gantt.locate(event);
  412. // if(userInfo.projectLeaderType != 1 && userInfo.projectLeaderType != 2 && userInfo.projectLeaderType != 3) {
  413. // return
  414. // }
  415. this.showMmeiLaiDeData = {}
  416. if (taskIdStr && gantt.isTaskExists(taskIdStr)) {
  417. // 编辑任务
  418. const rows = gantt.getTask(taskIdStr)
  419. if (rows.id.indexOf('任务') != '-1') {
  420. const value = taskIdStr.split('任务_')[1]
  421. const taskId = value.split('_')[0]
  422. this.showMmeiLaiDeData = rows
  423. this.handleEmptyClick({ taskId })
  424. }
  425. } else {
  426. if(userInfo.projectLeaderType == 2) {
  427. return
  428. }
  429. // 获取 gantt_grid_data 容器
  430. const ganttGrid = document.querySelector('.gantt_grid_data');
  431. if (!ganttGrid) return;
  432. // // 计算点击位置
  433. const gridRect = ganttGrid.getBoundingClientRect();
  434. // const clickY = event.clientY - gridRect.top; // 相对 gantt_grid_data 的 Y 轴偏移量
  435. // // 获取任务行
  436. // const rows = ganttGrid.querySelectorAll('.gantt_row');
  437. // const rowHeight = rows.length > 0 ? rows[0].offsetHeight : 34; // 获取行高 (默认 40px)
  438. // // 计算索引
  439. // const rowIndex = Math.floor(clickY / rowHeight);
  440. // if (rowIndex >= rows.length || rowIndex < 0) return;
  441. // // 获取任务 ID
  442. // const rowElement = rows[rowIndex];
  443. // 新写的
  444. const rows = ganttGrid.querySelectorAll('.gantt_row');
  445. const clickedElement = event.toElement; // 当前点击的元素
  446. const parentElement = clickedElement.closest('.gantt_task_row');
  447. const yzhozhi = this.getDistanceToParent(parentElement) - 219 // 219 固定值
  448. const yCoordinate = +((yzhozhi / 35).toFixed(0)) * 35
  449. let rowIndexs = 0
  450. for(const em in rows) {
  451. const str = (rows[em].style && rows[em].style.top) || '-1px'
  452. const nums = str.split('px')[0]
  453. if(nums == yCoordinate) {
  454. rowIndexs = em
  455. }
  456. }
  457. const rowElement = rows[rowIndexs]
  458. console.log(yCoordinate, rowIndexs)
  459. console.log(rowElement, '<,,,,,,,,,,=============== rowElement')
  460. const taskIdFromRow = rowElement.getAttribute('task_id'); // 获取任务 ID
  461. if (taskIdFromRow && gantt.isTaskExists(taskIdFromRow)) {
  462. const taskData = gantt.getTask(taskIdFromRow);
  463. console.log(taskData, '<=== taskData')
  464. if (taskData.userId) {
  465. // 新增任务
  466. let rollingDistance = 0
  467. const scrollElement = this.$refs.ganttContainer.querySelector('.gantt_hor_scroll');
  468. if (scrollElement) {
  469. rollingDistance = scrollElement.scrollLeft || 0
  470. }
  471. const userId = taskData.userId;
  472. const gridX = event.clientX - gridRect.left; // 相对 gantt_grid_data 的 X 轴偏移量
  473. const date = gantt.dateFromPos((gridX - 349) + rollingDistance);
  474. console.log('点击的日期:', date, this.dayjs(date).format('YYYY-MM-DD'));
  475. this.handleEmptyClick({ userId, date: this.dayjs(date).format('YYYY-MM-DD') })
  476. }
  477. }
  478. }
  479. });
  480. gantt.init(this.$refs.ganttContainer);
  481. this.containerRect = this.$refs.ganttContainer.getBoundingClientRect();
  482. gantt.parse(this.$props.tasks);
  483. // 等渲染完成后绑定每个任务条事件
  484. setTimeout(() => {
  485. this.observeTaskLines(gantt); // 开始监听任务条变化
  486. }, 2000)
  487. setTimeout(() => {
  488. const list = JSON.parse(localStorage.getItem('ganttChartTaskId') || '[]')
  489. if(list[0]) {
  490. this.focusAndSelectTaskFull(list[0])
  491. }
  492. localStorage.removeItem('ganttChartTaskId')
  493. }, 1000)
  494. }
  495. }
  496. </script>
  497. <style>
  498. @import "~dhtmlx-gantt/codebase/dhtmlxgantt.css";
  499. .person_line {
  500. background: #8ecaf8;
  501. border: 1px solid;
  502. @include border_color("border_color");
  503. }
  504. .error_line {
  505. background: #ff5757;
  506. border: 1px solid;
  507. border-color: #ff5757;
  508. }
  509. .success_line {
  510. background: #5cb87a;
  511. border: 1px solid;
  512. border-color: #5cb87a;
  513. }
  514. .draft_line {
  515. background: #909399;
  516. border: 1px solid;
  517. border-color: #909399;
  518. }
  519. .reject_line {
  520. background: #FFBD4D;
  521. border: 1px solid;
  522. border-color: #FFBD4D;
  523. }
  524. .task_text {
  525. display: flex;
  526. flex-direction: row;
  527. align-items: center;
  528. white-space: nowrap;
  529. overflow: hidden;
  530. text-overflow: ellipsis;
  531. width: 100%;
  532. }
  533. .task_text>div {
  534. flex: 0 0 auto;
  535. }
  536. .circle {
  537. width: 10px;
  538. height: 10px;
  539. border-radius: 50%;
  540. border: 2px solid #fff;
  541. margin-left: 4px;
  542. display: flex;
  543. justify-content: center;
  544. align-items: center;
  545. }
  546. .exclamation-circle {
  547. background: #fff;
  548. font-size: 12px;
  549. font-weight: bold;
  550. }
  551. .pendingReviewOfCornerMarkers {
  552. width: 100%;
  553. height: 100%;
  554. border-radius: 50%;
  555. display: flex;
  556. justify-content: center;
  557. align-items: center;
  558. background: #fdba6e;
  559. font-weight: bold;
  560. }
  561. .statuss .circle {
  562. border-color: #fdba6e;
  563. }
  564. /* .gantt_tooltip{
  565. z-index: 10000;
  566. top: 10px !important;
  567. left: 10px !important;
  568. } */
  569. .tooltiptext {
  570. visibility: visible;
  571. background-color: #fff;
  572. color: #454545;
  573. box-shadow: 3px 3px 3px rgba(0, 0, 0, .07);
  574. border-left: 1px solid rgba(0, 0, 0, .07);
  575. border-top: 1px solid rgba(0, 0, 0, .07);
  576. font-size: 8pt;
  577. line-height: 20px;
  578. padding: 10px;
  579. /* opacity: 0;
  580. transition: 0.5s; */
  581. position: absolute;
  582. z-index: 10000;
  583. bottom: 120%;
  584. left: 25px;
  585. max-width: 300px;
  586. /* word-wrap: break-word;
  587. word-break: break-all; */
  588. white-space: pre-wrap;
  589. }
  590. .custom-tooltip-customize {
  591. position: fixed;
  592. z-index: 9999;
  593. background: rgba(0, 0, 0, 0.7);
  594. color: #fff;
  595. padding: 20px;
  596. border-radius: 6px;
  597. }
  598. .custom-tooltip-customize div {
  599. margin-bottom: 10px;
  600. line-height: 20px;
  601. }
  602. .custom-tooltip-customize div:last-child {
  603. margin-bottom: 0;
  604. }
  605. </style>