UNPKG

vxe-gantt

Version:
3,146 lines • 112 kB
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _vue = require("vue");
var _comp = require("../../ui/src/comp");
var _xeUtils = _interopRequireDefault(require("xe-utils"));
var _utils = require("../../ui/src/utils");
var _dom = require("../../ui/src/dom");
var _vn = require("../../ui/src/vn");
var _core = require("@vxe-ui/core");
var _emits = require("./emits");
var _util = require("./util");
var _tableEmits = require("./table-emits");
var _log = require("../../ui/src/log");
var _ganttView = _interopRequireDefault(require("./gantt-view"));
var _vxeTable = require("vxe-table");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const {
  warnLog,
  errLog
} = (0, _log.createComponentLog)('gantt');
const {
  getConfig,
  getIcon,
  getI18n,
  commands,
  hooks,
  useFns,
  createEvent,
  globalEvents,
  GLOBAL_EVENT_KEYS,
  renderEmptyElement
} = _core.VxeUI;
const tableProps = _vxeTable.VxeTable.props;
const tableComponentPropKeys = Object.keys(tableProps);
const tableComponentMethodKeys = ['clearAll', 'syncData', 'updateData', 'loadData', 'reloadData', 'reloadRow', 'loadColumn', 'reloadColumn', 'getRowNode', 'getColumnNode', 'getRowIndex', 'getVTRowIndex', 'getVMRowIndex', 'getColumnIndex', 'getVTColumnIndex', 'getVMColumnIndex', 'setRow', 'createData', 'createRow', 'revertData', 'clearData', 'isRemoveByRow', 'isInsertByRow', 'isUpdateByRow', 'getColumns', 'getColumnById', 'getColumnByField', 'getTableColumn', 'getFullColumns', 'getData', 'getCheckboxRecords', 'getParentRow', 'getTreeRowChildren', 'getTreeRowLevel', 'getTreeParentRow', 'getRowSeq', 'getRowById', 'getRowid', 'getTableData', 'getFullData', 'setColumnFixed', 'clearColumnFixed', 'setColumnWidth', 'getColumnWidth', 'recalcRowHeight', 'setRowHeightConf', 'getRowHeightConf', 'setRowHeight', 'getRowHeight', 'hideColumn', 'showColumn', 'resetColumn', 'refreshColumn', 'refreshScroll', 'recalculate', 'closeTooltip', 'isAllCheckboxChecked', 'isAllCheckboxIndeterminate', 'getCheckboxIndeterminateRecords', 'setCheckboxRow', 'setCheckboxRowKey', 'isCheckedByCheckboxRow', 'isCheckedByCheckboxRowKey', 'isIndeterminateByCheckboxRow', 'isIndeterminateByCheckboxRowKey', 'toggleCheckboxRow', 'setAllCheckboxRow', 'getRadioReserveRecord', 'clearRadioReserve', 'getCheckboxReserveRecords', 'clearCheckboxReserve', 'toggleAllCheckboxRow', 'clearCheckboxRow', 'setCurrentRow', 'isCheckedByRadioRow', 'isCheckedByRadioRowKey', 'setRadioRow', 'setRadioRowKey', 'clearCurrentRow', 'clearRadioRow', 'getCurrentRecord', 'getRadioRecord', 'getCurrentColumn', 'setCurrentColumn', 'clearCurrentColumn', 'setPendingRow', 'togglePendingRow', 'hasPendingByRow', 'isPendingByRow', 'getPendingRecords', 'clearPendingRow', 'setFilterByEvent', 'sort', 'setSort', 'setSortByEvent', 'clearSort', 'clearSortByEvent', 'isSort', 'getSortColumns', 'closeFilter', 'isFilter', 'clearFilterByEvent', 'isActiveFilterByColumn', 'isRowExpandLoaded', 'clearRowExpandLoaded', 'reloadRowExpand', 'reloadRowExpand', 'toggleRowExpand', 'setAllRowExpand', 'setRowExpand', 'isExpandByRow', 'isRowExpandByRow', 'clearRowExpand', 'clearRowExpandReserve', 'getRowExpandRecords', 'getTreeExpandRecords', 'isTreeExpandLoaded', 'clearTreeExpandLoaded', 'reloadTreeExpand', 'reloadTreeChilds', 'toggleTreeExpand', 'setAllTreeExpand', 'setTreeExpand', 'isTreeExpandByRow', 'clearTreeExpand', 'clearTreeExpandReserve', 'getScroll', 'scrollTo', 'scrollToStartRow', 'scrollToEndRow', 'scrollToRow', 'scrollToStartColumn', 'scrollToEndColumn', 'scrollToColumn', 'clearScroll', 'updateFooter', 'updateStatus', 'setMergeCells', 'removeInsertRow', 'removeMergeCells', 'getMergeCells', 'clearMergeCells', 'setMergeFooterItems', 'removeMergeFooterItems', 'getMergeFooterItems', 'clearMergeFooterItems', 'getCustomStoreData', 'setRowGroupExpand', 'setRowGroupExpandByField', 'setAllRowGroupExpand', 'clearRowGroupExpand', 'isRowGroupExpandByRow', 'isRowGroupRecord', 'isAggregateRecord', 'isAggregateExpandByRow', 'getAggregateContentByRow', 'getAggregateRowChildren', 'setRowGroups', 'clearRowGroups', 'openTooltip', 'moveColumnTo', 'moveRowTo', 'getCellLabel', 'undo', 'redo', 'getCellElement', 'focus', 'blur', 'connect'];
const defaultLayouts = [['Form'], ['Toolbar', 'Top', 'Gantt', 'Bottom', 'Pager']];
function createInternalData() {
  return {
    linkFromConfMaps: {},
    linkToConfMaps: {},
    linkUniqueMaps: {},
    uFoot: false,
    resizeTableWidth: 0,
    // barTipTimeout: null,
    // dragBarRow: null,
    // dragLineRow: null,
    dragLinkToStore: {
      rowid: null,
      type: 0
    },
    // 关键路径
    criticalRowList: [],
    criticalRowMaps: new Map(),
    criticalLinkKeyMaps: new Map()
  };
}
function createReactData() {
  var _a;
  return {
    tableLoading: false,
    proxyInited: false,
    // 是否存在纵向滚动条
    overflowY: false,
    // 是否存在横向滚动条
    overflowX: false,
    // 纵向滚动条的宽度
    scrollbarWidth: 0,
    // 横向滚动条的高度
    scrollbarHeight: 0,
    isZMax: false,
    tableLinks: [],
    tableData: [],
    filterData: [],
    formData: {},
    sortData: [],
    footerData: [],
    tZindex: 0,
    tablePage: {
      total: 0,
      pageSize: ((_a = getConfig().pager) === null || _a === void 0 ? void 0 : _a.pageSize) || 10,
      currentPage: 1
    },
    showLeftView: true,
    showRightView: true,
    taskScaleList: [],
    barTipStore: {
      row: null,
      content: '',
      visible: false,
      params: null
    },
    dragLinkFromStore: {
      rowid: null,
      type: 0
    },
    activeBarRowid: null,
    activeLink: null,
    isActiveCeLe: false,
    linkList: [],
    upLinkFlag: 0,
    showSplitAnimat: false,
    nowTime: 0,
    currLeftSpacing: 0,
    currRightSpacing: 0,
    // 关键路径
    criticalLinks: [],
    criticalRowIds: [],
    criticalPathFlag: 0
  };
}
const viewTypeLevelMaps = {
  year: 19,
  quarter: 17,
  month: 15,
  week: 13,
  day: 11,
  date: 9,
  hour: 7,
  minute: 5,
  second: 3
};
function getViewTypeLevel(type) {
  return viewTypeLevelMaps[type || 'date'] || viewTypeLevelMaps.date;
}
var _default = exports.default = (0, _comp.defineVxeComponent)({
  name: 'VxeGantt',
  mixins: [],
  props: Object.assign(Object.assign({}, tableProps), {
    columns: Array,
    pagerConfig: Object,
    proxyConfig: Object,
    toolbarConfig: Object,
    formConfig: Object,
    zoomConfig: Object,
    links: Array,
    layouts: Array,
    taskConfig: Object,
    taskViewScaleConfig: Object,
    taskNowLineConfig: Object,
    taskViewConfig: Object,
    taskLinkConfig: Object,
    taskBarConfig: Object,
    taskBarMilestoneConfig: Object,
    taskCriticalPathConfig: Object,
    taskBarSubviewConfig: Object,
    taskBarTooltipConfig: Object,
    taskSplitConfig: Object,
    taskBarResizeConfig: Object,
    taskBarResizeTooltipConfig: Object,
    taskBarMoveConfig: Object,
    taskBarMoveTooltipConfig: Object,
    size: {
      type: String,
      default: () => getConfig().gantt.size || getConfig().size
    }
  }),
  emits: _emits.ganttEmits,
  setup(props, context) {
    const {
      slots,
      emit
    } = context;
    const xID = _xeUtils.default.uniqueId();
    // 使用已安装的组件,如果未安装则不渲染
    const VxeUIFormComponent = _core.VxeUI.getComponent('VxeForm');
    const VxeUIPagerComponent = _core.VxeUI.getComponent('VxePager');
    const VxeTableComponent = _core.VxeUI.getComponent('VxeTable');
    const VxeToolbarComponent = _core.VxeUI.getComponent('VxeToolbar');
    const VxeUITooltipComponent = _core.VxeUI.getComponent('VxeTooltip');
    const {
      computeSize
    } = useFns.useSize(props);
    const reactData = (0, _vue.reactive)(createReactData());
    const internalData = createInternalData();
    const refElem = (0, _vue.ref)();
    const refTable = (0, _vue.ref)();
    const refForm = (0, _vue.ref)();
    const refToolbar = (0, _vue.ref)();
    const refPager = (0, _vue.ref)();
    const refGanttContainerElem = (0, _vue.ref)();
    const refClassifyWrapperElem = (0, _vue.ref)();
    const refGanttView = (0, _vue.ref)();
    const refPopupContainerElem = (0, _vue.ref)();
    const refFormWrapper = (0, _vue.ref)();
    const refToolbarWrapper = (0, _vue.ref)();
    const refTopWrapper = (0, _vue.ref)();
    const refBottomWrapper = (0, _vue.ref)();
    const refPagerWrapper = (0, _vue.ref)();
    const refTableWrapper = (0, _vue.ref)();
    const refGanttWrapper = (0, _vue.ref)();
    const refTooltip = (0, _vue.ref)();
    const refResizableSplitTip = (0, _vue.ref)();
    const extendTableMethods = methodKeys => {
      const funcs = {};
      methodKeys.forEach(name => {
        funcs[name] = (...args) => {
          const $xeTable = refTable.value;
          if ($xeTable && $xeTable[name]) {
            return $xeTable[name](...args);
          }
        };
      });
      return funcs;
    };
    const ganttExtendTableMethods = extendTableMethods(tableComponentMethodKeys);
    tableComponentMethodKeys.forEach(name => {
      ganttExtendTableMethods[name] = (...args) => {
        const $xeTable = refTable.value;
        if ($xeTable && $xeTable[name]) {
          return $xeTable && $xeTable[name](...args);
        }
      };
    });
    const computeProxyOpts = (0, _vue.computed)(() => {
      return _xeUtils.default.merge({}, _xeUtils.default.clone(getConfig().gantt.proxyConfig, true), props.proxyConfig);
    });
    const computeIsRespMsg = (0, _vue.computed)(() => {
      const proxyOpts = computeProxyOpts.value;
      return !!(_xeUtils.default.isBoolean(proxyOpts.message) ? proxyOpts.message : proxyOpts.showResponseMsg);
    });
    const computeIsActiveMsg = (0, _vue.computed)(() => {
      const proxyOpts = computeProxyOpts.value;
      return _xeUtils.default.isBoolean(proxyOpts.showActionMsg) ? proxyOpts.showActionMsg : !!proxyOpts.showActiveMsg;
    });
    const computePagerOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.pagerConfig, props.pagerConfig);
    });
    const computeFormOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.formConfig, props.formConfig);
    });
    const computeToolbarOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.toolbarConfig, props.toolbarConfig);
    });
    const computeZoomOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.zoomConfig, props.zoomConfig);
    });
    const computeTaskOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskConfig, props.taskConfig);
    });
    const computeTaskViewScaleOpts = (0, _vue.computed)(() => {
      return _xeUtils.default.merge({}, getConfig().gantt.taskViewScaleConfig, props.taskViewScaleConfig);
    });
    const computeTaskNowLineOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskNowLineConfig, props.taskNowLineConfig);
    });
    const computeTaskViewOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskViewConfig, props.taskViewConfig);
    });
    const computeTaskBarOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskBarConfig, props.taskBarConfig);
    });
    const computeTaskBarMoveOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskBarMoveConfig, props.taskBarMoveConfig);
    });
    const computeTaskBarMoveTooltipOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskBarMoveTooltipConfig, props.taskBarMoveTooltipConfig);
    });
    const computeTaskBarResizeOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskBarResizeConfig, props.taskBarResizeConfig);
    });
    const computeTaskBarResizeTooltipOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskBarResizeTooltipConfig, props.taskBarResizeTooltipConfig);
    });
    const computeTaskSplitOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskSplitConfig, props.taskSplitConfig);
    });
    const computeTaskBarMilestoneOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskBarMilestoneConfig, props.taskBarMilestoneConfig);
    });
    const computeTaskCriticalPathOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskCriticalPathConfig, props.taskCriticalPathConfig);
    });
    const computeTaskBarSubviewOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskBarSubviewConfig, props.taskBarSubviewConfig);
    });
    const computeTaskBarTooltipOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskBarTooltipConfig, props.taskBarTooltipConfig);
    });
    const computeTaskLinkOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.taskLinkConfig, props.taskLinkConfig);
    });
    const computeDateFormat = (0, _vue.computed)(() => {
      const taskOpts = computeTaskOpts.value;
      const {
        dateFormat
      } = taskOpts;
      return dateFormat || '';
    });
    const computeScaleUnit = (0, _vue.computed)(() => {
      const minScale = computeMinScale.value;
      return minScale ? minScale.type : 'date';
    });
    const computeMinScale = (0, _vue.computed)(() => {
      const {
        taskScaleList
      } = reactData;
      return _xeUtils.default.last(taskScaleList);
    });
    const computeScaleStep = (0, _vue.computed)(() => {
      const minScale = computeMinScale.value;
      const {
        step
      } = minScale;
      return _xeUtils.default.toNumber(step || 1) || 1;
    });
    const computeWeekScale = (0, _vue.computed)(() => {
      const {
        taskScaleList
      } = reactData;
      return taskScaleList.find(item => item.type === 'week');
    });
    const computeTaskViewScales = (0, _vue.computed)(() => {
      const taskViewOpts = computeTaskViewOpts.value;
      const {
        scales
      } = taskViewOpts;
      return scales;
    });
    const computeTaskLinkStyle = (0, _vue.computed)(() => {
      const {
        lineType,
        lineWidth,
        lineStatus,
        lineColor
      } = computeTaskLinkOpts.value;
      return `${lineType || ''}_${lineWidth || ''}_${lineStatus || ''}_${lineColor || ''}`;
    });
    const computeTitleField = (0, _vue.computed)(() => {
      const taskOpts = computeTaskOpts.value;
      return taskOpts.titleField || 'title';
    });
    const computeStartField = (0, _vue.computed)(() => {
      const taskOpts = computeTaskOpts.value;
      return taskOpts.startField || 'start';
    });
    const computeEndField = (0, _vue.computed)(() => {
      const taskOpts = computeTaskOpts.value;
      return taskOpts.endField || 'end';
    });
    const computeTypeField = (0, _vue.computed)(() => {
      const taskOpts = computeTaskOpts.value;
      return taskOpts.typeField || 'type';
    });
    const computeProgressField = (0, _vue.computed)(() => {
      const taskOpts = computeTaskOpts.value;
      return taskOpts.progressField || 'progress';
    });
    const computeScrollbarOpts = (0, _vue.computed)(() => {
      return Object.assign({}, getConfig().gantt.scrollbarConfig, props.scrollbarConfig);
    });
    const computeScrollbarXToTop = (0, _vue.computed)(() => {
      const scrollbarOpts = computeScrollbarOpts.value;
      return !!(scrollbarOpts.x && scrollbarOpts.x.position === 'top');
    });
    const computeScrollbarYToLeft = (0, _vue.computed)(() => {
      const scrollbarOpts = computeScrollbarOpts.value;
      return !!(scrollbarOpts.y && scrollbarOpts.y.position === 'left');
    });
    const computeCriticalPathVisible = (0, _vue.computed)(() => {
      const taskBarOpts = computeTaskBarOpts.value;
      return taskBarOpts.showCriticalPath;
    });
    const computeWrapperStyle = (0, _vue.computed)(() => {
      const {
        height,
        maxHeight,
        taskBarSubviewConfig
      } = props;
      const {
        isZMax,
        tZindex,
        overflowY,
        scrollbarWidth
      } = reactData;
      const taskViewOpts = computeTaskViewOpts.value;
      const {
        viewStyle,
        tableStyle
      } = taskViewOpts;
      const taskBarOpts = computeTaskBarOpts.value;
      const {
        barStyle
      } = taskBarOpts;
      const taskCriticalPathOpts = computeTaskCriticalPathOpts.value;
      const {
        lineColor: cpLineColor
      } = taskCriticalPathOpts;
      const taskBarSubviewOpts = computeTaskBarSubviewOpts.value;
      const taskNowLineOpts = computeTaskNowLineOpts.value;
      const {
        fontColor: nlfColor,
        bgColor: nlbgColor,
        width: nlWidth
      } = taskNowLineOpts;
      const stys = {
        '--vxe-ui-gantt-scrollbar-width': (overflowY && scrollbarWidth ? scrollbarWidth : 0) + 'px'
      };
      if (cpLineColor) {
        stys['--vxe-ui-gantt-view-bar-critical-path-line-color'] = cpLineColor;
      }
      if (isZMax) {
        stys.zIndex = tZindex;
      } else {
        if (height) {
          stys.height = height === 'auto' || height === '100%' ? '100%' : (0, _dom.toCssUnit)(height);
        }
        if (maxHeight) {
          stys.maxHeight = maxHeight === 'auto' || maxHeight === '100%' ? '100%' : (0, _dom.toCssUnit)(maxHeight);
        }
      }
      if (barStyle && !_xeUtils.default.isFunction(barStyle)) {
        const {
          bgColor,
          completedBgColor,
          overviewBgColor
        } = barStyle;
        if (bgColor) {
          stys['--vxe-ui-gantt-view-task-bar-background-color'] = bgColor;
        }
        if (completedBgColor) {
          stys['--vxe-ui-gantt-view-task-bar-completed-background-color'] = completedBgColor;
        }
        if (overviewBgColor && (0, _utils.hasEnableConf)(taskBarSubviewConfig, taskBarSubviewOpts)) {
          stys['--vxe-ui-gantt-view-task-bar-overview-background-color'] = overviewBgColor;
        }
      }
      if (nlfColor) {
        stys['--vxe-ui-gantt-view-task-now-line-color'] = nlfColor;
      }
      if (nlbgColor) {
        stys['--vxe-ui-gantt-view-task-now-line-background-color'] = nlbgColor;
      }
      if (nlWidth) {
        stys['--vxe-ui-gantt-view-task-now-line-width'] = (0, _dom.toCssUnit)(nlWidth);
      }
      if (viewStyle) {
        const {
          cellWidth
        } = viewStyle;
        if (cellWidth) {
          stys['--vxe-ui-gantt-view-default-cell-width'] = (0, _dom.toCssUnit)(cellWidth);
        }
      }
      if (tableStyle) {
        const {
          width: defTbWidth
        } = tableStyle;
        if (defTbWidth) {
          stys['--vxe-ui-gantt-view-table-default-width'] = (0, _dom.toCssUnit)(defTbWidth);
        }
      }
      return stys;
    });
    const computeTableExtendProps = (0, _vue.computed)(() => {
      const rest = {};
      const ganttProps = props;
      tableComponentPropKeys.forEach(key => {
        if (ganttProps[key] !== undefined) {
          rest[key] = ganttProps[key];
        }
      });
      return rest;
    });
    const computeTableProps = (0, _vue.computed)(() => {
      const {
        showFooter,
        seqConfig,
        pagerConfig,
        editConfig,
        proxyConfig
      } = props;
      const {
        isZMax,
        tablePage,
        footerData
      } = reactData;
      const taskViewOpts = computeTaskViewOpts.value;
      const {
        tableStyle
      } = taskViewOpts;
      const tableExtendProps = computeTableExtendProps.value;
      const proxyOpts = computeProxyOpts.value;
      const pagerOpts = computePagerOpts.value;
      const isLoading = computeIsLoading.value;
      const tProps = Object.assign({}, tableExtendProps, {
        // 不支持修改的属性
        showOverflow: true,
        showHeaderOverflow: true,
        showFooterOverflow: true
      });
      if (tableStyle) {
        const {
          border
        } = tableStyle;
        if (!_xeUtils.default.eqNull(border)) {
          tProps.border = border;
        }
      }
      if (showFooter && !tProps.footerData) {
        // 如果未设置自己的标位数据,则使用代理的
        tProps.footerData = footerData;
      } else if (proxyOpts.footer && footerData.length) {
        // 如果代理标为数据,且未请求到数据,则用自己的
        tProps.footerData = footerData;
      }
      if (isZMax) {
        if (tProps.maxHeight) {
          tProps.maxHeight = '100%';
        } else {
          tProps.height = '100%';
        }
      }
      if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts)) {
        tProps.loading = isLoading;
        if (pagerConfig && proxyOpts.seq && (0, _utils.isEnableConf)(pagerOpts)) {
          tProps.seqConfig = Object.assign({}, seqConfig, {
            startIndex: (tablePage.currentPage - 1) * tablePage.pageSize
          });
        }
      }
      if (editConfig) {
        tProps.editConfig = Object.assign({}, editConfig);
      }
      return tProps;
    });
    const computeCurrLayoutConf = (0, _vue.computed)(() => {
      const {
        layouts
      } = props;
      let confs = [];
      if (layouts && layouts.length) {
        confs = layouts;
      } else {
        confs = getConfig().gantt.layouts || defaultLayouts;
      }
      let headKeys = [];
      let bodyKeys = [];
      let footKeys = [];
      if (confs.length) {
        if (_xeUtils.default.isArray(confs[0])) {
          headKeys = confs[0];
          bodyKeys = confs[1] || [];
          footKeys = confs[2] || [];
        } else {
          bodyKeys = confs;
        }
      }
      return {
        headKeys,
        bodyKeys,
        footKeys
      };
    });
    const computeCustomCurrentPageFlag = (0, _vue.computed)(() => {
      const pagerOpts = computePagerOpts.value;
      return pagerOpts.currentPage;
    });
    const computeCustomPageSizeFlag = (0, _vue.computed)(() => {
      const pagerOpts = computePagerOpts.value;
      return pagerOpts.pageSize;
    });
    const computeCustomTotalFlag = (0, _vue.computed)(() => {
      const pagerOpts = computePagerOpts.value;
      return pagerOpts.total;
    });
    const computePageCount = (0, _vue.computed)(() => {
      const {
        tablePage
      } = reactData;
      return Math.max(Math.ceil(tablePage.total / tablePage.pageSize), 1);
    });
    const computeIsLoading = (0, _vue.computed)(() => {
      const {
        loading,
        proxyConfig
      } = props;
      const {
        tableLoading
      } = reactData;
      const proxyOpts = computeProxyOpts.value;
      const {
        showLoading
      } = proxyOpts;
      return loading || tableLoading && showLoading && proxyConfig && (0, _utils.isEnableConf)(proxyOpts);
    });
    const computeTableBorder = (0, _vue.computed)(() => {
      let {
        border
      } = props;
      const taskViewOpts = computeTaskViewOpts.value;
      const {
        viewStyle
      } = taskViewOpts;
      if (viewStyle) {
        if (!_xeUtils.default.eqNull(viewStyle.border)) {
          border = viewStyle.border;
        }
      }
      if (border === true) {
        return 'full';
      }
      if (border) {
        return border;
      }
      return 'default';
    });
    const refMaps = {
      refElem,
      refTable,
      refForm,
      refToolbar,
      refPager,
      refGanttView,
      refGanttContainerElem,
      refClassifyWrapperElem,
      refPopupContainerElem
    };
    const computeMaps = {
      computeProxyOpts,
      computePagerOpts,
      computeFormOpts,
      computeToolbarOpts,
      computeZoomOpts,
      computeTaskOpts,
      computeTaskViewScaleOpts,
      computeTaskNowLineOpts,
      computeTaskViewOpts,
      computeTaskBarOpts,
      computeTaskBarMoveOpts,
      computeTaskBarMoveTooltipOpts,
      computeTaskBarResizeOpts,
      computeTaskBarResizeTooltipOpts,
      computeTaskSplitOpts,
      computeTaskBarMilestoneOpts,
      computeTaskCriticalPathOpts,
      computeTaskBarSubviewOpts,
      computeTaskBarTooltipOpts,
      computeTaskLinkOpts,
      computeTaskViewScales,
      computeScaleUnit,
      computeDateFormat,
      computeMinScale,
      computeScaleStep,
      computeWeekScale,
      computeTitleField,
      computeStartField,
      computeEndField,
      computeTypeField,
      computeProgressField,
      computeScrollbarOpts,
      computeScrollbarXToTop,
      computeScrollbarYToLeft
    };
    computeMaps.computeTaskScaleConfs = computeTaskViewScales;
    const $xeGantt = {
      xID,
      props: props,
      context,
      reactData,
      internalData,
      getRefMaps: () => refMaps,
      getComputeMaps: () => computeMaps
    };
    const handleTaskScaleConfig = () => {
      const taskScaleConfs = computeTaskViewScales.value;
      const taskViewScaleOpts = computeTaskViewScaleOpts.value;
      const scaleConfs = [];
      const keyMaps = {};
      const scaleList = taskScaleConfs && taskScaleConfs.length ? taskScaleConfs : ['month', 'date'];
      scaleList.forEach(conf => {
        const sConf = !conf || _xeUtils.default.isString(conf) ? {
          type: conf
        } : conf;
        const type = sConf.type;
        const level = getViewTypeLevel(type);
        if (!type || !viewTypeLevelMaps[type]) {
          errLog('vxe.error.errProp', [`type=${type}`, _xeUtils.default.keys(viewTypeLevelMaps).join(',')]);
          return;
        }
        if (keyMaps[type]) {
          errLog('vxe.error.repeatProp', ['type', type]);
          return;
        }
        const scaleObj = Object.assign({}, type ? taskViewScaleOpts[type] || {} : {}, sConf, {
          level
        });
        keyMaps[type] = true;
        scaleConfs.push(scaleObj);
      });
      reactData.taskScaleList = _xeUtils.default.orderBy(scaleConfs, {
        field: 'level',
        order: 'desc'
      });
    };
    const initToolbar = () => {
      const toolbarOpts = computeToolbarOpts.value;
      if (props.toolbarConfig && (0, _utils.isEnableConf)(toolbarOpts)) {
        (0, _vue.nextTick)(() => {
          const $xeTable = refTable.value;
          const $xeToolbar = refToolbar.value;
          if ($xeTable && $xeToolbar) {
            $xeTable.connectToolbar($xeToolbar);
          }
        });
      }
    };
    const initGanttView = () => {
      const $xeTable = refTable.value;
      const $ganttView = refGanttView.value;
      if ($xeTable && $ganttView) {
        $xeTable.handleConnectGanttView($ganttView);
      }
    };
    const getFormData = () => {
      const {
        proxyConfig
      } = props;
      const {
        formData
      } = reactData;
      const proxyOpts = computeProxyOpts.value;
      const formOpts = computeFormOpts.value;
      return proxyConfig && (0, _utils.isEnableConf)(proxyOpts) && proxyOpts.form ? formData : formOpts.data;
    };
    const initPages = propKey => {
      const {
        tablePage
      } = reactData;
      const {
        pagerConfig
      } = props;
      const pagerOpts = computePagerOpts.value;
      if (pagerConfig && (0, _utils.isEnableConf)(pagerOpts)) {
        if (propKey) {
          if (pagerOpts[propKey]) {
            tablePage[propKey] = _xeUtils.default.toNumber(pagerOpts[propKey]);
          }
        } else {
          const {
            currentPage,
            pageSize,
            total
          } = pagerOpts;
          if (currentPage) {
            tablePage.currentPage = currentPage;
          }
          if (pageSize) {
            tablePage.pageSize = pageSize;
          }
          if (total) {
            tablePage.total = total;
          }
        }
      }
    };
    const triggerPendingEvent = code => {
      const isActiveMsg = computeIsActiveMsg.value;
      const $xeTable = refTable.value;
      const selectRecords = $xeTable ? $xeTable.getCheckboxRecords() : [];
      if (selectRecords.length) {
        if ($xeTable) {
          $xeTable.togglePendingRow(selectRecords);
        }
        $xeGantt.clearCheckboxRow();
      } else {
        if (isActiveMsg) {
          if (_core.VxeUI.modal) {
            _core.VxeUI.modal.message({
              id: code,
              content: getI18n('vxe.grid.selectOneRecord'),
              status: 'warning'
            });
          }
        }
      }
    };
    const getRespMsg = (rest, defaultMsg) => {
      const proxyOpts = computeProxyOpts.value;
      const resConfigs = proxyOpts.response || proxyOpts.props || {};
      const messageProp = resConfigs.message;
      const $xeTable = refTable.value;
      let msg;
      if (rest && messageProp) {
        msg = _xeUtils.default.isFunction(messageProp) ? messageProp({
          data: rest,
          $table: $xeTable,
          $grid: null,
          $gantt: $xeGantt
        }) : _xeUtils.default.get(rest, messageProp);
      }
      return msg || getI18n(defaultMsg);
    };
    const handleDeleteRow = (code, alertKey, callback) => {
      const isActiveMsg = computeIsActiveMsg.value;
      const selectRecords = $xeGantt.getCheckboxRecords();
      if (isActiveMsg) {
        if (selectRecords.length) {
          if (_core.VxeUI.modal) {
            return _core.VxeUI.modal.confirm({
              id: `cfm_${code}`,
              content: getI18n(alertKey),
              escClosable: true
            }).then(type => {
              if (type === 'confirm') {
                return callback();
              }
            });
          }
        } else {
          if (_core.VxeUI.modal) {
            _core.VxeUI.modal.message({
              id: `msg_${code}`,
              content: getI18n('vxe.grid.selectOneRecord'),
              status: 'warning'
            });
          }
        }
      } else {
        if (selectRecords.length) {
          callback();
        }
      }
      return Promise.resolve();
    };
    const pageChangeEvent = params => {
      const {
        proxyConfig
      } = props;
      const {
        tablePage
      } = reactData;
      const {
        $event,
        currentPage,
        pageSize
      } = params;
      const proxyOpts = computeProxyOpts.value;
      tablePage.currentPage = currentPage;
      tablePage.pageSize = pageSize;
      $xeGantt.dispatchEvent('page-change', params, $event);
      if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts)) {
        $xeGantt.commitProxy('query').then(rest => {
          $xeGantt.dispatchEvent('proxy-query', rest, $event);
        });
      }
    };
    const handleSortEvent = params => {
      const $xeTable = refTable.value;
      const {
        proxyConfig
      } = props;
      if (!$xeTable) {
        return;
      }
      const {
        computeSortOpts
      } = $xeTable.getComputeMaps();
      const proxyOpts = computeProxyOpts.value;
      const sortOpts = computeSortOpts.value;
      // 如果是服务端排序
      if (sortOpts.remote) {
        reactData.sortData = params.sortList;
        if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts)) {
          reactData.tablePage.currentPage = 1;
          $xeGantt.commitProxy('query').then(rest => {
            $xeGantt.dispatchEvent('proxy-query', rest, params.$event);
          });
        }
      }
    };
    const sortChangeEvent = params => {
      handleSortEvent(params);
      $xeGantt.dispatchEvent('sort-change', params, params.$event);
    };
    const clearAllSortEvent = params => {
      handleSortEvent(params);
      $xeGantt.dispatchEvent('clear-all-sort', params, params.$event);
    };
    const handleFilterEvent = params => {
      const $xeTable = refTable.value;
      const {
        proxyConfig
      } = props;
      if (!$xeTable) {
        return;
      }
      const {
        computeFilterOpts
      } = $xeTable.getComputeMaps();
      const proxyOpts = computeProxyOpts.value;
      const filterOpts = computeFilterOpts.value;
      // 如果是服务端过滤
      if (filterOpts.remote) {
        reactData.filterData = params.filterList;
        if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts)) {
          reactData.tablePage.currentPage = 1;
          internalData.uFoot = true;
          $xeGantt.commitProxy('query').then(rest => {
            $xeGantt.dispatchEvent('proxy-query', rest, params.$event);
          });
          internalData.uFoot = false;
          updateQueryFooter();
        }
      }
    };
    const filterChangeEvent = params => {
      handleFilterEvent(params);
      $xeGantt.dispatchEvent('filter-change', params, params.$event);
    };
    const clearAllFilterEvent = params => {
      handleFilterEvent(params);
      $xeGantt.dispatchEvent('clear-all-filter', params, params.$event);
    };
    const submitFormEvent = params => {
      const {
        proxyConfig
      } = props;
      const proxyOpts = computeProxyOpts.value;
      if (reactData.tableLoading) {
        return;
      }
      if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts)) {
        internalData.uFoot = true;
        $xeGantt.commitProxy('reload').then(rest => {
          $xeGantt.dispatchEvent('proxy-query', Object.assign(Object.assign({}, rest), {
            isReload: true
          }), params.$event);
        });
        internalData.uFoot = false;
        updateQueryFooter();
      }
      $xeGantt.dispatchEvent('form-submit', params, params.$event);
    };
    const resetFormEvent = params => {
      const $xeTable = refTable.value;
      const {
        proxyConfig
      } = props;
      const {
        $event
      } = params;
      const proxyOpts = computeProxyOpts.value;
      if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts)) {
        if ($xeTable) {
          $xeTable.clearScroll();
        }
        internalData.uFoot = true;
        $xeGantt.commitProxy('reload').then(rest => {
          $xeGantt.dispatchEvent('proxy-query', Object.assign(Object.assign({}, rest), {
            isReload: true
          }), $event);
        });
        internalData.uFoot = false;
        updateQueryFooter();
      }
      $xeGantt.dispatchEvent('form-reset', params, $event);
    };
    const submitInvalidEvent = params => {
      $xeGantt.dispatchEvent('form-submit-invalid', params, params.$event);
    };
    const collapseEvent = params => {
      const {
        $event
      } = params;
      $xeGantt.dispatchEvent('form-toggle-collapse', params, $event);
      $xeGantt.dispatchEvent('form-collapse', params, $event);
    };
    const handleZoom = isMax => {
      const {
        isZMax
      } = reactData;
      if (isMax ? !isZMax : isZMax) {
        reactData.isZMax = !isZMax;
        if (reactData.tZindex < (0, _utils.getLastZIndex)()) {
          reactData.tZindex = (0, _utils.nextZIndex)();
        }
      }
      return (0, _vue.nextTick)().then(() => $xeGantt.recalculate(true)).then(() => {
        setTimeout(() => $xeGantt.recalculate(true), 15);
        return reactData.isZMax;
      });
    };
    const getFuncSlot = (optSlots, slotKey) => {
      const funcSlot = optSlots[slotKey];
      if (funcSlot) {
        if (_xeUtils.default.isString(funcSlot)) {
          if (slots[funcSlot]) {
            return slots[funcSlot];
          } else {
            errLog('vxe.error.notSlot', [funcSlot]);
          }
        } else {
          return funcSlot;
        }
      }
      return null;
    };
    const getConfigSlot = slotConfigs => {
      const slotConf = {};
      _xeUtils.default.objectMap(slotConfigs, (slotFunc, slotKey) => {
        if (slotFunc) {
          if (_xeUtils.default.isString(slotFunc)) {
            if (slots[slotFunc]) {
              slotConf[slotKey] = slots[slotFunc];
            } else {
              errLog('vxe.error.notSlot', [slotFunc]);
            }
          } else {
            slotConf[slotKey] = slotFunc;
          }
        }
      });
      return slotConf;
    };
    const dragSplitEvent = evnt => {
      const el = refElem.value;
      if (!el) {
        return;
      }
      const ganttContainerEl = refGanttContainerElem.value;
      if (!ganttContainerEl) {
        return;
      }
      const tableWrapperEl = refTableWrapper.value;
      if (!tableWrapperEl) {
        return;
      }
      const rsSplitLineEl = refResizableSplitTip.value;
      if (!rsSplitLineEl) {
        return;
      }
      const taskViewOpts = computeTaskViewOpts.value;
      const containerRect = ganttContainerEl.getBoundingClientRect();
      const rsSplitTipEl = rsSplitLineEl.children[0];
      const disX = evnt.clientX;
      const ganttWidth = ganttContainerEl.clientWidth;
      const tableWidth = tableWrapperEl.clientWidth;
      const tableMinWidth = taskViewOpts.tableStyle && _xeUtils.default.toNumber(taskViewOpts.tableStyle.minWidth) || 80;
      let targetTableWidth = tableWidth;
      let offsetLeft = -1;
      (0, _dom.addClass)(el, 'is--split-drag');
      const handleReStyle = evnt => {
        const rsNumLeftEl = rsSplitTipEl.children[0];
        const rsNumRightEl = rsSplitTipEl.children[1];
        let tipHeight = 0;
        if (rsNumLeftEl) {
          if (offsetLeft < 0) {
            rsNumLeftEl.style.display = 'none';
          } else {
            rsNumLeftEl.textContent = `${targetTableWidth}px`;
            rsNumLeftEl.style.display = 'block';
            tipHeight = rsNumLeftEl.offsetHeight;
          }
        }
        if (rsNumRightEl) {
          if (offsetLeft < 0) {
            rsNumRightEl.textContent = `${Math.floor(containerRect.width - targetTableWidth)}px`;
            rsNumRightEl.style.display = 'block';
            tipHeight = rsNumRightEl.offsetHeight;
          } else {
            rsNumRightEl.style.display = 'none';
          }
        }
        const tipTop = evnt.clientY - containerRect.top - tipHeight / 2;
        rsSplitLineEl.style.left = `${targetTableWidth}px`;
        rsSplitTipEl.style.top = `${Math.min(containerRect.height - tipHeight - 1, Math.max(1, tipTop))}px`;
      };
      document.onmousemove = evnt => {
        evnt.preventDefault();
        offsetLeft = evnt.clientX - disX;
        targetTableWidth = Math.min(ganttWidth - 80, Math.max(tableMinWidth, tableWidth + offsetLeft));
        handleReStyle(evnt);
      };
      document.onmouseup = () => {
        document.onmousemove = null;
        document.onmouseup = null;
        rsSplitLineEl.style.display = '';
        tableWrapperEl.style.width = `${targetTableWidth}px`;
        (0, _dom.removeClass)(el, 'is--split-drag');
        const $xeTable = refTable.value;
        if ($xeTable) {
          $xeTable.recalculate(true);
        }
      };
      rsSplitLineEl.style.display = 'block';
      handleReStyle(evnt);
    };
    const handleSplitAnimat = () => {
      const taskSplitOpts = computeTaskSplitOpts.value;
      const {
        animation
      } = taskSplitOpts;
      if (animation) {
        const {
          _taTime
        } = internalData;
        if (_taTime) {
          clearTimeout(_taTime);
        }
        reactData.showSplitAnimat = true;
        internalData._taTime = setTimeout(() => {
          reactData.showSplitAnimat = false;
          internalData._taTime = null;
        }, 350);
      }
    };
    const handleSplitLeftViewEvent = () => {
      handleSplitAnimat();
      reactData.showLeftView = !reactData.showLeftView;
    };
    const handleSplitRightViewEvent = () => {
      handleSplitAnimat();
      reactData.showRightView = !reactData.showRightView;
    };
    const tableCompEvents = {};
    _tableEmits.tableEmits.forEach(name => {
      const type = _xeUtils.default.camelCase(`on-${name}`);
      tableCompEvents[type] = (...args) => emit(name, ...args);
    });
    const getDefaultFormData = () => {
      const formOpts = computeFormOpts.value;
      if (formOpts.items) {
        const fData = {};
        formOpts.items.forEach(item => {
          const {
            field,
            itemRender
          } = item;
          if (field) {
            let itemValue = null;
            if (itemRender) {
              const {
                startField,
                endField,
                defaultValue
              } = itemRender;
              if (_xeUtils.default.isFunction(defaultValue)) {
                itemValue = defaultValue({
                  item
                });
              } else if (!_xeUtils.default.isUndefined(defaultValue)) {
                itemValue = defaultValue;
              }
              if (startField && endField) {
                _xeUtils.default.set(fData, startField, null);
                _xeUtils.default.set(fData, endField, null);
              }
            }
            fData[field] = itemValue;
          }
        });
        return fData;
      }
      return {};
    };
    const initProxy = () => {
      const {
        proxyConfig,
        formConfig
      } = props;
      const {
        proxyInited
      } = reactData;
      const proxyOpts = computeProxyOpts.value;
      const formOpts = computeFormOpts.value;
      if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts)) {
        if (formConfig && (0, _utils.isEnableConf)(formOpts) && proxyOpts.form && formOpts.items) {
          reactData.formData = getDefaultFormData();
        }
        if (!proxyInited) {
          reactData.proxyInited = true;
          if (proxyOpts.autoLoad !== false) {
            (0, _vue.nextTick)().then(() => {
              internalData.uFoot = true;
              const rest = $xeGantt.commitProxy('initial');
              internalData.uFoot = false;
              updateQueryFooter();
              return rest;
            }).then(rest => {
              dispatchEvent('proxy-query', Object.assign(Object.assign({}, rest), {
                isInited: true
              }), new Event('initial'));
            });
          }
        }
      }
    };
    const updateQueryFooter = () => {
      const proxyOpts = computeProxyOpts.value;
      const {
        ajax
      } = proxyOpts;
      if (ajax && ajax.queryFooter) {
        return $xeGantt.commitProxy('queryFooter');
      }
    };
    const handleGlobalKeydownEvent = evnt => {
      const zoomOpts = computeZoomOpts.value;
      const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE);
      if (isEsc && reactData.isZMax && zoomOpts.escRestore !== false) {
        $xeGantt.triggerZoomEvent(evnt);
      }
    };
    const dispatchEvent = (type, params, evnt) => {
      emit(type, createEvent(evnt, {
        $grid: null,
        $gantt: $xeGantt
      }, params));
    };
    const handleTargetEnterEvent = isClear => {
      const $tooltip = refTooltip.value;
      clearTimeout(internalData.barTipTimeout);
      if (isClear) {
        $xeGantt.closeTaskBarTooltip();
      } else {
        if ($tooltip && $tooltip.setActived) {
          $tooltip.setActived(true);
        }
      }
    };
    const ganttMethods = {
      dispatchEvent,
      getEl() {
        return refElem.value;
      },
      /**
       * 提交指令,支持 code 或 button
       * @param {String/Object} code 字符串或对象
       */
      commitProxy(proxyTarget, ...args) {
        const {
          showFooter,
          proxyConfig,
          toolbarConfig,
          pagerConfig,
          editRules,
          validConfig
        } = props;
        const {
          tablePage
        } = reactData;
        const isActiveMsg = computeIsActiveMsg.value;
        const isRespMsg = computeIsRespMsg.value;
        const proxyOpts = computeProxyOpts.value;
        const pagerOpts = computePagerOpts.value;
        const toolbarOpts = computeToolbarOpts.value;
        const {
          beforeQuery: oldBeforeQuery,
          afterQuery: oldAfterQuery,
          beforeQueryFooter: oldBeforeQueryFooter,
          afterQueryFooter: oldAfterQueryFooter,
          beforeDelete: oldBeforeDelete,
          afterDelete: oldAfterDelete,
          beforeSave: oldBeforeSave,
          afterSave: oldAfterSave,
          ajax = {}
        } = proxyOpts;
        const resConfigs = proxyOpts.response || proxyOpts.props || {};
        const $xeTable = refTable.value;
        if (!$xeTable) {
          return (0, _vue.nextTick)();
        }
        let formData = getFormData();
        let button = null;
        let code = null;
        if (_xeUtils.default.isString(proxyTarget)) {
          const {
            buttons
          } = toolbarOpts;
          const matchObj = toolbarConfig && (0, _utils.isEnableConf)(toolbarOpts) && buttons ? _xeUtils.default.findTree(buttons, item => item.code === proxyTarget, {
            children: 'dropdowns'
          }) : null;
          button = matchObj ? matchObj.item : null;
          code = proxyTarget;
        } else {
          button = proxyTarget;
          code = button.code;
        }
        const btnParams = button ? button.params : null;
        switch (code) {
          case 'insert':
            return $xeTable.insert({});
          case 'insert_edit':
            return $xeTable.insert({}).then(({
              row
            }) => $xeTable.setEditRow(row, true));
          // 已废弃
          case 'insert_actived':
            return $xeTable.insert({}).then(({
              row
            }) => $xeTable.setEditRow(row, true));
          // 已废弃
          case 'mark_cancel':
            triggerPendingEvent(code);
            break;
          case 'remove':
            return handleDeleteRow(code, 'vxe.grid.removeSelectRecord', () => $xeTable.removeCheckboxRow());
          case 'import':
            $xeTable.importData(btnParams);
            break;
          case 'open_import':
            $xeTable.openImport(btnParams);
            break;
          case 'export':
            $xeTable.exportData(btnParams);
            break;
          case 'open_export':
            $xeTable.openExport(btnParams);
            break;
          case 'reset_custom':
            return $xeTable.resetCustom(true);
          case 'initial':
          case 'reload':
          case 'query':
            {
              const bqMethod = ajax.beforeQuery;
              const qMethod = ajax.query;
              const aqMethod = ajax.afterQuery;
              const qsMethod = ajax.querySuccess;
              const qeMethod = ajax.queryError;
              if (qMethod) {
                const isInited = code === 'initial';
                const isReload = code === 'reload';
                if (!isInited && reactData.tableLoading) {
                  return (0, _vue.nextTick)();
                }
                let operPromise = null;
                let sortList = [];
                let filterList = [];
                let pageParams = {};
                if (pagerConfig) {
                  if (isInited || isReload) {
                    // 重置分页
                    tablePage.currentPage = 1;
                  }
                  if ((0, _utils.isEnableConf)(pagerOpts)) {
                    pageParams = Object.assign({}, tablePage);
                  }
                }
                if (isInited) {
                  // 重置代理表单数据
                  if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts) && proxyOpts.form) {
                    formData = getDefaultFormData();
                    reactData.formData = formData;
                  }
                  if ($xeTable) {
                    const tableInternalData = $xeTable.internalData;
                    const {
                      tableFullColumn,
                      fullColumnFieldData
                    } = tableInternalData;
                    const {
                      computeSortOpts
                    } = $xeTable.getComputeMaps();
                    const sortOpts = computeSortOpts.value;
                    let defaultSort = sortOpts.defaultSort;
                    tableFullColumn.forEach(column => {
                      column.order = null;
                    });
                    // 如果使用默认排序
                    if (defaultSort) {
                      if (!_xeUtils.default.isArray(defaultSort)) {
                        defaultSort = [defaultSort];
                      }
                      sortList = defaultSort.map(item => {
                        const {
                          field,
                          order
                        } = item;
                        const colRest = fullColumnFieldData[field];
                        if (colRest) {
                          const column = colRest.column;
                          if (column) {
                            column.order = order;
                          }
                        }
                        return {
                          field,
                          property: field,
                          order
                        };
                      });
                    }
                    filterList = $xeTable.getCheckedFilters();
                  }
                } else {
                  if ($xeTable) {
                    if (isReload) {
                      operPromise = $xeTable.clearAll();
                    } else {
                      sortList = $xeTable.getSortColumns();
                      filterList = $xeTable.getCheckedFilters();
                    }
                  }
                }
                const commitParams = {
                  $table: $xeTable,
                  $grid: null,
                  $gantt: $xeGantt,
                  code,
                  button,
                  isInited,
                  isReload,
                  page: pageParams,
                  sort: sortList.length ? sortList[0] : {},
                  sorts: sortList,
                  filters: filterList,
                  form: formData,
                  options: qMethod
                };
                const handleQuery = () => {
                  reactData.sortData = sortList;
                  reactData.filterData = filterList;
                  reactData.tableLoading = true;
                  return Promise.all([Promise.resolve((oldBeforeQuery || qMethod)(commitParams, ...args)), operPromise]).then(([rest]) => {
                    reactData.tableLoading = false;
                    if (aqMethod) {
                      aqMethod(Object.assign(Object.assign({}, commitParams), {
                        response: rest,
                        status: 'success'
                      }), ...args);
                    } else {
                      let tableData = [];
                      if (rest) {
                        const reParams = {
                          data: rest,
                          $table: $xeTable,
                          $grid: null,
                          $gantt: $xeGantt
                        };
                        if (pagerConfig && (0, _utils.isEnableConf)(pagerOpts)) {
                          const totalProp = resConfigs.total;
                          const total = (_xeUtils.default.isFunction(totalProp) ? totalProp(reParams) : _xeUtils.default.get(rest, totalProp || 'page.total')) || 0;
                          tablePage.total = _xeUtils.default.toNumber(total);
                          const resultProp = resConfigs.result;
                          tableData = (_xeUtils.default.isFunction(resultProp) ? resultProp(reParams) : _xeUtils.default.get(rest, resultProp || 'result')) || [];
                          // 检验当前页码,不能超出当前最大页数
                          const pageCount = Math.max(Math.ceil(total / tablePage.pageSize), 1);
                          if (tablePage.currentPage > pageCount) {
                            tablePage.currentPage = pageCount;
                          }
                        } else {
                          const listProp = resConfigs.list;
                          if (_xeUtils.default.isArray(rest)) {
                            tableData = rest;
                          } else if (listProp) {
                            tableData = (_xeUtils.default.isFunction(listProp) ? listProp(reParams) : _xeUtils.default.get(rest, listProp)) || [];
                          }
                        }
                        if (showFooter) {
                          const fdProp = resConfigs.footerData;
                          const footerList = fdProp ? _xeUtils.default.isFunction(fdProp) ? fdProp(reParams) : _xeUtils.default.get(rest, fdProp) : [];
                          if (_xeUtils.default.isArray(footerList)) {
                            reactData.footerData = footerList;
                          }
                        }
                      }
                      if ($xeTable) {
                        $xeTable.loadData(tableData);
                      } else {
                        (0, _vue.nextTick)(() => {
                          const $xeTable = refTable.value;
                          if ($xeTable) {
                            $xeTable.loadData(tableData);
                          }
                        });
                      }
                      if (oldAfterQuery) {
                        oldAfterQuery(Object.assign(Object.assign({}, commitParams), {
                          response: rest
                        }), ...args);
                      }
                    }
                    if (qsMethod) {
                      qsMethod(Object.assign(Object.assign({}, commitParams), {
                        response: rest
                      }));
                    }
                    return {
                      status: true
                    };
                  }).catch(rest => {
                    reactData.tableLoading = false;
                    if (aqMethod) {
                      aqMethod(Object.assign(Object.assign({}, commitParams), {
                        response: rest,
                        status: 'error'
                      }), ...args);
                    }
                    if (qeMethod) {
                      qeMethod(Object.assign(Object.assign({}, commitParams), {
                        response: rest
                      }));
                    }
                    return {
                      status: false
                    };
                  });
                };
                if (bqMethod) {
                  return Promise.resolve(bqMethod(commitParams, ...args)).then(status => {
                    if (status !== false) {
                      return handleQuery();
                    }
                  });
                }
                return handleQuery();
              } else {
                errLog('vxe.error.notFunc', ['proxy-config.ajax.query']);
              }
              break;
            }
          case 'queryFooter':
            {
              const bqfMethod = ajax.beforeQueryFooter;
              const qfMethod = ajax.queryFooter;
              const aqfMethod = ajax.afterQueryFooter;
              const qfSuccessMethod = ajax.queryFooterSuccess;
              const qfErrorMethod = ajax.queryFooterError;
              if (qfMethod) {
                let filterList = [];
                if ($xeTable) {
                  filterList = $xeTable.getCheckedFilters();
                }
                let pageParams = {};
                if (pagerConfig) {
                  if ((0, _utils.isEnableConf)(pagerOpts)) {
                    pageParams = Object.assign({}, tablePage);
                  }
                }
                const commitParams = {
                  $table: $xeTable,
                  $grid: null,
                  $gantt: $xeGantt,
                  code,
                  button,
                  page: pageParams,
                  filters: filterList,
                  form: formData,
                  options: qfMethod
                };
                const handleQueryFooter = () => {
                  return Promise.resolve((oldBeforeQueryFooter || qfMethod)(commitParams, ...args)).then(rest => {
                    if (aqfMethod) {
                      aqfMethod(Object.assign(Object.assign({}, commitParams), {
                        response: rest,
                        status: 'success'
                      }), ...args);
                    } else {
                      reactData.footerData = _xeUtils.default.isArray(rest) ? rest : [];
                      if (oldAfterQueryFooter) {
                        oldAfterQueryFooter(Object.assign(Object.assign({}, commitParams), {
                          response: rest
                        }), ...args);
                      }
                    }
                    if (qfSuccessMethod) {
                      qfSuccessMethod(Object.assign(Object.assign({}, commitParams), {
                        response: rest
                      }));
                    }
                    return {
                      status: true
                    };
                  }).catch(rest => {
                    if (aqfMethod) {
                      aqfMethod(Object.assign(Object.assign({}, commitParams), {
                        response: rest,
                        status: 'error'
                      }), ...args);
                    }
                    if (qfErrorMethod) {
                      qfErrorMethod(Object.assign(Object.assign({}, commitParams), {
                        response: rest
                      }));
                    }
                    return {
                      status: false
                    };
                  });
                };
                if (bqfMethod) {
                  return Promise.resolve(bqfMethod(commitParams, ...args)).then(status => {
                    if (status !== false) {
                      return handleQueryFooter();
                    }
                  });
                }
                return handleQueryFooter();
              } else {
                errLog('vxe.error.notFunc', ['proxy-config.ajax.queryFooter']);
              }
              break;
            }
          case 'delete':
            {
              const bdMethod = ajax.beforeDelete;
              const dMethod = ajax.delete;
              const adMethod = ajax.afterDelete;
              const deleteSuccessMethods = ajax.deleteSuccess;
              const deleteErrorMethods = ajax.deleteError;
              if (dMethod) {
                const selectRecords = $xeGantt.getCheckboxRecords();
                const removeRecords = selectRecords.filter(row => !$xeTable.isInsertByRow(row));
                const body = {
                  removeRecords
                };
                const commitParams = {
                  $table: $xeTable,
                  $grid: null,
                  $gantt: $xeGantt,
                  code,
                  button,
                  body,
                  form: formData,
                  options: dMethod
                };
                if (selectRecords.length) {
                  return handleDeleteRow(code, 'vxe.grid.deleteSelectRecord', () => {
                    if (!removeRecords.length) {
                      return $xeTable.remove(selectRecords);
                    }
                    const handleDelete = () => {
                      reactData.tableLoading = true;
                      return Promise.resolve((oldBeforeDelete || dMethod)(commitParams, ...args)).then(rest => {
                        reactData.tableLoading = false;
                        if (adMethod) {
                          adMethod(Object.assign(Object.assign({}, commitParams), {
                            response: rest,
                            status: 'success'
                          }), ...args);
                        } else {
                          $xeTable.setPendingRow(removeRecords, false);
                          if (isRespMsg) {
                            if (_core.VxeUI.modal) {
                              _core.VxeUI.modal.message({
                                content: getRespMsg(rest, 'vxe.grid.delSuccess'),
                                status: 'success'
                              });
                            }
                          }
                          if (oldAfterDelete) {
                            oldAfterDelete(Object.assign(Object.assign({}, commitParams), {
                              response: rest
                            }), ...args);
                          } else {
                            internalData.uFoot = true;
                            $xeGantt.commitProxy('query');
                            internalData.uFoot = false;
                            updateQueryFooter();
                          }
                        }
                        if (deleteSuccessMethods) {
                          deleteSuccessMethods(Object.assign(Object.assign({}, commitParams), {
                            response: rest
                          }));
                        }
                        return {
                          status: true
                        };
                      }).catch(rest => {
                        reactData.tableLoading = false;
                        if (adMethod) {
                          adMethod(Object.assign(Object.assign({}, commitParams), {
                            response: rest,
                            status: 'error'
                          }), ...args);
                        } else {
                          if (isRespMsg) {
                            if (_core.VxeUI.modal) {
                              _core.VxeUI.modal.message({
                                id: code,
                                content: getRespMsg(rest, 'vxe.grid.operError'),
                                status: 'error'
                              });
                            }
                          }
                        }
                        if (deleteErrorMethods) {
                          deleteErrorMethods(Object.assign(Object.assign({}, commitParams), {
                            response: rest
                          }));
                        }
                        return {
                          status: false
                        };
                      });
                    };
                    if (bdMethod) {
                      return Promise.resolve(bdMethod(commitParams, ...args)).then(status => {
                        if (status !== false) {
                          return handleDelete();
                        }
                      });
                    }
                    return handleDelete();
                  });
                } else {
                  if (isActiveMsg) {
                    if (_core.VxeUI.modal) {
                      _core.VxeUI.modal.message({
                        id: code,
                        content: getI18n('vxe.grid.selectOneRecord'),
                        status: 'warning'
                      });
                    }
                  }
                }
              } else {
                errLog('vxe.error.notFunc', ['proxy-config.ajax.delete']);
              }
              break;
            }
          case 'save':
            {
              const bSaveMethod = ajax.beforeSave;
              const sMethod = ajax.save;
              const aSaveMethod = ajax.afterSave;
              const sSuccessMethod = ajax.saveSuccess;
              const sErrorMethod = ajax.saveError;
              if (sMethod) {
                const body = $xeTable.getRecordset();
                const {
                  insertRecords,
                  removeRecords,
                  updateRecords,
                  pendingRecords
                } = body;
                const commitParams = {
                  $table: $xeTable,
                  $grid: null,
                  $gantt: $xeGantt,
                  code,
                  button,
                  body,
                  form: formData,
                  options: sMethod
                };
                // 排除掉新增且标记为删除的数据
                if (insertRecords.length) {
                  body.pendingRecords = pendingRecords.filter(row => $xeTable.findRowIndexOf(insertRecords, row) === -1);
                }
                // 排除已标记为删除的数据
                if (pendingRecords.length) {
                  body.insertRecords = insertRecords.filter(row => $xeTable.findRowIndexOf(pendingRecords, row) === -1);
                }
                let restPromise = Promise.resolve();
                if (editRules) {
                  // 只校验新增和修改的数据
                  restPromise = $xeTable[validConfig && validConfig.msgMode === 'full' ? 'fullValidate' : 'validate'](body.insertRecords.concat(updateRecords));
                }
                return restPromise.then(errMap => {
                  if (errMap) {
                    // 如果校验不通过
                    return;
                  }
                  if (body.insertRecords.length || removeRecords.length || updateRecords.length || body.pendingRecords.length) {
                    const handleSave = () => {
                      reactData.tableLoading = true;
                      return Promise.resolve((oldBeforeSave || sMethod)(commitParams, ...args)).then(rest => {
                        reactData.tableLoading = false;
                        if (aSaveMethod) {
                          aSaveMethod(Object.assign(Object.assign({}, commitParams), {
                            response: rest,
                            status: 'success'
                          }), ...args);
                        } else {
                          $xeTable.clearPendingRow();
                          if (isRespMsg) {
                            if (_core.VxeUI.modal) {
                              _core.VxeUI.modal.message({
                                content: getRespMsg(rest, 'vxe.grid.saveSuccess'),
                                status: 'success'
                              });
                            }
                          }
                          if (oldAfterSave) {
                            oldAfterSave(Object.assign(Object.assign({}, commitParams), {
                              response: rest
                            }), ...args);
                          } else {
                            internalData.uFoot = true;
                            $xeGantt.commitProxy('query');
                            internalData.uFoot = false;
                            updateQueryFooter();
                          }
                        }
                        if (sSuccessMethod) {
                          sSuccessMethod(Object.assign(Object.assign({}, commitParams), {
                            response: rest
                          }));
                        }
                        return {
                          status: true
                        };
                      }).catch(rest => {
                        reactData.tableLoading = false;
                        if (aSaveMethod) {
                          aSaveMethod(Object.assign(Object.assign({}, commitParams), {
                            response: rest,
                            status: 'error'
                          }), ...args);
                        } else {
                          if (isRespMsg) {
                            if (_core.VxeUI.modal) {
                              _core.VxeUI.modal.message({
                                id: code,
                                content: getRespMsg(rest, 'vxe.grid.operError'),
                                status: 'error'
                              });
                            }
                          }
                        }
                        if (sErrorMethod) {
                          sErrorMethod(Object.assign(Object.assign({}, commitParams), {
                            response: rest
                          }));
                        }
                        return {
                          status: false
                        };
                      });
                    };
                    if (bSaveMethod) {
                      return Promise.resolve(bSaveMethod(commitParams, ...args)).then(status => {
                        if (status !== false) {
                          return handleSave();
                        }
                      });
                    }
                    return handleSave();
                  } else {
                    if (isActiveMsg) {
                      if (_core.VxeUI.modal) {
                        _core.VxeUI.modal.message({
                          id: code,
                          content: getI18n('vxe.grid.dataUnchanged'),
                          status: 'info'
                        });
                      }
                    }
                  }
                });
              } else {
                errLog('vxe.error.notFunc', ['proxy-config.ajax.save']);
              }
              break;
            }
          default:
            {
              const gCommandOpts = commands.get(code);
              if (gCommandOpts) {
                const tCommandMethod = gCommandOpts.tableCommandMethod || gCommandOpts.commandMethod;
                if (tCommandMethod) {
                  tCommandMethod({
                    code,
                    button,
                    $table: $xeTable,
                    $grid: null,
                    $gantt: $xeGantt
                  }, ...args);
                } else {
                  errLog('vxe.error.notCommands', [code]);
                }
              }
            }
        }
        return (0, _vue.nextTick)();
      },
      getParams() {
        return props.params;
      },
      zoom() {
        if (reactData.isZMax) {
          return $xeGantt.revert();
        }
        return $xeGantt.maximize();
      },
      isMaximized() {
        return reactData.isZMax;
      },
      maximize() {
        return handleZoom(true);
      },
      revert() {
        return handleZoom();
      },
      getFormData,
      /**
       * 已废弃,被 getFormFlatItems 替换
       * @deprecated
       */
      getFormItems(itemIndex) {
        const formOpts = computeFormOpts.value;
        const {
          formConfig
        } = props;
        const {
          items
        } = formOpts;
        const itemList = [];
        _xeUtils.default.eachTree(formConfig && (0, _utils.isEnableConf)(formOpts) && items ? items : [], item => {
          itemList.push(item);
        }, {
          children: 'children'
        });
        // errLog('vxe.error.delFunc', ['getFormItems', 'getFormFlatItems'])
        return _xeUtils.default.isUndefined(itemIndex) ? itemList : itemList[itemIndex];
      },
      getFormFlatItems() {
        const $form = refForm.value;
        if ($form) {
          return $form.getFlatItems();
        }
        return [];
      },
      getFormNestedItems() {
        const $form = refForm.value;
        if ($form) {
          return $form.getNestedItems();
        }
        return [];
      },
      getFormItemByField(field) {
        const $form = refForm.value;
        if ($form) {
          return $form.getItemByField(field);
        }
        return null;
      },
      resetForm() {
        const $form = refForm.value;
        if ($form) {
          return $form.reset();
        }
        return (0, _vue.nextTick)();
      },
      validateForm() {
        const $form = refForm.value;
        if ($form) {
          return $form.validate();
        }
        return (0, _vue.nextTick)();
      },
      validateFormField(field) {
        const $form = refForm.value;
        if ($form) {
          return $form.validateField(field);
        }
        return (0, _vue.nextTick)();
      },
      clearFormValidate(field) {
        const $form = refForm.value;
        if ($form) {
          return $form.clearValidate(field);
        }
        return (0, _vue.nextTick)();
      },
      homePage() {
        const {
          tablePage
        } = reactData;
        tablePage.currentPage = 1;
        return (0, _vue.nextTick)();
      },
      homePageByEvent(evnt) {
        const $pager = refPager.value;
        if ($pager) {
          $pager.homePageByEvent(evnt);
        }
      },
      endPage() {
        const {
          tablePage
        } = reactData;
        const pageCount = computePageCount.value;
        tablePage.currentPage = pageCount;
        return (0, _vue.nextTick)();
      },
      endPageByEvent(evnt) {
        const $pager = refPager.value;
        if ($pager) {
          $pager.endPageByEvent(evnt);
        }
      },
      getCurrentPage() {
        const {
          tablePage
        } = reactData;
        return tablePage.currentPage;
      },
      setCurrentPage(currentPage) {
        const {
          tablePage
        } = reactData;
        const pageCount = computePageCount.value;
        tablePage.currentPage = Math.min(pageCount, Math.max(1, _xeUtils.default.toNumber(currentPage)));
        return (0, _vue.nextTick)();
      },
      setCurrentPageByEvent(evnt, currentPage) {
        const $pager = refPager.value;
        if ($pager) {
          $pager.setCurrentPageByEvent(evnt, currentPage);
        }
      },
      getPageSize() {
        const {
          tablePage
        } = reactData;
        return tablePage.pageSize;
      },
      setPageSize(pageSize) {
        const {
          tablePage
        } = reactData;
        tablePage.pageSize = Math.max(1, _xeUtils.default.toNumber(pageSize));
        return (0, _vue.nextTick)();
      },
      setPageSizeByEvent(evnt, pageSize) {
        const $pager = refPager.value;
        if ($pager) {
          $pager.setPageSizeByEvent(evnt, pageSize);
        }
      },
      getProxyInfo() {
        const $xeTable = refTable.value;
        if (props.proxyConfig) {
          const {
            sortData
          } = reactData;
          return {
            data: $xeTable ? $xeTable.getFullData() : [],
            filter: reactData.filterData,
            form: getFormData(),
            sort: sortData.length ? sortData[0] : {},
            sorts: sortData,
            pager: reactData.tablePage,
            pendingRecords: $xeTable ? $xeTable.getPendingRecords() : []
          };
        }
        return null;
      },
      getCustomPagerData() {
        const {
          pagerConfig
        } = props;
        const {
          tablePage
        } = reactData;
        const pagerOpts = computePagerOpts.value;
        if (pagerConfig && (0, _utils.isEnableConf)(pagerOpts)) {
          return {
            pSize: tablePage.pageSize
          };
        }
        return {};
      },
      // setProxyInfo (options) {
      //   if (props.proxyConfig && options) {
      //     const { pager, form } = options
      //     const proxyOpts = computeProxyOpts.value
      //     if (pager) {
      //       if (pager.currentPage) {
      //         reactData.tablePage.currentPage = Number(pager.currentPage)
      //       }
      //       if (pager.pageSize) {
      //         reactData.tablePage.pageSize = Number(pager.pageSize)
      //       }
      //     }
      //     if (proxyOpts.form && form) {
      //       Object.assign(reactData.formData, form)
      //     }
      //   }
      //   return nextTick()
      // },
      refreshTaskView() {
        const $ganttView = refGanttView.value;
        if ($ganttView) {
          return $ganttView.refreshData();
        }
        return (0, _vue.nextTick)();
      },
      hasTableViewVisible() {
        return reactData.showLeftView;
      },
      showTableView() {
        reactData.showLeftView = true;
        return (0, _vue.nextTick)();
      },
      hideTableView() {
        reactData.showLeftView = false;
        // 至少显示一个
        if (!reactData.showRightView) {
          reactData.showRightView = true;
        }
        return (0, _vue.nextTick)();
      },
      hasTaskViewVisible() {
        return reactData.showRightView;
      },
      showTaskView() {
        reactData.showRightView = true;
        return (0, _vue.nextTick)();
      },
      hideTaskView() {
        reactData.showRightView = false;
        // 至少显示一个
        if (!reactData.showLeftView) {
          reactData.showLeftView = true;
        }
        return (0, _vue.nextTick)();
      },
      /**
       * 关闭 bar tooltip
       */
      closeTaskBarTooltip() {
        const {
          barTipStore
        } = reactData;
        const $tooltip = refTooltip.value;
        if (barTipStore.visible) {
          Object.assign(barTipStore, {
            row: null,
            content: null,
            visible: false,
            params: {}
          });
          if ($tooltip && $tooltip.close) {
            $tooltip.close();
          }
        }
        return (0, _vue.nextTick)();
      },
      scrollToDateView(colDate) {
        const $ganttView = refGanttView.value;
        if ($ganttView) {
          const ganttViewReactData = $ganttView.reactData;
          const ganttViewInternalData = $ganttView.internalData;
          const {
            viewCellWidth
          } = ganttViewReactData;
          const {
            visibleColumn,
            elemStore
          } = ganttViewInternalData;
          const currDate = _xeUtils.default.toStringDate(colDate);
          const currTime = currDate.getTime();
          const colIndex = _xeUtils.default.findIndexOf(visibleColumn, column => currTime === column.dateObj.date.getTime());
          const bodyScrollElem = (0, _util.getRefElem)(elemStore['main-body-scroll']);
          if (colIndex > -1 && bodyScrollElem) {
            bodyScrollElem.scrollLeft = _xeUtils.default.floor(colIndex * viewCellWidth);
          }
        }
        return (0, _vue.nextTick)();
      },
      scrollToTaskView(rowOrRowid) {
        const $xeTable = refTable.value;
        if ($xeTable) {
          const rowid = _xeUtils.default.isString(rowOrRowid) || _xeUtils.default.isNumber(rowOrRowid) ? rowOrRowid : $xeTable.getRowid(rowOrRowid);
          return $xeTable.scrollToRow(rowOrRowid).then(() => {
            const $ganttView = refGanttView.value;
            if ($ganttView) {
              const ganttViewReactData = $ganttView.reactData;
              const ganttViewInternalData = $ganttView.internalData;
              const {
                viewCellWidth
              } = ganttViewReactData;
              const {
                chartMaps,
                elemStore
              } = ganttViewInternalData;
              const chartRest = rowid ? chartMaps[rowid] : null;
              if (chartRest) {
                const bodyScrollElem = (0, _util.getRefElem)(elemStore['main-body-scroll']);
                if (bodyScrollElem) {
                  bodyScrollElem.scrollLeft = _xeUtils.default.floor(chartRest.oLeftSize * viewCellWidth);
                }
              }
            }
          });
        }
        return (0, _vue.nextTick)();
      },
      getCriticalPath() {
        const {
          criticalRowIds,
          criticalLinks
        } = reactData;
        const {
          criticalRowMaps
        } = internalData;
        return {
          rowIds: criticalRowIds.slice(0),
          rows: Array.from(criticalRowMaps.values()),
          links: criticalLinks.slice(0)
        };
      }
    };
    const ganttPrivateMethods = {
      extendTableMethods,
      callSlot(slotFunc, params) {
        if (slotFunc) {
          if (_xeUtils.default.isString(slotFunc)) {
            slotFunc = slots[slotFunc] || null;
          }
          if (_xeUtils.default.isFunction(slotFunc)) {
            return (0, _vn.getSlotVNs)(slotFunc(params));
          }
        }
        return [];
      },
      /**
       * 获取需要排除的高度
       */
      getExcludeHeight() {
        const {
          height
        } = props;
        const {
          isZMax
        } = reactData;
        const el = refElem.value;
        if (el) {
          const formWrapper = refFormWrapper.value;
          const toolbarWrapper = refToolbarWrapper.value;
          const topWrapper = refTopWrapper.value;
          const bottomWrapper = refBottomWrapper.value;
          const pagerWrapper = refPagerWrapper.value;
          const parentEl = el.parentElement;
          let parentPaddingSize = 0;
          if (parentEl && (height === '100%' || height === 'auto')) {
            parentPaddingSize = isZMax ? 0 : (0, _dom.getPaddingTopBottomSize)(parentEl);
          }
          return parentPaddingSize + (0, _dom.getPaddingTopBottomSize)(el) + (0, _dom.getOffsetHeight)(formWrapper) + (0, _dom.getOffsetHeight)(toolbarWrapper) + (0, _dom.getOffsetHeight)(topWrapper) + (0, _dom.getOffsetHeight)(bottomWrapper) + (0, _dom.getOffsetHeight)(pagerWrapper);
        }
        return 0;
      },
      getParentElem() {
        const el = refElem.value;
        if (!el) {
          return null;
        }
        let parentEl = el.parentElement;
        // 如果是虚拟滚动条
        if (parentEl && (0, _dom.hasClass)(parentEl, 'vxe-scrollbar--view-inner')) {
          parentEl = parentEl.parentElement;
        }
        return parentEl;
      },
      getParentHeight() {
        const el = refElem.value;
        if (el) {
          const parentEl = $xeGantt.getParentElem();
          return (reactData.isZMax ? (0, _dom.getDomNode)().visibleHeight : parentEl ? _xeUtils.default.toNumber(getComputedStyle(parentEl).height) : 0) - ganttPrivateMethods.getExcludeHeight();
        }
        return 0;
      },
      triggerToolbarCommitEvent(params, evnt) {
        const {
          code
        } = params;
        if (code) {
          const isUf = ['reload', 'delete', 'save'].includes(code);
          if (isUf) {
            internalData.uFoot = true;
          }
          const rest = $xeGantt.commitProxy(params, evnt).then(rest => {
            if (rest && rest.status && ['query', 'reload', 'delete', 'save'].includes(code)) {
              $xeGantt.dispatchEvent(code === 'delete' || code === 'save' ? `proxy-${code}` : 'proxy-query', Object.assign(Object.assign({}, rest), {
                isReload: code === 'reload'
              }), evnt);
            }
          });
          internalData.uFoot = false;
          if (isUf) {
            updateQueryFooter();
          }
          return rest;
        }
        return (0, _vue.nextTick)();
      },
      triggerToolbarBtnEvent(button, evnt) {
        $xeGantt.triggerToolbarCommitEvent(button, evnt);
        $xeGantt.dispatchEvent('toolbar-button-click', {
          code: button.code,
          button
        }, evnt);
      },
      triggerToolbarTolEvent(tool, evnt) {
        $xeGantt.triggerToolbarCommitEvent(tool, evnt);
        $xeGantt.dispatchEvent('toolbar-tool-click', {
          code: tool.code,
          tool
        }, evnt);
      },
      triggerZoomEvent(evnt) {
        $xeGantt.zoom();
        $xeGantt.dispatchEvent('zoom', {
          type: reactData.isZMax ? 'max' : 'revert'
        }, evnt);
      },
      handleTaskCellClickEvent(evnt, params) {
        const $xeTable = refTable.value;
        if ($xeTable) {
          const tableProps = $xeTable.props;
          const {
            highlightCurrentRow
          } = tableProps;
          const tableReactData = $xeTable.reactData;
          const {
            radioColumn,
            checkboxColumn
          } = tableReactData;
          const {
            computeRadioOpts,
            computeCheckboxOpts,
            computeRowOpts
          } = $xeTable.getComputeMaps();
          const radioOpts = computeRadioOpts.value;
          const checkboxOpts = computeCheckboxOpts.value;
          const rowOpts = computeRowOpts.value;
          const {
            row
          } = params;
          // 如果是当前行
          if (rowOpts.isCurrent || highlightCurrentRow) {
            $xeTable.triggerCurrentRowEvent(evnt, Object.assign({
              $table: $xeTable,
              rowIndex: $xeTable.getRowIndex(row),
              $rowIndex: $xeTable.getVMRowIndex(row)
            }, params));
          }
          // 如果是单选框
          if (radioColumn && radioOpts.trigger === 'row') {
            $xeTable.triggerRadioRowEvent(evnt, params);
          }
          // 如果是复选框
          if (checkboxColumn && checkboxOpts.trigger === 'row') {
            $xeTable.handleToggleCheckRowEvent(evnt, params);
          }
        }
        reactData.isActiveCeLe = false;
        reactData.activeBarRowid = null;
        reactData.activeLink = null;
        $xeGantt.dispatchEvent('task-cell-click', params, evnt);
      },
      handleTaskCellDblclickEvent(evnt, params) {
        $xeGantt.dispatchEvent('task-cell-dblclick', params, evnt);
      },
      handleTaskBarClickEvent(evnt, params) {
        const $xeTable = refTable.value;
        const taskBarOpts = computeTaskBarOpts.value;
        const {
          linkCreatable
        } = taskBarOpts;
        const {
          row
        } = params;
        reactData.isActiveCeLe = !!linkCreatable;
        reactData.activeBarRowid = $xeTable ? $xeTable.getRowid(row) : row;
        reactData.activeLink = null;
        $xeGantt.dispatchEvent('task-bar-click', params, evnt);
      },
      handleTaskBarDblclickEvent(evnt, params) {
        $xeGantt.dispatchEvent('task-bar-dblclick', params, evnt);
      },
      triggerTaskBarTooltipEvent(evnt, params) {
        const {
          barTipStore,
          activeLink
        } = reactData;
        const {
          dragBarRow,
          dragLineRow
        } = internalData;
        if (dragBarRow || dragLineRow) {
          return;
        }
        if (activeLink) {
          return;
        }
        const taskBarTooltipOpts = computeTaskBarTooltipOpts.value;
        const titleField = computeTitleField.value;
        const {
          contentMethod
        } = taskBarTooltipOpts;
        const {
          row
        } = params;
        let content = (0, _utils.formatText)(_xeUtils.default.get(row, titleField));
        if (contentMethod) {
          const customContnet = contentMethod(params);
          if (!_xeUtils.default.eqNull(customContnet)) {
            content = `${customContnet}`;
          }
        }
        handleTargetEnterEvent(barTipStore.row !== row);
        const tipContent = (0, _utils.formatText)(content);
        Object.assign(barTipStore, {
          row,
          visible: true,
          content: tipContent,
          params
        });
        (0, _vue.nextTick)(() => {
          const $tooltip = refTooltip.value;
          if ($tooltip) {
            if ($tooltip.openByEvent) {
              $tooltip.openByEvent(evnt, evnt.currentTarget, tipContent);
            } else if ($tooltip.open) {
              $tooltip.open(evnt.currentTarget, tipContent);
            }
          }
        });
      },
      handleTaskBarTooltipLeaveEvent() {
        const taskBarTooltipOpts = computeTaskBarTooltipOpts.value;
        let $tooltip = refTooltip.value;
        if ($tooltip && $tooltip.setActived) {
          $tooltip.setActived(false);
        }
        if (taskBarTooltipOpts.enterable) {
          internalData.barTipTimeout = setTimeout(() => {
            $tooltip = refTooltip.value;
            if ($tooltip && $tooltip.isActived && !$tooltip.isActived()) {
              $xeGantt.closeTaskBarTooltip();
            }
          }, taskBarTooltipOpts.leaveDelay);
        } else {
          $xeGantt.closeTaskBarTooltip();
        }
      },
      handleTaskHeaderContextmenuEvent(evnt, params) {
        const $xeTable = refTable.value;
        if ($xeTable) {
          const tableProps = $xeTable.props;
          const {
            menuConfig
          } = tableProps;
          if ((0, _utils.isEnableConf)(menuConfig)) {
            evnt.stopPropagation();
            $xeTable.handleOpenMenuEvent(evnt, 'header', params);
            $xeTable.dispatchEvent('header-cell-menu', params, evnt);
          }
        }
      },
      handleTaskBodyContextmenuEvent(evnt, params) {
        const $xeTable = refTable.value;
        if ($xeTable) {
          const tableProps = $xeTable.props;
          const {
            menuConfig
          } = tableProps;
          if ((0, _utils.isEnableConf)(menuConfig)) {
            evnt.stopPropagation();
            $xeTable.handleOpenMenuEvent(evnt, 'body', params);
            $xeTable.dispatchEvent('cell-menu', params, evnt);
          }
        }
      },
      handleTaskFooterContextmenuEvent(evnt, params) {
        const $xeTable = refTable.value;
        if ($xeTable) {
          const tableProps = $xeTable.props;
          const {
            menuConfig
          } = tableProps;
          if ((0, _utils.isEnableConf)(menuConfig)) {
            evnt.stopPropagation();
            $xeTable.handleOpenMenuEvent(evnt, 'footer', params);
            $xeTable.dispatchEvent('footer-cell-menu', params, evnt);
          }
        }
      },
      handleTaskBarContextmenuEvent(evnt, params) {
        const $xeTable = refTable.value;
        if ($xeTable) {
          const tableProps = $xeTable.props;
          const {
            menuConfig
          } = tableProps;
          if ((0, _utils.isEnableConf)(menuConfig)) {
            evnt.stopPropagation();
            $xeTable.handleOpenMenuEvent(evnt, 'body', params);
            $xeTable.dispatchEvent('cell-menu', params, evnt);
          }
        }
      }
    };
    Object.assign($xeGantt, ganttExtendTableMethods, ganttMethods, ganttPrivateMethods, {
      loadColumn(columns) {
        const $xeTable = refTable.value;
        // 检查插槽
        _xeUtils.default.eachTree(columns, column => {
          const {
            type
          } = column;
          if (column.slots) {
            _xeUtils.default.each(column.slots, func => {
              if (!_xeUtils.default.isFunction(func)) {
                if (!slots[func]) {
                  errLog('vxe.error.notSlot', [func]);
                }
              }
            });
          }
          if (type === 'expand') {
            errLog('vxe.error.errProp', ['type=expand', 'type=seq,radio,checkbox,html']);
          }
        });
        reactData.currLeftSpacing = 0;
        reactData.currRightSpacing = 0;
        if ($xeTable) {
          return $xeTable.loadColumn(columns);
        }
        return (0, _vue.nextTick)();
      },
      reloadColumn(columns) {
        $xeGantt.clearAll();
        return $xeGantt.loadColumn(columns);
      }
    });
    /**
     * 渲染表单
     */
    const renderForm = () => {
      const {
        formConfig,
        proxyConfig
      } = props;
      const {
        formData
      } = reactData;
      const proxyOpts = computeProxyOpts.value;
      const formOpts = computeFormOpts.value;
      if (formConfig && (0, _utils.isEnableConf)(formOpts) || slots.form) {
        let slotVNs = [];
        if (slots.form) {
          slotVNs = slots.form({
            $grid: null,
            $gantt: $xeGantt
          });
        } else {
          if (formOpts.items) {
            const formSlots = {};
            if (!formOpts.inited) {
              formOpts.inited = true;
              const beforeItem = proxyOpts.beforeItem;
              if (proxyOpts && beforeItem) {
                formOpts.items.forEach(item => {
                  beforeItem({
                    $grid: null,
                    $gantt: $xeGantt,
                    item
                  });
                });
              }
            }
            // 处理插槽
            formOpts.items.forEach(item => {
              _xeUtils.default.each(item.slots, func => {
                if (func && !_xeUtils.default.isFunction(func)) {
                  if (slots[func]) {
                    formSlots[func] = slots[func];
                  }
                }
              });
            });
            if (VxeUIFormComponent) {
              slotVNs.push((0, _vue.h)(VxeUIFormComponent, Object.assign(Object.assign({
                ref: refForm
              }, Object.assign({}, formOpts, {
                data: proxyConfig && (0, _utils.isEnableConf)(proxyOpts) && proxyOpts.form ? formData : formOpts.data
              })), {
                onSubmit: submitFormEvent,
                onReset: resetFormEvent,
                onSubmitInvalid: submitInvalidEvent,
                onCollapse: collapseEvent
              }), formSlots));
            }
          }
        }
        return (0, _vue.h)('div', {
          ref: refFormWrapper,
          key: 'form',
          class: 'vxe-gantt--form-wrapper'
        }, slotVNs);
      }
      return renderEmptyElement($xeGantt);
    };
    /**
     * 渲染工具栏
     */
    const renderToolbar = () => {
      const {
        toolbarConfig
      } = props;
      const toolbarOpts = computeToolbarOpts.value;
      const toolbarSlot = slots.toolbar;
      if (toolbarConfig && (0, _utils.isEnableConf)(toolbarOpts) || toolbarSlot) {
        let slotVNs = [];
        if (slots.toolbar) {
          slotVNs = slots.toolbar({
            $grid: null,
            $gantt: $xeGantt
          });
        } else {
          const toolbarOptSlots = toolbarOpts.slots;
          const toolbarSlots = {};
          if (toolbarOptSlots) {
            const buttonsSlot = getFuncSlot(toolbarOptSlots, 'buttons');
            const buttonPrefixSlot = getFuncSlot(toolbarOptSlots, 'buttonPrefix');
            const buttonSuffixSlot = getFuncSlot(toolbarOptSlots, 'buttonSuffix');
            const toolsSlot = getFuncSlot(toolbarOptSlots, 'tools');
            const toolPrefixSlot = getFuncSlot(toolbarOptSlots, 'toolPrefix');
            const toolSuffixSlot = getFuncSlot(toolbarOptSlots, 'toolSuffix');
            if (buttonsSlot) {
              toolbarSlots.buttons = buttonsSlot;
            }
            if (buttonPrefixSlot) {
              toolbarSlots.buttonPrefix = buttonPrefixSlot;
            }
            if (buttonSuffixSlot) {
              toolbarSlots.buttonSuffix = buttonSuffixSlot;
            }
            if (toolsSlot) {
              toolbarSlots.tools = toolsSlot;
            }
            if (toolPrefixSlot) {
              toolbarSlots.toolPrefix = toolPrefixSlot;
            }
            if (toolSuffixSlot) {
              toolbarSlots.toolSuffix = toolSuffixSlot;
            }
          }
          slotVNs.push((0, _vue.h)(VxeToolbarComponent, Object.assign(Object.assign({
            ref: refToolbar
          }, toolbarOpts), {
            slots: undefined
          }), toolbarSlots));
        }
        return (0, _vue.h)('div', {
          ref: refToolbarWrapper,
          key: 'toolbar',
          class: 'vxe-gantt--toolbar-wrapper'
        }, slotVNs);
      }
      return renderEmptyElement($xeGantt);
    };
    /**
     * 渲染表格顶部区域
     */
    const renderTop = () => {
      const topSlot = slots.top;
      if (topSlot) {
        return (0, _vue.h)('div', {
          ref: refTopWrapper,
          key: 'top',
          class: 'vxe-gantt--top-wrapper'
        }, topSlot({
          $grid: null,
          $gantt: $xeGantt
        }));
      }
      return renderEmptyElement($xeGantt);
    };
    const renderTableLeft = () => {
      const leftSlot = slots.left;
      if (leftSlot) {
        return (0, _vue.h)('div', {
          class: 'vxe-gantt--left-wrapper'
        }, leftSlot({
          $grid: null,
          $gantt: $xeGantt
        }));
      }
      return renderEmptyElement($xeGantt);
    };
    const renderTableRight = () => {
      const rightSlot = slots.right;
      if (rightSlot) {
        return (0, _vue.h)('div', {
          class: 'vxe-gantt--right-wrapper'
        }, rightSlot({
          $grid: null,
          $gantt: $xeGantt
        }));
      }
      return renderEmptyElement($xeGantt);
    };
    /**
     * 渲染表格
     */
    const renderTable = () => {
      const {
        proxyConfig
      } = props;
      const tableProps = computeTableProps.value;
      const proxyOpts = computeProxyOpts.value;
      const tableOns = Object.assign({}, tableCompEvents);
      const emptySlot = slots.empty;
      const loadingSlot = slots.loading;
      const rowDragIconSlot = slots.rowDragIcon || slots['row-drag-icon'];
      const columnDragIconSlot = slots.columnDragIcon || slots['column-drag-icon'];
      const headerTooltipSlot = slots.headerTooltip || slots['header-tooltip'];
      const tooltipSlot = slots.tooltip;
      const footerTooltipSlot = slots.footerTooltip || slots['footer-tooltip'];
      if (proxyConfig && (0, _utils.isEnableConf)(proxyOpts)) {
        if (proxyOpts.sort) {
          tableOns.onSortChange = sortChangeEvent;
          tableOns.onClearAllSort = clearAllSortEvent;
        }
        if (proxyOpts.filter) {
          tableOns.onFilterChange = filterChangeEvent;
          tableOns.onClearAllFilter = clearAllFilterEvent;
        }
      }
      const slotObj = {};
      if (emptySlot) {
        slotObj.empty = emptySlot;
      }
      if (loadingSlot) {
        slotObj.loading = loadingSlot;
      }
      if (rowDragIconSlot) {
        slotObj.rowDragIcon = rowDragIconSlot;
      }
      if (columnDragIconSlot) {
        slotObj.columnDragIcon = columnDragIconSlot;
      }
      if (headerTooltipSlot) {
        slotObj.headerTooltip = headerTooltipSlot;
      }
      if (tooltipSlot) {
        slotObj.tooltip = tooltipSlot;
      }
      if (footerTooltipSlot) {
        slotObj.footerTooltip = footerTooltipSlot;
      }
      return (0, _vue.h)('div', {
        ref: refTableWrapper,
        class: 'vxe-gantt--table-wrapper'
      }, [(0, _vue.h)(VxeTableComponent, Object.assign(Object.assign({
        ref: refTable
      }, tableProps), tableOns), slotObj)]);
    };
    /**
     * 渲染表格底部区域
     */
    const renderBottom = () => {
      if (slots.bottom) {
        return (0, _vue.h)('div', {
          ref: refBottomWrapper,
          key: 'bottom',
          class: 'vxe-gantt--bottom-wrapper'
        }, slots.bottom({
          $grid: null,
          $gantt: $xeGantt
        }));
      }
      return renderEmptyElement($xeGantt);
    };
    /**
     * 渲染分页
     */
    const renderPager = () => {
      const {
        proxyConfig,
        pagerConfig
      } = props;
      const proxyOpts = computeProxyOpts.value;
      const pagerOpts = computePagerOpts.value;
      const pagerSlot = slots.pager;
      if (pagerConfig && (0, _utils.isEnableConf)(pagerOpts) || slots.pager) {
        return (0, _vue.h)('div', {
          ref: refPagerWrapper,
          key: 'pager',
          class: 'vxe-gantt--pager-wrapper'
        }, pagerSlot ? pagerSlot({
          $grid: null,
          $gantt: $xeGantt
        }) : [VxeUIPagerComponent ? (0, _vue.h)(VxeUIPagerComponent, Object.assign(Object.assign(Object.assign({
          ref: refPager
        }, pagerOpts), proxyConfig && (0, _utils.isEnableConf)(proxyOpts) ? reactData.tablePage : {}), {
          onPageChange: pageChangeEvent
        }), getConfigSlot(pagerOpts.slots)) : renderEmptyElement($xeGantt)]);
      }
      return renderEmptyElement($xeGantt);
    };
    /**
     * 渲染任务视图
     */
    const renderTaskView = () => {
      return (0, _vue.h)('div', {
        ref: refGanttWrapper,
        class: 'vxe-gantt--view-wrapper'
      }, [(0, _vue.h)(_ganttView.default, {
        ref: refGanttView
      })]);
    };
    const renderSplitBar = () => {
      const {
        showLeftView,
        showRightView
      } = reactData;
      const taskSplitOpts = computeTaskSplitOpts.value;
      const {
        enabled,
        resize,
        showCollapseTableButton,
        showCollapseTaskButton
      } = taskSplitOpts;
      if (!enabled) {
        return renderEmptyElement($xeGantt);
      }
      const isResize = resize && showLeftView && showRightView;
      const ons = {};
      if (isResize) {
        ons.onMousedown = dragSplitEvent;
      }
      return (0, _vue.h)('div', {
        class: ['vxe-gantt--view-split-bar', {
          'is--resize': isResize
        }]
      }, [(0, _vue.h)('div', Object.assign({
        class: 'vxe-gantt--view-split-bar-handle'
      }, ons)), showCollapseTableButton || showCollapseTaskButton ? (0, _vue.h)('div', {
        class: 'vxe-gantt--view-split-bar-btn-wrapper'
      }, [showCollapseTableButton && showRightView ? (0, _vue.h)('div', {
        class: ['vxe-gantt--view-split-bar-action-btn', showLeftView ? 'is--prev' : 'is--next'],
        onClick: handleSplitLeftViewEvent
      }, [(0, _vue.h)('i', {
        class: showLeftView ? getIcon().GANTT_VIEW_LEFT_OPEN : getIcon().GANTT_VIEW_LEFT_CLOSE
      })]) : renderEmptyElement($xeGantt), showCollapseTaskButton && showLeftView ? (0, _vue.h)('div', {
        class: ['vxe-gantt--view-split-bar-action-btn', showRightView ? 'is--next' : 'is--prev'],
        onClick: handleSplitRightViewEvent
      }, [(0, _vue.h)('i', {
        class: showRightView ? getIcon().GANTT_VIEW_RIGHT_OPEN : getIcon().GANTT_VIEW_RIGHT_CLOSE
      })]) : renderEmptyElement($xeGantt)]) : renderEmptyElement($xeGantt)]);
    };
    const renderChildLayout = layoutKeys => {
      const {
        showLeftView,
        showRightView
      } = reactData;
      const taskSplitOpts = computeTaskSplitOpts.value;
      const scrollbarXToTop = computeScrollbarXToTop.value;
      const scrollbarYToLeft = computeScrollbarYToLeft.value;
      const {
        autoHideCollapseButton
      } = taskSplitOpts;
      const childVNs = [];
      layoutKeys.forEach(key => {
        switch (key) {
          case 'Form':
            childVNs.push(renderForm());
            break;
          case 'Toolbar':
            childVNs.push(renderToolbar());
            break;
          case 'Top':
            childVNs.push(renderTop());
            break;
          case 'Gantt':
            childVNs.push((0, _vue.h)('div', {
              ref: refGanttContainerElem,
              key: 'tv',
              class: ['vxe-gantt--gantt-container', `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
                'show--left': showLeftView,
                'hide--left': !showLeftView,
                'show--right': showRightView,
                'hide--right': !showRightView,
                'is--ah-split-btn': autoHideCollapseButton
              }]
            }, [renderTableLeft(), renderTable(), renderSplitBar(), renderTaskView(), renderTableRight(), (0, _vue.h)('div', {
              ref: refClassifyWrapperElem
            }), (0, _vue.h)('div', {
              ref: refResizableSplitTip,
              class: 'vxe-gantt--resizable-split-tip'
            }, [(0, _vue.h)('div', {
              class: 'vxe-gantt--resizable-split-tip-number'
            }, [(0, _vue.h)('div', {
              class: 'vxe-gantt--resizable-split-number-left'
            }), (0, _vue.h)('div', {
              class: 'vxe-gantt--resizable-split-number-right'
            })])]), (0, _vue.h)('div', {
              class: 'vxe-gantt--border-line'
            })]));
            break;
          case 'Bottom':
            childVNs.push(renderBottom());
            break;
          case 'Pager':
            childVNs.push(renderPager());
            break;
          default:
            errLog('vxe.error.notProp', [`layouts -> ${key}`]);
            break;
        }
      });
      return childVNs;
    };
    const renderLayout = () => {
      const {
        barTipStore
      } = reactData;
      const currLayoutConf = computeCurrLayoutConf.value;
      const {
        headKeys,
        bodyKeys,
        footKeys
      } = currLayoutConf;
      const taskBarTooltipOpts = computeTaskBarTooltipOpts.value;
      const asideLeftSlot = slots.asideLeft || slots['aside-left'];
      const asideRightSlot = slots.asideRight || slots['aside-right'];
      const taskBarTooltipSlot = slots.taskBarTooltip || slots['task-bar-tooltip'];
      return [(0, _vue.h)('div', {
        class: 'vxe-gantt--layout-header-wrapper'
      }, renderChildLayout(headKeys)), (0, _vue.h)('div', {
        class: 'vxe-gantt--layout-body-wrapper'
      }, [asideLeftSlot ? (0, _vue.h)('div', {
        class: 'vxe-gantt--layout-aside-left-wrapper'
      }, asideLeftSlot({})) : renderEmptyElement($xeGantt), (0, _vue.h)('div', {
        class: 'vxe-gantt--layout-body-content-wrapper'
      }, renderChildLayout(bodyKeys)), asideRightSlot ? (0, _vue.h)('div', {
        class: 'vxe-gantt--layout-aside-right-wrapper'
      }, asideRightSlot({})) : renderEmptyElement($xeGantt)]), (0, _vue.h)('div', {
        class: 'vxe-gantt--layout-footer-wrapper'
      }, renderChildLayout(footKeys)), (0, _vue.h)('div', {
        ref: refPopupContainerElem
      }), (0, _vue.h)('div', {}, [
      /**
        * 任务条提示
        */
      (0, _vue.h)(VxeUITooltipComponent, {
        key: 'gtp',
        ref: refTooltip,
        theme: taskBarTooltipOpts.theme,
        enterable: taskBarTooltipOpts.enterable,
        enterDelay: taskBarTooltipOpts.enterDelay,
        leaveDelay: taskBarTooltipOpts.leaveDelay,
        useHtml: _xeUtils.default.isBoolean(taskBarTooltipOpts.useHtml) ? taskBarTooltipOpts.useHtml : taskBarTooltipOpts.useHTML,
        width: taskBarTooltipOpts.width,
        height: taskBarTooltipOpts.height,
        minWidth: taskBarTooltipOpts.minWidth,
        minHeight: taskBarTooltipOpts.minHeight,
        maxWidth: taskBarTooltipOpts.maxWidth,
        maxHeight: taskBarTooltipOpts.maxHeight,
        isArrow: false
      }, taskBarTooltipSlot ? {
        content: () => {
          const {
            row,
            content: tooltipContent
          } = barTipStore;
          if (row) {
            return (0, _vue.h)('div', {}, taskBarTooltipSlot(Object.assign({
              tooltipContent,
              $gantt: $xeGantt
            }, barTipStore.params)));
          }
          return renderEmptyElement($xeGantt);
        }
      } : {})])];
    };
    const renderVN = () => {
      const {
        showLeftView,
        showRightView,
        overflowY,
        overflowX,
        showSplitAnimat
      } = reactData;
      const vSize = computeSize.value;
      const wrapperStyle = computeWrapperStyle.value;
      const isLoading = computeIsLoading.value;
      const taskSplitOpts = computeTaskSplitOpts.value;
      const tableBorder = computeTableBorder.value;
      const scrollbarXToTop = computeScrollbarXToTop.value;
      const scrollbarYToLeft = computeScrollbarYToLeft.value;
      return (0, _vue.h)('div', {
        ref: refElem,
        class: ['vxe-gantt', `border--${tableBorder}`, `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
          [`size--${vSize}`]: vSize,
          'is--round': props.round,
          'show--animat': taskSplitOpts.animation,
          'is--maximize': reactData.isZMax,
          'is--loading': isLoading,
          'is--animat': showSplitAnimat,
          'show--left': showLeftView,
          'hide--left': !showLeftView,
          'show--right': showRightView,
          'hide--right': !showRightView,
          'is--scroll-y': overflowY,
          'is--scroll-x': overflowX
        }],
        style: wrapperStyle
      }, renderLayout());
    };
    const columnFlag = (0, _vue.ref)(0);
    (0, _vue.watch)(() => props.columns ? props.columns.length : -1, () => {
      columnFlag.value++;
    });
    (0, _vue.watch)(() => props.columns, () => {
      columnFlag.value++;
    });
    (0, _vue.watch)(columnFlag, () => {
      (0, _vue.nextTick)(() => $xeGantt.loadColumn(props.columns || []));
    });
    (0, _vue.watch)(() => props.toolbarConfig, () => {
      initToolbar();
    });
    (0, _vue.watch)(computeCustomCurrentPageFlag, () => {
      initPages('currentPage');
    });
    (0, _vue.watch)(computeCustomPageSizeFlag, () => {
      initPages('pageSize');
    });
    (0, _vue.watch)(computeCustomTotalFlag, () => {
      initPages('total');
    });
    (0, _vue.watch)(() => props.proxyConfig, () => {
      initProxy();
    });
    const reViewFlag = (0, _vue.ref)(0);
    (0, _vue.watch)(computeTaskViewScales, () => {
      handleTaskScaleConfig();
      reViewFlag.value++;
    });
    (0, _vue.watch)(computeCriticalPathVisible, () => {
      reViewFlag.value++;
    });
    (0, _vue.watch)(reViewFlag, () => {
      $xeGantt.refreshTaskView();
    });
    (0, _vue.watch)(computeTaskLinkStyle, () => {
      if ($xeGantt.handleUpTaskLinkData) {
        $xeGantt.handleUpTaskLinkData();
      }
    });
    hooks.forEach(options => {
      const {
        setupGantt
      } = options;
      if (setupGantt) {
        const hookRest = setupGantt($xeGantt);
        if (hookRest && _xeUtils.default.isObject(hookRest)) {
          Object.assign($xeGantt, hookRest);
        }
      }
    });
    if ($xeGantt.handleTaskLoadLinks) {
      if (props.links) {
        $xeGantt.handleTaskLoadLinks(props.links);
      }
    }
    handleTaskScaleConfig();
    initPages();
    (0, _vue.onMounted)(() => {
      const taskBarSubviewOpts = computeTaskBarSubviewOpts.value;
      const {
        barStyle
      } = taskBarSubviewOpts;
      if (barStyle) {
        if (barStyle.top) {
          warnLog('vxe.error.delProp', ['task-bar-subview-config.barStyle.top', 'task-bar-subview-config.barStyle.style.top']);
        }
        if (barStyle.backgroundColor) {
          warnLog('vxe.error.delProp', ['task-bar-subview-config.barStyle.backgroundColor', 'task-bar-subview-config.barStyle.style.backgroundColor']);
        }
      }
      if (!$xeGantt.handleUpTaskLinkData) {
        if (props.links) {
          warnLog('vxe.error.notProp', ['links']);
        }
        if (props.taskLinkConfig) {
          warnLog('vxe.error.notProp', ['task-link-config']);
        }
      }
      (0, _vue.nextTick)(() => {
        const {
          columns
        } = props;
        const proxyOpts = computeProxyOpts.value;
        if (props.formConfig) {
          if (!VxeUIFormComponent) {
            errLog('vxe.error.reqComp', ['vxe-form']);
          }
        }
        if (props.pagerConfig) {
          if (!VxeUIPagerComponent) {
            errLog('vxe.error.reqComp', ['vxe-pager']);
          }
        }
        if (props.treeConfig && props.links) {
          const $xeTable = refTable.value;
          if ($xeTable) {
            const {
              computeTreeOpts
            } = $xeTable.getComputeMaps();
            const treeOpts = computeTreeOpts.value;
            if (!treeOpts.transform) {
              errLog('vxe.error.notSupportProp', ['links', 'tree-config.transform=false', 'tree-config.transform=true']);
            }
          }
        }
        // const { data, columns, proxyConfig } = props
        // const formOpts = computeFormOpts.value
        // if (isEnableConf(proxyConfig) && (data || (proxyOpts.form && formOpts.data))) {
        //   errLog('vxe.error.errConflicts', ['grid.data', 'grid.proxy-config'])
        // }
        if (proxyOpts.props) {
          warnLog('vxe.error.delProp', ['proxy-config.props', 'proxy-config.response']);
        }
        if (props.expandConfig) {
          warnLog('vxe.error.notProp', ['expand-config']);
        }
        if (columns && columns.length) {
          $xeGantt.loadColumn(columns);
        }
        initToolbar();
        initProxy();
      });
      initGanttView();
      globalEvents.on($xeGantt, 'keydown', handleGlobalKeydownEvent);
    });
    (0, _vue.onBeforeUnmount)(() => {
      _xeUtils.default.assign(reactData, createReactData());
      _xeUtils.default.assign(internalData, createInternalData());
    });
    (0, _vue.onUnmounted)(() => {
      globalEvents.off($xeGantt, 'keydown');
    });
    $xeGantt.renderVN = renderVN;
    (0, _vue.provide)('$xeGrid', null);
    (0, _vue.provide)('$xeGantt', $xeGantt);
    return $xeGantt;
  },
  render() {
    return this.renderVN();
  }
});