Commit 6753e24b3d3d4b2f3d8ce85541a1d624d9bf0fb1

Authored by lzdjack
Committed by GitHub
1 parent b90d3572

feat: 接入vextable组件 (#2508)

Showing 51 changed files with 2676 additions and 14 deletions
build/vite/plugin/styleImport.ts
... ... @@ -2,7 +2,7 @@
2 2 * Introduces component library styles on demand.
3 3 * https://github.com/anncwb/vite-plugin-style-import
4 4 */
5   -import { createStyleImportPlugin } from 'vite-plugin-style-import';
  5 +import { createStyleImportPlugin, VxeTableResolve } from 'vite-plugin-style-import';
6 6  
7 7 export function configStyleImportPlugin(_isBuild: boolean) {
8 8 if (!_isBuild) {
... ... @@ -77,6 +77,7 @@ export function configStyleImportPlugin(_isBuild: boolean) {
77 77 },
78 78 },
79 79 ],
  80 + resolves: [VxeTableResolve()],
80 81 });
81 82 return styleImportPlugin;
82 83 }
... ...
package.json
... ... @@ -50,6 +50,7 @@
50 50 "crypto-js": "^4.1.1",
51 51 "dayjs": "^1.11.1",
52 52 "echarts": "^5.3.2",
  53 + "exceljs": "^4.3.0",
53 54 "intro.js": "^5.1.0",
54 55 "lodash-es": "^4.17.21",
55 56 "mockjs": "^1.1.0",
... ... @@ -69,6 +70,9 @@
69 70 "vue-json-pretty": "^2.0.6",
70 71 "vue-router": "^4.0.14",
71 72 "vue-types": "^4.1.1",
  73 + "vxe-table": "^4.3.9",
  74 + "vxe-table-plugin-export-xlsx": "^3.0.4",
  75 + "xe-utils": "^3.5.7",
72 76 "xlsx": "^0.18.5"
73 77 },
74 78 "devDependencies": {
... ... @@ -121,6 +125,7 @@
121 125 "rimraf": "^3.0.2",
122 126 "rollup": "^2.70.2",
123 127 "rollup-plugin-visualizer": "^5.6.0",
  128 + "sass": "^1.57.1",
124 129 "stylelint": "^14.7.1",
125 130 "stylelint-config-prettier": "^9.0.3",
126 131 "stylelint-config-recommended": "^7.0.0",
... ...
src/components/VxeTable/index.ts 0 → 100644
  1 +import { withInstall } from '/@/utils';
  2 +import vxeBasicTable from './src/VxeBasicTable';
  3 +import { VXETable } from 'vxe-table';
  4 +import VXETablePluginAntd from './src/components';
  5 +import VXETablePluginExportXLSX from 'vxe-table-plugin-export-xlsx';
  6 +import './src/setting';
  7 +
  8 +export const VxeBasicTable = withInstall(vxeBasicTable);
  9 +export * from 'vxe-table';
  10 +export * from './src/types';
  11 +
  12 +VXETable.use(VXETablePluginAntd).use(VXETablePluginExportXLSX);
... ...
src/components/VxeTable/src/VxeBasicTable.tsx 0 → 100644
  1 +import { defineComponent } from 'vue';
  2 +import { computed, ref } from 'vue';
  3 +import { BasicTableProps } from './types';
  4 +import { omit } from 'lodash';
  5 +import { basicProps } from './props';
  6 +import { ignorePropKeys } from './const';
  7 +import { basicEmits } from './emits';
  8 +import XEUtils from 'xe-utils';
  9 +import type { VxeGridInstance, VxeGridEventProps, GridMethods, TableMethods } from 'vxe-table';
  10 +import { Grid as VxeGrid } from 'vxe-table';
  11 +
  12 +import { extendSlots } from '/@/utils/helper/tsxHelper';
  13 +import { gridComponentMethodKeys } from './methods';
  14 +
  15 +export default defineComponent({
  16 + name: 'VxeBasicTable',
  17 + props: basicProps,
  18 + emits: basicEmits,
  19 + setup(props, { emit, attrs }) {
  20 + const tableElRef = ref<VxeGridInstance>();
  21 + const emitEvents: VxeGridEventProps = {};
  22 +
  23 + const extendTableMethods = (methodKeys) => {
  24 + const funcs: any = {};
  25 + methodKeys.forEach((name) => {
  26 + funcs[name] = (...args: any[]) => {
  27 + const $vxegrid: any = tableElRef.value;
  28 + if ($vxegrid && $vxegrid[name]) {
  29 + return $vxegrid[name](...args);
  30 + }
  31 + };
  32 + });
  33 +
  34 + return funcs;
  35 + };
  36 +
  37 + const gridExtendTableMethods = extendTableMethods(gridComponentMethodKeys) as GridMethods &
  38 + TableMethods;
  39 +
  40 + basicEmits.forEach((name) => {
  41 + const type = XEUtils.camelCase(`on-${name}`) as keyof VxeGridEventProps;
  42 +
  43 + emitEvents[type] = (...args: any[]) => emit(name, ...args);
  44 + });
  45 +
  46 + /**
  47 + * @description: 二次封装需要的所有属性
  48 + * 1.部分属性需要和全局属性进行合并
  49 + */
  50 + const getBindValues = computed<BasicTableProps>(() => {
  51 + const propsData: BasicTableProps = {
  52 + ...attrs,
  53 + ...props,
  54 + };
  55 +
  56 + return propsData;
  57 + });
  58 +
  59 + /**
  60 + * @description: Table 所有属性
  61 + */
  62 + const getBindGridValues = computed(() => {
  63 + const omitProps = omit(getBindValues.value, ignorePropKeys);
  64 +
  65 + return {
  66 + ...omitProps,
  67 + ...getBindGridEvent,
  68 + };
  69 + });
  70 +
  71 + /**
  72 + * @description: 组件外层class
  73 + */
  74 + const getWrapperClass = computed(() => {
  75 + return [attrs.class];
  76 + });
  77 +
  78 + /**
  79 + * @description: 重写Vxe-table 方法
  80 + */
  81 + const getBindGridEvent: VxeGridEventProps = {
  82 + ...emitEvents,
  83 + };
  84 +
  85 + return {
  86 + getWrapperClass,
  87 + getBindGridValues,
  88 + tableElRef,
  89 + ...gridExtendTableMethods,
  90 + };
  91 + },
  92 + render() {
  93 + const { tableClass, tableStyle } = this.$props;
  94 +
  95 + return (
  96 + <div class={`h-full flex flex-col bg-white ${this.getWrapperClass}`}>
  97 + <VxeGrid
  98 + ref="tableElRef"
  99 + class={`vxe-grid_scrollbar px-6 py-4 ${tableClass}`}
  100 + style={tableStyle}
  101 + {...this.getBindGridValues}
  102 + >
  103 + {extendSlots(this.$slots)}
  104 + </VxeGrid>
  105 + </div>
  106 + );
  107 + },
  108 +});
... ...
src/components/VxeTable/src/componentMap.ts 0 → 100644
  1 +import type { Component } from 'vue';
  2 +
  3 +import type { ComponentType } from './componentType';
  4 +import { ApiSelect, ApiTreeSelect } from '/@/components/Form';
  5 +import {
  6 + Input,
  7 + Select,
  8 + Radio,
  9 + Checkbox,
  10 + AutoComplete,
  11 + Cascader,
  12 + DatePicker,
  13 + InputNumber,
  14 + Switch,
  15 + TimePicker,
  16 + TreeSelect,
  17 + Rate,
  18 + Button,
  19 + Empty,
  20 +} from 'ant-design-vue';
  21 +
  22 +const componentMap = new Map<ComponentType, Component>();
  23 +
  24 +componentMap.set('AButton', Button);
  25 +
  26 +componentMap.set('AInput', Input);
  27 +componentMap.set('AInputSearch', Input.Search);
  28 +componentMap.set('AInputNumber', InputNumber);
  29 +componentMap.set('AAutoComplete', AutoComplete);
  30 +
  31 +componentMap.set('ASelect', Select);
  32 +componentMap.set('ATreeSelect', TreeSelect);
  33 +componentMap.set('ASwitch', Switch);
  34 +componentMap.set('ARadioGroup', Radio.Group);
  35 +componentMap.set('ACheckboxGroup', Checkbox.Group);
  36 +componentMap.set('ACascader', Cascader);
  37 +componentMap.set('ARate', Rate);
  38 +
  39 +componentMap.set('ADatePicker', DatePicker);
  40 +componentMap.set('AMonthPicker', DatePicker.MonthPicker);
  41 +componentMap.set('ARangePicker', DatePicker.RangePicker);
  42 +componentMap.set('AWeekPicker', DatePicker.WeekPicker);
  43 +componentMap.set('AYearPicker', DatePicker.YearPicker);
  44 +componentMap.set('ATimePicker', TimePicker);
  45 +
  46 +componentMap.set('AApiSelect', ApiSelect);
  47 +componentMap.set('AApiTreeSelect', ApiTreeSelect);
  48 +
  49 +componentMap.set('AEmpty', Empty);
  50 +
  51 +export function add(compName: ComponentType, component: Component) {
  52 + componentMap.set(compName, component);
  53 +}
  54 +
  55 +export function del(compName: ComponentType) {
  56 + componentMap.delete(compName);
  57 +}
  58 +
  59 +export { componentMap };
... ...
src/components/VxeTable/src/componentType.ts 0 → 100644
  1 +export type ComponentType =
  2 + | 'AInput'
  3 + | 'AInputNumber'
  4 + | 'ASelect'
  5 + | 'AApiSelect'
  6 + | 'ATreeSelect'
  7 + | 'AApiTreeSelect'
  8 + | 'ARadioGroup'
  9 + | 'ACheckboxGroup'
  10 + | 'AAutoComplete'
  11 + | 'ACascader'
  12 + | 'ADatePicker'
  13 + | 'AMonthPicker'
  14 + | 'ARangePicker'
  15 + | 'AWeekPicker'
  16 + | 'ATimePicker'
  17 + | 'AYearPicker'
  18 + | 'ASwitch'
  19 + | 'ARate'
  20 + | 'AInputSearch'
  21 + | 'AButton'
  22 + | 'AEmpty';
... ...
src/components/VxeTable/src/components/AApiSelect.tsx 0 → 100644
  1 +import XEUtils from 'xe-utils';
  2 +import { createDefaultRender, createEditRender, createFormItemRender } from './common';
  3 +
  4 +export default {
  5 + renderDefault: createDefaultRender({}, (_, params) => {
  6 + return {
  7 + params: XEUtils.get(params, 'row'),
  8 + };
  9 + }),
  10 + renderEdit: createEditRender({}, (_, params) => {
  11 + return {
  12 + params: XEUtils.get(params, 'row'),
  13 + };
  14 + }),
  15 + renderItemContent: createFormItemRender({}, (_, params) => {
  16 + return {
  17 + params: XEUtils.get(params, 'row'),
  18 + };
  19 + }),
  20 +};
... ...
src/components/VxeTable/src/components/AAutoComplete.tsx 0 → 100644
  1 +import {
  2 + createEditRender,
  3 + createDefaultRender,
  4 + createFilterRender,
  5 + createDefaultFilterRender,
  6 + createFormItemRender,
  7 +} from './common';
  8 +
  9 +export default {
  10 + autofocus: 'input.ant-input',
  11 + renderDefault: createDefaultRender(),
  12 + renderEdit: createEditRender(),
  13 + renderFilter: createFilterRender(),
  14 + defaultFilterMethod: createDefaultFilterRender(),
  15 + renderItemContent: createFormItemRender(),
  16 +};
... ...
src/components/VxeTable/src/components/AButton.tsx 0 → 100644
  1 +import { h } from 'vue';
  2 +import {
  3 + FormItemContentRenderParams,
  4 + FormItemRenderOptions,
  5 + VxeGlobalRendererHandles,
  6 +} from 'vxe-table';
  7 +import XEUtils from 'xe-utils';
  8 +import { cellText, createEvents, createProps, getComponent } from './common';
  9 +
  10 +const COMPONENT_NAME = 'AButton';
  11 +
  12 +export function createEditRender() {
  13 + return function (
  14 + renderOpts: VxeGlobalRendererHandles.RenderEditOptions,
  15 + params: VxeGlobalRendererHandles.RenderEditParams,
  16 + ) {
  17 + const { attrs } = renderOpts;
  18 + const Component = getComponent(COMPONENT_NAME);
  19 +
  20 + return [
  21 + h(Component, {
  22 + ...attrs,
  23 + ...createProps(renderOpts, null),
  24 + ...createEvents(renderOpts, params),
  25 + }),
  26 + ];
  27 + };
  28 +}
  29 +
  30 +export function createDefaultRender() {
  31 + return function (
  32 + renderOpts: VxeGlobalRendererHandles.RenderEditOptions,
  33 + params: VxeGlobalRendererHandles.RenderEditParams,
  34 + ) {
  35 + const { attrs } = renderOpts;
  36 + const Component = getComponent(COMPONENT_NAME);
  37 +
  38 + return [
  39 + h(
  40 + Component,
  41 + {
  42 + ...attrs,
  43 + ...createProps(renderOpts, null),
  44 + ...createEvents(renderOpts, params),
  45 + },
  46 + cellText(renderOpts.content),
  47 + ),
  48 + ];
  49 + };
  50 +}
  51 +
  52 +export function createFormItemRender() {
  53 + return function (renderOpts: FormItemRenderOptions, params: FormItemContentRenderParams) {
  54 + const { attrs, content } = renderOpts;
  55 + const { property, $form, data } = params;
  56 + const props = createProps(renderOpts, null);
  57 + const Component = getComponent(COMPONENT_NAME);
  58 +
  59 + return [
  60 + h(
  61 + Component,
  62 + {
  63 + ...attrs,
  64 + ...props,
  65 + ...createEvents(
  66 + renderOpts,
  67 + params,
  68 + (value: any) => {
  69 + // 处理 model 值双向绑定
  70 + XEUtils.set(data, property, value);
  71 + },
  72 + () => {
  73 + // 处理 change 事件相关逻辑
  74 + $form.updateStatus({
  75 + ...params,
  76 + field: property,
  77 + });
  78 + },
  79 + ),
  80 + },
  81 + {
  82 + default: () => cellText(content || props.content),
  83 + },
  84 + ),
  85 + ];
  86 + };
  87 +}
  88 +
  89 +function createToolbarButtonRender() {
  90 + return function (
  91 + renderOpts: VxeGlobalRendererHandles.RenderToolOptions,
  92 + params: VxeGlobalRendererHandles.RenderButtonParams,
  93 + ) {
  94 + const { attrs } = renderOpts;
  95 + const { button } = params;
  96 + const props = createProps(renderOpts, null);
  97 + const Component = getComponent(COMPONENT_NAME);
  98 +
  99 + return [
  100 + h(
  101 + Component,
  102 + {
  103 + ...attrs,
  104 + ...props,
  105 + ...createEvents(renderOpts, params),
  106 + },
  107 + {
  108 + default: () => cellText(button?.content || props.content),
  109 + },
  110 + ),
  111 + ];
  112 + };
  113 +}
  114 +
  115 +export default {
  116 + renderEdit: createEditRender(),
  117 + renderDefault: createDefaultRender(),
  118 + renderItemContent: createFormItemRender(),
  119 + renderToolbarButton: createToolbarButtonRender(),
  120 +};
... ...
src/components/VxeTable/src/components/AButtonGroup.tsx 0 → 100644
  1 +import {
  2 + FormItemContentRenderParams,
  3 + FormItemRenderOptions,
  4 + VxeGlobalRendererHandles,
  5 +} from 'vxe-table';
  6 +import { createDefaultRender, createEditRender, createFormItemRender } from './AButton';
  7 +
  8 +function createEditButtonRender() {
  9 + return function (
  10 + renderOpts: VxeGlobalRendererHandles.RenderEditOptions,
  11 + params: VxeGlobalRendererHandles.RenderEditParams,
  12 + ) {
  13 + const buttonEditRender = createEditRender();
  14 + const { children } = renderOpts;
  15 + if (children) {
  16 + return children.map(
  17 + (childRenderOpts: VxeGlobalRendererHandles.RenderEditOptions) =>
  18 + buttonEditRender(childRenderOpts, params)[0],
  19 + );
  20 + }
  21 + return [];
  22 + };
  23 +}
  24 +
  25 +function createDefaultButtonRender() {
  26 + return function (
  27 + renderOpts: VxeGlobalRendererHandles.RenderDefaultOptions,
  28 + params: VxeGlobalRendererHandles.RenderDefaultParams,
  29 + ) {
  30 + const buttonDefaultRender = createDefaultRender();
  31 + const { children } = renderOpts;
  32 + if (children) {
  33 + return children.map(
  34 + (childRenderOpts: VxeGlobalRendererHandles.RenderDefaultOptions) =>
  35 + buttonDefaultRender(childRenderOpts, params)[0],
  36 + );
  37 + }
  38 + return [];
  39 + };
  40 +}
  41 +
  42 +function createButtonItemRender() {
  43 + return function (renderOpts: FormItemRenderOptions, params: FormItemContentRenderParams) {
  44 + const buttonItemRender = createFormItemRender();
  45 + const { children } = renderOpts;
  46 + if (children) {
  47 + return children.map(
  48 + (childRenderOpts: FormItemRenderOptions) => buttonItemRender(childRenderOpts, params)[0],
  49 + );
  50 + }
  51 + return [];
  52 + };
  53 +}
  54 +
  55 +export default {
  56 + renderEdit: createEditButtonRender(),
  57 + renderDefault: createDefaultButtonRender(),
  58 + renderItemContent: createButtonItemRender(),
  59 +};
... ...
src/components/VxeTable/src/components/ACascader.tsx 0 → 100644
  1 +import { VxeGlobalRendererHandles } from 'vxe-table';
  2 +import XEUtils from 'xe-utils';
  3 +import {
  4 + createEditRender,
  5 + createCellRender,
  6 + createFormItemRender,
  7 + createExportMethod,
  8 +} from './common';
  9 +
  10 +function matchCascaderData(index: number, list: any[], values: any[], labels: any[]) {
  11 + const val = values[index];
  12 + if (list && values.length > index) {
  13 + XEUtils.each(list, (item) => {
  14 + if (item.value === val) {
  15 + labels.push(item.label);
  16 + matchCascaderData(++index, item.children, values, labels);
  17 + }
  18 + });
  19 + }
  20 +}
  21 +
  22 +function getCascaderCellValue(
  23 + renderOpts: VxeGlobalRendererHandles.RenderOptions,
  24 + params: VxeGlobalRendererHandles.RenderCellParams,
  25 +) {
  26 + const { props = {} } = renderOpts;
  27 + const { row, column } = params;
  28 + const cellValue = XEUtils.get(row, column.field as string);
  29 + const values = cellValue || [];
  30 + const labels: Array<any> = [];
  31 + matchCascaderData(0, props.options, values, labels);
  32 + return (
  33 + props.showAllLevels === false ? labels.slice(labels.length - 1, labels.length) : labels
  34 + ).join(` ${props.separator || '/'} `);
  35 +}
  36 +
  37 +export default {
  38 + renderEdit: createEditRender(),
  39 + renderCell: createCellRender(getCascaderCellValue),
  40 + renderItemContent: createFormItemRender(),
  41 + exportMethod: createExportMethod(getCascaderCellValue),
  42 +};
... ...
src/components/VxeTable/src/components/ACheckboxGroup.tsx 0 → 100644
  1 +import { createFormItemRender } from './common';
  2 +
  3 +export default {
  4 + renderItemContent: createFormItemRender(),
  5 +};
... ...
src/components/VxeTable/src/components/ADatePicker.tsx 0 → 100644
  1 +import { VxeGlobalRendererHandles } from 'vxe-table';
  2 +import XEUtils from 'xe-utils';
  3 +import {
  4 + createCellRender,
  5 + createEditRender,
  6 + createExportMethod,
  7 + createFormItemRender,
  8 +} from './common';
  9 +
  10 +export function getDatePickerCellValue(
  11 + renderOpts: VxeGlobalRendererHandles.RenderOptions,
  12 + params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams,
  13 + defaultFormat: string,
  14 +) {
  15 + const { props = {} } = renderOpts;
  16 + const { row, column } = params;
  17 + let cellValue = XEUtils.get(row, column.field as string);
  18 + if (cellValue) {
  19 + cellValue = cellValue.format(props.format || defaultFormat);
  20 + }
  21 + return cellValue;
  22 +}
  23 +
  24 +export default {
  25 + renderEdit: createEditRender(),
  26 + renderCell: createCellRender(getDatePickerCellValue, () => {
  27 + return ['YYYY-MM-DD'];
  28 + }),
  29 + renderItemContent: createFormItemRender(),
  30 + exportMethod: createExportMethod(getDatePickerCellValue, () => {
  31 + return ['YYYY-MM-DD'];
  32 + }),
  33 +};
... ...
src/components/VxeTable/src/components/AEmpty.tsx 0 → 100644
  1 +import { h } from 'vue';
  2 +import { VxeGlobalRendererHandles } from 'vxe-table';
  3 +import { getComponent } from './common';
  4 +
  5 +function createEmptyRender() {
  6 + return function (renderOpts: VxeGlobalRendererHandles.RenderEmptyOptions) {
  7 + const { name, attrs, props } = renderOpts;
  8 +
  9 + const Component = getComponent(name);
  10 + return [
  11 + h(
  12 + 'div',
  13 + {
  14 + class: 'flex items-center justify-center',
  15 + },
  16 + h(Component, {
  17 + ...attrs,
  18 + ...props,
  19 + }),
  20 + ),
  21 + ];
  22 + };
  23 +}
  24 +
  25 +export default {
  26 + renderEmpty: createEmptyRender(),
  27 +};
... ...
src/components/VxeTable/src/components/AInput.tsx 0 → 100644
  1 +import {
  2 + createEditRender,
  3 + createDefaultRender,
  4 + createFilterRender,
  5 + createDefaultFilterRender,
  6 + createFormItemRender,
  7 +} from './common';
  8 +
  9 +export default {
  10 + autofocus: 'input.ant-input',
  11 + renderDefault: createDefaultRender(),
  12 + renderEdit: createEditRender(),
  13 + renderFilter: createFilterRender(),
  14 + defaultFilterMethod: createDefaultFilterRender(),
  15 + renderItemContent: createFormItemRender(),
  16 +};
... ...
src/components/VxeTable/src/components/AInputNumber.tsx 0 → 100644
  1 +import {
  2 + createEditRender,
  3 + createFilterRender,
  4 + createFormItemRender,
  5 + createDefaultFilterRender,
  6 + createDefaultRender,
  7 +} from './common';
  8 +
  9 +export default {
  10 + autofocus: 'input.ant-input-number-input',
  11 + renderDefault: createDefaultRender(),
  12 + renderEdit: createEditRender(),
  13 + renderFilter: createFilterRender(),
  14 + defaultFilterMethod: createDefaultFilterRender(),
  15 + renderItemContent: createFormItemRender(),
  16 +};
... ...
src/components/VxeTable/src/components/AInputSearch.tsx 0 → 100644
  1 +import {
  2 + createEditRender,
  3 + createDefaultRender,
  4 + createFilterRender,
  5 + createDefaultFilterRender,
  6 + createFormItemRender,
  7 + createToolbarToolRender,
  8 +} from './common';
  9 +
  10 +export default {
  11 + renderDefault: createDefaultRender(),
  12 + renderEdit: createEditRender(),
  13 + renderFilter: createFilterRender(),
  14 + defaultFilterMethod: createDefaultFilterRender(),
  15 + renderItemContent: createFormItemRender(),
  16 + renderToolbarTool: createToolbarToolRender(),
  17 +};
... ...
src/components/VxeTable/src/components/AMonthPicker.tsx 0 → 100644
  1 +import { getDatePickerCellValue } from './ADatePicker';
  2 +import {
  3 + createCellRender,
  4 + createEditRender,
  5 + createExportMethod,
  6 + createFormItemRender,
  7 +} from './common';
  8 +
  9 +export default {
  10 + renderEdit: createEditRender(),
  11 + renderCell: createCellRender(getDatePickerCellValue, () => {
  12 + return ['YYYY-MM'];
  13 + }),
  14 + renderItemContent: createFormItemRender(),
  15 + exportMethod: createExportMethod(getDatePickerCellValue, () => {
  16 + return ['YYYY-MM'];
  17 + }),
  18 +};
... ...
src/components/VxeTable/src/components/ARadioGroup.tsx 0 → 100644
  1 +import { createFormItemRender } from './common';
  2 +
  3 +export default {
  4 + renderItemContent: createFormItemRender(),
  5 +};
... ...
src/components/VxeTable/src/components/ARangePicker.tsx 0 → 100644
  1 +import { VxeColumnPropTypes, VxeGlobalRendererHandles } from 'vxe-table';
  2 +import XEUtils from 'xe-utils';
  3 +import {
  4 + createCellRender,
  5 + createEditRender,
  6 + createExportMethod,
  7 + createFormItemRender,
  8 +} from './common';
  9 +
  10 +function getRangePickerCellValue(
  11 + renderOpts: VxeColumnPropTypes.EditRender,
  12 + params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams,
  13 +) {
  14 + const { props = {} } = renderOpts;
  15 + const { row, column } = params;
  16 + let cellValue = XEUtils.get(row, column.field as string);
  17 + if (cellValue) {
  18 + cellValue = XEUtils.map(cellValue, (date: any) =>
  19 + date.format(props.format || 'YYYY-MM-DD'),
  20 + ).join(' ~ ');
  21 + }
  22 + return cellValue;
  23 +}
  24 +
  25 +export default {
  26 + renderEdit: createEditRender(),
  27 + renderCell: createCellRender(getRangePickerCellValue),
  28 + renderItemContent: createFormItemRender(),
  29 + exportMethod: createExportMethod(getRangePickerCellValue),
  30 +};
... ...
src/components/VxeTable/src/components/ARate.tsx 0 → 100644
  1 +import {
  2 + createEditRender,
  3 + createDefaultRender,
  4 + createFilterRender,
  5 + createDefaultFilterRender,
  6 + createFormItemRender,
  7 +} from './common';
  8 +
  9 +export default {
  10 + renderDefault: createDefaultRender(),
  11 + renderEdit: createEditRender(),
  12 + renderFilter: createFilterRender(),
  13 + defaultFilterMethod: createDefaultFilterRender(),
  14 + renderItemContent: createFormItemRender(),
  15 +};
... ...
src/components/VxeTable/src/components/ASelect.tsx 0 → 100644
  1 +import { ComponentOptions, h, resolveComponent } from 'vue';
  2 +import { VxeColumnPropTypes, VxeGlobalRendererHandles } from 'vxe-table';
  3 +import XEUtils from 'xe-utils';
  4 +import {
  5 + cellText,
  6 + createCellRender,
  7 + createEvents,
  8 + createProps,
  9 + isEmptyValue,
  10 + createExportMethod,
  11 + createFormItemRender,
  12 +} from './common';
  13 +
  14 +function renderOptions(options: any[], optionProps: VxeGlobalRendererHandles.RenderOptionProps) {
  15 + const labelProp = optionProps.label || 'label';
  16 + const valueProp = optionProps.value || 'value';
  17 + return XEUtils.map(options, (item, oIndex) => {
  18 + return h(
  19 + resolveComponent('a-select-option') as ComponentOptions,
  20 + {
  21 + key: oIndex,
  22 + value: item[valueProp],
  23 + disabled: item.disabled,
  24 + },
  25 + {
  26 + default: () => cellText(item[labelProp]),
  27 + },
  28 + );
  29 + });
  30 +}
  31 +
  32 +function createEditRender() {
  33 + return function (
  34 + renderOpts: VxeColumnPropTypes.EditRender,
  35 + params: VxeGlobalRendererHandles.RenderEditParams,
  36 + ) {
  37 + const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts;
  38 + const { row, column, $table } = params;
  39 + const { attrs } = renderOpts;
  40 + const cellValue = XEUtils.get(row, column.field as string);
  41 + const props = createProps(renderOpts, cellValue);
  42 + const ons = createEvents(
  43 + renderOpts,
  44 + params,
  45 + (value: any) => {
  46 + // 处理 model 值双向绑定
  47 + XEUtils.set(row, column.field as string, value);
  48 + },
  49 + () => {
  50 + // 处理 change 事件相关逻辑
  51 + $table.updateStatus(params);
  52 + },
  53 + );
  54 + if (optionGroups) {
  55 + const groupOptions = optionGroupProps.options || 'options';
  56 + const groupLabel = optionGroupProps.label || 'label';
  57 + return [
  58 + h(
  59 + resolveComponent('a-select') as ComponentOptions,
  60 + {
  61 + ...attrs,
  62 + ...props,
  63 + ...ons,
  64 + },
  65 + {
  66 + default: () => {
  67 + return XEUtils.map(optionGroups, (group, gIndex) => {
  68 + return h(
  69 + resolveComponent('a-select-opt-group') as ComponentOptions,
  70 + {
  71 + key: gIndex,
  72 + },
  73 + {
  74 + label: () => {
  75 + return h('span', {}, group[groupLabel]);
  76 + },
  77 + default: () => renderOptions(group[groupOptions], optionProps),
  78 + },
  79 + );
  80 + });
  81 + },
  82 + },
  83 + ),
  84 + ];
  85 + }
  86 + return [
  87 + h(
  88 + resolveComponent('a-select') as ComponentOptions,
  89 + {
  90 + ...props,
  91 + ...attrs,
  92 + ...ons,
  93 + },
  94 + {
  95 + default: () => renderOptions(options, optionProps),
  96 + },
  97 + ),
  98 + ];
  99 + };
  100 +}
  101 +
  102 +function getSelectCellValue(
  103 + renderOpts: VxeGlobalRendererHandles.RenderCellOptions,
  104 + params: VxeGlobalRendererHandles.RenderCellParams,
  105 +) {
  106 + const {
  107 + options = [],
  108 + optionGroups,
  109 + props = {},
  110 + optionProps = {},
  111 + optionGroupProps = {},
  112 + } = renderOpts;
  113 + const { row, column } = params;
  114 + const labelProp = optionProps.label || 'label';
  115 + const valueProp = optionProps.value || 'value';
  116 + const groupOptions = optionGroupProps.options || 'options';
  117 + const cellValue = XEUtils.get(row, column.field as string);
  118 + if (!isEmptyValue(cellValue)) {
  119 + return XEUtils.map(
  120 + props.mode === 'multiple' ? cellValue : [cellValue],
  121 + optionGroups
  122 + ? (value) => {
  123 + let selectItem;
  124 + for (let index = 0; index < optionGroups.length; index++) {
  125 + selectItem = XEUtils.find(
  126 + optionGroups[index][groupOptions],
  127 + (item) => item[valueProp] === value,
  128 + );
  129 + if (selectItem) {
  130 + break;
  131 + }
  132 + }
  133 + return selectItem ? selectItem[labelProp] : value;
  134 + }
  135 + : (value) => {
  136 + const selectItem = XEUtils.find(options, (item) => item[valueProp] === value);
  137 + return selectItem ? selectItem[labelProp] : value;
  138 + },
  139 + ).join(', ');
  140 + }
  141 + return '';
  142 +}
  143 +
  144 +function createFilterRender() {
  145 + return function (
  146 + renderOpts: VxeColumnPropTypes.FilterRender,
  147 + params: VxeGlobalRendererHandles.RenderFilterParams,
  148 + ) {
  149 + const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts;
  150 + const groupOptions = optionGroupProps.options || 'options';
  151 + const groupLabel = optionGroupProps.label || 'label';
  152 + const { column } = params;
  153 + const { attrs } = renderOpts;
  154 +
  155 + return [
  156 + h(
  157 + 'div',
  158 + {
  159 + class: 'vxe-table--filter-antd-wrapper',
  160 + },
  161 + optionGroups
  162 + ? column.filters.map((option, oIndex) => {
  163 + const optionValue = option.data;
  164 + const props = createProps(renderOpts, optionValue);
  165 +
  166 + return h(
  167 + resolveComponent('a-select') as ComponentOptions,
  168 + {
  169 + key: oIndex,
  170 + ...attrs,
  171 + ...props,
  172 + ...createEvents(
  173 + renderOpts,
  174 + params,
  175 + (value: any) => {
  176 + // 处理 model 值双向绑定
  177 + option.data = value;
  178 + },
  179 + () => {
  180 + // 处理 change 事件相关逻辑
  181 + const { $panel } = params;
  182 + $panel.changeOption(
  183 + null,
  184 + props.mode === 'multiple'
  185 + ? option.data && option.data.length > 0
  186 + : !XEUtils.eqNull(option.data),
  187 + option,
  188 + );
  189 + },
  190 + ),
  191 + },
  192 + {
  193 + default: () => {
  194 + return XEUtils.map(optionGroups, (group, gIndex) => {
  195 + return h(
  196 + resolveComponent('a-select-opt-group') as ComponentOptions,
  197 + {
  198 + key: gIndex,
  199 + },
  200 + {
  201 + label: () => {
  202 + return h('span', {}, group[groupLabel]);
  203 + },
  204 + default: () => renderOptions(group[groupOptions], optionProps),
  205 + },
  206 + );
  207 + });
  208 + },
  209 + },
  210 + );
  211 + })
  212 + : column.filters.map((option, oIndex) => {
  213 + const optionValue = option.data;
  214 + const props = createProps(renderOpts, optionValue);
  215 + return h(
  216 + resolveComponent('a-select') as ComponentOptions,
  217 + {
  218 + key: oIndex,
  219 + ...attrs,
  220 + ...props,
  221 + ...createEvents(
  222 + renderOpts,
  223 + params,
  224 + (value: any) => {
  225 + // 处理 model 值双向绑定
  226 + option.data = value;
  227 + },
  228 + () => {
  229 + // 处理 change 事件相关逻辑
  230 + const { $panel } = params;
  231 + $panel.changeOption(
  232 + null,
  233 + props.mode === 'multiple'
  234 + ? option.data && option.data.length > 0
  235 + : !XEUtils.eqNull(option.data),
  236 + option,
  237 + );
  238 + },
  239 + ),
  240 + },
  241 + {
  242 + default: () => renderOptions(options, optionProps),
  243 + },
  244 + );
  245 + }),
  246 + ),
  247 + ];
  248 + };
  249 +}
  250 +
  251 +export default {
  252 + renderEdit: createEditRender(),
  253 + renderCell: createCellRender(getSelectCellValue),
  254 + renderFilter: createFilterRender(),
  255 + defaultFilterMethod(params) {
  256 + const { option, row, column } = params;
  257 + const { data } = option;
  258 + const { field, filterRender: renderOpts } = column;
  259 + const { props = {} } = renderOpts;
  260 + const cellValue = XEUtils.get(row, field);
  261 + if (props.mode === 'multiple') {
  262 + if (XEUtils.isArray(cellValue)) {
  263 + return XEUtils.includeArrays(cellValue, data);
  264 + }
  265 + return data.indexOf(cellValue) > -1;
  266 + }
  267 + return cellValue == data;
  268 + },
  269 + renderItemContent: createFormItemRender(),
  270 + exportMethod: createExportMethod(getSelectCellValue),
  271 +};
... ...
src/components/VxeTable/src/components/ASwitch.tsx 0 → 100644
  1 +import { h } from 'vue';
  2 +import XEUtils from 'xe-utils';
  3 +import {
  4 + createEditRender,
  5 + createDefaultRender,
  6 + createProps,
  7 + createEvents,
  8 + createDefaultFilterRender,
  9 + createFormItemRender,
  10 + getComponent,
  11 +} from './common';
  12 +
  13 +export default {
  14 + renderDefault: createDefaultRender(),
  15 + renderEdit: createEditRender(),
  16 + renderFilter(renderOpts, params) {
  17 + const { column } = params;
  18 + const { name, attrs } = renderOpts;
  19 + const Component = getComponent(name);
  20 +
  21 + return [
  22 + h(
  23 + 'div',
  24 + {
  25 + class: 'vxe-table--filter-antd-wrapper',
  26 + },
  27 + column.filters.map((option, oIndex) => {
  28 + const optionValue = option.data;
  29 + return h(Component, {
  30 + key: oIndex,
  31 + ...attrs,
  32 + ...createProps(renderOpts, optionValue),
  33 + ...createEvents(
  34 + renderOpts,
  35 + params,
  36 + (value: any) => {
  37 + // 处理 model 值双向绑定
  38 + option.data = value;
  39 + },
  40 + () => {
  41 + // 处理 change 事件相关逻辑
  42 + const { $panel } = params;
  43 + $panel.changeOption(null, XEUtils.isBoolean(option.data), option);
  44 + },
  45 + ),
  46 + });
  47 + }),
  48 + ),
  49 + ];
  50 + },
  51 + defaultFilterMethod: createDefaultFilterRender(),
  52 + renderItemContent: createFormItemRender(),
  53 +};
... ...
src/components/VxeTable/src/components/ATimePicker.tsx 0 → 100644
  1 +import { getDatePickerCellValue } from './ADatePicker';
  2 +import {
  3 + createEditRender,
  4 + createCellRender,
  5 + createFormItemRender,
  6 + createExportMethod,
  7 +} from './common';
  8 +
  9 +export default {
  10 + renderEdit: createEditRender(),
  11 + renderCell: createCellRender(getDatePickerCellValue, () => {
  12 + return ['HH:mm:ss'];
  13 + }),
  14 + renderItemContent: createFormItemRender(),
  15 + exportMethod: createExportMethod(getDatePickerCellValue, () => {
  16 + return ['HH:mm:ss'];
  17 + }),
  18 +};
... ...
src/components/VxeTable/src/components/ATreeSelect.tsx 0 → 100644
  1 +import { VxeGlobalRendererHandles } from 'vxe-table';
  2 +import XEUtils from 'xe-utils';
  3 +import {
  4 + createEditRender,
  5 + createCellRender,
  6 + isEmptyValue,
  7 + createFormItemRender,
  8 + createExportMethod,
  9 +} from './common';
  10 +
  11 +function getTreeSelectCellValue(
  12 + renderOpts: VxeGlobalRendererHandles.RenderOptions,
  13 + params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams,
  14 +) {
  15 + const { props = {} } = renderOpts;
  16 + const { treeData, treeCheckable } = props;
  17 + const { row, column } = params;
  18 + const cellValue = XEUtils.get(row, column.field as string);
  19 + if (!isEmptyValue(cellValue)) {
  20 + return XEUtils.map(treeCheckable ? cellValue : [cellValue], (value) => {
  21 + const matchObj = XEUtils.findTree(treeData, (item: any) => item.value === value, {
  22 + children: 'children',
  23 + });
  24 + return matchObj ? matchObj.item.title : value;
  25 + }).join(', ');
  26 + }
  27 + return cellValue;
  28 +}
  29 +
  30 +export default {
  31 + renderEdit: createEditRender(),
  32 + renderCell: createCellRender(getTreeSelectCellValue),
  33 + renderItemContent: createFormItemRender(),
  34 + exportMethod: createExportMethod(getTreeSelectCellValue),
  35 +};
... ...
src/components/VxeTable/src/components/AWeekPicker.tsx 0 → 100644
  1 +import { getDatePickerCellValue } from './ADatePicker';
  2 +import {
  3 + createEditRender,
  4 + createCellRender,
  5 + createFormItemRender,
  6 + createExportMethod,
  7 +} from './common';
  8 +
  9 +export default {
  10 + renderEdit: createEditRender(),
  11 + renderCell: createCellRender(getDatePickerCellValue, () => {
  12 + return ['YYYY-WW周'];
  13 + }),
  14 + renderItemContent: createFormItemRender(),
  15 + exportMethod: createExportMethod(getDatePickerCellValue, () => {
  16 + return ['YYYY-WW周'];
  17 + }),
  18 +};
... ...
src/components/VxeTable/src/components/AYearPicker.tsx 0 → 100644
  1 +import { getDatePickerCellValue } from './ADatePicker';
  2 +import {
  3 + createEditRender,
  4 + createCellRender,
  5 + createFormItemRender,
  6 + createExportMethod,
  7 +} from './common';
  8 +
  9 +export default {
  10 + renderEdit: createEditRender(),
  11 + renderCell: createCellRender(getDatePickerCellValue, () => {
  12 + return ['YYYY'];
  13 + }),
  14 + renderItemContent: createFormItemRender(),
  15 + exportMethod: createExportMethod(getDatePickerCellValue, () => {
  16 + return ['YYYY'];
  17 + }),
  18 +};
... ...
src/components/VxeTable/src/components/common.tsx 0 → 100644
  1 +import { ComponentOptions, h } from 'vue';
  2 +import {
  3 + FormItemContentRenderParams,
  4 + FormItemRenderOptions,
  5 + VxeGlobalRendererHandles,
  6 +} from 'vxe-table';
  7 +import XEUtils from 'xe-utils';
  8 +import { componentMap } from '../componentMap';
  9 +import { ComponentType } from '../componentType';
  10 +import { createPlaceholderMessage } from '../helper';
  11 +
  12 +/**
  13 + * @description: 获取组件
  14 + */
  15 +export function getComponent(componentName) {
  16 + const Component = componentMap.get(componentName as ComponentType);
  17 + if (!Component) throw `您还没注册此组件 ${componentName}`;
  18 + return Component as ComponentOptions;
  19 +}
  20 +
  21 +export function isEmptyValue(cellValue: any) {
  22 + return cellValue === null || cellValue === undefined || cellValue === '';
  23 +}
  24 +
  25 +export function formatText(cellValue: any) {
  26 + return '' + (isEmptyValue(cellValue) ? '' : cellValue);
  27 +}
  28 +
  29 +export function cellText(cellValue: any): string[] {
  30 + return [formatText(cellValue)];
  31 +}
  32 +
  33 +/**
  34 + * @description: 方法名转换
  35 + */
  36 +export function getOnName(type: string) {
  37 + return 'on' + type.substring(0, 1).toLocaleUpperCase() + type.substring(1);
  38 +}
  39 +
  40 +/**
  41 + * @description: 获取组件传值所接受的属性
  42 + */
  43 +function getModelKey(renderOpts: VxeGlobalRendererHandles.RenderOptions) {
  44 + let prop = 'value';
  45 + switch (renderOpts.name) {
  46 + case 'ASwitch':
  47 + prop = 'checked';
  48 + break;
  49 + }
  50 + return prop;
  51 +}
  52 +
  53 +/**
  54 + * @description: 回去双向更新的方法
  55 + */
  56 +function getModelEvent(renderOpts: VxeGlobalRendererHandles.RenderOptions) {
  57 + let type = 'update:value';
  58 + switch (renderOpts.name) {
  59 + case 'ASwitch':
  60 + type = 'update:checked';
  61 + break;
  62 + }
  63 + return type;
  64 +}
  65 +
  66 +/**
  67 + * @description: chang值改变方法
  68 + * @param {}
  69 + * @return {*}
  70 + * @author: *
  71 + */
  72 +function getChangeEvent() {
  73 + return 'change';
  74 +}
  75 +
  76 +function getClickEvent() {
  77 + return 'click';
  78 +}
  79 +/**
  80 + * @description: 获取方法
  81 + * @param {}
  82 + * @return {*}
  83 + * @author: *
  84 + */
  85 +export function createEvents(
  86 + renderOpts: VxeGlobalRendererHandles.RenderOptions,
  87 + params: VxeGlobalRendererHandles.RenderParams,
  88 + inputFunc?: Function,
  89 + changeFunc?: Function,
  90 + clickFunc?: Function,
  91 +) {
  92 + const { events } = renderOpts;
  93 + const modelEvent = getModelEvent(renderOpts);
  94 + const changeEvent = getChangeEvent();
  95 + const clickEvent = getClickEvent();
  96 + const isSameEvent = changeEvent === modelEvent;
  97 + const ons: { [type: string]: Function } = {};
  98 +
  99 + XEUtils.objectEach(events, (func: Function, key: string) => {
  100 + ons[getOnName(key)] = function (...args: any[]) {
  101 + func(params, ...args);
  102 + };
  103 + });
  104 + if (inputFunc) {
  105 + ons[getOnName(modelEvent)] = function (targetEvnt: any) {
  106 + inputFunc(targetEvnt);
  107 + if (events && events[modelEvent]) {
  108 + events[modelEvent](params, targetEvnt);
  109 + }
  110 + if (isSameEvent && changeFunc) {
  111 + changeFunc(targetEvnt);
  112 + }
  113 + };
  114 + }
  115 + if (!isSameEvent && changeFunc) {
  116 + ons[getOnName(changeEvent)] = function (...args: any[]) {
  117 + changeFunc(...args);
  118 + if (events && events[changeEvent]) {
  119 + events[changeEvent](params, ...args);
  120 + }
  121 + };
  122 + }
  123 + if (clickFunc) {
  124 + ons[getOnName(clickEvent)] = function (...args: any[]) {
  125 + clickFunc(...args);
  126 + if (events && events[clickEvent]) {
  127 + events[clickEvent](params, ...args);
  128 + }
  129 + };
  130 + }
  131 + return ons;
  132 +}
  133 +
  134 +/**
  135 + * @description: 获取属性
  136 + */
  137 +export function createProps(
  138 + renderOpts: VxeGlobalRendererHandles.RenderOptions,
  139 + value: any,
  140 + defaultProps?: { [prop: string]: any },
  141 +) {
  142 + const name = renderOpts.name as ComponentType;
  143 + return XEUtils.assign(
  144 + {
  145 + placeholder: createPlaceholderMessage(name),
  146 + allowClear: true,
  147 + },
  148 + defaultProps,
  149 + renderOpts.props,
  150 + {
  151 + [getModelKey(renderOpts)]: value,
  152 + },
  153 + );
  154 +}
  155 +
  156 +/**
  157 + * @description: 创建单元格默认显示内容
  158 + */
  159 +export function createDefaultRender(
  160 + defaultProps?: { [key: string]: any },
  161 + callBack?: (
  162 + renderOpts: VxeGlobalRendererHandles.RenderDefaultOptions,
  163 + params: VxeGlobalRendererHandles.RenderDefaultParams,
  164 + ) => Record<string, any>,
  165 +) {
  166 + return function (
  167 + renderOpts: VxeGlobalRendererHandles.RenderDefaultOptions,
  168 + params: VxeGlobalRendererHandles.RenderDefaultParams,
  169 + ) {
  170 + const { row, column, $table } = params;
  171 + const { name, attrs } = renderOpts;
  172 + const cellValue = XEUtils.get(row, column.field as string);
  173 + const args = (callBack && callBack(renderOpts, params)) ?? {};
  174 +
  175 + const Component = getComponent(name);
  176 + return [
  177 + h(Component, {
  178 + ...attrs,
  179 + ...createProps(renderOpts, cellValue, defaultProps),
  180 + ...args,
  181 + ...createEvents(
  182 + renderOpts,
  183 + params,
  184 + (value: any) => XEUtils.set(row, column.field as string, value),
  185 + () => $table.updateStatus(params),
  186 + ),
  187 + }),
  188 + ];
  189 + };
  190 +}
  191 +
  192 +/**
  193 + * @description: 创建编辑单元格
  194 + */
  195 +export function createEditRender(
  196 + defaultProps?: { [key: string]: any },
  197 + callBack?: (
  198 + renderOpts: VxeGlobalRendererHandles.RenderEditOptions,
  199 + params: VxeGlobalRendererHandles.RenderEditParams,
  200 + ) => Record<string, any>,
  201 +) {
  202 + return function (
  203 + renderOpts: VxeGlobalRendererHandles.RenderEditOptions,
  204 + params: VxeGlobalRendererHandles.RenderEditParams,
  205 + ) {
  206 + const { row, column, $table } = params;
  207 + const { name, attrs } = renderOpts;
  208 + const cellValue = XEUtils.get(row, column.field as string);
  209 + const args = (callBack && callBack(renderOpts, params)) ?? {};
  210 +
  211 + const Component = getComponent(name);
  212 + return [
  213 + h(Component, {
  214 + ...attrs,
  215 + ...createProps(renderOpts, cellValue, defaultProps),
  216 + ...args,
  217 + ...createEvents(
  218 + renderOpts,
  219 + params,
  220 + (value: any) => XEUtils.set(row, column.field as string, value),
  221 + () => $table.updateStatus(params),
  222 + ),
  223 + }),
  224 + ];
  225 + };
  226 +}
  227 +
  228 +/**
  229 + * @description: 创建筛选渲染内容
  230 + */
  231 +export function createFilterRender(
  232 + defaultProps?: { [key: string]: any },
  233 + callBack?: (
  234 + renderOpts: VxeGlobalRendererHandles.RenderFilterOptions,
  235 + params: VxeGlobalRendererHandles.RenderFilterParams,
  236 + ) => Record<string, any>,
  237 +) {
  238 + return function (
  239 + renderOpts: VxeGlobalRendererHandles.RenderFilterOptions,
  240 + params: VxeGlobalRendererHandles.RenderFilterParams,
  241 + ) {
  242 + const { column } = params;
  243 + const { name, attrs } = renderOpts;
  244 + const args = (callBack && callBack(renderOpts, params)) ?? {};
  245 +
  246 + const Component = getComponent(name);
  247 + return [
  248 + h(
  249 + 'div',
  250 + {
  251 + class: 'vxe-table--filter-antd-wrapper',
  252 + },
  253 + column.filters.map((option, oIndex) => {
  254 + const optionValue = option.data;
  255 + const checked = !!option.data;
  256 +
  257 + return h(Component, {
  258 + key: oIndex,
  259 + ...attrs,
  260 + ...createProps(renderOpts, optionValue, defaultProps),
  261 + ...args,
  262 + ...createEvents(
  263 + renderOpts,
  264 + params,
  265 + (value: any) => {
  266 + // 处理 model 值双向绑定
  267 + option.data = value;
  268 + },
  269 + () => {
  270 + // 处理 change 事件相关逻辑
  271 + const { $panel } = params;
  272 + $panel.changeOption(null, checked, option);
  273 + },
  274 + ),
  275 + });
  276 + }),
  277 + ),
  278 + ];
  279 + };
  280 +}
  281 +
  282 +/**
  283 + * @description: 默认过滤
  284 + * @param {}
  285 + * @return {*}
  286 + * @author: *
  287 + */
  288 +
  289 +export function createDefaultFilterRender() {
  290 + return function (params: VxeGlobalRendererHandles.FilterMethodParams) {
  291 + const { option, row, column } = params;
  292 + const { data } = option;
  293 + const cellValue = XEUtils.get(row, column.field as string);
  294 + return cellValue === data;
  295 + };
  296 +}
  297 +
  298 +/**
  299 + * @description: 创建 form表单渲染
  300 + */
  301 +export function createFormItemRender(
  302 + defaultProps?: { [key: string]: any },
  303 + callBack?: (
  304 + renderOpts: FormItemRenderOptions,
  305 + params: FormItemContentRenderParams,
  306 + ) => Record<string, any>,
  307 +) {
  308 + return function (renderOpts: FormItemRenderOptions, params: FormItemContentRenderParams) {
  309 + const args = (callBack && callBack(renderOpts, params)) ?? {};
  310 + const { data, property, $form } = params;
  311 + const { name } = renderOpts;
  312 + const { attrs } = renderOpts;
  313 + const itemValue = XEUtils.get(data, property);
  314 +
  315 + const Component = getComponent(name);
  316 + return [
  317 + h(Component, {
  318 + ...attrs,
  319 + ...createProps(renderOpts, itemValue, defaultProps),
  320 + ...args,
  321 + ...createEvents(
  322 + renderOpts,
  323 + params,
  324 + (value: any) => {
  325 + // 处理 model 值双向绑定
  326 + XEUtils.set(data, property, value);
  327 + },
  328 + () => {
  329 + // 处理 change 事件相关逻辑
  330 + $form.updateStatus({
  331 + ...params,
  332 + field: property,
  333 + });
  334 + },
  335 + ),
  336 + }),
  337 + ];
  338 + };
  339 +}
  340 +
  341 +/**
  342 + * @description: cell渲染
  343 + */
  344 +export function createCellRender(
  345 + getSelectCellValue: Function,
  346 + callBack?: (
  347 + renderOpts: VxeGlobalRendererHandles.RenderCellOptions,
  348 + params: VxeGlobalRendererHandles.RenderCellParams,
  349 + ) => Array<any>,
  350 +) {
  351 + return function (
  352 + renderOpts: VxeGlobalRendererHandles.RenderCellOptions,
  353 + params: VxeGlobalRendererHandles.RenderCellParams,
  354 + ) {
  355 + const args = (callBack && callBack(renderOpts, params)) ?? [];
  356 + const cellLabel = getSelectCellValue && getSelectCellValue(renderOpts, params, ...args);
  357 + const { placeholder } = renderOpts;
  358 +
  359 + return [
  360 + h(
  361 + 'span',
  362 + {
  363 + class: 'vxe-cell--label',
  364 + },
  365 + placeholder && isEmptyValue(cellLabel)
  366 + ? [
  367 + h(
  368 + 'span',
  369 + {
  370 + class: 'vxe-cell--placeholder',
  371 + },
  372 + formatText(placeholder),
  373 + ),
  374 + ]
  375 + : formatText(cellLabel),
  376 + ),
  377 + ];
  378 + };
  379 +}
  380 +
  381 +/**
  382 + * @description: 创建 导出渲染
  383 + * @param {}
  384 + * @return {*}
  385 + * @author: *
  386 + */
  387 +export function createExportMethod(
  388 + getExportCellValue: Function,
  389 + callBack?: (params: VxeGlobalRendererHandles.ExportMethodParams) => Array<any>,
  390 +) {
  391 + return function (params: VxeGlobalRendererHandles.ExportMethodParams) {
  392 + const { row, column, options } = params;
  393 + const args = (callBack && callBack(params)) ?? [];
  394 + return options && options.original
  395 + ? XEUtils.get(row, column.field as string)
  396 + : getExportCellValue(column.editRender || column.cellRender, params, ...args);
  397 + };
  398 +}
  399 +
  400 +/**
  401 + * @description: 创建单元格默认显示内容
  402 + */
  403 +export function createToolbarToolRender(
  404 + defaultProps?: { [key: string]: any },
  405 + callBack?: (
  406 + renderOpts: VxeGlobalRendererHandles.RenderToolOptions,
  407 + params: VxeGlobalRendererHandles.RenderToolParams,
  408 + ) => Record<string, any>,
  409 +) {
  410 + return function (
  411 + renderOpts: VxeGlobalRendererHandles.RenderToolOptions,
  412 + params: VxeGlobalRendererHandles.RenderToolParams,
  413 + ) {
  414 + const { name, attrs } = renderOpts;
  415 + const args = (callBack && callBack(renderOpts, params)) ?? {};
  416 +
  417 + const Component = getComponent(name);
  418 + return [
  419 + h(Component, {
  420 + ...attrs,
  421 + ...createProps(renderOpts, null, defaultProps),
  422 + ...args,
  423 + ...createEvents(renderOpts, params),
  424 + }),
  425 + ];
  426 + };
  427 +}
... ...
src/components/VxeTable/src/components/index.tsx 0 → 100644
  1 +import { VXETableCore, VxeGlobalInterceptorHandles } from 'vxe-table';
  2 +import AAutoComplete from './AAutoComplete';
  3 +import AInput from './AInput';
  4 +import AInputNumber from './AInputNumber';
  5 +import ASelect from './ASelect';
  6 +import ACascader from './ACascader';
  7 +import ADatePicker from './ADatePicker';
  8 +import AMonthPicker from './AMonthPicker';
  9 +import ARangePicker from './ARangePicker';
  10 +import AWeekPicker from './AWeekPicker';
  11 +import ATreeSelect from './ATreeSelect';
  12 +import ATimePicker from './ATimePicker';
  13 +import ARate from './ARate';
  14 +import ASwitch from './ASwitch';
  15 +import ARadioGroup from './ARadioGroup';
  16 +import ACheckboxGroup from './ACheckboxGroup';
  17 +import AButton from './AButton';
  18 +import AButtonGroup from './AButtonGroup';
  19 +import AApiSelect from './AApiSelect';
  20 +import AEmpty from './AEmpty';
  21 +import AInputSearch from './AInputSearch';
  22 +import AYearPicker from './AYearPicker';
  23 +
  24 +/**
  25 + * 检查触发源是否属于目标节点
  26 + */
  27 +function getEventTargetNode(evnt: any, container: HTMLElement, className: string) {
  28 + let targetElem;
  29 + let target = evnt.target;
  30 + while (target && target.nodeType && target !== document) {
  31 + if (
  32 + className &&
  33 + target.className &&
  34 + target.className.split &&
  35 + target.className.split(' ').indexOf(className) > -1
  36 + ) {
  37 + targetElem = target;
  38 + } else if (target === container) {
  39 + return { flag: className ? !!targetElem : true, container, targetElem: targetElem };
  40 + }
  41 + target = target.parentNode;
  42 + }
  43 + return { flag: false };
  44 +}
  45 +
  46 +/**
  47 + * 事件兼容性处理
  48 + */
  49 +function handleClearEvent(
  50 + params:
  51 + | VxeGlobalInterceptorHandles.InterceptorClearFilterParams
  52 + | VxeGlobalInterceptorHandles.InterceptorClearActivedParams
  53 + | VxeGlobalInterceptorHandles.InterceptorClearAreasParams,
  54 +) {
  55 + const { $event } = params;
  56 + const bodyElem = document.body;
  57 + if (
  58 + // 下拉框
  59 + getEventTargetNode($event, bodyElem, 'ant-select-dropdown').flag ||
  60 + // 级联
  61 + getEventTargetNode($event, bodyElem, 'ant-cascader-menus').flag ||
  62 + // 日期
  63 + getEventTargetNode($event, bodyElem, 'ant-calendar-picker-container').flag ||
  64 + // 时间选择
  65 + getEventTargetNode($event, bodyElem, 'ant-time-picker-panel').flag
  66 + ) {
  67 + return false;
  68 + }
  69 +}
  70 +
  71 +/**
  72 + * 基于 vxe-table 表格的适配插件,用于兼容 ant-design-vue 组件库
  73 + */
  74 +export const VXETablePluginAntd = {
  75 + install(vxetablecore: VXETableCore) {
  76 + const { interceptor, renderer } = vxetablecore;
  77 +
  78 + renderer.mixin({
  79 + AAutoComplete,
  80 + AInput,
  81 + AInputNumber,
  82 + ASelect,
  83 + ACascader,
  84 + ADatePicker,
  85 + AMonthPicker,
  86 + ARangePicker,
  87 + AWeekPicker,
  88 + ATimePicker,
  89 + ATreeSelect,
  90 + ARate,
  91 + ASwitch,
  92 + ARadioGroup,
  93 + ACheckboxGroup,
  94 + AButton,
  95 + AButtonGroup,
  96 + AApiSelect,
  97 + AEmpty,
  98 + AInputSearch,
  99 + AYearPicker,
  100 + });
  101 +
  102 + interceptor.add('event.clearFilter', handleClearEvent);
  103 + interceptor.add('event.clearActived', handleClearEvent);
  104 + interceptor.add('event.clearAreas', handleClearEvent);
  105 + },
  106 +};
  107 +
  108 +if (typeof window !== 'undefined' && window.VXETable && window.VXETable.use) {
  109 + window.VXETable.use(VXETablePluginAntd);
  110 +}
  111 +
  112 +export default VXETablePluginAntd;
... ...
src/components/VxeTable/src/const.ts 0 → 100644
  1 +/**
  2 + * @description: 传给vxe-table 时需要忽略的prop
  3 + */
  4 +export const ignorePropKeys = ['tableClass', 'tableStyle'];
... ...
src/components/VxeTable/src/css/common.scss 0 → 100644
  1 +*,
  2 +::before,
  3 +::after {
  4 + box-sizing: border-box;
  5 + border-width: 0;
  6 + border-style: solid;
  7 + border-color: initial;
  8 +}
... ...
src/components/VxeTable/src/css/component.scss 0 → 100644
  1 +%ResetBorder {
  2 + border: 0;
  3 + box-shadow: none;
  4 +}
  5 +
  6 +%CompWidth {
  7 + & > .ant-input,
  8 + & > .ant-input-number,
  9 + & > .ant-select,
  10 + & > .ant-cascader-picker,
  11 + & > .ant-calendar-picker,
  12 + & > .ant-time-picker {
  13 + width: 100%;
  14 + }
  15 +}
  16 +.vxe-form {
  17 + .vxe-form--item-content {
  18 + @extend %CompWidth;
  19 + }
  20 +}
  21 +.vxe-table--filter-antd-wrapper {
  22 + & > .ant-input,
  23 + & > .ant-input-number,
  24 + & > .ant-select,
  25 + & > .ant-rate {
  26 + width: 180px;
  27 + }
  28 +}
  29 +.vxe-cell,
  30 +.vxe-tree-cell {
  31 + @extend %CompWidth;
  32 + & > .ant-rate {
  33 + vertical-align: bottom;
  34 + .anticon-star {
  35 + display: block;
  36 + }
  37 + }
  38 +}
  39 +.col--valid-error {
  40 + & > .vxe-cell,
  41 + & > .vxe-tree-cell {
  42 + & > .ant-input,
  43 + & > .ant-select .ant-input,
  44 + & > .ant-select .ant-select-selection,
  45 + & > .ant-input-number,
  46 + & > .ant-cascader-picker .ant-cascader-input,
  47 + & > .ant-calendar-picker .ant-calendar-picker-input {
  48 + // border-color: $vxe-table-validate-error-color;
  49 + box-shadow: none;
  50 + }
  51 + }
  52 +}
  53 +.vxe-table.cell--highlight {
  54 + .vxe-cell,
  55 + .vxe-tree-cell {
  56 + & > .ant-input,
  57 + & > .ant-input-number {
  58 + padding: 0;
  59 + @extend %ResetBorder;
  60 + }
  61 + & > .ant-select {
  62 + .ant-input {
  63 + padding: 0;
  64 + @extend %ResetBorder;
  65 + }
  66 + }
  67 + & > .ant-input-number {
  68 + .ant-input-number-input {
  69 + padding: 0;
  70 + }
  71 + .ant-input-number-handler-wrap,
  72 + .ant-input-number-handler-down {
  73 + @extend %ResetBorder;
  74 + }
  75 + }
  76 + & > .ant-select {
  77 + .ant-select-selection {
  78 + @extend %ResetBorder;
  79 + .ant-select-selection__rendered {
  80 + margin: 0;
  81 + }
  82 + }
  83 + }
  84 + & > .ant-cascader-picker {
  85 + .ant-input {
  86 + @extend %ResetBorder;
  87 + }
  88 + .ant-cascader-picker-label {
  89 + padding: 0;
  90 + }
  91 + }
  92 + & > .ant-calendar-picker {
  93 + .ant-calendar-picker-input {
  94 + padding: 0;
  95 + @extend %ResetBorder;
  96 + }
  97 + }
  98 + & > .ant-time-picker {
  99 + .ant-time-picker-input {
  100 + padding: 0;
  101 + @extend %ResetBorder;
  102 + }
  103 + }
  104 + }
  105 +}
... ...
src/components/VxeTable/src/css/index.scss 0 → 100644
  1 +@import './common.scss';
  2 +@import './variable.scss';
  3 +@import './scrollbar.scss';
  4 +@import './toolbar.scss';
  5 +@import './component.scss';
  6 +@import 'vxe-table/styles/index.scss';
... ...
src/components/VxeTable/src/css/scrollbar.scss 0 → 100644
  1 +.vxe-grid_scrollbar {
  2 + ::-webkit-scrollbar {
  3 + width: 8px;
  4 + height: 8px;
  5 + }
  6 + ::-webkit-scrollbar-track {
  7 + background-color: #ffffff;
  8 + }
  9 + ::-webkit-scrollbar-thumb {
  10 + background-color: rgba(0, 0, 0, 0.1);
  11 + border-radius: 5px;
  12 + border: 1px solid #f1f1f1;
  13 + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  14 + }
  15 + ::-webkit-scrollbar-thumb:hover {
  16 + background-color: #a8a8a8;
  17 + }
  18 + ::-webkit-scrollbar-thumb:active {
  19 + background-color: #a8a8a8;
  20 + }
  21 + ::-webkit-scrollbar-corner {
  22 + background-color: #ffffff;
  23 + }
  24 +}
... ...
src/components/VxeTable/src/css/toolbar.scss 0 → 100644
  1 +.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer {
  2 + display: flex;
  3 +}
  4 +
  5 +.vxe-toolbar .vxe-tools--wrapper,
  6 +.vxe-toolbar .vxe-tools--operate button:first-child {
  7 + margin: 0;
  8 +}
  9 +
  10 +.vxe-toolbar .vxe-tools--wrapper,
  11 +.vxe-toolbar .vxe-tools--operate .vxe-button {
  12 + margin-left: 1px;
  13 + border-radius: 0 !important;
  14 +}
  15 +
  16 +.vxe-toolbar .vxe-tools--wrapper,
  17 +.vxe-toolbar .vxe-tools--operate button:first-child {
  18 + margin-left: 10px;
  19 +}
  20 +
  21 +.vxe-toolbar .vxe-tools--wrapper,
  22 +.vxe-toolbar .vxe-tools--operate .vxe-custom--wrapper {
  23 + margin-left: 1px;
  24 + border-radius: 0 !important;
  25 +}
  26 +
  27 +.vxe-toolbar .vxe-tools--wrapper,
  28 +.vxe-toolbar .vxe-tools--operate .vxe-custom--wrapper .vxe-button {
  29 + margin-left: 1px;
  30 +}
... ...
src/components/VxeTable/src/css/variable.scss 0 → 100644
  1 +$vxe-primary-color: rgb(9, 96, 189) !default;
  2 +$vxe-table-row-current-background-color: rgba(9, 96, 189, 0.3);
  3 +$vxe-table-row-hover-current-background-color: rgba(9, 96, 189, 0.2);
  4 +$vxe-table-column-hover-background-color: rgba(9, 96, 189, 0.3);
  5 +$vxe-table-column-current-background-color: rgba(9, 96, 189, 0.2);
  6 +$vxe-table-validate-error-color: #f56c6c;
... ...
src/components/VxeTable/src/emits.ts 0 → 100644
  1 +import tableEmits from 'vxe-table/es/table/src/emits';
  2 +
  3 +export const basicEmits = [
  4 + ...tableEmits,
  5 + 'page-change',
  6 + 'form-submit',
  7 + 'form-submit-invalid',
  8 + 'form-reset',
  9 + 'form-collapse',
  10 + 'form-toggle-collapse',
  11 + 'toolbar-button-click',
  12 + 'toolbar-tool-click',
  13 + 'zoom',
  14 +
  15 + //... 如有缺少在此处追加
  16 + // xxx
  17 +];
... ...
src/components/VxeTable/src/helper.ts 0 → 100644
  1 +import { ComponentType } from './componentType';
  2 +import { useI18n } from '/@/hooks/web/useI18n';
  3 +
  4 +const { t } = useI18n();
  5 +
  6 +/**
  7 + * @description: 生成placeholder
  8 + */
  9 +export function createPlaceholderMessage(component: ComponentType) {
  10 + if (!component) return;
  11 + if (component.includes('RangePicker')) {
  12 + return [t('common.chooseText'), t('common.chooseText')];
  13 + }
  14 + if (component.includes('Input') || component.includes('Complete') || component.includes('Rate')) {
  15 + return t('common.inputText');
  16 + } else {
  17 + return t('common.chooseText');
  18 + }
  19 +}
... ...
src/components/VxeTable/src/methods.ts 0 → 100644
  1 +import { GridMethods, TableMethods } from 'vxe-table';
  2 +
  3 +export const gridComponentMethodKeys: (keyof GridMethods | keyof TableMethods)[] = [
  4 + // vxe-grid 部分
  5 + 'dispatchEvent',
  6 + 'commitProxy',
  7 + 'getFormItems',
  8 + 'getPendingRecords',
  9 + 'zoom',
  10 + 'isMaximized',
  11 + 'maximize',
  12 + 'revert',
  13 + 'getProxyInfo',
  14 +
  15 + // vxe-table和vxe-grid公共部分
  16 + 'clearAll',
  17 + 'syncData',
  18 + 'updateData',
  19 + 'loadData',
  20 + 'reloadData',
  21 + 'reloadRow',
  22 + 'loadColumn',
  23 + 'reloadColumn',
  24 + 'getRowNode',
  25 + 'getColumnNode',
  26 + 'getRowIndex',
  27 + 'getVTRowIndex',
  28 + 'getVMRowIndex',
  29 + 'getColumnIndex',
  30 + 'getVTColumnIndex',
  31 + 'getVMColumnIndex',
  32 + 'createData',
  33 + 'createRow',
  34 + 'revertData',
  35 + 'clearData',
  36 + 'isInsertByRow',
  37 + 'isUpdateByRow',
  38 + 'getColumns',
  39 + 'getColumnById',
  40 + 'getColumnByField',
  41 + 'getTableColumn',
  42 + 'getData',
  43 + 'getCheckboxRecords',
  44 + 'getParentRow',
  45 + 'getRowSeq',
  46 + 'getRowById',
  47 + 'getRowid',
  48 + 'getTableData',
  49 + 'hideColumn',
  50 + 'showColumn',
  51 + 'resetColumn',
  52 + 'refreshColumn',
  53 + 'refreshScroll',
  54 + 'recalculate',
  55 + 'closeTooltip',
  56 + 'isAllCheckboxChecked',
  57 + 'isAllCheckboxIndeterminate',
  58 + 'getCheckboxIndeterminateRecords',
  59 + 'setCheckboxRow',
  60 + 'isCheckedByCheckboxRow',
  61 + 'isIndeterminateByCheckboxRow',
  62 + 'toggleCheckboxRow',
  63 + 'setAllCheckboxRow',
  64 + 'getRadioReserveRecord',
  65 + 'clearRadioReserve',
  66 + 'getCheckboxReserveRecords',
  67 + 'clearCheckboxReserve',
  68 + 'toggleAllCheckboxRow',
  69 + 'clearCheckboxRow',
  70 + 'setCurrentRow',
  71 + 'isCheckedByRadioRow',
  72 + 'setRadioRow',
  73 + 'clearCurrentRow',
  74 + 'clearRadioRow',
  75 + 'getCurrentRecord',
  76 + 'getRadioRecord',
  77 + 'getCurrentColumn',
  78 + 'setCurrentColumn',
  79 + 'clearCurrentColumn',
  80 + 'sort',
  81 + 'clearSort',
  82 + 'isSort',
  83 + 'getSortColumns',
  84 + 'closeFilter',
  85 + 'isFilter',
  86 + 'isRowExpandLoaded',
  87 + 'clearRowExpandLoaded',
  88 + 'reloadRowExpand',
  89 + 'reloadRowExpand',
  90 + 'toggleRowExpand',
  91 + 'setAllRowExpand',
  92 + 'setRowExpand',
  93 + 'isExpandByRow',
  94 + 'clearRowExpand',
  95 + 'clearRowExpandReserve',
  96 + 'getRowExpandRecords',
  97 + 'getTreeExpandRecords',
  98 + 'isTreeExpandLoaded',
  99 + 'clearTreeExpandLoaded',
  100 + 'reloadTreeExpand',
  101 + 'reloadTreeChilds',
  102 + 'toggleTreeExpand',
  103 + 'setAllTreeExpand',
  104 + 'setTreeExpand',
  105 + 'isTreeExpandByRow',
  106 + 'clearTreeExpand',
  107 + 'clearTreeExpandReserve',
  108 + 'getScroll',
  109 + 'scrollTo',
  110 + 'scrollToRow',
  111 + 'scrollToColumn',
  112 + 'clearScroll',
  113 + 'updateFooter',
  114 + 'updateStatus',
  115 + 'setMergeCells',
  116 + 'removeInsertRow',
  117 + 'removeMergeCells',
  118 + 'getMergeCells',
  119 + 'clearMergeCells',
  120 + 'setMergeFooterItems',
  121 + 'removeMergeFooterItems',
  122 + 'getMergeFooterItems',
  123 + 'clearMergeFooterItems',
  124 + 'openTooltip',
  125 + 'focus',
  126 + 'blur',
  127 + 'connect',
  128 +
  129 + //... 如有缺少在此处追加
  130 + // xxx
  131 +];
... ...
src/components/VxeTable/src/props.ts 0 → 100644
  1 +import { VxeGridPropTypes, VxeTablePropTypes } from 'vxe-table';
  2 +import tableProps from 'vxe-table/es/table/src/props';
  3 +import { CSSProperties } from 'vue';
  4 +
  5 +/**
  6 + * @description: table二次开发需要后,需要接受的所有prop属性
  7 + */
  8 +export const basicProps = {
  9 + ...tableProps,
  10 + columns: Array as PropType<VxeGridPropTypes.Columns>,
  11 + pagerConfig: {
  12 + type: Object as PropType<VxeGridPropTypes.PagerConfig>,
  13 + default: () => ({}),
  14 + },
  15 + proxyConfig: {
  16 + type: Object as PropType<VxeGridPropTypes.ProxyConfig>,
  17 + default: () => ({}),
  18 + },
  19 + toolbarConfig: {
  20 + type: Object as PropType<VxeGridPropTypes.ToolbarConfig>,
  21 + default: () => ({}),
  22 + },
  23 + formConfig: {
  24 + type: Object as PropType<VxeGridPropTypes.FormConfig>,
  25 + default: () => ({}),
  26 + },
  27 + zoomConfig: {
  28 + type: Object as PropType<VxeGridPropTypes.ZoomConfig>,
  29 + default: () => ({}),
  30 + },
  31 + printConfig: {
  32 + type: Object as PropType<VxeTablePropTypes.PrintConfig>,
  33 + default: () => ({}),
  34 + },
  35 + exportConfig: {
  36 + type: Object as PropType<VxeTablePropTypes.ExportConfig>,
  37 + default: () => ({}),
  38 + },
  39 + importConfig: {
  40 + type: Object as PropType<VxeTablePropTypes.ImportConfig>,
  41 + default: () => ({}),
  42 + },
  43 + size: String as PropType<VxeGridPropTypes.Size>,
  44 + tableClass: {
  45 + type: String,
  46 + default: '',
  47 + },
  48 + tableStyle: {
  49 + type: Object as PropType<CSSProperties>,
  50 + default: () => ({}),
  51 + },
  52 +};
... ...
src/components/VxeTable/src/setting.ts 0 → 100644
  1 +import { VXETable } from '..';
  2 +import componentSetting from '/@/settings/componentSetting';
  3 +
  4 +VXETable.setup(componentSetting.vxeTable);
... ...
src/components/VxeTable/src/types.ts 0 → 100644
  1 +import { CSSProperties } from 'vue';
  2 +import { VxeGridProps } from 'vxe-table';
  3 +
  4 +export type BasicTableProps = VxeGridProps & {
  5 + tableClass?: string;
  6 + tableStyle?: CSSProperties;
  7 +};
... ...
src/components/registerGlobComp.ts
1 1 import type { App } from 'vue';
2 2 import { Button } from './Button';
3 3 import { Input, Layout } from 'ant-design-vue';
  4 +import VXETable from 'vxe-table';
4 5  
5 6 export function registerGlobComp(app: App) {
6   - app.use(Input).use(Button).use(Layout);
  7 + app.use(Input).use(Button).use(Layout).use(VXETable);
7 8 }
... ...
src/locales/lang/en/routes/demo.ts
... ... @@ -198,5 +198,6 @@ export default {
198 198 editRowTable: 'Editable row',
199 199 authColumn: 'Auth column',
200 200 resizeParentHeightTable: 'resizeParentHeightTable',
  201 + vxeTable: 'VxeTable',
201 202 },
202 203 };
... ...
src/locales/lang/zh-CN/routes/demo.ts
... ... @@ -189,5 +189,6 @@ export default {
189 189 editRowTable: '可编辑行',
190 190 authColumn: '权限列',
191 191 resizeParentHeightTable: '继承父元素高度',
  192 + vxeTable: 'VxeTable',
192 193 },
193 194 };
... ...
src/main.ts
1 1 import 'virtual:windi-base.css';
2 2 import 'virtual:windi-components.css';
3 3 import '/@/design/index.less';
  4 +import '/@/components/VxeTable/src/css/index.scss';
4 5 import 'virtual:windi-utilities.css';
5 6 // Register icon sprite
6 7 import 'virtual:svg-icons-register';
... ...
src/router/routes/modules/demo/comp.ts
... ... @@ -255,6 +255,14 @@ const comp: AppRouteModule = {
255 255 title: t('routes.demo.table.resizeParentHeightTable'),
256 256 },
257 257 },
  258 + {
  259 + path: 'vxeTable',
  260 + name: 'VxeTableDemo',
  261 + component: () => import('/@/views/demo/table/VxeTable.vue'),
  262 + meta: {
  263 + title: t('routes.demo.table.vxeTable'),
  264 + },
  265 + },
258 266 ],
259 267 },
260 268 {
... ...
src/settings/componentSetting.ts
... ... @@ -42,6 +42,52 @@ export default {
42 42 return data;
43 43 },
44 44 },
  45 + vxeTable: {
  46 + table: {
  47 + border: true,
  48 + stripe: true,
  49 + columnConfig: {
  50 + resizable: true,
  51 + isCurrent: true,
  52 + isHover: true,
  53 + },
  54 + rowConfig: {
  55 + isCurrent: true,
  56 + isHover: true,
  57 + },
  58 + emptyRender: {
  59 + name: 'AEmpty',
  60 + },
  61 + printConfig: {},
  62 + exportConfig: {},
  63 + customConfig: {
  64 + storage: true,
  65 + },
  66 + },
  67 + grid: {
  68 + toolbarConfig: {
  69 + enabled: true,
  70 + export: true,
  71 + zoom: true,
  72 + print: true,
  73 + refresh: true,
  74 + custom: true,
  75 + },
  76 + pagerConfig: {
  77 + pageSizes: [20, 50, 100, 500],
  78 + pageSize: 20,
  79 + autoHidden: true,
  80 + },
  81 + proxyConfig: {
  82 + form: true,
  83 + props: {
  84 + result: 'items',
  85 + total: 'total',
  86 + },
  87 + },
  88 + zoomConfig: {},
  89 + },
  90 + },
45 91 // scrollbar setting
46 92 scrollbar: {
47 93 // Whether to use native scroll bar
... ...
src/views/demo/table/VxeTable.vue 0 → 100644
  1 +<template>
  2 + <PageWrapper
  3 + title="VxeTable表格"
  4 + content="只展示部分操作,详细功能请查看VxeTable官网事例"
  5 + contentFullHeight
  6 + fixedHeight
  7 + >
  8 + <VxeBasicTable ref="tableRef" v-bind="gridOptions">
  9 + <template #action="{ row }">
  10 + <TableAction :actions="createActions(row)" />
  11 + </template>
  12 + </VxeBasicTable>
  13 + </PageWrapper>
  14 +</template>
  15 +<script lang="ts" setup>
  16 + import { reactive, ref } from 'vue';
  17 + import { TableAction, ActionItem } from '/@/components/Table';
  18 + import { PageWrapper } from '/@/components/Page';
  19 + import { useMessage } from '/@/hooks/web/useMessage';
  20 + import { vxeTableColumns, vxeTableFormSchema } from './tableData';
  21 + import { VxeBasicTable, BasicTableProps, VxeGridInstance } from '/@/components/VxeTable';
  22 + import { demoListApi } from '/@/api/demo/table';
  23 +
  24 + const { createMessage } = useMessage();
  25 +
  26 + const tableRef = ref<VxeGridInstance>();
  27 +
  28 + const gridOptions = reactive<BasicTableProps>({
  29 + id: 'VxeTable',
  30 + editConfig: { trigger: 'click', mode: 'cell', showStatus: true },
  31 + columns: vxeTableColumns,
  32 + toolbarConfig: {
  33 + buttons: [
  34 + {
  35 + content: '自定义按钮',
  36 + buttonRender: {
  37 + name: 'AButton',
  38 + props: {
  39 + type: 'primary',
  40 + },
  41 + events: {
  42 + click: () => {
  43 + createMessage.success('点击了自定义按钮');
  44 + },
  45 + },
  46 + },
  47 + },
  48 + ],
  49 + },
  50 + formConfig: {
  51 + enabled: true,
  52 + items: vxeTableFormSchema,
  53 + },
  54 + height: 'auto',
  55 + proxyConfig: {
  56 + ajax: {
  57 + query: async ({ page, form }) => {
  58 + return demoListApi({
  59 + pageNum: page.currentPage,
  60 + pageSize: page.pageSize,
  61 + ...form,
  62 + });
  63 + },
  64 + queryAll: async ({ form }) => {
  65 + const data = await demoListApi(form);
  66 + return data;
  67 + },
  68 + },
  69 + },
  70 + });
  71 +
  72 + // 操作按钮(权限控制)
  73 + const createActions = (record) => {
  74 + const actions: ActionItem[] = [
  75 + {
  76 + label: '详情',
  77 + onClick: () => {
  78 + console.log(record);
  79 + },
  80 + },
  81 + {
  82 + label: '编辑',
  83 + onClick: () => {},
  84 + },
  85 + {
  86 + label: '删除',
  87 + color: 'error',
  88 + popConfirm: {
  89 + title: '是否确认删除',
  90 + confirm: () => {},
  91 + },
  92 + },
  93 + ];
  94 +
  95 + return actions;
  96 + };
  97 +</script>
... ...
src/views/demo/table/tableData.tsx
  1 +import { optionsListApi } from '/@/api/demo/select';
1 2 import { FormProps, FormSchema } from '/@/components/Table';
2 3 import { BasicColumn } from '/@/components/Table/src/types/table';
  4 +import { VxeFormItemProps, VxeGridPropTypes } from '/@/components/VxeTable';
3 5  
4 6 export function getBasicColumns(): BasicColumn[] {
5 7 return [
... ... @@ -302,3 +304,111 @@ export function getTreeTableData() {
302 304 return arr;
303 305 })();
304 306 }
  307 +
  308 +export const vxeTableColumns: VxeGridPropTypes.Columns = [
  309 + {
  310 + title: '序号',
  311 + type: 'seq',
  312 + fixed: 'left',
  313 + width: '50',
  314 + align: 'center',
  315 + },
  316 + {
  317 + title: '固定列',
  318 + field: 'name',
  319 + width: 150,
  320 + showOverflow: 'tooltip',
  321 + fixed: 'left',
  322 + },
  323 + {
  324 + title: '自适应列',
  325 + field: 'address',
  326 + },
  327 + {
  328 + title: '自定义列(自定义导出)',
  329 + field: 'no',
  330 + width: 200,
  331 + showOverflow: 'tooltip',
  332 + align: 'center',
  333 + slots: {
  334 + default: ({ row }) => {
  335 + const text = `自定义${row.no}`;
  336 + return [<div class="text-red-500">{text}</div>];
  337 + },
  338 + },
  339 + exportMethod: ({ row }) => {
  340 + return `自定义${row.no}导出`;
  341 + },
  342 + },
  343 + {
  344 + title: '自定义编辑',
  345 + width: 150,
  346 + field: 'name1',
  347 + align: 'center',
  348 + editRender: {
  349 + name: 'AInput',
  350 + placeholder: '请点击输入',
  351 + },
  352 + },
  353 + {
  354 + title: '开始时间',
  355 + width: 150,
  356 + field: 'beginTime',
  357 + showOverflow: 'tooltip',
  358 + align: 'center',
  359 + },
  360 + {
  361 + title: '结束时间',
  362 + width: 150,
  363 + field: 'endTime',
  364 + showOverflow: 'tooltip',
  365 + align: 'center',
  366 + },
  367 + {
  368 + width: 160,
  369 + title: '操作',
  370 + align: 'center',
  371 + slots: { default: 'action' },
  372 + fixed: 'right',
  373 + },
  374 +];
  375 +
  376 +export const vxeTableFormSchema: VxeFormItemProps[] = [
  377 + {
  378 + field: 'field0',
  379 + title: 'field0',
  380 + itemRender: {
  381 + name: 'AInput',
  382 + },
  383 + span: 6,
  384 + },
  385 + {
  386 + field: 'field1',
  387 + title: 'field1',
  388 + itemRender: {
  389 + name: 'AApiSelect',
  390 + props: {
  391 + api: optionsListApi,
  392 + resultField: 'list',
  393 + labelField: 'name',
  394 + valueField: 'id',
  395 + },
  396 + },
  397 + span: 6,
  398 + },
  399 + {
  400 + span: 12,
  401 + align: 'right',
  402 + className: '!pr-0',
  403 + itemRender: {
  404 + name: 'AButtonGroup',
  405 + children: [
  406 + {
  407 + props: { type: 'primary', content: '查询', htmlType: 'submit' },
  408 + attrs: { class: 'mr-2' },
  409 + },
  410 + { props: { type: 'default', htmlType: 'reset', content: '重置' } },
  411 + ],
  412 + },
  413 + },
  414 +];
... ...
yarn.lock
... ... @@ -1151,6 +1151,31 @@
1151 1151 minimatch "^3.1.2"
1152 1152 strip-json-comments "^3.1.1"
1153 1153  
  1154 +"@fast-csv/format@4.3.5":
  1155 + version "4.3.5"
  1156 + resolved "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz#90d83d1b47b6aaf67be70d6118f84f3e12ee1ff3"
  1157 + integrity sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==
  1158 + dependencies:
  1159 + "@types/node" "^14.0.1"
  1160 + lodash.escaperegexp "^4.1.2"
  1161 + lodash.isboolean "^3.0.3"
  1162 + lodash.isequal "^4.5.0"
  1163 + lodash.isfunction "^3.0.9"
  1164 + lodash.isnil "^4.0.0"
  1165 +
  1166 +"@fast-csv/parse@4.3.6":
  1167 + version "4.3.6"
  1168 + resolved "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz#ee47d0640ca0291034c7aa94039a744cfb019264"
  1169 + integrity sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==
  1170 + dependencies:
  1171 + "@types/node" "^14.0.1"
  1172 + lodash.escaperegexp "^4.1.2"
  1173 + lodash.groupby "^4.6.0"
  1174 + lodash.isfunction "^3.0.9"
  1175 + lodash.isnil "^4.0.0"
  1176 + lodash.isundefined "^3.0.1"
  1177 + lodash.uniq "^4.5.0"
  1178 +
1154 1179 "@humanwhocodes/config-array@^0.9.2":
1155 1180 version "0.9.5"
1156 1181 resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
... ... @@ -1719,6 +1744,11 @@
1719 1744 resolved "https://registry.npmmirror.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199"
1720 1745 integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ==
1721 1746  
  1747 +"@types/node@^14.0.1":
  1748 + version "14.18.36"
  1749 + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz#c414052cb9d43fab67d679d5f3c641be911f5835"
  1750 + integrity sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==
  1751 +
1722 1752 "@types/node@^14.17.1":
1723 1753 version "14.18.21"
1724 1754 resolved "https://registry.npmmirror.com/@types/node/-/node-14.18.21.tgz#0155ee46f6be28b2ff0342ca1a9b9fd4468bef41"
... ... @@ -2355,6 +2385,35 @@ archive-type@^4.0.0:
2355 2385 dependencies:
2356 2386 file-type "^4.2.0"
2357 2387  
  2388 +archiver-utils@^2.1.0:
  2389 + version "2.1.0"
  2390 + resolved "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2"
  2391 + integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
  2392 + dependencies:
  2393 + glob "^7.1.4"
  2394 + graceful-fs "^4.2.0"
  2395 + lazystream "^1.0.0"
  2396 + lodash.defaults "^4.2.0"
  2397 + lodash.difference "^4.5.0"
  2398 + lodash.flatten "^4.4.0"
  2399 + lodash.isplainobject "^4.0.6"
  2400 + lodash.union "^4.6.0"
  2401 + normalize-path "^3.0.0"
  2402 + readable-stream "^2.0.0"
  2403 +
  2404 +archiver@^5.0.0:
  2405 + version "5.3.1"
  2406 + resolved "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6"
  2407 + integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==
  2408 + dependencies:
  2409 + archiver-utils "^2.1.0"
  2410 + async "^3.2.3"
  2411 + buffer-crc32 "^0.2.1"
  2412 + readable-stream "^3.6.0"
  2413 + readdir-glob "^1.0.0"
  2414 + tar-stream "^2.2.0"
  2415 + zip-stream "^4.1.0"
  2416 +
2358 2417 arg@^4.1.0:
2359 2418 version "4.1.3"
2360 2419 resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
... ... @@ -2530,6 +2589,11 @@ before-after-hook@^2.2.0:
2530 2589 resolved "https://registry.npmmirror.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e"
2531 2590 integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==
2532 2591  
  2592 +big-integer@^1.6.17:
  2593 + version "1.6.51"
  2594 + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
  2595 + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
  2596 +
2533 2597 big.js@^5.2.2:
2534 2598 version "5.2.2"
2535 2599 resolved "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
... ... @@ -2594,6 +2658,14 @@ binary-mirror-config@^1:
2594 2658 resolved "https://registry.npmmirror.com/binary-mirror-config/-/binary-mirror-config-1.41.0.tgz#b68032588392bee9262971f977922d075513964b"
2595 2659 integrity sha512-ZiIhR1s6Sv1Fv6qCQqfPjx0Cj86BgFlhqNxZgHkQOWcxJcMbO3mj1iqsuVjowYqJqeZL8e52+IEv7IRnSX6T6w==
2596 2660  
  2661 +binary@~0.3.0:
  2662 + version "0.3.0"
  2663 + resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79"
  2664 + integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==
  2665 + dependencies:
  2666 + buffers "~0.1.1"
  2667 + chainsaw "~0.1.0"
  2668 +
2597 2669 bl@^1.0.0:
2598 2670 version "1.2.3"
2599 2671 resolved "https://registry.npmmirror.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
... ... @@ -2602,7 +2674,7 @@ bl@^1.0.0:
2602 2674 readable-stream "^2.3.5"
2603 2675 safe-buffer "^5.1.1"
2604 2676  
2605   -bl@^4.1.0:
  2677 +bl@^4.0.3, bl@^4.1.0:
2606 2678 version "4.1.0"
2607 2679 resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
2608 2680 integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
... ... @@ -2616,6 +2688,11 @@ bluebird@^3.5.0:
2616 2688 resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
2617 2689 integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
2618 2690  
  2691 +bluebird@~3.4.1:
  2692 + version "3.4.7"
  2693 + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
  2694 + integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==
  2695 +
2619 2696 boolbase@^1.0.0:
2620 2697 version "1.0.0"
2621 2698 resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
... ... @@ -2682,7 +2759,7 @@ buffer-alloc@^1.2.0:
2682 2759 buffer-alloc-unsafe "^1.1.0"
2683 2760 buffer-fill "^1.0.0"
2684 2761  
2685   -buffer-crc32@~0.2.3:
  2762 +buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3:
2686 2763 version "0.2.13"
2687 2764 resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
2688 2765 integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
... ... @@ -2697,6 +2774,11 @@ buffer-from@^1.0.0:
2697 2774 resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
2698 2775 integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
2699 2776  
  2777 +buffer-indexof-polyfill@~1.0.0:
  2778 + version "1.0.2"
  2779 + resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c"
  2780 + integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==
  2781 +
2700 2782 buffer@^5.2.1, buffer@^5.5.0:
2701 2783 version "5.7.1"
2702 2784 resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
... ... @@ -2705,6 +2787,11 @@ buffer@^5.2.1, buffer@^5.5.0:
2705 2787 base64-js "^1.3.1"
2706 2788 ieee754 "^1.1.13"
2707 2789  
  2790 +buffers@~0.1.1:
  2791 + version "0.1.1"
  2792 + resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
  2793 + integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==
  2794 +
2708 2795 builtin-modules@^3.0.0, builtin-modules@^3.1.0:
2709 2796 version "3.3.0"
2710 2797 resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
... ... @@ -2830,6 +2917,13 @@ cfb@~1.2.1:
2830 2917 adler-32 "~1.3.0"
2831 2918 crc-32 "~1.2.0"
2832 2919  
  2920 +chainsaw@~0.1.0:
  2921 + version "0.1.0"
  2922 + resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98"
  2923 + integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==
  2924 + dependencies:
  2925 + traverse ">=0.3.0 <0.4"
  2926 +
2833 2927 chalk@^1.0.0, chalk@^1.1.3:
2834 2928 version "1.1.3"
2835 2929 resolved "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
... ... @@ -2881,7 +2975,7 @@ chardet@^0.7.0:
2881 2975 resolved "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
2882 2976 integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
2883 2977  
2884   -chokidar@^3.5.2:
  2978 +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.2:
2885 2979 version "3.5.3"
2886 2980 resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
2887 2981 integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
... ... @@ -3083,6 +3177,16 @@ component-emitter@^1.2.1:
3083 3177 resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
3084 3178 integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
3085 3179  
  3180 +compress-commons@^4.1.0:
  3181 + version "4.1.1"
  3182 + resolved "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d"
  3183 + integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==
  3184 + dependencies:
  3185 + buffer-crc32 "^0.2.13"
  3186 + crc32-stream "^4.0.2"
  3187 + normalize-path "^3.0.0"
  3188 + readable-stream "^3.6.0"
  3189 +
3086 3190 compute-scroll-into-view@^1.0.17:
3087 3191 version "1.0.17"
3088 3192 resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab"
... ... @@ -3366,11 +3470,19 @@ cosmiconfig@^7, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
3366 3470 path-type "^4.0.0"
3367 3471 yaml "^1.10.0"
3368 3472  
3369   -crc-32@~1.2.0, crc-32@~1.2.1:
  3473 +crc-32@^1.2.0, crc-32@~1.2.0, crc-32@~1.2.1:
3370 3474 version "1.2.2"
3371 3475 resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
3372 3476 integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
3373 3477  
  3478 +crc32-stream@^4.0.2:
  3479 + version "4.0.2"
  3480 + resolved "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007"
  3481 + integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==
  3482 + dependencies:
  3483 + crc-32 "^1.2.0"
  3484 + readable-stream "^3.4.0"
  3485 +
3374 3486 create-require@^1.1.0:
3375 3487 version "1.1.1"
3376 3488 resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
... ... @@ -3521,6 +3633,11 @@ dayjs@^1.10.5, dayjs@^1.11.1:
3521 3633 resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.3.tgz#4754eb694a624057b9ad2224b67b15d552589258"
3522 3634 integrity sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==
3523 3635  
  3636 +dayjs@^1.8.34:
  3637 + version "1.11.7"
  3638 + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2"
  3639 + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==
  3640 +
3524 3641 de-indent@^1.0.2:
3525 3642 version "1.0.2"
3526 3643 resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
... ... @@ -3839,6 +3956,13 @@ download@^7.1.0:
3839 3956 p-event "^2.1.0"
3840 3957 pify "^3.0.0"
3841 3958  
  3959 +duplexer2@~0.1.4:
  3960 + version "0.1.4"
  3961 + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
  3962 + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==
  3963 + dependencies:
  3964 + readable-stream "^2.0.2"
  3965 +
3842 3966 duplexer3@^0.1.4:
3843 3967 version "0.1.4"
3844 3968 resolved "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
... ... @@ -3899,7 +4023,7 @@ encodeurl@~1.0.2:
3899 4023 resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
3900 4024 integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
3901 4025  
3902   -end-of-stream@^1.0.0, end-of-stream@^1.1.0:
  4026 +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
3903 4027 version "1.4.4"
3904 4028 resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
3905 4029 integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
... ... @@ -4313,6 +4437,21 @@ etag@^1.8.1:
4313 4437 resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
4314 4438 integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
4315 4439  
  4440 +exceljs@^4.3.0:
  4441 + version "4.3.0"
  4442 + resolved "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz#939bc0d4c59c200acadb7051be34d25c109853c4"
  4443 + integrity sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==
  4444 + dependencies:
  4445 + archiver "^5.0.0"
  4446 + dayjs "^1.8.34"
  4447 + fast-csv "^4.3.1"
  4448 + jszip "^3.5.0"
  4449 + readable-stream "^3.6.0"
  4450 + saxes "^5.0.1"
  4451 + tmp "^0.2.0"
  4452 + unzipper "^0.10.11"
  4453 + uuid "^8.3.0"
  4454 +
4316 4455 exec-buffer@^3.0.0:
4317 4456 version "3.2.0"
4318 4457 resolved "https://registry.npmmirror.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
... ... @@ -4460,6 +4599,14 @@ extglob@^2.0.2:
4460 4599 snapdragon "^0.8.1"
4461 4600 to-regex "^3.0.1"
4462 4601  
  4602 +fast-csv@^4.3.1:
  4603 + version "4.3.6"
  4604 + resolved "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz#70349bdd8fe4d66b1130d8c91820b64a21bc4a63"
  4605 + integrity sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==
  4606 + dependencies:
  4607 + "@fast-csv/format" "4.3.5"
  4608 + "@fast-csv/parse" "4.3.6"
  4609 +
4463 4610 fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
4464 4611 version "3.1.3"
4465 4612 resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
... ... @@ -4745,6 +4892,16 @@ fsevents@~2.3.2:
4745 4892 resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
4746 4893 integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
4747 4894  
  4895 +fstream@^1.0.12:
  4896 + version "1.0.12"
  4897 + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
  4898 + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
  4899 + dependencies:
  4900 + graceful-fs "^4.1.2"
  4901 + inherits "~2.0.0"
  4902 + mkdirp ">=0.5 0"
  4903 + rimraf "2"
  4904 +
4748 4905 function-bind@^1.1.1:
4749 4906 version "1.1.1"
4750 4907 resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
... ... @@ -4924,7 +5081,7 @@ glob-parent@^6.0.1:
4924 5081 dependencies:
4925 5082 is-glob "^4.0.3"
4926 5083  
4927   -glob@^7.1.3, glob@^7.1.6:
  5084 +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
4928 5085 version "7.2.3"
4929 5086 resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
4930 5087 integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
... ... @@ -5369,6 +5526,16 @@ imagemin@^7.0.1:
5369 5526 p-pipe "^3.0.0"
5370 5527 replace-ext "^1.0.0"
5371 5528  
  5529 +immediate@~3.0.5:
  5530 + version "3.0.6"
  5531 + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
  5532 + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
  5533 +
  5534 +immutable@^4.0.0:
  5535 + version "4.2.2"
  5536 + resolved "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz#2da9ff4384a4330c36d4d1bc88e90f9e0b0ccd16"
  5537 + integrity sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==
  5538 +
5372 5539 import-fresh@^3.0.0, import-fresh@^3.2.1:
5373 5540 version "3.3.0"
5374 5541 resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
... ... @@ -5414,7 +5581,7 @@ inflight@^1.0.4:
5414 5581 once "^1.3.0"
5415 5582 wrappy "1"
5416 5583  
5417   -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
  5584 +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3:
5418 5585 version "2.0.4"
5419 5586 resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
5420 5587 integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
... ... @@ -5986,6 +6153,16 @@ jsonpointer@^5.0.0:
5986 6153 resolved "https://registry.npmmirror.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072"
5987 6154 integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==
5988 6155  
  6156 +jszip@^3.5.0:
  6157 + version "3.10.1"
  6158 + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2"
  6159 + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==
  6160 + dependencies:
  6161 + lie "~3.3.0"
  6162 + pako "~1.0.2"
  6163 + readable-stream "~2.3.6"
  6164 + setimmediate "^1.0.5"
  6165 +
5989 6166 junk@^3.1.0:
5990 6167 version "3.1.0"
5991 6168 resolved "https://registry.npmmirror.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
... ... @@ -6032,6 +6209,13 @@ kolorist@^1.5.1:
6032 6209 resolved "https://registry.npmmirror.com/kolorist/-/kolorist-1.5.1.tgz#c3d66dc4fabde4f6b7faa6efda84c00491f9e52b"
6033 6210 integrity sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==
6034 6211  
  6212 +lazystream@^1.0.0:
  6213 + version "1.0.1"
  6214 + resolved "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638"
  6215 + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==
  6216 + dependencies:
  6217 + readable-stream "^2.0.5"
  6218 +
6035 6219 less@^4.1.2:
6036 6220 version "4.1.3"
6037 6221 resolved "https://registry.npmmirror.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246"
... ... @@ -6062,6 +6246,13 @@ levn@^0.4.1:
6062 6246 prelude-ls "^1.2.1"
6063 6247 type-check "~0.4.0"
6064 6248  
  6249 +lie@~3.3.0:
  6250 + version "3.3.0"
  6251 + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
  6252 + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
  6253 + dependencies:
  6254 + immediate "~3.0.5"
  6255 +
6065 6256 lilconfig@2.0.4:
6066 6257 version "2.0.4"
6067 6258 resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082"
... ... @@ -6092,6 +6283,11 @@ lint-staged@12.3.7:
6092 6283 supports-color "^9.2.1"
6093 6284 yaml "^1.10.2"
6094 6285  
  6286 +listenercount@~1.0.1:
  6287 + version "1.0.1"
  6288 + resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937"
  6289 + integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==
  6290 +
6095 6291 listr2@^4.0.1:
6096 6292 version "4.0.5"
6097 6293 resolved "https://registry.npmmirror.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5"
... ... @@ -6168,11 +6364,66 @@ lodash.debounce@^4.0.8:
6168 6364 resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
6169 6365 integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
6170 6366  
  6367 +lodash.defaults@^4.2.0:
  6368 + version "4.2.0"
  6369 + resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
  6370 + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==
  6371 +
  6372 +lodash.difference@^4.5.0:
  6373 + version "4.5.0"
  6374 + resolved "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
  6375 + integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==
  6376 +
  6377 +lodash.escaperegexp@^4.1.2:
  6378 + version "4.1.2"
  6379 + resolved "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
  6380 + integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==
  6381 +
  6382 +lodash.flatten@^4.4.0:
  6383 + version "4.4.0"
  6384 + resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
  6385 + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
  6386 +
  6387 +lodash.groupby@^4.6.0:
  6388 + version "4.6.0"
  6389 + resolved "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1"
  6390 + integrity sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==
  6391 +
  6392 +lodash.isboolean@^3.0.3:
  6393 + version "3.0.3"
  6394 + resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
  6395 + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==
  6396 +
  6397 +lodash.isequal@^4.5.0:
  6398 + version "4.5.0"
  6399 + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
  6400 + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
  6401 +
  6402 +lodash.isfunction@^3.0.9:
  6403 + version "3.0.9"
  6404 + resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051"
  6405 + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==
  6406 +
6171 6407 lodash.ismatch@^4.4.0:
6172 6408 version "4.4.0"
6173 6409 resolved "https://registry.npmmirror.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37"
6174 6410 integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==
6175 6411  
  6412 +lodash.isnil@^4.0.0:
  6413 + version "4.0.0"
  6414 + resolved "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz#49e28cd559013458c814c5479d3c663a21bfaa6c"
  6415 + integrity sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==
  6416 +
  6417 +lodash.isplainobject@^4.0.6:
  6418 + version "4.0.6"
  6419 + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
  6420 + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
  6421 +
  6422 +lodash.isundefined@^3.0.1:
  6423 + version "3.0.1"
  6424 + resolved "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48"
  6425 + integrity sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==
  6426 +
6176 6427 lodash.merge@^4.6.2:
6177 6428 version "4.6.2"
6178 6429 resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
... ... @@ -6188,6 +6439,16 @@ lodash.truncate@^4.4.2:
6188 6439 resolved "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
6189 6440 integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
6190 6441  
  6442 +lodash.union@^4.6.0:
  6443 + version "4.6.0"
  6444 + resolved "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
  6445 + integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
  6446 +
  6447 +lodash.uniq@^4.5.0:
  6448 + version "4.5.0"
  6449 + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
  6450 + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
  6451 +
6191 6452 lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
6192 6453 version "4.17.21"
6193 6454 resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
... ... @@ -6493,6 +6754,13 @@ minimatch@^5.0.1:
6493 6754 dependencies:
6494 6755 brace-expansion "^2.0.1"
6495 6756  
  6757 +minimatch@^5.1.0:
  6758 + version "5.1.6"
  6759 + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
  6760 + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
  6761 + dependencies:
  6762 + brace-expansion "^2.0.1"
  6763 +
6496 6764 minimatch@^5.1.1:
6497 6765 version "5.1.2"
6498 6766 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff"
... ... @@ -6514,6 +6782,11 @@ minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
6514 6782 resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
6515 6783 integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
6516 6784  
  6785 +minimist@^1.2.6:
  6786 + version "1.2.7"
  6787 + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
  6788 + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
  6789 +
6517 6790 mixin-deep@^1.2.0:
6518 6791 version "1.3.2"
6519 6792 resolved "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
... ... @@ -6522,6 +6795,13 @@ mixin-deep@^1.2.0:
6522 6795 for-in "^1.0.2"
6523 6796 is-extendable "^1.0.1"
6524 6797  
  6798 +"mkdirp@>=0.5 0":
  6799 + version "0.5.6"
  6800 + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
  6801 + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
  6802 + dependencies:
  6803 + minimist "^1.2.6"
  6804 +
6525 6805 mockjs@^1.1.0:
6526 6806 version "1.1.0"
6527 6807 resolved "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz#e6a0c378e91906dbaff20911cc0273b3c7d75b06"
... ... @@ -6995,6 +7275,11 @@ p-try@^2.0.0:
6995 7275 resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
6996 7276 integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
6997 7277  
  7278 +pako@~1.0.2:
  7279 + version "1.0.11"
  7280 + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
  7281 + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
  7282 +
6998 7283 param-case@^3.0.4:
6999 7284 version "3.0.4"
7000 7285 resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"
... ... @@ -7511,7 +7796,7 @@ read-pkg@^5.2.0:
7511 7796 parse-json "^5.0.0"
7512 7797 type-fest "^0.6.0"
7513 7798  
7514   -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0:
  7799 +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
7515 7800 version "3.6.0"
7516 7801 resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
7517 7802 integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
... ... @@ -7520,7 +7805,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stre
7520 7805 string_decoder "^1.1.1"
7521 7806 util-deprecate "^1.0.1"
7522 7807  
7523   -readable-stream@^2.0.0, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6:
  7808 +readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6:
7524 7809 version "2.3.7"
7525 7810 resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
7526 7811 integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
... ... @@ -7533,6 +7818,13 @@ readable-stream@^2.0.0, readable-stream@^2.3.0, readable-stream@^2.3.5, readable
7533 7818 string_decoder "~1.1.1"
7534 7819 util-deprecate "~1.0.1"
7535 7820  
  7821 +readdir-glob@^1.0.0:
  7822 + version "1.1.2"
  7823 + resolved "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz#b185789b8e6a43491635b6953295c5c5e3fd224c"
  7824 + integrity sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==
  7825 + dependencies:
  7826 + minimatch "^5.1.0"
  7827 +
7536 7828 readdirp@~3.6.0:
7537 7829 version "3.6.0"
7538 7830 resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
... ... @@ -7734,14 +8026,14 @@ rfdc@^1.3.0:
7734 8026 resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
7735 8027 integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
7736 8028  
7737   -rimraf@^2.5.4:
  8029 +rimraf@2, rimraf@^2.5.4:
7738 8030 version "2.7.1"
7739 8031 resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
7740 8032 integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
7741 8033 dependencies:
7742 8034 glob "^7.1.3"
7743 8035  
7744   -rimraf@^3.0.2:
  8036 +rimraf@^3.0.0, rimraf@^3.0.2:
7745 8037 version "3.0.2"
7746 8038 resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
7747 8039 integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
... ... @@ -7824,11 +8116,27 @@ safe-regex@^1.1.0:
7824 8116 resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
7825 8117 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
7826 8118  
  8119 +sass@^1.57.1:
  8120 + version "1.57.1"
  8121 + resolved "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5"
  8122 + integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==
  8123 + dependencies:
  8124 + chokidar ">=3.0.0 <4.0.0"
  8125 + immutable "^4.0.0"
  8126 + source-map-js ">=0.6.2 <2.0.0"
  8127 +
7827 8128 sax@^1.2.4:
7828 8129 version "1.2.4"
7829 8130 resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
7830 8131 integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
7831 8132  
  8133 +saxes@^5.0.1:
  8134 + version "5.0.1"
  8135 + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
  8136 + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
  8137 + dependencies:
  8138 + xmlchars "^2.2.0"
  8139 +
7832 8140 scroll-into-view-if-needed@^2.2.25:
7833 8141 version "2.2.29"
7834 8142 resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz#551791a84b7e2287706511f8c68161e4990ab885"
... ... @@ -7908,6 +8216,11 @@ set-value@^2.0.0, set-value@^2.0.1:
7908 8216 is-plain-object "^2.0.3"
7909 8217 split-string "^3.0.1"
7910 8218  
  8219 +setimmediate@^1.0.5, setimmediate@~1.0.4:
  8220 + version "1.0.5"
  8221 + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
  8222 + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
  8223 +
7911 8224 shallow-equal@^1.0.0:
7912 8225 version "1.2.1"
7913 8226 resolved "https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da"
... ... @@ -8058,7 +8371,7 @@ sortablejs@^1.15.0:
8058 8371 resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.0.tgz#53230b8aa3502bb77a29e2005808ffdb4a5f7e2a"
8059 8372 integrity sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==
8060 8373  
8061   -source-map-js@^1.0.2:
  8374 +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
8062 8375 version "1.0.2"
8063 8376 resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
8064 8377 integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
... ... @@ -8578,6 +8891,17 @@ tar-stream@^1.5.2:
8578 8891 to-buffer "^1.1.1"
8579 8892 xtend "^4.0.0"
8580 8893  
  8894 +tar-stream@^2.2.0:
  8895 + version "2.2.0"
  8896 + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
  8897 + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
  8898 + dependencies:
  8899 + bl "^4.0.3"
  8900 + end-of-stream "^1.4.1"
  8901 + fs-constants "^1.0.0"
  8902 + inherits "^2.0.3"
  8903 + readable-stream "^3.1.1"
  8904 +
8581 8905 temp-dir@^1.0.0:
8582 8906 version "1.0.0"
8583 8907 resolved "https://registry.npmmirror.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
... ... @@ -8676,6 +9000,13 @@ tmp@^0.0.33:
8676 9000 dependencies:
8677 9001 os-tmpdir "~1.0.2"
8678 9002  
  9003 +tmp@^0.2.0:
  9004 + version "0.2.1"
  9005 + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
  9006 + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
  9007 + dependencies:
  9008 + rimraf "^3.0.0"
  9009 +
8679 9010 to-buffer@^1.1.1:
8680 9011 version "1.1.1"
8681 9012 resolved "https://registry.npmmirror.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
... ... @@ -8730,6 +9061,11 @@ tr46@~0.0.3:
8730 9061 resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
8731 9062 integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
8732 9063  
  9064 +"traverse@>=0.3.0 <0.4":
  9065 + version "0.3.9"
  9066 + resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
  9067 + integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==
  9068 +
8733 9069 traverse@^0.6.6:
8734 9070 version "0.6.6"
8735 9071 resolved "https://registry.npmmirror.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
... ... @@ -8933,6 +9269,22 @@ unset-value@^1.0.0:
8933 9269 has-value "^0.3.1"
8934 9270 isobject "^3.0.0"
8935 9271  
  9272 +unzipper@^0.10.11:
  9273 + version "0.10.11"
  9274 + resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e"
  9275 + integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==
  9276 + dependencies:
  9277 + big-integer "^1.6.17"
  9278 + binary "~0.3.0"
  9279 + bluebird "~3.4.1"
  9280 + buffer-indexof-polyfill "~1.0.0"
  9281 + duplexer2 "~0.1.4"
  9282 + fstream "^1.0.12"
  9283 + graceful-fs "^4.2.2"
  9284 + listenercount "~1.0.1"
  9285 + readable-stream "~2.3.6"
  9286 + setimmediate "~1.0.4"
  9287 +
8936 9288 upath@^1.2.0:
8937 9289 version "1.2.0"
8938 9290 resolved "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
... ... @@ -9011,6 +9363,11 @@ uuid@^3.0.1, uuid@^3.3.2:
9011 9363 resolved "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
9012 9364 integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
9013 9365  
  9366 +uuid@^8.3.0:
  9367 + version "8.3.2"
  9368 + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
  9369 + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
  9370 +
9014 9371 v8-compile-cache-lib@^3.0.1:
9015 9372 version "3.0.1"
9016 9373 resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
... ... @@ -9296,6 +9653,16 @@ vue@^3.2.45:
9296 9653 "@vue/server-renderer" "3.2.45"
9297 9654 "@vue/shared" "3.2.45"
9298 9655  
  9656 +vxe-table-plugin-export-xlsx@^3.0.4:
  9657 + version "3.0.4"
  9658 + resolved "https://registry.npmjs.org/vxe-table-plugin-export-xlsx/-/vxe-table-plugin-export-xlsx-3.0.4.tgz#35faabc0791b4e9aa516b78ea3fd45e67314afe4"
  9659 + integrity sha512-Og/NbXRIb+BS6sJ48oDNVrZnlkcpaCd/zS8JBAZjHLgioWr1Xoob6FEpaeXBebGPPgTumZNUrrBO57JhhYAerA==
  9660 +
  9661 +vxe-table@^4.3.9:
  9662 + version "4.3.9"
  9663 + resolved "https://registry.npmjs.org/vxe-table/-/vxe-table-4.3.9.tgz#4b288e5e666eb4fb47e9732d51d967e2aa69b61f"
  9664 + integrity sha512-Ns7Ooa7lOHBpks90i0k0BMNyxfMpUo39ryxTgKE41X3xVnI9tGQs2U6+klfDlsuqYfmG3ibyzHN3OCrWbbKo4Q==
  9665 +
9299 9666 warning@^4.0.0:
9300 9667 version "4.0.3"
9301 9668 resolved "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
... ... @@ -9581,6 +9948,11 @@ write-file-atomic@^4.0.1:
9581 9948 imurmurhash "^0.1.4"
9582 9949 signal-exit "^3.0.7"
9583 9950  
  9951 +xe-utils@^3.5.7:
  9952 + version "3.5.7"
  9953 + resolved "https://registry.npmjs.org/xe-utils/-/xe-utils-3.5.7.tgz#2c885852dfadd5c8beeffdc1f884f8ceb962c669"
  9954 + integrity sha512-3H+fDBKBR2wLJgyA7k9C/w1Xljx6Maml5ukV0WDY06HjYyGs2FEz6XhcwRCLIDXX4pBP3Gu0nX9DbCeuuRA2Ew==
  9955 +
9584 9956 xlsx@^0.18.5:
9585 9957 version "0.18.5"
9586 9958 resolved "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0"
... ... @@ -9594,6 +9966,11 @@ xlsx@^0.18.5:
9594 9966 wmf "~1.0.1"
9595 9967 word "~0.3.0"
9596 9968  
  9969 +xmlchars@^2.2.0:
  9970 + version "2.2.0"
  9971 + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
  9972 + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
  9973 +
9597 9974 xtend@^4.0.0, xtend@~4.0.1:
9598 9975 version "4.0.2"
9599 9976 resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
... ... @@ -9703,6 +10080,15 @@ yocto-queue@^0.1.0:
9703 10080 resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
9704 10081 integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
9705 10082  
  10083 +zip-stream@^4.1.0:
  10084 + version "4.1.0"
  10085 + resolved "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79"
  10086 + integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==
  10087 + dependencies:
  10088 + archiver-utils "^2.1.0"
  10089 + compress-commons "^4.1.0"
  10090 + readable-stream "^3.6.0"
  10091 +
9706 10092 zrender@5.3.2:
9707 10093 version "5.3.2"
9708 10094 resolved "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz#f67b11d36d3d020d62411d3bb123eb1c93cccd69"
... ...