翻譯|使用教程|編輯:龔雪|2024-01-16 09:57:04.110|閱讀 144 次
概述:本文將主要介紹如何用DHTMLX Gantt構建類似JIRA式的項目路線圖,歡迎下載最新版組件體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
DHTMLX Gantt是用于跨瀏覽器和跨平臺應用程序的功能齊全的Gantt圖表。可滿足項目管理應用程序的所有需求,是最完善的甘特圖圖表庫。
在web項目中使用DHTMLX Gantt時,開發人員經常需要滿足與UI外觀相關的各種需求。因此他們必須確定JavaScript甘特圖庫的自定義能力,因此本文僅繼續介紹DHTMLX Gantt的自定義用例。
在這個系列的文章中,您將學習如何使用DHTMLX Gantt組件構建類似jira的項目路線圖。在上文中(點擊這里回顧>>)主要介紹了項目路線圖的用例、時間刻度和Today標記定制等,本文將繼續講解如何實現定制,持續關注我們哦~
在路線圖時間線中顯示的工作項自定義圖標可能是這個場景中最奇怪的元素,我們在之前的文章中解釋了它們的含義,現在想揭開這些圖標是如何實現的。
在實踐中,這些方形圖標被添加到時間軸區域的任務中,并使用addTaskLayer方法添加了一個帶有自定義元素的附加層。為了確保這些元素在重新初始化后不會消失,您需要在ongantready事件處理程序中添加代碼。
gantt.attachEvent("onGanttReady", function () { gantt.addTaskLayer(function (task) {
addTaskLayer方法適用于所有項目任務,因此您應該首先檢查特定任務屬性(項)中是否存在已保存的值。
if (task.items) {
對于這樣保存的值,您必須為任務創建附加層的主元素。該元素將在函數結束時返回,并且工作項的自定義圖標將被添加到其中。
const mainEl = document.createElement('div');
之后,需要遍歷task.items中的所有值:
for (timestamp in task.items) {
下一步是獲取unix時間戳值并將其轉換為日期,結果值應該存儲在一個單獨的變量中。
const itemDate = new Date(+timestamp); const value = task.items[timestamp];
使用getTaskPosition方法來指定任務對象和應該顯示自定義圖標的日期,需要確定圖標方塊在時間軸上的坐標。
const sizes = gantt.getTaskPosition(task, itemDate, itemDate);
然后需要創建一個HTML元素,在其中指定一個特定的類名和一個值(數字),并添加一個帶有任務ID的屬性。
const el = document.createElement('div'); el.className = 'work_item'; el.innerHTML = value; el.setAttribute("data-taskId", task.id);
自定義圖標必須顯示在單元格的中心,默認情況下,元素寬度為15px。
let elWidth = 15;
因此,如果時間軸單元格寬度的一半小于自定義元素的寬度,則該元素將自動縮小。
let cellWidth = gantt.getScale().col_width; if (elWidth > cellWidth / 2) { elWidth = cellWidth / 2 }
考慮到元素的寬度和時間軸單元格的寬度,計算將元素放置在單元格中心所需的左邊距的數量:
let marginLeft = (cellWidth - elWidth) / 2;
元素的位置(坐標)是用styles指定的:
el.style.left = sizes.left + 'px'; el.style.top = sizes.top + 'px'; el.style.marginLeft = marginLeft + 'px'; el.style.width = elWidth + "px"
工作項的自定義圖標默認顏色是灰色的,此選項在未為任務指定其他顏色時使用。如果圖標的日期不包括在任務的日期范圍內,它將以紅色突出顯示。
let background = "Gray"; if (+itemDate < +task.start_date || +itemDate > +task.end_date) { background = "DarkRed"; }
如果自定義圖標放置在時間軸上的任務日期內,則其顏色必須取自此任務的父任務。在單個任務和父任務中,自定義圖標將具有這些任務的顏色。
else { if (task.parent) { const parent = gantt.getTask(task.parent); background = parent.color || background; } else { background = task.color || background; } }
之后使用樣式設置圖標的顏色,并將其附加到任務附加圖層的主要元素上:
el.style.background = background; el.style.color = "#eee" mainEl.appendChild(el);
為了使自定義圖標看起來與任務欄有所不同,我們添加了一個樣式規則,使顏色更飽和:
filter: saturate(180%);
這樣無論文本的顏色是白色、黑色還是灰色,它都不會影響文本的顏色。
然后,您必須為onEmptyClick事件添加一個事件處理程序。當單擊任何時間軸單元格以及沒有與任務(如任務欄和任務行)相關聯的元素的路線圖界面的任何點時,將調用此事件。
gantt.attachEvent("onEmptyClick", function (e) {
首先,嘗試使用close()方法獲取任務行或自定義圖標元素:
const taskRow = e.target.closest(".gantt_task_row"); const customElement = e.target.closest(".work_item");
相對于時間軸的點擊位置被保存到一個變量中。
const position = gantt.utils.dom.getRelativeEventPosition(e, gantt.$task_data).x
單擊任務行或自定義圖標后,您將從HTML元素獲得任務ID,然后使用getTask()方法獲得任務本身。
const taskId = targetElement.dataset.taskId || targetElement.dataset.taskid; const task = gantt.getTask(taskId);
之后,需要使用dateFromPos()方法獲取點擊位置的時間軸日期。日期帶有時間參數,因此使用gantt.date.day_start()方法將時間四舍五入到一天的開始會更方便。這一步使得在addTaskLayer()方法中迭代日期元素變得更加容易。
const clickDate = +gantt.date.day_start(gantt.dateFromPos(position));
更多教程內容請下期再見,記得點贊關注收藏哦!
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網