请教:docs.dhtmlx.gantt自定义编辑器如何保存值?现有业务是点击负责人可以弹出选择用户的弹框,然后选中用户,点击确定之后可以保存当前选中的值。但是现有代码存在两个问题,第一需要双击才能打开选择用户弹框;第二点击弹框确定按钮之后负责人字段没有值。
// 定义自定义编辑器
gantt.config.editor_types.manager = {
show: function(id, column, config, placeholder) {
// 保存当前任务ID和原始值
this.taskId = id;
this.originalValue = gantt.getTask(id)[column.name] || [];
// 创建对话框HTML结构
var html = `
<div class="manager-picker-dialog">
<el-dialog
title="选择用户"
:visible.sync="dialogVisible"
v-if="dialogVisible"
width="1100px"
append-to-body>
<Selector
ref="selectorRef"
:height="500"
:type="1"
:multiple="false"
:sourceData="sourceData"
v-model="selectedUsers">
</Selector>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="confirmSelection">确 定</el-button>
<el-button type="info" @click="dialogVisible = false">取 消</el-button>
</div>
</el-dialog>
</div>
`;
placeholder.innerHTML = html;
// 初始化Vue实例来管理对话框
this.vueInstance = new Vue({
el: placeholder.querySelector('.manager-picker-dialog'),
components: {
Selector
},
data: {
dialogVisible: true,
sourceData: [], //用户数据源
selectedUsers: [...this.originalValue] // 初始化为当前任务的值
},
methods: {
// 加载用户数据的方法
loadUserData() { },
confirmSelection() {
this.dialogVisible = false;
// // 触发保存
const editor = this.$parent.$parent.$parent.$parent.editor;
if (editor && editor.save) {
editor.save();
}
}
},
mounted() {
this.loadUserData();
}
});
},
hide: function() {
// 清理Vue实例
if(this.vueInstance) {
this.vueInstance.$destroy();
this.vueInstance = null;
}
},
set_value: function(value, id, column, node) {
},
get_value: function(id, column, node) {
if(this.vueInstance) {
return this.vueInstance.selectedUsers;
}
return this.originalValue || [];
},
is_changed: function(value, id, column, node) {
if(this.vueInstance) {
// 比较数组内容是否相同
const current = this.vueInstance.selectedUsers;
const original = this.originalValue;
return current.length !== original.length ||
current.some((val, index) => val !== original[index]);
}
return false;
},
is_valid: function(value, id, column, node) {
return !!(this.vueInstance && this.vueInstance.selectedUsers && this.vueInstance.selectedUsers.length > 0);
},
focus: function(node) {
// 不需要聚焦,因为对话框有自己的交互
}
};
// 配置列
var managerEditor = {type: "manager", map_to: "manager"};
gantt.config.columns = [ {name: "manager", label: "任务负责人", align: "center", width: 85, resize: true, editor: managerEditor, template: function (item) {
if (typeof _this !== 'undefined' && _this.currentStatus === 'other') {
if (item.manager === null || item.manager === undefined) {
// 当 manager 为空时,返回一个可交互的元素
return `<div class="manager-placeholder" data-id="${item.id}">
<el-icon class="el-icon-circle-plus-outline"></el-icon>
</div>`;
}
}
// 如果不满足条件,返回默认显示
return `<div>${item.manager || ''}</div>`;
}
}]
