钢毅 發表於 2025-8-21 10:20:00

如何在DHTMLX Scheduler中实现带拖拽的任务待办区(Backlog)

<p>为了满足&nbsp;<strong><span style="text-decoration: underline">DHTMLX Scheduler</span></strong>&nbsp;用户的实际业务需求,本文将展示如何在 JavaScript 日程组件中实现“带拖拽的任务待办区(Backlog)”。这一功能让用户可以像物业管理系统那样,通过简单的拖拽操作将任务分配到时间轴上的合适位置,大幅提升排程效率与体验。</p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>DHTMLX Scheduler 试用下载,请联系DHTMLX官方授权代理商<span style="text-decoration: underline">慧都科技</span></strong></span></p>
<p><img src="https://image.evget.com/2025/08/21/ezgif.com-speed-2vp7k4wfxa359fyxw.gif"></p>
<p>&nbsp;</p>
<p>本文将带您一步步实现这一功能。</p>
<hr>
<h2>使用场景说明</h2>
<p>某位 Scheduler 用户提出:希望能像资源管理系统一样,将任务从“待办区(backlog)”拖拽到资源(员工)的日程表中,而无需手动设置日期和人员。</p>
<p><strong><span style="text-decoration: underline">DHTMLX Scheduler</span></strong>&nbsp;本身没有内置此功能,但凭借其强大的 API,开发者完全可以手动实现。</p>
<p>基于该需求,本文展示了如何在 JS 日历中实现任务待办区与拖拽排程的完整逻辑。</p>
<p><strong><span style="color: rgba(230, 126, 35, 1)">DHTMLX Scheduler 试用下载,请联系DHTMLX官方授权代理商</span>慧都科技</strong></p>
<h2>实现步骤概览</h2>
<p>要实现该功能,需要以下几个步骤:</p>
<ol>
<li>
<p>渲染可拖拽的待办任务卡片;</p>
</li>
<li>
<p>在拖拽过程中高亮显示可放置的时间槽;</p>
</li>
<li>
<p>在任务放下时计算并插入到 Scheduler 中;</p>
</li>
<li>
<p>支持任务“取消排程”并返回待办区。</p>
</li>
</ol>
<p>下面我们分步骤介绍实现方式。</p>
<hr>
<h2>Step 1: 初始化 Scheduler</h2>
<p>首先,需要对 Scheduler 进行初始化,配置视图和插件,例如:</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>scheduler.plugins({
    units: true,
    timeline: true,
    tooltip: true,
    quick_info: true,
});</code></pre>
<p>&nbsp;</p>
<p>可通过scheduler.config.first_hour和scheduler.config.last_hour设置显示的时间范围(如 06:00 – 20:00,仅显示工作时间)。</p>
<p>同时,需要建立一个&nbsp;<strong>共享 store 对象</strong>,用于在待办区与 Scheduler 之间同步任务数据。</p>
<hr>
<h2>Step 2: 渲染待办任务(Backlog)</h2>
<p>在页面中动态生成待办任务卡片(HTML 元素),并通过dragstart事件将任务数据绑定到拖拽动作中:</p>
<ul>
<li>
<p>添加拖拽中的视觉反馈;</p>
</li>
<li>
<p>将任务数据序列化并写入dataTransfer;</p>
</li>
<li>
<p>自定义拖拽图像,提升用户体验。</p>
</li>
</ul>
<pre class="prettyprint lang-js highlighter-hljs"><code>listItem.addEventListener("dragstart", (e) =&gt; {
    if (e.target.matches(".uncheduled-task-card")) {
      e.target.classList.add("dragging-task");
      const task = store.getState().tasks.find((t) =&gt; t.id == e.target.dataset.id);
      e.dataTransfer.setData("application/json", JSON.stringify(task));
      ...
    }
});</code></pre>
<hr>
<h2>Step 3: 高亮可放置时间槽</h2>
<p>在任务拖拽到时间槽上时,通过scheduler.markTimespan()实现高亮提示,帮助用户直观理解任务将被放置的位置和时段。</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>currentMarkTime = scheduler.markTimespan({
    start_date,
    end_date,
    css: "timeslot-highlight-marktime",
    sections: { unit: section, timeline: },
});</code></pre>
<p>当任务拖出日程区域时,自动移除高亮效果,避免视觉残留。</p>
<hr>
<h2>Step 4: 将任务转化为日程事件</h2>
<p>当任务被放下(drop)时:</p>
<ol>
<li>
<p>清除高亮标记;</p>
</li>
<li>
<p>从dataTransfer中获取任务数据;</p>
</li>
<li>
<p>计算任务的start_date与end_date;</p>
</li>
<li>
<p>使用store.upsertTask更新任务并写入 Scheduler。</p>
</li>
</ol>
<pre class="prettyprint lang-js highlighter-hljs"><code>dropZone.addEventListener("drop", (e) =&gt; {
    e.preventDefault();
    const data = JSON.parse(e.dataTransfer.getData("application/json"));
    const { date, section } = scheduler.getActionData(e);
    const start_date = date;
    const end_date = calcEndDate(start_date, data.duration);
    store.upsertTask({ ...data, start_date, end_date, owner_id: section });
});</code></pre>
<hr>
<h2>Step 5: 取消排程并返回待办区</h2>
<p>在任务编辑框(lightbox)或快速信息(quick info)中添加“取消排程”按钮,将任务恢复到 backlog:</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>scheduler.config.buttons_left = ["dhx_save_btn", "dhx_cancel_btn", "unschedule_button"];
scheduler.locale.labels["unschedule_button"] = "Unschedule";</code></pre>
<h2>总结</h2>
<p>通过以上步骤,您可以轻松为&nbsp;<strong>DHTMLX Scheduler</strong>&nbsp;扩展一个“带拖拽的任务待办区”。该功能可帮助用户更加灵活、直观地管理任务排程,尤其适合资源分配和工单调度等场景。</p>
<h2>关于 DHTMLX Scheduler</h2>
<p><strong>DHTMLX Scheduler</strong>&nbsp;是一款专业的 JavaScript 日程排程控件,支持日/周/月/时间轴等多种视图模式,具备高度可定制性,适用于排班系统、预约系统、项目排期、课程表等场景,完美适配 Angular、Vue、React 等主流框架。</p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>DHTMLX Scheduler 试用下载,请联系DHTMLX官方授权代理商<span style="text-decoration: underline">慧都科技</span></strong></span></p><br><br>
来源:https://www.cnblogs.com/software-Development/p/19050069
頁: [1]
查看完整版本: 如何在DHTMLX Scheduler中实现带拖拽的任务待办区(Backlog)