@ecan-bi/datav 1.1.98 → 1.1.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/common/echarts/composables/api.ts","../src/common/echarts/composables/autoresize.ts","../src/common/echarts/composables/loading.ts","../src/common/echarts/utils.ts","../src/common/echarts/Echarts.ts","../node_modules/@ctrl/tinycolor/dist/module/util.js","../node_modules/@ctrl/tinycolor/dist/module/conversion.js","../node_modules/@ctrl/tinycolor/dist/module/css-color-names.js","../node_modules/@ctrl/tinycolor/dist/module/format-input.js","../node_modules/@ant-design/colors/dist/index.esm.js","../node_modules/@ant-design/icons-vue/es/insert-css.js","../node_modules/@ant-design/icons-vue/es/utils.js","../node_modules/@ant-design/icons-vue/es/components/IconBase.js","../node_modules/@ant-design/icons-vue/es/components/twoTonePrimaryColor.js","../node_modules/@ant-design/icons-vue/es/components/AntdIcon.js","../node_modules/@ant-design/icons-svg/es/asn/CloseOutlined.js","../node_modules/@ant-design/icons-vue/es/icons/CloseOutlined.js","../node_modules/@ant-design/icons-svg/es/asn/LoadingOutlined.js","../node_modules/@ant-design/icons-vue/es/icons/LoadingOutlined.js","../src/common/spin/Spin.vue","../src/common/spin/Spin.vue","../src/common/skeleton/Skeleton.vue","../src/common/skeleton/Skeleton.vue","../node_modules/@vue/shared/dist/shared.esm-bundler.js","../src/utils/withInstall.ts","../src/utils/props.ts","../src/setting/page-config/props.ts","../src/hooks/usePickComponentStyle.ts","../src/utils/constant.ts","../src/hooks/useOnEvent.ts","../src/hooks/useEmitEvent.ts","../src/hooks/useTransformChartDataByAttrValue.ts","../src/utils/request.ts","../src/utils/util.ts","../src/utils/runCode.ts","../src/hooks/useVariablesInText.ts","../src/hooks/useRequestData.ts","../src/hooks/useTransformChartDataByAttrKey.ts","../src/hooks/useImagePath.ts","../src/hooks/usePageUrl.ts","../src/hooks/useValueFormatter.ts","../src/hooks/useIndicatorData.ts","../src/hooks/useHrefParamsToGlobalVariables.ts","../src/setting/page-config/PageConfig.vue","../src/setting/page-config/PageConfig.vue","../src/setting/page-config/index.ts","../src/setting/provider-config/props.ts","../src/setting/provider-config/ProviderConfig.vue","../src/setting/provider-config/ProviderConfig.vue","../src/setting/provider-config/index.ts","../src/text/text/props.ts","../src/assets/go-up.png","../src/assets/go-down.png","../src/text/text/Text.vue","../src/text/text/Text.vue","../src/text/text/index.ts","../src/text/scroll-text/ScrollText.vue","../src/text/scroll-text/index.ts","../src/text/time-display/props.ts","../src/text/time-display/TimeDisplay.vue","../src/text/time-display/TimeDisplay.vue","../src/text/time-display/index.ts","../src/text/list/props.ts","../src/text/list/List.vue","../src/text/list/List.vue","../src/text/list/index.ts","../src/text/proportion/props.ts","../src/text/proportion/Proportion.vue","../src/text/proportion/Proportion.vue","../src/text/proportion/index.ts","../src/control/input/props.ts","../src/control/input/Input.vue","../src/control/input/Input.vue","../src/control/input/index.ts","../src/control/date-picker/props.ts","../src/control/date-picker/DatePicker.vue","../src/control/date-picker/DatePicker.vue","../src/control/date-picker/index.ts","../src/control/range-picker/props.ts","../src/control/range-picker/RangePicker.vue","../src/control/range-picker/RangePicker.vue","../src/control/range-picker/index.ts","../src/control/button/props.ts","../src/control/button/Button.vue","../src/control/button/Button.vue","../src/control/button/index.ts","../src/control/checkbox/props.ts","../src/control/checkbox/Checkbox.vue","../src/control/checkbox/Checkbox.vue","../src/control/checkbox/index.ts","../src/control/select/props.ts","../src/control/select/Select.vue","../src/control/select/Select.vue","../src/control/select/index.ts","../src/control/tree-select/props.ts","../src/control/tree-select/TreeSelect.vue","../src/control/tree-select/TreeSelect.vue","../src/control/tree-select/index.ts","../src/graph/pie/props.ts","../src/hooks/useDownloadFile.ts","../src/container/modal/props.ts","../src/container/modal/Modal.vue","../src/container/modal/Modal.vue","../src/container/modal/index.ts","../src/graph/pie/Pie.vue","../src/graph/pie/Pie.vue","../src/graph/pie/index.ts","../src/graph/line/props.ts","../src/graph/line/Line.vue","../src/graph/line/Line.vue","../src/graph/line/index.ts","../src/graph/bar/props.ts","../src/graph/bar/Bar.vue","../src/graph/bar/Bar.vue","../src/graph/bar/index.ts","../src/graph/scatter/props.ts","../src/graph/scatter/Scatter.vue","../src/graph/scatter/Scatter.vue","../src/graph/scatter/index.ts","../src/graph/custom-graph/props.ts","../src/graph/custom-graph/CustomGraph.vue","../src/graph/custom-graph/CustomGraph.vue","../src/graph/custom-graph/index.ts","../src/graph/combo-graph/props.ts","../src/graph/combo-graph/ComboGraph.vue","../src/graph/combo-graph/ComboGraph.vue","../src/graph/combo-graph/index.ts","../src/container/border/props.ts","../src/container/border/Border.vue","../src/assets/border-title-decoration-left.png","../src/assets/border-title-decoration-right.png","../src/container/border/Border.vue","../src/container/border/index.ts","../src/container/tabs/props.ts","../src/container/tabs/Tabs.vue","../src/container/tabs/Tabs.vue","../src/container/tabs/index.ts","../src/media/image/props.ts","../src/media/image/Image.vue","../src/media/image/Image.vue","../src/media/image/index.ts","../src/media/iframe/props.ts","../src/media/iframe/Iframe.vue","../src/media/iframe/Iframe.vue","../src/media/iframe/index.ts","../src/table/table/props.ts","../src/table/table/Table.vue","../src/table/table/Table.vue","../src/table/table/index.ts","../src/map/map/props.ts","../src/map/map/Map.vue","../src/map/map/Map.vue","../src/map/map/index.ts","../src/index.ts"],"sourcesContent":["import { Ref } from 'vue'\nimport { EChartsType, Option } from '../types'\n\nconst METHOD_NAMES = [\n 'getWidth',\n 'getHeight',\n 'getDom',\n 'getOption',\n 'resize',\n 'dispatchAction',\n 'convertToPixel',\n 'convertFromPixel',\n 'containPixel',\n 'getDataURL',\n 'getConnectedDataURL',\n 'appendData',\n 'clear',\n 'isDisposed',\n 'dispose'\n] as const\ntype MethodName = typeof METHOD_NAMES[number];\n\ntype PublicMethods = Pick<EChartsType, MethodName>;\n\nexport function usePublicAPI (\n chart: Ref<EChartsType | undefined>,\n init: (option?: Option) => void\n): PublicMethods {\n function makePublicMethod<T extends MethodName> (\n name: T\n ): (...args: Parameters<EChartsType[T]>) => ReturnType<EChartsType[T]> {\n return (...args) => {\n if (!chart.value) {\n init()\n }\n\n if (!chart.value) {\n throw new Error('ECharts is not initialized yet.')\n }\n return (chart.value[name] as any).apply(chart.value, args)\n }\n }\n\n function makePublicMethods (): PublicMethods {\n const methods = Object.create(null)\n METHOD_NAMES.forEach(name => {\n methods[name] = makePublicMethod(name)\n })\n\n return methods as PublicMethods\n }\n\n return makePublicMethods()\n}\n","import { Ref, watch } from 'vue'\nimport { throttle } from 'echarts/core'\nimport { addListener, removeListener, ResizeCallback } from 'resize-detector'\nimport { EChartsType } from '../types'\n\nexport function useAutoresize (\n chart: Ref<EChartsType | undefined>,\n autoresize: Ref<boolean>,\n root: Ref<HTMLElement | undefined>\n): void {\n let resizeListener: ResizeCallback | null = null\n\n watch([root, chart, autoresize], ([root, chart, autoresize], _, cleanup) => {\n if (root && chart && autoresize) {\n resizeListener = throttle(() => {\n chart.resize()\n }, 100)\n\n addListener(root, resizeListener)\n }\n\n cleanup(() => {\n if (resizeListener && root) {\n removeListener(root, resizeListener)\n }\n })\n })\n}\n\nexport const autoresizeProps = {\n autoresize: Boolean\n}\n","import { inject, unref, computed, Ref, watchEffect } from 'vue'\nimport { EChartsType } from '../types'\n\nexport const LOADING_OPTIONS_KEY = 'ecLoadingOptions'\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport function useLoading (\n chart: Ref<EChartsType | undefined>,\n loading: Ref<boolean>,\n loadingOptions: Ref<UnknownRecord | undefined>\n): void {\n const defaultLoadingOptions = inject(LOADING_OPTIONS_KEY, {}) as\n | UnknownRecord\n | Ref<UnknownRecord>\n const realLoadingOptions = computed(() => ({\n ...unref(defaultLoadingOptions),\n ...loadingOptions?.value\n }))\n\n watchEffect(() => {\n const instance = chart.value\n if (!instance) {\n return\n }\n\n if (loading.value) {\n instance.showLoading(realLoadingOptions.value)\n } else {\n instance.hideLoading()\n }\n })\n}\n\nexport const loadingProps = {\n loading: Boolean,\n loadingOptions: Object\n}\n","type Attrs = {\n [key: string]: any\n}\n\n// Copied from\n// https://github.com/vuejs/vue-next/blob/5a7a1b8293822219283d6e267496bec02234b0bc/packages/shared/src/index.ts#L40-L41\nconst onRE = /^on[^a-z]/\nexport const isOn = (key: string): boolean => onRE.test(key)\n\nexport function omitOn (attrs: Attrs): Attrs {\n const result: Attrs = {}\n for (const key in attrs) {\n if (!isOn(key)) {\n result[key] = attrs[key]\n }\n }\n\n return result\n}\n","// 此组件为 vue-echarts\n// 文档:https://github.com/ecomfe/vue-echarts/blob/main/README.zh-Hans.md\nimport {\n defineComponent,\n unref,\n shallowRef,\n toRefs,\n watch,\n computed,\n inject,\n onMounted,\n onUnmounted,\n h,\n nextTick,\n PropType,\n watchEffect\n} from 'vue'\nimport { init as initChart } from 'echarts/core'\nimport {\n EChartsType,\n Option,\n Theme,\n ThemeInjection,\n InitOptions,\n InitOptionsInjection,\n UpdateOptions,\n UpdateOptionsInjection\n} from './types'\nimport {\n usePublicAPI,\n useAutoresize,\n autoresizeProps,\n useLoading,\n loadingProps\n} from './composables'\nimport './style.css'\nimport { omitOn } from './utils'\n\nconst TAG_NAME = 'x-vue-echarts'\nexport const THEME_KEY = 'ecTheme'\nexport const INIT_OPTIONS_KEY = 'ecInitOptions'\nexport const UPDATE_OPTIONS_KEY = 'ecUpdateOptions'\nexport { LOADING_OPTIONS_KEY } from './composables'\n\n// @ts-ignore\nexport default defineComponent({\n name: 'echarts',\n props: {\n option: Object as PropType<Option>,\n theme: {\n type: [Object, String] as PropType<Theme>\n },\n initOptions: Object as PropType<InitOptions>,\n updateOptions: Object as PropType<UpdateOptions>,\n group: String,\n manualUpdate: Boolean,\n ...autoresizeProps,\n ...loadingProps\n },\n inheritAttrs: false,\n // @ts-expect-error listeners for Vue 2 compatibility\n setup (props, { attrs, listeners }) {\n const root = shallowRef<HTMLElement>()\n const chart = shallowRef<EChartsType>()\n const manualOption = shallowRef<Option>()\n const defaultTheme = inject(THEME_KEY, null) as ThemeInjection\n const defaultInitOptions = inject(\n INIT_OPTIONS_KEY,\n null\n ) as InitOptionsInjection\n const defaultUpdateOptions = inject(\n UPDATE_OPTIONS_KEY,\n null\n ) as UpdateOptionsInjection\n\n const { autoresize, manualUpdate, loading, loadingOptions } = toRefs(props)\n\n const realOption = computed(\n () => manualOption.value || props.option || Object.create(null)\n )\n const realTheme = computed(() => props.theme || unref(defaultTheme) || {})\n const realInitOptions = computed(\n () => props.initOptions || unref(defaultInitOptions) || {}\n )\n const realUpdateOptions = computed(\n () => props.updateOptions || unref(defaultUpdateOptions) || {}\n )\n const nonEventAttrs = computed(() => omitOn(attrs))\n\n function init (option?: Option) {\n if (chart.value || !root.value) {\n return\n }\n\n const instance = (chart.value = initChart(\n root.value,\n realTheme.value,\n realInitOptions.value\n ))\n\n if (props.group) {\n instance.group = props.group\n }\n\n let realListeners = listeners\n if (!realListeners) {\n realListeners = {}\n\n Object.keys(attrs)\n .filter(key => key.indexOf('on') === 0 && key.length > 2)\n .forEach(key => {\n // onClick -> c + lick\n // onZr:click -> z + r:click\n const event = key.charAt(2).toLowerCase() + key.slice(3)\n realListeners[event] = attrs[key]\n })\n }\n\n Object.keys(realListeners).forEach(key => {\n const handler = realListeners[key] as any\n\n if (!handler) {\n return\n }\n\n if (key.indexOf('zr:') === 0) {\n instance.getZr().on(key.slice(3).toLowerCase(), handler)\n } else {\n instance.on(key.toLowerCase(), handler)\n }\n })\n\n function resize () {\n if (instance && !instance.isDisposed()) {\n // temporarily suppress errors caused by https://github.com/apache/echarts/issues/14846\n try {\n instance.resize()\n } catch (e) {\n if (e.message === \"Cannot read property 'get' of undefined\") {\n return\n }\n\n throw e\n }\n }\n }\n\n function commit () {\n instance.setOption(option || realOption.value, realUpdateOptions.value)\n }\n\n if (autoresize.value) {\n // Try to make chart fit to container in case container size\n // is changed synchronously or in already queued microtasks\n nextTick(() => {\n resize()\n commit()\n })\n } else {\n commit()\n }\n }\n\n function setOption (option: Option, updateOptions?: UpdateOptions) {\n if (props.manualUpdate) {\n manualOption.value = option\n }\n\n if (!chart.value) {\n init(option)\n } else {\n chart.value.setOption(option, updateOptions || {})\n }\n }\n\n function cleanup () {\n if (chart.value) {\n chart.value.dispose()\n chart.value = undefined\n }\n }\n\n let unwatchOption: (() => void) | null = null\n watch(\n manualUpdate,\n manualUpdate => {\n if (typeof unwatchOption === 'function') {\n unwatchOption()\n unwatchOption = null\n }\n\n if (!manualUpdate) {\n unwatchOption = watch(\n () => props.option,\n option => {\n if (!option) {\n return\n }\n if (!chart.value) {\n init()\n } else {\n chart.value.setOption(option, realUpdateOptions.value)\n }\n },\n { deep: true }\n )\n }\n },\n {\n immediate: true\n }\n )\n\n watch(\n [realTheme, realInitOptions],\n () => {\n cleanup()\n init()\n },\n {\n deep: true\n }\n )\n\n watchEffect(() => {\n if (props.group && chart.value) {\n chart.value.group = props.group\n }\n })\n\n const publicApi = usePublicAPI(chart, init)\n\n useLoading(chart, loading, loadingOptions)\n\n useAutoresize(chart, autoresize, root)\n\n onMounted(() => {\n if (props.option) {\n init()\n }\n })\n\n onUnmounted(cleanup)\n\n return {\n chart,\n root,\n setOption,\n nonEventAttrs,\n ...publicApi\n }\n },\n render () {\n const attrs = { ...this.nonEventAttrs }\n attrs.ref = 'root'\n attrs.class = attrs.class ? ['echarts'].concat(attrs.class) : 'echarts'\n return h(TAG_NAME, attrs)\n }\n})\n","/**\n * Take input from [0, n] and return it as [0, 1]\n * @hidden\n */\nexport function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = '100%';\n }\n var isPercent = isPercentage(n);\n n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n)));\n // Automatically convert percentage into number\n if (isPercent) {\n n = parseInt(String(n * max), 10) / 100;\n }\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n // Convert into [0, 1] range if it isn't already\n if (max === 360) {\n // If n is a hue given in degrees,\n // wrap around out-of-range values into [0, 360] range\n // then convert into [0, 1].\n n = (n < 0 ? (n % max) + max : n % max) / parseFloat(String(max));\n }\n else {\n // If n not a hue given in degrees\n // Convert into [0, 1] range if it isn't already.\n n = (n % max) / parseFloat(String(max));\n }\n return n;\n}\n/**\n * Force a number between 0 and 1\n * @hidden\n */\nexport function clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n/**\n * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n * <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\n * @hidden\n */\nexport function isOnePointZero(n) {\n return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1;\n}\n/**\n * Check to see if string passed in is a percentage\n * @hidden\n */\nexport function isPercentage(n) {\n return typeof n === 'string' && n.indexOf('%') !== -1;\n}\n/**\n * Return a valid alpha value [0,1] with all invalid values being set to 1\n * @hidden\n */\nexport function boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n/**\n * Replace a decimal with it's percentage value\n * @hidden\n */\nexport function convertToPercentage(n) {\n if (n <= 1) {\n return \"\".concat(Number(n) * 100, \"%\");\n }\n return n;\n}\n/**\n * Force a hex value to have 2 characters\n * @hidden\n */\nexport function pad2(c) {\n return c.length === 1 ? '0' + c : String(c);\n}\n","import { bound01, pad2 } from './util';\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n/**\n * Handle bounds / percentage checking to conform to CSS color spec\n * <http://www.w3.org/TR/css3-color/>\n * *Assumes:* r, g, b in [0, 255] or [0, 1]\n * *Returns:* { r, g, b } in [0, 255]\n */\nexport function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255,\n };\n}\n/**\n * Converts an RGB color value to HSL.\n * *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n * *Returns:* { h, s, l } in [0,1]\n */\nexport function rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var s = 0;\n var l = (max + min) / 2;\n if (max === min) {\n s = 0;\n h = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, l: l };\n}\nfunction hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * (6 * t);\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n}\n/**\n * Converts an HSL color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hslToRgb(h, s, l) {\n var r;\n var g;\n var b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n if (s === 0) {\n // achromatic\n g = l;\n b = l;\n r = l;\n }\n else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color value to HSV\n *\n * *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n * *Returns:* { h, s, v } in [0,1]\n */\nexport function rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var v = max;\n var d = max - min;\n var s = max === 0 ? 0 : d / max;\n if (max === min) {\n h = 0; // achromatic\n }\n else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n}\n/**\n * Converts an HSV color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h);\n var f = h - i;\n var p = v * (1 - s);\n var q = v * (1 - f * s);\n var t = v * (1 - (1 - f) * s);\n var mod = i % 6;\n var r = [v, q, p, p, t, v][mod];\n var g = [t, v, v, q, p, p][mod];\n var b = [p, p, t, v, v, q][mod];\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color to hex\n *\n * Assumes r, g, and b are contained in the set [0, 255]\n * Returns a 3 or 6 character hex\n */\nexport function rgbToHex(r, g, b, allow3Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n // Return a 3 character hex if possible\n if (allow3Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color plus alpha transparency to hex\n *\n * Assumes r, g, b are contained in the set [0, 255] and\n * a in [0, 1]. Returns a 4 or 8 character rgba hex\n */\n// eslint-disable-next-line max-params\nexport function rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n pad2(convertDecimalToHex(a)),\n ];\n // Return a 4 character hex if possible\n if (allow4Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1)) &&\n hex[3].startsWith(hex[3].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color to an ARGB Hex8 string\n * Rarely used, but required for \"toFilter()\"\n */\nexport function rgbaToArgbHex(r, g, b, a) {\n var hex = [\n pad2(convertDecimalToHex(a)),\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n return hex.join('');\n}\n/** Converts a decimal to a hex value */\nexport function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n/** Converts a hex value to a decimal */\nexport function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\n/** Parse a base-16 hex value into a base-10 integer */\nexport function parseIntFromHex(val) {\n return parseInt(val, 16);\n}\nexport function numberInputToObject(color) {\n return {\n r: color >> 16,\n g: (color & 0xff00) >> 8,\n b: color & 0xff,\n };\n}\n","// https://github.com/bahamas10/css-color-names/blob/master/css-color-names.json\n/**\n * @hidden\n */\nexport var names = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n goldenrod: '#daa520',\n gold: '#ffd700',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavenderblush: '#fff0f5',\n lavender: '#e6e6fa',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n};\n","/* eslint-disable @typescript-eslint/no-redundant-type-constituents */\nimport { convertHexToDecimal, hslToRgb, hsvToRgb, parseIntFromHex, rgbToRgb } from './conversion';\nimport { names } from './css-color-names';\nimport { boundAlpha, convertToPercentage } from './util';\n/**\n * Given a string or object, convert that input to RGB\n *\n * Possible string inputs:\n * ```\n * \"red\"\n * \"#f00\" or \"f00\"\n * \"#ff0000\" or \"ff0000\"\n * \"#ff000000\" or \"ff000000\"\n * \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n * \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n * \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n * \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n * \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n * \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n * \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n * ```\n */\nexport function inputToRGB(color) {\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color === 'string') {\n color = stringInputToObject(color);\n }\n if (typeof color === 'object') {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === '%' ? 'prgb' : 'rgb';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = 'hsv';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = 'hsl';\n }\n if (Object.prototype.hasOwnProperty.call(color, 'a')) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a,\n };\n}\n// <http://www.w3.org/TR/css3-values/#integers>\nvar CSS_INTEGER = '[-\\\\+]?\\\\d+%?';\n// <http://www.w3.org/TR/css3-values/#number-value>\nvar CSS_NUMBER = '[-\\\\+]?\\\\d*\\\\.\\\\d+%?';\n// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\nvar CSS_UNIT = \"(?:\".concat(CSS_NUMBER, \")|(?:\").concat(CSS_INTEGER, \")\");\n// Actual matching.\n// Parentheses and commas are optional, but not required.\n// Whitespace can take the place of commas or opening paren\nvar PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar matchers = {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp('rgb' + PERMISSIVE_MATCH3),\n rgba: new RegExp('rgba' + PERMISSIVE_MATCH4),\n hsl: new RegExp('hsl' + PERMISSIVE_MATCH3),\n hsla: new RegExp('hsla' + PERMISSIVE_MATCH4),\n hsv: new RegExp('hsv' + PERMISSIVE_MATCH3),\n hsva: new RegExp('hsva' + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n};\n/**\n * Permissive string parsing. Take in a number of formats, and output an object\n * based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n */\nexport function stringInputToObject(color) {\n color = color.trim().toLowerCase();\n if (color.length === 0) {\n return false;\n }\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color === 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: 'name' };\n }\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match = matchers.rgb.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n match = matchers.rgba.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n match = matchers.hsl.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n match = matchers.hsla.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n match = matchers.hsv.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n match = matchers.hsva.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n match = matchers.hex8.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex6.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n match = matchers.hex4.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n a: convertHexToDecimal(match[4] + match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex3.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n return false;\n}\n/**\n * Check to see if it looks like a CSS unit\n * (see `matchers` above for definition).\n */\nexport function isValidCSSUnit(color) {\n return Boolean(matchers.CSS_UNIT.exec(String(color)));\n}\n","import { inputToRGB, rgbToHex, rgbToHsv } from '@ctrl/tinycolor';\n\nvar hueStep = 2; // 色相阶梯\n\nvar saturationStep = 0.16; // 饱和度阶梯,浅色部分\n\nvar saturationStep2 = 0.05; // 饱和度阶梯,深色部分\n\nvar brightnessStep1 = 0.05; // 亮度阶梯,浅色部分\n\nvar brightnessStep2 = 0.15; // 亮度阶梯,深色部分\n\nvar lightColorCount = 5; // 浅色数量,主色上\n\nvar darkColorCount = 4; // 深色数量,主色下\n// 暗色主题颜色映射关系表\n\nvar darkColorMap = [{\n index: 7,\n opacity: 0.15\n}, {\n index: 6,\n opacity: 0.25\n}, {\n index: 5,\n opacity: 0.3\n}, {\n index: 5,\n opacity: 0.45\n}, {\n index: 5,\n opacity: 0.65\n}, {\n index: 5,\n opacity: 0.85\n}, {\n index: 4,\n opacity: 0.9\n}, {\n index: 3,\n opacity: 0.95\n}, {\n index: 2,\n opacity: 0.97\n}, {\n index: 1,\n opacity: 0.98\n}]; // Wrapper function ported from TinyColor.prototype.toHsv\n// Keep it here because of `hsv.h * 360`\n\nfunction toHsv(_ref) {\n var r = _ref.r,\n g = _ref.g,\n b = _ref.b;\n var hsv = rgbToHsv(r, g, b);\n return {\n h: hsv.h * 360,\n s: hsv.s,\n v: hsv.v\n };\n} // Wrapper function ported from TinyColor.prototype.toHexString\n// Keep it here because of the prefix `#`\n\n\nfunction toHex(_ref2) {\n var r = _ref2.r,\n g = _ref2.g,\n b = _ref2.b;\n return \"#\".concat(rgbToHex(r, g, b, false));\n} // Wrapper function ported from TinyColor.prototype.mix, not treeshakable.\n// Amount in range [0, 1]\n// Assume color1 & color2 has no alpha, since the following src code did so.\n\n\nfunction mix(rgb1, rgb2, amount) {\n var p = amount / 100;\n var rgb = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b\n };\n return rgb;\n}\n\nfunction getHue(hsv, i, light) {\n var hue; // 根据色相不同,色相转向不同\n\n if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {\n hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i;\n } else {\n hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i;\n }\n\n if (hue < 0) {\n hue += 360;\n } else if (hue >= 360) {\n hue -= 360;\n }\n\n return hue;\n}\n\nfunction getSaturation(hsv, i, light) {\n // grey color don't change saturation\n if (hsv.h === 0 && hsv.s === 0) {\n return hsv.s;\n }\n\n var saturation;\n\n if (light) {\n saturation = hsv.s - saturationStep * i;\n } else if (i === darkColorCount) {\n saturation = hsv.s + saturationStep;\n } else {\n saturation = hsv.s + saturationStep2 * i;\n } // 边界值修正\n\n\n if (saturation > 1) {\n saturation = 1;\n } // 第一格的 s 限制在 0.06-0.1 之间\n\n\n if (light && i === lightColorCount && saturation > 0.1) {\n saturation = 0.1;\n }\n\n if (saturation < 0.06) {\n saturation = 0.06;\n }\n\n return Number(saturation.toFixed(2));\n}\n\nfunction getValue(hsv, i, light) {\n var value;\n\n if (light) {\n value = hsv.v + brightnessStep1 * i;\n } else {\n value = hsv.v - brightnessStep2 * i;\n }\n\n if (value > 1) {\n value = 1;\n }\n\n return Number(value.toFixed(2));\n}\n\nfunction generate(color) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var patterns = [];\n var pColor = inputToRGB(color);\n\n for (var i = lightColorCount; i > 0; i -= 1) {\n var hsv = toHsv(pColor);\n var colorString = toHex(inputToRGB({\n h: getHue(hsv, i, true),\n s: getSaturation(hsv, i, true),\n v: getValue(hsv, i, true)\n }));\n patterns.push(colorString);\n }\n\n patterns.push(toHex(pColor));\n\n for (var _i = 1; _i <= darkColorCount; _i += 1) {\n var _hsv = toHsv(pColor);\n\n var _colorString = toHex(inputToRGB({\n h: getHue(_hsv, _i),\n s: getSaturation(_hsv, _i),\n v: getValue(_hsv, _i)\n }));\n\n patterns.push(_colorString);\n } // dark theme patterns\n\n\n if (opts.theme === 'dark') {\n return darkColorMap.map(function (_ref3) {\n var index = _ref3.index,\n opacity = _ref3.opacity;\n var darkColorString = toHex(mix(inputToRGB(opts.backgroundColor || '#141414'), inputToRGB(patterns[index]), opacity * 100));\n return darkColorString;\n });\n }\n\n return patterns;\n}\n\nvar presetPrimaryColors = {\n red: '#F5222D',\n volcano: '#FA541C',\n orange: '#FA8C16',\n gold: '#FAAD14',\n yellow: '#FADB14',\n lime: '#A0D911',\n green: '#52C41A',\n cyan: '#13C2C2',\n blue: '#1890FF',\n geekblue: '#2F54EB',\n purple: '#722ED1',\n magenta: '#EB2F96',\n grey: '#666666'\n};\nvar presetPalettes = {};\nvar presetDarkPalettes = {};\nObject.keys(presetPrimaryColors).forEach(function (key) {\n presetPalettes[key] = generate(presetPrimaryColors[key]);\n presetPalettes[key].primary = presetPalettes[key][5]; // dark presetPalettes\n\n presetDarkPalettes[key] = generate(presetPrimaryColors[key], {\n theme: 'dark',\n backgroundColor: '#141414'\n });\n presetDarkPalettes[key].primary = presetDarkPalettes[key][5];\n});\nvar red = presetPalettes.red;\nvar volcano = presetPalettes.volcano;\nvar gold = presetPalettes.gold;\nvar orange = presetPalettes.orange;\nvar yellow = presetPalettes.yellow;\nvar lime = presetPalettes.lime;\nvar green = presetPalettes.green;\nvar cyan = presetPalettes.cyan;\nvar blue = presetPalettes.blue;\nvar geekblue = presetPalettes.geekblue;\nvar purple = presetPalettes.purple;\nvar magenta = presetPalettes.magenta;\nvar grey = presetPalettes.grey;\n\nexport { blue, cyan, geekblue, generate, gold, green, grey, lime, magenta, orange, presetDarkPalettes, presetPalettes, presetPrimaryColors, purple, red, volcano, yellow };\n","// https://github.com/substack/insert-css\nvar containers = []; // will store container HTMLElement references\n\nvar styleElements = []; // will store {prepend: HTMLElement, append: HTMLElement}\n\nvar usage = 'insert-css: You need to provide a CSS string. Usage: insertCss(cssString[, options]).';\n\nfunction createStyleElement() {\n var styleElement = document.createElement('style');\n styleElement.setAttribute('type', 'text/css');\n return styleElement;\n} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\nfunction insertCss(css, options) {\n options = options || {};\n\n if (css === undefined) {\n throw new Error(usage);\n }\n\n var position = options.prepend === true ? 'prepend' : 'append';\n var container = options.container !== undefined ? options.container : document.querySelector('head');\n var containerId = containers.indexOf(container); // first time we see this container, create the necessary entries\n\n if (containerId === -1) {\n containerId = containers.push(container) - 1;\n styleElements[containerId] = {};\n } // try to get the correponding container + position styleElement, create it otherwise\n\n\n var styleElement;\n\n if (styleElements[containerId] !== undefined && styleElements[containerId][position] !== undefined) {\n styleElement = styleElements[containerId][position];\n } else {\n styleElement = styleElements[containerId][position] = createStyleElement();\n\n if (position === 'prepend') {\n container.insertBefore(styleElement, container.childNodes[0]);\n } else {\n container.appendChild(styleElement);\n }\n } // strip potential UTF-8 BOM if css was read from a file\n\n\n if (css.charCodeAt(0) === 0xfeff) {\n css = css.substr(1, css.length);\n } // actually add the stylesheet\n\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText += css;\n } else {\n styleElement.textContent += css;\n }\n\n return styleElement;\n}\n\nexport default insertCss;","function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport { nextTick, h } from 'vue';\nimport { generate as generateColor } from '@ant-design/colors';\nimport insertCss from './insert-css';\nexport function warn(valid, message) {\n // Support uglify\n if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) {\n console.error(\"Warning: \".concat(message));\n }\n}\nexport function warning(valid, message) {\n warn(valid, \"[@ant-design/icons-vue] \".concat(message));\n} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nexport function isIconDefinition(target) {\n return typeof target === 'object' && typeof target.name === 'string' && typeof target.theme === 'string' && (typeof target.icon === 'object' || typeof target.icon === 'function');\n}\nexport function normalizeAttrs() {\n var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return Object.keys(attrs).reduce(function (acc, key) {\n var val = attrs[key];\n\n switch (key) {\n case 'class':\n acc.className = val;\n delete acc[\"class\"];\n break;\n\n default:\n acc[key] = val;\n }\n\n return acc;\n }, {});\n}\nexport function generate(node, key, rootProps) {\n if (!rootProps) {\n return h(node.tag, _objectSpread({\n key: key\n }, node.attrs), (node.children || []).map(function (child, index) {\n return generate(child, \"\".concat(key, \"-\").concat(node.tag, \"-\").concat(index));\n }));\n }\n\n return h(node.tag, _objectSpread({\n key: key\n }, rootProps, node.attrs), (node.children || []).map(function (child, index) {\n return generate(child, \"\".concat(key, \"-\").concat(node.tag, \"-\").concat(index));\n }));\n}\nexport function getSecondaryColor(primaryColor) {\n // choose the second color\n return generateColor(primaryColor)[0];\n}\nexport function normalizeTwoToneColors(twoToneColor) {\n if (!twoToneColor) {\n return [];\n }\n\n return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor];\n} // These props make sure that the SVG behaviours like general text.\n// Reference: https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4\n\nexport var svgBaseProps = {\n width: '1em',\n height: '1em',\n fill: 'currentColor',\n 'aria-hidden': 'true',\n focusable: 'false'\n};\nexport var iconStyles = \"\\n.anticon {\\n display: inline-block;\\n color: inherit;\\n font-style: normal;\\n line-height: 0;\\n text-align: center;\\n text-transform: none;\\n vertical-align: -0.125em;\\n text-rendering: optimizeLegibility;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n\\n.anticon > * {\\n line-height: 1;\\n}\\n\\n.anticon svg {\\n display: inline-block;\\n}\\n\\n.anticon::before {\\n display: none;\\n}\\n\\n.anticon .anticon-icon {\\n display: block;\\n}\\n\\n.anticon[tabindex] {\\n cursor: pointer;\\n}\\n\\n.anticon-spin::before,\\n.anticon-spin {\\n display: inline-block;\\n -webkit-animation: loadingCircle 1s infinite linear;\\n animation: loadingCircle 1s infinite linear;\\n}\\n\\n@-webkit-keyframes loadingCircle {\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes loadingCircle {\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\";\nvar cssInjectedFlag = false;\nexport var useInsertStyles = function useInsertStyles() {\n var styleStr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : iconStyles;\n nextTick(function () {\n if (!cssInjectedFlag) {\n if (typeof window !== 'undefined' && window.document && window.document.documentElement) {\n insertCss(styleStr, {\n prepend: true\n });\n }\n\n cssInjectedFlag = true;\n }\n });\n};","var _excluded = [\"icon\", \"primaryColor\", \"secondaryColor\"];\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport { generate, getSecondaryColor, isIconDefinition, warning, useInsertStyles } from '../utils';\nvar twoToneColorPalette = {\n primaryColor: '#333',\n secondaryColor: '#E6E6E6',\n calculated: false\n};\n\nfunction setTwoToneColors(_ref) {\n var primaryColor = _ref.primaryColor,\n secondaryColor = _ref.secondaryColor;\n twoToneColorPalette.primaryColor = primaryColor;\n twoToneColorPalette.secondaryColor = secondaryColor || getSecondaryColor(primaryColor);\n twoToneColorPalette.calculated = !!secondaryColor;\n}\n\nfunction getTwoToneColors() {\n return _objectSpread({}, twoToneColorPalette);\n}\n\nvar IconBase = function IconBase(props, context) {\n var _props$context$attrs = _objectSpread({}, props, context.attrs),\n icon = _props$context$attrs.icon,\n primaryColor = _props$context$attrs.primaryColor,\n secondaryColor = _props$context$attrs.secondaryColor,\n restProps = _objectWithoutProperties(_props$context$attrs, _excluded);\n\n var colors = twoToneColorPalette;\n\n if (primaryColor) {\n colors = {\n primaryColor: primaryColor,\n secondaryColor: secondaryColor || getSecondaryColor(primaryColor)\n };\n }\n\n useInsertStyles();\n warning(isIconDefinition(icon), \"icon should be icon definiton, but got \".concat(icon));\n\n if (!isIconDefinition(icon)) {\n return null;\n }\n\n var target = icon;\n\n if (target && typeof target.icon === 'function') {\n target = _objectSpread({}, target, {\n icon: target.icon(colors.primaryColor, colors.secondaryColor)\n });\n }\n\n return generate(target.icon, \"svg-\".concat(target.name), _objectSpread({}, restProps, {\n 'data-icon': target.name,\n width: '1em',\n height: '1em',\n fill: 'currentColor',\n 'aria-hidden': 'true'\n })); // },\n};\n\nIconBase.props = {\n icon: Object,\n primaryColor: String,\n secondaryColor: String,\n focusable: String\n};\nIconBase.inheritAttrs = false;\nIconBase.displayName = 'IconBase';\nIconBase.getTwoToneColors = getTwoToneColors;\nIconBase.setTwoToneColors = setTwoToneColors;\nexport default IconBase;","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nimport VueIcon from './IconBase';\nimport { normalizeTwoToneColors } from '../utils';\nexport function setTwoToneColor(twoToneColor) {\n var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor),\n _normalizeTwoToneColo2 = _slicedToArray(_normalizeTwoToneColo, 2),\n primaryColor = _normalizeTwoToneColo2[0],\n secondaryColor = _normalizeTwoToneColo2[1];\n\n return VueIcon.setTwoToneColors({\n primaryColor: primaryColor,\n secondaryColor: secondaryColor\n });\n}\nexport function getTwoToneColor() {\n var colors = VueIcon.getTwoToneColors();\n\n if (!colors.calculated) {\n return colors.primaryColor;\n }\n\n return [colors.primaryColor, colors.secondaryColor];\n}","var _excluded = [\"class\", \"icon\", \"spin\", \"rotate\", \"tabindex\", \"twoToneColor\", \"onClick\"];\nimport { createVNode as _createVNode } from \"vue\";\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport VueIcon from './IconBase';\nimport { getTwoToneColor, setTwoToneColor } from './twoTonePrimaryColor';\nimport { normalizeTwoToneColors } from '../utils'; // Initial setting\n\nsetTwoToneColor('#1890ff');\n\nvar Icon = function Icon(props, context) {\n var _classObj;\n\n var _props$context$attrs = _objectSpread({}, props, context.attrs),\n cls = _props$context$attrs[\"class\"],\n icon = _props$context$attrs.icon,\n spin = _props$context$attrs.spin,\n rotate = _props$context$attrs.rotate,\n tabindex = _props$context$attrs.tabindex,\n twoToneColor = _props$context$attrs.twoToneColor,\n onClick = _props$context$attrs.onClick,\n restProps = _objectWithoutProperties(_props$context$attrs, _excluded);\n\n var classObj = (_classObj = {\n anticon: true\n }, _defineProperty(_classObj, \"anticon-\".concat(icon.name), Boolean(icon.name)), _defineProperty(_classObj, cls, cls), _classObj);\n var svgClassString = spin === '' || !!spin || icon.name === 'loading' ? 'anticon-spin' : '';\n var iconTabIndex = tabindex;\n\n if (iconTabIndex === undefined && onClick) {\n iconTabIndex = -1;\n restProps.tabindex = iconTabIndex;\n }\n\n var svgStyle = rotate ? {\n msTransform: \"rotate(\".concat(rotate, \"deg)\"),\n transform: \"rotate(\".concat(rotate, \"deg)\")\n } : undefined;\n\n var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor),\n _normalizeTwoToneColo2 = _slicedToArray(_normalizeTwoToneColo, 2),\n primaryColor = _normalizeTwoToneColo2[0],\n secondaryColor = _normalizeTwoToneColo2[1];\n\n return _createVNode(\"span\", _objectSpread({\n \"role\": \"img\",\n \"aria-label\": icon.name\n }, restProps, {\n \"onClick\": onClick,\n \"class\": classObj\n }), [_createVNode(VueIcon, {\n \"class\": svgClassString,\n \"icon\": icon,\n \"primaryColor\": primaryColor,\n \"secondaryColor\": secondaryColor,\n \"style\": svgStyle\n }, null)]);\n};\n\nIcon.props = {\n spin: Boolean,\n rotate: Number,\n icon: Object,\n twoToneColor: String\n};\nIcon.displayName = 'AntdIcon';\nIcon.inheritAttrs = false;\nIcon.getTwoToneColor = getTwoToneColor;\nIcon.setTwoToneColor = setTwoToneColor;\nexport default Icon;","// This icon file is generated automatically.\nvar CloseOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z\" } }] }, \"name\": \"close\", \"theme\": \"outlined\" };\nexport default CloseOutlined;\n","import { createVNode as _createVNode } from \"vue\";\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\nimport CloseOutlinedSvg from \"@ant-design/icons-svg/es/asn/CloseOutlined\";\nimport AntdIcon from '../components/AntdIcon';\n\nvar CloseOutlined = function CloseOutlined(props, context) {\n var p = _objectSpread({}, props, context.attrs);\n\n return _createVNode(AntdIcon, _objectSpread({}, p, {\n \"icon\": CloseOutlinedSvg\n }), null);\n};\n\nCloseOutlined.displayName = 'CloseOutlined';\nCloseOutlined.inheritAttrs = false;\nexport default CloseOutlined;","// This icon file is generated automatically.\nvar LoadingOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"0 0 1024 1024\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z\" } }] }, \"name\": \"loading\", \"theme\": \"outlined\" };\nexport default LoadingOutlined;\n","import { createVNode as _createVNode } from \"vue\";\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\nimport LoadingOutlinedSvg from \"@ant-design/icons-svg/es/asn/LoadingOutlined\";\nimport AntdIcon from '../components/AntdIcon';\n\nvar LoadingOutlined = function LoadingOutlined(props, context) {\n var p = _objectSpread({}, props, context.attrs);\n\n return _createVNode(AntdIcon, _objectSpread({}, p, {\n \"icon\": LoadingOutlinedSvg\n }), null);\n};\n\nLoadingOutlined.displayName = 'LoadingOutlined';\nLoadingOutlined.inheritAttrs = false;\nexport default LoadingOutlined;","<template>\n <div class=\"spin-wrapper\">\n <a-spin\n class=\"spin\"\n :spinning=\"spinning\"\n v-if=\"spinning\"\n :indicator=\"indicator\"\n tip=\"加载中...\"\n >\n </a-spin>\n <slot v-else></slot>\n </div>\n</template>\n<script lang=\"ts\">\nimport { Spin as ASpin } from 'ant-design-vue'\nimport { LoadingOutlined } from '@ant-design/icons-vue'\nimport { defineComponent, h } from 'vue'\nimport 'ant-design-vue/es/spin/style'\nexport default defineComponent({\n props: {\n spinning: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ASpin\n },\n setup () {\n const indicator = h(LoadingOutlined, {\n style: {\n fontSize: '24px',\n color: '#1890ff'\n },\n spin: true\n })\n return {\n indicator\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n .spin {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n</style>\n","<template>\n <div class=\"spin-wrapper\">\n <a-spin\n class=\"spin\"\n :spinning=\"spinning\"\n v-if=\"spinning\"\n :indicator=\"indicator\"\n tip=\"加载中...\"\n >\n </a-spin>\n <slot v-else></slot>\n </div>\n</template>\n<script lang=\"ts\">\nimport { Spin as ASpin } from 'ant-design-vue'\nimport { LoadingOutlined } from '@ant-design/icons-vue'\nimport { defineComponent, h } from 'vue'\nimport 'ant-design-vue/es/spin/style'\nexport default defineComponent({\n props: {\n spinning: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ASpin\n },\n setup () {\n const indicator = h(LoadingOutlined, {\n style: {\n fontSize: '24px',\n color: '#1890ff'\n },\n spin: true\n })\n return {\n indicator\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n .spin {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n</style>\n","<template>\n <a-skeleton active :loading=\"loading\">\n <slot></slot>\n </a-skeleton>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { Skeleton as ASkeleton } from 'ant-design-vue'\nimport 'ant-design-vue/es/skeleton/style'\nexport default defineComponent({\n name: 'Skeleton',\n props: {\n loading: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ASkeleton\n }\n})\n</script>\n\n<style scoped>\n\n</style>\n","<template>\n <a-skeleton active :loading=\"loading\">\n <slot></slot>\n </a-skeleton>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { Skeleton as ASkeleton } from 'ant-design-vue'\nimport 'ant-design-vue/es/skeleton/style'\nexport default defineComponent({\n name: 'Skeleton',\n props: {\n loading: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ASkeleton\n }\n})\n</script>\n\n<style scoped>\n\n</style>\n","/**\r\n * Make a map and return a function for checking if a key\r\n * is in that map.\r\n * IMPORTANT: all calls of this function must be prefixed with\r\n * \\/\\*#\\_\\_PURE\\_\\_\\*\\/\r\n * So that rollup can tree-shake them if necessary.\r\n */\r\nfunction makeMap(str, expectsLowerCase) {\r\n const map = Object.create(null);\r\n const list = str.split(',');\r\n for (let i = 0; i < list.length; i++) {\r\n map[list[i]] = true;\r\n }\r\n return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];\r\n}\n\n/**\r\n * dev only flag -> name mapping\r\n */\r\nconst PatchFlagNames = {\r\n [1 /* TEXT */]: `TEXT`,\r\n [2 /* CLASS */]: `CLASS`,\r\n [4 /* STYLE */]: `STYLE`,\r\n [8 /* PROPS */]: `PROPS`,\r\n [16 /* FULL_PROPS */]: `FULL_PROPS`,\r\n [32 /* HYDRATE_EVENTS */]: `HYDRATE_EVENTS`,\r\n [64 /* STABLE_FRAGMENT */]: `STABLE_FRAGMENT`,\r\n [128 /* KEYED_FRAGMENT */]: `KEYED_FRAGMENT`,\r\n [256 /* UNKEYED_FRAGMENT */]: `UNKEYED_FRAGMENT`,\r\n [512 /* NEED_PATCH */]: `NEED_PATCH`,\r\n [1024 /* DYNAMIC_SLOTS */]: `DYNAMIC_SLOTS`,\r\n [2048 /* DEV_ROOT_FRAGMENT */]: `DEV_ROOT_FRAGMENT`,\r\n [-1 /* HOISTED */]: `HOISTED`,\r\n [-2 /* BAIL */]: `BAIL`\r\n};\n\n/**\r\n * Dev only\r\n */\r\nconst slotFlagsText = {\r\n [1 /* STABLE */]: 'STABLE',\r\n [2 /* DYNAMIC */]: 'DYNAMIC',\r\n [3 /* FORWARDED */]: 'FORWARDED'\r\n};\n\nconst GLOBALS_WHITE_LISTED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +\r\n 'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +\r\n 'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt';\r\nconst isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED);\n\nconst range = 2;\r\nfunction generateCodeFrame(source, start = 0, end = source.length) {\r\n // Split the content into individual lines but capture the newline sequence\r\n // that separated each line. This is important because the actual sequence is\r\n // needed to properly take into account the full line length for offset\r\n // comparison\r\n let lines = source.split(/(\\r?\\n)/);\r\n // Separate the lines and newline sequences into separate arrays for easier referencing\r\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\r\n lines = lines.filter((_, idx) => idx % 2 === 0);\r\n let count = 0;\r\n const res = [];\r\n for (let i = 0; i < lines.length; i++) {\r\n count +=\r\n lines[i].length +\r\n ((newlineSequences[i] && newlineSequences[i].length) || 0);\r\n if (count >= start) {\r\n for (let j = i - range; j <= i + range || end > count; j++) {\r\n if (j < 0 || j >= lines.length)\r\n continue;\r\n const line = j + 1;\r\n res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);\r\n const lineLength = lines[j].length;\r\n const newLineSeqLength = (newlineSequences[j] && newlineSequences[j].length) || 0;\r\n if (j === i) {\r\n // push underline\r\n const pad = start - (count - (lineLength + newLineSeqLength));\r\n const length = Math.max(1, end > count ? lineLength - pad : end - start);\r\n res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));\r\n }\r\n else if (j > i) {\r\n if (end > count) {\r\n const length = Math.max(Math.min(end - count, lineLength), 1);\r\n res.push(` | ` + '^'.repeat(length));\r\n }\r\n count += lineLength + newLineSeqLength;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return res.join('\\n');\r\n}\n\n/**\r\n * On the client we only need to offer special cases for boolean attributes that\r\n * have different names from their corresponding dom properties:\r\n * - itemscope -> N/A\r\n * - allowfullscreen -> allowFullscreen\r\n * - formnovalidate -> formNoValidate\r\n * - ismap -> isMap\r\n * - nomodule -> noModule\r\n * - novalidate -> noValidate\r\n * - readonly -> readOnly\r\n */\r\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\r\nconst isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs);\r\n/**\r\n * The full list is needed during SSR to produce the correct initial markup.\r\n */\r\nconst isBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs +\r\n `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,` +\r\n `loop,open,required,reversed,scoped,seamless,` +\r\n `checked,muted,multiple,selected`);\r\n/**\r\n * Boolean attributes should be included if the value is truthy or ''.\r\n * e.g. `<select multiple>` compiles to `{ multiple: '' }`\r\n */\r\nfunction includeBooleanAttr(value) {\r\n return !!value || value === '';\r\n}\r\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\r\nconst attrValidationCache = {};\r\nfunction isSSRSafeAttrName(name) {\r\n if (attrValidationCache.hasOwnProperty(name)) {\r\n return attrValidationCache[name];\r\n }\r\n const isUnsafe = unsafeAttrCharRE.test(name);\r\n if (isUnsafe) {\r\n console.error(`unsafe attribute name: ${name}`);\r\n }\r\n return (attrValidationCache[name] = !isUnsafe);\r\n}\r\nconst propsToAttrMap = {\r\n acceptCharset: 'accept-charset',\r\n className: 'class',\r\n htmlFor: 'for',\r\n httpEquiv: 'http-equiv'\r\n};\r\n/**\r\n * CSS properties that accept plain numbers\r\n */\r\nconst isNoUnitNumericStyleProp = /*#__PURE__*/ makeMap(`animation-iteration-count,border-image-outset,border-image-slice,` +\r\n `border-image-width,box-flex,box-flex-group,box-ordinal-group,column-count,` +\r\n `columns,flex,flex-grow,flex-positive,flex-shrink,flex-negative,flex-order,` +\r\n `grid-row,grid-row-end,grid-row-span,grid-row-start,grid-column,` +\r\n `grid-column-end,grid-column-span,grid-column-start,font-weight,line-clamp,` +\r\n `line-height,opacity,order,orphans,tab-size,widows,z-index,zoom,` +\r\n // SVG\r\n `fill-opacity,flood-opacity,stop-opacity,stroke-dasharray,stroke-dashoffset,` +\r\n `stroke-miterlimit,stroke-opacity,stroke-width`);\r\n/**\r\n * Known attributes, this is used for stringification of runtime static nodes\r\n * so that we don't stringify bindings that cannot be set from HTML.\r\n * Don't also forget to allow `data-*` and `aria-*`!\r\n * Generated from https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes\r\n */\r\nconst isKnownHtmlAttr = /*#__PURE__*/ makeMap(`accept,accept-charset,accesskey,action,align,allow,alt,async,` +\r\n `autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,` +\r\n `border,buffered,capture,challenge,charset,checked,cite,class,code,` +\r\n `codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,` +\r\n `coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,` +\r\n `disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,` +\r\n `formaction,formenctype,formmethod,formnovalidate,formtarget,headers,` +\r\n `height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,` +\r\n `ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,` +\r\n `manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,` +\r\n `open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,` +\r\n `referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,` +\r\n `selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,` +\r\n `start,step,style,summary,tabindex,target,title,translate,type,usemap,` +\r\n `value,width,wrap`);\r\n/**\r\n * Generated from https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute\r\n */\r\nconst isKnownSvgAttr = /*#__PURE__*/ makeMap(`xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,` +\r\n `arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,` +\r\n `baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,` +\r\n `clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,` +\r\n `color-interpolation-filters,color-profile,color-rendering,` +\r\n `contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,` +\r\n `descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,` +\r\n `dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,` +\r\n `fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,` +\r\n `font-family,font-size,font-size-adjust,font-stretch,font-style,` +\r\n `font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,` +\r\n `glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,` +\r\n `gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,` +\r\n `horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,` +\r\n `k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,` +\r\n `lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,` +\r\n `marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,` +\r\n `mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,` +\r\n `name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,` +\r\n `overflow,overline-position,overline-thickness,panose-1,paint-order,path,` +\r\n `pathLength,patternContentUnits,patternTransform,patternUnits,ping,` +\r\n `pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,` +\r\n `preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,` +\r\n `rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,` +\r\n `restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,` +\r\n `specularConstant,specularExponent,speed,spreadMethod,startOffset,` +\r\n `stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,` +\r\n `strikethrough-position,strikethrough-thickness,string,stroke,` +\r\n `stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,` +\r\n `stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,` +\r\n `systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,` +\r\n `text-decoration,text-rendering,textLength,to,transform,transform-origin,` +\r\n `type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,` +\r\n `unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,` +\r\n `v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,` +\r\n `vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,` +\r\n `writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,` +\r\n `xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,` +\r\n `xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`);\n\nfunction normalizeStyle(value) {\r\n if (isArray(value)) {\r\n const res = {};\r\n for (let i = 0; i < value.length; i++) {\r\n const item = value[i];\r\n const normalized = isString(item)\r\n ? parseStringStyle(item)\r\n : normalizeStyle(item);\r\n if (normalized) {\r\n for (const key in normalized) {\r\n res[key] = normalized[key];\r\n }\r\n }\r\n }\r\n return res;\r\n }\r\n else if (isString(value)) {\r\n return value;\r\n }\r\n else if (isObject(value)) {\r\n return value;\r\n }\r\n}\r\nconst listDelimiterRE = /;(?![^(]*\\))/g;\r\nconst propertyDelimiterRE = /:(.+)/;\r\nfunction parseStringStyle(cssText) {\r\n const ret = {};\r\n cssText.split(listDelimiterRE).forEach(item => {\r\n if (item) {\r\n const tmp = item.split(propertyDelimiterRE);\r\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\r\n }\r\n });\r\n return ret;\r\n}\r\nfunction stringifyStyle(styles) {\r\n let ret = '';\r\n if (!styles || isString(styles)) {\r\n return ret;\r\n }\r\n for (const key in styles) {\r\n const value = styles[key];\r\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\r\n if (isString(value) ||\r\n (typeof value === 'number' && isNoUnitNumericStyleProp(normalizedKey))) {\r\n // only render valid values\r\n ret += `${normalizedKey}:${value};`;\r\n }\r\n }\r\n return ret;\r\n}\r\nfunction normalizeClass(value) {\r\n let res = '';\r\n if (isString(value)) {\r\n res = value;\r\n }\r\n else if (isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n const normalized = normalizeClass(value[i]);\r\n if (normalized) {\r\n res += normalized + ' ';\r\n }\r\n }\r\n }\r\n else if (isObject(value)) {\r\n for (const name in value) {\r\n if (value[name]) {\r\n res += name + ' ';\r\n }\r\n }\r\n }\r\n return res.trim();\r\n}\r\nfunction normalizeProps(props) {\r\n if (!props)\r\n return null;\r\n let { class: klass, style } = props;\r\n if (klass && !isString(klass)) {\r\n props.class = normalizeClass(klass);\r\n }\r\n if (style) {\r\n props.style = normalizeStyle(style);\r\n }\r\n return props;\r\n}\n\n// These tag configs are shared between compiler-dom and runtime-dom, so they\r\n// https://developer.mozilla.org/en-US/docs/Web/HTML/Element\r\nconst HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +\r\n 'header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,' +\r\n 'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +\r\n 'data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,' +\r\n 'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +\r\n 'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +\r\n 'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +\r\n 'option,output,progress,select,textarea,details,dialog,menu,' +\r\n 'summary,template,blockquote,iframe,tfoot';\r\n// https://developer.mozilla.org/en-US/docs/Web/SVG/Element\r\nconst SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +\r\n 'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +\r\n 'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +\r\n 'feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +\r\n 'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +\r\n 'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +\r\n 'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +\r\n 'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +\r\n 'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +\r\n 'text,textPath,title,tspan,unknown,use,view';\r\nconst VOID_TAGS = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';\r\nconst isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS);\r\nconst isSVGTag = /*#__PURE__*/ makeMap(SVG_TAGS);\r\nconst isVoidTag = /*#__PURE__*/ makeMap(VOID_TAGS);\n\nconst escapeRE = /[\"'&<>]/;\r\nfunction escapeHtml(string) {\r\n const str = '' + string;\r\n const match = escapeRE.exec(str);\r\n if (!match) {\r\n return str;\r\n }\r\n let html = '';\r\n let escaped;\r\n let index;\r\n let lastIndex = 0;\r\n for (index = match.index; index < str.length; index++) {\r\n switch (str.charCodeAt(index)) {\r\n case 34: // \"\r\n escaped = '&quot;';\r\n break;\r\n case 38: // &\r\n escaped = '&amp;';\r\n break;\r\n case 39: // '\r\n escaped = '&#39;';\r\n break;\r\n case 60: // <\r\n escaped = '&lt;';\r\n break;\r\n case 62: // >\r\n escaped = '&gt;';\r\n break;\r\n default:\r\n continue;\r\n }\r\n if (lastIndex !== index) {\r\n html += str.slice(lastIndex, index);\r\n }\r\n lastIndex = index + 1;\r\n html += escaped;\r\n }\r\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\r\n}\r\n// https://www.w3.org/TR/html52/syntax.html#comments\r\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\r\nfunction escapeHtmlComment(src) {\r\n return src.replace(commentStripRE, '');\r\n}\n\nfunction looseCompareArrays(a, b) {\r\n if (a.length !== b.length)\r\n return false;\r\n let equal = true;\r\n for (let i = 0; equal && i < a.length; i++) {\r\n equal = looseEqual(a[i], b[i]);\r\n }\r\n return equal;\r\n}\r\nfunction looseEqual(a, b) {\r\n if (a === b)\r\n return true;\r\n let aValidType = isDate(a);\r\n let bValidType = isDate(b);\r\n if (aValidType || bValidType) {\r\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\r\n }\r\n aValidType = isArray(a);\r\n bValidType = isArray(b);\r\n if (aValidType || bValidType) {\r\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\r\n }\r\n aValidType = isObject(a);\r\n bValidType = isObject(b);\r\n if (aValidType || bValidType) {\r\n /* istanbul ignore if: this if will probably never be called */\r\n if (!aValidType || !bValidType) {\r\n return false;\r\n }\r\n const aKeysCount = Object.keys(a).length;\r\n const bKeysCount = Object.keys(b).length;\r\n if (aKeysCount !== bKeysCount) {\r\n return false;\r\n }\r\n for (const key in a) {\r\n const aHasKey = a.hasOwnProperty(key);\r\n const bHasKey = b.hasOwnProperty(key);\r\n if ((aHasKey && !bHasKey) ||\r\n (!aHasKey && bHasKey) ||\r\n !looseEqual(a[key], b[key])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return String(a) === String(b);\r\n}\r\nfunction looseIndexOf(arr, val) {\r\n return arr.findIndex(item => looseEqual(item, val));\r\n}\n\n/**\r\n * For converting {{ interpolation }} values to displayed strings.\r\n * @private\r\n */\r\nconst toDisplayString = (val) => {\r\n return val == null\r\n ? ''\r\n : isArray(val) ||\r\n (isObject(val) &&\r\n (val.toString === objectToString || !isFunction(val.toString)))\r\n ? JSON.stringify(val, replacer, 2)\r\n : String(val);\r\n};\r\nconst replacer = (_key, val) => {\r\n // can't use isRef here since @vue/shared has no deps\r\n if (val && val.__v_isRef) {\r\n return replacer(_key, val.value);\r\n }\r\n else if (isMap(val)) {\r\n return {\r\n [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val]) => {\r\n entries[`${key} =>`] = val;\r\n return entries;\r\n }, {})\r\n };\r\n }\r\n else if (isSet(val)) {\r\n return {\r\n [`Set(${val.size})`]: [...val.values()]\r\n };\r\n }\r\n else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\r\n return String(val);\r\n }\r\n return val;\r\n};\n\nconst EMPTY_OBJ = (process.env.NODE_ENV !== 'production')\r\n ? Object.freeze({})\r\n : {};\r\nconst EMPTY_ARR = (process.env.NODE_ENV !== 'production') ? Object.freeze([]) : [];\r\nconst NOOP = () => { };\r\n/**\r\n * Always return false.\r\n */\r\nconst NO = () => false;\r\nconst onRE = /^on[^a-z]/;\r\nconst isOn = (key) => onRE.test(key);\r\nconst isModelListener = (key) => key.startsWith('onUpdate:');\r\nconst extend = Object.assign;\r\nconst remove = (arr, el) => {\r\n const i = arr.indexOf(el);\r\n if (i > -1) {\r\n arr.splice(i, 1);\r\n }\r\n};\r\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\r\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\r\nconst isArray = Array.isArray;\r\nconst isMap = (val) => toTypeString(val) === '[object Map]';\r\nconst isSet = (val) => toTypeString(val) === '[object Set]';\r\nconst isDate = (val) => val instanceof Date;\r\nconst isFunction = (val) => typeof val === 'function';\r\nconst isString = (val) => typeof val === 'string';\r\nconst isSymbol = (val) => typeof val === 'symbol';\r\nconst isObject = (val) => val !== null && typeof val === 'object';\r\nconst isPromise = (val) => {\r\n return isObject(val) && isFunction(val.then) && isFunction(val.catch);\r\n};\r\nconst objectToString = Object.prototype.toString;\r\nconst toTypeString = (value) => objectToString.call(value);\r\nconst toRawType = (value) => {\r\n // extract \"RawType\" from strings like \"[object RawType]\"\r\n return toTypeString(value).slice(8, -1);\r\n};\r\nconst isPlainObject = (val) => toTypeString(val) === '[object Object]';\r\nconst isIntegerKey = (key) => isString(key) &&\r\n key !== 'NaN' &&\r\n key[0] !== '-' &&\r\n '' + parseInt(key, 10) === key;\r\nconst isReservedProp = /*#__PURE__*/ makeMap(\r\n// the leading comma is intentional so empty string \"\" is also included\r\n',key,ref,ref_for,ref_key,' +\r\n 'onVnodeBeforeMount,onVnodeMounted,' +\r\n 'onVnodeBeforeUpdate,onVnodeUpdated,' +\r\n 'onVnodeBeforeUnmount,onVnodeUnmounted');\r\nconst cacheStringFunction = (fn) => {\r\n const cache = Object.create(null);\r\n return ((str) => {\r\n const hit = cache[str];\r\n return hit || (cache[str] = fn(str));\r\n });\r\n};\r\nconst camelizeRE = /-(\\w)/g;\r\n/**\r\n * @private\r\n */\r\nconst camelize = cacheStringFunction((str) => {\r\n return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));\r\n});\r\nconst hyphenateRE = /\\B([A-Z])/g;\r\n/**\r\n * @private\r\n */\r\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase());\r\n/**\r\n * @private\r\n */\r\nconst capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));\r\n/**\r\n * @private\r\n */\r\nconst toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);\r\n// compare whether a value has changed, accounting for NaN.\r\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\r\nconst invokeArrayFns = (fns, arg) => {\r\n for (let i = 0; i < fns.length; i++) {\r\n fns[i](arg);\r\n }\r\n};\r\nconst def = (obj, key, value) => {\r\n Object.defineProperty(obj, key, {\r\n configurable: true,\r\n enumerable: false,\r\n value\r\n });\r\n};\r\nconst toNumber = (val) => {\r\n const n = parseFloat(val);\r\n return isNaN(n) ? val : n;\r\n};\r\nlet _globalThis;\r\nconst getGlobalThis = () => {\r\n return (_globalThis ||\r\n (_globalThis =\r\n typeof globalThis !== 'undefined'\r\n ? globalThis\r\n : typeof self !== 'undefined'\r\n ? self\r\n : typeof window !== 'undefined'\r\n ? window\r\n : typeof global !== 'undefined'\r\n ? global\r\n : {}));\r\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isDate, isFunction, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isModelListener, isNoUnitNumericStyleProp, isObject, isOn, isPlainObject, isPromise, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","import { NOOP } from '@vue/shared'\nimport { Plugin } from 'vue'\n\nexport type SFCWithInstall<T> = T & Plugin\n\nexport const withInstall = <T, E extends Record<string, any>>(\n main: T,\n extra?: E\n) => {\n (main as SFCWithInstall<T>).install = (app): void => {\n for (const comp of [main, ...Object.values(extra ?? {})]) {\n app.component(comp.name, comp)\n }\n }\n\n if (extra) {\n for (const [key, comp] of Object.entries(extra)) {\n (main as any)[key] = comp\n }\n }\n return main as SFCWithInstall<T> & E\n}\n\nexport const withInstallFunction = <T>(fn: T, name: string) => {\n (fn as SFCWithInstall<T>).install = (app) => {\n app.config.globalProperties[name] = fn\n }\n\n return fn as SFCWithInstall<T>\n}\n\nexport const withNoopInstall = <T>(component: T) => {\n (component as SFCWithInstall<T>).install = NOOP\n\n return component as SFCWithInstall<T>\n}\n","import { PropType } from 'vue'\nimport { ManipulateType } from 'dayjs'\n\nexport interface DateOperate {\n type: 'add' | 'minus'\n value: number\n mode: ManipulateType\n}\n\ninterface Event {\n // 当前组件触发什么事件类型后执行\n on: string\n // 被触发的组件id\n target: string\n // 被触发的组件:想要触发事件的类型\n emit: string\n}\n\nexport type Events = Event []\n\nexport type RequestMethod = 'get' | 'post' | 'put' | 'delete' | 'head'\n\nexport interface RequestParam {\n key: string,\n value: any\n}\n\nexport type RequestParams = RequestParam []\n\nexport interface Props {\n id: string // 组件Id,使用UUID\n name: string // 组件名称\n keyName: string // 控件\n type: string // 组件类型\n width: string // 组件宽度\n height: string // 组件高度\n position: string // 定位\n top: string // 组件左上定点x轴位置(相对于画布)\n left: string // 组件左上定点y轴位置(相对于画布)\n zIndex: number // 组件层级\n rotate: string // 旋转角度\n isShow: boolean // 是否展示\n isRender: boolean // 是否渲染\n events: Events\n requestUrl: string // 请求地址\n requestMethod: RequestMethod // 请求方式\n requestHeaders: { [key: string]: any } // 请求头部\n isOpenRequestTimer: boolean // 开启请求定时器\n requestInterval: number // 请求间隔\n requestParams: RequestParams // 请求参数\n requestSort: number, // 请求初始化优先级,越大越优先\n dataType: 'static' | 'request' | 'indicator'\n}\n\nexport const props: Props = {\n id: '',\n name: '',\n keyName: '',\n type: '',\n width: '100px',\n height: '40px',\n position: 'absolute',\n top: '0px',\n left: '0px',\n zIndex: 1,\n rotate: '0deg',\n isShow: true,\n isRender: true,\n requestUrl: '',\n requestMethod: 'get',\n requestHeaders: {},\n isOpenRequestTimer: false,\n requestInterval: 1,\n requestSort: 0,\n requestParams: [{ key: null, value: { } }],\n events: [],\n dataType: 'static'\n}\n\nexport const transformToComponentProps = <T extends {}>(props: T) => {\n // mapValues方法: 第一参数是要遍历的对象, 第二个参数是每次迭代时调用的函数\n // return mapValues(props, (value) => {\n // if (value == null) return {}\n // return {\n // type: (value as any).constructor,\n // default: value\n // }\n // })\n // eslint-disable-next-line no-use-before-define\n const componentProps = {} as { [P in keyof T]: { type?: PropType<T[P]>, default?: T[P] } }\n if (typeof props === 'object' && props != null) {\n for (const prop in props) {\n const value = props[prop]\n componentProps[prop] = {\n type: (value?.constructor) as PropType<typeof value>,\n default: value\n }\n }\n }\n return componentProps\n}\n\nexport interface EventsProp {\n events: Events\n}\n\ninterface DataItem {\n name: string | number\n value: string | number\n type?: string\n}\n\nexport type Data = DataItem []\n\n// 数据转化映射格式\n\nexport interface KeyTypeDataFieldNames {\n name: string\n types: {\n label: string\n value: string\n } []\n}\n\nexport interface ValueTypeDataFieldNames {\n name: string\n value: string\n type: string\n}\n","import { transformToComponentProps } from '@/utils/props'\n\nexport interface PageConfig{\n width: string\n height: string\n backgroundColor: string\n backgroundImage: string\n backgroundSize: string\n contextRequestUrl: string\n mode: 'normal' | 'preview'\n}\n\n// 页面组件默认配置\nexport const pageConfig:PageConfig = {\n width: '1920px',\n height: '1080px',\n backgroundColor: '#ffffff',\n backgroundImage: '',\n backgroundSize: '100% 100%',\n contextRequestUrl: '',\n mode: 'normal'\n}\n\n// 转化默认属性\nexport const pageConfigComponentProps = transformToComponentProps(pageConfig)\n","import { computed, HTMLAttributes } from 'vue'\nimport { pick, without } from 'lodash-es'\n// 需要添加组件的 style 属性\nconst styleList = [\n 'width',\n 'height',\n 'color',\n 'position',\n 'top',\n 'left',\n 'rotate',\n 'fontSize',\n 'fontFamily',\n 'fontWeight',\n 'textDecoration',\n 'textAlign',\n 'lineHeight',\n 'verticalAlign',\n 'overflow',\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundSize',\n 'borderWidth',\n 'borderStyle',\n 'borderRadius',\n 'borderColor',\n 'textShadow',\n 'justifyContent',\n 'alignItems',\n 'zIndex'\n]\n/**\n * 过滤不是 style 属性的组件属性\n * @param props 组件属性\n * @param excludeStyleList 剔除组件的属性\n * @returns style属性\n */\nexport const usePickComponentStyle = <T>(props: Readonly<Partial<T>>, excludeStyleList: string [] = []) => {\n // 再选择需要的组件属性\n const finalStyleList = without(styleList, ...excludeStyleList)\n return computed<HTMLAttributes>(() => pick(props, finalStyleList))\n}\n\nexport default usePickComponentStyle\n","export const EVENT_BUS = 'EVENT_BUS'\nexport const GLOBAL_CONFIG = 'GLOBAL_CONFIG'\nexport const GLOBAL_MODEL = 'GLOBAL_MODEL'\nexport const REQUEST_MODEL = 'REQUEST_MODEL'\nexport const GLOBAL_TOKEN = 'GLOBAL_TOKEN'\nexport const REFRESH_PAGE = 'REFRESH_PAGE'\nexport const MODAL_MODEL = 'MODAL_MODEL'\nexport const ZOOM_FONT_SIZE = 18\n// @ts-ignore\nexport const INDICATOR_URL = window?.config?.indicatorURL\n// @ts-ignore\nexport const UPLOAD_PATH = window?.config?.uploadPath || '/api'\n// @ts-ignore\nexport const BASE_URL = window?.config?.routerBaseURL || './'\n// @ts-ignore\nexport const ERD_URL = window?.config?.erdURL || ''\n","import { watch, inject } from 'vue'\nimport { EVENT_BUS } from '@/utils/constant'\nexport const useOnEvent = <T extends { [id: string]: any}>(props: Readonly<Partial<T>>, events: { [key: string]: any }) => {\n watch(() => props.id, (id) => {\n const eventBus = inject(EVENT_BUS, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n onEvent: (i: string, e: { [key: string]: any }) => void 0\n })\n if (id != null && id !== '') {\n eventBus.onEvent(id, events)\n }\n }, {\n immediate: true\n })\n}\n\nexport default useOnEvent\n","import { inject, ref } from 'vue'\nimport { EVENT_BUS, GLOBAL_CONFIG } from '@/utils/constant'\n/**\n * 触发事件\n * @param props 事件数据\n */\nexport const useEmitEvent = (props: { [key:string]: any }) => {\n const events = props.events\n const id = props.id\n const eventBus = inject(EVENT_BUS, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n emitEvent: (id:string, type: string) => void 0\n })\n\n const { touchEventId } = inject(GLOBAL_CONFIG, {\n touchEventId: ref('')\n })\n /**\n * @param on 触发事件\n * @param callback 回调函数\n */\n return (on: string, callback: Function = () => {}) => {\n return function () {\n // 透传\n callback.call(this, ...arguments)\n const { emitEvent } = eventBus\n events.forEach(event => {\n if (on === event.on) {\n try {\n // 设置当前触发组件的ID\n touchEventId.value = id\n emitEvent(event.target, event.emit)\n } catch (e) {\n console.error(e)\n }\n }\n })\n }\n }\n}\n\nexport default useEmitEvent\n","import { Data, ValueTypeDataFieldNames } from '@/utils/props'\n\n/**\n * 图形转化数据\n * @param data 数据\n * @param dataFieldNames 字段映射\n */\nexport const useTransformChartDataByAttrValue = (data: Data, dataFieldNames?: ValueTypeDataFieldNames) => {\n let { name = 'name', value = 'value', type = 'type' } = dataFieldNames || {}\n // 处去字符串\n name = name?.trim()\n value = value?.trim()\n type = type?.trim()\n const set = new Set()\n const map = new Map()\n const len = data.length\n for (let i = 0; i < len; i++) {\n const item = data[i]\n // x轴\n const x = item[name] || ''\n // y轴\n const y = item[value] || ''\n // 系列(类型)\n const t = item[type] || ''\n set.add(x)\n if (map.has(t)) {\n const arr = map.get(t)\n arr.push({ name: x, value: y, ...item })\n map.set(t, arr)\n } else {\n map.set(t, [{ name: x, value: y, ...item }])\n }\n }\n const dimensions = Array.from(set)\n const dataset: { [key:string]:any } [] = []\n for (const [name, data] of map) {\n dataset.push({\n name,\n data\n })\n }\n return {\n dimensions,\n dataset\n }\n}\nexport default useTransformChartDataByAttrValue\n","import axios from 'axios'\nimport { message } from 'ant-design-vue'\n// @ts-ignore\nconst requestErrorTip = window.config.requestErrorTip\nexport const request = axios.create({\n // timeout: 1000 * 15\n timeout: 1000 * 180\n})\nrequest.interceptors.request.use((response) => {\n return response\n}, (error) => {\n return Promise.reject(error)\n})\nrequest.interceptors.response.use((config) => {\n if (requestErrorTip) {\n if (+config?.data?.code === 500) {\n message.error({\n content: config?.data?.msg || config?.data?.message || '服务器异常',\n key: 'SERVER_ERROR'\n })\n }\n }\n return config\n}, (error) => {\n if (requestErrorTip) {\n if (error.message.includes('timeout')) {\n message.error({\n content: '网络连接超时,请重试!',\n key: 'TIMEOUT'\n })\n } else {\n const { status } = error?.response || {}\n if (status >= 400 && status < 500) {\n message.error({\n content: '请求异常',\n key: 'REQUEST_ERROR'\n })\n }\n\n if (status >= 500) {\n message.error({\n content: '服务器异常',\n key: 'REQUEST_ERROR'\n })\n }\n }\n }\n return Promise.reject(error)\n})\n\nexport default request\n","export const handleAxisLabelFormatter = (formatter: string) => {\n return formatter.replace(/\\\\n/g, '\\n')\n}\n/**\n * 处理图表format, 目前只做 \\\\n => \\n 转化\n * @param formatter 格式化字符串\n */\nexport const handleFormatter = (formatter: string) => {\n return formatter.replace(/\\\\n/g, '\\n')\n}\n\n/**\n * 格式化金额\n * @param value 数值\n * @param decimalPlaces 格式化位数\n */\nexport const formatMoney = (value: string | number, decimalPlaces:number = 2) => {\n const _value = parseFloat(value + '')\n if (isNaN(_value)) return value\n return _value.toFixed(decimalPlaces).replace(/(\\d)(?=(\\d{3})+\\.)/g, '$1,')\n}\n\n/**\n * 格式化千分位\n * @param value 数值\n */\nexport const formatThousands = (value: string | number) => {\n const _value = parseFloat(value + '')\n if (isNaN(_value)) return value\n return (_value + '').replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n}\n\n/**\n * 格式化百分比\n * @param value 数值\n * @param decimalPlaces 格式化位数\n */\nexport const formatPercentage = (value: string | number, decimalPlaces:number = 2) => {\n const strValue = value + ''\n if (strValue.includes('%')) return value\n const _value = parseFloat(strValue)\n if (isNaN(_value)) return value\n return `${(_value * 100).toFixed(decimalPlaces)}%`\n}\n\n/**\n * 字符串1 中是否包含 字符串2 (会全部转成小写)\n * @param v1 字符串1\n * @param v2 字符串2\n * @constructor\n */\nexport const lowerCaseIncludes = (v1:any, v2:any): boolean => {\n if (typeof v1 === 'string' && typeof v2 === 'string') {\n return v1.toLocaleLowerCase().includes(v2.toLocaleLowerCase())\n }\n return false\n}\n","import dayjs from 'dayjs'\nconst runCode = (code: string, data?: { [key:string]: any }) => {\n const useFn = {\n dayjs,\n ...data\n }\n let paramsStr = ''\n const params = []\n for (const key in useFn) {\n paramsStr += `${key},`\n params.push(useFn[key])\n }\n paramsStr = paramsStr.replace(/,$/, '')\n const runFn = `function (${paramsStr}){return ${code}}`\n let result\n try {\n // eslint-disable-next-line no-new-func\n result = Function(`\"use strict\";return (${runFn})`)()(...params)\n } catch (e) {\n // console.error()\n return code\n }\n return result\n}\n\nexport default runCode\n","import runCode from '@/utils/runCode'\nexport const useVariablesInText = (\n formatter: string = '',\n { textData, codeData }: { textData?: { [key:string]: any }, codeData?: { [key:string]: any } } = {},\n { useNewline = false, useSpace = false } = {}\n) => {\n // 引入全局变量\n // @ts-ignore\n const config = window.config || {}\n const data = { ...config, ...textData }\n const variables = (formatter).match(/\\{(.+?)\\}/g)\n if (variables == null || variables.length === 0) {\n return formatter\n }\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n let statement = variable.slice(1, -1).trim()\n const reg = /[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g\n const textVariables = statement.match(reg)\n for (let j = 0; j < textVariables.length; j++) {\n const textVariable = textVariables[j]\n const usedVariable = data[textVariable]\n if (usedVariable != null) {\n // 使用的变量\n statement = statement.replace(textVariable, usedVariable)\n }\n // else {\n // 过滤未使用的变量\n // statement = statement.replace(textVariable, '')\n // }\n }\n if ((/\\(.*\\)/g).test(statement) || (/[+/\\\\*]/g).test(statement)) {\n statement = runCode(statement, codeData)\n }\n formatter = formatter.replace(variable, statement)\n }\n // 替换换行\n if (useNewline) {\n formatter = formatter?.replace(/\\n|\\\\n/g, '<br/>')\n }\n // 替换空格\n if (useSpace) {\n formatter = formatter?.replace(/\\s{2,}?/g, '&nbsp;&nbsp;')\n }\n return formatter\n}\n\nexport default useVariablesInText\n","import { inject, onUnmounted, unref } from 'vue'\nimport request from '@/utils/request'\nimport { GLOBAL_MODEL, GLOBAL_CONFIG } from '@/utils/constant'\nimport { lowerCaseIncludes } from '@/utils/util'\nimport useVariablesInText from './useVariablesInText'\n// import dayjs from 'dayjs'\n\nexport const useRequestData = (props: { [key:string]: any }, callBack: Function = () => {}) => {\n const {\n requestUrl,\n requestMethod: method,\n requestHeaders: headers,\n requestParams,\n requestInterval,\n isOpenRequestTimer\n } = props\n const { contextRequestUrl, touchEventId } = inject(GLOBAL_CONFIG, {\n contextRequestUrl: '',\n touchEventId: ''\n })\n const { getGlobalModel } = inject(GLOBAL_MODEL, {\n getGlobalModel: (_key: string): any => {}\n })\n const url = useVariablesInText(requestUrl)\n const requestData = async (params: { [key: string]: any } = {}) => {\n if (!url || !method || !headers) return\n let _params = {} as { [key: string]: any }\n requestParams.forEach((param) => {\n const { key, value } = param\n if (typeof value === 'object' && value != null && value.id) {\n // 传入数据可能是这样\n // {\n // key: 'record',\n // value: {\n // id: 'T7hid3K4kg7UR9Q-44u1-',\n // prop: 'record',\n // propKey: 'id'\n // }\n // }\n // 获取到组件数据\n let record = {} as { [key:string]: any }\n const { id, prop, propKey, operate } = value\n if (id === 'THIS') {\n // THIS 使用当前触发事件组件的ID\n record = getGlobalModel(unref(touchEventId)) || {}\n } else {\n record = getGlobalModel(id) || {}\n }\n const p = unref(record[prop])\n // 如果传入响应式数据优取响应式\n let v = null\n // 需要格式日期的组件\n const isDate = ['date', 'range'].some((item) => lowerCaseIncludes(record?.type, item))\n if (isDate) {\n // 操作时间\n const { value, type, mode } = operate || {}\n if (value && type && mode) {\n switch (type) {\n case 'add':\n v = unref(p).add(value, mode)\n break\n case 'minus':\n v = unref(p).subtract(value, mode)\n break\n }\n }\n if (v == null) {\n v = unref(p)\n }\n // 此时 v 是 dayjs 对象\n // 此时 propKey 是格式化值\n // 格式化时间\n v = v?.format(propKey?.trim() || record.format) || ''\n } else {\n // 因为 model[prop] 可能为 ref\n // 判断他是不是对象\n if (Object.prototype.toString.call(p) === '[object Object]') {\n // v = p[propKey || 'value']\n // if (v == null) {\n // v = p\n // }\n if (propKey) {\n v = p[propKey]\n } else {\n v = prop ? p[prop] : p\n }\n } else {\n if (lowerCaseIncludes(record?.type, 'select') && unref(p) && prop && Array.isArray(unref(p))) {\n v = unref(p).map((item: any) => {\n return Object.prototype.hasOwnProperty.call(item, prop) ? item[prop] : item\n })\n } else {\n v = p\n }\n }\n // v = p != null && typeof p === 'object' ? p[propKey || 'value'] : p\n }\n _params[key] = v\n } else if (typeof value === 'string') {\n _params[key] = useVariablesInText(value)\n }\n })\n // @ts-ignore\n _params = { ...window.config.requestParams, ...params, ..._params }\n let urlParams = ''\n const keys = Object.keys(_params)\n const last = keys.length - 1\n const keysLen = keys.length\n keys.forEach((key, index) => {\n let _param = _params[key]\n if (Object.prototype.toString.call(_param) === '[object Object]') {\n _param = JSON.stringify(_param)\n }\n if (index === 0) {\n if (keysLen !== 1) {\n urlParams += `?${key}=${_param}&`\n } else {\n urlParams += `?${key}=${_param}`\n }\n } else if (index === last) {\n urlParams += `${key}=${_param}`\n } else {\n urlParams += `${key}=${_param}&`\n }\n })\n try {\n const isSetUrlParams = ['get', 'head'].includes(method)\n let urlStr = isSetUrlParams ? url + urlParams : url\n if (_params.dataSqlId && !urlStr.includes('dataSqlId')) {\n urlStr += `${urlStr.includes('?') ? '&' : '?'}dataSqlId=${_params.dataSqlId}`\n }\n const res = await request({\n baseURL: unref(contextRequestUrl) || '',\n url: urlStr,\n method,\n headers,\n data: isSetUrlParams ? {} : _params\n })\n callBack(res)\n return res\n } catch (e) {\n console.error(e)\n }\n }\n\n const requestDataTimer = isOpenRequestTimer && setInterval(requestData, requestInterval * 1000)\n\n onUnmounted(() => {\n clearInterval(requestDataTimer)\n })\n\n return requestData\n}\n\nexport default useRequestData\n","import { Data, KeyTypeDataFieldNames } from '@/utils/props'\n\n/**\n * 图形转化数据\n * @param data 数据\n * @param dataFieldNames 字段映射\n */\nexport const useTransformChartDataByAttrKey = (data: Data = [], dataFieldNames: KeyTypeDataFieldNames) => {\n let { name = 'name', types = [] } = dataFieldNames || {}\n name = name?.trim() || name\n const set = new Set()\n const map = new Map<string, any []>()\n const dataLen = data.length\n const typesLen = types.length\n // 只有一条记录\n if (dataLen === 1) {\n const vs = []\n // data 为一个值取第一个\n for (let i = 0; i < typesLen; i++) {\n const type = types[i]\n const { label, value } = type\n const v = { ...data[0], value: data[0][value] }\n set.add(label)\n // 值列表\n vs.push(v)\n }\n const n = data[0][name] || ''\n map.set(n, vs)\n } else {\n for (let i = 0; i < dataLen; i++) {\n const item = data[i]\n const x = item[name]\n set.add(x)\n for (let j = 0; j < typesLen; j++) {\n const type = types[j]\n const { label, value } = type\n const v = { ...item, value: item[value] }\n if (map.has(label)) {\n const m = map.get(label)\n m.push(v)\n map.set(label, m)\n } else {\n map.set(label, [v])\n }\n }\n }\n }\n\n const dimensions = Array.from(set)\n const dataset: { [key:string]:any } [] = []\n for (const [name, data] of map) {\n dataset.push({\n name,\n data\n })\n }\n return {\n dimensions,\n dataset\n }\n}\n\nexport default useTransformChartDataByAttrKey\n","export const useImagePath = (path:string, isFormat: boolean = false) => {\n if (!path) return path\n let imagePath: string = ''\n if (path?.includes('://')) {\n imagePath = path\n } else {\n // @ts-ignore\n imagePath = window?.config?.uploadPath + path\n }\n if (isFormat) {\n imagePath = `url(${imagePath})`\n }\n return imagePath\n}\n\nexport default useImagePath\n","import { BASE_URL } from '@/utils/constant'\nexport const usePageUrl = (pageMode: string, pageId: string) => {\n const envPageUrl = `${BASE_URL}/preview?pageId=${pageId}`\n const proPageUrl = `${BASE_URL}/${pageId}`\n return pageMode === 'preview' ? envPageUrl : proPageUrl\n}\n\nexport default usePageUrl\n","import runCode from '@/utils/runCode'\nexport const useValueFormatter = (formatter: string, value:string) => {\n if (formatter == null) return value\n const variables = (formatter).match(/\\{.*\\}/g)\n if (variables == null || variables.length === 0) {\n return value\n }\n const len = variables.length\n for (let i = 0; i < len; i++) {\n const variable = variables[i]\n if (variable == null || variable === '') break\n let statement = variable.slice(1, -1)?.trim()\n statement = statement?.replace(/value/g, value)\n try {\n let result = statement\n if ((/\\(.*\\)/g).test(statement) || (/[+/\\\\*]/g).test(statement)) {\n result = runCode(statement)\n }\n formatter = formatter.replace(variable, result)\n } catch (e) {\n formatter = formatter.replace(variable, statement)\n }\n }\n return formatter\n}\n\nexport default useValueFormatter\n","import { GLOBAL_MODEL, INDICATOR_URL, GLOBAL_TOKEN } from '@/utils/constant'\nimport { lowerCaseIncludes } from '@/utils/util'\nimport request from '@/utils/request'\nimport { inject, unref } from 'vue'\n\nexport const useIndicatorData = (props: { [key:string]: any } = {}) => {\n const { requestToken } = inject(GLOBAL_TOKEN, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n requestToken: () => void 0\n })\n // 指标库模式才会发\n if (props.dataType === 'indicator') {\n // 只要调用,计数 + 1,计数大于0才会请求\n requestToken()\n }\n\n const handleQueryColumn = (queryColumn: { [key:string]: any } = {}) => {\n const { label, name, location, show, indexCode } = queryColumn\n return {\n label,\n columnName: name,\n location,\n show,\n calcType: 'COLUMN',\n hrpIndexCode: indexCode\n }\n }\n\n const handleIndicator = (indicator: { [key:string]: any } = {}) => {\n const {\n label,\n name,\n location,\n show,\n indexCode,\n calcType = 'COLUMN',\n builtInFormula,\n builtInValueSource,\n builtInCalcWay,\n formula,\n conditions\n } = indicator\n return {\n label,\n columnName: name,\n location,\n show,\n calcType,\n hrpIndexCode: indexCode,\n aggregate: 'SUM',\n builtInFormula,\n builtInValueSource,\n builtInCalcWay,\n formula,\n conditions\n }\n }\n\n const { getGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0\n })\n const handleSqlConditions = (controlList: { [key:string]: any } [] = []) => {\n const len = controlList.length\n console.log('controlList', controlList)\n const sqlConditions = [] as { [key:string]: any } []\n for (let i = 0; i < len; i++) {\n const control = controlList[i]\n const {\n id,\n conditionLabel,\n conditionKey,\n conditionValueType\n } = control\n const sqlCondition: { [key:string]: any } = {\n rule: 'NONE',\n label: conditionLabel,\n fieldName: conditionKey,\n fieldValue: '2020-02', // 在关联控件中取\n dateFormat: 'YYYY-MM',\n valueType: conditionValueType\n }\n // 获取组件属性\n const model = getGlobalModel(id) || {}\n console.log('model', model)\n if (lowerCaseIncludes(model.type, 'date')) {\n const { value, format } = model || {}\n sqlCondition.fieldValue = unref(value)?.format(format)\n sqlCondition.dateFormat = format\n }\n sqlConditions.push(sqlCondition)\n }\n return sqlConditions\n }\n return async () => {\n const { graphicConfig, type } = props\n // 全部属性, 为了属性可拓展,所以在设计器中自由添加\n // classification: { [key:string]: any }\n // series: { [key:string]: any }\n // indicatorList: { [key:string]: any } []\n // sqlConditions: { [key:string]: any } []\n // idxLibMode: string\n // source: string\n // dataViewId: string\n let {\n source,\n dataViewId,\n plugin = '1', // 插件类型\n layer, // 后台图表类型,值分0,1\n chartType, // 前端图表类型,实测没用\n classificationList = [],\n seriesList = [],\n leftAxisList = [],\n rightAxisList = [],\n queryColumnList = [],\n indicators = [],\n controlList = [],\n dataSourceId, // 所属数据源ID\n idxLibMode, // 指标库模式, source= INDICATOR_LIB时候必填, NORMAL_YEAR_TABLE = 普通年表, WITH_DATE_DIM_TABLE = 带有时间维度表\n preview = false // 预览开关\n } = graphicConfig || {}\n // 图类型,1=表 2=图\n if (layer == null) {\n if (lowerCaseIncludes(type, 'table')) {\n layer = '1'\n } else {\n layer = '2'\n }\n }\n // console.log('classificationList', classificationList)\n // console.log('seriesList', seriesList)\n // console.log('leftAxisList', leftAxisList)\n // console.log('rightAxisList', rightAxisList)\n // console.log('indicators', indicators)\n // console.log('controlList', controlList)\n // 重点处理 classificationList、seriesList、leftAxisList、rightAxisList、indicators\n // classificationList (取第一项) => classification\n let classification\n if (Array.isArray(classificationList) && classificationList.length > 0) {\n const len = classificationList.length\n for (let i = 0; i < len; i++) {\n const item = classificationList[i] || {}\n const { label = '', name = '', show = false, sort, customGroup, conditions } = item\n // 如果是 show 直接提取 classification,停止遍历\n if (show || len === 1) {\n classification = {\n label,\n columnName: name,\n show,\n sort,\n customGroup,\n conditions\n }\n break\n }\n }\n }\n // seriesList (取第一项) => series\n let series\n if (Array.isArray(seriesList) && seriesList.length > 0) {\n const len = seriesList.length\n for (let i = 0; i < len; i++) {\n const item = seriesList[i] || {}\n const { label = '', name = '', show = false, sort, customGroup, conditions } = item\n // 如果是 show 直接提取 seriesList,停止遍历\n if (show || len === 1) {\n series = {\n label,\n columnName: name,\n show,\n sort,\n customGroup,\n conditions\n }\n break\n }\n }\n }\n // queryColumnList => queryColumns\n const queryColumns = []\n queryColumnList?.forEach((queryColumn: { [key:string]: any }) => {\n queryColumns.push(handleQueryColumn(queryColumn))\n })\n\n // leftAxisList + rightAxisList + indicators => indicatorList\n const indicatorList = []\n leftAxisList?.forEach((leftAxis: { [key:string]: any }) => {\n leftAxis.location = 'LEFT'\n indicatorList.push(handleIndicator(leftAxis))\n })\n rightAxisList?.forEach((rightAxis: { [key:string]: any }) => {\n rightAxis.location = 'RIGHT'\n indicatorList.push(handleIndicator(rightAxis))\n })\n indicators?.forEach((indicator: { [key:string]: any }) => {\n indicator.location = 'LEFT'\n indicatorList.push(handleIndicator(indicator))\n })\n // queryColumns 表格配置为空返回\n if (layer === '1' && queryColumns.length === 0) {\n return\n // queryColumns 图表配置为空返回\n } else if (layer === '2' && indicatorList.length === 0) {\n return\n }\n const sqlConditions = handleSqlConditions(controlList)\n // if (graphicConfig?.pageMode === 'design') {\n // relativeList 在设计模式下,由于联动无法直接获取,已经处理好数据直接获取\n // sqlConditions = graphicConfig.sqlConditions ?? []\n // } else {\n // sqlConditions = handleSqlConditions(controlList)\n // }\n try {\n const res = await request.post(`${INDICATOR_URL}/diagram`, {\n source,\n dataViewId,\n plugin,\n layer,\n chartType,\n classification,\n series,\n indicatorList,\n queryColumns,\n pageFlag: true,\n sqlConditions,\n // fixedDimSql: '',\n dataSourceId,\n idxLibMode,\n preview\n },\n {\n headers: {\n // @ts-ignore\n Authentication: window?.config?.indicatorToken,\n operateContext: 'ygt'\n }\n })\n return res\n } catch (e) {\n console.error(e)\n }\n }\n}\n\nexport default useIndicatorData\n","export const useHrefParamsToGlobalVariables = () => {\n const search = window.location.search\n const params = search.slice(1).split('&')\n const len = params.length\n const _params = {}\n for (let i = 0; i < len; i++) {\n const param = params[i]\n if (param == null || param === '') continue\n const keyAndValue = param.split('=')\n if (Array.isArray(keyAndValue)) {\n const key = keyAndValue[0]\n _params[key] = keyAndValue[1]\n }\n }\n\n // @ts-ignore\n window.config.requestParams = {\n // @ts-ignore\n ...window.config.requestParams,\n ..._params\n }\n\n // @ts-ignore\n window.config = {\n // @ts-ignore\n ...window.config,\n ..._params\n }\n}\n\nexport default useHrefParamsToGlobalVariables\n","<template>\n <div id=\"container\" ref=\"container\">\n <template v-if=\"ready\">\n <div\n class=\"page-config\"\n :style=\"style\"\n >\n <slot></slot>\n </div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, nextTick, computed, ref, onMounted, onUnmounted } from 'vue'\nimport { debounce } from 'lodash-es'\nimport { pageConfigComponentProps } from './props'\nimport { useImagePath } from '@/hooks'\nexport default defineComponent({\n name: 'EcanPageConfig',\n inheritAttrs: false,\n props: {\n ...pageConfigComponentProps\n },\n setup (props) {\n // 大屏设计容器\n const style = computed(() => ({\n width: props.width,\n height: props.height,\n backgroundColor: props.backgroundColor,\n backgroundImage: useImagePath(props.backgroundImage as string, true),\n backgroundSize: props.backgroundSize\n }))\n const width = ref(0)\n const height = ref(0)\n const originalWidth = ref(0)\n const originalHeight = ref(0)\n const ready = ref(false)\n const container = ref()\n let observer: MutationObserver | null\n const initSize = () => {\n return new Promise<void>((resolve) => {\n nextTick(() => {\n // 获取大屏的真实尺寸\n if (props.width && props.height) {\n width.value = parseFloat(props.width)\n height.value = parseFloat(props.height)\n } else {\n width.value = container.value.clientWidth\n height.value = container.value.clientHeight\n }\n // 获取画布尺寸\n if (!originalWidth.value || !originalHeight.value) {\n originalWidth.value = window.screen.width\n originalHeight.value = window.screen.height\n }\n resolve()\n })\n })\n }\n const updateSize = () => {\n if (width.value && height.value) {\n container.value.style.width = `${width.value}px`\n container.value.style.height = `${height.value}px`\n } else {\n container.value.style.width = `${originalWidth.value}px`\n container.value.style.height = `${originalHeight.value}px`\n }\n }\n const updateScale = () => {\n // 获取真实的视口尺寸\n const currentWidth = document.body.clientWidth\n const currentHeight = document.body.clientHeight\n // 获取大屏最终的宽高\n const realWidth = width.value || originalWidth.value\n const realHeight = height.value || originalHeight.value\n const widthScale = currentWidth / realWidth\n const heightScale = currentHeight / realHeight\n container.value && (container.value.style.transform = `scale(${widthScale}, ${heightScale})`)\n }\n const onResize = debounce(async () => {\n await initSize()\n updateScale()\n }, 100)\n const initMutationObserver = () => {\n const MutationObserver = window.MutationObserver\n observer = new MutationObserver(onResize)\n observer.observe(container.value, {\n attributes: true,\n attributeFilter: ['style'],\n attributeOldValue: true\n })\n }\n const removeMutationObserver = () => {\n if (observer) {\n observer.disconnect()\n observer.takeRecords()\n observer = null\n }\n }\n onMounted(async () => {\n ready.value = false\n await initSize()\n updateSize()\n updateScale()\n window.addEventListener('resize', onResize)\n initMutationObserver()\n ready.value = true\n })\n onUnmounted(() => {\n window.removeEventListener('resize', onResize)\n removeMutationObserver()\n })\n return {\n style,\n container,\n ready\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n#container {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n transform-origin: left top;\n z-index: 999;\n}\n.page-config {\n position: relative;\n overflow: hidden;\n background-size: cover;\n}\n</style>\n","<template>\n <div id=\"container\" ref=\"container\">\n <template v-if=\"ready\">\n <div\n class=\"page-config\"\n :style=\"style\"\n >\n <slot></slot>\n </div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, nextTick, computed, ref, onMounted, onUnmounted } from 'vue'\nimport { debounce } from 'lodash-es'\nimport { pageConfigComponentProps } from './props'\nimport { useImagePath } from '@/hooks'\nexport default defineComponent({\n name: 'EcanPageConfig',\n inheritAttrs: false,\n props: {\n ...pageConfigComponentProps\n },\n setup (props) {\n // 大屏设计容器\n const style = computed(() => ({\n width: props.width,\n height: props.height,\n backgroundColor: props.backgroundColor,\n backgroundImage: useImagePath(props.backgroundImage as string, true),\n backgroundSize: props.backgroundSize\n }))\n const width = ref(0)\n const height = ref(0)\n const originalWidth = ref(0)\n const originalHeight = ref(0)\n const ready = ref(false)\n const container = ref()\n let observer: MutationObserver | null\n const initSize = () => {\n return new Promise<void>((resolve) => {\n nextTick(() => {\n // 获取大屏的真实尺寸\n if (props.width && props.height) {\n width.value = parseFloat(props.width)\n height.value = parseFloat(props.height)\n } else {\n width.value = container.value.clientWidth\n height.value = container.value.clientHeight\n }\n // 获取画布尺寸\n if (!originalWidth.value || !originalHeight.value) {\n originalWidth.value = window.screen.width\n originalHeight.value = window.screen.height\n }\n resolve()\n })\n })\n }\n const updateSize = () => {\n if (width.value && height.value) {\n container.value.style.width = `${width.value}px`\n container.value.style.height = `${height.value}px`\n } else {\n container.value.style.width = `${originalWidth.value}px`\n container.value.style.height = `${originalHeight.value}px`\n }\n }\n const updateScale = () => {\n // 获取真实的视口尺寸\n const currentWidth = document.body.clientWidth\n const currentHeight = document.body.clientHeight\n // 获取大屏最终的宽高\n const realWidth = width.value || originalWidth.value\n const realHeight = height.value || originalHeight.value\n const widthScale = currentWidth / realWidth\n const heightScale = currentHeight / realHeight\n container.value && (container.value.style.transform = `scale(${widthScale}, ${heightScale})`)\n }\n const onResize = debounce(async () => {\n await initSize()\n updateScale()\n }, 100)\n const initMutationObserver = () => {\n const MutationObserver = window.MutationObserver\n observer = new MutationObserver(onResize)\n observer.observe(container.value, {\n attributes: true,\n attributeFilter: ['style'],\n attributeOldValue: true\n })\n }\n const removeMutationObserver = () => {\n if (observer) {\n observer.disconnect()\n observer.takeRecords()\n observer = null\n }\n }\n onMounted(async () => {\n ready.value = false\n await initSize()\n updateSize()\n updateScale()\n window.addEventListener('resize', onResize)\n initMutationObserver()\n ready.value = true\n })\n onUnmounted(() => {\n window.removeEventListener('resize', onResize)\n removeMutationObserver()\n })\n return {\n style,\n container,\n ready\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n#container {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n transform-origin: left top;\n z-index: 999;\n}\n.page-config {\n position: relative;\n overflow: hidden;\n background-size: cover;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport PageConfig from './PageConfig.vue'\nexport const EcanPageConfig = withInstall(PageConfig)\nexport default EcanPageConfig\nexport * from './props'\n","import { transformToComponentProps } from '@/utils/props'\n\nexport interface ProviderConfig {\n contextRequestUrl: string // 请求头\n pageMode: 'normal' | 'preview' | 'design' // 普通、预览、设计模式\n theme: 'light' | 'darkBlue'\n containerMap: { [key:string]: { [key: string]: string [] } }\n}\n\nexport const providerConfig: ProviderConfig = {\n contextRequestUrl: '',\n pageMode: 'normal',\n theme: 'light',\n containerMap: {}\n}\n\n// 转化默认属性\nexport const providerConfigComponentProps = transformToComponentProps(providerConfig)\n","<template>\n <!-- 请勿去除属性id -->\n <div id=\"ProviderConfig\" ref=\"providerConfig\">\n <slot></slot>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, provide, ref, onMounted, watch, computed, unref, onBeforeUnmount } from 'vue'\nimport mitt from 'mitt'\nimport {\n EVENT_BUS,\n GLOBAL_CONFIG,\n GLOBAL_MODEL,\n REQUEST_MODEL,\n INDICATOR_URL,\n GLOBAL_TOKEN,\n REFRESH_PAGE,\n MODAL_MODEL\n} from '@/utils/constant'\nimport { providerConfigComponentProps } from './props'\nimport { useVariablesInText, useHrefParamsToGlobalVariables } from '@/hooks'\nimport axios from 'axios'\nimport request from '@/utils/request'\nimport { RequestModalParam } from '@/utils/types'\n\nexport default defineComponent({\n name: 'EcanProviderConfig',\n inheritAttrs: false,\n props: {\n ...providerConfigComponentProps\n },\n setup (props, { expose }) {\n useHrefParamsToGlobalVariables()\n\n const providerConfig = ref<HTMLElement>()\n const setTheme = () => {\n providerConfig.value.setAttribute('datav-theme', props.theme)\n }\n watch(() => props.theme, () => {\n setTheme()\n })\n onMounted(() => {\n setTheme()\n })\n const contextRequestUrl = computed(() => useVariablesInText(props.contextRequestUrl))\n const pageMode = computed(() => props.pageMode)\n const theme = computed(() => props.theme)\n // 当前组件主动触发ID\n const touchEventId = ref<string>('')\n // 提供全局设置\n provide(GLOBAL_CONFIG, {\n // 请求地址\n contextRequestUrl,\n // 模式(设计、预览、正常):目前主要配置初始化是否发起请求\n pageMode,\n // 主题\n theme,\n touchEventId\n })\n\n // 提供全局变量\n const globalModel = new Map()\n console.log('globalModel', globalModel)\n const getGlobalModel = (key: string) => {\n return globalModel.get(key)\n }\n const setGlobalModel = (key: string, value: any) => {\n globalModel.set(key, value)\n }\n provide(GLOBAL_MODEL, {\n getGlobalModel,\n setGlobalModel\n })\n\n // 弹窗数据\n const useModalIds: string [] = []\n const popUseModalIds = () => {\n useModalIds.pop()\n }\n const pushUseModalIds = (id: string) => {\n useModalIds.push(id)\n }\n const modalModel = new Map()\n const getModalModel = (key: string) => {\n return modalModel.get(key)\n }\n const setModalModel = (key: string, value: any) => {\n modalModel.set(key, value)\n }\n provide(MODAL_MODEL, {\n popUseModalIds,\n pushUseModalIds,\n getModalModel,\n setModalModel\n })\n\n // 提供事件\n const eventBus = mitt()\n const eventBusKeySet = new Set<string>()\n const onEvent = (key: string, events: { [key:string]: any }) => {\n eventBusKeySet.add(key)\n eventBus.on(key, (k: string) => {\n return typeof events[k] === 'function' && events[k]()\n })\n onBeforeUnmount(() => {\n offEvent(key)\n })\n }\n const offEvent = (key) => {\n eventBusKeySet.delete(key)\n eventBus.off(key)\n }\n const emitEvent = (key: string, eventName: string) => {\n if (key === 'PAGE') {\n const len = useModalIds.length\n let keys: string [] = []\n if (len === 0) {\n keys = [...eventBusKeySet]\n } else {\n const currentModalId = useModalIds[len - 1]\n keys = [...getModalModel(currentModalId)]\n }\n keys.forEach((key) => {\n eventBus.emit(key, eventName)\n })\n } else {\n eventBus.emit(key, eventName)\n }\n }\n provide(EVENT_BUS, {\n onEvent,\n offEvent,\n emitEvent\n })\n\n // 设置是否请求 token\n const tokenNum = ref(0)\n const requestToken = () => {\n tokenNum.value = unref(tokenNum) + 1\n }\n provide(GLOBAL_TOKEN, {\n requestToken\n })\n // 请求排序\n const requestModel = new Map()\n const requestMap = new Map()\n const setRequest = ({ requestFn = () => {}, sortNum = 0, id = '' }: RequestModalParam) => {\n if (requestModel.has(sortNum)) {\n const requestFnList = requestModel.get(sortNum)\n requestFnList?.push(requestFn)\n } else {\n requestModel.set(sortNum, [requestFn])\n }\n requestMap.set(id, requestFn)\n }\n const handleRequestFnList = (requestFnList: Array<Function>) => {\n return new Promise((resolve, reject) => {\n const resultList = requestFnList.map(requestFn => requestFn())\n Promise.all(resultList)\n .then(list => {\n resolve(list)\n })\n .catch(err => {\n reject(err)\n })\n })\n }\n // 指标库模块请求 token\n const queryUserToken = async () => {\n const res = await axios.get(`${INDICATOR_URL}/user/anonymous?username=admin&businessOfficeId=350421`, {\n headers: {\n systemCode: 'F72FC50A3D97372514A6AC33333D28FD',\n current_context: 'ygt',\n Authentication: ''\n }\n })\n // 设置 token 挂载在 window.config 上\n const { token } = res.data?.data || {}\n // @ts-ignore\n window.config.indicatorToken = token\n }\n\n const touchRequest = (id: undefined | string) => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!id) {\n const requestModelArr = Array.from(requestModel)\n // 排序\n requestModelArr.sort((a, b) => b[0] - a[0])\n const len = requestModelArr.length\n try {\n // 指标库模块需要 token\n // 页面不为design 请求次数 token 不为0\n if (props.pageMode !== 'design' && unref(tokenNum) > 0) {\n await queryUserToken()\n }\n for (let i = 0; i < len; i++) {\n const requestFnList = requestModelArr[i][1]\n await handleRequestFnList(requestFnList)\n }\n } catch (e) {\n console.error(e)\n } finally {\n // 执行完直接清空\n requestModel.clear()\n resolve(null)\n }\n } else if (typeof id === 'string') {\n const requestFn = requestMap.get(id)\n if (typeof requestFn === 'function') {\n const id = request.interceptors.response.use((response) => {\n resolve(response)\n return response\n }, (error) => {\n reject(error)\n return Promise.reject(error)\n })\n requestFn()\n // 使用完必须注销\n request.interceptors.response.eject(id)\n }\n }\n })\n // 传空默认触发全部\n }\n\n provide(REQUEST_MODEL, {\n setRequest,\n touchRequest\n })\n\n const emitRefreshPage = () => {\n eventBus.emit(REFRESH_PAGE)\n }\n provide(REFRESH_PAGE, {\n emitRefreshPage\n })\n const onRefreshPage = (callBack: Function) => {\n eventBus.on(REFRESH_PAGE, () => callBack())\n onMounted(() => {\n eventBus.off(REFRESH_PAGE)\n })\n }\n\n onBeforeUnmount(() => {\n requestModel?.clear()\n requestMap?.clear()\n })\n\n expose({\n touchRequest,\n getGlobalModel,\n onRefreshPage\n })\n\n return {\n providerConfig\n }\n }\n})\n</script>\n\n<style scoped>\n\n</style>\n","<template>\n <!-- 请勿去除属性id -->\n <div id=\"ProviderConfig\" ref=\"providerConfig\">\n <slot></slot>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, provide, ref, onMounted, watch, computed, unref, onBeforeUnmount } from 'vue'\nimport mitt from 'mitt'\nimport {\n EVENT_BUS,\n GLOBAL_CONFIG,\n GLOBAL_MODEL,\n REQUEST_MODEL,\n INDICATOR_URL,\n GLOBAL_TOKEN,\n REFRESH_PAGE,\n MODAL_MODEL\n} from '@/utils/constant'\nimport { providerConfigComponentProps } from './props'\nimport { useVariablesInText, useHrefParamsToGlobalVariables } from '@/hooks'\nimport axios from 'axios'\nimport request from '@/utils/request'\nimport { RequestModalParam } from '@/utils/types'\n\nexport default defineComponent({\n name: 'EcanProviderConfig',\n inheritAttrs: false,\n props: {\n ...providerConfigComponentProps\n },\n setup (props, { expose }) {\n useHrefParamsToGlobalVariables()\n\n const providerConfig = ref<HTMLElement>()\n const setTheme = () => {\n providerConfig.value.setAttribute('datav-theme', props.theme)\n }\n watch(() => props.theme, () => {\n setTheme()\n })\n onMounted(() => {\n setTheme()\n })\n const contextRequestUrl = computed(() => useVariablesInText(props.contextRequestUrl))\n const pageMode = computed(() => props.pageMode)\n const theme = computed(() => props.theme)\n // 当前组件主动触发ID\n const touchEventId = ref<string>('')\n // 提供全局设置\n provide(GLOBAL_CONFIG, {\n // 请求地址\n contextRequestUrl,\n // 模式(设计、预览、正常):目前主要配置初始化是否发起请求\n pageMode,\n // 主题\n theme,\n touchEventId\n })\n\n // 提供全局变量\n const globalModel = new Map()\n console.log('globalModel', globalModel)\n const getGlobalModel = (key: string) => {\n return globalModel.get(key)\n }\n const setGlobalModel = (key: string, value: any) => {\n globalModel.set(key, value)\n }\n provide(GLOBAL_MODEL, {\n getGlobalModel,\n setGlobalModel\n })\n\n // 弹窗数据\n const useModalIds: string [] = []\n const popUseModalIds = () => {\n useModalIds.pop()\n }\n const pushUseModalIds = (id: string) => {\n useModalIds.push(id)\n }\n const modalModel = new Map()\n const getModalModel = (key: string) => {\n return modalModel.get(key)\n }\n const setModalModel = (key: string, value: any) => {\n modalModel.set(key, value)\n }\n provide(MODAL_MODEL, {\n popUseModalIds,\n pushUseModalIds,\n getModalModel,\n setModalModel\n })\n\n // 提供事件\n const eventBus = mitt()\n const eventBusKeySet = new Set<string>()\n const onEvent = (key: string, events: { [key:string]: any }) => {\n eventBusKeySet.add(key)\n eventBus.on(key, (k: string) => {\n return typeof events[k] === 'function' && events[k]()\n })\n onBeforeUnmount(() => {\n offEvent(key)\n })\n }\n const offEvent = (key) => {\n eventBusKeySet.delete(key)\n eventBus.off(key)\n }\n const emitEvent = (key: string, eventName: string) => {\n if (key === 'PAGE') {\n const len = useModalIds.length\n let keys: string [] = []\n if (len === 0) {\n keys = [...eventBusKeySet]\n } else {\n const currentModalId = useModalIds[len - 1]\n keys = [...getModalModel(currentModalId)]\n }\n keys.forEach((key) => {\n eventBus.emit(key, eventName)\n })\n } else {\n eventBus.emit(key, eventName)\n }\n }\n provide(EVENT_BUS, {\n onEvent,\n offEvent,\n emitEvent\n })\n\n // 设置是否请求 token\n const tokenNum = ref(0)\n const requestToken = () => {\n tokenNum.value = unref(tokenNum) + 1\n }\n provide(GLOBAL_TOKEN, {\n requestToken\n })\n // 请求排序\n const requestModel = new Map()\n const requestMap = new Map()\n const setRequest = ({ requestFn = () => {}, sortNum = 0, id = '' }: RequestModalParam) => {\n if (requestModel.has(sortNum)) {\n const requestFnList = requestModel.get(sortNum)\n requestFnList?.push(requestFn)\n } else {\n requestModel.set(sortNum, [requestFn])\n }\n requestMap.set(id, requestFn)\n }\n const handleRequestFnList = (requestFnList: Array<Function>) => {\n return new Promise((resolve, reject) => {\n const resultList = requestFnList.map(requestFn => requestFn())\n Promise.all(resultList)\n .then(list => {\n resolve(list)\n })\n .catch(err => {\n reject(err)\n })\n })\n }\n // 指标库模块请求 token\n const queryUserToken = async () => {\n const res = await axios.get(`${INDICATOR_URL}/user/anonymous?username=admin&businessOfficeId=350421`, {\n headers: {\n systemCode: 'F72FC50A3D97372514A6AC33333D28FD',\n current_context: 'ygt',\n Authentication: ''\n }\n })\n // 设置 token 挂载在 window.config 上\n const { token } = res.data?.data || {}\n // @ts-ignore\n window.config.indicatorToken = token\n }\n\n const touchRequest = (id: undefined | string) => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!id) {\n const requestModelArr = Array.from(requestModel)\n // 排序\n requestModelArr.sort((a, b) => b[0] - a[0])\n const len = requestModelArr.length\n try {\n // 指标库模块需要 token\n // 页面不为design 请求次数 token 不为0\n if (props.pageMode !== 'design' && unref(tokenNum) > 0) {\n await queryUserToken()\n }\n for (let i = 0; i < len; i++) {\n const requestFnList = requestModelArr[i][1]\n await handleRequestFnList(requestFnList)\n }\n } catch (e) {\n console.error(e)\n } finally {\n // 执行完直接清空\n requestModel.clear()\n resolve(null)\n }\n } else if (typeof id === 'string') {\n const requestFn = requestMap.get(id)\n if (typeof requestFn === 'function') {\n const id = request.interceptors.response.use((response) => {\n resolve(response)\n return response\n }, (error) => {\n reject(error)\n return Promise.reject(error)\n })\n requestFn()\n // 使用完必须注销\n request.interceptors.response.eject(id)\n }\n }\n })\n // 传空默认触发全部\n }\n\n provide(REQUEST_MODEL, {\n setRequest,\n touchRequest\n })\n\n const emitRefreshPage = () => {\n eventBus.emit(REFRESH_PAGE)\n }\n provide(REFRESH_PAGE, {\n emitRefreshPage\n })\n const onRefreshPage = (callBack: Function) => {\n eventBus.on(REFRESH_PAGE, () => callBack())\n onMounted(() => {\n eventBus.off(REFRESH_PAGE)\n })\n }\n\n onBeforeUnmount(() => {\n requestModel?.clear()\n requestMap?.clear()\n })\n\n expose({\n touchRequest,\n getGlobalModel,\n onRefreshPage\n })\n\n return {\n providerConfig\n }\n }\n})\n</script>\n\n<style scoped>\n\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport ProviderConfig from './ProviderConfig.vue'\nexport const EcanProviderConfig = withInstall(ProviderConfig)\nexport default EcanProviderConfig\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface TextProps extends Props {\n text: string // 文本内容\n color: string // 颜色\n lineHeight: number\n fontSize: string // 字体大小\n variableColor: string\n fontFamily: string // 字体\n textShadow: string // 文字阴影\n variableFontSize: string\n variableDefaultValue: string\n format: '' | 'percentage' | 'money' | 'percent' | 'thousands'\n href: string\n target: 'self' | 'blank' | 'event' // 打开方式\n linkPage: string // 传入pageId\n fontWeight: number // 字体的粗细程度\n justifyContent: 'flex-start' | 'center' | 'end' // 水平位置\n alignItems: 'flex-start' | 'center' | 'end' // 垂直位置\n data: { [key:string]: any }\n}\nexport const textProps:TextProps = {\n ...props,\n name: '文本',\n keyName: '文本',\n type: 'ecanText',\n width: '100px',\n height: '40px',\n text: '文字',\n lineHeight: 1,\n color: '#333',\n variableColor: '#f00',\n fontSize: '14px',\n fontFamily: '',\n fontWeight: 400,\n textShadow: '',\n justifyContent: 'center',\n alignItems: 'center',\n variableFontSize: '14px',\n variableDefaultValue: '0',\n format: '',\n target: 'self',\n href: '',\n linkPage: '',\n data: {}\n}\n\n// 转化默认属性\nexport const textComponentProps = transformToComponentProps(textProps)\n\nexport const textEvents = ['refreshData', 'click', 'valueChange']\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAV1BMVEUAAAD/WzT/WjP/WDD/WzT/WzP/WzT/WzT/WzT/WjT/WzT/WDT/YED/WzT/WzT/WjT/YED/WzT/WzT/WzT/XDT/WzT/WjX/WjP/XDT/XDT/WTL/Tif/WzReH8z5AAAAHHRSTlMA8RgS9W9YHbePZyME5sVjCP7bzcCxgndOQC4GFJJgKwAAAIJJREFUKM+Nkd0OgyAMRjvqcLA53fzXvv9zaokmxq8mnsue5ACFDjiy+XyjLZ7yyK35OxN5mSFZKa2QojEIKRhrZKM0QnsMQxirmJ0kBubTIZvAtUyiFAT4JFoUIYmIotZ5xjDPfyoCAV16nMPdFir8xZ16nM//tePtXw2ODOJY0V0WqQwM2rgKrU0AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIyLTA3LTIyVDA5OjM1OjE5KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMi0wNy0yMlQwOTozNTozNyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMi0wNy0yMlQwOTozNTozNyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNmRlNzg2MS1kNzhmLTQyNGYtYTNjOS01ZTk0MjkwY2RjZjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzZkZTc4NjEtZDc4Zi00MjRmLWEzYzktNWU5NDI5MGNkY2YxIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MzZkZTc4NjEtZDc4Zi00MjRmLWEzYzktNWU5NDI5MGNkY2YxIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDozNmRlNzg2MS1kNzhmLTQyNGYtYTNjOS01ZTk0MjkwY2RjZjEiIHN0RXZ0OndoZW49IjIwMjItMDctMjJUMDk6MzU6MTkrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6VDI+BAAABUUlEQVRIia3WPyhGURgG8B8pi0xisStKMioZLQaLiaQMBoxiVBImCwaLf6MssloUk8Gmb7GgJFKSUvIZ7qe+bvd89+A+03uf989z3nPPPe+tK5fLqtF3tSESzRjFAJ4vemams4IaYqulCq9gEo34QGco+LcCg9hHaxW3jpsiBIZxmMp5kXQTRH1k8S4cZCxoE6//FaiXbEtThm87JjkPI+jN4E9xW4TAQoA/isjNFehCT8B3VoTAUID/xHURAn0B/g5fRQh0B/j7mOJkf2gTaKvY7YG8FsxXPe/hIVbgCTs5C+vAasU+xlooMGuLTrCVI/CDR0zVCgi9gzmUIgQmBbYmT+AdY5LjGMKWpNuaqHWKLrEY8JUkXeYi75iu4DzFfUi6ey9C4AvjeKviliTdRSHmsrvBbMU+lzNg0oidaLvox7LIK+IHdem/iqIROzL/jG+NrT1BRsXKNQAAAABJRU5ErkJggg==\"","<template>\n <div class=\"skeleton-wrapper\" :style=\"style\" v-if=\"loading\">\n <skeleton :loading=\"loading\"/>\n </div>\n <div class=\"ecan-text\" :style=\"style\" v-html=\"myText\" @click=\"click\" v-else/>\n</template>\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport { textComponentProps } from './props'\nimport {\n usePickComponentStyle,\n useRequestData,\n useOnEvent,\n useEmitEvent,\n usePageUrl,\n useVariablesInText\n} from '@/hooks'\nimport { GLOBAL_CONFIG, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '@/common/skeleton/Skeleton.vue'\nimport goUp from '@/assets/go-up.png'\nimport goDown from '@/assets/go-down.png'\nimport { RequestModalParam } from '@/utils/types'\nimport { formatMoney, formatThousands } from '@/utils/util'\nimport runCode from '@/utils/runCode'\n\nexport default defineComponent({\n name: 'EcanText',\n components: { Skeleton },\n props: {\n ...textComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myData = ref({} as { [key:string]:any })\n watch(() => [props.data, props.dataType], ([data, dataType]) => {\n if (dataType === 'static') {\n myData.value = data as { [key: string]: any }\n }\n }, {\n immediate: true\n })\n const myText = computed(() => {\n const data = unref(myData)\n let text = props.text\n text = text?.replace(/\\n|\\\\n/g, '<br/>')\n text = text?.replace(/\\s(?!\\{) | (?!\\})\\s/g, '&nbsp;')\n // const variables = (text).match(/\\{\\s*[\\w\\u4e00-\\u9fa5]*\\s*\\}/g)\n const variables = (text).match(/\\{(.+?)\\}/g)\n if (variables == null || variables.length === 0) return text\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n const statement: string = variable?.slice(1, variable.length - 1)?.trim()\n let replaceStatement = statement\n const textVariables = statement.match(/[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g)\n for (let j = 0; j < textVariables.length; j++) {\n const textVariable = textVariables[j]\n const value = data[textVariable]\n if (value) {\n replaceStatement = statement.replace(textVariable, value)\n }\n }\n if ((/\\(.*\\)/g).test(replaceStatement)) {\n const result = runCode(replaceStatement)\n if (result != null) {\n replaceStatement = result\n }\n }\n let usedVariable: string | number = replaceStatement\n // 变量值和之前一样\n if (usedVariable === statement) {\n usedVariable = props.variableDefaultValue\n }\n if (usedVariable != null) {\n // 涨跌幅\n const format = props.format\n if (format === 'percentage') {\n // 判断是数字类型\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n // 如果大于等于 0\n if (usedVariable >= 0) {\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color:#ED6643;font-size:${props.variableFontSize}\"><img style=\"width: ${props.variableFontSize}\" src=\"${goUp}\"/>${usedVariable}%</span>`)\n } else {\n // 如果小于 0\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color: #6ACB97;font-size:${props.variableFontSize}\"><img style=\"width: ${props.variableFontSize}\" src=\"${goDown}\"/>${Math.abs(+usedVariable)}%</span>`)\n }\n } else {\n // 判断不是数字类型\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${0.00}%</span>`)\n }\n } else if (props.format === 'percent') {\n // 百分数\n // 判断是数字类型\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}%</span>`)\n }\n } else if (props.format === 'money') {\n // 金额格式化\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = formatMoney(usedVariable)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n } else if (format === 'thousands') {\n // 千分位\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = formatThousands(usedVariable)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n } else {\n /// 没有使用百分格式化\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n }\n }\n return `<span>${text}</span>`\n })\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n try {\n loading.value = true\n const res = await requestData()\n myData.value = res?.data?.data || {}\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const refreshData = () => {\n if (props.dataType === 'static') return\n handleRequestData()\n }\n\n useOnEvent(props, {\n refreshData\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n useOnEvent(props, {\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {\n // 空链接、空页面直接 return\n if (!props.linkPage && !props.href) return\n const linkPage = props.linkPage || ''\n const pageUrl = usePageUrl(unref(pageMode), linkPage)\n // 优先使用外部链接,再使用url\n const href = props.href\n let url = href || pageUrl\n url = useVariablesInText(url)\n const target = props.target\n if (!target) return\n if (target !== 'event') {\n window.open(url, '_' + target)\n } else {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n })\n\n const valueChange = emitEvent('valueChange', () => {})\n\n watch(() => myText.value, (value, oldValue) => {\n if (value !== oldValue) {\n valueChange()\n }\n })\n\n return {\n style,\n myText,\n loading,\n click\n }\n }\n})\n</script>\n\n<style lang=\"less\" scoped>\n.skeleton-wrapper {\n overflow: hidden;\n}\n\n.ecan-text {\n display: flex;\n white-space:nowrap;\n}\n</style>\n","<template>\n <div class=\"skeleton-wrapper\" :style=\"style\" v-if=\"loading\">\n <skeleton :loading=\"loading\"/>\n </div>\n <div class=\"ecan-text\" :style=\"style\" v-html=\"myText\" @click=\"click\" v-else/>\n</template>\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport { textComponentProps } from './props'\nimport {\n usePickComponentStyle,\n useRequestData,\n useOnEvent,\n useEmitEvent,\n usePageUrl,\n useVariablesInText\n} from '@/hooks'\nimport { GLOBAL_CONFIG, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '@/common/skeleton/Skeleton.vue'\nimport goUp from '@/assets/go-up.png'\nimport goDown from '@/assets/go-down.png'\nimport { RequestModalParam } from '@/utils/types'\nimport { formatMoney, formatThousands } from '@/utils/util'\nimport runCode from '@/utils/runCode'\n\nexport default defineComponent({\n name: 'EcanText',\n components: { Skeleton },\n props: {\n ...textComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myData = ref({} as { [key:string]:any })\n watch(() => [props.data, props.dataType], ([data, dataType]) => {\n if (dataType === 'static') {\n myData.value = data as { [key: string]: any }\n }\n }, {\n immediate: true\n })\n const myText = computed(() => {\n const data = unref(myData)\n let text = props.text\n text = text?.replace(/\\n|\\\\n/g, '<br/>')\n text = text?.replace(/\\s(?!\\{) | (?!\\})\\s/g, '&nbsp;')\n // const variables = (text).match(/\\{\\s*[\\w\\u4e00-\\u9fa5]*\\s*\\}/g)\n const variables = (text).match(/\\{(.+?)\\}/g)\n if (variables == null || variables.length === 0) return text\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n const statement: string = variable?.slice(1, variable.length - 1)?.trim()\n let replaceStatement = statement\n const textVariables = statement.match(/[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g)\n for (let j = 0; j < textVariables.length; j++) {\n const textVariable = textVariables[j]\n const value = data[textVariable]\n if (value) {\n replaceStatement = statement.replace(textVariable, value)\n }\n }\n if ((/\\(.*\\)/g).test(replaceStatement)) {\n const result = runCode(replaceStatement)\n if (result != null) {\n replaceStatement = result\n }\n }\n let usedVariable: string | number = replaceStatement\n // 变量值和之前一样\n if (usedVariable === statement) {\n usedVariable = props.variableDefaultValue\n }\n if (usedVariable != null) {\n // 涨跌幅\n const format = props.format\n if (format === 'percentage') {\n // 判断是数字类型\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n // 如果大于等于 0\n if (usedVariable >= 0) {\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color:#ED6643;font-size:${props.variableFontSize}\"><img style=\"width: ${props.variableFontSize}\" src=\"${goUp}\"/>${usedVariable}%</span>`)\n } else {\n // 如果小于 0\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color: #6ACB97;font-size:${props.variableFontSize}\"><img style=\"width: ${props.variableFontSize}\" src=\"${goDown}\"/>${Math.abs(+usedVariable)}%</span>`)\n }\n } else {\n // 判断不是数字类型\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${0.00}%</span>`)\n }\n } else if (props.format === 'percent') {\n // 百分数\n // 判断是数字类型\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}%</span>`)\n }\n } else if (props.format === 'money') {\n // 金额格式化\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = formatMoney(usedVariable)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n } else if (format === 'thousands') {\n // 千分位\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = formatThousands(usedVariable)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n } else {\n /// 没有使用百分格式化\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n }\n }\n return `<span>${text}</span>`\n })\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n try {\n loading.value = true\n const res = await requestData()\n myData.value = res?.data?.data || {}\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const refreshData = () => {\n if (props.dataType === 'static') return\n handleRequestData()\n }\n\n useOnEvent(props, {\n refreshData\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n useOnEvent(props, {\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {\n // 空链接、空页面直接 return\n if (!props.linkPage && !props.href) return\n const linkPage = props.linkPage || ''\n const pageUrl = usePageUrl(unref(pageMode), linkPage)\n // 优先使用外部链接,再使用url\n const href = props.href\n let url = href || pageUrl\n url = useVariablesInText(url)\n const target = props.target\n if (!target) return\n if (target !== 'event') {\n window.open(url, '_' + target)\n } else {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n })\n\n const valueChange = emitEvent('valueChange', () => {})\n\n watch(() => myText.value, (value, oldValue) => {\n if (value !== oldValue) {\n valueChange()\n }\n })\n\n return {\n style,\n myText,\n loading,\n click\n }\n }\n})\n</script>\n\n<style lang=\"less\" scoped>\n.skeleton-wrapper {\n overflow: hidden;\n}\n\n.ecan-text {\n display: flex;\n white-space:nowrap;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport Text from './Text.vue'\nexport const EcanText = withInstall(Text)\nexport default EcanText\nexport * from './props'\n","<template>\n <div class=\"red\">\n {{ text }}\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue'\nexport default defineComponent({\n name: 'EcanScrollText',\n setup () {\n const text = ref('基础文本')\n return {\n text\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.red {\n color: red;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport ScrollText from './ScrollText.vue'\nexport const EcanScrollText = withInstall(ScrollText)\nexport default EcanScrollText\n","import {\n Props,\n props,\n transformToComponentProps,\n DateOperate\n} from '@/utils/props'\n\nexport interface TimeDisplayProps extends Props {\n color: string\n format: string\n fontSize: string\n fontFamily: string // 字体\n fontWeight: number // 字体的粗细程度\n textShadow: string // 文字阴影\n alignItems: string // 水平\n justifyContent: string // 垂直\n operate: null | DateOperate\n updateInterval: null | { value: number, mode: 'second' | 'minute' | 'hour' | 'day' }\n}\n\nexport const timeDisplayProps: TimeDisplayProps = {\n ...props,\n name: '时间展示',\n keyName: '时间展示',\n type: 'ecanTimeDisplay',\n format: 'YYYY-MM-DD dddd HH:mm:ss',\n fontSize: '16px',\n color: '#333',\n width: '240px',\n height: '40px',\n fontFamily: '',\n fontWeight: 400,\n textShadow: '',\n alignItems: 'center',\n justifyContent: 'center',\n operate: null,\n updateInterval: { value: 1, mode: 'second' }\n}\n\nexport const timeDisplayComponentProps = transformToComponentProps(timeDisplayProps)\n\nexport const timeDisplayEvents = ['timeChange']\n","<template>\n <div class=\"time-display\" :style=\"style\">\n {{ time }}\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { timeDisplayComponentProps } from './props'\nimport dayjs from 'dayjs'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle } from '../../hooks'\nexport default defineComponent({\n name: 'EcanTimeDisplay',\n props: {\n ...timeDisplayComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const handleTimeValue = () => {\n const { format, operate } = props\n let time = dayjs()\n if (operate) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n time = time.add(value, mode)\n break\n case 'minus':\n time = time.subtract(value, mode)\n }\n }\n return time.format(format)\n }\n const time = ref()\n watch(() => [props.operate, props.format], () => {\n time.value = handleTimeValue()\n }, {\n immediate: true,\n deep: true\n })\n watch(() => props.updateInterval, () => {\n setTimer()\n }, {\n deep: true\n })\n let timer = null\n const clearTimer = () => {\n clearInterval(timer)\n timer = null\n }\n const emitEvent = useEmitEvent(props)\n const timeChange = emitEvent('timeChange', () => {})\n const setTimer = () => {\n if (timer) {\n clearTimer()\n }\n // 1s 为初始值\n let intervalTime = 1000\n const { value, mode } = props.updateInterval || {}\n if (value) {\n intervalTime = intervalTime * value\n }\n const modeMap = {\n second: 1,\n minute: 60,\n hour: 60 * 60,\n day: 24 * 60 * 60\n }\n if (mode) {\n intervalTime = intervalTime * modeMap[mode]\n }\n timer = setInterval(() => {\n time.value = handleTimeValue()\n timeChange()\n }, intervalTime)\n }\n useOnEvent(props, {\n timeChange\n })\n onMounted(() => {\n setTimer()\n })\n onUnmounted(() => {\n clearTimer()\n })\n return {\n style,\n time\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.time-display {\n overflow: hidden;\n display: flex;\n}\n</style>\n","<template>\n <div class=\"time-display\" :style=\"style\">\n {{ time }}\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { timeDisplayComponentProps } from './props'\nimport dayjs from 'dayjs'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle } from '../../hooks'\nexport default defineComponent({\n name: 'EcanTimeDisplay',\n props: {\n ...timeDisplayComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const handleTimeValue = () => {\n const { format, operate } = props\n let time = dayjs()\n if (operate) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n time = time.add(value, mode)\n break\n case 'minus':\n time = time.subtract(value, mode)\n }\n }\n return time.format(format)\n }\n const time = ref()\n watch(() => [props.operate, props.format], () => {\n time.value = handleTimeValue()\n }, {\n immediate: true,\n deep: true\n })\n watch(() => props.updateInterval, () => {\n setTimer()\n }, {\n deep: true\n })\n let timer = null\n const clearTimer = () => {\n clearInterval(timer)\n timer = null\n }\n const emitEvent = useEmitEvent(props)\n const timeChange = emitEvent('timeChange', () => {})\n const setTimer = () => {\n if (timer) {\n clearTimer()\n }\n // 1s 为初始值\n let intervalTime = 1000\n const { value, mode } = props.updateInterval || {}\n if (value) {\n intervalTime = intervalTime * value\n }\n const modeMap = {\n second: 1,\n minute: 60,\n hour: 60 * 60,\n day: 24 * 60 * 60\n }\n if (mode) {\n intervalTime = intervalTime * modeMap[mode]\n }\n timer = setInterval(() => {\n time.value = handleTimeValue()\n timeChange()\n }, intervalTime)\n }\n useOnEvent(props, {\n timeChange\n })\n onMounted(() => {\n setTimer()\n })\n onUnmounted(() => {\n clearTimer()\n })\n return {\n style,\n time\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.time-display {\n overflow: hidden;\n display: flex;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport TimeDisplay from './TimeDisplay.vue'\nexport const EcanTimeDisplay = withInstall(TimeDisplay)\nexport default EcanTimeDisplay\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface ListProps extends Props {\n data: { [key: string]: any } []\n columns: { [key: string]: any } []\n sliceCount: number,\n backgroundColor: string\n useRanking: boolean\n useTitle: boolean\n columnCount: number\n itemHeight: string\n itemColSpan: string\n itemRowSpan: string\n}\n\nexport const listProps:ListProps = {\n ...props,\n type: 'ecanList',\n name: '列表',\n keyName: '列表',\n width: '330px',\n height: '80px',\n backgroundColor: '#0d215e',\n itemColSpan: '10px',\n itemRowSpan: '10px',\n useRanking: true,\n useTitle: false,\n sliceCount: 6,\n columnCount: 1,\n itemHeight: '32px',\n data: [\n {\n name: 'a',\n age: 12\n },\n {\n name: 'b',\n age: 14\n }\n ],\n columns: [\n {\n key: 'name'\n },\n {\n key: 'age'\n }\n ]\n}\n\nexport const listComponentProps = transformToComponentProps(listProps)\n\nexport interface ListEvents {\n refreshData: () => void\n click: () => void\n}\n\nexport const listEvents: Array<keyof ListEvents> = ['refreshData', 'click']\n","<template>\n <div class=\"ecan-list\" :style=\"style\">\n <skeleton :loading=\"loading\">\n <div\n class=\"title\"\n v-if=\"useTitle\"\n >\n <div\n class=\"title-inner\"\n :style=\"{\n backgroundColor: backgroundColor,\n height: itemHeight,\n width: `calc(100% / ${columnCount} - ${itemColSpan} * ${columnCount - 1}/ ${columnCount})`,\n marginRight: count % columnCount !== 0 ? itemColSpan : ''\n }\"\n v-for=\"count in columnCount\"\n :key=\"count\"\n >\n <div class=\"ranking\" v-if=\"useRanking\" />\n <div\n class=\"column\"\n v-for=\"(column, i) in columns\"\n :key=\"column.key || i\"\n :style=\"{\n color: column.titleColor,\n ...columnStyle\n }\"\n >\n {{ column.title }}\n </div>\n </div>\n </div>\n <div class=\"ecan-list-content\" v-if=\"dataSource.length > 0\">\n <div\n class=\"title-placeholder\"\n :style=\"{\n marginBottom: itemRowSpan\n }\"\n v-if=\"useTitle\"\n />\n <div\n class=\"item\"\n :style=\"{\n backgroundColor: backgroundColor,\n height: itemHeight,\n width: `calc(100% / ${columnCount} - ${itemColSpan} * ${columnCount - 1} / ${columnCount})`,\n marginRight: (i + 1) % columnCount !== 0 ? itemColSpan : '',\n marginBottom: itemRowSpan\n }\"\n v-for=\"(item, i) in dataSource.slice(0, sliceCount)\"\n :key=\"item.id || i\"\n @click=\"click\"\n >\n <div class=\"ranking\" v-if=\"useRanking\">\n <div class=\"icon\"/>\n <div class=\"sort\">\n Top {{ i + 1 }}\n </div>\n </div>\n <div\n :class=\"['column', contrastClass(item[column.key], column.format)]\"\n v-for=\"column in columns\"\n :key=\"column.key\"\n :style=\"{\n fontSize: column.fontSize,\n color: contrastClass(item[column.key], column.format) === '' ? column.color : '',\n fontWeight: column.fontWeight,\n ...columnStyle\n }\"\n >\n {{ (column.format != null || column.format !== '') && formatFn(item[column.key], column.format) }}\n </div>\n </div>\n </div>\n <div class=\"empty\" v-else>\n 暂无数据\n </div>\n </skeleton>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref } from 'vue'\nimport { listComponentProps, ListEvents } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { formatMoney, formatPercentage } from '@/utils/util'\nimport { REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nimport Skeleton from '@/common/skeleton'\nexport default defineComponent({\n name: 'EcanList',\n components: { Skeleton },\n props: {\n ...listComponentProps\n },\n setup (props) {\n const dataSource = ref<{[key:string]: any} []>(props.data)\n const style = usePickComponentStyle(props, ['backgroundColor'])\n const columnStyle = computed(() => {\n if (props.useRanking) {\n return {\n textAlign: 'center'\n }\n } else {\n return {\n textAlign: 'left'\n }\n }\n })\n type Format = 'money' | 'percentage' | 'contrast' | ''\n const formatFn = (value: string | number, format?: Format) => {\n if (format == null || format === '') return value\n const map = {\n money: formatMoney,\n percentage: formatPercentage,\n contrast: formatPercentage\n }\n return map[format](value) || ''\n }\n const contrastClass = (value: string | number, format: Format) => {\n const _value = parseFloat(value + '')\n if (format !== 'contrast') {\n return ''\n }\n switch (true) {\n case _value >= 0:\n return 'goUp'\n case _value < 0:\n return 'goDown'\n }\n }\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n\n try {\n loading.value = true\n const res = await requestData()\n dataSource.value = res?.data?.data.rows || []\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n handleRequestData()\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {})\n\n useOnEvent(props, {\n refreshData\n } as ListEvents)\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n style,\n formatFn,\n columnStyle,\n contrastClass,\n dataSource,\n loading,\n click\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n .ecan-list {\n overflow: hidden;\n }\n .ecan-list-content {\n width: 100%;\n height: 100%;\n overflow: auto;\n display: flex;\n align-content: flex-start;\n flex-wrap: wrap;\n }\n .title {\n position: absolute;\n z-index: 9;\n display: flex;\n align-items: center;\n height: 32px;\n width: 100%;\n font-size: 16px;\n color: #ffffff;\n }\n .title-inner {\n padding-left: 28px;\n padding-right: 20px;\n flex: 1;\n display: flex;\n height: 100%;\n }\n .title-placeholder {\n width: 100%;\n height: 32px;\n }\n .item {\n display: flex;\n align-items: center;\n height: 32px;\n padding-left: 28px;\n padding-right: 20px;\n width: 100%;\n font-size: 16px;\n color: #ffffff;\n }\n .column {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ranking {\n flex: 1;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .icon {\n width: 12px;\n height: 8px;\n background: #21BEF7;\n margin-right: 17px;\n opacity: .6;\n }\n .item:nth-child(2) .icon {\n opacity: .8;\n }\n .item:first-child .icon{\n opacity: 1;\n }\n .sort {\n font-weight: 600;\n }\n .goUp {\n color: #FF512E;\n display: flex;\n align-items: center;\n &:before {\n content: '';\n display: block;\n background: url(\"../../assets/go-up.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n }\n\n .goDown {\n color: #39cf93;\n display: flex;\n align-items: center;\n &:before {\n content: '';\n display: block;\n background: url(\"../../assets/go-down.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n }\n .empty {\n text-align: center;\n margin-top: 15%;\n }\n</style>\n\n<style lang=\"less\">\n.ecan-list {\n *::-webkit-scrollbar-track {\n background-color: #fff;\n }\n\n .ant-table-cell-scrollbar {\n box-shadow: 0 1px 0 1px transparent;\n }\n *::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n *::-webkit-scrollbar-thumb {\n border-radius: 6px;\n -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);\n background-color: #c8c9ca;\n }\n}\n[datav-theme='darkBlue'] {\n .ecan-list {\n *::-webkit-scrollbar-thumb {\n background-color: #2f4dac !important;\n }\n *::-webkit-scrollbar-track{\n background-color: #192c70;\n }\n *::-webkit-scrollbar-corner {\n background-color: #192c70 !important;\n }\n .empty {\n color: #ffffff;\n }\n }\n}\n</style>\n","<template>\n <div class=\"ecan-list\" :style=\"style\">\n <skeleton :loading=\"loading\">\n <div\n class=\"title\"\n v-if=\"useTitle\"\n >\n <div\n class=\"title-inner\"\n :style=\"{\n backgroundColor: backgroundColor,\n height: itemHeight,\n width: `calc(100% / ${columnCount} - ${itemColSpan} * ${columnCount - 1}/ ${columnCount})`,\n marginRight: count % columnCount !== 0 ? itemColSpan : ''\n }\"\n v-for=\"count in columnCount\"\n :key=\"count\"\n >\n <div class=\"ranking\" v-if=\"useRanking\" />\n <div\n class=\"column\"\n v-for=\"(column, i) in columns\"\n :key=\"column.key || i\"\n :style=\"{\n color: column.titleColor,\n ...columnStyle\n }\"\n >\n {{ column.title }}\n </div>\n </div>\n </div>\n <div class=\"ecan-list-content\" v-if=\"dataSource.length > 0\">\n <div\n class=\"title-placeholder\"\n :style=\"{\n marginBottom: itemRowSpan\n }\"\n v-if=\"useTitle\"\n />\n <div\n class=\"item\"\n :style=\"{\n backgroundColor: backgroundColor,\n height: itemHeight,\n width: `calc(100% / ${columnCount} - ${itemColSpan} * ${columnCount - 1} / ${columnCount})`,\n marginRight: (i + 1) % columnCount !== 0 ? itemColSpan : '',\n marginBottom: itemRowSpan\n }\"\n v-for=\"(item, i) in dataSource.slice(0, sliceCount)\"\n :key=\"item.id || i\"\n @click=\"click\"\n >\n <div class=\"ranking\" v-if=\"useRanking\">\n <div class=\"icon\"/>\n <div class=\"sort\">\n Top {{ i + 1 }}\n </div>\n </div>\n <div\n :class=\"['column', contrastClass(item[column.key], column.format)]\"\n v-for=\"column in columns\"\n :key=\"column.key\"\n :style=\"{\n fontSize: column.fontSize,\n color: contrastClass(item[column.key], column.format) === '' ? column.color : '',\n fontWeight: column.fontWeight,\n ...columnStyle\n }\"\n >\n {{ (column.format != null || column.format !== '') && formatFn(item[column.key], column.format) }}\n </div>\n </div>\n </div>\n <div class=\"empty\" v-else>\n 暂无数据\n </div>\n </skeleton>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref } from 'vue'\nimport { listComponentProps, ListEvents } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { formatMoney, formatPercentage } from '@/utils/util'\nimport { REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nimport Skeleton from '@/common/skeleton'\nexport default defineComponent({\n name: 'EcanList',\n components: { Skeleton },\n props: {\n ...listComponentProps\n },\n setup (props) {\n const dataSource = ref<{[key:string]: any} []>(props.data)\n const style = usePickComponentStyle(props, ['backgroundColor'])\n const columnStyle = computed(() => {\n if (props.useRanking) {\n return {\n textAlign: 'center'\n }\n } else {\n return {\n textAlign: 'left'\n }\n }\n })\n type Format = 'money' | 'percentage' | 'contrast' | ''\n const formatFn = (value: string | number, format?: Format) => {\n if (format == null || format === '') return value\n const map = {\n money: formatMoney,\n percentage: formatPercentage,\n contrast: formatPercentage\n }\n return map[format](value) || ''\n }\n const contrastClass = (value: string | number, format: Format) => {\n const _value = parseFloat(value + '')\n if (format !== 'contrast') {\n return ''\n }\n switch (true) {\n case _value >= 0:\n return 'goUp'\n case _value < 0:\n return 'goDown'\n }\n }\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n\n try {\n loading.value = true\n const res = await requestData()\n dataSource.value = res?.data?.data.rows || []\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n handleRequestData()\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {})\n\n useOnEvent(props, {\n refreshData\n } as ListEvents)\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n style,\n formatFn,\n columnStyle,\n contrastClass,\n dataSource,\n loading,\n click\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n .ecan-list {\n overflow: hidden;\n }\n .ecan-list-content {\n width: 100%;\n height: 100%;\n overflow: auto;\n display: flex;\n align-content: flex-start;\n flex-wrap: wrap;\n }\n .title {\n position: absolute;\n z-index: 9;\n display: flex;\n align-items: center;\n height: 32px;\n width: 100%;\n font-size: 16px;\n color: #ffffff;\n }\n .title-inner {\n padding-left: 28px;\n padding-right: 20px;\n flex: 1;\n display: flex;\n height: 100%;\n }\n .title-placeholder {\n width: 100%;\n height: 32px;\n }\n .item {\n display: flex;\n align-items: center;\n height: 32px;\n padding-left: 28px;\n padding-right: 20px;\n width: 100%;\n font-size: 16px;\n color: #ffffff;\n }\n .column {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ranking {\n flex: 1;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .icon {\n width: 12px;\n height: 8px;\n background: #21BEF7;\n margin-right: 17px;\n opacity: .6;\n }\n .item:nth-child(2) .icon {\n opacity: .8;\n }\n .item:first-child .icon{\n opacity: 1;\n }\n .sort {\n font-weight: 600;\n }\n .goUp {\n color: #FF512E;\n display: flex;\n align-items: center;\n &:before {\n content: '';\n display: block;\n background: url(\"../../assets/go-up.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n }\n\n .goDown {\n color: #39cf93;\n display: flex;\n align-items: center;\n &:before {\n content: '';\n display: block;\n background: url(\"../../assets/go-down.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n }\n .empty {\n text-align: center;\n margin-top: 15%;\n }\n</style>\n\n<style lang=\"less\">\n.ecan-list {\n *::-webkit-scrollbar-track {\n background-color: #fff;\n }\n\n .ant-table-cell-scrollbar {\n box-shadow: 0 1px 0 1px transparent;\n }\n *::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n *::-webkit-scrollbar-thumb {\n border-radius: 6px;\n -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);\n background-color: #c8c9ca;\n }\n}\n[datav-theme='darkBlue'] {\n .ecan-list {\n *::-webkit-scrollbar-thumb {\n background-color: #2f4dac !important;\n }\n *::-webkit-scrollbar-track{\n background-color: #192c70;\n }\n *::-webkit-scrollbar-corner {\n background-color: #192c70 !important;\n }\n .empty {\n color: #ffffff;\n }\n }\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport List from './List.vue'\nexport const EcanList = withInstall(List)\nexport default EcanList\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface ProportionProps extends Props {\n strokeColor: string // 进度条的色彩\n strokeLinecap: 'round' | 'square' // 进度条的样式\n trailColor: string // 未完成的分段的颜色\n strokeType: 'circle' | 'dashboard',\n data: { [key:string]: any }\n text: string\n fontSize: string\n color: string\n strokeWidth: number\n fontWeight: number\n strokeTextWidth: string\n lineHeight: string\n decimalFormat: boolean\n variableDefaultValue: string\n}\n\nexport const proportionProps: ProportionProps = {\n ...props,\n name: '占比图',\n keyName: '占比图',\n type: 'ecanProportion',\n strokeType: 'circle',\n width: '200px',\n height: '200px',\n strokeColor: '#4091f7',\n strokeLinecap: 'round',\n trailColor: '#f5f5f5',\n data: {\n percent: 0.30\n },\n text: '{percent}%',\n fontSize: '26px',\n color: '#4091f7',\n strokeWidth: 6,\n fontWeight: 400,\n strokeTextWidth: '100%',\n lineHeight: '26px',\n decimalFormat: true,\n variableDefaultValue: '0'\n}\n\nexport const proportionComponentProps = transformToComponentProps(proportionProps)\n\nexport const proportionEvents = ['refreshData', 'click']\n","<template>\n <div class=\"ecan-proportion\" :style=\"style\">\n <a-progress\n class=\"progress\"\n :percent=\"myValue\"\n :width=\"myWidth\"\n :type=\"strokeType\"\n :strokeColor=\"strokeColor\"\n :strokeLinecap=\"strokeLinecap\"\n :trailColor=\"trailColor\"\n :strokeWidth=\"strokeWidth\"\n :gapDegree=\"strokeType === 'dashboard' ? 75 : 0\"\n @click=\"click\"\n >\n <template #format>\n <skeleton v-if=\"loading\" :loading=\"loading\"/>\n <div\n v-else\n class=\"format\"\n :style=\"{\n width: strokeTextWidth,\n fontSize,\n color,\n fontWeight,\n lineHeight\n }\">\n {{ text }}\n </div>\n </template>\n </a-progress>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport 'ant-design-vue/es/progress/style'\nimport { Progress as AProgress } from 'ant-design-vue'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { proportionComponentProps } from './props'\nimport { GLOBAL_CONFIG, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '../../common/skeleton'\nimport { RequestModalParam } from '@/utils/types'\nimport runCode from '@/utils/runCode'\nexport default defineComponent({\n name: 'EcanProportion',\n components: {\n AProgress,\n Skeleton\n },\n props: {\n ...proportionComponentProps\n },\n setup (props) {\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const style = usePickComponentStyle(props)\n const myWidth = computed(() => {\n const width = props.width\n return parseFloat(width)\n })\n const myData = ref<{ [key:string]: any }>({})\n watch(() => props.data, () => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n myData.value = props.data\n }\n }, {\n immediate: true,\n deep: true\n })\n const myValue = computed(() => {\n const data = unref(myData)\n const defaultValue = +(props.variableDefaultValue)\n if (data == null) {\n if (!isNaN(defaultValue)) {\n return defaultValue\n } else {\n return 0\n }\n }\n const variables = (props.text).match(/\\{.+\\}/g) || []\n let value\n const valueSet = new Set(Object.keys(data))\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n const key = variable.slice(1, variable.length - 1)\n if (valueSet.has(key)) {\n value = data[key]\n break\n }\n }\n\n if (typeof value === 'number') {\n value = value * 100\n } else if (typeof value === 'string' && !isNaN(+value)) {\n value = (+value) * 100\n } else if (!isNaN(defaultValue)) {\n value = defaultValue * 100\n } else {\n value = 0\n }\n\n if (props.decimalFormat) {\n value = +value.toFixed(2)\n }\n return value\n })\n const text = computed(() => {\n let text = props.text\n if (text === '') return unref(myValue)\n const defaultValue = props.variableDefaultValue // 变量默认值\n const data = unref(myData) // { a: 1, b: 2 }\n const variables = (text).match(/\\{.+\\}/g) || []\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n let statement = variable.slice(1, variable.length - 1) // { a - b} => a - b\n const reg = /[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g\n const textVariables = variable.match(reg)\n for (let j = 0; j < textVariables?.length; j++) { // \"1 - 2\"\n const textVariable = textVariables[j]?.trim()\n if (data[textVariable] != null) {\n statement = statement.replace(textVariable, data[textVariable])\n } else {\n // statement = statement.replace(textVariable, defaultValue)\n }\n }\n // 匹配加减乘除\n let usedVariable:number | string = statement\n // 运行表达式\n try {\n if ((/\\(.*\\)/g).test(statement)) {\n usedVariable = runCode(statement)\n }\n } catch (e) {\n console.error(e)\n }\n if (typeof +usedVariable === 'number' && !isNaN(+usedVariable)) {\n usedVariable = (+usedVariable * 100)\n if (props.decimalFormat) {\n usedVariable = usedVariable.toFixed(2)\n }\n } else {\n usedVariable = defaultValue\n }\n text = text.replace(variable, usedVariable + '')\n }\n return text\n })\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n myData.value = res?.data?.data || {}\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const refreshData = () => {\n handleRequestData()\n }\n useOnEvent(props, {\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {})\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n\n return {\n style,\n myWidth,\n text,\n myValue,\n loading,\n click\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-proportion {\n overflow: hidden;\n}\n\n.progress {\n width: 100%;\n height: 100%;\n}\n\n.format {\n margin: 0 auto;\n}\n</style>\n","<template>\n <div class=\"ecan-proportion\" :style=\"style\">\n <a-progress\n class=\"progress\"\n :percent=\"myValue\"\n :width=\"myWidth\"\n :type=\"strokeType\"\n :strokeColor=\"strokeColor\"\n :strokeLinecap=\"strokeLinecap\"\n :trailColor=\"trailColor\"\n :strokeWidth=\"strokeWidth\"\n :gapDegree=\"strokeType === 'dashboard' ? 75 : 0\"\n @click=\"click\"\n >\n <template #format>\n <skeleton v-if=\"loading\" :loading=\"loading\"/>\n <div\n v-else\n class=\"format\"\n :style=\"{\n width: strokeTextWidth,\n fontSize,\n color,\n fontWeight,\n lineHeight\n }\">\n {{ text }}\n </div>\n </template>\n </a-progress>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport 'ant-design-vue/es/progress/style'\nimport { Progress as AProgress } from 'ant-design-vue'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { proportionComponentProps } from './props'\nimport { GLOBAL_CONFIG, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '../../common/skeleton'\nimport { RequestModalParam } from '@/utils/types'\nimport runCode from '@/utils/runCode'\nexport default defineComponent({\n name: 'EcanProportion',\n components: {\n AProgress,\n Skeleton\n },\n props: {\n ...proportionComponentProps\n },\n setup (props) {\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const style = usePickComponentStyle(props)\n const myWidth = computed(() => {\n const width = props.width\n return parseFloat(width)\n })\n const myData = ref<{ [key:string]: any }>({})\n watch(() => props.data, () => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n myData.value = props.data\n }\n }, {\n immediate: true,\n deep: true\n })\n const myValue = computed(() => {\n const data = unref(myData)\n const defaultValue = +(props.variableDefaultValue)\n if (data == null) {\n if (!isNaN(defaultValue)) {\n return defaultValue\n } else {\n return 0\n }\n }\n const variables = (props.text).match(/\\{.+\\}/g) || []\n let value\n const valueSet = new Set(Object.keys(data))\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n const key = variable.slice(1, variable.length - 1)\n if (valueSet.has(key)) {\n value = data[key]\n break\n }\n }\n\n if (typeof value === 'number') {\n value = value * 100\n } else if (typeof value === 'string' && !isNaN(+value)) {\n value = (+value) * 100\n } else if (!isNaN(defaultValue)) {\n value = defaultValue * 100\n } else {\n value = 0\n }\n\n if (props.decimalFormat) {\n value = +value.toFixed(2)\n }\n return value\n })\n const text = computed(() => {\n let text = props.text\n if (text === '') return unref(myValue)\n const defaultValue = props.variableDefaultValue // 变量默认值\n const data = unref(myData) // { a: 1, b: 2 }\n const variables = (text).match(/\\{.+\\}/g) || []\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n let statement = variable.slice(1, variable.length - 1) // { a - b} => a - b\n const reg = /[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g\n const textVariables = variable.match(reg)\n for (let j = 0; j < textVariables?.length; j++) { // \"1 - 2\"\n const textVariable = textVariables[j]?.trim()\n if (data[textVariable] != null) {\n statement = statement.replace(textVariable, data[textVariable])\n } else {\n // statement = statement.replace(textVariable, defaultValue)\n }\n }\n // 匹配加减乘除\n let usedVariable:number | string = statement\n // 运行表达式\n try {\n if ((/\\(.*\\)/g).test(statement)) {\n usedVariable = runCode(statement)\n }\n } catch (e) {\n console.error(e)\n }\n if (typeof +usedVariable === 'number' && !isNaN(+usedVariable)) {\n usedVariable = (+usedVariable * 100)\n if (props.decimalFormat) {\n usedVariable = usedVariable.toFixed(2)\n }\n } else {\n usedVariable = defaultValue\n }\n text = text.replace(variable, usedVariable + '')\n }\n return text\n })\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n myData.value = res?.data?.data || {}\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const refreshData = () => {\n handleRequestData()\n }\n useOnEvent(props, {\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {})\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n\n return {\n style,\n myWidth,\n text,\n myValue,\n loading,\n click\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-proportion {\n overflow: hidden;\n}\n\n.progress {\n width: 100%;\n height: 100%;\n}\n\n.format {\n margin: 0 auto;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Proportion from './Proportion.vue'\nexport const EcanProportion = withInstall(Proportion)\nexport default EcanProportion\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface InputProps extends Props {\n value: string,\n placeholder: string\n}\n\nexport const inputProps: InputProps = {\n ...props,\n width: '200px',\n id: '',\n left: '0px',\n top: '0px',\n name: '输入框',\n keyName: '输入框',\n rotate: '',\n type: 'ecanInput',\n value: '',\n placeholder: '请输入文字'\n}\n\n// 转化默认属性\nexport const inputComponentProps = transformToComponentProps(inputProps)\n\nexport const inputEvents = ['inputChange', 'inputBlur']\n","<template>\n <div\n class=\"ecan-input\"\n :style=\"style\"\n >\n <a-input\n class=\"input\"\n v-model:value=\"myValue\"\n :placeholder=\"placeholder\"\n @change=\"inputChange\"\n @blur=\"inputBlur\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, watch } from 'vue'\nimport { useEmitEvent, usePickComponentStyle } from '@/hooks'\nimport { Input as AInput } from 'ant-design-vue'\nimport 'ant-design-vue/es/input/style'\nimport { inputComponentProps } from './props'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport { debounce } from 'lodash-es'\nexport default defineComponent({\n name: 'EcanInput',\n components: {\n AInput\n },\n props: {\n ...inputComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myValue = ref<string>('')\n watch(() => props.value, (value: string) => {\n myValue.value = value\n }, {\n immediate: true\n })\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n const handleSetGlobalModel = () => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: myValue })\n }\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const inputChange = debounce(emitEvent('inputChange', () => {\n handleSetGlobalModel()\n }), 300)\n const inputBlur = emitEvent('inputBlur', () => {\n })\n return {\n style,\n myValue,\n inputBlur,\n inputChange\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-input {\n .ant-input {\n width: 100%;\n height: 100%;\n }\n}\n\n[datav-theme='light'] .ecan-input {\n .ant-input{\n color: rgba(0, 0, 0, 0.65);\n background-color: #ffffff;\n border: 1px solid #d9d9d9;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-input {\n .ant-input{\n border: 1px solid #1f63a3;\n background-color: #05164c;\n box-shadow: inset 0 0 10px #005efe;\n color: #ffffff;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-input\"\n :style=\"style\"\n >\n <a-input\n class=\"input\"\n v-model:value=\"myValue\"\n :placeholder=\"placeholder\"\n @change=\"inputChange\"\n @blur=\"inputBlur\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, watch } from 'vue'\nimport { useEmitEvent, usePickComponentStyle } from '@/hooks'\nimport { Input as AInput } from 'ant-design-vue'\nimport 'ant-design-vue/es/input/style'\nimport { inputComponentProps } from './props'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport { debounce } from 'lodash-es'\nexport default defineComponent({\n name: 'EcanInput',\n components: {\n AInput\n },\n props: {\n ...inputComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myValue = ref<string>('')\n watch(() => props.value, (value: string) => {\n myValue.value = value\n }, {\n immediate: true\n })\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n const handleSetGlobalModel = () => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: myValue })\n }\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const inputChange = debounce(emitEvent('inputChange', () => {\n handleSetGlobalModel()\n }), 300)\n const inputBlur = emitEvent('inputBlur', () => {\n })\n return {\n style,\n myValue,\n inputBlur,\n inputChange\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-input {\n .ant-input {\n width: 100%;\n height: 100%;\n }\n}\n\n[datav-theme='light'] .ecan-input {\n .ant-input{\n color: rgba(0, 0, 0, 0.65);\n background-color: #ffffff;\n border: 1px solid #d9d9d9;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-input {\n .ant-input{\n border: 1px solid #1f63a3;\n background-color: #05164c;\n box-shadow: inset 0 0 10px #005efe;\n color: #ffffff;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Input from './Input.vue'\nexport const EcanInput = withInstall(Input)\nexport default EcanInput\nexport * from './props'\n","import {\n Props,\n EventsProp,\n props,\n transformToComponentProps,\n DateOperate\n} from '@/utils/props'\n\nexport interface DatePickerProps extends Props, EventsProp {\n value: string\n picker: 'date' | 'week' | 'month' | 'quarter' | 'year'\n format: string\n showTime: boolean // 增加时间选择功能\n useCurrentTime: boolean\n operate: null | DateOperate\n}\n\nexport const datePickerProps: DatePickerProps = {\n ...props,\n height: '33px',\n width: '130px',\n id: '',\n left: '0px',\n top: '0px',\n name: '日期选择器',\n keyName: '日期选择器',\n rotate: '',\n type: 'ecanDatePicker',\n value: '',\n picker: 'date',\n format: 'YYYY-MM-DD',\n showTime: false,\n useCurrentTime: true,\n operate: null\n}\nexport const datePickerComponentProps = transformToComponentProps(datePickerProps)\n\nexport const datePickerEvents = ['dateChange']\n","<template>\n <div\n class=\"ecan-date-picker\"\n :style=\"style\"\n >\n <!-- 宽度style有效,class无效 -->\n <a-date-picker\n class=\"date-picker\"\n dropdownClassName=\"ecan-date-picker-dropdown\"\n v-model:value=\"myValue\"\n :format=\"format\"\n :picker=\"picker\"\n :showTime=\"showTime\"\n :locale=\"locale\"\n @change=\"change\"\n :getPopupContainer=\"getPopupContainer\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, unref, watch } from 'vue'\nimport { datePickerComponentProps } from './props'\nimport { DateOperate } from '@/utils/props'\nimport { DatePicker as ADatePicker } from 'ant-design-vue'\nimport 'ant-design-vue/es/date-picker/style'\nimport { usePickComponentStyle, useOnEvent, useEmitEvent } from '@/hooks'\nimport locale from 'ant-design-vue/es/date-picker/locale/zh_CN'\nimport dayjs, { Dayjs } from 'dayjs'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport useVariablesInText from '../../hooks/useVariablesInText'\nexport default defineComponent({\n name: 'EcanDatePicker',\n props: {\n ...datePickerComponentProps\n },\n components: {\n ADatePicker\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const myValue = ref<Dayjs | null>(null)\n watch(() => [props.value, props.useCurrentTime, props.operate], ([value, useCurrentTime, operate]: [string, boolean, DateOperate]) => {\n let _value: Dayjs = null\n if (value) {\n _value = dayjs(useVariablesInText(value))\n } else if (useCurrentTime) {\n _value = dayjs()\n }\n // 操作时间\n if (operate && _value) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n _value = _value.add(value, mode)\n break\n case 'minus':\n _value = _value.subtract(value, mode)\n }\n }\n myValue.value = _value\n }, {\n deep: true,\n immediate: true\n })\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n format: props.format,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const dateChange = emitEvent('dateChange', () => {\n })\n const change = () => {\n if (unref(myValue)) {\n dateChange()\n }\n }\n useOnEvent(props, {\n dateChange\n })\n return {\n style,\n getPopupContainer,\n myValue,\n locale,\n change\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-date-picker {\n .date-picker {\n width: 100%;\n height: 100%\n }\n}\n[datav-theme='light'] .ecan-date-picker {\n .ant-picker {\n background-color: #ffffff;\n color: rgba(0, 0, 0, 0.85);\n border: 1px solid #d9d9d9;\n }\n .ant-picker-input > input {\n color: rgba(0, 0, 0, 0.85);\n }\n .anticon-calendar {\n color: #333;\n }\n .anticon-close-circle {\n color: #333;\n }\n\n .ant-picker-input > input::placeholder {\n color: #bfbfbf;\n }\n}\n[datav-theme='darkBlue'] .ecan-date-picker {\n .ant-picker {\n background-color: #05164c;\n border: 1px solid #1f63a3;\n color: #fff;\n box-shadow: inset 0 0 10px #005efe;\n }\n .ant-picker-input > input {\n color: #ffffff;\n }\n .anticon-calendar {\n color: #ffffff;\n }\n .anticon-close-circle {\n color: #333;\n }\n}\n[datav-theme='darkBlue'] .ecan-date-picker-dropdown {\n .ant-picker-panel {\n background: #05174e;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-header {\n color: #69befa;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #69befa;\n }\n .ant-picker-header button {\n color: #69befa;\n }\n .ant-picker-content th {\n color: #69befa;\n }\n .ant-picker-content td {\n color: #69befa;\n }\n .ant-picker-today-btn {\n color: #69befa;\n }\n .ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner, .ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner {\n background: #1890ff;\n color: #ffffff;\n }\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner {\n color: #69befa;\n }\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover {\n background: #1890ff;\n color: #ffffff;\n }\n\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner {\n background: #1890ff;\n color: #ffffff;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-date-picker\"\n :style=\"style\"\n >\n <!-- 宽度style有效,class无效 -->\n <a-date-picker\n class=\"date-picker\"\n dropdownClassName=\"ecan-date-picker-dropdown\"\n v-model:value=\"myValue\"\n :format=\"format\"\n :picker=\"picker\"\n :showTime=\"showTime\"\n :locale=\"locale\"\n @change=\"change\"\n :getPopupContainer=\"getPopupContainer\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, unref, watch } from 'vue'\nimport { datePickerComponentProps } from './props'\nimport { DateOperate } from '@/utils/props'\nimport { DatePicker as ADatePicker } from 'ant-design-vue'\nimport 'ant-design-vue/es/date-picker/style'\nimport { usePickComponentStyle, useOnEvent, useEmitEvent } from '@/hooks'\nimport locale from 'ant-design-vue/es/date-picker/locale/zh_CN'\nimport dayjs, { Dayjs } from 'dayjs'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport useVariablesInText from '../../hooks/useVariablesInText'\nexport default defineComponent({\n name: 'EcanDatePicker',\n props: {\n ...datePickerComponentProps\n },\n components: {\n ADatePicker\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const myValue = ref<Dayjs | null>(null)\n watch(() => [props.value, props.useCurrentTime, props.operate], ([value, useCurrentTime, operate]: [string, boolean, DateOperate]) => {\n let _value: Dayjs = null\n if (value) {\n _value = dayjs(useVariablesInText(value))\n } else if (useCurrentTime) {\n _value = dayjs()\n }\n // 操作时间\n if (operate && _value) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n _value = _value.add(value, mode)\n break\n case 'minus':\n _value = _value.subtract(value, mode)\n }\n }\n myValue.value = _value\n }, {\n deep: true,\n immediate: true\n })\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n format: props.format,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const dateChange = emitEvent('dateChange', () => {\n })\n const change = () => {\n if (unref(myValue)) {\n dateChange()\n }\n }\n useOnEvent(props, {\n dateChange\n })\n return {\n style,\n getPopupContainer,\n myValue,\n locale,\n change\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-date-picker {\n .date-picker {\n width: 100%;\n height: 100%\n }\n}\n[datav-theme='light'] .ecan-date-picker {\n .ant-picker {\n background-color: #ffffff;\n color: rgba(0, 0, 0, 0.85);\n border: 1px solid #d9d9d9;\n }\n .ant-picker-input > input {\n color: rgba(0, 0, 0, 0.85);\n }\n .anticon-calendar {\n color: #333;\n }\n .anticon-close-circle {\n color: #333;\n }\n\n .ant-picker-input > input::placeholder {\n color: #bfbfbf;\n }\n}\n[datav-theme='darkBlue'] .ecan-date-picker {\n .ant-picker {\n background-color: #05164c;\n border: 1px solid #1f63a3;\n color: #fff;\n box-shadow: inset 0 0 10px #005efe;\n }\n .ant-picker-input > input {\n color: #ffffff;\n }\n .anticon-calendar {\n color: #ffffff;\n }\n .anticon-close-circle {\n color: #333;\n }\n}\n[datav-theme='darkBlue'] .ecan-date-picker-dropdown {\n .ant-picker-panel {\n background: #05174e;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-header {\n color: #69befa;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #69befa;\n }\n .ant-picker-header button {\n color: #69befa;\n }\n .ant-picker-content th {\n color: #69befa;\n }\n .ant-picker-content td {\n color: #69befa;\n }\n .ant-picker-today-btn {\n color: #69befa;\n }\n .ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner, .ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner {\n background: #1890ff;\n color: #ffffff;\n }\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner {\n color: #69befa;\n }\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover {\n background: #1890ff;\n color: #ffffff;\n }\n\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner {\n background: #1890ff;\n color: #ffffff;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport DatePicker from './DatePicker.vue'\nexport const EcanDatePicker = withInstall(DatePicker)\nexport default EcanDatePicker\nexport * from './props'\n","import { Props, props, transformToComponentProps, DateOperate } from '@/utils/props'\nimport { ManipulateType } from 'dayjs'\nexport interface RangePickerProps extends Props {\n picker: 'date' | 'week' | 'month' | 'quarter' | 'year'\n format: string\n limitStartTime: string\n limitEndTime: string\n startTime: string // 开始时间\n endTime: string // 结束时间\n useCurrentTime: boolean\n interval: number\n intervalUnit: ManipulateType\n operate: DateOperate\n}\n\nexport const rangePickerProps: RangePickerProps = {\n ...props,\n name: '日期范围选择器',\n keyName: '日期范围选择器',\n type: 'ecanRangePicker',\n width: '250px',\n height: '35px',\n picker: 'date',\n format: 'YYYY-MM-DD',\n startTime: '',\n endTime: '',\n useCurrentTime: true,\n interval: 1,\n intervalUnit: 'year',\n operate: null,\n limitStartTime: '',\n limitEndTime: ''\n}\n\nexport const rangePickerComponentProps = transformToComponentProps(rangePickerProps)\n\nexport const rangePickerEvents = ['dateChange']\n","<template>\n <div\n class=\"ecan-range-picker\"\n :style=\"style\"\n >\n <a-range-picker\n class=\"range-picker\"\n dropdownClassName=\"ecan-range-picker-dropdown\"\n v-model:value=\"myValue\"\n :format=\"format\"\n :picker=\"picker\"\n :locale=\"locale\"\n :getPopupContainer=\"getPopupContainer\"\n :disabled-date=\"disabledDate\"\n @change=\"change\"\n @calendarChange=\"calendarChange\"\n @openChange=\"openChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, unref, watch, ref } from 'vue'\nimport { rangePickerComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useVariablesInText } from '@/hooks'\nimport { RangePicker as ARangePicker } from 'ant-design-vue'\nimport locale from 'ant-design-vue/es/date-picker/locale/zh_CN'\n// antdv 中 range-picker 组件与 date-picker 共用一个样式\nimport 'ant-design-vue/es/date-picker/style'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport dayjs, { Dayjs, ManipulateType } from 'dayjs'\nimport { DateOperate } from '@/utils/props'\nexport default defineComponent({\n name: 'EcanRangePicker',\n components: {\n ARangePicker\n },\n props: {\n ...rangePickerComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const myValue = ref<[Dayjs, Dayjs]>([null, null])\n watch(() => [props.startTime, props.endTime, props.useCurrentTime, props.interval, props.intervalUnit, props.operate], ([startTime, endTime, useCurrentTime, interval, intervalUnit, operate]: [string, string, boolean, number, ManipulateType, DateOperate]) => {\n let _startTime: Dayjs = null\n let _endTime: Dayjs = null\n if (useCurrentTime) {\n _startTime = dayjs().subtract(interval, intervalUnit)\n _endTime = dayjs()\n }\n if (startTime) {\n _startTime = dayjs(useVariablesInText(startTime))\n }\n if (endTime) {\n _endTime = dayjs(useVariablesInText(endTime))\n }\n\n if (operate) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n _startTime = _startTime ? _startTime.add(value, mode) : _startTime\n _endTime = _endTime ? _endTime.add(value, mode) : _endTime\n break\n case 'minus':\n _startTime = _startTime ? _startTime.subtract(value, mode) : _startTime\n _endTime = _endTime ? _endTime.subtract(value, mode) : _endTime\n }\n }\n\n myValue.value = [_startTime, _endTime]\n }, {\n immediate: true\n })\n\n let calendarStartTime: Dayjs = unref(myValue)[0]\n let calendarEndTime: Dayjs = unref(myValue)[1]\n const calendarChange = (range: [Dayjs, Dayjs] | null) => {\n if (Array.isArray(range)) {\n calendarStartTime = range[0]\n calendarEndTime = range[1]\n // let { limitStartTime, limitEndTime } = props\n // const data = {\n // startTime: `${calendarStartTime || ''}`,\n // endTime: `${calendarEndTime || ''}`\n // }\n // limitStartTime = useVariablesInText(limitStartTime, { codeData: data })\n // limitEndTime = useVariablesInText(limitEndTime, { codeData: data })\n // if (limitStartTime && unref(myStartTime) < dayjs(limitStartTime)) {\n // myValue.value = [null, unref(myValue)[1]]\n // }\n // if (limitEndTime && unref(myEndTime) > dayjs(limitEndTime)) {\n // myValue.value = [unref(myValue)[0], null]\n // }\n } else {\n calendarStartTime = null\n calendarEndTime = null\n }\n }\n const disabledDate = (current: Dayjs) => {\n let isDisabled = false\n let { limitStartTime, limitEndTime } = props\n const data = {\n startTime: `${calendarStartTime || ''}`,\n endTime: `${calendarEndTime || ''}`\n }\n limitStartTime = useVariablesInText(limitStartTime, { codeData: data })\n limitEndTime = useVariablesInText(limitEndTime, { codeData: data })\n if (limitStartTime && limitEndTime) {\n isDisabled = !(dayjs(limitStartTime) < current && current < dayjs(limitEndTime))\n } else if (limitStartTime) {\n isDisabled = dayjs(limitStartTime) > current\n } else if (limitEndTime) {\n isDisabled = dayjs(limitEndTime) < current\n }\n return isDisabled\n }\n\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const myStartTime = computed(() => Array.isArray(unref(myValue)) ? unref(myValue)[0] : null)\n const myEndTime = computed(() => Array.isArray(unref(myValue)) ? unref(myValue)[1] : null)\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n format: props.format,\n startTime: myStartTime,\n endTime: myEndTime\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n let isDateChange = false\n const dateChange = emitEvent('dateChange', () => {\n })\n const openChange = (status: boolean) => {\n // 关闭时,判断时间是否改变,再触发事件\n const value = unref(myValue)\n // 判断有值\n const isNotNull = value && value[0] && value[1]\n if (status === false && isDateChange === true && isNotNull) {\n dateChange()\n isDateChange = false\n }\n }\n const change = () => {\n isDateChange = true\n }\n useOnEvent(props, {\n dateChange\n })\n return {\n style,\n getPopupContainer,\n locale,\n dateChange,\n myValue,\n disabledDate,\n calendarChange,\n openChange,\n change\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.range-picker {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n[datav-theme='light'] .ecan-range-picker{\n .ant-picker {\n background-color: #ffffff;\n color: rgba(0, 0, 0, 0.85);\n border: 1px solid #d9d9d9;\n }\n .ant-picker-input > input {\n color: rgba(0, 0, 0, 0.85);\n }\n .anticon-calendar {\n color: #333;\n }\n .anticon-close-circle {\n color: #333;\n }\n .ant-picker-input > input::placeholder {\n color: #bfbfbf;\n }\n .ant-picker-separator .anticon {\n color:#333;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-range-picker {\n .ant-picker {\n background-color: #05164c;\n border: 1px solid #1f63a3;\n color: #fff;\n box-shadow: inset 0 0 10px #005efe;\n }\n .ant-picker-input > input {\n color: #ffffff;\n }\n .anticon-calendar {\n color: #ffffff;\n }\n .anticon-close-circle {\n color: #333;\n }\n .ant-picker-separator .anticon {\n color:#fff;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-range-picker-dropdown {\n .ant-picker-panel {\n background: #05174e;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-header {\n color: #69befa;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #69befa;\n }\n .ant-picker-header button {\n color: #69befa;\n }\n .ant-picker-content th {\n color: #69befa;\n }\n .ant-picker-content td {\n color: #69befa;\n }\n .ant-picker-today-btn {\n color: #69befa;\n }\n .ant-picker-cell-disabled .ant-picker-cell-inner {\n color: #999;\n }\n .ant-picker-cell-disabled::before {\n background: #333;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-range-picker\"\n :style=\"style\"\n >\n <a-range-picker\n class=\"range-picker\"\n dropdownClassName=\"ecan-range-picker-dropdown\"\n v-model:value=\"myValue\"\n :format=\"format\"\n :picker=\"picker\"\n :locale=\"locale\"\n :getPopupContainer=\"getPopupContainer\"\n :disabled-date=\"disabledDate\"\n @change=\"change\"\n @calendarChange=\"calendarChange\"\n @openChange=\"openChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, unref, watch, ref } from 'vue'\nimport { rangePickerComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useVariablesInText } from '@/hooks'\nimport { RangePicker as ARangePicker } from 'ant-design-vue'\nimport locale from 'ant-design-vue/es/date-picker/locale/zh_CN'\n// antdv 中 range-picker 组件与 date-picker 共用一个样式\nimport 'ant-design-vue/es/date-picker/style'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport dayjs, { Dayjs, ManipulateType } from 'dayjs'\nimport { DateOperate } from '@/utils/props'\nexport default defineComponent({\n name: 'EcanRangePicker',\n components: {\n ARangePicker\n },\n props: {\n ...rangePickerComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const myValue = ref<[Dayjs, Dayjs]>([null, null])\n watch(() => [props.startTime, props.endTime, props.useCurrentTime, props.interval, props.intervalUnit, props.operate], ([startTime, endTime, useCurrentTime, interval, intervalUnit, operate]: [string, string, boolean, number, ManipulateType, DateOperate]) => {\n let _startTime: Dayjs = null\n let _endTime: Dayjs = null\n if (useCurrentTime) {\n _startTime = dayjs().subtract(interval, intervalUnit)\n _endTime = dayjs()\n }\n if (startTime) {\n _startTime = dayjs(useVariablesInText(startTime))\n }\n if (endTime) {\n _endTime = dayjs(useVariablesInText(endTime))\n }\n\n if (operate) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n _startTime = _startTime ? _startTime.add(value, mode) : _startTime\n _endTime = _endTime ? _endTime.add(value, mode) : _endTime\n break\n case 'minus':\n _startTime = _startTime ? _startTime.subtract(value, mode) : _startTime\n _endTime = _endTime ? _endTime.subtract(value, mode) : _endTime\n }\n }\n\n myValue.value = [_startTime, _endTime]\n }, {\n immediate: true\n })\n\n let calendarStartTime: Dayjs = unref(myValue)[0]\n let calendarEndTime: Dayjs = unref(myValue)[1]\n const calendarChange = (range: [Dayjs, Dayjs] | null) => {\n if (Array.isArray(range)) {\n calendarStartTime = range[0]\n calendarEndTime = range[1]\n // let { limitStartTime, limitEndTime } = props\n // const data = {\n // startTime: `${calendarStartTime || ''}`,\n // endTime: `${calendarEndTime || ''}`\n // }\n // limitStartTime = useVariablesInText(limitStartTime, { codeData: data })\n // limitEndTime = useVariablesInText(limitEndTime, { codeData: data })\n // if (limitStartTime && unref(myStartTime) < dayjs(limitStartTime)) {\n // myValue.value = [null, unref(myValue)[1]]\n // }\n // if (limitEndTime && unref(myEndTime) > dayjs(limitEndTime)) {\n // myValue.value = [unref(myValue)[0], null]\n // }\n } else {\n calendarStartTime = null\n calendarEndTime = null\n }\n }\n const disabledDate = (current: Dayjs) => {\n let isDisabled = false\n let { limitStartTime, limitEndTime } = props\n const data = {\n startTime: `${calendarStartTime || ''}`,\n endTime: `${calendarEndTime || ''}`\n }\n limitStartTime = useVariablesInText(limitStartTime, { codeData: data })\n limitEndTime = useVariablesInText(limitEndTime, { codeData: data })\n if (limitStartTime && limitEndTime) {\n isDisabled = !(dayjs(limitStartTime) < current && current < dayjs(limitEndTime))\n } else if (limitStartTime) {\n isDisabled = dayjs(limitStartTime) > current\n } else if (limitEndTime) {\n isDisabled = dayjs(limitEndTime) < current\n }\n return isDisabled\n }\n\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const myStartTime = computed(() => Array.isArray(unref(myValue)) ? unref(myValue)[0] : null)\n const myEndTime = computed(() => Array.isArray(unref(myValue)) ? unref(myValue)[1] : null)\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n format: props.format,\n startTime: myStartTime,\n endTime: myEndTime\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n let isDateChange = false\n const dateChange = emitEvent('dateChange', () => {\n })\n const openChange = (status: boolean) => {\n // 关闭时,判断时间是否改变,再触发事件\n const value = unref(myValue)\n // 判断有值\n const isNotNull = value && value[0] && value[1]\n if (status === false && isDateChange === true && isNotNull) {\n dateChange()\n isDateChange = false\n }\n }\n const change = () => {\n isDateChange = true\n }\n useOnEvent(props, {\n dateChange\n })\n return {\n style,\n getPopupContainer,\n locale,\n dateChange,\n myValue,\n disabledDate,\n calendarChange,\n openChange,\n change\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.range-picker {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n[datav-theme='light'] .ecan-range-picker{\n .ant-picker {\n background-color: #ffffff;\n color: rgba(0, 0, 0, 0.85);\n border: 1px solid #d9d9d9;\n }\n .ant-picker-input > input {\n color: rgba(0, 0, 0, 0.85);\n }\n .anticon-calendar {\n color: #333;\n }\n .anticon-close-circle {\n color: #333;\n }\n .ant-picker-input > input::placeholder {\n color: #bfbfbf;\n }\n .ant-picker-separator .anticon {\n color:#333;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-range-picker {\n .ant-picker {\n background-color: #05164c;\n border: 1px solid #1f63a3;\n color: #fff;\n box-shadow: inset 0 0 10px #005efe;\n }\n .ant-picker-input > input {\n color: #ffffff;\n }\n .anticon-calendar {\n color: #ffffff;\n }\n .anticon-close-circle {\n color: #333;\n }\n .ant-picker-separator .anticon {\n color:#fff;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-range-picker-dropdown {\n .ant-picker-panel {\n background: #05174e;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-header {\n color: #69befa;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #69befa;\n }\n .ant-picker-header button {\n color: #69befa;\n }\n .ant-picker-content th {\n color: #69befa;\n }\n .ant-picker-content td {\n color: #69befa;\n }\n .ant-picker-today-btn {\n color: #69befa;\n }\n .ant-picker-cell-disabled .ant-picker-cell-inner {\n color: #999;\n }\n .ant-picker-cell-disabled::before {\n background: #333;\n }\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport RangePicker from './RangePicker.vue'\nexport const EcanRangePicker = withInstall(RangePicker)\nexport default EcanRangePicker\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface ButtonProps extends Props {\n text: string\n mode: 'primary' | 'dashed' | 'link' | 'text' | 'default'\n danger: boolean\n shape: 'default' | 'circle' | 'round'\n href: string\n target: 'self' | 'blank' | 'event'\n fontSize: string\n fontWeight: number\n}\n\nexport const buttonProps: ButtonProps = {\n ...props,\n width: '200px',\n name: '按钮',\n keyName: '按钮',\n type: 'ecanButton',\n text: '按钮',\n mode: 'default',\n danger: false,\n shape: 'default',\n href: '',\n target: 'self',\n fontSize: '14px',\n fontWeight: 400\n}\n\n// 转化默认属性\nexport const buttonComponentProps = transformToComponentProps(buttonProps)\n\nexport const buttonEvents = ['click']\n","<template>\n <div\n class=\"ecan-button\"\n :style=\"style\"\n >\n <a-button\n block\n @click=\"click\"\n :type=\"mode\"\n :danger=\"danger\"\n :shape=\"shape\"\n :href=\"myHref\"\n :target=\"myTarget\"\n >\n <span\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ myText }}\n </span>\n </a-button>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, unref } from 'vue'\nimport { usePickComponentStyle, useEmitEvent, useVariablesInText } from '@/hooks'\nimport { Button as AButton } from 'ant-design-vue'\nimport 'ant-design-vue/es/button/style'\nimport { buttonComponentProps } from './props'\nexport default defineComponent({\n name: 'EcanButton',\n components: {\n AButton\n },\n props: {\n ...buttonComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n // 拦截触发事件\n const emitEvent = useEmitEvent(props)\n // click 是 event 名称\n const click = emitEvent('click', () => {\n // 打开链接\n const url = unref(myHref)\n if (url && props.target === 'event') {\n window.parent.postMessage({\n type: 'openPage',\n url\n }, '*')\n }\n })\n\n const myText = computed(() => useVariablesInText(props.text))\n // 空字符串会刷新页面\n const myHref = computed(() => useVariablesInText(props.href) || null)\n const myTarget = computed(() => {\n const target = props.target\n if (target === 'event' || unref(myHref) == null) {\n return undefined\n } else {\n const map = {\n self: '_self',\n blank: '_blank'\n }\n return map[target]\n }\n })\n return {\n style,\n click,\n myText,\n myHref,\n myTarget\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-button {\n .ant-btn {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-button\"\n :style=\"style\"\n >\n <a-button\n block\n @click=\"click\"\n :type=\"mode\"\n :danger=\"danger\"\n :shape=\"shape\"\n :href=\"myHref\"\n :target=\"myTarget\"\n >\n <span\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ myText }}\n </span>\n </a-button>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, unref } from 'vue'\nimport { usePickComponentStyle, useEmitEvent, useVariablesInText } from '@/hooks'\nimport { Button as AButton } from 'ant-design-vue'\nimport 'ant-design-vue/es/button/style'\nimport { buttonComponentProps } from './props'\nexport default defineComponent({\n name: 'EcanButton',\n components: {\n AButton\n },\n props: {\n ...buttonComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n // 拦截触发事件\n const emitEvent = useEmitEvent(props)\n // click 是 event 名称\n const click = emitEvent('click', () => {\n // 打开链接\n const url = unref(myHref)\n if (url && props.target === 'event') {\n window.parent.postMessage({\n type: 'openPage',\n url\n }, '*')\n }\n })\n\n const myText = computed(() => useVariablesInText(props.text))\n // 空字符串会刷新页面\n const myHref = computed(() => useVariablesInText(props.href) || null)\n const myTarget = computed(() => {\n const target = props.target\n if (target === 'event' || unref(myHref) == null) {\n return undefined\n } else {\n const map = {\n self: '_self',\n blank: '_blank'\n }\n return map[target]\n }\n })\n return {\n style,\n click,\n myText,\n myHref,\n myTarget\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-button {\n .ant-btn {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Button from './Button.vue'\nexport const EcanButton = withInstall(Button)\nexport default EcanButton\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport type CheckboxOptions = {\n label: string\n value: string\n disabled?: boolean\n checked?: boolean\n indeterminate?: boolean\n} []\n\nexport interface CheckboxProps extends Props {\n value: string | string []\n data: CheckboxOptions\n}\n\nexport const checkboxProps: CheckboxProps = {\n ...props,\n width: '240px',\n id: '',\n left: '0px',\n top: '0px',\n name: '复选框',\n keyName: '复选框',\n rotate: '',\n type: 'ecanCheckbox',\n value: [],\n data: [\n { label: '选项一', value: '1', checked: true },\n { label: '选项二', value: '2', checked: true },\n { label: '选项三', value: '3' }\n ]\n}\n\n// 转化默认属性\nexport const checkboxComponentProps = transformToComponentProps(checkboxProps)\n\nexport const checkboxEvents = ['checkboxChange']\n","<template>\n <div class=\"ecan-checkbox\" :style=\"style\">\n <a-checkbox-group\n :options=\"myOption\"\n v-model:value=\"myValue\"\n @change=\"checkboxChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, watch } from 'vue'\nimport { CheckboxGroup as ACheckboxGroup } from 'ant-design-vue'\nimport 'ant-design-vue/es/checkbox/style'\nimport { checkboxComponentProps, CheckboxOptions } from './props'\nimport { useEmitEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default defineComponent({\n name: 'EcanCheckbox',\n components: {\n ACheckboxGroup\n },\n props: {\n ...checkboxComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myOption = ref<CheckboxOptions>([])\n const myValue = ref<string []>([])\n const handleDataAndOption = (data) => {\n const value = props.value\n let _value = [] as string []\n data.forEach((item) => {\n if (item.checked) {\n _value.push(item.value)\n }\n })\n if (typeof value === 'string' && value !== '') {\n _value = _value.concat(value.split(','))\n } else if (Array.isArray(value)) {\n _value = _value.concat(value)\n }\n myOption.value = data\n myValue.value = _value\n }\n watch(() => [props.data, props.value], ([data]: [CheckboxOptions, string | string []]) => {\n handleDataAndOption(data)\n }, {\n immediate: true,\n deep: true\n })\n const requestData = useRequestData(props)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n const res = await requestData()\n const data = res?.data?.data?.rows || []\n handleDataAndOption(data)\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const checkboxChange = emitEvent('checkboxChange', () => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: myValue })\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n myOption,\n style,\n myValue,\n checkboxChange\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-checkbox {\n .ant-checkbox-group {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: space-between;\n align-content: space-between;\n flex-wrap: wrap;\n }\n}\n</style>\n","<template>\n <div class=\"ecan-checkbox\" :style=\"style\">\n <a-checkbox-group\n :options=\"myOption\"\n v-model:value=\"myValue\"\n @change=\"checkboxChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, watch } from 'vue'\nimport { CheckboxGroup as ACheckboxGroup } from 'ant-design-vue'\nimport 'ant-design-vue/es/checkbox/style'\nimport { checkboxComponentProps, CheckboxOptions } from './props'\nimport { useEmitEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default defineComponent({\n name: 'EcanCheckbox',\n components: {\n ACheckboxGroup\n },\n props: {\n ...checkboxComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myOption = ref<CheckboxOptions>([])\n const myValue = ref<string []>([])\n const handleDataAndOption = (data) => {\n const value = props.value\n let _value = [] as string []\n data.forEach((item) => {\n if (item.checked) {\n _value.push(item.value)\n }\n })\n if (typeof value === 'string' && value !== '') {\n _value = _value.concat(value.split(','))\n } else if (Array.isArray(value)) {\n _value = _value.concat(value)\n }\n myOption.value = data\n myValue.value = _value\n }\n watch(() => [props.data, props.value], ([data]: [CheckboxOptions, string | string []]) => {\n handleDataAndOption(data)\n }, {\n immediate: true,\n deep: true\n })\n const requestData = useRequestData(props)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n const res = await requestData()\n const data = res?.data?.data?.rows || []\n handleDataAndOption(data)\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const checkboxChange = emitEvent('checkboxChange', () => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: myValue })\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n myOption,\n style,\n myValue,\n checkboxChange\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-checkbox {\n .ant-checkbox-group {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: space-between;\n align-content: space-between;\n flex-wrap: wrap;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Checkbox from './Checkbox.vue'\nexport const EcanCheckbox = withInstall(Checkbox)\nexport default EcanCheckbox\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface SelectOption {\n value: any\n label: string\n disabled?: boolean\n key?: string\n title?: string\n}\n\nexport type SelectOptions = SelectOption []\n\nexport interface SelectProps extends Props {\n data: SelectOptions // 同 options\n value: string,\n dataFieldNames: { label: string, value: string }\n mode: 'multiple' | 'tags' | 'combobox' | undefined\n maxTagCount: number | undefined\n autoClearSearchValue: boolean\n placeholder: string\n selectFirstOption: boolean\n}\n\nexport const selectProps: SelectProps = {\n ...props,\n name: '下拉框选择器',\n keyName: '下拉框选择器',\n width: '120px',\n height: '33px',\n type: 'ecanSelect',\n mode: undefined,\n data: [\n { label: '选项一', value: '1' },\n { label: '选项二', value: '2' },\n { label: '选项三', value: '3' }\n ],\n value: undefined,\n dataFieldNames: { label: 'label', value: 'value' },\n maxTagCount: 3,\n autoClearSearchValue: true,\n placeholder: '请选择',\n selectFirstOption: false\n}\n\nexport const selectComponentProps = transformToComponentProps(selectProps)\n\nexport const selectEvents = ['selectChange', 'refreshData']\n","<template>\n <div\n class=\"ecan-select\"\n :style=\"style\"\n >\n <a-select\n class=\"select\"\n v-model:value=\"myValue\"\n :placeholder=\"placeholder\"\n showSearch\n allowClear\n :options=\"options\"\n :mode=\"mode\"\n :getPopupContainer=\"getPopupContainer\"\n :fieldNames=\"dataFieldNames\"\n :maxTagCount=\"maxTagCount\"\n :filterOption=\"filterOption\"\n :loading=\"loading\"\n :autoClearSearchValue=\"autoClearSearchValue\"\n @change=\"selectChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, unref, watch } from 'vue'\nimport { Select as ASelect } from 'ant-design-vue'\nimport 'ant-design-vue/es/select/style'\nimport { selectComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default defineComponent({\n name: 'EcanSelect',\n components: {\n ASelect\n },\n props: {\n ...selectComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n // 挂在在 ProviderConfig 或者 body 下\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const requestData = useRequestData(props)\n const options = ref(props.data || [])\n const myValue = ref()\n watch(() => [props.value, props.mode, props.selectFirstOption], () => {\n const { mode, selectFirstOption, value } = props\n if (mode === 'multiple' || mode === 'tags' || mode === 'combobox') {\n if (value) {\n myValue.value = value.split(',')\n } else if (selectFirstOption) {\n myValue.value = [unref(options)[0]]\n }\n } else {\n if (value) {\n myValue.value = value\n } else if (selectFirstOption) {\n myValue.value = unref(options)[0]\n }\n }\n // props.value || props.data[0]\n }, {\n immediate: true\n })\n const dataFieldNames = props.dataFieldNames as { label:string, value:string }\n const filterOption = (input: string, option: any) => {\n const labelKey = dataFieldNames.label\n const valueKey = dataFieldNames.value\n let value: string | undefined\n // 没有 label 值才用 value\n // ant-select 组件如果没有传 label 值会使用 value 作为值\n const labelValue = option[labelKey]\n const valueValue = option[valueKey]\n if (labelValue != null) {\n value = labelValue\n } else if (valueValue != null) {\n value = valueValue\n }\n return !!(value?.toLowerCase().indexOf(input?.toLowerCase()) >= 0)\n }\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n options.value = res?.data?.data?.rows || []\n const firstOption = unref(options)[0]\n if (props.value === '' && firstOption != null) {\n myValue.value = firstOption[dataFieldNames.value]\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const selectChange = emitEvent('selectChange', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: myValue })\n })\n // TODO 传入需要注册的参数\n useOnEvent(props, {\n selectChange,\n refreshData: handleRequestData\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n style,\n getPopupContainer,\n myValue,\n selectChange,\n options,\n filterOption,\n loading\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.select {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-select {\n .ant-select-selector {\n height: 100%;\n }\n .ant-select {\n height: 100% !important;\n width: 100% !important;\n }\n .ant-select-selector {\n height: 100% !important;\n width: 100% !important;\n display: flex;\n align-items: center;\n input {\n height: 100% !important;\n }\n }\n}\n\n[datav-theme='light'] {\n .ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border: 1px solid #d9d9d9;\n }\n .ant-select-dropdown {\n color: rgba(0, 0, 0, 0.85);\n background: #ffffff;\n box-shadow: 0 2px 8px rgb(0 0 0 / 15%);\n }\n .ant-empty-img-simple-g {\n stroke: #d9d9d9;\n }\n .ant-empty-img-simple-ellipse {\n fill: #f5f5f5;\n }\n .ant-empty-img-simple-path {\n fill: #f5f5f5;\n stroke: #d9d9d9;\n }\n .ant-empty-description {\n color: rgba(0, 0, 0, 0.25);\n }\n .anticon-down {\n color: #333;\n }\n}\n\n[datav-theme='darkBlue'] {\n .ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border: 1px solid #1f63a3;\n background-color: #05164c;\n box-shadow: inset 0 0 10px #005efe;\n color: #ffffff;\n }\n .ant-select-dropdown {\n box-shadow: inset 0 0 10px #005efe;\n color: #fff;\n background-color: #05164c;\n }\n .ant-empty-img-simple-g {\n stroke: #69befa;\n }\n .ant-empty-img-simple-ellipse {\n fill-opacity: 0;\n }\n .ant-empty-img-simple-path {\n fill: #69befa;\n stroke: #69befa;\n }\n .ant-empty-description {\n color: #69befa;\n }\n .anticon-down {\n color: #ffffff;\n }\n .ant-select-item {\n color: #ffffff;\n }\n .ant-select-item-option-active {\n background: #1f63a3;\n }\n .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {\n background: #1f63a3;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-select\"\n :style=\"style\"\n >\n <a-select\n class=\"select\"\n v-model:value=\"myValue\"\n :placeholder=\"placeholder\"\n showSearch\n allowClear\n :options=\"options\"\n :mode=\"mode\"\n :getPopupContainer=\"getPopupContainer\"\n :fieldNames=\"dataFieldNames\"\n :maxTagCount=\"maxTagCount\"\n :filterOption=\"filterOption\"\n :loading=\"loading\"\n :autoClearSearchValue=\"autoClearSearchValue\"\n @change=\"selectChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, unref, watch } from 'vue'\nimport { Select as ASelect } from 'ant-design-vue'\nimport 'ant-design-vue/es/select/style'\nimport { selectComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default defineComponent({\n name: 'EcanSelect',\n components: {\n ASelect\n },\n props: {\n ...selectComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n // 挂在在 ProviderConfig 或者 body 下\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const requestData = useRequestData(props)\n const options = ref(props.data || [])\n const myValue = ref()\n watch(() => [props.value, props.mode, props.selectFirstOption], () => {\n const { mode, selectFirstOption, value } = props\n if (mode === 'multiple' || mode === 'tags' || mode === 'combobox') {\n if (value) {\n myValue.value = value.split(',')\n } else if (selectFirstOption) {\n myValue.value = [unref(options)[0]]\n }\n } else {\n if (value) {\n myValue.value = value\n } else if (selectFirstOption) {\n myValue.value = unref(options)[0]\n }\n }\n // props.value || props.data[0]\n }, {\n immediate: true\n })\n const dataFieldNames = props.dataFieldNames as { label:string, value:string }\n const filterOption = (input: string, option: any) => {\n const labelKey = dataFieldNames.label\n const valueKey = dataFieldNames.value\n let value: string | undefined\n // 没有 label 值才用 value\n // ant-select 组件如果没有传 label 值会使用 value 作为值\n const labelValue = option[labelKey]\n const valueValue = option[valueKey]\n if (labelValue != null) {\n value = labelValue\n } else if (valueValue != null) {\n value = valueValue\n }\n return !!(value?.toLowerCase().indexOf(input?.toLowerCase()) >= 0)\n }\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n options.value = res?.data?.data?.rows || []\n const firstOption = unref(options)[0]\n if (props.value === '' && firstOption != null) {\n myValue.value = firstOption[dataFieldNames.value]\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const selectChange = emitEvent('selectChange', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: myValue })\n })\n // TODO 传入需要注册的参数\n useOnEvent(props, {\n selectChange,\n refreshData: handleRequestData\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n style,\n getPopupContainer,\n myValue,\n selectChange,\n options,\n filterOption,\n loading\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.select {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-select {\n .ant-select-selector {\n height: 100%;\n }\n .ant-select {\n height: 100% !important;\n width: 100% !important;\n }\n .ant-select-selector {\n height: 100% !important;\n width: 100% !important;\n display: flex;\n align-items: center;\n input {\n height: 100% !important;\n }\n }\n}\n\n[datav-theme='light'] {\n .ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border: 1px solid #d9d9d9;\n }\n .ant-select-dropdown {\n color: rgba(0, 0, 0, 0.85);\n background: #ffffff;\n box-shadow: 0 2px 8px rgb(0 0 0 / 15%);\n }\n .ant-empty-img-simple-g {\n stroke: #d9d9d9;\n }\n .ant-empty-img-simple-ellipse {\n fill: #f5f5f5;\n }\n .ant-empty-img-simple-path {\n fill: #f5f5f5;\n stroke: #d9d9d9;\n }\n .ant-empty-description {\n color: rgba(0, 0, 0, 0.25);\n }\n .anticon-down {\n color: #333;\n }\n}\n\n[datav-theme='darkBlue'] {\n .ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border: 1px solid #1f63a3;\n background-color: #05164c;\n box-shadow: inset 0 0 10px #005efe;\n color: #ffffff;\n }\n .ant-select-dropdown {\n box-shadow: inset 0 0 10px #005efe;\n color: #fff;\n background-color: #05164c;\n }\n .ant-empty-img-simple-g {\n stroke: #69befa;\n }\n .ant-empty-img-simple-ellipse {\n fill-opacity: 0;\n }\n .ant-empty-img-simple-path {\n fill: #69befa;\n stroke: #69befa;\n }\n .ant-empty-description {\n color: #69befa;\n }\n .anticon-down {\n color: #ffffff;\n }\n .ant-select-item {\n color: #ffffff;\n }\n .ant-select-item-option-active {\n background: #1f63a3;\n }\n .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {\n background: #1f63a3;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Select from './Select.vue'\nexport const EcanSelect = withInstall(Select)\nexport default EcanSelect\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface TreeSelectOption {\n value: any\n label: string\n disabled?: boolean\n key?: string\n title?: string\n children?: TreeSelectOption []\n}\n\nexport type TreeSelectOptions = TreeSelectOption []\n\nexport interface TreeSelectProps extends Props {\n data: TreeSelectOptions // 同 options\n value: string,\n dataFieldNames: { label: string, value: string, children: string }\n multiple: boolean // 多选\n maxTagCount: number | undefined\n placeholder: string\n treeCheckable: boolean // 复选框\n treeCheckStrictly: boolean\n selectFirstOption: boolean\n}\n\nexport const treeSelectProps: TreeSelectProps = {\n ...props,\n name: '树形下拉框选择器',\n keyName: '树形下拉框选择器',\n width: '120px',\n height: '33px',\n type: 'ecanTreeSelect',\n multiple: false,\n data: [\n {\n label: '选项一',\n value: '1',\n children: [\n {\n label: '子选项一',\n value: '1-1'\n },\n {\n label: '子选项二',\n value: '1-2'\n }\n ]\n },\n { label: '选项二', value: '2' },\n { label: '选项三', value: '3' }\n ],\n value: '',\n dataFieldNames: { label: 'label', value: 'value', children: 'children' },\n maxTagCount: 3,\n placeholder: '请选择',\n treeCheckable: false,\n treeCheckStrictly: false,\n selectFirstOption: false\n}\n\nexport const treeSelectComponentProps = transformToComponentProps(treeSelectProps)\n\nexport const treeSelectEvents = ['selectChange', 'refreshData']\n","<template>\n <div class=\"ecan-tree-select\" :style=\"style\">\n <a-tree-select\n class=\"tree-select\"\n v-model:value=\"myValue\"\n allowClear\n showSearch\n :loading=\"loading\"\n :fieldNames=\"dataFieldNames\"\n :treeData=\"treeData\"\n :maxTagCount=\"maxTagCount\"\n :multiple=\"multiple\"\n :treeCheckable=\"treeCheckable\"\n :filterTreeNode=\"filterTreeNode\"\n :placeholder=\"placeholder\"\n @change=\"selectChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { TreeSelect as ATreeSelect } from 'ant-design-vue'\nimport 'ant-design-vue/es/tree-select/style'\nimport { inject, ref, unref, watch } from 'vue'\nimport { treeSelectComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default {\n name: 'EcanTreeSelect',\n components: {\n ATreeSelect\n },\n props: {\n ...treeSelectComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const treeData = ref(props.data)\n const filterTreeNode = (inputValue: string, treeNode: any) => {\n const dataFieldNames = props.dataFieldNames\n const labelKey = dataFieldNames.label\n const valueKey = dataFieldNames.value\n let value: string | undefined\n // 没有 label 值才用 value\n // ant-select 组件如果没有传 label 值会使用 value 作为值\n const labelValue = treeNode[labelKey]\n const valueValue = treeNode[valueKey]\n if (labelValue != null) {\n value = labelValue\n } else if (valueValue != null) {\n value = valueValue\n }\n return !!(value?.toLowerCase().indexOf(inputValue?.toLowerCase()) >= 0)\n }\n const myValue = ref()\n watch(() => [props.multiple, props.value, props.treeCheckable, props.selectFirstOption], () => {\n const { multiple, value, selectFirstOption } = props\n if (multiple) {\n if (value) {\n myValue.value = value.split(',')\n } else if (selectFirstOption) {\n myValue.value = [unref(treeData)[0]]\n }\n } else {\n if (value) {\n myValue.value = value\n } else if (selectFirstOption) {\n myValue.value = unref(treeData)[0]\n }\n }\n }, {\n immediate: true\n })\n const loading = ref(false)\n const requestData = useRequestData(props)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n treeData.value = res?.data?.data?.rows || []\n const firstOption = unref(treeData)[0]\n if (props.value === '' && firstOption != null) {\n myValue.value = firstOption[props.dataFieldNames.value]\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const selectChange = emitEvent('selectChange', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: myValue })\n })\n useOnEvent(props, {\n selectChange,\n refreshData: handleRequestData\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.reque\n })\n return {\n style,\n treeData,\n filterTreeNode,\n myValue,\n loading,\n selectChange\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.tree-select {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-tree-select {\n .tree-select {\n .ant-select-selector {\n height: 100%;\n }\n }\n}\n</style>\n","<template>\n <div class=\"ecan-tree-select\" :style=\"style\">\n <a-tree-select\n class=\"tree-select\"\n v-model:value=\"myValue\"\n allowClear\n showSearch\n :loading=\"loading\"\n :fieldNames=\"dataFieldNames\"\n :treeData=\"treeData\"\n :maxTagCount=\"maxTagCount\"\n :multiple=\"multiple\"\n :treeCheckable=\"treeCheckable\"\n :filterTreeNode=\"filterTreeNode\"\n :placeholder=\"placeholder\"\n @change=\"selectChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { TreeSelect as ATreeSelect } from 'ant-design-vue'\nimport 'ant-design-vue/es/tree-select/style'\nimport { inject, ref, unref, watch } from 'vue'\nimport { treeSelectComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default {\n name: 'EcanTreeSelect',\n components: {\n ATreeSelect\n },\n props: {\n ...treeSelectComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const treeData = ref(props.data)\n const filterTreeNode = (inputValue: string, treeNode: any) => {\n const dataFieldNames = props.dataFieldNames\n const labelKey = dataFieldNames.label\n const valueKey = dataFieldNames.value\n let value: string | undefined\n // 没有 label 值才用 value\n // ant-select 组件如果没有传 label 值会使用 value 作为值\n const labelValue = treeNode[labelKey]\n const valueValue = treeNode[valueKey]\n if (labelValue != null) {\n value = labelValue\n } else if (valueValue != null) {\n value = valueValue\n }\n return !!(value?.toLowerCase().indexOf(inputValue?.toLowerCase()) >= 0)\n }\n const myValue = ref()\n watch(() => [props.multiple, props.value, props.treeCheckable, props.selectFirstOption], () => {\n const { multiple, value, selectFirstOption } = props\n if (multiple) {\n if (value) {\n myValue.value = value.split(',')\n } else if (selectFirstOption) {\n myValue.value = [unref(treeData)[0]]\n }\n } else {\n if (value) {\n myValue.value = value\n } else if (selectFirstOption) {\n myValue.value = unref(treeData)[0]\n }\n }\n }, {\n immediate: true\n })\n const loading = ref(false)\n const requestData = useRequestData(props)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n treeData.value = res?.data?.data?.rows || []\n const firstOption = unref(treeData)[0]\n if (props.value === '' && firstOption != null) {\n myValue.value = firstOption[props.dataFieldNames.value]\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const selectChange = emitEvent('selectChange', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: myValue })\n })\n useOnEvent(props, {\n selectChange,\n refreshData: handleRequestData\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.reque\n })\n return {\n style,\n treeData,\n filterTreeNode,\n myValue,\n loading,\n selectChange\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.tree-select {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-tree-select {\n .tree-select {\n .ant-select-selector {\n height: 100%;\n }\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport TreeSelect from './TreeSelect.vue'\nexport const EcanTreeSelect = withInstall(TreeSelect)\nexport default EcanTreeSelect\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps,\n Data,\n ValueTypeDataFieldNames\n} from '@/utils/props'\n\nexport interface PieProps extends Props {\n data: Data\n titleText: string\n titleSubtext: string\n titleLeft: string\n colors: string[]\n backgroundColor: string\n tooltipShow: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n tooltipTrigger: 'item' | 'axis' | 'none'\n tooltipTextStyleColor: string\n tooltipFormatter: string\n legendShow: boolean\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal'\n legendTextStyleColor: string\n innerRadius: string\n outerRadius: string\n centerLeft: string\n centerTop: string\n minAngle: number\n labelShow: boolean\n labelFormatter: string\n labelFontSize: number\n labelPosition: 'outside' | 'inside' | 'center'\n labelLineShow: boolean\n labelColor: string\n isUseLabelColors: boolean\n labelLineLength: number\n labelLineLength2: number\n roseType: '' | 'radius' | 'area'\n valueTypeDataFieldNames: ValueTypeDataFieldNames,\n dataFieldConfigType: 'key' | 'value',\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n graphicConfig: { [key:string]: any }\n toolboxShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n}\n\nexport const pieProps: PieProps = {\n ...props,\n id: '',\n name: '饼图',\n keyName: '饼图',\n type: 'ecanPie',\n width: '400px',\n height: '400px',\n top: '',\n left: '',\n rotate: '',\n data: [\n { name: '名称一', value: 335 },\n { name: '名称二', value: 310 },\n { name: '名称三', value: 234 }\n ],\n titleText: '',\n titleSubtext: '',\n titleLeft: '',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n backgroundColor: '',\n tooltipShow: true,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true,\n tooltipTextStyleColor: '',\n tooltipTrigger: 'item',\n tooltipFormatter: '{marker} {b} {c} ({d}%)',\n legendShow: true,\n legendTextStyleColor: '#333',\n legendOrient: 'vertical',\n legendTop: 'top',\n legendLeft: 'left',\n innerRadius: '0%',\n outerRadius: '60%',\n centerLeft: '50%',\n centerTop: '50%',\n minAngle: 0,\n labelShow: true,\n labelColor: '#333',\n isUseLabelColors: false,\n labelFontSize: 12,\n labelPosition: 'outside',\n labelFormatter: '{b}\\\\n{d}%',\n labelLineShow: true,\n labelLineLength: 10,\n labelLineLength2: 15,\n roseType: '',\n valueTypeDataFieldNames: { name: 'name', value: 'value', type: 'type' },\n dataFieldConfigType: 'value',\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n graphicConfig: {},\n toolboxShow: false,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息'\n}\n// 转化默认属性\nexport const pieComponentProps = transformToComponentProps(pieProps)\n\nexport const pieEvents: Array<string> = ['click', 'refreshData', 'resetRecord']\n","import request from '@/utils/request'\nexport const useDownloadFile = async (downloadFileUrl: string) => {\n const res = await request.post(downloadFileUrl, {}, {\n responseType: 'blob'\n }) as any\n const { data, headers } = res\n const fileName = headers['content-disposition'].replace(/\\w+;filename=(.*)/, '$1')\n const blob = new Blob([data])\n const dom = document.createElement('a')\n const url = window.URL.createObjectURL(blob)\n dom.href = url\n dom.download = decodeURI(fileName)\n dom.style.display = 'none'\n document.body.appendChild(dom)\n dom.click()\n dom.parentNode?.removeChild(dom)\n window.URL.revokeObjectURL(url)\n}\nexport default useDownloadFile\n","import { transformToComponentProps } from '@/utils/props'\n\nexport type ModalPosition = 'default' | 'top' | 'center' | 'bottom'\n\nexport interface ModalProps {\n id: string\n type: string\n width: string\n height: string\n title: string\n titleFontSize: string\n titleColor: string\n backgroundColor: string\n backgroundImage: string\n backgroundSize: string\n keyName: string\n componentList: { [key: string]: any } []\n fullModal: boolean // 是否充满全屏\n originalWidth: string // 设计稿宽\n originalHeight: string // 设计稿长\n destroyOnClose: boolean\n position: ModalPosition\n}\n\nexport const modalProps: ModalProps = {\n id: '',\n type: 'ecanModal',\n title: '',\n titleFontSize: '14px',\n titleColor: '',\n width: '1000px',\n height: '800px',\n originalWidth: '1920px',\n originalHeight: '1080px',\n backgroundColor: '#fff',\n backgroundImage: '',\n backgroundSize: '100% 100%',\n keyName: '弹窗',\n componentList: [],\n fullModal: false,\n destroyOnClose: true,\n position: 'default'\n}\n\nexport const modalComponentProps = transformToComponentProps(modalProps)\n\nexport const modalEvents = ['showModal']\n","<template>\n <!-- centered + style 中的 verticalAlign 调整弹窗位置 -->\n <a-modal\n :getContainer=\"getContainer\"\n :wrapClassName=\"wrapClassName\"\n centered\n :visible=\"visible\"\n :footer=\"null\"\n :width=\"isFullModal || isFullWidth ? '100%' : modalWith\"\n :destroyOnClose=\"destroyOnClose\"\n :style=\"modalStyle\"\n :closable=\"false\"\n @ok=\"onOk\"\n @cancel=\"onCancel\"\n ref=\"modalRef\"\n >\n <div class=\"contain\" ref=\"containRef\" :style=\"containStyle\">\n <div class=\"content\" :style=\"contentStyle\" v-if=\"ready\">\n <div\n class=\"header-bar\"\n :style=\"{\n backgroundColor,\n padding: '20px 30px'\n }\"\n >\n <div\n v-if=\"title\"\n class=\"ant-modal-title\"\n :style=\"{\n fontSize: titleFontSize,\n color: titleColor\n }\"\n >\n {{ title }}\n </div>\n <close-outlined class=\"close-icon\" @click=\"onCancel\"/>\n </div>\n <div v-if=\"componentList.length\">\n <component\n v-for=\"(component, index) in componentList\"\n :key=\"(component.id) + index\"\n :is=\"component.type\"\n v-bind=\"component\"\n />\n </div>\n <slot v-else />\n </div>\n </div>\n </a-modal>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, nextTick, watch, ref, unref } from 'vue'\nimport { modalComponentProps, ModalPosition } from './props'\nimport { Modal as AModal } from 'ant-design-vue'\nimport 'ant-design-vue/es/modal/style'\nimport { useOnEvent, usePickComponentStyle, useImagePath } from '@/hooks'\nimport { REQUEST_MODEL, MODAL_MODEL } from '@/utils/constant'\nimport { debounce } from 'lodash-es'\nimport { CloseOutlined } from '@ant-design/icons-vue'\nexport default defineComponent({\n name: 'EcanModal',\n components: {\n AModal,\n CloseOutlined\n },\n props: {\n ...modalComponentProps\n },\n setup (props, { emit }) {\n const getContainer = () => document.getElementById('ProviderConfig') || document.body\n const modalStyle = computed(() => {\n const position = props.position as ModalPosition\n const map = {\n default: '',\n top: 'top',\n center: 'middle',\n bottom: 'bottom'\n }\n return {\n verticalAlign: map[position]\n }\n })\n const width = props.width as string\n const height = props.height as string\n const originalWidth = props.originalWidth as string\n const originalHeight = props.originalHeight as string\n const modalWith = ref('80%')\n const containWidth = ref(0)\n const scaleWidth = ref()\n const containHeight = ref(0)\n const containStyle = ref({})\n const style = usePickComponentStyle(props)\n const contentStyle = ref({})\n const ready = ref(false)\n const modalRef = ref<HTMLElement>()\n let observer: MutationObserver | null\n const updateSize = () => {\n scaleWidth.value = parseFloat(width) / parseFloat(originalWidth)\n const scaleHeight = parseFloat(height) / parseFloat(originalHeight)\n const screenWidth = document.body.offsetWidth\n const screenHeight = document.body.offsetHeight\n containWidth.value = screenWidth * unref(scaleWidth)\n containHeight.value = screenHeight * scaleHeight\n modalWith.value = `${unref(scaleWidth) * 100}%`\n containStyle.value = {\n width: `${unref(containWidth)}px`,\n height: `${unref(containHeight)}px`\n }\n contentStyle.value = {\n ...unref(style),\n backgroundImage: useImagePath(props.backgroundImage as string, true),\n transform: `scale(${unref(containWidth) / parseFloat(width)},${unref(containHeight) / parseFloat(height)})`\n }\n }\n const onResize = debounce(() => {\n updateSize()\n }, 100)\n const initMutationObserver = () => {\n const MutationObserver = window.MutationObserver\n observer = new MutationObserver(onResize)\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['style'],\n attributeOldValue: true\n })\n }\n const removeMutationObserver = () => {\n if (observer) {\n observer.disconnect()\n observer.takeRecords()\n observer = null\n }\n }\n\n const visible = ref(false)\n const { touchRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n touchRequest: () => void 0\n })\n const showModal = () => {\n visible.value = true\n }\n const hideModal = () => {\n emit('close')\n visible.value = false\n }\n const onOk = () => {\n hideModal()\n }\n const onCancel = () => {\n hideModal()\n }\n const { setModalModel, pushUseModalIds, popUseModalIds } = inject(MODAL_MODEL, {\n pushUseModalIds: (_key: string) => {},\n popUseModalIds: () => {},\n setModalModel: (_key: string, _value: any) => {}\n })\n const handleModalModel = () => {\n const id = props.id\n let keys = []\n const componentList = props.componentList\n console.log('componentList', componentList)\n if (Array.isArray(componentList)) {\n keys = componentList.map((component) => component.id)\n setModalModel(id, [...new Set(keys)])\n }\n }\n watch(() => visible.value, async (visible) => {\n if (visible) {\n ready.value = false\n pushUseModalIds(props.id)\n handleModalModel()\n await nextTick(() => {\n updateSize()\n window.addEventListener('resize', onResize)\n initMutationObserver()\n ready.value = true\n })\n touchRequest()\n } else {\n popUseModalIds()\n window.removeEventListener('resize', onResize)\n removeMutationObserver()\n }\n })\n const isFullWidth = computed(() => unref(scaleWidth) >= 1)\n const isFullModal = computed(() => props.fullModal)\n const wrapClassName = computed(() => {\n let className = 'ecan-modal'\n if (unref(isFullWidth)) className += ' ecan-full-width-modal'\n if (unref(isFullModal)) className += ' ecan-full-modal'\n return className\n })\n // 注册\n useOnEvent(props, {\n showModal\n })\n\n return {\n modalRef,\n containStyle,\n contentStyle,\n getContainer,\n modalStyle,\n modalWith,\n isFullModal,\n style,\n visible,\n showModal,\n onOk,\n onCancel,\n isFullWidth,\n wrapClassName,\n ready\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.contain {\n position: relative;\n overflow: hidden;\n}\n.content {\n transform-origin: left top;\n z-index: 999;\n\n .header-bar {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n\n .close-icon {\n font-size: 18px;\n cursor: pointer;\n margin: 0 0 0 auto;\n }\n }\n}\n</style>\n\n<style lang=\"less\">\n.ecan-modal {\n .ant-modal-body {\n padding: 0;\n }\n .ant-modal-header {\n padding: 0;\n border-bottom: none;\n background: none;\n }\n}\n\n.ecan-full-width-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n }\n .ant-modal-body {\n flex: 1;\n }\n}\n\n.ecan-full-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n height: calc(100vh);\n }\n .ant-modal-body {\n flex: 1;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-modal {\n .anticon-close > svg > path {\n fill: #fff;\n }\n}\n</style>\n","<template>\n <!-- centered + style 中的 verticalAlign 调整弹窗位置 -->\n <a-modal\n :getContainer=\"getContainer\"\n :wrapClassName=\"wrapClassName\"\n centered\n :visible=\"visible\"\n :footer=\"null\"\n :width=\"isFullModal || isFullWidth ? '100%' : modalWith\"\n :destroyOnClose=\"destroyOnClose\"\n :style=\"modalStyle\"\n :closable=\"false\"\n @ok=\"onOk\"\n @cancel=\"onCancel\"\n ref=\"modalRef\"\n >\n <div class=\"contain\" ref=\"containRef\" :style=\"containStyle\">\n <div class=\"content\" :style=\"contentStyle\" v-if=\"ready\">\n <div\n class=\"header-bar\"\n :style=\"{\n backgroundColor,\n padding: '20px 30px'\n }\"\n >\n <div\n v-if=\"title\"\n class=\"ant-modal-title\"\n :style=\"{\n fontSize: titleFontSize,\n color: titleColor\n }\"\n >\n {{ title }}\n </div>\n <close-outlined class=\"close-icon\" @click=\"onCancel\"/>\n </div>\n <div v-if=\"componentList.length\">\n <component\n v-for=\"(component, index) in componentList\"\n :key=\"(component.id) + index\"\n :is=\"component.type\"\n v-bind=\"component\"\n />\n </div>\n <slot v-else />\n </div>\n </div>\n </a-modal>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, nextTick, watch, ref, unref } from 'vue'\nimport { modalComponentProps, ModalPosition } from './props'\nimport { Modal as AModal } from 'ant-design-vue'\nimport 'ant-design-vue/es/modal/style'\nimport { useOnEvent, usePickComponentStyle, useImagePath } from '@/hooks'\nimport { REQUEST_MODEL, MODAL_MODEL } from '@/utils/constant'\nimport { debounce } from 'lodash-es'\nimport { CloseOutlined } from '@ant-design/icons-vue'\nexport default defineComponent({\n name: 'EcanModal',\n components: {\n AModal,\n CloseOutlined\n },\n props: {\n ...modalComponentProps\n },\n setup (props, { emit }) {\n const getContainer = () => document.getElementById('ProviderConfig') || document.body\n const modalStyle = computed(() => {\n const position = props.position as ModalPosition\n const map = {\n default: '',\n top: 'top',\n center: 'middle',\n bottom: 'bottom'\n }\n return {\n verticalAlign: map[position]\n }\n })\n const width = props.width as string\n const height = props.height as string\n const originalWidth = props.originalWidth as string\n const originalHeight = props.originalHeight as string\n const modalWith = ref('80%')\n const containWidth = ref(0)\n const scaleWidth = ref()\n const containHeight = ref(0)\n const containStyle = ref({})\n const style = usePickComponentStyle(props)\n const contentStyle = ref({})\n const ready = ref(false)\n const modalRef = ref<HTMLElement>()\n let observer: MutationObserver | null\n const updateSize = () => {\n scaleWidth.value = parseFloat(width) / parseFloat(originalWidth)\n const scaleHeight = parseFloat(height) / parseFloat(originalHeight)\n const screenWidth = document.body.offsetWidth\n const screenHeight = document.body.offsetHeight\n containWidth.value = screenWidth * unref(scaleWidth)\n containHeight.value = screenHeight * scaleHeight\n modalWith.value = `${unref(scaleWidth) * 100}%`\n containStyle.value = {\n width: `${unref(containWidth)}px`,\n height: `${unref(containHeight)}px`\n }\n contentStyle.value = {\n ...unref(style),\n backgroundImage: useImagePath(props.backgroundImage as string, true),\n transform: `scale(${unref(containWidth) / parseFloat(width)},${unref(containHeight) / parseFloat(height)})`\n }\n }\n const onResize = debounce(() => {\n updateSize()\n }, 100)\n const initMutationObserver = () => {\n const MutationObserver = window.MutationObserver\n observer = new MutationObserver(onResize)\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['style'],\n attributeOldValue: true\n })\n }\n const removeMutationObserver = () => {\n if (observer) {\n observer.disconnect()\n observer.takeRecords()\n observer = null\n }\n }\n\n const visible = ref(false)\n const { touchRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n touchRequest: () => void 0\n })\n const showModal = () => {\n visible.value = true\n }\n const hideModal = () => {\n emit('close')\n visible.value = false\n }\n const onOk = () => {\n hideModal()\n }\n const onCancel = () => {\n hideModal()\n }\n const { setModalModel, pushUseModalIds, popUseModalIds } = inject(MODAL_MODEL, {\n pushUseModalIds: (_key: string) => {},\n popUseModalIds: () => {},\n setModalModel: (_key: string, _value: any) => {}\n })\n const handleModalModel = () => {\n const id = props.id\n let keys = []\n const componentList = props.componentList\n console.log('componentList', componentList)\n if (Array.isArray(componentList)) {\n keys = componentList.map((component) => component.id)\n setModalModel(id, [...new Set(keys)])\n }\n }\n watch(() => visible.value, async (visible) => {\n if (visible) {\n ready.value = false\n pushUseModalIds(props.id)\n handleModalModel()\n await nextTick(() => {\n updateSize()\n window.addEventListener('resize', onResize)\n initMutationObserver()\n ready.value = true\n })\n touchRequest()\n } else {\n popUseModalIds()\n window.removeEventListener('resize', onResize)\n removeMutationObserver()\n }\n })\n const isFullWidth = computed(() => unref(scaleWidth) >= 1)\n const isFullModal = computed(() => props.fullModal)\n const wrapClassName = computed(() => {\n let className = 'ecan-modal'\n if (unref(isFullWidth)) className += ' ecan-full-width-modal'\n if (unref(isFullModal)) className += ' ecan-full-modal'\n return className\n })\n // 注册\n useOnEvent(props, {\n showModal\n })\n\n return {\n modalRef,\n containStyle,\n contentStyle,\n getContainer,\n modalStyle,\n modalWith,\n isFullModal,\n style,\n visible,\n showModal,\n onOk,\n onCancel,\n isFullWidth,\n wrapClassName,\n ready\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.contain {\n position: relative;\n overflow: hidden;\n}\n.content {\n transform-origin: left top;\n z-index: 999;\n\n .header-bar {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n\n .close-icon {\n font-size: 18px;\n cursor: pointer;\n margin: 0 0 0 auto;\n }\n }\n}\n</style>\n\n<style lang=\"less\">\n.ecan-modal {\n .ant-modal-body {\n padding: 0;\n }\n .ant-modal-header {\n padding: 0;\n border-bottom: none;\n background: none;\n }\n}\n\n.ecan-full-width-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n }\n .ant-modal-body {\n flex: 1;\n }\n}\n\n.ecan-full-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n height: calc(100vh);\n }\n .ant-modal-body {\n flex: 1;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-modal {\n .anticon-close > svg > path {\n fill: #fff;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Modal from './Modal.vue'\nexport const EcanModal = withInstall(Modal)\nexport default EcanModal\nexport * from './props'\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, watch, inject, ref, unref } from 'vue'\nimport {\n useEmitEvent,\n usePickComponentStyle,\n useRequestData,\n useTransformChartDataByAttrValue,\n useOnEvent,\n useVariablesInText,\n useIndicatorData\n} from '@/hooks'\nimport Echarts from '@/common/echarts'\nimport { pieComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { PieChart } from 'echarts/charts'\nimport { TitleComponent, TooltipComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { handleFormatter } from '@/utils/util'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { ValueTypeDataFieldNames } from '@/utils/props'\nimport Spin from '@/common/spin'\nimport { Modal as AModal } from 'ant-design-vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n PieChart,\n TitleComponent,\n ToolboxComponent,\n TooltipComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanPie',\n props: {\n ...pieComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataset = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const option = computed(() => {\n let { data = [] } = unref(dataset)[0] || {}\n if (Array.isArray(props.colors)) {\n const isUseLabelColors = props.isUseLabelColors\n const colors = props.colors\n data = data.map((item, index) => ({\n label: isUseLabelColors ? { color: colors[index] } : {},\n ...item\n }))\n }\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n // 提示\n tooltip: {\n show: props.tooltipShow,\n trigger: props.tooltipTrigger,\n formatter: (params) => {\n const { marker, seriesName, name, value, percent, data } = params || {}\n return useVariablesInText(\n props.tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n percent,\n a: seriesName,\n b: name,\n c: value,\n d: percent,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n }\n )\n },\n textStyle: {\n color: props.tooltipTextStyleColor\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: visible.value ? ZOOM_FONT_SIZE : props.labelFontSize\n }\n },\n color: props.colors,\n series: [\n {\n data,\n type: 'pie',\n radius: [props.innerRadius, props.outerRadius],\n center: [props.centerLeft, props.centerTop],\n roseType: props.roseType,\n avoidLabelOverlap: false,\n minAngle: props.minAngle,\n // data: data.value,\n // data: props.data,\n // dimensions: ['name', 'count'],\n label: {\n show: props.labelPosition !== 'center' && props.labelShow,\n color: props.labelColor,\n fontSize: visible.value ? ZOOM_FONT_SIZE : props.labelFontSize,\n position: props.labelPosition,\n formatter: handleFormatter(props.labelFormatter)\n },\n labelLine: {\n show: props.labelLineShow,\n length: props.labelLineLength,\n length2: props.labelLineLength2\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)'\n },\n label: {\n // show: props.labelPosition === 'center'\n }\n }\n }\n ]\n }\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], dataFieldNames?: ValueTypeDataFieldNames) => {\n const { dataset: d } = useTransformChartDataByAttrValue(data, dataFieldNames)\n dataset.value = d\n }\n\n const handleIndicatorDataset = (data: any = [], dataFieldNames?: ValueTypeDataFieldNames) => {\n const chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n dataset.value = chartData.dataset\n }\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, props.valueTypeDataFieldNames)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e?.data })\n })\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { data } = res.data || {}\n if (data) {\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let arr = []\n if (columns.length > 0) {\n const name = columns[0]\n const value = columns[1]\n arr = rows.map(item => {\n return {\n name: item[name],\n value: item[value]\n }\n })\n }\n handleIndicatorDataset(arr)\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n click\n })\n\n expose({\n refreshData\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n return {\n option,\n style,\n click,\n onClose,\n loading,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, watch, inject, ref, unref } from 'vue'\nimport {\n useEmitEvent,\n usePickComponentStyle,\n useRequestData,\n useTransformChartDataByAttrValue,\n useOnEvent,\n useVariablesInText,\n useIndicatorData\n} from '@/hooks'\nimport Echarts from '@/common/echarts'\nimport { pieComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { PieChart } from 'echarts/charts'\nimport { TitleComponent, TooltipComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { handleFormatter } from '@/utils/util'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { ValueTypeDataFieldNames } from '@/utils/props'\nimport Spin from '@/common/spin'\nimport { Modal as AModal } from 'ant-design-vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n PieChart,\n TitleComponent,\n ToolboxComponent,\n TooltipComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanPie',\n props: {\n ...pieComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataset = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const option = computed(() => {\n let { data = [] } = unref(dataset)[0] || {}\n if (Array.isArray(props.colors)) {\n const isUseLabelColors = props.isUseLabelColors\n const colors = props.colors\n data = data.map((item, index) => ({\n label: isUseLabelColors ? { color: colors[index] } : {},\n ...item\n }))\n }\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n // 提示\n tooltip: {\n show: props.tooltipShow,\n trigger: props.tooltipTrigger,\n formatter: (params) => {\n const { marker, seriesName, name, value, percent, data } = params || {}\n return useVariablesInText(\n props.tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n percent,\n a: seriesName,\n b: name,\n c: value,\n d: percent,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n }\n )\n },\n textStyle: {\n color: props.tooltipTextStyleColor\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: visible.value ? ZOOM_FONT_SIZE : props.labelFontSize\n }\n },\n color: props.colors,\n series: [\n {\n data,\n type: 'pie',\n radius: [props.innerRadius, props.outerRadius],\n center: [props.centerLeft, props.centerTop],\n roseType: props.roseType,\n avoidLabelOverlap: false,\n minAngle: props.minAngle,\n // data: data.value,\n // data: props.data,\n // dimensions: ['name', 'count'],\n label: {\n show: props.labelPosition !== 'center' && props.labelShow,\n color: props.labelColor,\n fontSize: visible.value ? ZOOM_FONT_SIZE : props.labelFontSize,\n position: props.labelPosition,\n formatter: handleFormatter(props.labelFormatter)\n },\n labelLine: {\n show: props.labelLineShow,\n length: props.labelLineLength,\n length2: props.labelLineLength2\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)'\n },\n label: {\n // show: props.labelPosition === 'center'\n }\n }\n }\n ]\n }\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], dataFieldNames?: ValueTypeDataFieldNames) => {\n const { dataset: d } = useTransformChartDataByAttrValue(data, dataFieldNames)\n dataset.value = d\n }\n\n const handleIndicatorDataset = (data: any = [], dataFieldNames?: ValueTypeDataFieldNames) => {\n const chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n dataset.value = chartData.dataset\n }\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, props.valueTypeDataFieldNames)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e?.data })\n })\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { data } = res.data || {}\n if (data) {\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let arr = []\n if (columns.length > 0) {\n const name = columns[0]\n const value = columns[1]\n arr = rows.map(item => {\n return {\n name: item[name],\n value: item[value]\n }\n })\n }\n handleIndicatorDataset(arr)\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n click\n })\n\n expose({\n refreshData\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n return {\n option,\n style,\n click,\n onClose,\n loading,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport Pie from './Pie.vue'\nexport const EcanPie = withInstall(Pie)\nexport default EcanPie\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps,\n Data,\n ValueTypeDataFieldNames,\n KeyTypeDataFieldNames\n} from '@/utils/props'\n\nexport interface LineProps extends Props {\n data: Data\n titleText: string\n titleSubtext: string\n titleLeft: string\n colors: string[]\n legendShow: boolean,\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal' // 标记点大小\n symbolSize: number // 线宽度\n lineStyleWidth: number // 线宽\n smooth: boolean // 光滑\n xAxisLabelInterval: number\n xAxisSplitLineShow: boolean // x轴展示分割线\n xAxisLabelColor: string // x轴名称颜色\n xAxisLineStyleColor: string // x轴名称颜色\n xAxisSplitLineStyleColor: string // x轴分割线颜色\n xAxisTickShow: boolean // 展示刻度\n xAxisLabelFormatter: string // 格式化\n xAxisInverse: boolean\n xAxisMinInterval: number\n xAxisLabelWidth: number | undefined // x轴名称宽度\n xAxisLabelOverflow: 'none' | 'truncate' | 'break' | 'breakAll' // x轴名称溢出操作\n xAxisLabelRotate: number // x轴名称旋转\n yAxisMinInterval: number\n yAxisInverse: boolean\n yAxisSplitLineShow: boolean // y轴展示分割线\n yAxisSplitLineStyleColor: string // y轴分割线颜色\n yAxisLabelColor: string // y轴名称颜色\n yAxisLineStyleColor: string // y轴名称颜色\n yAxisLabelFormatter: string // 格式化\n valueTypeDataFieldNames: ValueTypeDataFieldNames\n keyTypeDataFieldNames: KeyTypeDataFieldNames\n dataFieldConfigType: 'key' | 'value'\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n graphicConfig: { [key:string]: any }\n tooltipFormatter: string\n tooltipShow: boolean\n toolboxShow: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n areaStyleOpacity: number\n}\n\nexport const lineProps = {\n ...props,\n id: '',\n name: '折线图',\n keyName: '折线图',\n type: 'ecanLine',\n width: '400px',\n height: '400px',\n top: '',\n left: '',\n rotate: '',\n data: [\n { name: '名称一', value: 235, type: '类型一' },\n { name: '名称二', value: 280, type: '类型一' },\n { name: '名称三', value: 230, type: '类型一' },\n { name: '名称四', value: 335, type: '类型一' }\n ],\n titleText: '',\n titleSubtext: '',\n titleLeft: '',\n legendShow: true,\n legendOrient: 'horizontal',\n legendTop: 'top',\n legendLeft: 'center',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n symbolSize: 4,\n lineStyleWidth: 2,\n smooth: false,\n xAxisLabelWidth: undefined,\n xAxisLabelRotate: 0,\n xAxisLabelOverflow: 'none',\n xAxisLabelInterval: 0,\n xAxisSplitLineShow: true,\n xAxisSplitLineStyleColor: '#333',\n xAxisLabelColor: '#333',\n xAxisLineStyleColor: '#333',\n xAxisTickShow: true,\n xAxisLabelFormatter: '{value}', // 格式化\n xAxisMinInterval: 0,\n yAxisMinInterval: 0,\n yAxisSplitLineShow: true,\n yAxisSplitLineStyleColor: '#333',\n yAxisLabelColor: '#333',\n yAxisLineStyleColor: '#333',\n yAxisLabelFormatter: '{value}',\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n valueTypeDataFieldNames: { name: 'name', value: 'value', type: 'type' },\n keyTypeDataFieldNames: { name: 'name', types: [] },\n dataFieldConfigType: 'value',\n graphicConfig: {},\n tooltipShow: true,\n tooltipFormatter: '{marker} {a} {c}',\n toolboxShow: false,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息',\n areaStyleOpacity: 0\n}\n\n// 转化默认属性\nexport const lineComponentProps = transformToComponentProps(lineProps)\n\nexport const lineEvents = ['click', 'refreshData', 'resetRecord']\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n ref=\"echartRef\"\n :option=\"option\"\n autoresize\n v-on=\"eventObj\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport {\n useValueFormatter,\n useEmitEvent, useOnEvent,\n usePickComponentStyle,\n useRequestData,\n useTransformChartDataByAttrKey,\n useTransformChartDataByAttrValue, useVariablesInText, useIndicatorData\n} from '@/hooks'\nimport Echarts from '@/common/echarts'\nimport { lineComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { LineChart } from 'echarts/charts'\nimport { TitleComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames } from '@/utils/props'\nimport Spin from '@/common/spin/Spin.vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n LineChart,\n ToolboxComponent,\n TitleComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanLine',\n props: {\n ...lineComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const echartRef = ref()\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const series = ref<{ [key: string]: any }[]>([])\n const dimensions = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const eventObj = ref<{ [key: string]: any }>({})\n let currentData: { [key: string]: any } | undefined\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subText: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n tooltip: {\n trigger: 'axis',\n textStyle: {\n fontSize: fontSize.value\n },\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n currentData = params[0]?.data\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n for (let i = 0; i < len; i++) {\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n }\n },\n xAxis: {\n type: 'category',\n data: unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n }),\n minInterval: props.xAxisMinInterval,\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n type: 'value',\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n fontSize: fontSize.value\n }\n },\n series: unref(series)\n }\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], useDataFieldNames: boolean = false) => {\n // dataFieldNames 字段映射\n let chartData\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n for (let i = 0; i < len; i++) {\n temp.push({\n type: 'line',\n ...dataset[i],\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n areaStyle: {\n // color: {\n // type: 'linear',\n // x: 0,\n // y: 0,\n // x2: 0,\n // y2: 1,\n // colorStops: [{\n // offset: 0, color: props.colors[i] // 0% 处的颜色\n // }, {\n // offset: 1, color: '#fff' // 100% 处的颜色\n // }],\n // global: false // 缺省为 false\n // },\n opacity: props.areaStyleOpacity\n },\n lineStyle: {\n width: props.lineStyleWidth\n }\n })\n }\n series.value = temp\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n for (let i = 0; i < len; i++) {\n temp.push({\n type: 'line',\n ...dataset[i],\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n lineStyle: {\n width: props.lineStyleWidth\n }\n })\n }\n series.value = temp\n }\n\n // 静态数据\n watch(() => [props.data, props.symbolSize, props.smooth, props.lineStyleWidth, props.areaStyleOpacity], ([data]) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(data)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: props.tooltipShow ? currentData : e.data })\n })\n\n const customClick = (params) => {\n if (echartRef.value.chart.containPixel('grid', [params.offsetX, params.offsetY])) {\n click()\n }\n }\n\n if (props.tooltipShow) {\n eventObj.value['zr:click'] = customClick\n } else {\n eventObj.value.click = click\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n resetRecord,\n click\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n expose({\n refreshData\n })\n\n return {\n option,\n style,\n click,\n loading,\n onClose,\n ecanModal,\n eventObj,\n echartRef\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.full-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n height: calc(100vh);\n }\n .ant-modal-body {\n flex: 1;\n }\n\n .ant-modal-body {\n padding: 45px 30px 0;\n }\n}\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n ref=\"echartRef\"\n :option=\"option\"\n autoresize\n v-on=\"eventObj\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport {\n useValueFormatter,\n useEmitEvent, useOnEvent,\n usePickComponentStyle,\n useRequestData,\n useTransformChartDataByAttrKey,\n useTransformChartDataByAttrValue, useVariablesInText, useIndicatorData\n} from '@/hooks'\nimport Echarts from '@/common/echarts'\nimport { lineComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { LineChart } from 'echarts/charts'\nimport { TitleComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames } from '@/utils/props'\nimport Spin from '@/common/spin/Spin.vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n LineChart,\n ToolboxComponent,\n TitleComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanLine',\n props: {\n ...lineComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const echartRef = ref()\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const series = ref<{ [key: string]: any }[]>([])\n const dimensions = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const eventObj = ref<{ [key: string]: any }>({})\n let currentData: { [key: string]: any } | undefined\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subText: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n tooltip: {\n trigger: 'axis',\n textStyle: {\n fontSize: fontSize.value\n },\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n currentData = params[0]?.data\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n for (let i = 0; i < len; i++) {\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n }\n },\n xAxis: {\n type: 'category',\n data: unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n }),\n minInterval: props.xAxisMinInterval,\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n type: 'value',\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n fontSize: fontSize.value\n }\n },\n series: unref(series)\n }\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], useDataFieldNames: boolean = false) => {\n // dataFieldNames 字段映射\n let chartData\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n for (let i = 0; i < len; i++) {\n temp.push({\n type: 'line',\n ...dataset[i],\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n areaStyle: {\n // color: {\n // type: 'linear',\n // x: 0,\n // y: 0,\n // x2: 0,\n // y2: 1,\n // colorStops: [{\n // offset: 0, color: props.colors[i] // 0% 处的颜色\n // }, {\n // offset: 1, color: '#fff' // 100% 处的颜色\n // }],\n // global: false // 缺省为 false\n // },\n opacity: props.areaStyleOpacity\n },\n lineStyle: {\n width: props.lineStyleWidth\n }\n })\n }\n series.value = temp\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n for (let i = 0; i < len; i++) {\n temp.push({\n type: 'line',\n ...dataset[i],\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n lineStyle: {\n width: props.lineStyleWidth\n }\n })\n }\n series.value = temp\n }\n\n // 静态数据\n watch(() => [props.data, props.symbolSize, props.smooth, props.lineStyleWidth, props.areaStyleOpacity], ([data]) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(data)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: props.tooltipShow ? currentData : e.data })\n })\n\n const customClick = (params) => {\n if (echartRef.value.chart.containPixel('grid', [params.offsetX, params.offsetY])) {\n click()\n }\n }\n\n if (props.tooltipShow) {\n eventObj.value['zr:click'] = customClick\n } else {\n eventObj.value.click = click\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n resetRecord,\n click\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n expose({\n refreshData\n })\n\n return {\n option,\n style,\n click,\n loading,\n onClose,\n ecanModal,\n eventObj,\n echartRef\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.full-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n height: calc(100vh);\n }\n .ant-modal-body {\n flex: 1;\n }\n\n .ant-modal-body {\n padding: 45px 30px 0;\n }\n}\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport Line from './Line.vue'\nexport const EcanLine = withInstall(Line)\nexport default EcanLine\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps,\n Data,\n KeyTypeDataFieldNames,\n ValueTypeDataFieldNames\n} from '@/utils/props'\n\nexport interface BarProps extends Props {\n data: Data\n titleText: string\n titleSubtext: string\n colors: string []\n legendShow: boolean\n legendTextStyleColor: string\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal'\n xAxisLabelInterval: number\n xAxisSplitLineShow: boolean // x轴展示分割线\n xAxisLabelColor: string // x轴名称颜色\n xAxisLabelWidth: number | undefined // x轴名称宽度\n xAxisLabelOverflow: 'none' | 'truncate' | 'break' | 'breakAll' // x轴名称溢出操作\n xAxisLabelRotate: number // x轴名称旋转\n xAxisLineStyleColor: string // x轴名称颜色\n xAxisTickShow: boolean // 展示刻度\n xAxisLabelFormatter: string\n xAxisSplitLineStyleColor: string // x轴分割线颜色\n xAxisInverse: boolean\n xAxisMinInterval: number\n yAxisMinInterval: number\n yAxisInverse: boolean\n yAxisLabelWidth: number | undefined // y轴名称宽度\n yAxisLabelOverflow: 'none' | 'truncate' | 'break' | 'breakAll' // y轴名称溢出操作\n yAxisLabelRotate: number // y轴名称旋转\n yAxisSplitLineShow: boolean // y轴展示分割线\n yAxisSplitLineStyleColor: string // y轴分割线颜色\n yAxisLabelColor: string // y轴名称颜色\n yAxisLineStyleColor: string // y轴名称颜色\n yAxisLabelFormatter: string\n valueTypeDataFieldNames: ValueTypeDataFieldNames\n keyTypeDataFieldNames: KeyTypeDataFieldNames\n dataFieldConfigType: 'key' | 'value'\n tooltipShow: boolean\n tooltipTextStyleColor: string\n tooltipFormatter: string,\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n barWidth: string\n graphicConfig: { [key:string]: any }\n toolboxShow: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n isUseHorizontalAxis: boolean\n axisInverse: boolean\n isStack: boolean\n labelShow: boolean\n labelFontSize: string\n labelPosition: 'inside' | 'top' | 'bottom' | 'right' | 'left'\n labelColor: string\n}\n\nexport const barProps: BarProps = {\n ...props,\n id: '',\n name: '柱状图',\n keyName: '柱状图',\n type: 'ecanBar',\n width: '400px',\n height: '400px',\n top: '',\n left: '',\n rotate: '',\n xAxisLabelFormatter: '{value}',\n yAxisLabelFormatter: '{value}',\n data: [\n {\n name: '名称一',\n value: 335,\n type: '类型一'\n },\n {\n name: '名称二',\n value: 310,\n type: '类型一'\n },\n {\n name: '名称三',\n value: 310,\n type: '类型一'\n }\n ],\n titleText: '',\n titleSubtext: '',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n legendShow: true,\n legendTextStyleColor: '#333',\n legendOrient: 'horizontal',\n legendTop: 'top',\n legendLeft: 'center',\n tooltipShow: true,\n tooltipTextStyleColor: '',\n tooltipFormatter: '{marker} {a} {c}',\n xAxisSplitLineShow: true,\n xAxisSplitLineStyleColor: '#333',\n xAxisLabelInterval: 0,\n xAxisLabelColor: '#333',\n xAxisLabelWidth: undefined,\n xAxisLabelRotate: 0,\n xAxisLabelOverflow: 'none',\n xAxisLineStyleColor: '#333',\n xAxisTickShow: true,\n xAxisMinInterval: 0,\n yAxisMinInterval: 0,\n yAxisLabelWidth: undefined,\n yAxisLabelRotate: 0,\n yAxisLabelOverflow: 'none',\n yAxisSplitLineShow: true,\n yAxisSplitLineStyleColor: '#333',\n yAxisLabelColor: '#333',\n yAxisLineStyleColor: '#333',\n valueTypeDataFieldNames: { name: 'name', value: 'value', type: 'type' },\n keyTypeDataFieldNames: { name: 'name', types: [] },\n dataFieldConfigType: 'value',\n barWidth: '40%',\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n graphicConfig: {},\n toolboxShow: false,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息',\n isUseHorizontalAxis: false,\n axisInverse: false,\n xAxisInverse: false,\n yAxisInverse: false,\n isStack: false,\n labelShow: false,\n labelFontSize: '12px',\n labelPosition: 'inside',\n labelColor: '',\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true\n}\n\n// 转化默认属性\nexport const barComponentProps = transformToComponentProps(barProps)\n\nexport const barEvents: string [] = ['refreshData', 'click', 'resetRecord']\n","<template>\n <div class=\"ecan-bar\" :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref, watch, inject, unref } from 'vue'\nimport {\n usePickComponentStyle,\n useOnEvent,\n useTransformChartDataByAttrValue,\n useTransformChartDataByAttrKey,\n useEmitEvent,\n useRequestData,\n useIndicatorData,\n useValueFormatter,\n useVariablesInText\n} from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames, Data } from '@/utils/props'\nimport Echarts from '@/common/echarts'\nimport { barComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { BarChart } from 'echarts/charts'\nimport Spin from '@/common/spin'\nimport { Modal as AModal } from 'ant-design-vue'\nimport {\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n} from 'echarts/components'\nimport { RequestModalParam } from '@/utils/types'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n BarChart,\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n])\nexport default defineComponent({\n name: 'EcanBar',\n props: {\n ...barComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataSource = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const series = computed(() => {\n const ds = unref(dataSource)\n const len = ds.length\n const series = []\n for (let i = 0; i < len; i++) {\n const item = {\n ...ds[i],\n type: 'bar',\n barWidth: props.barWidth\n } as { [key:string]: any }\n if (props.isStack) {\n item.stack = 'stack'\n }\n item.label = {\n show: props.labelShow,\n fontSize: props.labelFontSize,\n position: props.labelPosition,\n color: props.labelColor\n }\n series.push(item)\n }\n return series\n })\n const dimensions = ref<{ [key: string]: any }[]>([])\n const loading = ref(false)\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n tooltip: {\n trigger: 'axis',\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n for (let i = 0; i < len; i++) {\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n },\n // valueFormatter: (value) => {\n // return useVariablesInText(props.tooltipValueFormatter as string, { value })\n // },\n textStyle: {\n color: props.tooltipTextStyleColor,\n fontSize: fontSize.value\n }\n },\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: fontSize.value\n }\n },\n xAxis: {\n type: props.isUseHorizontalAxis ? 'value' : 'category',\n data: props.isUseHorizontalAxis ? null : unref(xAxisData),\n inverse: props.isUseHorizontalAxis ? props.xAxisInverse : props.axisInverse,\n minInterval: props.xAxisMinInterval,\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n type: props.isUseHorizontalAxis ? 'category' : 'value',\n data: props.isUseHorizontalAxis ? unref(dimensions) : null,\n inverse: props.isUseHorizontalAxis ? props.axisInverse : props.yAxisInverse,\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n rotate: props.yAxisLabelRotate,\n width: props.yAxisLabelWidth,\n overflow: props.yAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n series: unref(series)\n }\n })\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const handleDataset = (data: Data = [], useDataFieldNames: boolean = false) => {\n let chartData = {} as { [key:string]: any }\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n dataSource.value = chartData.dataset\n dimensions.value = chartData.dimensions\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n dataSource.value = chartData.dataset\n dimensions.value = chartData.dimensions\n }\n\n const xAxisData = computed(() => {\n return unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n })\n })\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n expose({\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e.data })\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n click,\n resetRecord\n })\n\n return {\n option,\n style,\n refreshData,\n click,\n loading,\n onClose,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","<template>\n <div class=\"ecan-bar\" :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref, watch, inject, unref } from 'vue'\nimport {\n usePickComponentStyle,\n useOnEvent,\n useTransformChartDataByAttrValue,\n useTransformChartDataByAttrKey,\n useEmitEvent,\n useRequestData,\n useIndicatorData,\n useValueFormatter,\n useVariablesInText\n} from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames, Data } from '@/utils/props'\nimport Echarts from '@/common/echarts'\nimport { barComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { BarChart } from 'echarts/charts'\nimport Spin from '@/common/spin'\nimport { Modal as AModal } from 'ant-design-vue'\nimport {\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n} from 'echarts/components'\nimport { RequestModalParam } from '@/utils/types'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n BarChart,\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n])\nexport default defineComponent({\n name: 'EcanBar',\n props: {\n ...barComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataSource = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const series = computed(() => {\n const ds = unref(dataSource)\n const len = ds.length\n const series = []\n for (let i = 0; i < len; i++) {\n const item = {\n ...ds[i],\n type: 'bar',\n barWidth: props.barWidth\n } as { [key:string]: any }\n if (props.isStack) {\n item.stack = 'stack'\n }\n item.label = {\n show: props.labelShow,\n fontSize: props.labelFontSize,\n position: props.labelPosition,\n color: props.labelColor\n }\n series.push(item)\n }\n return series\n })\n const dimensions = ref<{ [key: string]: any }[]>([])\n const loading = ref(false)\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n tooltip: {\n trigger: 'axis',\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n for (let i = 0; i < len; i++) {\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n },\n // valueFormatter: (value) => {\n // return useVariablesInText(props.tooltipValueFormatter as string, { value })\n // },\n textStyle: {\n color: props.tooltipTextStyleColor,\n fontSize: fontSize.value\n }\n },\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: fontSize.value\n }\n },\n xAxis: {\n type: props.isUseHorizontalAxis ? 'value' : 'category',\n data: props.isUseHorizontalAxis ? null : unref(xAxisData),\n inverse: props.isUseHorizontalAxis ? props.xAxisInverse : props.axisInverse,\n minInterval: props.xAxisMinInterval,\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n type: props.isUseHorizontalAxis ? 'category' : 'value',\n data: props.isUseHorizontalAxis ? unref(dimensions) : null,\n inverse: props.isUseHorizontalAxis ? props.axisInverse : props.yAxisInverse,\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n rotate: props.yAxisLabelRotate,\n width: props.yAxisLabelWidth,\n overflow: props.yAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n series: unref(series)\n }\n })\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const handleDataset = (data: Data = [], useDataFieldNames: boolean = false) => {\n let chartData = {} as { [key:string]: any }\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n dataSource.value = chartData.dataset\n dimensions.value = chartData.dimensions\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n dataSource.value = chartData.dataset\n dimensions.value = chartData.dimensions\n }\n\n const xAxisData = computed(() => {\n return unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n })\n })\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n expose({\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e.data })\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n click,\n resetRecord\n })\n\n return {\n option,\n style,\n refreshData,\n click,\n loading,\n onClose,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Bar from './Bar.vue'\nexport const EcanBar = withInstall(Bar)\nexport default EcanBar\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps,\n Data\n} from '@/utils/props'\n\nexport interface ScatterProps extends Props {\n data: Data\n titleText: string\n titleSubtext: string\n colors: string []\n legendShow: boolean,\n tooltipShow: boolean,\n tooltipTrigger: 'item' | 'axis' | 'none'\n tooltipFormatter: string\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal'\n symbolSize: number // 标记点大小\n xAxisLabelInterval: number\n xAxisLabelWidth: number | undefined // x轴名称宽度\n xAxisLabelOverflow: 'none' | 'truncate' | 'break' | 'breakAll' // x轴名称溢出操作\n xAxisLabelRotate: number // x轴名称旋转\n xAxisSplitLineShow: boolean // x轴展示分割线\n xAxisLabelColor: string // x轴名称颜色\n xAxisLineStyleColor: string // x轴名称颜色\n xAxisTickShow: boolean // 展示刻度\n xAxisLabelFormatter: string // 格式化\n yAxisSplitLineShow: boolean // y轴展示分割线\n xAxisSplitLineStyleColor: string // x轴分割线颜色\n yAxisSplitLineStyleColor: string // y轴分割线颜色\n yAxisLabelColor: string // y轴名称颜色\n yAxisLineStyleColor: string // y轴名称颜色\n yAxisLabelFormatter: string // 格式化\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n dataFieldNames: { name: string, value: string }\n graphicConfig: { [key:string]: any }\n toolboxShow: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n}\n\nexport const scatterProps: ScatterProps = {\n ...props,\n id: '',\n name: '散点图',\n keyName: '散点图',\n type: 'ecanScatter',\n width: '400px',\n height: '400px',\n top: '',\n left: '',\n rotate: '',\n data: [\n { name: 233, value: 335 },\n { name: 556, value: 310 },\n { name: 56, value: 234 }\n ],\n titleText: '',\n titleSubtext: '',\n tooltipShow: true,\n tooltipTrigger: 'item',\n tooltipFormatter: '{marker} {b} {c}',\n legendShow: false,\n legendOrient: 'horizontal',\n legendTop: 'top',\n legendLeft: 'center',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n symbolSize: 10,\n xAxisSplitLineShow: true,\n xAxisSplitLineStyleColor: '#333',\n xAxisLineStyleColor: '#333',\n xAxisTickShow: true,\n xAxisLabelColor: '#333',\n xAxisLabelOverflow: 'none',\n xAxisLabelInterval: 0,\n xAxisLabelWidth: undefined,\n xAxisLabelRotate: 0,\n xAxisLabelFormatter: '{value}',\n yAxisSplitLineShow: true,\n yAxisSplitLineStyleColor: '#333',\n yAxisLabelColor: '#333',\n yAxisLineStyleColor: '#333',\n yAxisLabelFormatter: '{value}',\n dataFieldNames: { name: 'name', value: 'value' },\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n graphicConfig: {},\n toolboxShow: false,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息'\n}\n\n// 转化默认属性\nexport const scatterComponentProps = transformToComponentProps(scatterProps)\n\nexport const scatterEvents = ['click', 'refreshData', 'resetRecord']\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref, watch, inject, unref } from 'vue'\nimport {\n useValueFormatter,\n useEmitEvent,\n useOnEvent,\n usePickComponentStyle,\n useRequestData,\n useVariablesInText\n} from '@/hooks'\nimport { RequestModalParam } from '@/utils/types'\nimport Echarts from '@/common/echarts'\nimport { scatterComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { ScatterChart } from 'echarts/charts'\nimport { TitleComponent, TooltipComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport Spin from '@/common/spin/Spin.vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n ScatterChart,\n ToolboxComponent,\n TitleComponent,\n TooltipComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanScatter',\n props: {\n ...scatterComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataset = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n xAxis: {\n // type: 'value'\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n // 提示\n tooltip: {\n show: props.tooltipShow,\n trigger: props.tooltipTrigger,\n formatter (params) {\n const { marker, seriesName } = params\n const record = params?.data?.record ?? {}\n const { name, value } = record\n return useVariablesInText(props.tooltipFormatter, {\n textData: {\n marker,\n seriesName,\n a: seriesName,\n b: name,\n c: value,\n ...record\n }\n })\n },\n axisPointer: {\n type: 'cross'\n },\n textStyle: {\n fontSize: fontSize.value\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n fontSize: fontSize.value\n }\n },\n series: [\n {\n data: unref(dataset),\n type: 'scatter',\n symbolSize: props.symbolSize\n }\n ]\n }\n })\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], dataFieldNames?: { name: string, value:string }) => {\n const { name: x = 'name', value: y = 'value' } = dataFieldNames || {}\n dataset.value = data.map(item => ({ value: [item[x], item[y]], record: item }))\n }\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, props.dataFieldNames)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const onClose = () => {\n visible.value = false\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: e?.data })\n })\n\n const refreshData = () => {\n handleRequestData()\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n click,\n resetRecord\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n }\n\n return {\n option,\n style,\n click,\n loading,\n onClose,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref, watch, inject, unref } from 'vue'\nimport {\n useValueFormatter,\n useEmitEvent,\n useOnEvent,\n usePickComponentStyle,\n useRequestData,\n useVariablesInText\n} from '@/hooks'\nimport { RequestModalParam } from '@/utils/types'\nimport Echarts from '@/common/echarts'\nimport { scatterComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { ScatterChart } from 'echarts/charts'\nimport { TitleComponent, TooltipComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport Spin from '@/common/spin/Spin.vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n ScatterChart,\n ToolboxComponent,\n TitleComponent,\n TooltipComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanScatter',\n props: {\n ...scatterComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataset = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n xAxis: {\n // type: 'value'\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n // 提示\n tooltip: {\n show: props.tooltipShow,\n trigger: props.tooltipTrigger,\n formatter (params) {\n const { marker, seriesName } = params\n const record = params?.data?.record ?? {}\n const { name, value } = record\n return useVariablesInText(props.tooltipFormatter, {\n textData: {\n marker,\n seriesName,\n a: seriesName,\n b: name,\n c: value,\n ...record\n }\n })\n },\n axisPointer: {\n type: 'cross'\n },\n textStyle: {\n fontSize: fontSize.value\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n fontSize: fontSize.value\n }\n },\n series: [\n {\n data: unref(dataset),\n type: 'scatter',\n symbolSize: props.symbolSize\n }\n ]\n }\n })\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], dataFieldNames?: { name: string, value:string }) => {\n const { name: x = 'name', value: y = 'value' } = dataFieldNames || {}\n dataset.value = data.map(item => ({ value: [item[x], item[y]], record: item }))\n }\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, props.dataFieldNames)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const onClose = () => {\n visible.value = false\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: e?.data })\n })\n\n const refreshData = () => {\n handleRequestData()\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n click,\n resetRecord\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n }\n\n return {\n option,\n style,\n click,\n loading,\n onClose,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Scatter from './Scatter.vue'\nexport const EcanScatter = withInstall(Scatter)\nexport default EcanScatter\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface CustomGraphProps extends Props {\n option: { [key:string]: any }\n optionCode: string\n}\n\nexport const customGraphProps: CustomGraphProps = {\n ...props,\n id: '',\n name: '自定义图表',\n keyName: '自定义图表',\n type: 'ecanCustomGraph',\n width: '400px',\n height: '400px',\n option: {},\n optionCode: ''\n}\n\n// 转化默认属性\nexport const customGraphComponentProps = transformToComponentProps(customGraphProps)\n","<template>\n <div :style=\"style\">\n <echarts\n :option=\"myOption\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, watch, ref } from 'vue'\nimport Echarts from '../../common/echarts'\nimport { customGraphComponentProps } from './props'\nimport { usePickComponentStyle } from '../../hooks'\nimport * as echarts from 'echarts'\n// import 'echarts/components'\nexport default defineComponent({\n name: 'EcanCustomGraph',\n props: {\n ...customGraphComponentProps\n },\n components: {\n Echarts\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myOption = ref()\n watch(() => props.optionCode, (optionCode: string) => {\n /* // eslint-disable-next-line\n let option = {}\n // eslint-disable-next-line\n eval(props.optionCode as string)\n myOption.value = option */\n try {\n // eslint-disable-next-line\n const evalCopy = eval\n myOption.value = evalCopy(optionCode)\n } catch (e) {\n console.error(e)\n }\n }, {\n immediate: true\n })\n return {\n style,\n myOption,\n echarts\n }\n }\n})\n</script>\n","<template>\n <div :style=\"style\">\n <echarts\n :option=\"myOption\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, watch, ref } from 'vue'\nimport Echarts from '../../common/echarts'\nimport { customGraphComponentProps } from './props'\nimport { usePickComponentStyle } from '../../hooks'\nimport * as echarts from 'echarts'\n// import 'echarts/components'\nexport default defineComponent({\n name: 'EcanCustomGraph',\n props: {\n ...customGraphComponentProps\n },\n components: {\n Echarts\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myOption = ref()\n watch(() => props.optionCode, (optionCode: string) => {\n /* // eslint-disable-next-line\n let option = {}\n // eslint-disable-next-line\n eval(props.optionCode as string)\n myOption.value = option */\n try {\n // eslint-disable-next-line\n const evalCopy = eval\n myOption.value = evalCopy(optionCode)\n } catch (e) {\n console.error(e)\n }\n }, {\n immediate: true\n })\n return {\n style,\n myOption,\n echarts\n }\n }\n})\n</script>\n","import { withInstall } from '../../utils/withInstall'\nimport CustomGraph from './CustomGraph.vue'\nexport const EcanCustomGraph = withInstall(CustomGraph)\nexport default EcanCustomGraph\nexport * from './props'\n","import {\n Data,\n Props,\n props,\n transformToComponentProps,\n ValueTypeDataFieldNames,\n KeyTypeDataFieldNames\n} from '@/utils/props'\n\nexport interface ComboGraphProps extends Props {\n data: Data,\n titleText: string\n titleSubtext: string\n colors: string []\n legendShow: boolean\n legendTextStyleColor: string\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal'\n xAxisLabelInterval: number\n xAxisSplitLineShow: boolean // x轴展示分割线\n xAxisMinInterval: number // 最小间距\n xAxisLabelColor: string // x轴名称颜色\n xAxisLabelRotate: number\n xAxisLabelOverflow: string\n xAxisLabelWidth: number | undefined // x轴名称宽度\n xAxisLineStyleColor: string // x轴名称颜色\n xAxisTickShow: boolean // 展示刻度\n yAxisSplitLineShow: boolean // y轴展示分割线\n xAxisSplitLineStyleColor: string // x轴分割线颜色\n yAxisSplitLineStyleColor: string // y轴分割线颜色\n yAxisLabelColor: string // y轴名称颜色\n yAxisLineStyleColor: string // y轴名称颜色\n valueTypeDataFieldNames: ValueTypeDataFieldNames\n keyTypeDataFieldNames: KeyTypeDataFieldNames\n tooltipShow: boolean\n tooltipTrigger: 'item' | 'axis' | 'none'\n tooltipTextStyleColor: string\n tooltipFormatter: string\n seriesTypes: { [key: string]: any } []\n dataFieldConfigType: 'key' | 'value'\n yAxis: { [key: string]: any } []\n yAxisMinInterval: number\n graphicConfig: { [key:string]: any }\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n toolboxShow: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n symbolSize: number // 线宽度\n lineStyleWidth: number // 线宽\n smooth: boolean // 光滑\n areaStyleOpacity: number\n barWidth: string\n}\n\nexport const comboGraphProps: ComboGraphProps = {\n ...props,\n id: '',\n name: '组合图表',\n keyName: '组合图表',\n type: 'ecanComboGraph',\n width: '400px',\n height: '400px',\n data: [\n {\n name: '名称一',\n value: 335,\n type: '类型一'\n },\n {\n name: '名称二',\n value: 410,\n type: '类型一'\n },\n {\n name: '名称三',\n value: 210,\n type: '类型一'\n },\n {\n name: '名称一',\n value: 510,\n type: '类型二'\n },\n {\n name: '名称二',\n value: 731,\n type: '类型二'\n },\n {\n name: '名称三',\n value: 910,\n type: '类型二'\n }\n ],\n titleText: '',\n titleSubtext: '',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n legendShow: true,\n legendTextStyleColor: '#333',\n legendOrient: 'horizontal',\n legendTop: 'top',\n legendLeft: 'center',\n tooltipShow: true,\n tooltipTextStyleColor: '',\n tooltipTrigger: 'item',\n tooltipFormatter: '{marker} {a} {c}',\n xAxisLabelInterval: 0,\n xAxisSplitLineShow: true,\n xAxisLabelRotate: 0,\n xAxisLabelOverflow: 'none',\n xAxisLabelWidth: undefined,\n xAxisSplitLineStyleColor: '#333',\n xAxisLabelColor: '#333',\n xAxisLineStyleColor: '#333',\n xAxisTickShow: true,\n xAxisMinInterval: 0,\n yAxisMinInterval: 0,\n yAxisSplitLineShow: true,\n yAxisSplitLineStyleColor: '#333',\n yAxisLabelColor: '#333',\n yAxisLineStyleColor: '#333',\n valueTypeDataFieldNames: { name: 'name', value: 'value', type: 'type' },\n keyTypeDataFieldNames: { name: 'name', types: [] },\n dataFieldConfigType: 'value',\n seriesTypes: [\n {\n type: 'bar',\n axisIndex: 0\n },\n {\n type: 'line',\n axisIndex: 0\n }\n ],\n yAxis: [\n {\n axisLabelFormatter: '{value}'\n },\n {\n axisLabelFormatter: '{value}'\n }\n ],\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n graphicConfig: {},\n toolboxShow: false,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息',\n areaStyleOpacity: 0,\n symbolSize: 4,\n lineStyleWidth: 2,\n smooth: false,\n barWidth: '40%'\n}\n\n// 转化默认属性\nexport const comboGraphComponentProps = transformToComponentProps(comboGraphProps)\n\nexport const comboGraphEvents = ['refreshData', 'click', 'resetRecord']\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport {\n useEmitEvent,\n useOnEvent,\n usePickComponentStyle,\n useRequestData, useTransformChartDataByAttrKey,\n useTransformChartDataByAttrValue,\n useValueFormatter,\n useVariablesInText,\n useIndicatorData\n} from '@/hooks'\nimport { comboGraphComponentProps } from './props'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames } from '@/utils/props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { BarChart, LineChart } from 'echarts/charts'\nimport { DatasetComponent, LegendComponent, TitleComponent, ToolboxComponent } from 'echarts/components'\nimport Echarts from '@/common/echarts'\nimport Spin from '@/common/spin/'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n BarChart,\n LineChart,\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n])\nexport default defineComponent({\n name: 'EcanComboGraph',\n props: {\n ...comboGraphComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const series = ref<{ [key: string]: any }[]>([])\n const dimensions = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const option = computed(() => ({\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: fontSize.value\n }\n },\n tooltip: {\n trigger: 'axis',\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n const { tooltipFormatter: _tooltipFormatter } = seriesType || {}\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n // 如果系列有提示框组件就使用自定义,没有就用默认的\n _tooltipFormatter || tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n seriesName,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n },\n textStyle: {\n color: props.tooltipTextStyleColor,\n fontSize: fontSize.value\n }\n },\n xAxis: {\n minInterval: props.xAxisMinInterval,\n type: 'category',\n data: unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n }),\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: unref(yAxis),\n series: unref(series)\n }))\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const handleDataset = (data: any = [], useDataFieldNames: boolean = false) => {\n // dataFieldNames 字段映射\n let chartData\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n // dataFieldNames 字段映射\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n const { type, axisIndex } = seriesType || {}\n let series = {\n type: type,\n yAxisIndex: axisIndex,\n ...dataset[i]\n } as { [key:string]: any }\n if (type === 'line') {\n series = {\n ...series,\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n areaStyle: {\n opacity: props.areaStyleOpacity\n },\n lineStyle: {\n width: props.lineStyleWidth\n }\n }\n }\n if (type === 'bar') {\n series = {\n ...series,\n barWidth: props.barWidth\n }\n }\n temp.push(series)\n }\n series.value = temp\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n // dataFieldNames 字段映射\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n temp.push({\n type: seriesType?.type,\n yAxisIndex: seriesType?.axisIndex,\n ...dataset[i]\n })\n }\n series.value = temp\n }\n\n // 静态数据\n watch(() => [props.data, props.seriesTypes, props.symbolSize, props.smooth, props.areaStyleOpacity, props.lineStyleWidth, props.barWidth], ([value]) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const yAxis = computed(() => {\n const yAxis = props.yAxis\n return yAxis?.map((axis) => {\n return {\n type: 'value',\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(axis.axisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n }\n })\n })\n\n const loading = ref(false)\n\n const requestData = useRequestData(props)\n\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n expose({\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e?.data })\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n click\n })\n\n return {\n style,\n option,\n click,\n loading,\n onClose,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport {\n useEmitEvent,\n useOnEvent,\n usePickComponentStyle,\n useRequestData, useTransformChartDataByAttrKey,\n useTransformChartDataByAttrValue,\n useValueFormatter,\n useVariablesInText,\n useIndicatorData\n} from '@/hooks'\nimport { comboGraphComponentProps } from './props'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames } from '@/utils/props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { BarChart, LineChart } from 'echarts/charts'\nimport { DatasetComponent, LegendComponent, TitleComponent, ToolboxComponent } from 'echarts/components'\nimport Echarts from '@/common/echarts'\nimport Spin from '@/common/spin/'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n BarChart,\n LineChart,\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n])\nexport default defineComponent({\n name: 'EcanComboGraph',\n props: {\n ...comboGraphComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const series = ref<{ [key: string]: any }[]>([])\n const dimensions = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const option = computed(() => ({\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: fontSize.value\n }\n },\n tooltip: {\n trigger: 'axis',\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n const { tooltipFormatter: _tooltipFormatter } = seriesType || {}\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n // 如果系列有提示框组件就使用自定义,没有就用默认的\n _tooltipFormatter || tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n seriesName,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n },\n textStyle: {\n color: props.tooltipTextStyleColor,\n fontSize: fontSize.value\n }\n },\n xAxis: {\n minInterval: props.xAxisMinInterval,\n type: 'category',\n data: unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n }),\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: unref(yAxis),\n series: unref(series)\n }))\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const handleDataset = (data: any = [], useDataFieldNames: boolean = false) => {\n // dataFieldNames 字段映射\n let chartData\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n // dataFieldNames 字段映射\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n const { type, axisIndex } = seriesType || {}\n let series = {\n type: type,\n yAxisIndex: axisIndex,\n ...dataset[i]\n } as { [key:string]: any }\n if (type === 'line') {\n series = {\n ...series,\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n areaStyle: {\n opacity: props.areaStyleOpacity\n },\n lineStyle: {\n width: props.lineStyleWidth\n }\n }\n }\n if (type === 'bar') {\n series = {\n ...series,\n barWidth: props.barWidth\n }\n }\n temp.push(series)\n }\n series.value = temp\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n // dataFieldNames 字段映射\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n temp.push({\n type: seriesType?.type,\n yAxisIndex: seriesType?.axisIndex,\n ...dataset[i]\n })\n }\n series.value = temp\n }\n\n // 静态数据\n watch(() => [props.data, props.seriesTypes, props.symbolSize, props.smooth, props.areaStyleOpacity, props.lineStyleWidth, props.barWidth], ([value]) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const yAxis = computed(() => {\n const yAxis = props.yAxis\n return yAxis?.map((axis) => {\n return {\n type: 'value',\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(axis.axisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n }\n })\n })\n\n const loading = ref(false)\n\n const requestData = useRequestData(props)\n\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n expose({\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e?.data })\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n click\n })\n\n return {\n style,\n option,\n click,\n loading,\n onClose,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport ComboGraph from './ComboGraph.vue'\nexport const EcanComboGraph = withInstall(ComboGraph)\nexport default EcanComboGraph\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface BorderProps extends Props {\n fontSize: string // 字体大小\n fontFamily: string // 字体\n fontWeight: number // 字体的粗细程度\n title: string\n mode: 'top-title' | 'no-title' | 'left-top'\n borderColor: string\n borderRadius: string\n borderStyle: string\n borderWidth: string\n backgroundColor: string\n useBorderModify: boolean\n textShadow: string\n data: { [key:string]: any }\n}\n\nexport const borderProps: BorderProps = {\n ...props,\n name: '边框',\n keyName: '边框',\n type: 'ecanBorder',\n width: '300px',\n height: '300px',\n zIndex: 0,\n fontSize: '16px',\n fontFamily: '',\n fontWeight: 700,\n title: '标题',\n mode: 'no-title',\n borderColor: '#eee',\n borderRadius: '5px',\n borderStyle: 'solid',\n borderWidth: '2px',\n backgroundColor: '#ffffff',\n useBorderModify: false,\n textShadow: '',\n data: {}\n}\n\nexport const borderComponentProps = transformToComponentProps(borderProps)\n\nexport const borderEvents = ['click']\n","<template>\n <div class=\"ecan-border\" :style=\"style\" @click=\"click\">\n <div\n class=\"no-title\"\n :style=\"borderStyle\"\n v-if=\"mode === 'no-title'\"\n >\n <template v-if=\"useBorderModify\">\n <div class=\"top-left border-item\"/>\n <div class=\"top-right border-item\"/>\n <div class=\"bottom-left border-item\"/>\n <div class=\"bottom-right border-item\"/>\n </template>\n </div>\n <div class=\"top-title\" :style=\"borderStyle\" v-if=\"mode === 'top-title'\">\n <div class=\"title-item-wrapper\">\n <div class=\"title-item\">\n <img\n class=\"title-decoration-left\"\n src=\"../../assets/border-title-decoration-left.png\"\n >\n <div class=\"title\">{{ title }}</div>\n <img\n class=\"title-decoration-right\"\n src=\"../../assets/border-title-decoration-right.png\"\n >\n </div>\n </div>\n <div class=\"top-left border-item\"/>\n <div class=\"top-right border-item\"/>\n <div class=\"bottom-left border-item\"/>\n <div class=\"bottom-right border-item\"/>\n </div>\n <div class=\"left-title\" v-if=\"mode === 'left-title'\">\n <div class=\"title\">\n <span>{{ title }}</span>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, watch } from 'vue'\nimport { borderComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle } from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanBorder',\n props: {\n ...borderComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props, ['background'])\n const { theme } = inject(GLOBAL_CONFIG, {\n theme: 'light'\n })\n const borderStyle = computed(() => {\n return {\n // borderWidth: props.borderWidth,\n // borderStyle: props.borderStyle,\n // borderRadius: props.borderRadius,\n // borderColor: props.borderColor,\n // backgroundColor: props.backgroundColor,\n width: '100%',\n height: '100%'\n }\n })\n const emitEvent = useEmitEvent(props)\n const click = emitEvent('click', () => {})\n const myData = ref<{ [key:string]: any } []>([])\n watch(() => props.data, (data: { [key:string]: any } []) => {\n myData.value = data\n }, {\n immediate: true,\n deep: true\n })\n useOnEvent(props, {\n click\n })\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myData\n })\n return {\n style,\n click,\n borderStyle,\n theme\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.top-title, .no-title {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n .border-item {\n position: absolute;\n z-index: 2;\n border-color: #50FCFC;\n border-style: solid;\n width: 13px;\n height: 11px;\n }\n .top-left {\n top: 0;\n left: 0;\n border-top-width: 1px;\n border-right-width: 0;\n border-bottom-width: 0;\n border-left-width: 1px;\n }\n .top-right {\n top: 0;\n right: -2px;\n border-top-width: 1px;\n border-right-width: 1px;\n border-bottom-width: 0;\n border-left-width: 0;\n }\n .bottom-left {\n bottom: -2px;\n left: 0;\n border-top-width: 0;\n border-right-width: 0;\n border-bottom-width: 1px;\n border-left-width: 1px;\n }\n .bottom-right {\n bottom: -2px;\n right: -2px;\n border-top-width: 0;\n border-right-width: 1px;\n border-bottom-width: 1px;\n border-left-width: 0;\n }\n .title-item-wrapper {\n width: 100%;\n padding: 5px 0;\n background-image: url(\"../../assets/border-title-background.png\");\n background-size: cover;\n display: grid;\n place-content: center;\n }\n .title-item {\n display: flex;\n align-items: center;\n }\n .title {\n padding: 0 17px;\n color: #d5fdfd;\n background: linear-gradient(0deg,#01aaff,#00eaff);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n .title-decoration-left {\n width: 58px;\n height: 14px;\n }\n .title-decoration-right {\n width: 58px;\n height: 14px;\n }\n}\n\n.left-title {\n position: relative;\n width: 100%;\n height: 100%;\n border: 2px solid #375A8899;\n border-radius: 0;\n .title {\n position: absolute;\n left: -33px;\n top: -14px;\n width: 33px;\n min-height: 194px;\n padding-top: 33px;\n padding-bottom: 31px;\n background-image: url(\"../../assets/border-left-title.png\");\n background-repeat: no-repeat;\n background-size: 100% 100%;\n color: #fff;\n font-weight: 500;\n text-align: center;\n span {\n writing-mode: vertical-lr;\n }\n }\n}\n</style>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAAcCAMAAACH42siAAAAZlBMVEUAAABBltJCldJCldFEk89BltJCltFBldI/lMBKndtmb9pCltNDldFAkclAldNBldJBltM/lM5AltNCldJBldJBlNJBltVBldJBlNJBlNI/lNNBldJBldNAldJBldJBldJBldNBldIiNK7WAAAAInRSTlMAM4BNGmaz5gQGbiAPCV1WQxUpOCY9EmxQSC2jdoacqZK8uPo7tAAAAZ9JREFUSMe90NmOwjAMheGka0J3SulCy/L+Lzk4I+HYhckEKs7dr1x8kQVM5YJMZ7SLiXVHOw817Z72cSns3BmziY7EnGRGjDqUpKt4pEZQKruvyaJt85YmBUebKLJVNUlpq6oOQ1tVVRzbqu6DwFb1NUlsVd3SNL0UDM0jqkaSqoeQqjKmahtQNUzuC1AtU1sF9KHmnmrtrSK6idqBWqE6GFVxFdGvqDGoJ01Qt7rfTEV0e7V6qSK6VjNPtTaqoOq8Ugnqr7aeav+rAuqrTh+qZw3o1urAVcFVQD3U6ZnaYY9MLZk6G5WhDaDFI9UeUPyE7gCNsAdAD9gxoBJ7ARRPUVwALXdu8/h/s3xmjtwUu0/M0M/UJzBjAei3TUTdpmKmcpkBmOHKBNTPzJi59zYJys3DO2aL78YcmNkLgrrM9m9TucwzmoBy08xlju+bgL42G4c5OcxqZSLqbwqXOVNTGXMWFD0ak6KN1ZKaojYmbribndW9MXELNQEFFUyiNqQlmEQ1JqpgErUifUUTUVEIupx1wzpjvWfdsh4FQX8ANe4nnpsb9NEAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAAcCAMAAACH42siAAAAaVBMVEUAAABElM9BltJCldJCldFBltJBldJCltFNmrNCmNNFldNAldJBldNBldRBldNBldNBldJCoNFBldJBltNBldJBldJAldJAltJBldJBldJBldNAlNFAldJBlNJAldJBldNBldJBldJBldLfIVowAAAAI3RSTlMAGjJNgGbmswMSCScgDTs/ZAVRK0eYj2s3r3AWveHEhXjeXb5rzlgAAAFqSURBVEjH1dbJVsJAEIXhHjJ05tlEooK8/0NKsbDrFjmHiBD0Lvqcf9PfthRM7xvoZMQuLHZaOejGYLtcdEItzI9oaLg5xIHj5hgcG262oXXcrGzJ23Umg5717C7NKBrAjOMDM8YgCI5ghmEPprUTmMZkrBOtdbJgfpZovho0gwzNOkfTam9k5jSGkKlTMOezWT3VLH5qlg8wQzSbO5jJ28l8Z+YLmZMwuz9lupvNXpjlFTMTZv7vzFSatTDtGnNeYdpNzZTMSJhx5f84m8Y3mSEzJzTVolko3J7Qve+a0J3vntDWffdEaMUQQo1vTWjuuyA0UWvUUarqzuqLUMPt1MD3uKTaTdRwvdrdorpFtfZtH6eyK2F3RS23U3uhlr9VB1TdE1V2h7Vr1O4mdbdera6o+Wq1Vqi2rEktFapGoZopVLVCtVCXag19IBPUiiWpBrojE1QNXZAp1/TYbhKdKVwuWotORKfn9wu/DSc/X9T6qgAAAABJRU5ErkJggg==\"","<template>\n <div class=\"ecan-border\" :style=\"style\" @click=\"click\">\n <div\n class=\"no-title\"\n :style=\"borderStyle\"\n v-if=\"mode === 'no-title'\"\n >\n <template v-if=\"useBorderModify\">\n <div class=\"top-left border-item\"/>\n <div class=\"top-right border-item\"/>\n <div class=\"bottom-left border-item\"/>\n <div class=\"bottom-right border-item\"/>\n </template>\n </div>\n <div class=\"top-title\" :style=\"borderStyle\" v-if=\"mode === 'top-title'\">\n <div class=\"title-item-wrapper\">\n <div class=\"title-item\">\n <img\n class=\"title-decoration-left\"\n src=\"../../assets/border-title-decoration-left.png\"\n >\n <div class=\"title\">{{ title }}</div>\n <img\n class=\"title-decoration-right\"\n src=\"../../assets/border-title-decoration-right.png\"\n >\n </div>\n </div>\n <div class=\"top-left border-item\"/>\n <div class=\"top-right border-item\"/>\n <div class=\"bottom-left border-item\"/>\n <div class=\"bottom-right border-item\"/>\n </div>\n <div class=\"left-title\" v-if=\"mode === 'left-title'\">\n <div class=\"title\">\n <span>{{ title }}</span>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, watch } from 'vue'\nimport { borderComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle } from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanBorder',\n props: {\n ...borderComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props, ['background'])\n const { theme } = inject(GLOBAL_CONFIG, {\n theme: 'light'\n })\n const borderStyle = computed(() => {\n return {\n // borderWidth: props.borderWidth,\n // borderStyle: props.borderStyle,\n // borderRadius: props.borderRadius,\n // borderColor: props.borderColor,\n // backgroundColor: props.backgroundColor,\n width: '100%',\n height: '100%'\n }\n })\n const emitEvent = useEmitEvent(props)\n const click = emitEvent('click', () => {})\n const myData = ref<{ [key:string]: any } []>([])\n watch(() => props.data, (data: { [key:string]: any } []) => {\n myData.value = data\n }, {\n immediate: true,\n deep: true\n })\n useOnEvent(props, {\n click\n })\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myData\n })\n return {\n style,\n click,\n borderStyle,\n theme\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.top-title, .no-title {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n .border-item {\n position: absolute;\n z-index: 2;\n border-color: #50FCFC;\n border-style: solid;\n width: 13px;\n height: 11px;\n }\n .top-left {\n top: 0;\n left: 0;\n border-top-width: 1px;\n border-right-width: 0;\n border-bottom-width: 0;\n border-left-width: 1px;\n }\n .top-right {\n top: 0;\n right: -2px;\n border-top-width: 1px;\n border-right-width: 1px;\n border-bottom-width: 0;\n border-left-width: 0;\n }\n .bottom-left {\n bottom: -2px;\n left: 0;\n border-top-width: 0;\n border-right-width: 0;\n border-bottom-width: 1px;\n border-left-width: 1px;\n }\n .bottom-right {\n bottom: -2px;\n right: -2px;\n border-top-width: 0;\n border-right-width: 1px;\n border-bottom-width: 1px;\n border-left-width: 0;\n }\n .title-item-wrapper {\n width: 100%;\n padding: 5px 0;\n background-image: url(\"../../assets/border-title-background.png\");\n background-size: cover;\n display: grid;\n place-content: center;\n }\n .title-item {\n display: flex;\n align-items: center;\n }\n .title {\n padding: 0 17px;\n color: #d5fdfd;\n background: linear-gradient(0deg,#01aaff,#00eaff);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n .title-decoration-left {\n width: 58px;\n height: 14px;\n }\n .title-decoration-right {\n width: 58px;\n height: 14px;\n }\n}\n\n.left-title {\n position: relative;\n width: 100%;\n height: 100%;\n border: 2px solid #375A8899;\n border-radius: 0;\n .title {\n position: absolute;\n left: -33px;\n top: -14px;\n width: 33px;\n min-height: 194px;\n padding-top: 33px;\n padding-bottom: 31px;\n background-image: url(\"../../assets/border-left-title.png\");\n background-repeat: no-repeat;\n background-size: 100% 100%;\n color: #fff;\n font-weight: 500;\n text-align: center;\n span {\n writing-mode: vertical-lr;\n }\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Border from './Border.vue'\nexport const EcanBorder = withInstall(Border)\nexport default EcanBorder\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface TabsProps extends Props {\n data: { [key:string]: any } []\n backgroundColor: string\n tabFontSize: string\n tabColor: string\n activeTabColor: string\n tabBackgroundImage: string\n tabBarGutter: string\n activeTabBackgroundImage\n value: string\n activeKey: number\n tabHorizontalPadding: string\n autoSwitch: boolean\n autoSwitchInterval: number\n // 包含组件id\n contains: string []\n tabFontWeight: number\n tabAlignItems: 'flex-start' | 'center' | 'flex-end'\n tabJustifyContent: 'flex-start' | 'center' | 'flex-end',\n tabFlexDirection: 'row' | 'column'\n}\n\nexport const tabsProps: TabsProps = {\n ...props,\n tabHorizontalPadding: '0px',\n type: 'ecanTabs',\n name: '标签页',\n keyName: '标签页',\n width: '500px',\n height: '400px',\n tabFontSize: '14px',\n backgroundColor: '#ffffff',\n activeTabColor: '#1890ff',\n tabBackgroundImage: '',\n activeTabBackgroundImage: '',\n tabColor: '#333',\n tabBarGutter: '24px',\n tabFontWeight: 400,\n value: '',\n activeKey: 0,\n autoSwitch: false,\n autoSwitchInterval: 5,\n contains: [],\n tabFlexDirection: 'row',\n data: [\n {\n title: '标签1'\n },\n {\n title: '标签2'\n },\n {\n title: '标签3'\n }\n ],\n tabAlignItems: 'flex-start',\n tabJustifyContent: 'flex-start'\n}\n\nexport const tabsComponentProps = transformToComponentProps(tabsProps)\n\nexport const tabsEvents = ['tabChange']\n","<template>\n <div class=\"ecan-tabs\" :style=\"style\">\n <div\n class=\"tabs-header\"\n :style=\"{\n fontSize: tabFontSize,\n alignItems: tabAlignItems,\n justifyContent: tabJustifyContent,\n flexDirection: tabFlexDirection\n }\"\n >\n <div\n class=\"tab\"\n :style=\"{\n padding: `5px ${tabHorizontalPadding}`,\n color: isActive(index) ? activeTabColor : tabColor,\n backgroundImage: isActive(index) ? useImagePath(activeTabBackgroundImage, true) : useImagePath(tabBackgroundImage, true),\n marginRight: tabFlexDirection === 'row' ? tabBarGutter : null,\n marginBottom: tabFlexDirection === 'column' ? tabBarGutter : null,\n fontWeight: tabFontWeight\n }\"\n v-for=\"(tab, index) in myData\"\n :key=\"index\"\n @click.prevent.stop=\"tabChange(tab, index)\"\n >\n <div\n class=\"tab-inner\"\n :style=\"{\n borderBottom: !activeTabBackgroundImage && !tabBackgroundImage ? `1px solid ${isActive(index) ? activeTabColor : 'transparent'}` : ''\n }\"\n >\n {{tab.title}}\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, onBeforeUnmount, onMounted, ref, unref, watch } from 'vue'\nimport { tabsComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useImagePath } from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REFRESH_PAGE } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanTabs',\n props: {\n ...tabsComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const activeKey = ref(0)\n watch(() => props.activeKey, (key) => {\n activeKey.value = key\n }, {\n immediate: true\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n let timer: ReturnType<typeof setInterval> = null\n const setAutoSwitch = () => {\n const maxKey = Array.isArray(unref(myData)) ? unref(myData).length - 1 : 0\n if (props.autoSwitch && maxKey > 0) {\n timer = setInterval(() => {\n const changeKey = unref(activeKey) + 1\n if (changeKey <= maxKey) {\n activeKey.value = changeKey\n } else {\n activeKey.value = 0\n }\n myValue.value = unref(myData)[unref(activeKey)]\n emitRefreshPage()\n }, props.autoSwitchInterval * 1000)\n }\n }\n onMounted(() => {\n if (unref(pageMode) !== 'design') {\n setAutoSwitch()\n }\n })\n onBeforeUnmount(() => {\n clearInterval(timer)\n })\n const myData = ref<{ [key:string]: any } []>([])\n const myValue = ref({})\n watch(() => props.data, (data: { [key:string]: any } []) => {\n myData.value = data\n myValue.value = Array.isArray(data) && data.length > 0 ? data[0] : {}\n }, {\n immediate: true,\n deep: true\n })\n const isActive = (index: number) => activeKey.value === index\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n value: myValue,\n activeKey\n })\n\n const { emitRefreshPage } = inject(REFRESH_PAGE, {\n // eslint-disable-next-line no-void\n emitRefreshPage: () => void 0\n })\n\n const tabChange = emitEvent('tabChange', (tab:{ [key:string]:any }, index: number) => {\n if (index !== unref(activeKey)) {\n myValue.value = tab\n activeKey.value = index\n emitRefreshPage()\n }\n })\n useOnEvent(props, {\n tabChange\n })\n return {\n style,\n activeKey,\n isActive,\n tabChange,\n myData,\n useImagePath\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-tabs {\n display: flex;\n}\n\n.tabs-header {\n width: 100%;\n color: #333333;\n display: flex;\n padding: 0 10px;\n}\n\n.tab {\n background-size: 100% 100%;\n background-repeat: no-repeat;\n cursor: default;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.tab:last-child {\n margin-bottom: 0 !important;\n margin-right: 0 !important;\n}\n\n.tabs-content {\n flex:1;\n}\n</style>\n","<template>\n <div class=\"ecan-tabs\" :style=\"style\">\n <div\n class=\"tabs-header\"\n :style=\"{\n fontSize: tabFontSize,\n alignItems: tabAlignItems,\n justifyContent: tabJustifyContent,\n flexDirection: tabFlexDirection\n }\"\n >\n <div\n class=\"tab\"\n :style=\"{\n padding: `5px ${tabHorizontalPadding}`,\n color: isActive(index) ? activeTabColor : tabColor,\n backgroundImage: isActive(index) ? useImagePath(activeTabBackgroundImage, true) : useImagePath(tabBackgroundImage, true),\n marginRight: tabFlexDirection === 'row' ? tabBarGutter : null,\n marginBottom: tabFlexDirection === 'column' ? tabBarGutter : null,\n fontWeight: tabFontWeight\n }\"\n v-for=\"(tab, index) in myData\"\n :key=\"index\"\n @click.prevent.stop=\"tabChange(tab, index)\"\n >\n <div\n class=\"tab-inner\"\n :style=\"{\n borderBottom: !activeTabBackgroundImage && !tabBackgroundImage ? `1px solid ${isActive(index) ? activeTabColor : 'transparent'}` : ''\n }\"\n >\n {{tab.title}}\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, onBeforeUnmount, onMounted, ref, unref, watch } from 'vue'\nimport { tabsComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useImagePath } from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REFRESH_PAGE } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanTabs',\n props: {\n ...tabsComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const activeKey = ref(0)\n watch(() => props.activeKey, (key) => {\n activeKey.value = key\n }, {\n immediate: true\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n let timer: ReturnType<typeof setInterval> = null\n const setAutoSwitch = () => {\n const maxKey = Array.isArray(unref(myData)) ? unref(myData).length - 1 : 0\n if (props.autoSwitch && maxKey > 0) {\n timer = setInterval(() => {\n const changeKey = unref(activeKey) + 1\n if (changeKey <= maxKey) {\n activeKey.value = changeKey\n } else {\n activeKey.value = 0\n }\n myValue.value = unref(myData)[unref(activeKey)]\n emitRefreshPage()\n }, props.autoSwitchInterval * 1000)\n }\n }\n onMounted(() => {\n if (unref(pageMode) !== 'design') {\n setAutoSwitch()\n }\n })\n onBeforeUnmount(() => {\n clearInterval(timer)\n })\n const myData = ref<{ [key:string]: any } []>([])\n const myValue = ref({})\n watch(() => props.data, (data: { [key:string]: any } []) => {\n myData.value = data\n myValue.value = Array.isArray(data) && data.length > 0 ? data[0] : {}\n }, {\n immediate: true,\n deep: true\n })\n const isActive = (index: number) => activeKey.value === index\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n value: myValue,\n activeKey\n })\n\n const { emitRefreshPage } = inject(REFRESH_PAGE, {\n // eslint-disable-next-line no-void\n emitRefreshPage: () => void 0\n })\n\n const tabChange = emitEvent('tabChange', (tab:{ [key:string]:any }, index: number) => {\n if (index !== unref(activeKey)) {\n myValue.value = tab\n activeKey.value = index\n emitRefreshPage()\n }\n })\n useOnEvent(props, {\n tabChange\n })\n return {\n style,\n activeKey,\n isActive,\n tabChange,\n myData,\n useImagePath\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-tabs {\n display: flex;\n}\n\n.tabs-header {\n width: 100%;\n color: #333333;\n display: flex;\n padding: 0 10px;\n}\n\n.tab {\n background-size: 100% 100%;\n background-repeat: no-repeat;\n cursor: default;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.tab:last-child {\n margin-bottom: 0 !important;\n margin-right: 0 !important;\n}\n\n.tabs-content {\n flex:1;\n}\n</style>\n","import Tabs from './Tabs.vue'\nimport { withInstall } from '../../utils/withInstall'\nexport const EcanTabs = withInstall(Tabs)\nexport default EcanTabs\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface ImageProps extends Props {\n imgUrl: string\n href: string\n target: 'self' | 'blank' | 'event' // 打开方式\n linkPage: string // 传入pageId\n}\n\nexport const imageProps: ImageProps = {\n ...props,\n name: '图片',\n keyName: '图片',\n type: 'ecanImage',\n width: '300px',\n height: '300px',\n imgUrl: '',\n target: 'self',\n href: '',\n linkPage: ''\n}\n\nexport const imageComponentProps = transformToComponentProps(imageProps)\n","<template>\n <img\n :style=\"style\"\n :src=\"myImgUrl\"\n v-if=\"myImgUrl !== ''\"\n @click=\"onClick\"\n />\n <div\n class=\"image-placeholder\"\n :style=\"style\"\n v-else\n >\n 请上传图片\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, unref } from 'vue'\nimport { imageComponentProps } from './props'\nimport { useImagePath, usePickComponentStyle, usePageUrl, useVariablesInText } from '@/hooks'\nimport { GLOBAL_CONFIG } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanImage',\n props: {\n ...imageComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myImgUrl = computed(() => useImagePath(props.imgUrl))\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const onClick = () => {\n // 空链接、空页面直接 return\n if (!props.linkPage && !props.href) return\n const linkPage = props.linkPage || ''\n const pageUrl = usePageUrl(unref(pageMode), linkPage)\n // 优先使用外部链接,再使用url\n const href = props.href\n let url = href || pageUrl\n url = useVariablesInText(url)\n const target = props.target\n if (!target) return\n if (target !== 'event') {\n window.open(url, '_' + target)\n } else {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n }\n return {\n style,\n myImgUrl,\n onClick\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.image-placeholder {\n display: grid;\n place-content: center;\n border: 1px solid #d9d9d9;\n font-size: 16px;\n color: #333;\n width: 100%;\n overflow: hidden;\n}\n</style>\n","<template>\n <img\n :style=\"style\"\n :src=\"myImgUrl\"\n v-if=\"myImgUrl !== ''\"\n @click=\"onClick\"\n />\n <div\n class=\"image-placeholder\"\n :style=\"style\"\n v-else\n >\n 请上传图片\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, unref } from 'vue'\nimport { imageComponentProps } from './props'\nimport { useImagePath, usePickComponentStyle, usePageUrl, useVariablesInText } from '@/hooks'\nimport { GLOBAL_CONFIG } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanImage',\n props: {\n ...imageComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myImgUrl = computed(() => useImagePath(props.imgUrl))\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const onClick = () => {\n // 空链接、空页面直接 return\n if (!props.linkPage && !props.href) return\n const linkPage = props.linkPage || ''\n const pageUrl = usePageUrl(unref(pageMode), linkPage)\n // 优先使用外部链接,再使用url\n const href = props.href\n let url = href || pageUrl\n url = useVariablesInText(url)\n const target = props.target\n if (!target) return\n if (target !== 'event') {\n window.open(url, '_' + target)\n } else {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n }\n return {\n style,\n myImgUrl,\n onClick\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.image-placeholder {\n display: grid;\n place-content: center;\n border: 1px solid #d9d9d9;\n font-size: 16px;\n color: #333;\n width: 100%;\n overflow: hidden;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Image from './Image.vue'\nexport const EcanImage = withInstall(Image)\nexport default EcanImage\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface IframeProps extends Props {\n link: string,\n linkType: 'web' | 'erd'\n}\n\nexport const iframeProps: IframeProps = {\n ...props,\n name: '网页',\n keyName: '网页',\n type: 'ecanIframe',\n width: '300px',\n height: '300px',\n link: '',\n linkType: 'web'\n}\n\nexport const iframeComponentProps = transformToComponentProps(iframeProps)\n","<template>\n <iframe\n :src=\"myLink\"\n :style=\"style\"\n v-if=\"myLink\"\n />\n <div\n class=\"iframe-placeholder\"\n :style=\"style\"\n v-else\n >\n 请填写网页链接\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, inject, unref } from 'vue'\nimport { usePickComponentStyle, useVariablesInText } from '@/hooks'\nimport { iframeComponentProps } from '@/media/iframe/props'\nimport { GLOBAL_CONFIG, ERD_URL } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanIframe',\n props: {\n ...iframeComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const { contextRequestUrl } = inject(GLOBAL_CONFIG, {\n contextRequestUrl: ''\n })\n const myLink = computed(() => {\n let link = useVariablesInText(props.link)\n if (props.linkType === 'erd' && link != null) {\n let ctxErdUrl = unref(contextRequestUrl)\n if (ctxErdUrl[ctxErdUrl.length - 1] === '/') {\n ctxErdUrl += 'erdReport'\n } else {\n ctxErdUrl += '/erdReport'\n }\n const erdUrl = ERD_URL || ctxErdUrl\n link = `${erdUrl}?_t=0&uid=${link}`\n }\n return link\n })\n return {\n style,\n myLink\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.iframe-placeholder {\n display: grid;\n place-content: center;\n border: 1px solid #d9d9d9;\n font-size: 16px;\n color: #333;\n width: 100%;\n overflow: hidden;\n}\n</style>\n","<template>\n <iframe\n :src=\"myLink\"\n :style=\"style\"\n v-if=\"myLink\"\n />\n <div\n class=\"iframe-placeholder\"\n :style=\"style\"\n v-else\n >\n 请填写网页链接\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, inject, unref } from 'vue'\nimport { usePickComponentStyle, useVariablesInText } from '@/hooks'\nimport { iframeComponentProps } from '@/media/iframe/props'\nimport { GLOBAL_CONFIG, ERD_URL } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanIframe',\n props: {\n ...iframeComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const { contextRequestUrl } = inject(GLOBAL_CONFIG, {\n contextRequestUrl: ''\n })\n const myLink = computed(() => {\n let link = useVariablesInText(props.link)\n if (props.linkType === 'erd' && link != null) {\n let ctxErdUrl = unref(contextRequestUrl)\n if (ctxErdUrl[ctxErdUrl.length - 1] === '/') {\n ctxErdUrl += 'erdReport'\n } else {\n ctxErdUrl += '/erdReport'\n }\n const erdUrl = ERD_URL || ctxErdUrl\n link = `${erdUrl}?_t=0&uid=${link}`\n }\n return link\n })\n return {\n style,\n myLink\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.iframe-placeholder {\n display: grid;\n place-content: center;\n border: 1px solid #d9d9d9;\n font-size: 16px;\n color: #333;\n width: 100%;\n overflow: hidden;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Iframe from './Iframe.vue'\nexport const EcanIframe = withInstall(Iframe)\nexport default EcanIframe\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface TableProps extends Props {\n columns: { [key: string]: any } []\n data: { [key: string]: any } []\n bordered: boolean\n size: 'default' | 'middle' | 'small'\n isUseSeq: boolean\n columnsFixedNum: number\n scrollX: number\n paginationShow: boolean\n paginationPosition: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight'\n simple: boolean\n cellBackgroundColor: string\n borderColor: string\n paginationPageSize: number\n isUseAction: boolean // 添加操作列\n isUseExport: boolean // 导出数据\n actionColumnWidth: number\n actionList: { [key: string]: any } []\n headerFontSize: string\n headerFontWeight: number\n fontSize: string\n fontWeight: number\n isReverse: boolean\n clickHighlight: boolean\n filterDropdownHeight: string\n graphicConfig: { [key:string]: any }\n}\n\nexport const tableProps: TableProps = {\n ...props,\n zIndex: 2,\n name: '表格',\n keyName: '表格',\n type: 'ecanTable',\n width: '400px',\n height: '240px',\n bordered: false,\n headerFontSize: '14px',\n fontSize: '14px',\n isUseSeq: false,\n size: 'default',\n headerFontWeight: 400,\n isUseExport: false,\n fontWeight: 400,\n columnsFixedNum: 0,\n scrollX: 0,\n paginationShow: true,\n isReverse: false,\n simple: false,\n cellBackgroundColor: '',\n borderColor: '',\n paginationPosition: 'bottomRight',\n paginationPageSize: 10,\n isUseAction: false,\n clickHighlight: false,\n filterDropdownHeight: '200px',\n actionList: [{\n title: '',\n href: '',\n target: '',\n color: ''\n }],\n actionColumnWidth: 100,\n columns: [\n {\n title: '姓名',\n dataIndex: 'name'\n },\n {\n title: '年龄',\n dataIndex: 'age'\n },\n {\n title: '住址',\n dataIndex: 'address'\n }\n ],\n data: [\n {\n name: '小明',\n age: 32,\n address: '福州软件园'\n },\n {\n name: '小红',\n age: 25,\n address: '福州软件园'\n }\n ],\n graphicConfig: {}\n}\n\n// 转化默认属性\nexport const tableComponentProps = transformToComponentProps(tableProps)\n\nexport const tableEvents = ['click', 'refreshData', 'resetRecord', 'exportTableData']\n","<template>\n <div class=\"ecan-table\" :style=\"style\">\n <skeleton :loading=\"loading\">\n <div class=\"table-tool\" v-if=\"isUseExport\">\n <a-button class=\"export-button\" @click=\"exportTableData\">导出数据</a-button>\n </div>\n <a-table\n class=\"table\"\n :style=\"{\n height: '100%'\n }\"\n :columns=\"tableColumns\"\n :data-source=\"tableDataSource\"\n :bordered=\"bordered\"\n :size=\"size\"\n :customRow=\"customRow\"\n :scroll=\"{ x, y }\"\n :pagination=\"pagination\"\n @change=\"tableChange\"\n >\n <template #customFilterDropdown=\"{ column, selectedKeys, setSelectedKeys, confirm, clearFilters }\">\n <div\n class=\"ecan-table-filter\"\n :style=\"{\n height: filterDropdownHeight\n }\"\n >\n <a-input\n v-model:value=\"column.filterOptionsInputValue\"\n placeholder=\"请输入关键字\"\n :value=\"selectedKeys[0]\"\n class=\"filter-input\"\n @change=\"onSearchFilterOptions\"\n />\n <a-checkbox-group\n v-model:value=\"column.filterCheckboxGroupValue\"\n class=\"filter-checkbox\"\n :options=\"useFilterOptions(column)\"\n @change=\"useSetSelectedKeys(setSelectedKeys, column)\"\n >\n </a-checkbox-group>\n <div>\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"width: 90px; margin-right: 8px\"\n @click=\"() => confirm()\"\n >\n 搜索\n </a-button>\n <a-button\n size=\"small\"\n style=\"width: 90px\"\n @click.stop=\"onResetFilter(clearFilters, column)\"\n >\n 重置\n </a-button>\n </div>\n </div>\n </template>\n <template #bodyCell=\"{ column, index, text, record }\">\n <!--序号-->\n <template v-if=\"column.dataIndex === 'SEQ'\">\n <span>{{ index + 1 }}</span>\n </template>\n <!-- 操作列配置 -->\n <template v-else-if=\"column.dataIndex === 'ACTION'\">\n <div class=\"action-list\">\n <div class=\"action\" v-for=\"(action, index) in actionList\" :key=\"index\">\n <a\n :href=\"handleHref(action.href, record)\"\n :target=\"handleHrefTarget(action.target)\"\n :style=\"{\n color: action.color,\n fontSize,\n fontWeight\n }\"\n @click=\"onTouchHrefEvent(action.target, handleHref(action.href, record))\"\n >\n {{ action.title }}\n </a>\n </div>\n </div>\n </template>\n <!--进度条-->\n <template v-else-if=\"column.format === 'progress'\">\n <div class=\"progress-cell\">\n <div\n class=\"progress\"\n :style=\"{\n background: column.progressColor || '#1890ff',\n height: column.progressWidth || '18px',\n width: `${handleProgressText(text, column.progressTextDecimalPlaces)}%`\n }\"\n />\n <div\n class=\"progress-text\"\n :style=\"{\n color: handleProgressText(text) < 100 ? column.progressTextColor || '#333' : column.progressFinishedTextColor || '#fff'\n }\"\n >\n {{handleProgressText(text, column.progressTextDecimalPlaces)}}%\n </div>\n </div>\n </template>\n <template v-else>\n <div\n :class=\"[contrastClass(text, column.format)]\"\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ column.format != null ? formatFn(text, column.format) : text }}\n </div>\n </template>\n </template>\n <template #summary>\n <a-table-summary v-if=\"summaryList.length > 0\">\n <a-table-summary-row>\n <a-table-summary-cell\n v-for=\"(summary, index) in summaryList\"\n :key=\"index\"\n :index=\"index\"\n :style=\"{\n backgroundColor: cellBackgroundColor,\n textAlign: summary.cellAlign || 'center',\n color: summary.cellColor,\n borderBottomColor: borderColor,\n }\"\n >\n <div\n :class=\"[contrastClass(summary.total, summary.format)]\"\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ (summary.format != null || summary.format !== '') && formatFn(summary.total, summary.format) }}\n </div>\n </a-table-summary-cell>\n </a-table-summary-row>\n </a-table-summary>\n </template>\n </a-table>\n </skeleton>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, unref, ref, watch, inject, reactive } from 'vue'\nimport {\n Button as AButton,\n Input as AInput,\n CheckboxGroup as ACheckboxGroup,\n Table as ATable,\n TableSummary as ATableSummary,\n TableSummaryRow as ATableSummaryRow,\n TableSummaryCell as ATableSummaryCell,\n message\n} from 'ant-design-vue'\nimport 'ant-design-vue/es/input/style'\nimport 'ant-design-vue/es/checkbox/style'\nimport 'ant-design-vue/es/table/style'\nimport 'ant-design-vue/es/progress/style'\nimport { utils, writeFile } from 'xlsx'\nimport {\n usePickComponentStyle,\n useEmitEvent,\n useRequestData,\n useOnEvent,\n useIndicatorData,\n useVariablesInText\n} from '@/hooks'\nimport { tableComponentProps } from './props'\nimport { formatMoney, formatPercentage } from '@/utils/util'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '@/common/skeleton/Skeleton.vue'\nimport { cloneDeep, pick } from 'lodash-es'\nimport { RequestModalParam } from '@/utils/types'\nimport { Big } from 'big.js'\nexport default defineComponent({\n name: 'EcanTable',\n components: {\n Skeleton,\n AButton,\n AInput,\n ACheckboxGroup,\n ATable,\n ATableSummary,\n ATableSummaryRow,\n ATableSummaryCell\n },\n props: {\n ...tableComponentProps\n },\n setup (props, { expose }) {\n const style = usePickComponentStyle(props)\n const splitY = computed(() => {\n if (props.paginationShow) {\n switch (props.size) {\n case 'small':\n return 90\n case 'middle':\n return 100\n default:\n return 120\n }\n } else {\n switch (props.size) {\n case 'small':\n return 40\n case 'middle':\n return 47\n default:\n return 55\n }\n }\n })\n const x = computed(() => props.scrollX)\n const y = computed(() => parseFloat(props.height as string) - unref(splitY))\n const myColumns = ref<{ [key: string]: any } []>([])\n const myDataSource = ref<{ [key: string]: any } []>([])\n const tableColumns = ref<{ [key: string]: any } []>([])\n const tableDataSource = ref<{ [key: string]: any } []>([])\n const total = ref(0)\n const pageNum = ref(1)\n const pageSize = computed(() => props.paginationPageSize as number)\n const filterDataIndexList = reactive([])\n const handleChildrenColumns = (_columns: { [key: string]: any } [] = []) => {\n if (Array.isArray(_columns) && _columns.length > 0) {\n const len = _columns.length\n const columnsFixedNum = props.columnsFixedNum as number\n // 这里的循环为了 props 是引用类型,会造成脏数据(上次修改后,还会存在上次的数据)\n // 如果使用深拷贝会造成性能的浪费,循环来说相对更快\n for (let i = 0; i < len; i++) {\n const column = _columns[i]\n if (i < columnsFixedNum) {\n column.fixed = 'left'\n } else {\n column.fixed = false\n }\n const {\n cellAlign = 'center',\n cellColor,\n dataIndex,\n title,\n tableFilter,\n headerCellAlign,\n headerCellColor\n } = column\n if (tableFilter) {\n filterDataIndexList.push(dataIndex)\n column.filterOptionsInputValue = ''\n column.filterCheckboxGroupValue = []\n column.customFilterDropdown = true\n column.onFilter = (value, record) => record[dataIndex].toString().toLowerCase().includes(value.toLowerCase())\n }\n // 通用配置\n // 头部单元格\n column.customHeaderCell = () => ({\n style: {\n display: 'table-cell',\n verticalAlign: 'middle',\n fontSize: props.headerFontSize,\n fontWeight: props.headerFontWeight,\n textAlign: headerCellAlign || 'center',\n color: headerCellColor,\n borderBottomColor: props.borderColor\n }\n })\n // 表格单元格\n column.customCell = (record, rowIndex) => ({\n style: {\n textAlign: cellAlign,\n color: cellColor,\n backgroundColor: props.cellBackgroundColor,\n borderBottomColor: props.borderColor\n },\n class: {\n highlight: unref(useRowIndex) === rowIndex && props.clickHighlight\n },\n onClick: emitEvent('click', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n record = {\n dataIndex,\n title,\n ...record\n }\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: record })\n })\n })\n if (Array.isArray(column.children)) {\n handleChildrenColumns(column.children)\n }\n }\n }\n }\n const handleColumns = (columns: { [key: string]: any } [] = []) => {\n // 复制表头数据\n if (props.isUseSeq) {\n // 添加序号\n columns.unshift({\n title: '序号',\n dataIndex: 'SEQ',\n align: 'center'\n })\n }\n // 添加操作列\n if (props.isUseAction) {\n columns.push({\n title: '操作',\n dataIndex: 'ACTION',\n width: props.actionColumnWidth\n })\n }\n handleChildrenColumns(columns)\n return columns\n }\n watch(() => [\n props.columns,\n props.isUseSeq,\n props.isUseAction,\n props.columnsFixedNum,\n props.actionColumnWidth,\n props.cellBackgroundColor,\n props.borderColor\n ], () => {\n myColumns.value = handleColumns(cloneDeep(props.columns as any []))\n }, {\n immediate: true,\n deep: true\n })\n watch(() => [props.data, props.dataType], ([data, dataType]) => {\n if (dataType !== 'static') return\n myDataSource.value = data as { [key:string]:any } []\n }, {\n immediate: true\n })\n const allFilterOptions = ref({})\n const handleFilterCheckboxOptions = (dataSource: { [key:string]: any } []) => {\n if (Array.isArray(dataSource)) {\n const dataLen = dataSource.length\n const keys = filterDataIndexList\n const keysLen = keys.length\n const filterOptionsMap: { [key:string]: Set<string> } = {}\n for (let i = 0; i < dataLen; i++) {\n const record = dataSource[i]\n for (let j = 0; j < keysLen; j++) {\n const key = keys[j]\n if (filterOptionsMap[key]) {\n filterOptionsMap[key].add(record[key])\n } else {\n const set = new Set<string>()\n set.add(record[key])\n filterOptionsMap[key] = set\n }\n }\n }\n const _allFilterOptions: { [key:string]: { label:string, value: string } [] } = {}\n for (const key in filterOptionsMap) {\n if (Object.prototype.hasOwnProperty.call(filterOptionsMap, key)) {\n const optionsSet = filterOptionsMap[key]\n const options = Array.from(optionsSet)\n _allFilterOptions[key] = options.map((option) => ({ label: option, value: option }))\n }\n }\n allFilterOptions.value = _allFilterOptions\n }\n }\n watch(() => [props.isReverse, myColumns.value, myDataSource.value], () => {\n const _columns = unref(myColumns)\n const _dataSource = unref(myDataSource)\n handleFilterCheckboxOptions(_dataSource)\n if (props.isReverse) {\n const { columns, dataSource } = handleReverseTable(cloneDeep(_columns), cloneDeep(_dataSource))\n tableColumns.value = columns\n tableDataSource.value = dataSource\n } else {\n tableColumns.value = _columns\n tableDataSource.value = _dataSource\n }\n }, {\n immediate: true\n })\n const handleReverseTable = (columns: { [key:string]: any} [], dataSource: { [key:string]: any} []) => {\n const firstColumns = columns[0]\n const _columns = [{\n title: firstColumns.title,\n dataIndex: 'col0',\n key: 'col0',\n align: 'center'\n }] as { [key:string]: any } []\n for (let i = 0; i < dataSource.length; i++) {\n const data = dataSource[i]\n const dataIndex = 'col' + (i + 1)\n _columns.push({\n title: data[firstColumns.dataIndex],\n dataIndex,\n key: dataIndex,\n align: 'center'\n })\n }\n const _dataSource = [] as { [key:string]: any } []\n for (let i = 1; i < columns.length; i++) {\n const column = columns[i]\n const _data = { col0: column.title }\n for (let j = 0; j < dataSource.length; j++) {\n const data = dataSource[j]\n _data[`col${j + 1}`] = data[column.dataIndex]\n }\n _dataSource.push(_data)\n }\n return {\n columns: _columns,\n dataSource: _dataSource\n }\n }\n const orderCondition = ref<string>('')\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async (isUseLoading: boolean = true, params: { [key:string]: any } = {}) => {\n try {\n if (isUseLoading) loading.value = true\n // 初始参数:排序\n if (unref(orderCondition)) {\n params.orderCondition = unref(orderCondition)\n }\n // 分页\n if (props.paginationShow) {\n params = {\n pageNum: unref(pageNum),\n pageSize: unref(pageSize),\n layer: '1',\n ...params\n }\n }\n const res = await requestData(params)\n const { rows = [], total: tableTotal = 0 } = res?.data?.data || {}\n total.value = tableTotal\n if (Array.isArray(rows)) {\n myDataSource.value = rows\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const tableChange = ({ current }: { current: number }, _filters, sorter) => {\n pageNum.value = current\n if (sorter && Object.keys(sorter).length > 0) {\n const { field, order } = sorter as { field: string | null, order: 'ascend' | 'descend' }\n const map = {\n ascend: 'asc',\n descend: 'desc'\n }\n const fieldOrder = map[order]\n if (field != null && fieldOrder != null) {\n orderCondition.value = field + ' ' + fieldOrder\n pageNum.value = 1\n }\n }\n refreshData(false)\n }\n const pagination = computed(() => {\n const simple = props.simple\n const position = [props.paginationPosition]\n return props.paginationShow && {\n simple,\n position,\n total: unref(total),\n current: unref(pageNum),\n pageSize: unref(pageSize),\n showSizeChanger: false\n }\n })\n const formatBoolean = (value: string | number) => {\n if (+value === 1) return '是'\n if (+value === 0) return '否'\n return value\n }\n type Format = 'money' | 'percentage' | 'contrast' | 'boolean' | 'progress' | ''\n const formatFn = (value: string | number, format?: Format) => {\n if (format == null || format === '') return value\n const map = {\n money: formatMoney,\n percentage: formatPercentage,\n contrast: formatPercentage,\n boolean: formatBoolean\n }\n return map[format](value) || ''\n }\n const contrastClass = (value: string | number, format: Format) => {\n const _value = parseFloat(value + '')\n if (format !== 'contrast') {\n return ''\n }\n switch (true) {\n case _value >= 0:\n return 'goUp'\n case _value < 0:\n return 'goDown'\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const handleIndicatorDataset = (dataColumns: any [] = [], dataRows: { [key:string]: any }[] = []) => {\n const _columns = dataColumns.map((column: string) => ({ title: column, dataIndex: column, key: column }))\n myColumns.value = handleColumns(_columns)\n myDataSource.value = dataRows\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n handleIndicatorDataset(res?.data?.data?.columns, res?.data?.data?.rows)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const useRowIndex = ref(-1)\n\n const customRow = (record, index) => ({\n onClick: emitEvent('rowClick', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: record })\n useRowIndex.value = index\n })\n })\n\n const refreshData = (isUseLoading: boolean = true) => {\n switch (props.dataType) {\n case 'request':\n handleRequestData(isUseLoading)\n break\n case 'indicator':\n handleIndicatorData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n const summaryList = computed(() => {\n const columns = unref(tableColumns)\n const summaryList = [] as { [key: string]: any } []\n let calcTotalCount = 0\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]\n const { isCalcTotal } = column\n if (props.isUseSeq && i === 0) {\n summaryList.push({\n ...column,\n total: '小计'\n })\n } else if (isCalcTotal) {\n summaryList.push({\n ...column,\n index: i,\n total: 0\n })\n calcTotalCount++\n } else {\n summaryList.push({\n ...column\n })\n }\n }\n // 为空直接返回\n if (calcTotalCount === 0) return []\n const records = unref(tableDataSource)\n for (let i = 0; i < summaryList.length; i++) {\n const summary = summaryList[i]\n let total: number = 0\n const { isCalcTotal, dataIndex } = summary\n if (isCalcTotal === true) {\n for (let j = 0; j < records.length; j++) {\n const record = records[j]\n const num = +record[dataIndex]\n if (!isNaN(num)) {\n total = new Big(total).add(num).toNumber()\n }\n }\n summary.total = total\n }\n }\n return summaryList\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n expose({\n refreshData\n })\n\n const handleHref = (href: string = '', data: { [key:string]: any }) => {\n return useVariablesInText(href, data)\n }\n\n const handleHrefTarget = (target: 'self' | 'blank' | 'event') => {\n if (target === 'event') {\n return undefined\n } else {\n const map = {\n self: '_self',\n blank: '_blank'\n }\n return map[target]\n }\n }\n\n const onTouchHrefEvent = (target: 'self' | 'blank' | 'event', href: string = '') => {\n if (target === 'event') {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n }\n\n const useSetSelectedKeys = (setSelectedKeys, column) => {\n setSelectedKeys(column.filterCheckboxGroupValue)\n }\n\n const onResetFilter = (clearFilters, column) => {\n clearFilters({ confirm: true })\n column.filterOptionsInputValue = ''\n column.filterCheckboxGroupValue = []\n }\n const onSearchFilterOptions = () => {}\n const useFilterOptions = (column) => {\n const key = column.dataIndex\n if (typeof key === 'string') {\n let filterOptions = unref(allFilterOptions)[key]\n const _inputValue = unref(column.filterOptionsInputValue).trim()\n if (Array.isArray(filterOptions)) {\n filterOptions = filterOptions.filter((filterOption) => {\n if (typeof filterOption.label === 'string') {\n return filterOption.label.toLowerCase().includes(_inputValue.toLowerCase())\n }\n return true\n })\n return filterOptions\n }\n return []\n }\n return []\n }\n\n const exportTableData = async () => {\n const key = 'EXPORT_KEY'\n message.loading({\n key,\n content: '正在导出...',\n duration: 0\n })\n let rows = []\n if (props.dataType === 'static') {\n rows = props.data\n } else if (props.dataType === 'request') {\n const params = { layer: '1' } as { [key:string]:any }\n if (unref(orderCondition)) {\n params.orderCondition = unref(orderCondition)\n }\n const res = await requestData(params)\n rows = res?.data?.data?.rows || {}\n }\n const columns = unref(tableColumns)\n const columnKeys = []\n const columnValues = []\n columns?.forEach(column => {\n columnKeys.push(column.dataIndex)\n columnValues.push(column.title)\n })\n const data = rows.map(item => pick(item, columnKeys))\n // 导出excel\n const workBook = utils.book_new()\n const header = utils.aoa_to_sheet([columnValues])\n const sheet = utils.sheet_add_json(header, data, { skipHeader: true, origin: 'A2' })\n\n utils.book_append_sheet(workBook, sheet, 'sheet')\n\n writeFile(workBook, '表格数据.xlsx')\n message.success({ key, content: '导出成功' })\n }\n\n const handleProgressText = (text: string | number, decimalPlaces = 2) => {\n const num = (+text) * 100\n if (isNaN(num) || num <= 0) {\n return 0\n } else if (num >= 100) {\n return 100\n } else {\n return (num).toFixed(decimalPlaces)\n }\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n exportTableData\n })\n\n return {\n x,\n y,\n style,\n customRow,\n pagination,\n formatFn,\n contrastClass,\n tableChange,\n summaryList,\n loading,\n onTouchHrefEvent,\n handleHref,\n handleHrefTarget,\n useRowIndex,\n tableColumns,\n tableDataSource,\n useFilterOptions,\n useSetSelectedKeys,\n onResetFilter,\n onSearchFilterOptions,\n exportTableData,\n handleProgressText\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.table {\n width: 100%;\n}\n\n.table-tool {\n width: 100%;\n display: flex;\n justify-content: flex-end;\n}\n\n.export-button {\n margin-bottom: 8px;\n}\n\n.goUp {\n color: #FF512E;\n display: flex;\n align-items: center;\n justify-content: center;\n &:before {\n content: '';\n display: block;\n background-image: url(\"../../assets/go-up.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n}\n\n.goDown {\n color: #39cf93;\n display: flex;\n align-items: center;\n justify-content: center;\n &:before {\n content: '';\n display: block;\n background-image: url(\"../../assets/go-down.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n}\n\n.action-list {\n display: flex;\n width: 100%;\n}\n.action {\n flex: 1;\n}\n\n.filter-input {\n width: 188px;\n margin-bottom: 8px;\n display: block\n}\n\n.filter-checkbox {\n width: 188px;\n margin-bottom: 8px;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-table-filter {\n padding: 8px;\n display: flex;\n flex-direction: column;\n .ant-checkbox-group {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .ant-checkbox-wrapper {\n width: 100%;\n padding: 5px 0;\n font-size: 16px;\n &:hover {\n background-color: #f5f5f5;\n }\n .ant-checkbox + span {\n width: 100%;\n word-break: break-all;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical\n }\n }\n}\n\n.ecan-table {\n .highlight {\n background: #e6f7ff !important;\n }\n\n .progress-cell {\n width:100%;\n display: flex;\n align-items: center;\n .progress-text {\n position: absolute;\n right: 20px;\n }\n }\n\n *::-webkit-scrollbar {\n //width: 6px;\n //height: 6px;\n }\n\n *::-webkit-scrollbar-thumb {\n border-radius: 3px;\n -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);\n background-color: #c8c9ca !important;\n }\n\n *::-webkit-scrollbar-track {\n background-color: #fff;\n }\n\n .ant-table-cell-scrollbar {\n box-shadow: 0 1px 0 1px transparent;\n }\n\n .ant-table {\n color: rgba(0, 0, 0, .65);\n background: #ffffff;\n }\n\n .ant-table-thead > tr > th {\n color: rgba(0, 0, 0, .85);\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .ant-table-tbody > tr > td {\n border-bottom: 1px solid #f0f0f0;\n }\n\n .ant-table-bordered {\n .ant-table-container {\n border: 1px solid #f0f0f0 !important;\n }\n\n .ant-table-cell {\n border-right: 1px solid #f0f0f0 !important;\n }\n }\n\n .anticon {\n color: #bfbfbf;\n }\n\n}\n\n[datav-theme='darkBlue'] {\n .ecan-table {\n .highlight {\n background: #225b98 !important;\n }\n\n *::-webkit-scrollbar-thumb {\n background-color: #2f4dac !important;\n }\n\n *::-webkit-scrollbar-track {\n background-color: #192c70;\n }\n\n *::-webkit-scrollbar-corner {\n background-color: #192c70 !important;\n }\n .ant-table {\n color: #e8e8e8;\n background: #071655;\n }\n\n .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table,\n .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table {\n border-top: 1px solid #3e8ee3 !important;\n }\n\n .ant-table-thead > tr > th {\n color: #cdd0f7;\n background: #17338c;\n border-bottom: 1px solid #3e8ee3;\n }\n\n .ant-table-tbody > tr > td {\n border-bottom: 1px solid #3e8ee3;\n }\n\n .ant-table-bordered {\n .ant-table-container {\n border: 1px solid #3e8ee3 !important;\n }\n\n .ant-table-cell {\n border-right: 1px solid #3e8ee3 !important;\n }\n }\n\n .ant-pagination-item-link {\n background: #17338c !important;\n }\n\n .ant-pagination-item {\n background: #17338c !important;\n }\n\n .anticon {\n color: rgba(255, 255, 255, .65) !important;\n }\n\n .ant-table-tbody > tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {\n background: #225b98;\n }\n }\n\n td.ant-table-column-sort {\n background: #225b98;\n }\n}\n</style>\n","<template>\n <div class=\"ecan-table\" :style=\"style\">\n <skeleton :loading=\"loading\">\n <div class=\"table-tool\" v-if=\"isUseExport\">\n <a-button class=\"export-button\" @click=\"exportTableData\">导出数据</a-button>\n </div>\n <a-table\n class=\"table\"\n :style=\"{\n height: '100%'\n }\"\n :columns=\"tableColumns\"\n :data-source=\"tableDataSource\"\n :bordered=\"bordered\"\n :size=\"size\"\n :customRow=\"customRow\"\n :scroll=\"{ x, y }\"\n :pagination=\"pagination\"\n @change=\"tableChange\"\n >\n <template #customFilterDropdown=\"{ column, selectedKeys, setSelectedKeys, confirm, clearFilters }\">\n <div\n class=\"ecan-table-filter\"\n :style=\"{\n height: filterDropdownHeight\n }\"\n >\n <a-input\n v-model:value=\"column.filterOptionsInputValue\"\n placeholder=\"请输入关键字\"\n :value=\"selectedKeys[0]\"\n class=\"filter-input\"\n @change=\"onSearchFilterOptions\"\n />\n <a-checkbox-group\n v-model:value=\"column.filterCheckboxGroupValue\"\n class=\"filter-checkbox\"\n :options=\"useFilterOptions(column)\"\n @change=\"useSetSelectedKeys(setSelectedKeys, column)\"\n >\n </a-checkbox-group>\n <div>\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"width: 90px; margin-right: 8px\"\n @click=\"() => confirm()\"\n >\n 搜索\n </a-button>\n <a-button\n size=\"small\"\n style=\"width: 90px\"\n @click.stop=\"onResetFilter(clearFilters, column)\"\n >\n 重置\n </a-button>\n </div>\n </div>\n </template>\n <template #bodyCell=\"{ column, index, text, record }\">\n <!--序号-->\n <template v-if=\"column.dataIndex === 'SEQ'\">\n <span>{{ index + 1 }}</span>\n </template>\n <!-- 操作列配置 -->\n <template v-else-if=\"column.dataIndex === 'ACTION'\">\n <div class=\"action-list\">\n <div class=\"action\" v-for=\"(action, index) in actionList\" :key=\"index\">\n <a\n :href=\"handleHref(action.href, record)\"\n :target=\"handleHrefTarget(action.target)\"\n :style=\"{\n color: action.color,\n fontSize,\n fontWeight\n }\"\n @click=\"onTouchHrefEvent(action.target, handleHref(action.href, record))\"\n >\n {{ action.title }}\n </a>\n </div>\n </div>\n </template>\n <!--进度条-->\n <template v-else-if=\"column.format === 'progress'\">\n <div class=\"progress-cell\">\n <div\n class=\"progress\"\n :style=\"{\n background: column.progressColor || '#1890ff',\n height: column.progressWidth || '18px',\n width: `${handleProgressText(text, column.progressTextDecimalPlaces)}%`\n }\"\n />\n <div\n class=\"progress-text\"\n :style=\"{\n color: handleProgressText(text) < 100 ? column.progressTextColor || '#333' : column.progressFinishedTextColor || '#fff'\n }\"\n >\n {{handleProgressText(text, column.progressTextDecimalPlaces)}}%\n </div>\n </div>\n </template>\n <template v-else>\n <div\n :class=\"[contrastClass(text, column.format)]\"\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ column.format != null ? formatFn(text, column.format) : text }}\n </div>\n </template>\n </template>\n <template #summary>\n <a-table-summary v-if=\"summaryList.length > 0\">\n <a-table-summary-row>\n <a-table-summary-cell\n v-for=\"(summary, index) in summaryList\"\n :key=\"index\"\n :index=\"index\"\n :style=\"{\n backgroundColor: cellBackgroundColor,\n textAlign: summary.cellAlign || 'center',\n color: summary.cellColor,\n borderBottomColor: borderColor,\n }\"\n >\n <div\n :class=\"[contrastClass(summary.total, summary.format)]\"\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ (summary.format != null || summary.format !== '') && formatFn(summary.total, summary.format) }}\n </div>\n </a-table-summary-cell>\n </a-table-summary-row>\n </a-table-summary>\n </template>\n </a-table>\n </skeleton>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, unref, ref, watch, inject, reactive } from 'vue'\nimport {\n Button as AButton,\n Input as AInput,\n CheckboxGroup as ACheckboxGroup,\n Table as ATable,\n TableSummary as ATableSummary,\n TableSummaryRow as ATableSummaryRow,\n TableSummaryCell as ATableSummaryCell,\n message\n} from 'ant-design-vue'\nimport 'ant-design-vue/es/input/style'\nimport 'ant-design-vue/es/checkbox/style'\nimport 'ant-design-vue/es/table/style'\nimport 'ant-design-vue/es/progress/style'\nimport { utils, writeFile } from 'xlsx'\nimport {\n usePickComponentStyle,\n useEmitEvent,\n useRequestData,\n useOnEvent,\n useIndicatorData,\n useVariablesInText\n} from '@/hooks'\nimport { tableComponentProps } from './props'\nimport { formatMoney, formatPercentage } from '@/utils/util'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '@/common/skeleton/Skeleton.vue'\nimport { cloneDeep, pick } from 'lodash-es'\nimport { RequestModalParam } from '@/utils/types'\nimport { Big } from 'big.js'\nexport default defineComponent({\n name: 'EcanTable',\n components: {\n Skeleton,\n AButton,\n AInput,\n ACheckboxGroup,\n ATable,\n ATableSummary,\n ATableSummaryRow,\n ATableSummaryCell\n },\n props: {\n ...tableComponentProps\n },\n setup (props, { expose }) {\n const style = usePickComponentStyle(props)\n const splitY = computed(() => {\n if (props.paginationShow) {\n switch (props.size) {\n case 'small':\n return 90\n case 'middle':\n return 100\n default:\n return 120\n }\n } else {\n switch (props.size) {\n case 'small':\n return 40\n case 'middle':\n return 47\n default:\n return 55\n }\n }\n })\n const x = computed(() => props.scrollX)\n const y = computed(() => parseFloat(props.height as string) - unref(splitY))\n const myColumns = ref<{ [key: string]: any } []>([])\n const myDataSource = ref<{ [key: string]: any } []>([])\n const tableColumns = ref<{ [key: string]: any } []>([])\n const tableDataSource = ref<{ [key: string]: any } []>([])\n const total = ref(0)\n const pageNum = ref(1)\n const pageSize = computed(() => props.paginationPageSize as number)\n const filterDataIndexList = reactive([])\n const handleChildrenColumns = (_columns: { [key: string]: any } [] = []) => {\n if (Array.isArray(_columns) && _columns.length > 0) {\n const len = _columns.length\n const columnsFixedNum = props.columnsFixedNum as number\n // 这里的循环为了 props 是引用类型,会造成脏数据(上次修改后,还会存在上次的数据)\n // 如果使用深拷贝会造成性能的浪费,循环来说相对更快\n for (let i = 0; i < len; i++) {\n const column = _columns[i]\n if (i < columnsFixedNum) {\n column.fixed = 'left'\n } else {\n column.fixed = false\n }\n const {\n cellAlign = 'center',\n cellColor,\n dataIndex,\n title,\n tableFilter,\n headerCellAlign,\n headerCellColor\n } = column\n if (tableFilter) {\n filterDataIndexList.push(dataIndex)\n column.filterOptionsInputValue = ''\n column.filterCheckboxGroupValue = []\n column.customFilterDropdown = true\n column.onFilter = (value, record) => record[dataIndex].toString().toLowerCase().includes(value.toLowerCase())\n }\n // 通用配置\n // 头部单元格\n column.customHeaderCell = () => ({\n style: {\n display: 'table-cell',\n verticalAlign: 'middle',\n fontSize: props.headerFontSize,\n fontWeight: props.headerFontWeight,\n textAlign: headerCellAlign || 'center',\n color: headerCellColor,\n borderBottomColor: props.borderColor\n }\n })\n // 表格单元格\n column.customCell = (record, rowIndex) => ({\n style: {\n textAlign: cellAlign,\n color: cellColor,\n backgroundColor: props.cellBackgroundColor,\n borderBottomColor: props.borderColor\n },\n class: {\n highlight: unref(useRowIndex) === rowIndex && props.clickHighlight\n },\n onClick: emitEvent('click', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n record = {\n dataIndex,\n title,\n ...record\n }\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: record })\n })\n })\n if (Array.isArray(column.children)) {\n handleChildrenColumns(column.children)\n }\n }\n }\n }\n const handleColumns = (columns: { [key: string]: any } [] = []) => {\n // 复制表头数据\n if (props.isUseSeq) {\n // 添加序号\n columns.unshift({\n title: '序号',\n dataIndex: 'SEQ',\n align: 'center'\n })\n }\n // 添加操作列\n if (props.isUseAction) {\n columns.push({\n title: '操作',\n dataIndex: 'ACTION',\n width: props.actionColumnWidth\n })\n }\n handleChildrenColumns(columns)\n return columns\n }\n watch(() => [\n props.columns,\n props.isUseSeq,\n props.isUseAction,\n props.columnsFixedNum,\n props.actionColumnWidth,\n props.cellBackgroundColor,\n props.borderColor\n ], () => {\n myColumns.value = handleColumns(cloneDeep(props.columns as any []))\n }, {\n immediate: true,\n deep: true\n })\n watch(() => [props.data, props.dataType], ([data, dataType]) => {\n if (dataType !== 'static') return\n myDataSource.value = data as { [key:string]:any } []\n }, {\n immediate: true\n })\n const allFilterOptions = ref({})\n const handleFilterCheckboxOptions = (dataSource: { [key:string]: any } []) => {\n if (Array.isArray(dataSource)) {\n const dataLen = dataSource.length\n const keys = filterDataIndexList\n const keysLen = keys.length\n const filterOptionsMap: { [key:string]: Set<string> } = {}\n for (let i = 0; i < dataLen; i++) {\n const record = dataSource[i]\n for (let j = 0; j < keysLen; j++) {\n const key = keys[j]\n if (filterOptionsMap[key]) {\n filterOptionsMap[key].add(record[key])\n } else {\n const set = new Set<string>()\n set.add(record[key])\n filterOptionsMap[key] = set\n }\n }\n }\n const _allFilterOptions: { [key:string]: { label:string, value: string } [] } = {}\n for (const key in filterOptionsMap) {\n if (Object.prototype.hasOwnProperty.call(filterOptionsMap, key)) {\n const optionsSet = filterOptionsMap[key]\n const options = Array.from(optionsSet)\n _allFilterOptions[key] = options.map((option) => ({ label: option, value: option }))\n }\n }\n allFilterOptions.value = _allFilterOptions\n }\n }\n watch(() => [props.isReverse, myColumns.value, myDataSource.value], () => {\n const _columns = unref(myColumns)\n const _dataSource = unref(myDataSource)\n handleFilterCheckboxOptions(_dataSource)\n if (props.isReverse) {\n const { columns, dataSource } = handleReverseTable(cloneDeep(_columns), cloneDeep(_dataSource))\n tableColumns.value = columns\n tableDataSource.value = dataSource\n } else {\n tableColumns.value = _columns\n tableDataSource.value = _dataSource\n }\n }, {\n immediate: true\n })\n const handleReverseTable = (columns: { [key:string]: any} [], dataSource: { [key:string]: any} []) => {\n const firstColumns = columns[0]\n const _columns = [{\n title: firstColumns.title,\n dataIndex: 'col0',\n key: 'col0',\n align: 'center'\n }] as { [key:string]: any } []\n for (let i = 0; i < dataSource.length; i++) {\n const data = dataSource[i]\n const dataIndex = 'col' + (i + 1)\n _columns.push({\n title: data[firstColumns.dataIndex],\n dataIndex,\n key: dataIndex,\n align: 'center'\n })\n }\n const _dataSource = [] as { [key:string]: any } []\n for (let i = 1; i < columns.length; i++) {\n const column = columns[i]\n const _data = { col0: column.title }\n for (let j = 0; j < dataSource.length; j++) {\n const data = dataSource[j]\n _data[`col${j + 1}`] = data[column.dataIndex]\n }\n _dataSource.push(_data)\n }\n return {\n columns: _columns,\n dataSource: _dataSource\n }\n }\n const orderCondition = ref<string>('')\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async (isUseLoading: boolean = true, params: { [key:string]: any } = {}) => {\n try {\n if (isUseLoading) loading.value = true\n // 初始参数:排序\n if (unref(orderCondition)) {\n params.orderCondition = unref(orderCondition)\n }\n // 分页\n if (props.paginationShow) {\n params = {\n pageNum: unref(pageNum),\n pageSize: unref(pageSize),\n layer: '1',\n ...params\n }\n }\n const res = await requestData(params)\n const { rows = [], total: tableTotal = 0 } = res?.data?.data || {}\n total.value = tableTotal\n if (Array.isArray(rows)) {\n myDataSource.value = rows\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const tableChange = ({ current }: { current: number }, _filters, sorter) => {\n pageNum.value = current\n if (sorter && Object.keys(sorter).length > 0) {\n const { field, order } = sorter as { field: string | null, order: 'ascend' | 'descend' }\n const map = {\n ascend: 'asc',\n descend: 'desc'\n }\n const fieldOrder = map[order]\n if (field != null && fieldOrder != null) {\n orderCondition.value = field + ' ' + fieldOrder\n pageNum.value = 1\n }\n }\n refreshData(false)\n }\n const pagination = computed(() => {\n const simple = props.simple\n const position = [props.paginationPosition]\n return props.paginationShow && {\n simple,\n position,\n total: unref(total),\n current: unref(pageNum),\n pageSize: unref(pageSize),\n showSizeChanger: false\n }\n })\n const formatBoolean = (value: string | number) => {\n if (+value === 1) return '是'\n if (+value === 0) return '否'\n return value\n }\n type Format = 'money' | 'percentage' | 'contrast' | 'boolean' | 'progress' | ''\n const formatFn = (value: string | number, format?: Format) => {\n if (format == null || format === '') return value\n const map = {\n money: formatMoney,\n percentage: formatPercentage,\n contrast: formatPercentage,\n boolean: formatBoolean\n }\n return map[format](value) || ''\n }\n const contrastClass = (value: string | number, format: Format) => {\n const _value = parseFloat(value + '')\n if (format !== 'contrast') {\n return ''\n }\n switch (true) {\n case _value >= 0:\n return 'goUp'\n case _value < 0:\n return 'goDown'\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const handleIndicatorDataset = (dataColumns: any [] = [], dataRows: { [key:string]: any }[] = []) => {\n const _columns = dataColumns.map((column: string) => ({ title: column, dataIndex: column, key: column }))\n myColumns.value = handleColumns(_columns)\n myDataSource.value = dataRows\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n handleIndicatorDataset(res?.data?.data?.columns, res?.data?.data?.rows)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const useRowIndex = ref(-1)\n\n const customRow = (record, index) => ({\n onClick: emitEvent('rowClick', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: record })\n useRowIndex.value = index\n })\n })\n\n const refreshData = (isUseLoading: boolean = true) => {\n switch (props.dataType) {\n case 'request':\n handleRequestData(isUseLoading)\n break\n case 'indicator':\n handleIndicatorData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n const summaryList = computed(() => {\n const columns = unref(tableColumns)\n const summaryList = [] as { [key: string]: any } []\n let calcTotalCount = 0\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]\n const { isCalcTotal } = column\n if (props.isUseSeq && i === 0) {\n summaryList.push({\n ...column,\n total: '小计'\n })\n } else if (isCalcTotal) {\n summaryList.push({\n ...column,\n index: i,\n total: 0\n })\n calcTotalCount++\n } else {\n summaryList.push({\n ...column\n })\n }\n }\n // 为空直接返回\n if (calcTotalCount === 0) return []\n const records = unref(tableDataSource)\n for (let i = 0; i < summaryList.length; i++) {\n const summary = summaryList[i]\n let total: number = 0\n const { isCalcTotal, dataIndex } = summary\n if (isCalcTotal === true) {\n for (let j = 0; j < records.length; j++) {\n const record = records[j]\n const num = +record[dataIndex]\n if (!isNaN(num)) {\n total = new Big(total).add(num).toNumber()\n }\n }\n summary.total = total\n }\n }\n return summaryList\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n expose({\n refreshData\n })\n\n const handleHref = (href: string = '', data: { [key:string]: any }) => {\n return useVariablesInText(href, data)\n }\n\n const handleHrefTarget = (target: 'self' | 'blank' | 'event') => {\n if (target === 'event') {\n return undefined\n } else {\n const map = {\n self: '_self',\n blank: '_blank'\n }\n return map[target]\n }\n }\n\n const onTouchHrefEvent = (target: 'self' | 'blank' | 'event', href: string = '') => {\n if (target === 'event') {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n }\n\n const useSetSelectedKeys = (setSelectedKeys, column) => {\n setSelectedKeys(column.filterCheckboxGroupValue)\n }\n\n const onResetFilter = (clearFilters, column) => {\n clearFilters({ confirm: true })\n column.filterOptionsInputValue = ''\n column.filterCheckboxGroupValue = []\n }\n const onSearchFilterOptions = () => {}\n const useFilterOptions = (column) => {\n const key = column.dataIndex\n if (typeof key === 'string') {\n let filterOptions = unref(allFilterOptions)[key]\n const _inputValue = unref(column.filterOptionsInputValue).trim()\n if (Array.isArray(filterOptions)) {\n filterOptions = filterOptions.filter((filterOption) => {\n if (typeof filterOption.label === 'string') {\n return filterOption.label.toLowerCase().includes(_inputValue.toLowerCase())\n }\n return true\n })\n return filterOptions\n }\n return []\n }\n return []\n }\n\n const exportTableData = async () => {\n const key = 'EXPORT_KEY'\n message.loading({\n key,\n content: '正在导出...',\n duration: 0\n })\n let rows = []\n if (props.dataType === 'static') {\n rows = props.data\n } else if (props.dataType === 'request') {\n const params = { layer: '1' } as { [key:string]:any }\n if (unref(orderCondition)) {\n params.orderCondition = unref(orderCondition)\n }\n const res = await requestData(params)\n rows = res?.data?.data?.rows || {}\n }\n const columns = unref(tableColumns)\n const columnKeys = []\n const columnValues = []\n columns?.forEach(column => {\n columnKeys.push(column.dataIndex)\n columnValues.push(column.title)\n })\n const data = rows.map(item => pick(item, columnKeys))\n // 导出excel\n const workBook = utils.book_new()\n const header = utils.aoa_to_sheet([columnValues])\n const sheet = utils.sheet_add_json(header, data, { skipHeader: true, origin: 'A2' })\n\n utils.book_append_sheet(workBook, sheet, 'sheet')\n\n writeFile(workBook, '表格数据.xlsx')\n message.success({ key, content: '导出成功' })\n }\n\n const handleProgressText = (text: string | number, decimalPlaces = 2) => {\n const num = (+text) * 100\n if (isNaN(num) || num <= 0) {\n return 0\n } else if (num >= 100) {\n return 100\n } else {\n return (num).toFixed(decimalPlaces)\n }\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n exportTableData\n })\n\n return {\n x,\n y,\n style,\n customRow,\n pagination,\n formatFn,\n contrastClass,\n tableChange,\n summaryList,\n loading,\n onTouchHrefEvent,\n handleHref,\n handleHrefTarget,\n useRowIndex,\n tableColumns,\n tableDataSource,\n useFilterOptions,\n useSetSelectedKeys,\n onResetFilter,\n onSearchFilterOptions,\n exportTableData,\n handleProgressText\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.table {\n width: 100%;\n}\n\n.table-tool {\n width: 100%;\n display: flex;\n justify-content: flex-end;\n}\n\n.export-button {\n margin-bottom: 8px;\n}\n\n.goUp {\n color: #FF512E;\n display: flex;\n align-items: center;\n justify-content: center;\n &:before {\n content: '';\n display: block;\n background-image: url(\"../../assets/go-up.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n}\n\n.goDown {\n color: #39cf93;\n display: flex;\n align-items: center;\n justify-content: center;\n &:before {\n content: '';\n display: block;\n background-image: url(\"../../assets/go-down.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n}\n\n.action-list {\n display: flex;\n width: 100%;\n}\n.action {\n flex: 1;\n}\n\n.filter-input {\n width: 188px;\n margin-bottom: 8px;\n display: block\n}\n\n.filter-checkbox {\n width: 188px;\n margin-bottom: 8px;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-table-filter {\n padding: 8px;\n display: flex;\n flex-direction: column;\n .ant-checkbox-group {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .ant-checkbox-wrapper {\n width: 100%;\n padding: 5px 0;\n font-size: 16px;\n &:hover {\n background-color: #f5f5f5;\n }\n .ant-checkbox + span {\n width: 100%;\n word-break: break-all;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical\n }\n }\n}\n\n.ecan-table {\n .highlight {\n background: #e6f7ff !important;\n }\n\n .progress-cell {\n width:100%;\n display: flex;\n align-items: center;\n .progress-text {\n position: absolute;\n right: 20px;\n }\n }\n\n *::-webkit-scrollbar {\n //width: 6px;\n //height: 6px;\n }\n\n *::-webkit-scrollbar-thumb {\n border-radius: 3px;\n -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);\n background-color: #c8c9ca !important;\n }\n\n *::-webkit-scrollbar-track {\n background-color: #fff;\n }\n\n .ant-table-cell-scrollbar {\n box-shadow: 0 1px 0 1px transparent;\n }\n\n .ant-table {\n color: rgba(0, 0, 0, .65);\n background: #ffffff;\n }\n\n .ant-table-thead > tr > th {\n color: rgba(0, 0, 0, .85);\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .ant-table-tbody > tr > td {\n border-bottom: 1px solid #f0f0f0;\n }\n\n .ant-table-bordered {\n .ant-table-container {\n border: 1px solid #f0f0f0 !important;\n }\n\n .ant-table-cell {\n border-right: 1px solid #f0f0f0 !important;\n }\n }\n\n .anticon {\n color: #bfbfbf;\n }\n\n}\n\n[datav-theme='darkBlue'] {\n .ecan-table {\n .highlight {\n background: #225b98 !important;\n }\n\n *::-webkit-scrollbar-thumb {\n background-color: #2f4dac !important;\n }\n\n *::-webkit-scrollbar-track {\n background-color: #192c70;\n }\n\n *::-webkit-scrollbar-corner {\n background-color: #192c70 !important;\n }\n .ant-table {\n color: #e8e8e8;\n background: #071655;\n }\n\n .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table,\n .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table {\n border-top: 1px solid #3e8ee3 !important;\n }\n\n .ant-table-thead > tr > th {\n color: #cdd0f7;\n background: #17338c;\n border-bottom: 1px solid #3e8ee3;\n }\n\n .ant-table-tbody > tr > td {\n border-bottom: 1px solid #3e8ee3;\n }\n\n .ant-table-bordered {\n .ant-table-container {\n border: 1px solid #3e8ee3 !important;\n }\n\n .ant-table-cell {\n border-right: 1px solid #3e8ee3 !important;\n }\n }\n\n .ant-pagination-item-link {\n background: #17338c !important;\n }\n\n .ant-pagination-item {\n background: #17338c !important;\n }\n\n .anticon {\n color: rgba(255, 255, 255, .65) !important;\n }\n\n .ant-table-tbody > tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {\n background: #225b98;\n }\n }\n\n td.ant-table-column-sort {\n background: #225b98;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Table from './Table.vue'\nexport const EcanTable = withInstall(Table)\nexport default EcanTable\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface MapProps extends Props {\n mapJson: { name: string, value: string, path: string } | null,\n data: { [key:string]: any } []\n backgroundImage: string\n backgroundImageRepeat: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat',\n symbolImage: string // 图标\n symbolWidth: number\n symbolHeight: number\n geoZoom: number\n geoRoam: boolean\n geoCenter: string\n geoBackgroundImage: string\n geoBackgroundImageRepeat: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat'\n geoLabelShow: boolean\n geoLabelColor: string\n geoLabelFontSize: number\n geoItemStyleAreaColor: string\n geoItemStyleBorderColor: string\n geoItemStyleBorderWidth: number\n geoItemStyleShadowColor: string\n geoItemStyleShadowOffsetX: number\n geoItemStyleShadowOffsetY: number\n geoItemStyleShadowBlur: number\n geoEmphasisDisabled: boolean\n geoEmphasisLabelColor: string\n geoEmphasisItemStyleAreaColor: string\n geoEmphasisItemStyleBorderColor: string\n itemStyleColor: string\n labelFontSize: number\n labelFormatter: string\n labelShow: boolean\n labelColor: string\n tooltipShow: boolean\n tooltipTextStyleColor: string\n tooltipFormatter: string\n}\n\nexport const mapProps: MapProps = {\n ...props,\n mapJson: null,\n data: [],\n name: '地图',\n keyName: '地图',\n type: 'ecanMap',\n width: '400px',\n height: '400px',\n backgroundImage: '',\n backgroundImageRepeat: 'no-repeat',\n geoBackgroundImage: '',\n geoBackgroundImageRepeat: 'no-repeat',\n symbolImage: '',\n symbolWidth: 10,\n symbolHeight: 10,\n itemStyleColor: '#11BFDA',\n labelFontSize: 14,\n labelShow: true,\n geoLabelShow: true,\n geoLabelColor: '#000',\n geoZoom: 1,\n geoRoam: false,\n geoCenter: '',\n geoLabelFontSize: 12,\n labelColor: '',\n labelFormatter: '{b}',\n geoItemStyleAreaColor: '#eee',\n geoItemStyleBorderColor: '#000',\n geoItemStyleBorderWidth: 1,\n geoItemStyleShadowColor: '',\n geoItemStyleShadowOffsetX: 0,\n geoItemStyleShadowOffsetY: 0,\n geoItemStyleShadowBlur: 0,\n geoEmphasisDisabled: false,\n geoEmphasisLabelColor: '#fff',\n geoEmphasisItemStyleAreaColor: '#f00',\n geoEmphasisItemStyleBorderColor: '#000',\n tooltipShow: true,\n tooltipTextStyleColor: '',\n tooltipFormatter: '{b}'\n}\n\nexport const mapComponentProps = transformToComponentProps(mapProps)\n","<template>\n <div class=\"ecan-map\" :style=\"style\">\n <echarts\n v-if=\"isLoadedData\"\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n <img\n ref=\"geoBackgroundImageRef\"\n v-show=\"false\"\n :src=\"myGeoBackgroundImage\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, watch, ref, unref } from 'vue'\nimport { mapComponentProps } from './props'\nimport Echarts from '@/common/echarts'\nimport { use, registerMap } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { MapChart, ScatterChart } from 'echarts/charts'\nimport { VisualMapComponent, TooltipComponent, GraphicComponent } from 'echarts/components'\nimport request from '@/utils/request'\nimport { usePickComponentStyle, useImagePath } from '../../hooks'\nuse([\n CanvasRenderer,\n MapChart,\n ScatterChart,\n VisualMapComponent,\n TooltipComponent,\n GraphicComponent\n])\nexport default defineComponent({\n name: 'EcanMap',\n components: {\n Echarts\n },\n props: {\n ...mapComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props, ['backgroundImage'])\n const geoBackgroundImageRef = ref()\n const myGeoBackgroundImage = computed(() => useImagePath(props.geoBackgroundImage))\n const myBackgroundImage = computed(() => useImagePath(props.backgroundImage))\n const areaColor = computed(() => {\n const backgroundImage = props.geoBackgroundImage\n if (backgroundImage) {\n return {\n image: unref(geoBackgroundImageRef),\n repeat: props.geoBackgroundImageRepeat\n }\n }\n return props.geoItemStyleAreaColor\n })\n const symbol = computed(() => {\n const symbolImage = props.symbolImage\n if (props.symbolImage) {\n return 'image://' + useImagePath(symbolImage)\n }\n return 'circle'\n })\n const option = computed(() => {\n const geoCenter = props.geoCenter\n let center: undefined | Array<any>\n if (typeof geoCenter === 'string' && geoCenter !== '') {\n center = geoCenter.split(',')\n }\n return {\n // backgroundColor: unref(background),\n tooltip: {\n show: true\n },\n graphic: [\n { // 一个图形元素,类型是 image。\n type: 'image',\n style: {\n width: parseFloat(props.width),\n height: parseFloat(props.height),\n image: unref(myBackgroundImage)\n },\n top: 'center'\n }\n ],\n geo: {\n zoom: props.geoZoom,\n roam: props.geoRoam,\n center,\n map: 'map',\n tooltip: {\n show: false\n },\n label: { // 地图上显示文字属性\n show: props.geoLabelShow,\n color: props.geoLabelColor,\n fontSize: props.geoLabelFontSize\n },\n itemStyle: { // 地图上板块属性\n areaColor: unref(areaColor),\n borderColor: props.geoItemStyleBorderColor,\n borderWidth: props.geoItemStyleBorderWidth,\n shadowColor: props.geoItemStyleShadowColor,\n shadowBlur: props.geoItemStyleShadowBlur,\n shadowOffsetX: props.geoItemStyleShadowOffsetX,\n shadowOffsetY: props.geoItemStyleShadowOffsetY\n },\n emphasis: { // 当鼠标悬停的时候\n disabled: props.geoEmphasisDisabled,\n label: {\n color: props.geoEmphasisLabelColor\n },\n itemStyle: {\n areaColor: props.geoEmphasisItemStyleAreaColor,\n borderColor: props.geoEmphasisItemStyleBorderColor\n }\n }\n },\n series: [\n {\n type: 'scatter',\n coordinateSystem: 'geo',\n itemStyle: {\n color: props.itemStyleColor\n },\n symbol: unref(symbol),\n symbolSize: [props.symbolWidth, props.symbolHeight],\n label: {\n show: props.labelShow,\n fontSize: props.labelFontSize,\n formatter: props.labelFormatter,\n color: props.labelColor\n },\n tooltip: {\n show: props.tooltipShow,\n formatter: props.tooltipFormatter,\n textStyle: {\n color: props.tooltipTextStyleColor\n }\n },\n data: props.data\n }\n ]\n }\n })\n // const echarts = ref()\n const isLoadedData = ref(false)\n const handleRegisterMap = async () => {\n const mapJson = props.mapJson\n if (mapJson != null && mapJson.path) {\n // @ts-ignore\n const res = await request(window?.config?.uploadPath + mapJson.path)\n registerMap('map', (res?.data || {}) as any)\n }\n isLoadedData.value = true\n }\n watch(() => props.mapJson, () => {\n handleRegisterMap()\n }, {\n immediate: true,\n deep: true\n })\n return {\n option,\n style,\n isLoadedData,\n geoBackgroundImageRef,\n myGeoBackgroundImage\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-map {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n</style>\n","<template>\n <div class=\"ecan-map\" :style=\"style\">\n <echarts\n v-if=\"isLoadedData\"\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n <img\n ref=\"geoBackgroundImageRef\"\n v-show=\"false\"\n :src=\"myGeoBackgroundImage\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, watch, ref, unref } from 'vue'\nimport { mapComponentProps } from './props'\nimport Echarts from '@/common/echarts'\nimport { use, registerMap } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { MapChart, ScatterChart } from 'echarts/charts'\nimport { VisualMapComponent, TooltipComponent, GraphicComponent } from 'echarts/components'\nimport request from '@/utils/request'\nimport { usePickComponentStyle, useImagePath } from '../../hooks'\nuse([\n CanvasRenderer,\n MapChart,\n ScatterChart,\n VisualMapComponent,\n TooltipComponent,\n GraphicComponent\n])\nexport default defineComponent({\n name: 'EcanMap',\n components: {\n Echarts\n },\n props: {\n ...mapComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props, ['backgroundImage'])\n const geoBackgroundImageRef = ref()\n const myGeoBackgroundImage = computed(() => useImagePath(props.geoBackgroundImage))\n const myBackgroundImage = computed(() => useImagePath(props.backgroundImage))\n const areaColor = computed(() => {\n const backgroundImage = props.geoBackgroundImage\n if (backgroundImage) {\n return {\n image: unref(geoBackgroundImageRef),\n repeat: props.geoBackgroundImageRepeat\n }\n }\n return props.geoItemStyleAreaColor\n })\n const symbol = computed(() => {\n const symbolImage = props.symbolImage\n if (props.symbolImage) {\n return 'image://' + useImagePath(symbolImage)\n }\n return 'circle'\n })\n const option = computed(() => {\n const geoCenter = props.geoCenter\n let center: undefined | Array<any>\n if (typeof geoCenter === 'string' && geoCenter !== '') {\n center = geoCenter.split(',')\n }\n return {\n // backgroundColor: unref(background),\n tooltip: {\n show: true\n },\n graphic: [\n { // 一个图形元素,类型是 image。\n type: 'image',\n style: {\n width: parseFloat(props.width),\n height: parseFloat(props.height),\n image: unref(myBackgroundImage)\n },\n top: 'center'\n }\n ],\n geo: {\n zoom: props.geoZoom,\n roam: props.geoRoam,\n center,\n map: 'map',\n tooltip: {\n show: false\n },\n label: { // 地图上显示文字属性\n show: props.geoLabelShow,\n color: props.geoLabelColor,\n fontSize: props.geoLabelFontSize\n },\n itemStyle: { // 地图上板块属性\n areaColor: unref(areaColor),\n borderColor: props.geoItemStyleBorderColor,\n borderWidth: props.geoItemStyleBorderWidth,\n shadowColor: props.geoItemStyleShadowColor,\n shadowBlur: props.geoItemStyleShadowBlur,\n shadowOffsetX: props.geoItemStyleShadowOffsetX,\n shadowOffsetY: props.geoItemStyleShadowOffsetY\n },\n emphasis: { // 当鼠标悬停的时候\n disabled: props.geoEmphasisDisabled,\n label: {\n color: props.geoEmphasisLabelColor\n },\n itemStyle: {\n areaColor: props.geoEmphasisItemStyleAreaColor,\n borderColor: props.geoEmphasisItemStyleBorderColor\n }\n }\n },\n series: [\n {\n type: 'scatter',\n coordinateSystem: 'geo',\n itemStyle: {\n color: props.itemStyleColor\n },\n symbol: unref(symbol),\n symbolSize: [props.symbolWidth, props.symbolHeight],\n label: {\n show: props.labelShow,\n fontSize: props.labelFontSize,\n formatter: props.labelFormatter,\n color: props.labelColor\n },\n tooltip: {\n show: props.tooltipShow,\n formatter: props.tooltipFormatter,\n textStyle: {\n color: props.tooltipTextStyleColor\n }\n },\n data: props.data\n }\n ]\n }\n })\n // const echarts = ref()\n const isLoadedData = ref(false)\n const handleRegisterMap = async () => {\n const mapJson = props.mapJson\n if (mapJson != null && mapJson.path) {\n // @ts-ignore\n const res = await request(window?.config?.uploadPath + mapJson.path)\n registerMap('map', (res?.data || {}) as any)\n }\n isLoadedData.value = true\n }\n watch(() => props.mapJson, () => {\n handleRegisterMap()\n }, {\n immediate: true,\n deep: true\n })\n return {\n option,\n style,\n isLoadedData,\n geoBackgroundImageRef,\n myGeoBackgroundImage\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-map {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Map from './Map.vue'\nexport const EcanMap = withInstall(Map)\nexport default EcanMap\nexport * from './props'\n","import { App } from 'vue'\nimport * as components from './components'\nconst install = (app: App) => {\n Object.keys(components).forEach(key => {\n const component = components[key]\n if (component.install) {\n app.use(component)\n }\n })\n}\n\n// 部分导出\nexport * from './components'\n// 全局安装\nexport default {\n install\n}\n"],"names":["METHOD_NAMES","usePublicAPI","chart","init","makePublicMethod","name","args","makePublicMethods","methods","useAutoresize","autoresize","root","resizeListener","watch","_","cleanup","throttle","addListener","removeListener","autoresizeProps","LOADING_OPTIONS_KEY","useLoading","loading","loadingOptions","defaultLoadingOptions","inject","realLoadingOptions","computed","unref","watchEffect","instance","loadingProps","onRE","isOn","key","omitOn","attrs","result","TAG_NAME","THEME_KEY","INIT_OPTIONS_KEY","UPDATE_OPTIONS_KEY","Echarts","defineComponent","props","listeners","shallowRef","manualOption","defaultTheme","defaultInitOptions","defaultUpdateOptions","manualUpdate","toRefs","realOption","realTheme","realInitOptions","realUpdateOptions","nonEventAttrs","option","initChart","realListeners","event","handler","resize","e","commit","nextTick","setOption","updateOptions","unwatchOption","publicApi","onMounted","onUnmounted","h","bound01","n","max","isOnePointZero","isPercent","isPercentage","boundAlpha","a","convertToPercentage","pad2","c","rgbToRgb","r","g","b","hue2rgb","p","q","t","hslToRgb","s","l","rgbToHsv","min","v","d","hsvToRgb","i","f","mod","rgbToHex","allow3Char","hex","convertHexToDecimal","parseIntFromHex","val","names","inputToRGB","color","rgb","ok","format","stringInputToObject","isValidCSSUnit","CSS_INTEGER","CSS_NUMBER","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","matchers","named","match","hueStep","saturationStep","saturationStep2","brightnessStep1","brightnessStep2","lightColorCount","darkColorCount","darkColorMap","toHsv","_ref","hsv","toHex","_ref2","mix","rgb1","rgb2","amount","getHue","light","hue","getSaturation","saturation","getValue","value","generate","opts","patterns","pColor","colorString","_i","_hsv","_colorString","_ref3","index","opacity","darkColorString","presetPrimaryColors","presetPalettes","presetDarkPalettes","containers","styleElements","usage","createStyleElement","styleElement","insertCss","css","options","position","container","containerId","_objectSpread","target","source","ownKeys","sym","_defineProperty","obj","warn","valid","message","warning","isIconDefinition","node","rootProps","child","getSecondaryColor","primaryColor","generateColor","normalizeTwoToneColors","twoToneColor","iconStyles","cssInjectedFlag","useInsertStyles","styleStr","_excluded","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","sourceSymbolKeys","sourceKeys","twoToneColorPalette","setTwoToneColors","secondaryColor","getTwoToneColors","IconBase","context","_props$context$attrs","icon","restProps","colors","VueIcon","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","o","minLen","_arrayLikeToArray","len","arr2","_arr","_n","_d","_s","_e","err","setTwoToneColor","_normalizeTwoToneColo","_normalizeTwoToneColo2","getTwoToneColor","Icon","_classObj","cls","spin","rotate","tabindex","onClick","classObj","svgClassString","iconTabIndex","svgStyle","_createVNode","AntdIcon","CloseOutlined","CloseOutlinedSvg","CloseOutlined$1","LoadingOutlined","LoadingOutlinedSvg","LoadingOutlined$1","_sfc_main$s","ASpin","_component_a_spin","_resolveComponent","_createElementBlock","_hoisted_1","_ctx","_openBlock","_createBlock","_renderSlot","_sfc_main$r","ASkeleton","_component_a_skeleton","withInstall","main","extra","app","comp","transformToComponentProps","componentProps","prop","pageConfig","pageConfigComponentProps","styleList","usePickComponentStyle","excludeStyleList","finalStyleList","without","pick","EVENT_BUS","GLOBAL_CONFIG","GLOBAL_MODEL","REQUEST_MODEL","GLOBAL_TOKEN","REFRESH_PAGE","MODAL_MODEL","ZOOM_FONT_SIZE","INDICATOR_URL","_a","_b","BASE_URL","_c","ERD_URL","useOnEvent","events","id","eventBus","useEmitEvent","type","touchEventId","ref","on","callback","emitEvent","useTransformChartDataByAttrValue","data","dataFieldNames","set","map","item","x","y","dimensions","dataset","requestErrorTip","request","axios","response","error","config","status","handleFormatter","formatter","formatMoney","decimalPlaces","_value","formatThousands","formatPercentage","strValue","lowerCaseIncludes","v1","v2","runCode","code","useFn","dayjs","paramsStr","params","runFn","useVariablesInText","textData","codeData","useNewline","useSpace","variables","variable","statement","reg","textVariables","j","textVariable","usedVariable","useRequestData","callBack","requestUrl","method","headers","requestParams","requestInterval","isOpenRequestTimer","contextRequestUrl","getGlobalModel","_key","url","requestData","_params","param","record","propKey","operate","mode","urlParams","keys","last","keysLen","_param","isSetUrlParams","urlStr","res","requestDataTimer","useTransformChartDataByAttrKey","types","dataLen","typesLen","vs","label","m","useImagePath","path","isFormat","imagePath","usePageUrl","pageMode","pageId","envPageUrl","proPageUrl","useValueFormatter","useIndicatorData","requestToken","handleQueryColumn","queryColumn","location","show","indexCode","handleIndicator","indicator","calcType","builtInFormula","builtInValueSource","builtInCalcWay","formula","conditions","handleSqlConditions","controlList","sqlConditions","control","conditionLabel","conditionKey","conditionValueType","sqlCondition","model","graphicConfig","dataViewId","plugin","layer","chartType","classificationList","seriesList","leftAxisList","rightAxisList","queryColumnList","indicators","dataSourceId","idxLibMode","preview","classification","sort","customGroup","series","queryColumns","indicatorList","leftAxis","rightAxis","useHrefParamsToGlobalVariables","keyAndValue","_sfc_main$q","style","width","height","originalWidth","originalHeight","ready","observer","initSize","resolve","updateSize","updateScale","currentWidth","currentHeight","realWidth","realHeight","widthScale","heightScale","onResize","debounce","initMutationObserver","MutationObserver","removeMutationObserver","_sfc_render","_cache","$props","$setup","$data","$options","_normalizeStyle","EcanPageConfig","providerConfig","providerConfigComponentProps","_sfc_main$p","expose","setTheme","theme","provide","globalModel","setGlobalModel","useModalIds","popUseModalIds","pushUseModalIds","modalModel","getModalModel","setModalModel","mitt","eventBusKeySet","onEvent","k","onBeforeUnmount","offEvent","eventName","currentModalId","tokenNum","requestModel","requestMap","setRequest","requestFn","sortNum","requestFnList","handleRequestFnList","reject","resultList","list","queryUserToken","token","touchRequest","requestModelArr","emitRefreshPage","onRefreshPage","EcanProviderConfig","textProps","textComponentProps","textEvents","goUp","goDown","_sfc_main$o","Skeleton","myData","dataType","myText","text","replaceStatement","handleRequestData","refreshData","click","linkPage","pageUrl","href","valueChange","oldValue","_component_skeleton","EcanText","_sfc_main$n","EcanScrollText","timeDisplayProps","timeDisplayComponentProps","timeDisplayEvents","_sfc_main$m","handleTimeValue","time","setTimer","timer","clearTimer","timeChange","intervalTime","modeMap","EcanTimeDisplay","listProps","listComponentProps","listEvents","_sfc_main$l","dataSource","columnStyle","formatFn","contrastClass","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_7","_withCtx","_Fragment","_renderList","count","_createCommentVNode","column","_hoisted_5","_normalizeClass","EcanList","proportionProps","proportionComponentProps","proportionEvents","_sfc_main$k","AProgress","myWidth","myValue","defaultValue","valueSet","_component_a_progress","EcanProportion","inputProps","inputComponentProps","inputEvents","_sfc_main$j","AInput","handleSetGlobalModel","modal","inputChange","inputBlur","_component_a_input","$event","EcanInput","datePickerProps","datePickerComponentProps","datePickerEvents","_sfc_main$i","ADatePicker","getPopupContainer","useCurrentTime","dateChange","change","locale","_component_a_date_picker","EcanDatePicker","rangePickerProps","rangePickerComponentProps","rangePickerEvents","_sfc_main$h","ARangePicker","startTime","endTime","interval","intervalUnit","_startTime","_endTime","calendarStartTime","calendarEndTime","calendarChange","range","disabledDate","current","isDisabled","limitStartTime","limitEndTime","myStartTime","myEndTime","isDateChange","openChange","isNotNull","_component_a_range_picker","EcanRangePicker","buttonProps","buttonComponentProps","buttonEvents","_sfc_main$g","AButton","myHref","myTarget","_component_a_button","_createElementVNode","EcanButton","checkboxProps","checkboxComponentProps","checkboxEvents","_sfc_main$f","ACheckboxGroup","myOption","handleDataAndOption","checkboxChange","_component_a_checkbox_group","EcanCheckbox","selectProps","selectComponentProps","selectEvents","_sfc_main$e","ASelect","selectFirstOption","filterOption","input","labelKey","valueKey","labelValue","valueValue","firstOption","selectChange","_component_a_select","EcanSelect","treeSelectProps","treeSelectComponentProps","treeSelectEvents","_sfc_main$d","ATreeSelect","treeData","filterTreeNode","inputValue","treeNode","multiple","_component_a_tree_select","EcanTreeSelect","pieProps","pieComponentProps","pieEvents","useDownloadFile","downloadFileUrl","fileName","blob","dom","modalProps","modalComponentProps","modalEvents","_sfc_main$c","AModal","emit","getContainer","modalStyle","modalWith","containWidth","scaleWidth","containHeight","containStyle","contentStyle","modalRef","scaleHeight","screenWidth","screenHeight","visible","showModal","hideModal","onOk","onCancel","handleModalModel","componentList","component","isFullWidth","isFullModal","wrapClassName","className","_component_a_modal","_toDisplayString","_component_close_outlined","_resolveDynamicComponent","_mergeProps","EcanModal","use","CanvasRenderer","PieChart","TitleComponent","ToolboxComponent","TooltipComponent","LegendComponent","_sfc_main$b","Spin","ecanModal","isUseLabelColors","marker","seriesName","percent","onClose","handleDataset","handleIndicatorDataset","chartData","indicatorData","handleIndicatorData","columns","rows","_requestModalParam","_component_spin","_component_echarts","_component_ecan_modal","EcanPie","lineProps","lineComponentProps","lineEvents","LineChart","_sfc_main$a","echartRef","fontSize","eventObj","currentData","xAxisLabelFormatter","yAxisLabelFormatter","tooltipFormatter","useDataFieldNames","temp","keyTypeDataFieldNames","customClick","fieldNames","EcanLine","barProps","barComponentProps","barEvents","BarChart","DatasetComponent","_sfc_main$9","ds","xAxisData","EcanBar","scatterProps","scatterComponentProps","scatterEvents","ScatterChart","_sfc_main$8","EcanScatter","customGraphProps","customGraphComponentProps","_sfc_main$7","optionCode","evalCopy","echarts","EcanCustomGraph","comboGraphProps","comboGraphComponentProps","comboGraphEvents","_sfc_main$6","seriesTypes","seriesType","_tooltipFormatter","yAxis","axisIndex","axis","EcanComboGraph","borderProps","borderComponentProps","borderEvents","_sfc_main$5","borderStyle","_imports_0","_imports_1","_withScopeId","_pushScopeId","_popScopeId","_hoisted_6","_hoisted_8","_hoisted_9","_hoisted_14","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_15","EcanBorder","tabsProps","tabsComponentProps","tabsEvents","_sfc_main$4","activeKey","setAutoSwitch","maxKey","changeKey","isActive","tabChange","tab","_withModifiers","EcanTabs","imageProps","imageComponentProps","_sfc_main$3","myImgUrl","EcanImage","iframeProps","iframeComponentProps","_sfc_main$2","myLink","link","ctxErdUrl","EcanIframe","tableProps","tableComponentProps","tableEvents","_sfc_main$1","ATable","ATableSummary","ATableSummaryRow","ATableSummaryCell","splitY","myColumns","myDataSource","tableColumns","tableDataSource","total","pageNum","pageSize","filterDataIndexList","reactive","handleChildrenColumns","_columns","columnsFixedNum","cellAlign","cellColor","dataIndex","title","tableFilter","headerCellAlign","headerCellColor","rowIndex","useRowIndex","handleColumns","cloneDeep","allFilterOptions","handleFilterCheckboxOptions","filterOptionsMap","_allFilterOptions","optionsSet","_dataSource","handleReverseTable","firstColumns","_data","orderCondition","isUseLoading","tableTotal","tableChange","_filters","sorter","field","order","fieldOrder","pagination","simple","formatBoolean","dataColumns","dataRows","customRow","resetRecord","summaryList","calcTotalCount","isCalcTotal","records","summary","num","Big","handleHref","handleHrefTarget","onTouchHrefEvent","useSetSelectedKeys","setSelectedKeys","onResetFilter","clearFilters","onSearchFilterOptions","useFilterOptions","filterOptions","_inputValue","exportTableData","columnKeys","columnValues","workBook","utils","header","sheet","writeFile","handleProgressText","_component_a_table","selectedKeys","confirm","action","_component_a_table_summary","_component_a_table_summary_row","_component_a_table_summary_cell","EcanTable","mapProps","mapComponentProps","MapChart","VisualMapComponent","GraphicComponent","_sfc_main","geoBackgroundImageRef","myGeoBackgroundImage","myBackgroundImage","areaColor","symbol","symbolImage","geoCenter","center","isLoadedData","handleRegisterMap","mapJson","registerMap","_withDirectives","EcanMap","components"],"mappings":"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","x_google_ignoreList":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,23]}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/common/echarts/composables/api.ts","../src/common/echarts/composables/autoresize.ts","../src/common/echarts/composables/loading.ts","../src/common/echarts/utils.ts","../src/common/echarts/Echarts.ts","../node_modules/@ctrl/tinycolor/dist/module/util.js","../node_modules/@ctrl/tinycolor/dist/module/conversion.js","../node_modules/@ctrl/tinycolor/dist/module/css-color-names.js","../node_modules/@ctrl/tinycolor/dist/module/format-input.js","../node_modules/@ant-design/colors/dist/index.esm.js","../node_modules/@ant-design/icons-vue/es/insert-css.js","../node_modules/@ant-design/icons-vue/es/utils.js","../node_modules/@ant-design/icons-vue/es/components/IconBase.js","../node_modules/@ant-design/icons-vue/es/components/twoTonePrimaryColor.js","../node_modules/@ant-design/icons-vue/es/components/AntdIcon.js","../node_modules/@ant-design/icons-svg/es/asn/CloseOutlined.js","../node_modules/@ant-design/icons-vue/es/icons/CloseOutlined.js","../node_modules/@ant-design/icons-svg/es/asn/LoadingOutlined.js","../node_modules/@ant-design/icons-vue/es/icons/LoadingOutlined.js","../src/common/spin/Spin.vue","../src/common/spin/Spin.vue","../src/common/skeleton/Skeleton.vue","../src/common/skeleton/Skeleton.vue","../node_modules/@vue/shared/dist/shared.esm-bundler.js","../src/utils/withInstall.ts","../src/utils/props.ts","../src/setting/page-config/props.ts","../src/hooks/usePickComponentStyle.ts","../src/utils/constant.ts","../src/hooks/useOnEvent.ts","../src/hooks/useEmitEvent.ts","../src/hooks/useTransformChartDataByAttrValue.ts","../src/utils/request.ts","../src/utils/util.ts","../src/utils/runCode.ts","../src/hooks/useVariablesInText.ts","../src/hooks/useRequestData.ts","../src/hooks/useTransformChartDataByAttrKey.ts","../src/hooks/useImagePath.ts","../src/hooks/usePageUrl.ts","../src/hooks/useValueFormatter.ts","../src/hooks/useIndicatorData.ts","../src/hooks/useHrefParamsToGlobalVariables.ts","../src/setting/page-config/PageConfig.vue","../src/setting/page-config/PageConfig.vue","../src/setting/page-config/index.ts","../src/setting/provider-config/props.ts","../src/setting/provider-config/ProviderConfig.vue","../src/setting/provider-config/ProviderConfig.vue","../src/setting/provider-config/index.ts","../src/text/text/props.ts","../src/assets/go-up.png","../src/assets/go-down.png","../src/text/text/Text.vue","../src/text/text/Text.vue","../src/text/text/index.ts","../src/text/scroll-text/ScrollText.vue","../src/text/scroll-text/index.ts","../src/text/time-display/props.ts","../src/text/time-display/TimeDisplay.vue","../src/text/time-display/TimeDisplay.vue","../src/text/time-display/index.ts","../src/text/list/props.ts","../src/text/list/List.vue","../src/text/list/List.vue","../src/text/list/index.ts","../src/text/proportion/props.ts","../src/text/proportion/Proportion.vue","../src/text/proportion/Proportion.vue","../src/text/proportion/index.ts","../src/control/input/props.ts","../src/control/input/Input.vue","../src/control/input/Input.vue","../src/control/input/index.ts","../src/control/date-picker/props.ts","../src/control/date-picker/DatePicker.vue","../src/control/date-picker/DatePicker.vue","../src/control/date-picker/index.ts","../src/control/range-picker/props.ts","../src/control/range-picker/RangePicker.vue","../src/control/range-picker/RangePicker.vue","../src/control/range-picker/index.ts","../src/control/button/props.ts","../src/control/button/Button.vue","../src/control/button/Button.vue","../src/control/button/index.ts","../src/control/checkbox/props.ts","../src/control/checkbox/Checkbox.vue","../src/control/checkbox/Checkbox.vue","../src/control/checkbox/index.ts","../src/control/select/props.ts","../src/control/select/Select.vue","../src/control/select/Select.vue","../src/control/select/index.ts","../src/control/tree-select/props.ts","../src/control/tree-select/TreeSelect.vue","../src/control/tree-select/TreeSelect.vue","../src/control/tree-select/index.ts","../src/graph/pie/props.ts","../src/hooks/useDownloadFile.ts","../src/container/modal/props.ts","../src/container/modal/Modal.vue","../src/container/modal/Modal.vue","../src/container/modal/index.ts","../src/graph/pie/Pie.vue","../src/graph/pie/Pie.vue","../src/graph/pie/index.ts","../src/graph/line/props.ts","../src/graph/line/Line.vue","../src/graph/line/Line.vue","../src/graph/line/index.ts","../src/graph/bar/props.ts","../src/graph/bar/Bar.vue","../src/graph/bar/Bar.vue","../src/graph/bar/index.ts","../src/graph/scatter/props.ts","../src/graph/scatter/Scatter.vue","../src/graph/scatter/Scatter.vue","../src/graph/scatter/index.ts","../src/graph/custom-graph/props.ts","../src/graph/custom-graph/CustomGraph.vue","../src/graph/custom-graph/CustomGraph.vue","../src/graph/custom-graph/index.ts","../src/graph/combo-graph/props.ts","../src/graph/combo-graph/ComboGraph.vue","../src/graph/combo-graph/ComboGraph.vue","../src/graph/combo-graph/index.ts","../src/container/border/props.ts","../src/container/border/Border.vue","../src/assets/border-title-decoration-left.png","../src/assets/border-title-decoration-right.png","../src/container/border/Border.vue","../src/container/border/index.ts","../src/container/tabs/props.ts","../src/container/tabs/Tabs.vue","../src/container/tabs/Tabs.vue","../src/container/tabs/index.ts","../src/media/image/props.ts","../src/media/image/Image.vue","../src/media/image/Image.vue","../src/media/image/index.ts","../src/media/iframe/props.ts","../src/media/iframe/Iframe.vue","../src/media/iframe/Iframe.vue","../src/media/iframe/index.ts","../src/table/table/props.ts","../src/table/table/Table.vue","../src/table/table/Table.vue","../src/table/table/index.ts","../src/map/map/props.ts","../src/map/map/Map.vue","../src/map/map/Map.vue","../src/map/map/index.ts","../src/index.ts"],"sourcesContent":["import { Ref } from 'vue'\nimport { EChartsType, Option } from '../types'\n\nconst METHOD_NAMES = [\n 'getWidth',\n 'getHeight',\n 'getDom',\n 'getOption',\n 'resize',\n 'dispatchAction',\n 'convertToPixel',\n 'convertFromPixel',\n 'containPixel',\n 'getDataURL',\n 'getConnectedDataURL',\n 'appendData',\n 'clear',\n 'isDisposed',\n 'dispose'\n] as const\ntype MethodName = typeof METHOD_NAMES[number];\n\ntype PublicMethods = Pick<EChartsType, MethodName>;\n\nexport function usePublicAPI (\n chart: Ref<EChartsType | undefined>,\n init: (option?: Option) => void\n): PublicMethods {\n function makePublicMethod<T extends MethodName> (\n name: T\n ): (...args: Parameters<EChartsType[T]>) => ReturnType<EChartsType[T]> {\n return (...args) => {\n if (!chart.value) {\n init()\n }\n\n if (!chart.value) {\n throw new Error('ECharts is not initialized yet.')\n }\n return (chart.value[name] as any).apply(chart.value, args)\n }\n }\n\n function makePublicMethods (): PublicMethods {\n const methods = Object.create(null)\n METHOD_NAMES.forEach(name => {\n methods[name] = makePublicMethod(name)\n })\n\n return methods as PublicMethods\n }\n\n return makePublicMethods()\n}\n","import { Ref, watch } from 'vue'\nimport { throttle } from 'echarts/core'\nimport { addListener, removeListener, ResizeCallback } from 'resize-detector'\nimport { EChartsType } from '../types'\n\nexport function useAutoresize (\n chart: Ref<EChartsType | undefined>,\n autoresize: Ref<boolean>,\n root: Ref<HTMLElement | undefined>\n): void {\n let resizeListener: ResizeCallback | null = null\n\n watch([root, chart, autoresize], ([root, chart, autoresize], _, cleanup) => {\n if (root && chart && autoresize) {\n resizeListener = throttle(() => {\n chart.resize()\n }, 100)\n\n addListener(root, resizeListener)\n }\n\n cleanup(() => {\n if (resizeListener && root) {\n removeListener(root, resizeListener)\n }\n })\n })\n}\n\nexport const autoresizeProps = {\n autoresize: Boolean\n}\n","import { inject, unref, computed, Ref, watchEffect } from 'vue'\nimport { EChartsType } from '../types'\n\nexport const LOADING_OPTIONS_KEY = 'ecLoadingOptions'\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport function useLoading (\n chart: Ref<EChartsType | undefined>,\n loading: Ref<boolean>,\n loadingOptions: Ref<UnknownRecord | undefined>\n): void {\n const defaultLoadingOptions = inject(LOADING_OPTIONS_KEY, {}) as\n | UnknownRecord\n | Ref<UnknownRecord>\n const realLoadingOptions = computed(() => ({\n ...unref(defaultLoadingOptions),\n ...loadingOptions?.value\n }))\n\n watchEffect(() => {\n const instance = chart.value\n if (!instance) {\n return\n }\n\n if (loading.value) {\n instance.showLoading(realLoadingOptions.value)\n } else {\n instance.hideLoading()\n }\n })\n}\n\nexport const loadingProps = {\n loading: Boolean,\n loadingOptions: Object\n}\n","type Attrs = {\n [key: string]: any\n}\n\n// Copied from\n// https://github.com/vuejs/vue-next/blob/5a7a1b8293822219283d6e267496bec02234b0bc/packages/shared/src/index.ts#L40-L41\nconst onRE = /^on[^a-z]/\nexport const isOn = (key: string): boolean => onRE.test(key)\n\nexport function omitOn (attrs: Attrs): Attrs {\n const result: Attrs = {}\n for (const key in attrs) {\n if (!isOn(key)) {\n result[key] = attrs[key]\n }\n }\n\n return result\n}\n","// 此组件为 vue-echarts\n// 文档:https://github.com/ecomfe/vue-echarts/blob/main/README.zh-Hans.md\nimport {\n defineComponent,\n unref,\n shallowRef,\n toRefs,\n watch,\n computed,\n inject,\n onMounted,\n onUnmounted,\n h,\n nextTick,\n PropType,\n watchEffect\n} from 'vue'\nimport { init as initChart } from 'echarts/core'\nimport {\n EChartsType,\n Option,\n Theme,\n ThemeInjection,\n InitOptions,\n InitOptionsInjection,\n UpdateOptions,\n UpdateOptionsInjection\n} from './types'\nimport {\n usePublicAPI,\n useAutoresize,\n autoresizeProps,\n useLoading,\n loadingProps\n} from './composables'\nimport './style.css'\nimport { omitOn } from './utils'\n\nconst TAG_NAME = 'x-vue-echarts'\nexport const THEME_KEY = 'ecTheme'\nexport const INIT_OPTIONS_KEY = 'ecInitOptions'\nexport const UPDATE_OPTIONS_KEY = 'ecUpdateOptions'\nexport { LOADING_OPTIONS_KEY } from './composables'\n\n// @ts-ignore\nexport default defineComponent({\n name: 'echarts',\n props: {\n option: Object as PropType<Option>,\n theme: {\n type: [Object, String] as PropType<Theme>\n },\n initOptions: Object as PropType<InitOptions>,\n updateOptions: Object as PropType<UpdateOptions>,\n group: String,\n manualUpdate: Boolean,\n ...autoresizeProps,\n ...loadingProps\n },\n inheritAttrs: false,\n // @ts-expect-error listeners for Vue 2 compatibility\n setup (props, { attrs, listeners }) {\n const root = shallowRef<HTMLElement>()\n const chart = shallowRef<EChartsType>()\n const manualOption = shallowRef<Option>()\n const defaultTheme = inject(THEME_KEY, null) as ThemeInjection\n const defaultInitOptions = inject(\n INIT_OPTIONS_KEY,\n null\n ) as InitOptionsInjection\n const defaultUpdateOptions = inject(\n UPDATE_OPTIONS_KEY,\n null\n ) as UpdateOptionsInjection\n\n const { autoresize, manualUpdate, loading, loadingOptions } = toRefs(props)\n\n const realOption = computed(\n () => manualOption.value || props.option || Object.create(null)\n )\n const realTheme = computed(() => props.theme || unref(defaultTheme) || {})\n const realInitOptions = computed(\n () => props.initOptions || unref(defaultInitOptions) || {}\n )\n const realUpdateOptions = computed(\n () => props.updateOptions || unref(defaultUpdateOptions) || {}\n )\n const nonEventAttrs = computed(() => omitOn(attrs))\n\n function init (option?: Option) {\n if (chart.value || !root.value) {\n return\n }\n\n const instance = (chart.value = initChart(\n root.value,\n realTheme.value,\n realInitOptions.value\n ))\n\n if (props.group) {\n instance.group = props.group\n }\n\n let realListeners = listeners\n if (!realListeners) {\n realListeners = {}\n\n Object.keys(attrs)\n .filter(key => key.indexOf('on') === 0 && key.length > 2)\n .forEach(key => {\n // onClick -> c + lick\n // onZr:click -> z + r:click\n const event = key.charAt(2).toLowerCase() + key.slice(3)\n realListeners[event] = attrs[key]\n })\n }\n\n Object.keys(realListeners).forEach(key => {\n const handler = realListeners[key] as any\n\n if (!handler) {\n return\n }\n\n if (key.indexOf('zr:') === 0) {\n instance.getZr().on(key.slice(3).toLowerCase(), handler)\n } else {\n instance.on(key.toLowerCase(), handler)\n }\n })\n\n function resize () {\n if (instance && !instance.isDisposed()) {\n // temporarily suppress errors caused by https://github.com/apache/echarts/issues/14846\n try {\n instance.resize()\n } catch (e) {\n if (e.message === \"Cannot read property 'get' of undefined\") {\n return\n }\n\n throw e\n }\n }\n }\n\n function commit () {\n instance.setOption(option || realOption.value, realUpdateOptions.value)\n }\n\n if (autoresize.value) {\n // Try to make chart fit to container in case container size\n // is changed synchronously or in already queued microtasks\n nextTick(() => {\n resize()\n commit()\n })\n } else {\n commit()\n }\n }\n\n function setOption (option: Option, updateOptions?: UpdateOptions) {\n if (props.manualUpdate) {\n manualOption.value = option\n }\n\n if (!chart.value) {\n init(option)\n } else {\n chart.value.setOption(option, updateOptions || {})\n }\n }\n\n function cleanup () {\n if (chart.value) {\n chart.value.dispose()\n chart.value = undefined\n }\n }\n\n let unwatchOption: (() => void) | null = null\n watch(\n manualUpdate,\n manualUpdate => {\n if (typeof unwatchOption === 'function') {\n unwatchOption()\n unwatchOption = null\n }\n\n if (!manualUpdate) {\n unwatchOption = watch(\n () => props.option,\n option => {\n if (!option) {\n return\n }\n if (!chart.value) {\n init()\n } else {\n chart.value.setOption(option, realUpdateOptions.value)\n }\n },\n { deep: true }\n )\n }\n },\n {\n immediate: true\n }\n )\n\n watch(\n [realTheme, realInitOptions],\n () => {\n cleanup()\n init()\n },\n {\n deep: true\n }\n )\n\n watchEffect(() => {\n if (props.group && chart.value) {\n chart.value.group = props.group\n }\n })\n\n const publicApi = usePublicAPI(chart, init)\n\n useLoading(chart, loading, loadingOptions)\n\n useAutoresize(chart, autoresize, root)\n\n onMounted(() => {\n if (props.option) {\n init()\n }\n })\n\n onUnmounted(cleanup)\n\n return {\n chart,\n root,\n setOption,\n nonEventAttrs,\n ...publicApi\n }\n },\n render () {\n const attrs = { ...this.nonEventAttrs }\n attrs.ref = 'root'\n attrs.class = attrs.class ? ['echarts'].concat(attrs.class) : 'echarts'\n return h(TAG_NAME, attrs)\n }\n})\n","/**\n * Take input from [0, n] and return it as [0, 1]\n * @hidden\n */\nexport function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = '100%';\n }\n var isPercent = isPercentage(n);\n n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n)));\n // Automatically convert percentage into number\n if (isPercent) {\n n = parseInt(String(n * max), 10) / 100;\n }\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n // Convert into [0, 1] range if it isn't already\n if (max === 360) {\n // If n is a hue given in degrees,\n // wrap around out-of-range values into [0, 360] range\n // then convert into [0, 1].\n n = (n < 0 ? (n % max) + max : n % max) / parseFloat(String(max));\n }\n else {\n // If n not a hue given in degrees\n // Convert into [0, 1] range if it isn't already.\n n = (n % max) / parseFloat(String(max));\n }\n return n;\n}\n/**\n * Force a number between 0 and 1\n * @hidden\n */\nexport function clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n/**\n * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n * <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\n * @hidden\n */\nexport function isOnePointZero(n) {\n return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1;\n}\n/**\n * Check to see if string passed in is a percentage\n * @hidden\n */\nexport function isPercentage(n) {\n return typeof n === 'string' && n.indexOf('%') !== -1;\n}\n/**\n * Return a valid alpha value [0,1] with all invalid values being set to 1\n * @hidden\n */\nexport function boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n/**\n * Replace a decimal with it's percentage value\n * @hidden\n */\nexport function convertToPercentage(n) {\n if (n <= 1) {\n return \"\".concat(Number(n) * 100, \"%\");\n }\n return n;\n}\n/**\n * Force a hex value to have 2 characters\n * @hidden\n */\nexport function pad2(c) {\n return c.length === 1 ? '0' + c : String(c);\n}\n","import { bound01, pad2 } from './util';\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n/**\n * Handle bounds / percentage checking to conform to CSS color spec\n * <http://www.w3.org/TR/css3-color/>\n * *Assumes:* r, g, b in [0, 255] or [0, 1]\n * *Returns:* { r, g, b } in [0, 255]\n */\nexport function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255,\n };\n}\n/**\n * Converts an RGB color value to HSL.\n * *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n * *Returns:* { h, s, l } in [0,1]\n */\nexport function rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var s = 0;\n var l = (max + min) / 2;\n if (max === min) {\n s = 0;\n h = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, l: l };\n}\nfunction hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * (6 * t);\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n}\n/**\n * Converts an HSL color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hslToRgb(h, s, l) {\n var r;\n var g;\n var b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n if (s === 0) {\n // achromatic\n g = l;\n b = l;\n r = l;\n }\n else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color value to HSV\n *\n * *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n * *Returns:* { h, s, v } in [0,1]\n */\nexport function rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h = 0;\n var v = max;\n var d = max - min;\n var s = max === 0 ? 0 : d / max;\n if (max === min) {\n h = 0; // achromatic\n }\n else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n}\n/**\n * Converts an HSV color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h);\n var f = h - i;\n var p = v * (1 - s);\n var q = v * (1 - f * s);\n var t = v * (1 - (1 - f) * s);\n var mod = i % 6;\n var r = [v, q, p, p, t, v][mod];\n var g = [t, v, v, q, p, p][mod];\n var b = [p, p, t, v, v, q][mod];\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color to hex\n *\n * Assumes r, g, and b are contained in the set [0, 255]\n * Returns a 3 or 6 character hex\n */\nexport function rgbToHex(r, g, b, allow3Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n // Return a 3 character hex if possible\n if (allow3Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color plus alpha transparency to hex\n *\n * Assumes r, g, b are contained in the set [0, 255] and\n * a in [0, 1]. Returns a 4 or 8 character rgba hex\n */\n// eslint-disable-next-line max-params\nexport function rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n pad2(convertDecimalToHex(a)),\n ];\n // Return a 4 character hex if possible\n if (allow4Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1)) &&\n hex[3].startsWith(hex[3].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color to an ARGB Hex8 string\n * Rarely used, but required for \"toFilter()\"\n */\nexport function rgbaToArgbHex(r, g, b, a) {\n var hex = [\n pad2(convertDecimalToHex(a)),\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n return hex.join('');\n}\n/** Converts a decimal to a hex value */\nexport function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n/** Converts a hex value to a decimal */\nexport function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\n/** Parse a base-16 hex value into a base-10 integer */\nexport function parseIntFromHex(val) {\n return parseInt(val, 16);\n}\nexport function numberInputToObject(color) {\n return {\n r: color >> 16,\n g: (color & 0xff00) >> 8,\n b: color & 0xff,\n };\n}\n","// https://github.com/bahamas10/css-color-names/blob/master/css-color-names.json\n/**\n * @hidden\n */\nexport var names = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n goldenrod: '#daa520',\n gold: '#ffd700',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavenderblush: '#fff0f5',\n lavender: '#e6e6fa',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n};\n","/* eslint-disable @typescript-eslint/no-redundant-type-constituents */\nimport { convertHexToDecimal, hslToRgb, hsvToRgb, parseIntFromHex, rgbToRgb } from './conversion';\nimport { names } from './css-color-names';\nimport { boundAlpha, convertToPercentage } from './util';\n/**\n * Given a string or object, convert that input to RGB\n *\n * Possible string inputs:\n * ```\n * \"red\"\n * \"#f00\" or \"f00\"\n * \"#ff0000\" or \"ff0000\"\n * \"#ff000000\" or \"ff000000\"\n * \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n * \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n * \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n * \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n * \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n * \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n * \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n * ```\n */\nexport function inputToRGB(color) {\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color === 'string') {\n color = stringInputToObject(color);\n }\n if (typeof color === 'object') {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === '%' ? 'prgb' : 'rgb';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = 'hsv';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = 'hsl';\n }\n if (Object.prototype.hasOwnProperty.call(color, 'a')) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a,\n };\n}\n// <http://www.w3.org/TR/css3-values/#integers>\nvar CSS_INTEGER = '[-\\\\+]?\\\\d+%?';\n// <http://www.w3.org/TR/css3-values/#number-value>\nvar CSS_NUMBER = '[-\\\\+]?\\\\d*\\\\.\\\\d+%?';\n// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\nvar CSS_UNIT = \"(?:\".concat(CSS_NUMBER, \")|(?:\").concat(CSS_INTEGER, \")\");\n// Actual matching.\n// Parentheses and commas are optional, but not required.\n// Whitespace can take the place of commas or opening paren\nvar PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\".concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")[,|\\\\s]+(\").concat(CSS_UNIT, \")\\\\s*\\\\)?\");\nvar matchers = {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp('rgb' + PERMISSIVE_MATCH3),\n rgba: new RegExp('rgba' + PERMISSIVE_MATCH4),\n hsl: new RegExp('hsl' + PERMISSIVE_MATCH3),\n hsla: new RegExp('hsla' + PERMISSIVE_MATCH4),\n hsv: new RegExp('hsv' + PERMISSIVE_MATCH3),\n hsva: new RegExp('hsva' + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n};\n/**\n * Permissive string parsing. Take in a number of formats, and output an object\n * based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n */\nexport function stringInputToObject(color) {\n color = color.trim().toLowerCase();\n if (color.length === 0) {\n return false;\n }\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color === 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: 'name' };\n }\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match = matchers.rgb.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n match = matchers.rgba.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n match = matchers.hsl.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n match = matchers.hsla.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n match = matchers.hsv.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n match = matchers.hsva.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n match = matchers.hex8.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex6.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n match = matchers.hex4.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n a: convertHexToDecimal(match[4] + match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex3.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n return false;\n}\n/**\n * Check to see if it looks like a CSS unit\n * (see `matchers` above for definition).\n */\nexport function isValidCSSUnit(color) {\n return Boolean(matchers.CSS_UNIT.exec(String(color)));\n}\n","import { inputToRGB, rgbToHex, rgbToHsv } from '@ctrl/tinycolor';\n\nvar hueStep = 2; // 色相阶梯\n\nvar saturationStep = 0.16; // 饱和度阶梯,浅色部分\n\nvar saturationStep2 = 0.05; // 饱和度阶梯,深色部分\n\nvar brightnessStep1 = 0.05; // 亮度阶梯,浅色部分\n\nvar brightnessStep2 = 0.15; // 亮度阶梯,深色部分\n\nvar lightColorCount = 5; // 浅色数量,主色上\n\nvar darkColorCount = 4; // 深色数量,主色下\n// 暗色主题颜色映射关系表\n\nvar darkColorMap = [{\n index: 7,\n opacity: 0.15\n}, {\n index: 6,\n opacity: 0.25\n}, {\n index: 5,\n opacity: 0.3\n}, {\n index: 5,\n opacity: 0.45\n}, {\n index: 5,\n opacity: 0.65\n}, {\n index: 5,\n opacity: 0.85\n}, {\n index: 4,\n opacity: 0.9\n}, {\n index: 3,\n opacity: 0.95\n}, {\n index: 2,\n opacity: 0.97\n}, {\n index: 1,\n opacity: 0.98\n}]; // Wrapper function ported from TinyColor.prototype.toHsv\n// Keep it here because of `hsv.h * 360`\n\nfunction toHsv(_ref) {\n var r = _ref.r,\n g = _ref.g,\n b = _ref.b;\n var hsv = rgbToHsv(r, g, b);\n return {\n h: hsv.h * 360,\n s: hsv.s,\n v: hsv.v\n };\n} // Wrapper function ported from TinyColor.prototype.toHexString\n// Keep it here because of the prefix `#`\n\n\nfunction toHex(_ref2) {\n var r = _ref2.r,\n g = _ref2.g,\n b = _ref2.b;\n return \"#\".concat(rgbToHex(r, g, b, false));\n} // Wrapper function ported from TinyColor.prototype.mix, not treeshakable.\n// Amount in range [0, 1]\n// Assume color1 & color2 has no alpha, since the following src code did so.\n\n\nfunction mix(rgb1, rgb2, amount) {\n var p = amount / 100;\n var rgb = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b\n };\n return rgb;\n}\n\nfunction getHue(hsv, i, light) {\n var hue; // 根据色相不同,色相转向不同\n\n if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {\n hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i;\n } else {\n hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i;\n }\n\n if (hue < 0) {\n hue += 360;\n } else if (hue >= 360) {\n hue -= 360;\n }\n\n return hue;\n}\n\nfunction getSaturation(hsv, i, light) {\n // grey color don't change saturation\n if (hsv.h === 0 && hsv.s === 0) {\n return hsv.s;\n }\n\n var saturation;\n\n if (light) {\n saturation = hsv.s - saturationStep * i;\n } else if (i === darkColorCount) {\n saturation = hsv.s + saturationStep;\n } else {\n saturation = hsv.s + saturationStep2 * i;\n } // 边界值修正\n\n\n if (saturation > 1) {\n saturation = 1;\n } // 第一格的 s 限制在 0.06-0.1 之间\n\n\n if (light && i === lightColorCount && saturation > 0.1) {\n saturation = 0.1;\n }\n\n if (saturation < 0.06) {\n saturation = 0.06;\n }\n\n return Number(saturation.toFixed(2));\n}\n\nfunction getValue(hsv, i, light) {\n var value;\n\n if (light) {\n value = hsv.v + brightnessStep1 * i;\n } else {\n value = hsv.v - brightnessStep2 * i;\n }\n\n if (value > 1) {\n value = 1;\n }\n\n return Number(value.toFixed(2));\n}\n\nfunction generate(color) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var patterns = [];\n var pColor = inputToRGB(color);\n\n for (var i = lightColorCount; i > 0; i -= 1) {\n var hsv = toHsv(pColor);\n var colorString = toHex(inputToRGB({\n h: getHue(hsv, i, true),\n s: getSaturation(hsv, i, true),\n v: getValue(hsv, i, true)\n }));\n patterns.push(colorString);\n }\n\n patterns.push(toHex(pColor));\n\n for (var _i = 1; _i <= darkColorCount; _i += 1) {\n var _hsv = toHsv(pColor);\n\n var _colorString = toHex(inputToRGB({\n h: getHue(_hsv, _i),\n s: getSaturation(_hsv, _i),\n v: getValue(_hsv, _i)\n }));\n\n patterns.push(_colorString);\n } // dark theme patterns\n\n\n if (opts.theme === 'dark') {\n return darkColorMap.map(function (_ref3) {\n var index = _ref3.index,\n opacity = _ref3.opacity;\n var darkColorString = toHex(mix(inputToRGB(opts.backgroundColor || '#141414'), inputToRGB(patterns[index]), opacity * 100));\n return darkColorString;\n });\n }\n\n return patterns;\n}\n\nvar presetPrimaryColors = {\n red: '#F5222D',\n volcano: '#FA541C',\n orange: '#FA8C16',\n gold: '#FAAD14',\n yellow: '#FADB14',\n lime: '#A0D911',\n green: '#52C41A',\n cyan: '#13C2C2',\n blue: '#1890FF',\n geekblue: '#2F54EB',\n purple: '#722ED1',\n magenta: '#EB2F96',\n grey: '#666666'\n};\nvar presetPalettes = {};\nvar presetDarkPalettes = {};\nObject.keys(presetPrimaryColors).forEach(function (key) {\n presetPalettes[key] = generate(presetPrimaryColors[key]);\n presetPalettes[key].primary = presetPalettes[key][5]; // dark presetPalettes\n\n presetDarkPalettes[key] = generate(presetPrimaryColors[key], {\n theme: 'dark',\n backgroundColor: '#141414'\n });\n presetDarkPalettes[key].primary = presetDarkPalettes[key][5];\n});\nvar red = presetPalettes.red;\nvar volcano = presetPalettes.volcano;\nvar gold = presetPalettes.gold;\nvar orange = presetPalettes.orange;\nvar yellow = presetPalettes.yellow;\nvar lime = presetPalettes.lime;\nvar green = presetPalettes.green;\nvar cyan = presetPalettes.cyan;\nvar blue = presetPalettes.blue;\nvar geekblue = presetPalettes.geekblue;\nvar purple = presetPalettes.purple;\nvar magenta = presetPalettes.magenta;\nvar grey = presetPalettes.grey;\n\nexport { blue, cyan, geekblue, generate, gold, green, grey, lime, magenta, orange, presetDarkPalettes, presetPalettes, presetPrimaryColors, purple, red, volcano, yellow };\n","// https://github.com/substack/insert-css\nvar containers = []; // will store container HTMLElement references\n\nvar styleElements = []; // will store {prepend: HTMLElement, append: HTMLElement}\n\nvar usage = 'insert-css: You need to provide a CSS string. Usage: insertCss(cssString[, options]).';\n\nfunction createStyleElement() {\n var styleElement = document.createElement('style');\n styleElement.setAttribute('type', 'text/css');\n return styleElement;\n} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\nfunction insertCss(css, options) {\n options = options || {};\n\n if (css === undefined) {\n throw new Error(usage);\n }\n\n var position = options.prepend === true ? 'prepend' : 'append';\n var container = options.container !== undefined ? options.container : document.querySelector('head');\n var containerId = containers.indexOf(container); // first time we see this container, create the necessary entries\n\n if (containerId === -1) {\n containerId = containers.push(container) - 1;\n styleElements[containerId] = {};\n } // try to get the correponding container + position styleElement, create it otherwise\n\n\n var styleElement;\n\n if (styleElements[containerId] !== undefined && styleElements[containerId][position] !== undefined) {\n styleElement = styleElements[containerId][position];\n } else {\n styleElement = styleElements[containerId][position] = createStyleElement();\n\n if (position === 'prepend') {\n container.insertBefore(styleElement, container.childNodes[0]);\n } else {\n container.appendChild(styleElement);\n }\n } // strip potential UTF-8 BOM if css was read from a file\n\n\n if (css.charCodeAt(0) === 0xfeff) {\n css = css.substr(1, css.length);\n } // actually add the stylesheet\n\n\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText += css;\n } else {\n styleElement.textContent += css;\n }\n\n return styleElement;\n}\n\nexport default insertCss;","function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport { nextTick, h } from 'vue';\nimport { generate as generateColor } from '@ant-design/colors';\nimport insertCss from './insert-css';\nexport function warn(valid, message) {\n // Support uglify\n if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) {\n console.error(\"Warning: \".concat(message));\n }\n}\nexport function warning(valid, message) {\n warn(valid, \"[@ant-design/icons-vue] \".concat(message));\n} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nexport function isIconDefinition(target) {\n return typeof target === 'object' && typeof target.name === 'string' && typeof target.theme === 'string' && (typeof target.icon === 'object' || typeof target.icon === 'function');\n}\nexport function normalizeAttrs() {\n var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return Object.keys(attrs).reduce(function (acc, key) {\n var val = attrs[key];\n\n switch (key) {\n case 'class':\n acc.className = val;\n delete acc[\"class\"];\n break;\n\n default:\n acc[key] = val;\n }\n\n return acc;\n }, {});\n}\nexport function generate(node, key, rootProps) {\n if (!rootProps) {\n return h(node.tag, _objectSpread({\n key: key\n }, node.attrs), (node.children || []).map(function (child, index) {\n return generate(child, \"\".concat(key, \"-\").concat(node.tag, \"-\").concat(index));\n }));\n }\n\n return h(node.tag, _objectSpread({\n key: key\n }, rootProps, node.attrs), (node.children || []).map(function (child, index) {\n return generate(child, \"\".concat(key, \"-\").concat(node.tag, \"-\").concat(index));\n }));\n}\nexport function getSecondaryColor(primaryColor) {\n // choose the second color\n return generateColor(primaryColor)[0];\n}\nexport function normalizeTwoToneColors(twoToneColor) {\n if (!twoToneColor) {\n return [];\n }\n\n return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor];\n} // These props make sure that the SVG behaviours like general text.\n// Reference: https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4\n\nexport var svgBaseProps = {\n width: '1em',\n height: '1em',\n fill: 'currentColor',\n 'aria-hidden': 'true',\n focusable: 'false'\n};\nexport var iconStyles = \"\\n.anticon {\\n display: inline-block;\\n color: inherit;\\n font-style: normal;\\n line-height: 0;\\n text-align: center;\\n text-transform: none;\\n vertical-align: -0.125em;\\n text-rendering: optimizeLegibility;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n\\n.anticon > * {\\n line-height: 1;\\n}\\n\\n.anticon svg {\\n display: inline-block;\\n}\\n\\n.anticon::before {\\n display: none;\\n}\\n\\n.anticon .anticon-icon {\\n display: block;\\n}\\n\\n.anticon[tabindex] {\\n cursor: pointer;\\n}\\n\\n.anticon-spin::before,\\n.anticon-spin {\\n display: inline-block;\\n -webkit-animation: loadingCircle 1s infinite linear;\\n animation: loadingCircle 1s infinite linear;\\n}\\n\\n@-webkit-keyframes loadingCircle {\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes loadingCircle {\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\";\nvar cssInjectedFlag = false;\nexport var useInsertStyles = function useInsertStyles() {\n var styleStr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : iconStyles;\n nextTick(function () {\n if (!cssInjectedFlag) {\n if (typeof window !== 'undefined' && window.document && window.document.documentElement) {\n insertCss(styleStr, {\n prepend: true\n });\n }\n\n cssInjectedFlag = true;\n }\n });\n};","var _excluded = [\"icon\", \"primaryColor\", \"secondaryColor\"];\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport { generate, getSecondaryColor, isIconDefinition, warning, useInsertStyles } from '../utils';\nvar twoToneColorPalette = {\n primaryColor: '#333',\n secondaryColor: '#E6E6E6',\n calculated: false\n};\n\nfunction setTwoToneColors(_ref) {\n var primaryColor = _ref.primaryColor,\n secondaryColor = _ref.secondaryColor;\n twoToneColorPalette.primaryColor = primaryColor;\n twoToneColorPalette.secondaryColor = secondaryColor || getSecondaryColor(primaryColor);\n twoToneColorPalette.calculated = !!secondaryColor;\n}\n\nfunction getTwoToneColors() {\n return _objectSpread({}, twoToneColorPalette);\n}\n\nvar IconBase = function IconBase(props, context) {\n var _props$context$attrs = _objectSpread({}, props, context.attrs),\n icon = _props$context$attrs.icon,\n primaryColor = _props$context$attrs.primaryColor,\n secondaryColor = _props$context$attrs.secondaryColor,\n restProps = _objectWithoutProperties(_props$context$attrs, _excluded);\n\n var colors = twoToneColorPalette;\n\n if (primaryColor) {\n colors = {\n primaryColor: primaryColor,\n secondaryColor: secondaryColor || getSecondaryColor(primaryColor)\n };\n }\n\n useInsertStyles();\n warning(isIconDefinition(icon), \"icon should be icon definiton, but got \".concat(icon));\n\n if (!isIconDefinition(icon)) {\n return null;\n }\n\n var target = icon;\n\n if (target && typeof target.icon === 'function') {\n target = _objectSpread({}, target, {\n icon: target.icon(colors.primaryColor, colors.secondaryColor)\n });\n }\n\n return generate(target.icon, \"svg-\".concat(target.name), _objectSpread({}, restProps, {\n 'data-icon': target.name,\n width: '1em',\n height: '1em',\n fill: 'currentColor',\n 'aria-hidden': 'true'\n })); // },\n};\n\nIconBase.props = {\n icon: Object,\n primaryColor: String,\n secondaryColor: String,\n focusable: String\n};\nIconBase.inheritAttrs = false;\nIconBase.displayName = 'IconBase';\nIconBase.getTwoToneColors = getTwoToneColors;\nIconBase.setTwoToneColors = setTwoToneColors;\nexport default IconBase;","function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nimport VueIcon from './IconBase';\nimport { normalizeTwoToneColors } from '../utils';\nexport function setTwoToneColor(twoToneColor) {\n var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor),\n _normalizeTwoToneColo2 = _slicedToArray(_normalizeTwoToneColo, 2),\n primaryColor = _normalizeTwoToneColo2[0],\n secondaryColor = _normalizeTwoToneColo2[1];\n\n return VueIcon.setTwoToneColors({\n primaryColor: primaryColor,\n secondaryColor: secondaryColor\n });\n}\nexport function getTwoToneColor() {\n var colors = VueIcon.getTwoToneColors();\n\n if (!colors.calculated) {\n return colors.primaryColor;\n }\n\n return [colors.primaryColor, colors.secondaryColor];\n}","var _excluded = [\"class\", \"icon\", \"spin\", \"rotate\", \"tabindex\", \"twoToneColor\", \"onClick\"];\nimport { createVNode as _createVNode } from \"vue\";\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport VueIcon from './IconBase';\nimport { getTwoToneColor, setTwoToneColor } from './twoTonePrimaryColor';\nimport { normalizeTwoToneColors } from '../utils'; // Initial setting\n\nsetTwoToneColor('#1890ff');\n\nvar Icon = function Icon(props, context) {\n var _classObj;\n\n var _props$context$attrs = _objectSpread({}, props, context.attrs),\n cls = _props$context$attrs[\"class\"],\n icon = _props$context$attrs.icon,\n spin = _props$context$attrs.spin,\n rotate = _props$context$attrs.rotate,\n tabindex = _props$context$attrs.tabindex,\n twoToneColor = _props$context$attrs.twoToneColor,\n onClick = _props$context$attrs.onClick,\n restProps = _objectWithoutProperties(_props$context$attrs, _excluded);\n\n var classObj = (_classObj = {\n anticon: true\n }, _defineProperty(_classObj, \"anticon-\".concat(icon.name), Boolean(icon.name)), _defineProperty(_classObj, cls, cls), _classObj);\n var svgClassString = spin === '' || !!spin || icon.name === 'loading' ? 'anticon-spin' : '';\n var iconTabIndex = tabindex;\n\n if (iconTabIndex === undefined && onClick) {\n iconTabIndex = -1;\n restProps.tabindex = iconTabIndex;\n }\n\n var svgStyle = rotate ? {\n msTransform: \"rotate(\".concat(rotate, \"deg)\"),\n transform: \"rotate(\".concat(rotate, \"deg)\")\n } : undefined;\n\n var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor),\n _normalizeTwoToneColo2 = _slicedToArray(_normalizeTwoToneColo, 2),\n primaryColor = _normalizeTwoToneColo2[0],\n secondaryColor = _normalizeTwoToneColo2[1];\n\n return _createVNode(\"span\", _objectSpread({\n \"role\": \"img\",\n \"aria-label\": icon.name\n }, restProps, {\n \"onClick\": onClick,\n \"class\": classObj\n }), [_createVNode(VueIcon, {\n \"class\": svgClassString,\n \"icon\": icon,\n \"primaryColor\": primaryColor,\n \"secondaryColor\": secondaryColor,\n \"style\": svgStyle\n }, null)]);\n};\n\nIcon.props = {\n spin: Boolean,\n rotate: Number,\n icon: Object,\n twoToneColor: String\n};\nIcon.displayName = 'AntdIcon';\nIcon.inheritAttrs = false;\nIcon.getTwoToneColor = getTwoToneColor;\nIcon.setTwoToneColor = setTwoToneColor;\nexport default Icon;","// This icon file is generated automatically.\nvar CloseOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z\" } }] }, \"name\": \"close\", \"theme\": \"outlined\" };\nexport default CloseOutlined;\n","import { createVNode as _createVNode } from \"vue\";\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\nimport CloseOutlinedSvg from \"@ant-design/icons-svg/es/asn/CloseOutlined\";\nimport AntdIcon from '../components/AntdIcon';\n\nvar CloseOutlined = function CloseOutlined(props, context) {\n var p = _objectSpread({}, props, context.attrs);\n\n return _createVNode(AntdIcon, _objectSpread({}, p, {\n \"icon\": CloseOutlinedSvg\n }), null);\n};\n\nCloseOutlined.displayName = 'CloseOutlined';\nCloseOutlined.inheritAttrs = false;\nexport default CloseOutlined;","// This icon file is generated automatically.\nvar LoadingOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"0 0 1024 1024\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z\" } }] }, \"name\": \"loading\", \"theme\": \"outlined\" };\nexport default LoadingOutlined;\n","import { createVNode as _createVNode } from \"vue\";\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\nimport LoadingOutlinedSvg from \"@ant-design/icons-svg/es/asn/LoadingOutlined\";\nimport AntdIcon from '../components/AntdIcon';\n\nvar LoadingOutlined = function LoadingOutlined(props, context) {\n var p = _objectSpread({}, props, context.attrs);\n\n return _createVNode(AntdIcon, _objectSpread({}, p, {\n \"icon\": LoadingOutlinedSvg\n }), null);\n};\n\nLoadingOutlined.displayName = 'LoadingOutlined';\nLoadingOutlined.inheritAttrs = false;\nexport default LoadingOutlined;","<template>\n <div class=\"spin-wrapper\">\n <a-spin\n class=\"spin\"\n :spinning=\"spinning\"\n v-if=\"spinning\"\n :indicator=\"indicator\"\n tip=\"加载中...\"\n >\n </a-spin>\n <slot v-else></slot>\n </div>\n</template>\n<script lang=\"ts\">\nimport { Spin as ASpin } from 'ant-design-vue'\nimport { LoadingOutlined } from '@ant-design/icons-vue'\nimport { defineComponent, h } from 'vue'\nimport 'ant-design-vue/es/spin/style'\nexport default defineComponent({\n props: {\n spinning: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ASpin\n },\n setup () {\n const indicator = h(LoadingOutlined, {\n style: {\n fontSize: '24px',\n color: '#1890ff'\n },\n spin: true\n })\n return {\n indicator\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n .spin {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n</style>\n","<template>\n <div class=\"spin-wrapper\">\n <a-spin\n class=\"spin\"\n :spinning=\"spinning\"\n v-if=\"spinning\"\n :indicator=\"indicator\"\n tip=\"加载中...\"\n >\n </a-spin>\n <slot v-else></slot>\n </div>\n</template>\n<script lang=\"ts\">\nimport { Spin as ASpin } from 'ant-design-vue'\nimport { LoadingOutlined } from '@ant-design/icons-vue'\nimport { defineComponent, h } from 'vue'\nimport 'ant-design-vue/es/spin/style'\nexport default defineComponent({\n props: {\n spinning: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ASpin\n },\n setup () {\n const indicator = h(LoadingOutlined, {\n style: {\n fontSize: '24px',\n color: '#1890ff'\n },\n spin: true\n })\n return {\n indicator\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n .spin {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n}\n</style>\n","<template>\n <a-skeleton active :loading=\"loading\">\n <slot></slot>\n </a-skeleton>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { Skeleton as ASkeleton } from 'ant-design-vue'\nimport 'ant-design-vue/es/skeleton/style'\nexport default defineComponent({\n name: 'Skeleton',\n props: {\n loading: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ASkeleton\n }\n})\n</script>\n\n<style scoped>\n\n</style>\n","<template>\n <a-skeleton active :loading=\"loading\">\n <slot></slot>\n </a-skeleton>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { Skeleton as ASkeleton } from 'ant-design-vue'\nimport 'ant-design-vue/es/skeleton/style'\nexport default defineComponent({\n name: 'Skeleton',\n props: {\n loading: {\n type: Boolean,\n default: false\n }\n },\n components: {\n ASkeleton\n }\n})\n</script>\n\n<style scoped>\n\n</style>\n","/**\r\n * Make a map and return a function for checking if a key\r\n * is in that map.\r\n * IMPORTANT: all calls of this function must be prefixed with\r\n * \\/\\*#\\_\\_PURE\\_\\_\\*\\/\r\n * So that rollup can tree-shake them if necessary.\r\n */\r\nfunction makeMap(str, expectsLowerCase) {\r\n const map = Object.create(null);\r\n const list = str.split(',');\r\n for (let i = 0; i < list.length; i++) {\r\n map[list[i]] = true;\r\n }\r\n return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];\r\n}\n\n/**\r\n * dev only flag -> name mapping\r\n */\r\nconst PatchFlagNames = {\r\n [1 /* TEXT */]: `TEXT`,\r\n [2 /* CLASS */]: `CLASS`,\r\n [4 /* STYLE */]: `STYLE`,\r\n [8 /* PROPS */]: `PROPS`,\r\n [16 /* FULL_PROPS */]: `FULL_PROPS`,\r\n [32 /* HYDRATE_EVENTS */]: `HYDRATE_EVENTS`,\r\n [64 /* STABLE_FRAGMENT */]: `STABLE_FRAGMENT`,\r\n [128 /* KEYED_FRAGMENT */]: `KEYED_FRAGMENT`,\r\n [256 /* UNKEYED_FRAGMENT */]: `UNKEYED_FRAGMENT`,\r\n [512 /* NEED_PATCH */]: `NEED_PATCH`,\r\n [1024 /* DYNAMIC_SLOTS */]: `DYNAMIC_SLOTS`,\r\n [2048 /* DEV_ROOT_FRAGMENT */]: `DEV_ROOT_FRAGMENT`,\r\n [-1 /* HOISTED */]: `HOISTED`,\r\n [-2 /* BAIL */]: `BAIL`\r\n};\n\n/**\r\n * Dev only\r\n */\r\nconst slotFlagsText = {\r\n [1 /* STABLE */]: 'STABLE',\r\n [2 /* DYNAMIC */]: 'DYNAMIC',\r\n [3 /* FORWARDED */]: 'FORWARDED'\r\n};\n\nconst GLOBALS_WHITE_LISTED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +\r\n 'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +\r\n 'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt';\r\nconst isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED);\n\nconst range = 2;\r\nfunction generateCodeFrame(source, start = 0, end = source.length) {\r\n // Split the content into individual lines but capture the newline sequence\r\n // that separated each line. This is important because the actual sequence is\r\n // needed to properly take into account the full line length for offset\r\n // comparison\r\n let lines = source.split(/(\\r?\\n)/);\r\n // Separate the lines and newline sequences into separate arrays for easier referencing\r\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\r\n lines = lines.filter((_, idx) => idx % 2 === 0);\r\n let count = 0;\r\n const res = [];\r\n for (let i = 0; i < lines.length; i++) {\r\n count +=\r\n lines[i].length +\r\n ((newlineSequences[i] && newlineSequences[i].length) || 0);\r\n if (count >= start) {\r\n for (let j = i - range; j <= i + range || end > count; j++) {\r\n if (j < 0 || j >= lines.length)\r\n continue;\r\n const line = j + 1;\r\n res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);\r\n const lineLength = lines[j].length;\r\n const newLineSeqLength = (newlineSequences[j] && newlineSequences[j].length) || 0;\r\n if (j === i) {\r\n // push underline\r\n const pad = start - (count - (lineLength + newLineSeqLength));\r\n const length = Math.max(1, end > count ? lineLength - pad : end - start);\r\n res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));\r\n }\r\n else if (j > i) {\r\n if (end > count) {\r\n const length = Math.max(Math.min(end - count, lineLength), 1);\r\n res.push(` | ` + '^'.repeat(length));\r\n }\r\n count += lineLength + newLineSeqLength;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return res.join('\\n');\r\n}\n\n/**\r\n * On the client we only need to offer special cases for boolean attributes that\r\n * have different names from their corresponding dom properties:\r\n * - itemscope -> N/A\r\n * - allowfullscreen -> allowFullscreen\r\n * - formnovalidate -> formNoValidate\r\n * - ismap -> isMap\r\n * - nomodule -> noModule\r\n * - novalidate -> noValidate\r\n * - readonly -> readOnly\r\n */\r\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\r\nconst isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs);\r\n/**\r\n * The full list is needed during SSR to produce the correct initial markup.\r\n */\r\nconst isBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs +\r\n `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,` +\r\n `loop,open,required,reversed,scoped,seamless,` +\r\n `checked,muted,multiple,selected`);\r\n/**\r\n * Boolean attributes should be included if the value is truthy or ''.\r\n * e.g. `<select multiple>` compiles to `{ multiple: '' }`\r\n */\r\nfunction includeBooleanAttr(value) {\r\n return !!value || value === '';\r\n}\r\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\r\nconst attrValidationCache = {};\r\nfunction isSSRSafeAttrName(name) {\r\n if (attrValidationCache.hasOwnProperty(name)) {\r\n return attrValidationCache[name];\r\n }\r\n const isUnsafe = unsafeAttrCharRE.test(name);\r\n if (isUnsafe) {\r\n console.error(`unsafe attribute name: ${name}`);\r\n }\r\n return (attrValidationCache[name] = !isUnsafe);\r\n}\r\nconst propsToAttrMap = {\r\n acceptCharset: 'accept-charset',\r\n className: 'class',\r\n htmlFor: 'for',\r\n httpEquiv: 'http-equiv'\r\n};\r\n/**\r\n * CSS properties that accept plain numbers\r\n */\r\nconst isNoUnitNumericStyleProp = /*#__PURE__*/ makeMap(`animation-iteration-count,border-image-outset,border-image-slice,` +\r\n `border-image-width,box-flex,box-flex-group,box-ordinal-group,column-count,` +\r\n `columns,flex,flex-grow,flex-positive,flex-shrink,flex-negative,flex-order,` +\r\n `grid-row,grid-row-end,grid-row-span,grid-row-start,grid-column,` +\r\n `grid-column-end,grid-column-span,grid-column-start,font-weight,line-clamp,` +\r\n `line-height,opacity,order,orphans,tab-size,widows,z-index,zoom,` +\r\n // SVG\r\n `fill-opacity,flood-opacity,stop-opacity,stroke-dasharray,stroke-dashoffset,` +\r\n `stroke-miterlimit,stroke-opacity,stroke-width`);\r\n/**\r\n * Known attributes, this is used for stringification of runtime static nodes\r\n * so that we don't stringify bindings that cannot be set from HTML.\r\n * Don't also forget to allow `data-*` and `aria-*`!\r\n * Generated from https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes\r\n */\r\nconst isKnownHtmlAttr = /*#__PURE__*/ makeMap(`accept,accept-charset,accesskey,action,align,allow,alt,async,` +\r\n `autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,` +\r\n `border,buffered,capture,challenge,charset,checked,cite,class,code,` +\r\n `codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,` +\r\n `coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,` +\r\n `disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,` +\r\n `formaction,formenctype,formmethod,formnovalidate,formtarget,headers,` +\r\n `height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,` +\r\n `ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,` +\r\n `manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,` +\r\n `open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,` +\r\n `referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,` +\r\n `selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,` +\r\n `start,step,style,summary,tabindex,target,title,translate,type,usemap,` +\r\n `value,width,wrap`);\r\n/**\r\n * Generated from https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute\r\n */\r\nconst isKnownSvgAttr = /*#__PURE__*/ makeMap(`xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,` +\r\n `arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,` +\r\n `baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,` +\r\n `clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,` +\r\n `color-interpolation-filters,color-profile,color-rendering,` +\r\n `contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,` +\r\n `descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,` +\r\n `dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,` +\r\n `fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,` +\r\n `font-family,font-size,font-size-adjust,font-stretch,font-style,` +\r\n `font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,` +\r\n `glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,` +\r\n `gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,` +\r\n `horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,` +\r\n `k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,` +\r\n `lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,` +\r\n `marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,` +\r\n `mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,` +\r\n `name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,` +\r\n `overflow,overline-position,overline-thickness,panose-1,paint-order,path,` +\r\n `pathLength,patternContentUnits,patternTransform,patternUnits,ping,` +\r\n `pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,` +\r\n `preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,` +\r\n `rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,` +\r\n `restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,` +\r\n `specularConstant,specularExponent,speed,spreadMethod,startOffset,` +\r\n `stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,` +\r\n `strikethrough-position,strikethrough-thickness,string,stroke,` +\r\n `stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,` +\r\n `stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,` +\r\n `systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,` +\r\n `text-decoration,text-rendering,textLength,to,transform,transform-origin,` +\r\n `type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,` +\r\n `unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,` +\r\n `v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,` +\r\n `vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,` +\r\n `writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,` +\r\n `xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,` +\r\n `xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`);\n\nfunction normalizeStyle(value) {\r\n if (isArray(value)) {\r\n const res = {};\r\n for (let i = 0; i < value.length; i++) {\r\n const item = value[i];\r\n const normalized = isString(item)\r\n ? parseStringStyle(item)\r\n : normalizeStyle(item);\r\n if (normalized) {\r\n for (const key in normalized) {\r\n res[key] = normalized[key];\r\n }\r\n }\r\n }\r\n return res;\r\n }\r\n else if (isString(value)) {\r\n return value;\r\n }\r\n else if (isObject(value)) {\r\n return value;\r\n }\r\n}\r\nconst listDelimiterRE = /;(?![^(]*\\))/g;\r\nconst propertyDelimiterRE = /:(.+)/;\r\nfunction parseStringStyle(cssText) {\r\n const ret = {};\r\n cssText.split(listDelimiterRE).forEach(item => {\r\n if (item) {\r\n const tmp = item.split(propertyDelimiterRE);\r\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\r\n }\r\n });\r\n return ret;\r\n}\r\nfunction stringifyStyle(styles) {\r\n let ret = '';\r\n if (!styles || isString(styles)) {\r\n return ret;\r\n }\r\n for (const key in styles) {\r\n const value = styles[key];\r\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\r\n if (isString(value) ||\r\n (typeof value === 'number' && isNoUnitNumericStyleProp(normalizedKey))) {\r\n // only render valid values\r\n ret += `${normalizedKey}:${value};`;\r\n }\r\n }\r\n return ret;\r\n}\r\nfunction normalizeClass(value) {\r\n let res = '';\r\n if (isString(value)) {\r\n res = value;\r\n }\r\n else if (isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n const normalized = normalizeClass(value[i]);\r\n if (normalized) {\r\n res += normalized + ' ';\r\n }\r\n }\r\n }\r\n else if (isObject(value)) {\r\n for (const name in value) {\r\n if (value[name]) {\r\n res += name + ' ';\r\n }\r\n }\r\n }\r\n return res.trim();\r\n}\r\nfunction normalizeProps(props) {\r\n if (!props)\r\n return null;\r\n let { class: klass, style } = props;\r\n if (klass && !isString(klass)) {\r\n props.class = normalizeClass(klass);\r\n }\r\n if (style) {\r\n props.style = normalizeStyle(style);\r\n }\r\n return props;\r\n}\n\n// These tag configs are shared between compiler-dom and runtime-dom, so they\r\n// https://developer.mozilla.org/en-US/docs/Web/HTML/Element\r\nconst HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +\r\n 'header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,' +\r\n 'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +\r\n 'data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,' +\r\n 'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +\r\n 'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +\r\n 'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +\r\n 'option,output,progress,select,textarea,details,dialog,menu,' +\r\n 'summary,template,blockquote,iframe,tfoot';\r\n// https://developer.mozilla.org/en-US/docs/Web/SVG/Element\r\nconst SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +\r\n 'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +\r\n 'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +\r\n 'feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +\r\n 'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +\r\n 'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +\r\n 'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +\r\n 'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +\r\n 'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +\r\n 'text,textPath,title,tspan,unknown,use,view';\r\nconst VOID_TAGS = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';\r\nconst isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS);\r\nconst isSVGTag = /*#__PURE__*/ makeMap(SVG_TAGS);\r\nconst isVoidTag = /*#__PURE__*/ makeMap(VOID_TAGS);\n\nconst escapeRE = /[\"'&<>]/;\r\nfunction escapeHtml(string) {\r\n const str = '' + string;\r\n const match = escapeRE.exec(str);\r\n if (!match) {\r\n return str;\r\n }\r\n let html = '';\r\n let escaped;\r\n let index;\r\n let lastIndex = 0;\r\n for (index = match.index; index < str.length; index++) {\r\n switch (str.charCodeAt(index)) {\r\n case 34: // \"\r\n escaped = '&quot;';\r\n break;\r\n case 38: // &\r\n escaped = '&amp;';\r\n break;\r\n case 39: // '\r\n escaped = '&#39;';\r\n break;\r\n case 60: // <\r\n escaped = '&lt;';\r\n break;\r\n case 62: // >\r\n escaped = '&gt;';\r\n break;\r\n default:\r\n continue;\r\n }\r\n if (lastIndex !== index) {\r\n html += str.slice(lastIndex, index);\r\n }\r\n lastIndex = index + 1;\r\n html += escaped;\r\n }\r\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\r\n}\r\n// https://www.w3.org/TR/html52/syntax.html#comments\r\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\r\nfunction escapeHtmlComment(src) {\r\n return src.replace(commentStripRE, '');\r\n}\n\nfunction looseCompareArrays(a, b) {\r\n if (a.length !== b.length)\r\n return false;\r\n let equal = true;\r\n for (let i = 0; equal && i < a.length; i++) {\r\n equal = looseEqual(a[i], b[i]);\r\n }\r\n return equal;\r\n}\r\nfunction looseEqual(a, b) {\r\n if (a === b)\r\n return true;\r\n let aValidType = isDate(a);\r\n let bValidType = isDate(b);\r\n if (aValidType || bValidType) {\r\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\r\n }\r\n aValidType = isArray(a);\r\n bValidType = isArray(b);\r\n if (aValidType || bValidType) {\r\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\r\n }\r\n aValidType = isObject(a);\r\n bValidType = isObject(b);\r\n if (aValidType || bValidType) {\r\n /* istanbul ignore if: this if will probably never be called */\r\n if (!aValidType || !bValidType) {\r\n return false;\r\n }\r\n const aKeysCount = Object.keys(a).length;\r\n const bKeysCount = Object.keys(b).length;\r\n if (aKeysCount !== bKeysCount) {\r\n return false;\r\n }\r\n for (const key in a) {\r\n const aHasKey = a.hasOwnProperty(key);\r\n const bHasKey = b.hasOwnProperty(key);\r\n if ((aHasKey && !bHasKey) ||\r\n (!aHasKey && bHasKey) ||\r\n !looseEqual(a[key], b[key])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return String(a) === String(b);\r\n}\r\nfunction looseIndexOf(arr, val) {\r\n return arr.findIndex(item => looseEqual(item, val));\r\n}\n\n/**\r\n * For converting {{ interpolation }} values to displayed strings.\r\n * @private\r\n */\r\nconst toDisplayString = (val) => {\r\n return val == null\r\n ? ''\r\n : isArray(val) ||\r\n (isObject(val) &&\r\n (val.toString === objectToString || !isFunction(val.toString)))\r\n ? JSON.stringify(val, replacer, 2)\r\n : String(val);\r\n};\r\nconst replacer = (_key, val) => {\r\n // can't use isRef here since @vue/shared has no deps\r\n if (val && val.__v_isRef) {\r\n return replacer(_key, val.value);\r\n }\r\n else if (isMap(val)) {\r\n return {\r\n [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val]) => {\r\n entries[`${key} =>`] = val;\r\n return entries;\r\n }, {})\r\n };\r\n }\r\n else if (isSet(val)) {\r\n return {\r\n [`Set(${val.size})`]: [...val.values()]\r\n };\r\n }\r\n else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\r\n return String(val);\r\n }\r\n return val;\r\n};\n\nconst EMPTY_OBJ = (process.env.NODE_ENV !== 'production')\r\n ? Object.freeze({})\r\n : {};\r\nconst EMPTY_ARR = (process.env.NODE_ENV !== 'production') ? Object.freeze([]) : [];\r\nconst NOOP = () => { };\r\n/**\r\n * Always return false.\r\n */\r\nconst NO = () => false;\r\nconst onRE = /^on[^a-z]/;\r\nconst isOn = (key) => onRE.test(key);\r\nconst isModelListener = (key) => key.startsWith('onUpdate:');\r\nconst extend = Object.assign;\r\nconst remove = (arr, el) => {\r\n const i = arr.indexOf(el);\r\n if (i > -1) {\r\n arr.splice(i, 1);\r\n }\r\n};\r\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\r\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\r\nconst isArray = Array.isArray;\r\nconst isMap = (val) => toTypeString(val) === '[object Map]';\r\nconst isSet = (val) => toTypeString(val) === '[object Set]';\r\nconst isDate = (val) => val instanceof Date;\r\nconst isFunction = (val) => typeof val === 'function';\r\nconst isString = (val) => typeof val === 'string';\r\nconst isSymbol = (val) => typeof val === 'symbol';\r\nconst isObject = (val) => val !== null && typeof val === 'object';\r\nconst isPromise = (val) => {\r\n return isObject(val) && isFunction(val.then) && isFunction(val.catch);\r\n};\r\nconst objectToString = Object.prototype.toString;\r\nconst toTypeString = (value) => objectToString.call(value);\r\nconst toRawType = (value) => {\r\n // extract \"RawType\" from strings like \"[object RawType]\"\r\n return toTypeString(value).slice(8, -1);\r\n};\r\nconst isPlainObject = (val) => toTypeString(val) === '[object Object]';\r\nconst isIntegerKey = (key) => isString(key) &&\r\n key !== 'NaN' &&\r\n key[0] !== '-' &&\r\n '' + parseInt(key, 10) === key;\r\nconst isReservedProp = /*#__PURE__*/ makeMap(\r\n// the leading comma is intentional so empty string \"\" is also included\r\n',key,ref,ref_for,ref_key,' +\r\n 'onVnodeBeforeMount,onVnodeMounted,' +\r\n 'onVnodeBeforeUpdate,onVnodeUpdated,' +\r\n 'onVnodeBeforeUnmount,onVnodeUnmounted');\r\nconst cacheStringFunction = (fn) => {\r\n const cache = Object.create(null);\r\n return ((str) => {\r\n const hit = cache[str];\r\n return hit || (cache[str] = fn(str));\r\n });\r\n};\r\nconst camelizeRE = /-(\\w)/g;\r\n/**\r\n * @private\r\n */\r\nconst camelize = cacheStringFunction((str) => {\r\n return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));\r\n});\r\nconst hyphenateRE = /\\B([A-Z])/g;\r\n/**\r\n * @private\r\n */\r\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, '-$1').toLowerCase());\r\n/**\r\n * @private\r\n */\r\nconst capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));\r\n/**\r\n * @private\r\n */\r\nconst toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);\r\n// compare whether a value has changed, accounting for NaN.\r\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\r\nconst invokeArrayFns = (fns, arg) => {\r\n for (let i = 0; i < fns.length; i++) {\r\n fns[i](arg);\r\n }\r\n};\r\nconst def = (obj, key, value) => {\r\n Object.defineProperty(obj, key, {\r\n configurable: true,\r\n enumerable: false,\r\n value\r\n });\r\n};\r\nconst toNumber = (val) => {\r\n const n = parseFloat(val);\r\n return isNaN(n) ? val : n;\r\n};\r\nlet _globalThis;\r\nconst getGlobalThis = () => {\r\n return (_globalThis ||\r\n (_globalThis =\r\n typeof globalThis !== 'undefined'\r\n ? globalThis\r\n : typeof self !== 'undefined'\r\n ? self\r\n : typeof window !== 'undefined'\r\n ? window\r\n : typeof global !== 'undefined'\r\n ? global\r\n : {}));\r\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isDate, isFunction, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isModelListener, isNoUnitNumericStyleProp, isObject, isOn, isPlainObject, isPromise, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","import { NOOP } from '@vue/shared'\nimport { Plugin } from 'vue'\n\nexport type SFCWithInstall<T> = T & Plugin\n\nexport const withInstall = <T, E extends Record<string, any>>(\n main: T,\n extra?: E\n) => {\n (main as SFCWithInstall<T>).install = (app): void => {\n for (const comp of [main, ...Object.values(extra ?? {})]) {\n app.component(comp.name, comp)\n }\n }\n\n if (extra) {\n for (const [key, comp] of Object.entries(extra)) {\n (main as any)[key] = comp\n }\n }\n return main as SFCWithInstall<T> & E\n}\n\nexport const withInstallFunction = <T>(fn: T, name: string) => {\n (fn as SFCWithInstall<T>).install = (app) => {\n app.config.globalProperties[name] = fn\n }\n\n return fn as SFCWithInstall<T>\n}\n\nexport const withNoopInstall = <T>(component: T) => {\n (component as SFCWithInstall<T>).install = NOOP\n\n return component as SFCWithInstall<T>\n}\n","import { PropType } from 'vue'\nimport { ManipulateType } from 'dayjs'\n\nexport interface DateOperate {\n type: 'add' | 'minus'\n value: number\n mode: ManipulateType\n}\n\ninterface Event {\n // 当前组件触发什么事件类型后执行\n on: string\n // 被触发的组件id\n target: string\n // 被触发的组件:想要触发事件的类型\n emit: string\n}\n\nexport type Events = Event []\n\nexport type RequestMethod = 'get' | 'post' | 'put' | 'delete' | 'head'\n\nexport interface RequestParam {\n key: string,\n value: any\n}\n\nexport type RequestParams = RequestParam []\n\nexport interface Props {\n id: string // 组件Id,使用UUID\n name: string // 组件名称\n keyName: string // 控件\n type: string // 组件类型\n width: string // 组件宽度\n height: string // 组件高度\n position: string // 定位\n top: string // 组件左上定点x轴位置(相对于画布)\n left: string // 组件左上定点y轴位置(相对于画布)\n zIndex: number // 组件层级\n rotate: string // 旋转角度\n isShow: boolean // 是否展示\n isRender: boolean // 是否渲染\n events: Events\n requestUrl: string // 请求地址\n requestMethod: RequestMethod // 请求方式\n requestHeaders: { [key: string]: any } // 请求头部\n isOpenRequestTimer: boolean // 开启请求定时器\n requestInterval: number // 请求间隔\n requestParams: RequestParams // 请求参数\n requestSort: number, // 请求初始化优先级,越大越优先\n dataType: 'static' | 'request' | 'indicator'\n}\n\nexport const props: Props = {\n id: '',\n name: '',\n keyName: '',\n type: '',\n width: '100px',\n height: '40px',\n position: 'absolute',\n top: '0px',\n left: '0px',\n zIndex: 1,\n rotate: '0deg',\n isShow: true,\n isRender: true,\n requestUrl: '',\n requestMethod: 'get',\n requestHeaders: {},\n isOpenRequestTimer: false,\n requestInterval: 1,\n requestSort: 0,\n requestParams: [{ key: null, value: { } }],\n events: [],\n dataType: 'static'\n}\n\nexport const transformToComponentProps = <T extends {}>(props: T) => {\n // mapValues方法: 第一参数是要遍历的对象, 第二个参数是每次迭代时调用的函数\n // return mapValues(props, (value) => {\n // if (value == null) return {}\n // return {\n // type: (value as any).constructor,\n // default: value\n // }\n // })\n // eslint-disable-next-line no-use-before-define\n const componentProps = {} as { [P in keyof T]: { type?: PropType<T[P]>, default?: T[P] } }\n if (typeof props === 'object' && props != null) {\n for (const prop in props) {\n const value = props[prop]\n componentProps[prop] = {\n type: (value?.constructor) as PropType<typeof value>,\n default: value\n }\n }\n }\n return componentProps\n}\n\nexport interface EventsProp {\n events: Events\n}\n\ninterface DataItem {\n name: string | number\n value: string | number\n type?: string\n}\n\nexport type Data = DataItem []\n\n// 数据转化映射格式\n\nexport interface KeyTypeDataFieldNames {\n name: string\n types: {\n label: string\n value: string\n } []\n}\n\nexport interface ValueTypeDataFieldNames {\n name: string\n value: string\n type: string\n}\n","import { transformToComponentProps } from '@/utils/props'\n\nexport interface PageConfig{\n width: string\n height: string\n backgroundColor: string\n backgroundImage: string\n backgroundSize: string\n contextRequestUrl: string\n mode: 'normal' | 'preview'\n}\n\n// 页面组件默认配置\nexport const pageConfig:PageConfig = {\n width: '1920px',\n height: '1080px',\n backgroundColor: '#ffffff',\n backgroundImage: '',\n backgroundSize: '100% 100%',\n contextRequestUrl: '',\n mode: 'normal'\n}\n\n// 转化默认属性\nexport const pageConfigComponentProps = transformToComponentProps(pageConfig)\n","import { computed, HTMLAttributes } from 'vue'\nimport { pick, without } from 'lodash-es'\n// 需要添加组件的 style 属性\nconst styleList = [\n 'width',\n 'height',\n 'color',\n 'position',\n 'top',\n 'left',\n 'rotate',\n 'fontSize',\n 'fontFamily',\n 'fontWeight',\n 'textDecoration',\n 'textAlign',\n 'lineHeight',\n 'verticalAlign',\n 'overflow',\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundSize',\n 'borderWidth',\n 'borderStyle',\n 'borderRadius',\n 'borderColor',\n 'textShadow',\n 'justifyContent',\n 'alignItems',\n 'zIndex'\n]\n/**\n * 过滤不是 style 属性的组件属性\n * @param props 组件属性\n * @param excludeStyleList 剔除组件的属性\n * @returns style属性\n */\nexport const usePickComponentStyle = <T>(props: Readonly<Partial<T>>, excludeStyleList: string [] = []) => {\n // 再选择需要的组件属性\n const finalStyleList = without(styleList, ...excludeStyleList)\n return computed<HTMLAttributes>(() => pick(props, finalStyleList))\n}\n\nexport default usePickComponentStyle\n","export const EVENT_BUS = 'EVENT_BUS'\nexport const GLOBAL_CONFIG = 'GLOBAL_CONFIG'\nexport const GLOBAL_MODEL = 'GLOBAL_MODEL'\nexport const REQUEST_MODEL = 'REQUEST_MODEL'\nexport const GLOBAL_TOKEN = 'GLOBAL_TOKEN'\nexport const REFRESH_PAGE = 'REFRESH_PAGE'\nexport const MODAL_MODEL = 'MODAL_MODEL'\nexport const ZOOM_FONT_SIZE = 18\n// @ts-ignore\nexport const INDICATOR_URL = window?.config?.indicatorURL\n// @ts-ignore\nexport const UPLOAD_PATH = window?.config?.uploadPath || '/api'\n// @ts-ignore\nexport const BASE_URL = window?.config?.routerBaseURL || './'\n// @ts-ignore\nexport const ERD_URL = window?.config?.erdURL || ''\n","import { watch, inject } from 'vue'\nimport { EVENT_BUS } from '@/utils/constant'\nexport const useOnEvent = <T extends { [id: string]: any}>(props: Readonly<Partial<T>>, events: { [key: string]: any }) => {\n watch(() => props.id, (id) => {\n const eventBus = inject(EVENT_BUS, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n onEvent: (i: string, e: { [key: string]: any }) => void 0\n })\n if (id != null && id !== '') {\n eventBus.onEvent(id, events)\n }\n }, {\n immediate: true\n })\n}\n\nexport default useOnEvent\n","import { inject, ref } from 'vue'\nimport { EVENT_BUS, GLOBAL_CONFIG } from '@/utils/constant'\n/**\n * 触发事件\n * @param props 事件数据\n */\nexport const useEmitEvent = (props: { [key:string]: any }) => {\n const events = props.events\n const id = props.id\n const eventBus = inject(EVENT_BUS, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n emitEvent: (id:string, type: string) => void 0\n })\n\n const { touchEventId } = inject(GLOBAL_CONFIG, {\n touchEventId: ref('')\n })\n /**\n * @param on 触发事件\n * @param callback 回调函数\n */\n return (on: string, callback: Function = () => {}) => {\n return function () {\n // 透传\n callback.call(this, ...arguments)\n const { emitEvent } = eventBus\n events.forEach(event => {\n if (on === event.on) {\n try {\n // 设置当前触发组件的ID\n touchEventId.value = id\n emitEvent(event.target, event.emit)\n } catch (e) {\n console.error(e)\n }\n }\n })\n }\n }\n}\n\nexport default useEmitEvent\n","import { Data, ValueTypeDataFieldNames } from '@/utils/props'\n\n/**\n * 图形转化数据\n * @param data 数据\n * @param dataFieldNames 字段映射\n */\nexport const useTransformChartDataByAttrValue = (data: Data, dataFieldNames?: ValueTypeDataFieldNames) => {\n let { name = 'name', value = 'value', type = 'type' } = dataFieldNames || {}\n // 处去字符串\n name = name?.trim()\n value = value?.trim()\n type = type?.trim()\n const set = new Set()\n const map = new Map()\n const len = data.length\n for (let i = 0; i < len; i++) {\n const item = data[i]\n // x轴\n const x = item[name] || ''\n // y轴\n const y = item[value] || ''\n // 系列(类型)\n const t = item[type] || ''\n set.add(x)\n if (map.has(t)) {\n const arr = map.get(t)\n arr.push({ name: x, value: y, ...item })\n map.set(t, arr)\n } else {\n map.set(t, [{ name: x, value: y, ...item }])\n }\n }\n const dimensions = Array.from(set)\n const dataset: { [key:string]:any } [] = []\n for (const [name, data] of map) {\n dataset.push({\n name,\n data\n })\n }\n return {\n dimensions,\n dataset\n }\n}\nexport default useTransformChartDataByAttrValue\n","import axios from 'axios'\nimport { message } from 'ant-design-vue'\n// @ts-ignore\nconst requestErrorTip = window.config.requestErrorTip\nexport const request = axios.create({\n // timeout: 1000 * 15\n timeout: 1000 * 180\n})\nrequest.interceptors.request.use((response) => {\n return response\n}, (error) => {\n return Promise.reject(error)\n})\nrequest.interceptors.response.use((config) => {\n if (requestErrorTip) {\n if (+config?.data?.code === 500) {\n message.error({\n content: config?.data?.msg || config?.data?.message || '服务器异常',\n key: 'SERVER_ERROR'\n })\n }\n }\n return config\n}, (error) => {\n if (requestErrorTip) {\n if (error.message.includes('timeout')) {\n message.error({\n content: '网络连接超时,请重试!',\n key: 'TIMEOUT'\n })\n } else {\n const { status } = error?.response || {}\n if (status >= 400 && status < 500) {\n message.error({\n content: '请求异常',\n key: 'REQUEST_ERROR'\n })\n }\n\n if (status >= 500) {\n message.error({\n content: '服务器异常',\n key: 'REQUEST_ERROR'\n })\n }\n }\n }\n return Promise.reject(error)\n})\n\nexport default request\n","export const handleAxisLabelFormatter = (formatter: string) => {\n return formatter.replace(/\\\\n/g, '\\n')\n}\n/**\n * 处理图表format, 目前只做 \\\\n => \\n 转化\n * @param formatter 格式化字符串\n */\nexport const handleFormatter = (formatter: string) => {\n return formatter.replace(/\\\\n/g, '\\n')\n}\n\n/**\n * 格式化金额\n * @param value 数值\n * @param decimalPlaces 格式化位数\n */\nexport const formatMoney = (value: string | number, decimalPlaces:number = 2) => {\n const _value = parseFloat(value + '')\n if (isNaN(_value)) return value\n return _value.toFixed(decimalPlaces).replace(/(\\d)(?=(\\d{3})+\\.)/g, '$1,')\n}\n\n/**\n * 格式化千分位\n * @param value 数值\n */\nexport const formatThousands = (value: string | number) => {\n const _value = parseFloat(value + '')\n if (isNaN(_value)) return value\n return (_value + '').replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n}\n\n/**\n * 格式化百分比\n * @param value 数值\n * @param decimalPlaces 格式化位数\n */\nexport const formatPercentage = (value: string | number, decimalPlaces:number = 2) => {\n const strValue = value + ''\n if (strValue.includes('%')) return value\n const _value = parseFloat(strValue)\n if (isNaN(_value)) return value\n return `${(_value * 100).toFixed(decimalPlaces)}%`\n}\n\n/**\n * 字符串1 中是否包含 字符串2 (会全部转成小写)\n * @param v1 字符串1\n * @param v2 字符串2\n * @constructor\n */\nexport const lowerCaseIncludes = (v1:any, v2:any): boolean => {\n if (typeof v1 === 'string' && typeof v2 === 'string') {\n return v1.toLocaleLowerCase().includes(v2.toLocaleLowerCase())\n }\n return false\n}\n","import dayjs from 'dayjs'\nconst runCode = (code: string, data?: { [key:string]: any }) => {\n const useFn = {\n dayjs,\n ...data\n }\n let paramsStr = ''\n const params = []\n for (const key in useFn) {\n paramsStr += `${key},`\n params.push(useFn[key])\n }\n paramsStr = paramsStr.replace(/,$/, '')\n const runFn = `function (${paramsStr}){return ${code}}`\n let result\n try {\n // eslint-disable-next-line no-new-func\n result = Function(`\"use strict\";return (${runFn})`)()(...params)\n } catch (e) {\n // console.error()\n return code\n }\n return result\n}\n\nexport default runCode\n","import runCode from '@/utils/runCode'\nexport const useVariablesInText = (\n formatter: string = '',\n { textData, codeData }: { textData?: { [key:string]: any }, codeData?: { [key:string]: any } } = {},\n { useNewline = false, useSpace = false } = {}\n) => {\n // 引入全局变量\n // @ts-ignore\n const config = window.config || {}\n const data = { ...config, ...textData }\n const variables = (formatter).match(/\\{(.+?)\\}/g)\n if (variables == null || variables.length === 0) {\n return formatter\n }\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n let statement = variable.slice(1, -1).trim()\n const reg = /[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g\n const textVariables = statement.match(reg)\n for (let j = 0; j < textVariables.length; j++) {\n const textVariable = textVariables[j]\n const usedVariable = data[textVariable]\n if (usedVariable != null) {\n // 使用的变量\n statement = statement.replace(textVariable, usedVariable)\n }\n // else {\n // 过滤未使用的变量\n // statement = statement.replace(textVariable, '')\n // }\n }\n if ((/\\(.*\\)/g).test(statement) || (/[+/\\\\*]/g).test(statement)) {\n statement = runCode(statement, codeData)\n }\n formatter = formatter.replace(variable, statement)\n }\n // 替换换行\n if (useNewline) {\n formatter = formatter?.replace(/\\n|\\\\n/g, '<br/>')\n }\n // 替换空格\n if (useSpace) {\n formatter = formatter?.replace(/\\s{2,}?/g, '&nbsp;&nbsp;')\n }\n return formatter\n}\n\nexport default useVariablesInText\n","import { inject, onUnmounted, unref } from 'vue'\nimport request from '@/utils/request'\nimport { GLOBAL_MODEL, GLOBAL_CONFIG } from '@/utils/constant'\nimport { lowerCaseIncludes } from '@/utils/util'\nimport useVariablesInText from './useVariablesInText'\n// import dayjs from 'dayjs'\n\nexport const useRequestData = (props: { [key:string]: any }, callBack: Function = () => {}) => {\n const {\n requestUrl,\n requestMethod: method,\n requestHeaders: headers,\n requestParams,\n requestInterval,\n isOpenRequestTimer\n } = props\n const { contextRequestUrl, touchEventId } = inject(GLOBAL_CONFIG, {\n contextRequestUrl: '',\n touchEventId: ''\n })\n const { getGlobalModel } = inject(GLOBAL_MODEL, {\n getGlobalModel: (_key: string): any => {}\n })\n const url = useVariablesInText(requestUrl)\n const requestData = async (params: { [key: string]: any } = {}) => {\n if (!url || !method || !headers) return\n let _params = {} as { [key: string]: any }\n requestParams.forEach((param) => {\n const { key, value } = param\n if (typeof value === 'object' && value != null && value.id) {\n // 传入数据可能是这样\n // {\n // key: 'record',\n // value: {\n // id: 'T7hid3K4kg7UR9Q-44u1-',\n // prop: 'record',\n // propKey: 'id'\n // }\n // }\n // 获取到组件数据\n let record = {} as { [key:string]: any }\n const { id, prop, propKey, operate } = value\n if (id === 'THIS') {\n // THIS 使用当前触发事件组件的ID\n record = getGlobalModel(unref(touchEventId)) || {}\n } else {\n record = getGlobalModel(id) || {}\n }\n const p = unref(record[prop])\n // 如果传入响应式数据优取响应式\n let v = null\n // 需要格式日期的组件\n const isDate = ['date', 'range'].some((item) => lowerCaseIncludes(record?.type, item))\n if (isDate) {\n // 操作时间\n const { value, type, mode } = operate || {}\n if (value && type && mode) {\n switch (type) {\n case 'add':\n v = unref(p).add(value, mode)\n break\n case 'minus':\n v = unref(p).subtract(value, mode)\n break\n }\n }\n if (v == null) {\n v = unref(p)\n }\n // 此时 v 是 dayjs 对象\n // 此时 propKey 是格式化值\n // 格式化时间\n v = v?.format(propKey?.trim() || record.format) || ''\n } else {\n // 因为 model[prop] 可能为 ref\n // 判断他是不是对象\n if (Object.prototype.toString.call(p) === '[object Object]') {\n // v = p[propKey || 'value']\n // if (v == null) {\n // v = p\n // }\n if (propKey) {\n v = p[propKey]\n } else {\n v = prop ? p[prop] : p\n }\n } else {\n if (lowerCaseIncludes(record?.type, 'select') && unref(p) && prop && Array.isArray(unref(p))) {\n v = unref(p).map((item: any) => {\n return Object.prototype.hasOwnProperty.call(item, prop) ? item[prop] : item\n })\n } else {\n v = p\n }\n }\n // v = p != null && typeof p === 'object' ? p[propKey || 'value'] : p\n }\n _params[key] = v\n } else if (typeof value === 'string') {\n _params[key] = useVariablesInText(value)\n }\n })\n // @ts-ignore\n _params = { ...window.config.requestParams, ...params, ..._params }\n let urlParams = ''\n const keys = Object.keys(_params)\n const last = keys.length - 1\n const keysLen = keys.length\n keys.forEach((key, index) => {\n let _param = _params[key]\n if (Object.prototype.toString.call(_param) === '[object Object]') {\n _param = JSON.stringify(_param)\n }\n if (index === 0) {\n if (keysLen !== 1) {\n urlParams += `?${key}=${_param}&`\n } else {\n urlParams += `?${key}=${_param}`\n }\n } else if (index === last) {\n urlParams += `${key}=${_param}`\n } else {\n urlParams += `${key}=${_param}&`\n }\n })\n try {\n const isSetUrlParams = ['get', 'head'].includes(method)\n let urlStr = isSetUrlParams ? url + urlParams : url\n if (_params.dataSqlId && !urlStr.includes('dataSqlId')) {\n urlStr += `${urlStr.includes('?') ? '&' : '?'}dataSqlId=${_params.dataSqlId}`\n }\n const res = await request({\n baseURL: unref(contextRequestUrl) || '',\n url: urlStr,\n method,\n headers,\n data: isSetUrlParams ? {} : _params\n })\n callBack(res)\n return res\n } catch (e) {\n console.error(e)\n }\n }\n\n const requestDataTimer = isOpenRequestTimer && setInterval(requestData, requestInterval * 1000)\n\n onUnmounted(() => {\n clearInterval(requestDataTimer)\n })\n\n return requestData\n}\n\nexport default useRequestData\n","import { Data, KeyTypeDataFieldNames } from '@/utils/props'\n\n/**\n * 图形转化数据\n * @param data 数据\n * @param dataFieldNames 字段映射\n */\nexport const useTransformChartDataByAttrKey = (data: Data = [], dataFieldNames: KeyTypeDataFieldNames) => {\n let { name = 'name', types = [] } = dataFieldNames || {}\n name = name?.trim() || name\n const set = new Set()\n const map = new Map<string, any []>()\n const dataLen = data.length\n const typesLen = types.length\n // 只有一条记录\n if (dataLen === 1) {\n const vs = []\n // data 为一个值取第一个\n for (let i = 0; i < typesLen; i++) {\n const type = types[i]\n const { label, value } = type\n const v = { ...data[0], value: data[0][value] }\n set.add(label)\n // 值列表\n vs.push(v)\n }\n const n = data[0][name] || ''\n map.set(n, vs)\n } else {\n for (let i = 0; i < dataLen; i++) {\n const item = data[i]\n const x = item[name]\n set.add(x)\n for (let j = 0; j < typesLen; j++) {\n const type = types[j]\n const { label, value } = type\n const v = { ...item, value: item[value] }\n if (map.has(label)) {\n const m = map.get(label)\n m.push(v)\n map.set(label, m)\n } else {\n map.set(label, [v])\n }\n }\n }\n }\n\n const dimensions = Array.from(set)\n const dataset: { [key:string]:any } [] = []\n for (const [name, data] of map) {\n dataset.push({\n name,\n data\n })\n }\n return {\n dimensions,\n dataset\n }\n}\n\nexport default useTransformChartDataByAttrKey\n","export const useImagePath = (path:string, isFormat: boolean = false) => {\n if (!path) return path\n let imagePath: string = ''\n if (path?.includes('://')) {\n imagePath = path\n } else {\n // @ts-ignore\n imagePath = window?.config?.uploadPath + path\n }\n if (isFormat) {\n imagePath = `url(${imagePath})`\n }\n return imagePath\n}\n\nexport default useImagePath\n","import { BASE_URL } from '@/utils/constant'\nexport const usePageUrl = (pageMode: string, pageId: string) => {\n const envPageUrl = `${BASE_URL}/preview?pageId=${pageId}`\n const proPageUrl = `${BASE_URL}/${pageId}`\n return pageMode === 'preview' ? envPageUrl : proPageUrl\n}\n\nexport default usePageUrl\n","import runCode from '@/utils/runCode'\nexport const useValueFormatter = (formatter: string, value:string) => {\n if (formatter == null) return value\n const variables = (formatter).match(/\\{.*\\}/g)\n if (variables == null || variables.length === 0) {\n return value\n }\n const len = variables.length\n for (let i = 0; i < len; i++) {\n const variable = variables[i]\n if (variable == null || variable === '') break\n let statement = variable.slice(1, -1)?.trim()\n statement = statement?.replace(/value/g, value)\n try {\n let result = statement\n if ((/\\(.*\\)/g).test(statement) || (/[+/\\\\*]/g).test(statement)) {\n result = runCode(statement)\n }\n formatter = formatter.replace(variable, result)\n } catch (e) {\n formatter = formatter.replace(variable, statement)\n }\n }\n return formatter\n}\n\nexport default useValueFormatter\n","import { GLOBAL_MODEL, INDICATOR_URL, GLOBAL_TOKEN } from '@/utils/constant'\nimport { lowerCaseIncludes } from '@/utils/util'\nimport request from '@/utils/request'\nimport { inject, unref } from 'vue'\n\nexport const useIndicatorData = (props: { [key:string]: any } = {}) => {\n const { requestToken } = inject(GLOBAL_TOKEN, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n requestToken: () => void 0\n })\n // 指标库模式才会发\n if (props.dataType === 'indicator') {\n // 只要调用,计数 + 1,计数大于0才会请求\n requestToken()\n }\n\n const handleQueryColumn = (queryColumn: { [key:string]: any } = {}) => {\n const { label, name, location, show, indexCode } = queryColumn\n return {\n label,\n columnName: name,\n location,\n show,\n calcType: 'COLUMN',\n hrpIndexCode: indexCode\n }\n }\n\n const handleIndicator = (indicator: { [key:string]: any } = {}) => {\n const {\n label,\n name,\n location,\n show,\n indexCode,\n calcType = 'COLUMN',\n builtInFormula,\n builtInValueSource,\n builtInCalcWay,\n formula,\n conditions\n } = indicator\n return {\n label,\n columnName: name,\n location,\n show,\n calcType,\n hrpIndexCode: indexCode,\n aggregate: 'SUM',\n builtInFormula,\n builtInValueSource,\n builtInCalcWay,\n formula,\n conditions\n }\n }\n\n const { getGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0\n })\n const handleSqlConditions = (controlList: { [key:string]: any } [] = []) => {\n const len = controlList.length\n console.log('controlList', controlList)\n const sqlConditions = [] as { [key:string]: any } []\n for (let i = 0; i < len; i++) {\n const control = controlList[i]\n const {\n id,\n conditionLabel,\n conditionKey,\n conditionValueType\n } = control\n const sqlCondition: { [key:string]: any } = {\n rule: 'NONE',\n label: conditionLabel,\n fieldName: conditionKey,\n fieldValue: '2020-02', // 在关联控件中取\n dateFormat: 'YYYY-MM',\n valueType: conditionValueType\n }\n // 获取组件属性\n const model = getGlobalModel(id) || {}\n console.log('model', model)\n if (lowerCaseIncludes(model.type, 'date')) {\n const { value, format } = model || {}\n sqlCondition.fieldValue = unref(value)?.format(format)\n sqlCondition.dateFormat = format\n }\n sqlConditions.push(sqlCondition)\n }\n return sqlConditions\n }\n return async () => {\n const { graphicConfig, type } = props\n // 全部属性, 为了属性可拓展,所以在设计器中自由添加\n // classification: { [key:string]: any }\n // series: { [key:string]: any }\n // indicatorList: { [key:string]: any } []\n // sqlConditions: { [key:string]: any } []\n // idxLibMode: string\n // source: string\n // dataViewId: string\n let {\n source,\n dataViewId,\n plugin = '1', // 插件类型\n layer, // 后台图表类型,值分0,1\n chartType, // 前端图表类型,实测没用\n classificationList = [],\n seriesList = [],\n leftAxisList = [],\n rightAxisList = [],\n queryColumnList = [],\n indicators = [],\n controlList = [],\n dataSourceId, // 所属数据源ID\n idxLibMode, // 指标库模式, source= INDICATOR_LIB时候必填, NORMAL_YEAR_TABLE = 普通年表, WITH_DATE_DIM_TABLE = 带有时间维度表\n preview = false // 预览开关\n } = graphicConfig || {}\n // 图类型,1=表 2=图\n if (layer == null) {\n if (lowerCaseIncludes(type, 'table')) {\n layer = '1'\n } else {\n layer = '2'\n }\n }\n // console.log('classificationList', classificationList)\n // console.log('seriesList', seriesList)\n // console.log('leftAxisList', leftAxisList)\n // console.log('rightAxisList', rightAxisList)\n // console.log('indicators', indicators)\n // console.log('controlList', controlList)\n // 重点处理 classificationList、seriesList、leftAxisList、rightAxisList、indicators\n // classificationList (取第一项) => classification\n let classification\n if (Array.isArray(classificationList) && classificationList.length > 0) {\n const len = classificationList.length\n for (let i = 0; i < len; i++) {\n const item = classificationList[i] || {}\n const { label = '', name = '', show = false, sort, customGroup, conditions } = item\n // 如果是 show 直接提取 classification,停止遍历\n if (show || len === 1) {\n classification = {\n label,\n columnName: name,\n show,\n sort,\n customGroup,\n conditions\n }\n break\n }\n }\n }\n // seriesList (取第一项) => series\n let series\n if (Array.isArray(seriesList) && seriesList.length > 0) {\n const len = seriesList.length\n for (let i = 0; i < len; i++) {\n const item = seriesList[i] || {}\n const { label = '', name = '', show = false, sort, customGroup, conditions } = item\n // 如果是 show 直接提取 seriesList,停止遍历\n if (show || len === 1) {\n series = {\n label,\n columnName: name,\n show,\n sort,\n customGroup,\n conditions\n }\n break\n }\n }\n }\n // queryColumnList => queryColumns\n const queryColumns = []\n queryColumnList?.forEach((queryColumn: { [key:string]: any }) => {\n queryColumns.push(handleQueryColumn(queryColumn))\n })\n\n // leftAxisList + rightAxisList + indicators => indicatorList\n const indicatorList = []\n leftAxisList?.forEach((leftAxis: { [key:string]: any }) => {\n leftAxis.location = 'LEFT'\n indicatorList.push(handleIndicator(leftAxis))\n })\n rightAxisList?.forEach((rightAxis: { [key:string]: any }) => {\n rightAxis.location = 'RIGHT'\n indicatorList.push(handleIndicator(rightAxis))\n })\n indicators?.forEach((indicator: { [key:string]: any }) => {\n indicator.location = 'LEFT'\n indicatorList.push(handleIndicator(indicator))\n })\n // queryColumns 表格配置为空返回\n if (layer === '1' && queryColumns.length === 0) {\n return\n // queryColumns 图表配置为空返回\n } else if (layer === '2' && indicatorList.length === 0) {\n return\n }\n const sqlConditions = handleSqlConditions(controlList)\n // if (graphicConfig?.pageMode === 'design') {\n // relativeList 在设计模式下,由于联动无法直接获取,已经处理好数据直接获取\n // sqlConditions = graphicConfig.sqlConditions ?? []\n // } else {\n // sqlConditions = handleSqlConditions(controlList)\n // }\n try {\n const res = await request.post(`${INDICATOR_URL}/diagram`, {\n source,\n dataViewId,\n plugin,\n layer,\n chartType,\n classification,\n series,\n indicatorList,\n queryColumns,\n pageFlag: true,\n sqlConditions,\n // fixedDimSql: '',\n dataSourceId,\n idxLibMode,\n preview\n },\n {\n headers: {\n // @ts-ignore\n Authentication: window?.config?.indicatorToken,\n operateContext: 'ygt'\n }\n })\n return res\n } catch (e) {\n console.error(e)\n }\n }\n}\n\nexport default useIndicatorData\n","export const useHrefParamsToGlobalVariables = () => {\n const search = window.location.search\n const params = search.slice(1).split('&')\n const len = params.length\n const _params = {}\n for (let i = 0; i < len; i++) {\n const param = params[i]\n if (param == null || param === '') continue\n const keyAndValue = param.split('=')\n if (Array.isArray(keyAndValue)) {\n const key = keyAndValue[0]\n _params[key] = keyAndValue[1]\n }\n }\n\n // @ts-ignore\n window.config.requestParams = {\n // @ts-ignore\n ...window.config.requestParams,\n ..._params\n }\n\n // @ts-ignore\n window.config = {\n // @ts-ignore\n ...window.config,\n ..._params\n }\n}\n\nexport default useHrefParamsToGlobalVariables\n","<template>\n <div id=\"container\" ref=\"container\">\n <template v-if=\"ready\">\n <div\n class=\"page-config\"\n :style=\"style\"\n >\n <slot></slot>\n </div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, nextTick, computed, ref, onMounted, onUnmounted } from 'vue'\nimport { debounce } from 'lodash-es'\nimport { pageConfigComponentProps } from './props'\nimport { useImagePath } from '@/hooks'\nexport default defineComponent({\n name: 'EcanPageConfig',\n inheritAttrs: false,\n props: {\n ...pageConfigComponentProps\n },\n setup (props) {\n // 大屏设计容器\n const style = computed(() => ({\n width: props.width,\n height: props.height,\n backgroundColor: props.backgroundColor,\n backgroundImage: useImagePath(props.backgroundImage as string, true),\n backgroundSize: props.backgroundSize\n }))\n const width = ref(0)\n const height = ref(0)\n const originalWidth = ref(0)\n const originalHeight = ref(0)\n const ready = ref(false)\n const container = ref()\n let observer: MutationObserver | null\n const initSize = () => {\n return new Promise<void>((resolve) => {\n nextTick(() => {\n // 获取大屏的真实尺寸\n if (props.width && props.height) {\n width.value = parseFloat(props.width)\n height.value = parseFloat(props.height)\n } else {\n width.value = container.value.clientWidth\n height.value = container.value.clientHeight\n }\n // 获取画布尺寸\n if (!originalWidth.value || !originalHeight.value) {\n originalWidth.value = window.screen.width\n originalHeight.value = window.screen.height\n }\n resolve()\n })\n })\n }\n const updateSize = () => {\n if (width.value && height.value) {\n container.value.style.width = `${width.value}px`\n container.value.style.height = `${height.value}px`\n } else {\n container.value.style.width = `${originalWidth.value}px`\n container.value.style.height = `${originalHeight.value}px`\n }\n }\n const updateScale = () => {\n // 获取真实的视口尺寸\n const currentWidth = document.body.clientWidth\n const currentHeight = document.body.clientHeight\n // 获取大屏最终的宽高\n const realWidth = width.value || originalWidth.value\n const realHeight = height.value || originalHeight.value\n const widthScale = currentWidth / realWidth\n const heightScale = currentHeight / realHeight\n container.value && (container.value.style.transform = `scale(${widthScale}, ${heightScale})`)\n }\n const onResize = debounce(async () => {\n await initSize()\n updateScale()\n }, 100)\n const initMutationObserver = () => {\n const MutationObserver = window.MutationObserver\n observer = new MutationObserver(onResize)\n observer.observe(container.value, {\n attributes: true,\n attributeFilter: ['style'],\n attributeOldValue: true\n })\n }\n const removeMutationObserver = () => {\n if (observer) {\n observer.disconnect()\n observer.takeRecords()\n observer = null\n }\n }\n onMounted(async () => {\n ready.value = false\n await initSize()\n updateSize()\n updateScale()\n window.addEventListener('resize', onResize)\n initMutationObserver()\n ready.value = true\n })\n onUnmounted(() => {\n window.removeEventListener('resize', onResize)\n removeMutationObserver()\n })\n return {\n style,\n container,\n ready\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n#container {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n transform-origin: left top;\n z-index: 999;\n}\n.page-config {\n position: relative;\n overflow: hidden;\n background-size: cover;\n}\n</style>\n","<template>\n <div id=\"container\" ref=\"container\">\n <template v-if=\"ready\">\n <div\n class=\"page-config\"\n :style=\"style\"\n >\n <slot></slot>\n </div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, nextTick, computed, ref, onMounted, onUnmounted } from 'vue'\nimport { debounce } from 'lodash-es'\nimport { pageConfigComponentProps } from './props'\nimport { useImagePath } from '@/hooks'\nexport default defineComponent({\n name: 'EcanPageConfig',\n inheritAttrs: false,\n props: {\n ...pageConfigComponentProps\n },\n setup (props) {\n // 大屏设计容器\n const style = computed(() => ({\n width: props.width,\n height: props.height,\n backgroundColor: props.backgroundColor,\n backgroundImage: useImagePath(props.backgroundImage as string, true),\n backgroundSize: props.backgroundSize\n }))\n const width = ref(0)\n const height = ref(0)\n const originalWidth = ref(0)\n const originalHeight = ref(0)\n const ready = ref(false)\n const container = ref()\n let observer: MutationObserver | null\n const initSize = () => {\n return new Promise<void>((resolve) => {\n nextTick(() => {\n // 获取大屏的真实尺寸\n if (props.width && props.height) {\n width.value = parseFloat(props.width)\n height.value = parseFloat(props.height)\n } else {\n width.value = container.value.clientWidth\n height.value = container.value.clientHeight\n }\n // 获取画布尺寸\n if (!originalWidth.value || !originalHeight.value) {\n originalWidth.value = window.screen.width\n originalHeight.value = window.screen.height\n }\n resolve()\n })\n })\n }\n const updateSize = () => {\n if (width.value && height.value) {\n container.value.style.width = `${width.value}px`\n container.value.style.height = `${height.value}px`\n } else {\n container.value.style.width = `${originalWidth.value}px`\n container.value.style.height = `${originalHeight.value}px`\n }\n }\n const updateScale = () => {\n // 获取真实的视口尺寸\n const currentWidth = document.body.clientWidth\n const currentHeight = document.body.clientHeight\n // 获取大屏最终的宽高\n const realWidth = width.value || originalWidth.value\n const realHeight = height.value || originalHeight.value\n const widthScale = currentWidth / realWidth\n const heightScale = currentHeight / realHeight\n container.value && (container.value.style.transform = `scale(${widthScale}, ${heightScale})`)\n }\n const onResize = debounce(async () => {\n await initSize()\n updateScale()\n }, 100)\n const initMutationObserver = () => {\n const MutationObserver = window.MutationObserver\n observer = new MutationObserver(onResize)\n observer.observe(container.value, {\n attributes: true,\n attributeFilter: ['style'],\n attributeOldValue: true\n })\n }\n const removeMutationObserver = () => {\n if (observer) {\n observer.disconnect()\n observer.takeRecords()\n observer = null\n }\n }\n onMounted(async () => {\n ready.value = false\n await initSize()\n updateSize()\n updateScale()\n window.addEventListener('resize', onResize)\n initMutationObserver()\n ready.value = true\n })\n onUnmounted(() => {\n window.removeEventListener('resize', onResize)\n removeMutationObserver()\n })\n return {\n style,\n container,\n ready\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n#container {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n transform-origin: left top;\n z-index: 999;\n}\n.page-config {\n position: relative;\n overflow: hidden;\n background-size: cover;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport PageConfig from './PageConfig.vue'\nexport const EcanPageConfig = withInstall(PageConfig)\nexport default EcanPageConfig\nexport * from './props'\n","import { transformToComponentProps } from '@/utils/props'\n\nexport interface ProviderConfig {\n contextRequestUrl: string // 请求头\n pageMode: 'normal' | 'preview' | 'design' // 普通、预览、设计模式\n theme: 'light' | 'darkBlue'\n containerMap: { [key:string]: { [key: string]: string [] } }\n}\n\nexport const providerConfig: ProviderConfig = {\n contextRequestUrl: '',\n pageMode: 'normal',\n theme: 'light',\n containerMap: {}\n}\n\n// 转化默认属性\nexport const providerConfigComponentProps = transformToComponentProps(providerConfig)\n","<template>\n <!-- 请勿去除属性id -->\n <div id=\"ProviderConfig\" ref=\"providerConfig\">\n <slot></slot>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, provide, ref, onMounted, watch, computed, unref, onBeforeUnmount } from 'vue'\nimport mitt from 'mitt'\nimport {\n EVENT_BUS,\n GLOBAL_CONFIG,\n GLOBAL_MODEL,\n REQUEST_MODEL,\n INDICATOR_URL,\n GLOBAL_TOKEN,\n REFRESH_PAGE,\n MODAL_MODEL\n} from '@/utils/constant'\nimport { providerConfigComponentProps } from './props'\nimport { useVariablesInText, useHrefParamsToGlobalVariables } from '@/hooks'\nimport axios from 'axios'\nimport request from '@/utils/request'\nimport { RequestModalParam } from '@/utils/types'\n\nexport default defineComponent({\n name: 'EcanProviderConfig',\n inheritAttrs: false,\n props: {\n ...providerConfigComponentProps\n },\n setup (props, { expose }) {\n useHrefParamsToGlobalVariables()\n\n const providerConfig = ref<HTMLElement>()\n const setTheme = () => {\n providerConfig.value.setAttribute('datav-theme', props.theme)\n }\n watch(() => props.theme, () => {\n setTheme()\n })\n onMounted(() => {\n setTheme()\n })\n const contextRequestUrl = computed(() => useVariablesInText(props.contextRequestUrl))\n const pageMode = computed(() => props.pageMode)\n const theme = computed(() => props.theme)\n // 当前组件主动触发ID\n const touchEventId = ref<string>('')\n // 提供全局设置\n provide(GLOBAL_CONFIG, {\n // 请求地址\n contextRequestUrl,\n // 模式(设计、预览、正常):目前主要配置初始化是否发起请求\n pageMode,\n // 主题\n theme,\n touchEventId\n })\n\n // 提供全局变量\n const globalModel = new Map()\n console.log('globalModel', globalModel)\n const getGlobalModel = (key: string) => {\n return globalModel.get(key)\n }\n const setGlobalModel = (key: string, value: any) => {\n globalModel.set(key, value)\n }\n provide(GLOBAL_MODEL, {\n getGlobalModel,\n setGlobalModel\n })\n\n // 弹窗数据\n const useModalIds: string [] = []\n const popUseModalIds = () => {\n useModalIds.pop()\n }\n const pushUseModalIds = (id: string) => {\n useModalIds.push(id)\n }\n const modalModel = new Map()\n const getModalModel = (key: string) => {\n return modalModel.get(key)\n }\n const setModalModel = (key: string, value: any) => {\n modalModel.set(key, value)\n }\n provide(MODAL_MODEL, {\n popUseModalIds,\n pushUseModalIds,\n getModalModel,\n setModalModel\n })\n\n // 提供事件\n const eventBus = mitt()\n const eventBusKeySet = new Set<string>()\n const onEvent = (key: string, events: { [key:string]: any }) => {\n eventBusKeySet.add(key)\n eventBus.on(key, (k: string) => {\n return typeof events[k] === 'function' && events[k]()\n })\n onBeforeUnmount(() => {\n offEvent(key)\n })\n }\n const offEvent = (key) => {\n eventBusKeySet.delete(key)\n eventBus.off(key)\n }\n const emitEvent = (key: string, eventName: string) => {\n if (key === 'PAGE') {\n const len = useModalIds.length\n let keys: string [] = []\n if (len === 0) {\n keys = [...eventBusKeySet]\n } else {\n const currentModalId = useModalIds[len - 1]\n keys = [...getModalModel(currentModalId)]\n }\n keys.forEach((key) => {\n eventBus.emit(key, eventName)\n })\n } else {\n eventBus.emit(key, eventName)\n }\n }\n provide(EVENT_BUS, {\n onEvent,\n offEvent,\n emitEvent\n })\n\n // 设置是否请求 token\n const tokenNum = ref(0)\n const requestToken = () => {\n tokenNum.value = unref(tokenNum) + 1\n }\n provide(GLOBAL_TOKEN, {\n requestToken\n })\n // 请求排序\n const requestModel = new Map()\n const requestMap = new Map()\n const setRequest = ({ requestFn = () => {}, sortNum = 0, id = '' }: RequestModalParam) => {\n if (requestModel.has(sortNum)) {\n const requestFnList = requestModel.get(sortNum)\n requestFnList?.push(requestFn)\n } else {\n requestModel.set(sortNum, [requestFn])\n }\n requestMap.set(id, requestFn)\n }\n const handleRequestFnList = (requestFnList: Array<Function>) => {\n return new Promise((resolve, reject) => {\n const resultList = requestFnList.map(requestFn => requestFn())\n Promise.all(resultList)\n .then(list => {\n resolve(list)\n })\n .catch(err => {\n reject(err)\n })\n })\n }\n // 指标库模块请求 token\n const queryUserToken = async () => {\n const res = await axios.get(`${INDICATOR_URL}/user/anonymous?username=admin&businessOfficeId=350421`, {\n headers: {\n systemCode: 'F72FC50A3D97372514A6AC33333D28FD',\n current_context: 'ygt',\n Authentication: ''\n }\n })\n // 设置 token 挂载在 window.config 上\n const { token } = res.data?.data || {}\n // @ts-ignore\n window.config.indicatorToken = token\n }\n\n const touchRequest = (id: undefined | string) => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!id) {\n const requestModelArr = Array.from(requestModel)\n // 排序\n requestModelArr.sort((a, b) => b[0] - a[0])\n const len = requestModelArr.length\n try {\n // 指标库模块需要 token\n // 页面不为design 请求次数 token 不为0\n if (props.pageMode !== 'design' && unref(tokenNum) > 0) {\n await queryUserToken()\n }\n for (let i = 0; i < len; i++) {\n const requestFnList = requestModelArr[i][1]\n await handleRequestFnList(requestFnList)\n }\n } catch (e) {\n console.error(e)\n } finally {\n // 执行完直接清空\n requestModel.clear()\n resolve(null)\n }\n } else if (typeof id === 'string') {\n const requestFn = requestMap.get(id)\n if (typeof requestFn === 'function') {\n const id = request.interceptors.response.use((response) => {\n resolve(response)\n return response\n }, (error) => {\n reject(error)\n return Promise.reject(error)\n })\n requestFn()\n // 使用完必须注销\n request.interceptors.response.eject(id)\n }\n }\n })\n // 传空默认触发全部\n }\n\n provide(REQUEST_MODEL, {\n setRequest,\n touchRequest\n })\n\n const emitRefreshPage = () => {\n eventBus.emit(REFRESH_PAGE)\n }\n provide(REFRESH_PAGE, {\n emitRefreshPage\n })\n const onRefreshPage = (callBack: Function) => {\n eventBus.on(REFRESH_PAGE, () => callBack())\n onMounted(() => {\n eventBus.off(REFRESH_PAGE)\n })\n }\n\n onBeforeUnmount(() => {\n requestModel?.clear()\n requestMap?.clear()\n })\n\n expose({\n touchRequest,\n getGlobalModel,\n onRefreshPage\n })\n\n return {\n providerConfig\n }\n }\n})\n</script>\n\n<style scoped>\n\n</style>\n","<template>\n <!-- 请勿去除属性id -->\n <div id=\"ProviderConfig\" ref=\"providerConfig\">\n <slot></slot>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, provide, ref, onMounted, watch, computed, unref, onBeforeUnmount } from 'vue'\nimport mitt from 'mitt'\nimport {\n EVENT_BUS,\n GLOBAL_CONFIG,\n GLOBAL_MODEL,\n REQUEST_MODEL,\n INDICATOR_URL,\n GLOBAL_TOKEN,\n REFRESH_PAGE,\n MODAL_MODEL\n} from '@/utils/constant'\nimport { providerConfigComponentProps } from './props'\nimport { useVariablesInText, useHrefParamsToGlobalVariables } from '@/hooks'\nimport axios from 'axios'\nimport request from '@/utils/request'\nimport { RequestModalParam } from '@/utils/types'\n\nexport default defineComponent({\n name: 'EcanProviderConfig',\n inheritAttrs: false,\n props: {\n ...providerConfigComponentProps\n },\n setup (props, { expose }) {\n useHrefParamsToGlobalVariables()\n\n const providerConfig = ref<HTMLElement>()\n const setTheme = () => {\n providerConfig.value.setAttribute('datav-theme', props.theme)\n }\n watch(() => props.theme, () => {\n setTheme()\n })\n onMounted(() => {\n setTheme()\n })\n const contextRequestUrl = computed(() => useVariablesInText(props.contextRequestUrl))\n const pageMode = computed(() => props.pageMode)\n const theme = computed(() => props.theme)\n // 当前组件主动触发ID\n const touchEventId = ref<string>('')\n // 提供全局设置\n provide(GLOBAL_CONFIG, {\n // 请求地址\n contextRequestUrl,\n // 模式(设计、预览、正常):目前主要配置初始化是否发起请求\n pageMode,\n // 主题\n theme,\n touchEventId\n })\n\n // 提供全局变量\n const globalModel = new Map()\n console.log('globalModel', globalModel)\n const getGlobalModel = (key: string) => {\n return globalModel.get(key)\n }\n const setGlobalModel = (key: string, value: any) => {\n globalModel.set(key, value)\n }\n provide(GLOBAL_MODEL, {\n getGlobalModel,\n setGlobalModel\n })\n\n // 弹窗数据\n const useModalIds: string [] = []\n const popUseModalIds = () => {\n useModalIds.pop()\n }\n const pushUseModalIds = (id: string) => {\n useModalIds.push(id)\n }\n const modalModel = new Map()\n const getModalModel = (key: string) => {\n return modalModel.get(key)\n }\n const setModalModel = (key: string, value: any) => {\n modalModel.set(key, value)\n }\n provide(MODAL_MODEL, {\n popUseModalIds,\n pushUseModalIds,\n getModalModel,\n setModalModel\n })\n\n // 提供事件\n const eventBus = mitt()\n const eventBusKeySet = new Set<string>()\n const onEvent = (key: string, events: { [key:string]: any }) => {\n eventBusKeySet.add(key)\n eventBus.on(key, (k: string) => {\n return typeof events[k] === 'function' && events[k]()\n })\n onBeforeUnmount(() => {\n offEvent(key)\n })\n }\n const offEvent = (key) => {\n eventBusKeySet.delete(key)\n eventBus.off(key)\n }\n const emitEvent = (key: string, eventName: string) => {\n if (key === 'PAGE') {\n const len = useModalIds.length\n let keys: string [] = []\n if (len === 0) {\n keys = [...eventBusKeySet]\n } else {\n const currentModalId = useModalIds[len - 1]\n keys = [...getModalModel(currentModalId)]\n }\n keys.forEach((key) => {\n eventBus.emit(key, eventName)\n })\n } else {\n eventBus.emit(key, eventName)\n }\n }\n provide(EVENT_BUS, {\n onEvent,\n offEvent,\n emitEvent\n })\n\n // 设置是否请求 token\n const tokenNum = ref(0)\n const requestToken = () => {\n tokenNum.value = unref(tokenNum) + 1\n }\n provide(GLOBAL_TOKEN, {\n requestToken\n })\n // 请求排序\n const requestModel = new Map()\n const requestMap = new Map()\n const setRequest = ({ requestFn = () => {}, sortNum = 0, id = '' }: RequestModalParam) => {\n if (requestModel.has(sortNum)) {\n const requestFnList = requestModel.get(sortNum)\n requestFnList?.push(requestFn)\n } else {\n requestModel.set(sortNum, [requestFn])\n }\n requestMap.set(id, requestFn)\n }\n const handleRequestFnList = (requestFnList: Array<Function>) => {\n return new Promise((resolve, reject) => {\n const resultList = requestFnList.map(requestFn => requestFn())\n Promise.all(resultList)\n .then(list => {\n resolve(list)\n })\n .catch(err => {\n reject(err)\n })\n })\n }\n // 指标库模块请求 token\n const queryUserToken = async () => {\n const res = await axios.get(`${INDICATOR_URL}/user/anonymous?username=admin&businessOfficeId=350421`, {\n headers: {\n systemCode: 'F72FC50A3D97372514A6AC33333D28FD',\n current_context: 'ygt',\n Authentication: ''\n }\n })\n // 设置 token 挂载在 window.config 上\n const { token } = res.data?.data || {}\n // @ts-ignore\n window.config.indicatorToken = token\n }\n\n const touchRequest = (id: undefined | string) => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n if (!id) {\n const requestModelArr = Array.from(requestModel)\n // 排序\n requestModelArr.sort((a, b) => b[0] - a[0])\n const len = requestModelArr.length\n try {\n // 指标库模块需要 token\n // 页面不为design 请求次数 token 不为0\n if (props.pageMode !== 'design' && unref(tokenNum) > 0) {\n await queryUserToken()\n }\n for (let i = 0; i < len; i++) {\n const requestFnList = requestModelArr[i][1]\n await handleRequestFnList(requestFnList)\n }\n } catch (e) {\n console.error(e)\n } finally {\n // 执行完直接清空\n requestModel.clear()\n resolve(null)\n }\n } else if (typeof id === 'string') {\n const requestFn = requestMap.get(id)\n if (typeof requestFn === 'function') {\n const id = request.interceptors.response.use((response) => {\n resolve(response)\n return response\n }, (error) => {\n reject(error)\n return Promise.reject(error)\n })\n requestFn()\n // 使用完必须注销\n request.interceptors.response.eject(id)\n }\n }\n })\n // 传空默认触发全部\n }\n\n provide(REQUEST_MODEL, {\n setRequest,\n touchRequest\n })\n\n const emitRefreshPage = () => {\n eventBus.emit(REFRESH_PAGE)\n }\n provide(REFRESH_PAGE, {\n emitRefreshPage\n })\n const onRefreshPage = (callBack: Function) => {\n eventBus.on(REFRESH_PAGE, () => callBack())\n onMounted(() => {\n eventBus.off(REFRESH_PAGE)\n })\n }\n\n onBeforeUnmount(() => {\n requestModel?.clear()\n requestMap?.clear()\n })\n\n expose({\n touchRequest,\n getGlobalModel,\n onRefreshPage\n })\n\n return {\n providerConfig\n }\n }\n})\n</script>\n\n<style scoped>\n\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport ProviderConfig from './ProviderConfig.vue'\nexport const EcanProviderConfig = withInstall(ProviderConfig)\nexport default EcanProviderConfig\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface TextProps extends Props {\n text: string // 文本内容\n color: string // 颜色\n lineHeight: number\n fontSize: string // 字体大小\n variableColor: string\n fontFamily: string // 字体\n textShadow: string // 文字阴影\n variableFontSize: string\n variableDefaultValue: string\n format: '' | 'percentage' | 'money' | 'percent' | 'thousands'\n href: string\n target: 'self' | 'blank' | 'event' // 打开方式\n linkPage: string // 传入pageId\n fontWeight: number // 字体的粗细程度\n justifyContent: 'flex-start' | 'center' | 'end' // 水平位置\n alignItems: 'flex-start' | 'center' | 'end' // 垂直位置\n data: { [key:string]: any }\n}\nexport const textProps:TextProps = {\n ...props,\n name: '文本',\n keyName: '文本',\n type: 'ecanText',\n width: '100px',\n height: '40px',\n text: '文字',\n lineHeight: 1,\n color: '#333',\n variableColor: '#f00',\n fontSize: '14px',\n fontFamily: '',\n fontWeight: 400,\n textShadow: '',\n justifyContent: 'center',\n alignItems: 'center',\n variableFontSize: '14px',\n variableDefaultValue: '0',\n format: '',\n target: 'self',\n href: '',\n linkPage: '',\n data: {}\n}\n\n// 转化默认属性\nexport const textComponentProps = transformToComponentProps(textProps)\n\nexport const textEvents = ['refreshData', 'click', 'valueChange']\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAV1BMVEUAAAD/WzT/WjP/WDD/WzT/WzP/WzT/WzT/WzT/WjT/WzT/WDT/YED/WzT/WzT/WjT/YED/WzT/WzT/WzT/XDT/WzT/WjX/WjP/XDT/XDT/WTL/Tif/WzReH8z5AAAAHHRSTlMA8RgS9W9YHbePZyME5sVjCP7bzcCxgndOQC4GFJJgKwAAAIJJREFUKM+Nkd0OgyAMRjvqcLA53fzXvv9zaokmxq8mnsue5ACFDjiy+XyjLZ7yyK35OxN5mSFZKa2QojEIKRhrZKM0QnsMQxirmJ0kBubTIZvAtUyiFAT4JFoUIYmIotZ5xjDPfyoCAV16nMPdFir8xZ16nM//tePtXw2ODOJY0V0WqQwM2rgKrU0AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIyLTA3LTIyVDA5OjM1OjE5KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMi0wNy0yMlQwOTozNTozNyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMi0wNy0yMlQwOTozNTozNyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNmRlNzg2MS1kNzhmLTQyNGYtYTNjOS01ZTk0MjkwY2RjZjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzZkZTc4NjEtZDc4Zi00MjRmLWEzYzktNWU5NDI5MGNkY2YxIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MzZkZTc4NjEtZDc4Zi00MjRmLWEzYzktNWU5NDI5MGNkY2YxIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDozNmRlNzg2MS1kNzhmLTQyNGYtYTNjOS01ZTk0MjkwY2RjZjEiIHN0RXZ0OndoZW49IjIwMjItMDctMjJUMDk6MzU6MTkrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6VDI+BAAABUUlEQVRIia3WPyhGURgG8B8pi0xisStKMioZLQaLiaQMBoxiVBImCwaLf6MssloUk8Gmb7GgJFKSUvIZ7qe+bvd89+A+03uf989z3nPPPe+tK5fLqtF3tSESzRjFAJ4vemams4IaYqulCq9gEo34QGco+LcCg9hHaxW3jpsiBIZxmMp5kXQTRH1k8S4cZCxoE6//FaiXbEtThm87JjkPI+jN4E9xW4TAQoA/isjNFehCT8B3VoTAUID/xHURAn0B/g5fRQh0B/j7mOJkf2gTaKvY7YG8FsxXPe/hIVbgCTs5C+vAasU+xlooMGuLTrCVI/CDR0zVCgi9gzmUIgQmBbYmT+AdY5LjGMKWpNuaqHWKLrEY8JUkXeYi75iu4DzFfUi6ey9C4AvjeKviliTdRSHmsrvBbMU+lzNg0oidaLvox7LIK+IHdem/iqIROzL/jG+NrT1BRsXKNQAAAABJRU5ErkJggg==\"","<template>\n <div class=\"skeleton-wrapper\" :style=\"style\" v-if=\"loading\">\n <skeleton :loading=\"loading\"/>\n </div>\n <div class=\"ecan-text\" :style=\"style\" v-html=\"myText\" @click=\"click\" v-else/>\n</template>\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport { textComponentProps } from './props'\nimport {\n usePickComponentStyle,\n useRequestData,\n useOnEvent,\n useEmitEvent,\n usePageUrl,\n useVariablesInText\n} from '@/hooks'\nimport { GLOBAL_CONFIG, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '@/common/skeleton/Skeleton.vue'\nimport goUp from '@/assets/go-up.png'\nimport goDown from '@/assets/go-down.png'\nimport { RequestModalParam } from '@/utils/types'\nimport { formatMoney, formatThousands } from '@/utils/util'\nimport runCode from '@/utils/runCode'\n\nexport default defineComponent({\n name: 'EcanText',\n components: { Skeleton },\n props: {\n ...textComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myData = ref({} as { [key:string]:any })\n watch(() => [props.data, props.dataType], ([data, dataType]) => {\n if (dataType === 'static') {\n myData.value = data as { [key: string]: any }\n }\n }, {\n immediate: true\n })\n const myText = computed(() => {\n const data = unref(myData)\n let text = props.text\n text = text?.replace(/\\n|\\\\n/g, '<br/>')\n text = text?.replace(/\\s(?!\\{) | (?!\\})\\s/g, '&nbsp;')\n // const variables = (text).match(/\\{\\s*[\\w\\u4e00-\\u9fa5]*\\s*\\}/g)\n const variables = (text).match(/\\{(.+?)\\}/g)\n if (variables == null || variables.length === 0) return text\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n const statement: string = variable?.slice(1, variable.length - 1)?.trim()\n let replaceStatement = statement\n const textVariables = statement.match(/[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g)\n for (let j = 0; j < textVariables.length; j++) {\n const textVariable = textVariables[j]\n const value = data[textVariable]\n if (value) {\n replaceStatement = statement.replace(textVariable, value)\n }\n }\n if ((/\\(.*\\)/g).test(replaceStatement)) {\n const result = runCode(replaceStatement)\n if (result != null) {\n replaceStatement = result\n }\n }\n let usedVariable: string | number = replaceStatement\n // 变量值和之前一样\n if (usedVariable === statement) {\n usedVariable = props.variableDefaultValue\n }\n if (usedVariable != null) {\n // 涨跌幅\n const format = props.format\n if (format === 'percentage') {\n // 判断是数字类型\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n // 如果大于等于 0\n if (usedVariable >= 0) {\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color:#ED6643;font-size:${props.variableFontSize}\"><img style=\"width: ${props.variableFontSize}\" src=\"${goUp}\"/>${usedVariable}%</span>`)\n } else {\n // 如果小于 0\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color: #6ACB97;font-size:${props.variableFontSize}\"><img style=\"width: ${props.variableFontSize}\" src=\"${goDown}\"/>${Math.abs(+usedVariable)}%</span>`)\n }\n } else {\n // 判断不是数字类型\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${0.00}%</span>`)\n }\n } else if (props.format === 'percent') {\n // 百分数\n // 判断是数字类型\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}%</span>`)\n }\n } else if (props.format === 'money') {\n // 金额格式化\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = formatMoney(usedVariable)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n } else if (format === 'thousands') {\n // 千分位\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = formatThousands(usedVariable)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n } else {\n /// 没有使用百分格式化\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n }\n }\n return `<span>${text}</span>`\n })\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n try {\n loading.value = true\n const res = await requestData()\n myData.value = res?.data?.data || {}\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const refreshData = () => {\n if (props.dataType === 'static') return\n handleRequestData()\n }\n\n useOnEvent(props, {\n refreshData\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n useOnEvent(props, {\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {\n // 空链接、空页面直接 return\n if (!props.linkPage && !props.href) return\n const linkPage = props.linkPage || ''\n const pageUrl = usePageUrl(unref(pageMode), linkPage)\n // 优先使用外部链接,再使用url\n const href = props.href\n let url = href || pageUrl\n url = useVariablesInText(url)\n const target = props.target\n if (!target) return\n if (target !== 'event') {\n window.open(url, '_' + target)\n } else {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n })\n\n const valueChange = emitEvent('valueChange', () => {})\n\n watch(() => myText.value, (value, oldValue) => {\n if (value !== oldValue) {\n valueChange()\n }\n })\n\n return {\n style,\n myText,\n loading,\n click\n }\n }\n})\n</script>\n\n<style lang=\"less\" scoped>\n.skeleton-wrapper {\n overflow: hidden;\n}\n\n.ecan-text {\n display: flex;\n white-space:nowrap;\n}\n</style>\n","<template>\n <div class=\"skeleton-wrapper\" :style=\"style\" v-if=\"loading\">\n <skeleton :loading=\"loading\"/>\n </div>\n <div class=\"ecan-text\" :style=\"style\" v-html=\"myText\" @click=\"click\" v-else/>\n</template>\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport { textComponentProps } from './props'\nimport {\n usePickComponentStyle,\n useRequestData,\n useOnEvent,\n useEmitEvent,\n usePageUrl,\n useVariablesInText\n} from '@/hooks'\nimport { GLOBAL_CONFIG, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '@/common/skeleton/Skeleton.vue'\nimport goUp from '@/assets/go-up.png'\nimport goDown from '@/assets/go-down.png'\nimport { RequestModalParam } from '@/utils/types'\nimport { formatMoney, formatThousands } from '@/utils/util'\nimport runCode from '@/utils/runCode'\n\nexport default defineComponent({\n name: 'EcanText',\n components: { Skeleton },\n props: {\n ...textComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myData = ref({} as { [key:string]:any })\n watch(() => [props.data, props.dataType], ([data, dataType]) => {\n if (dataType === 'static') {\n myData.value = data as { [key: string]: any }\n }\n }, {\n immediate: true\n })\n const myText = computed(() => {\n const data = unref(myData)\n let text = props.text\n text = text?.replace(/\\n|\\\\n/g, '<br/>')\n text = text?.replace(/\\s(?!\\{) | (?!\\})\\s/g, '&nbsp;')\n // const variables = (text).match(/\\{\\s*[\\w\\u4e00-\\u9fa5]*\\s*\\}/g)\n const variables = (text).match(/\\{(.+?)\\}/g)\n if (variables == null || variables.length === 0) return text\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n const statement: string = variable?.slice(1, variable.length - 1)?.trim()\n let replaceStatement = statement\n const textVariables = statement.match(/[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g)\n for (let j = 0; j < textVariables.length; j++) {\n const textVariable = textVariables[j]\n const value = data[textVariable]\n if (value) {\n replaceStatement = statement.replace(textVariable, value)\n }\n }\n if ((/\\(.*\\)/g).test(replaceStatement)) {\n const result = runCode(replaceStatement)\n if (result != null) {\n replaceStatement = result\n }\n }\n let usedVariable: string | number = replaceStatement\n // 变量值和之前一样\n if (usedVariable === statement) {\n usedVariable = props.variableDefaultValue\n }\n if (usedVariable != null) {\n // 涨跌幅\n const format = props.format\n if (format === 'percentage') {\n // 判断是数字类型\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n // 如果大于等于 0\n if (usedVariable >= 0) {\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color:#ED6643;font-size:${props.variableFontSize}\"><img style=\"width: ${props.variableFontSize}\" src=\"${goUp}\"/>${usedVariable}%</span>`)\n } else {\n // 如果小于 0\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color: #6ACB97;font-size:${props.variableFontSize}\"><img style=\"width: ${props.variableFontSize}\" src=\"${goDown}\"/>${Math.abs(+usedVariable)}%</span>`)\n }\n } else {\n // 判断不是数字类型\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${0.00}%</span>`)\n }\n } else if (props.format === 'percent') {\n // 百分数\n // 判断是数字类型\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = (usedVariable * 100).toFixed(2)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}%</span>`)\n }\n } else if (props.format === 'money') {\n // 金额格式化\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = formatMoney(usedVariable)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n } else if (format === 'thousands') {\n // 千分位\n usedVariable = +usedVariable\n if (!isNaN(usedVariable)) {\n usedVariable = formatThousands(usedVariable)\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n } else {\n /// 没有使用百分格式化\n text = text.replace(variable, `<span style=\"color:${props.variableColor};font-size:${props.variableFontSize}\">${usedVariable}</span>`)\n }\n }\n }\n return `<span>${text}</span>`\n })\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n try {\n loading.value = true\n const res = await requestData()\n myData.value = res?.data?.data || {}\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const refreshData = () => {\n if (props.dataType === 'static') return\n handleRequestData()\n }\n\n useOnEvent(props, {\n refreshData\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n useOnEvent(props, {\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {\n // 空链接、空页面直接 return\n if (!props.linkPage && !props.href) return\n const linkPage = props.linkPage || ''\n const pageUrl = usePageUrl(unref(pageMode), linkPage)\n // 优先使用外部链接,再使用url\n const href = props.href\n let url = href || pageUrl\n url = useVariablesInText(url)\n const target = props.target\n if (!target) return\n if (target !== 'event') {\n window.open(url, '_' + target)\n } else {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n })\n\n const valueChange = emitEvent('valueChange', () => {})\n\n watch(() => myText.value, (value, oldValue) => {\n if (value !== oldValue) {\n valueChange()\n }\n })\n\n return {\n style,\n myText,\n loading,\n click\n }\n }\n})\n</script>\n\n<style lang=\"less\" scoped>\n.skeleton-wrapper {\n overflow: hidden;\n}\n\n.ecan-text {\n display: flex;\n white-space:nowrap;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport Text from './Text.vue'\nexport const EcanText = withInstall(Text)\nexport default EcanText\nexport * from './props'\n","<template>\n <div class=\"red\">\n {{ text }}\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue'\nexport default defineComponent({\n name: 'EcanScrollText',\n setup () {\n const text = ref('基础文本')\n return {\n text\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.red {\n color: red;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport ScrollText from './ScrollText.vue'\nexport const EcanScrollText = withInstall(ScrollText)\nexport default EcanScrollText\n","import {\n Props,\n props,\n transformToComponentProps,\n DateOperate\n} from '@/utils/props'\n\nexport interface TimeDisplayProps extends Props {\n color: string\n format: string\n fontSize: string\n fontFamily: string // 字体\n fontWeight: number // 字体的粗细程度\n textShadow: string // 文字阴影\n alignItems: string // 水平\n justifyContent: string // 垂直\n operate: null | DateOperate\n updateInterval: null | { value: number, mode: 'second' | 'minute' | 'hour' | 'day' }\n}\n\nexport const timeDisplayProps: TimeDisplayProps = {\n ...props,\n name: '时间展示',\n keyName: '时间展示',\n type: 'ecanTimeDisplay',\n format: 'YYYY-MM-DD dddd HH:mm:ss',\n fontSize: '16px',\n color: '#333',\n width: '240px',\n height: '40px',\n fontFamily: '',\n fontWeight: 400,\n textShadow: '',\n alignItems: 'center',\n justifyContent: 'center',\n operate: null,\n updateInterval: { value: 1, mode: 'second' }\n}\n\nexport const timeDisplayComponentProps = transformToComponentProps(timeDisplayProps)\n\nexport const timeDisplayEvents = ['timeChange']\n","<template>\n <div class=\"time-display\" :style=\"style\">\n {{ time }}\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { timeDisplayComponentProps } from './props'\nimport dayjs from 'dayjs'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle } from '../../hooks'\nexport default defineComponent({\n name: 'EcanTimeDisplay',\n props: {\n ...timeDisplayComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const handleTimeValue = () => {\n const { format, operate } = props\n let time = dayjs()\n if (operate) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n time = time.add(value, mode)\n break\n case 'minus':\n time = time.subtract(value, mode)\n }\n }\n return time.format(format)\n }\n const time = ref()\n watch(() => [props.operate, props.format], () => {\n time.value = handleTimeValue()\n }, {\n immediate: true,\n deep: true\n })\n watch(() => props.updateInterval, () => {\n setTimer()\n }, {\n deep: true\n })\n let timer = null\n const clearTimer = () => {\n clearInterval(timer)\n timer = null\n }\n const emitEvent = useEmitEvent(props)\n const timeChange = emitEvent('timeChange', () => {})\n const setTimer = () => {\n if (timer) {\n clearTimer()\n }\n // 1s 为初始值\n let intervalTime = 1000\n const { value, mode } = props.updateInterval || {}\n if (value) {\n intervalTime = intervalTime * value\n }\n const modeMap = {\n second: 1,\n minute: 60,\n hour: 60 * 60,\n day: 24 * 60 * 60\n }\n if (mode) {\n intervalTime = intervalTime * modeMap[mode]\n }\n timer = setInterval(() => {\n time.value = handleTimeValue()\n timeChange()\n }, intervalTime)\n }\n useOnEvent(props, {\n timeChange\n })\n onMounted(() => {\n setTimer()\n })\n onUnmounted(() => {\n clearTimer()\n })\n return {\n style,\n time\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.time-display {\n overflow: hidden;\n display: flex;\n}\n</style>\n","<template>\n <div class=\"time-display\" :style=\"style\">\n {{ time }}\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { timeDisplayComponentProps } from './props'\nimport dayjs from 'dayjs'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle } from '../../hooks'\nexport default defineComponent({\n name: 'EcanTimeDisplay',\n props: {\n ...timeDisplayComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const handleTimeValue = () => {\n const { format, operate } = props\n let time = dayjs()\n if (operate) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n time = time.add(value, mode)\n break\n case 'minus':\n time = time.subtract(value, mode)\n }\n }\n return time.format(format)\n }\n const time = ref()\n watch(() => [props.operate, props.format], () => {\n time.value = handleTimeValue()\n }, {\n immediate: true,\n deep: true\n })\n watch(() => props.updateInterval, () => {\n setTimer()\n }, {\n deep: true\n })\n let timer = null\n const clearTimer = () => {\n clearInterval(timer)\n timer = null\n }\n const emitEvent = useEmitEvent(props)\n const timeChange = emitEvent('timeChange', () => {})\n const setTimer = () => {\n if (timer) {\n clearTimer()\n }\n // 1s 为初始值\n let intervalTime = 1000\n const { value, mode } = props.updateInterval || {}\n if (value) {\n intervalTime = intervalTime * value\n }\n const modeMap = {\n second: 1,\n minute: 60,\n hour: 60 * 60,\n day: 24 * 60 * 60\n }\n if (mode) {\n intervalTime = intervalTime * modeMap[mode]\n }\n timer = setInterval(() => {\n time.value = handleTimeValue()\n timeChange()\n }, intervalTime)\n }\n useOnEvent(props, {\n timeChange\n })\n onMounted(() => {\n setTimer()\n })\n onUnmounted(() => {\n clearTimer()\n })\n return {\n style,\n time\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.time-display {\n overflow: hidden;\n display: flex;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport TimeDisplay from './TimeDisplay.vue'\nexport const EcanTimeDisplay = withInstall(TimeDisplay)\nexport default EcanTimeDisplay\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface ListProps extends Props {\n data: { [key: string]: any } []\n columns: { [key: string]: any } []\n sliceCount: number,\n backgroundColor: string\n useRanking: boolean\n useTitle: boolean\n columnCount: number\n itemHeight: string\n itemColSpan: string\n itemRowSpan: string\n}\n\nexport const listProps:ListProps = {\n ...props,\n type: 'ecanList',\n name: '列表',\n keyName: '列表',\n width: '330px',\n height: '80px',\n backgroundColor: '#0d215e',\n itemColSpan: '10px',\n itemRowSpan: '10px',\n useRanking: true,\n useTitle: false,\n sliceCount: 6,\n columnCount: 1,\n itemHeight: '32px',\n data: [\n {\n name: 'a',\n age: 12\n },\n {\n name: 'b',\n age: 14\n }\n ],\n columns: [\n {\n key: 'name'\n },\n {\n key: 'age'\n }\n ]\n}\n\nexport const listComponentProps = transformToComponentProps(listProps)\n\nexport interface ListEvents {\n refreshData: () => void\n click: () => void\n}\n\nexport const listEvents: Array<keyof ListEvents> = ['refreshData', 'click']\n","<template>\n <div class=\"ecan-list\" :style=\"style\">\n <skeleton :loading=\"loading\">\n <div\n class=\"title\"\n v-if=\"useTitle\"\n >\n <div\n class=\"title-inner\"\n :style=\"{\n backgroundColor: backgroundColor,\n height: itemHeight,\n width: `calc(100% / ${columnCount} - ${itemColSpan} * ${columnCount - 1}/ ${columnCount})`,\n marginRight: count % columnCount !== 0 ? itemColSpan : ''\n }\"\n v-for=\"count in columnCount\"\n :key=\"count\"\n >\n <div class=\"ranking\" v-if=\"useRanking\" />\n <div\n class=\"column\"\n v-for=\"(column, i) in columns\"\n :key=\"column.key || i\"\n :style=\"{\n color: column.titleColor,\n ...columnStyle\n }\"\n >\n {{ column.title }}\n </div>\n </div>\n </div>\n <div class=\"ecan-list-content\" v-if=\"dataSource.length > 0\">\n <div\n class=\"title-placeholder\"\n :style=\"{\n marginBottom: itemRowSpan\n }\"\n v-if=\"useTitle\"\n />\n <div\n class=\"item\"\n :style=\"{\n backgroundColor: backgroundColor,\n height: itemHeight,\n width: `calc(100% / ${columnCount} - ${itemColSpan} * ${columnCount - 1} / ${columnCount})`,\n marginRight: (i + 1) % columnCount !== 0 ? itemColSpan : '',\n marginBottom: itemRowSpan\n }\"\n v-for=\"(item, i) in dataSource.slice(0, sliceCount)\"\n :key=\"item.id || i\"\n @click=\"click\"\n >\n <div class=\"ranking\" v-if=\"useRanking\">\n <div class=\"icon\"/>\n <div class=\"sort\">\n Top {{ i + 1 }}\n </div>\n </div>\n <div\n :class=\"['column', contrastClass(item[column.key], column.format)]\"\n v-for=\"column in columns\"\n :key=\"column.key\"\n :style=\"{\n fontSize: column.fontSize,\n color: contrastClass(item[column.key], column.format) === '' ? column.color : '',\n fontWeight: column.fontWeight,\n ...columnStyle\n }\"\n >\n {{ (column.format != null || column.format !== '') && formatFn(item[column.key], column.format) }}\n </div>\n </div>\n </div>\n <div class=\"empty\" v-else>\n 暂无数据\n </div>\n </skeleton>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref } from 'vue'\nimport { listComponentProps, ListEvents } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { formatMoney, formatPercentage } from '@/utils/util'\nimport { REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nimport Skeleton from '@/common/skeleton'\nexport default defineComponent({\n name: 'EcanList',\n components: { Skeleton },\n props: {\n ...listComponentProps\n },\n setup (props) {\n const dataSource = ref<{[key:string]: any} []>(props.data)\n const style = usePickComponentStyle(props, ['backgroundColor'])\n const columnStyle = computed(() => {\n if (props.useRanking) {\n return {\n textAlign: 'center'\n }\n } else {\n return {\n textAlign: 'left'\n }\n }\n })\n type Format = 'money' | 'percentage' | 'contrast' | ''\n const formatFn = (value: string | number, format?: Format) => {\n if (format == null || format === '') return value\n const map = {\n money: formatMoney,\n percentage: formatPercentage,\n contrast: formatPercentage\n }\n return map[format](value) || ''\n }\n const contrastClass = (value: string | number, format: Format) => {\n const _value = parseFloat(value + '')\n if (format !== 'contrast') {\n return ''\n }\n switch (true) {\n case _value >= 0:\n return 'goUp'\n case _value < 0:\n return 'goDown'\n }\n }\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n\n try {\n loading.value = true\n const res = await requestData()\n dataSource.value = res?.data?.data.rows || []\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n handleRequestData()\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {})\n\n useOnEvent(props, {\n refreshData\n } as ListEvents)\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n style,\n formatFn,\n columnStyle,\n contrastClass,\n dataSource,\n loading,\n click\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n .ecan-list {\n overflow: hidden;\n }\n .ecan-list-content {\n width: 100%;\n height: 100%;\n overflow: auto;\n display: flex;\n align-content: flex-start;\n flex-wrap: wrap;\n }\n .title {\n position: absolute;\n z-index: 9;\n display: flex;\n align-items: center;\n height: 32px;\n width: 100%;\n font-size: 16px;\n color: #ffffff;\n }\n .title-inner {\n padding-left: 28px;\n padding-right: 20px;\n flex: 1;\n display: flex;\n height: 100%;\n }\n .title-placeholder {\n width: 100%;\n height: 32px;\n }\n .item {\n display: flex;\n align-items: center;\n height: 32px;\n padding-left: 28px;\n padding-right: 20px;\n width: 100%;\n font-size: 16px;\n color: #ffffff;\n }\n .column {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ranking {\n flex: 1;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .icon {\n width: 12px;\n height: 8px;\n background: #21BEF7;\n margin-right: 17px;\n opacity: .6;\n }\n .item:nth-child(2) .icon {\n opacity: .8;\n }\n .item:first-child .icon{\n opacity: 1;\n }\n .sort {\n font-weight: 600;\n }\n .goUp {\n color: #FF512E;\n display: flex;\n align-items: center;\n &:before {\n content: '';\n display: block;\n background: url(\"../../assets/go-up.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n }\n\n .goDown {\n color: #39cf93;\n display: flex;\n align-items: center;\n &:before {\n content: '';\n display: block;\n background: url(\"../../assets/go-down.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n }\n .empty {\n text-align: center;\n margin-top: 15%;\n }\n</style>\n\n<style lang=\"less\">\n.ecan-list {\n *::-webkit-scrollbar-track {\n background-color: #fff;\n }\n\n .ant-table-cell-scrollbar {\n box-shadow: 0 1px 0 1px transparent;\n }\n *::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n *::-webkit-scrollbar-thumb {\n border-radius: 6px;\n -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);\n background-color: #c8c9ca;\n }\n}\n[datav-theme='darkBlue'] {\n .ecan-list {\n *::-webkit-scrollbar-thumb {\n background-color: #2f4dac !important;\n }\n *::-webkit-scrollbar-track{\n background-color: #192c70;\n }\n *::-webkit-scrollbar-corner {\n background-color: #192c70 !important;\n }\n .empty {\n color: #ffffff;\n }\n }\n}\n</style>\n","<template>\n <div class=\"ecan-list\" :style=\"style\">\n <skeleton :loading=\"loading\">\n <div\n class=\"title\"\n v-if=\"useTitle\"\n >\n <div\n class=\"title-inner\"\n :style=\"{\n backgroundColor: backgroundColor,\n height: itemHeight,\n width: `calc(100% / ${columnCount} - ${itemColSpan} * ${columnCount - 1}/ ${columnCount})`,\n marginRight: count % columnCount !== 0 ? itemColSpan : ''\n }\"\n v-for=\"count in columnCount\"\n :key=\"count\"\n >\n <div class=\"ranking\" v-if=\"useRanking\" />\n <div\n class=\"column\"\n v-for=\"(column, i) in columns\"\n :key=\"column.key || i\"\n :style=\"{\n color: column.titleColor,\n ...columnStyle\n }\"\n >\n {{ column.title }}\n </div>\n </div>\n </div>\n <div class=\"ecan-list-content\" v-if=\"dataSource.length > 0\">\n <div\n class=\"title-placeholder\"\n :style=\"{\n marginBottom: itemRowSpan\n }\"\n v-if=\"useTitle\"\n />\n <div\n class=\"item\"\n :style=\"{\n backgroundColor: backgroundColor,\n height: itemHeight,\n width: `calc(100% / ${columnCount} - ${itemColSpan} * ${columnCount - 1} / ${columnCount})`,\n marginRight: (i + 1) % columnCount !== 0 ? itemColSpan : '',\n marginBottom: itemRowSpan\n }\"\n v-for=\"(item, i) in dataSource.slice(0, sliceCount)\"\n :key=\"item.id || i\"\n @click=\"click\"\n >\n <div class=\"ranking\" v-if=\"useRanking\">\n <div class=\"icon\"/>\n <div class=\"sort\">\n Top {{ i + 1 }}\n </div>\n </div>\n <div\n :class=\"['column', contrastClass(item[column.key], column.format)]\"\n v-for=\"column in columns\"\n :key=\"column.key\"\n :style=\"{\n fontSize: column.fontSize,\n color: contrastClass(item[column.key], column.format) === '' ? column.color : '',\n fontWeight: column.fontWeight,\n ...columnStyle\n }\"\n >\n {{ (column.format != null || column.format !== '') && formatFn(item[column.key], column.format) }}\n </div>\n </div>\n </div>\n <div class=\"empty\" v-else>\n 暂无数据\n </div>\n </skeleton>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref } from 'vue'\nimport { listComponentProps, ListEvents } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { formatMoney, formatPercentage } from '@/utils/util'\nimport { REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nimport Skeleton from '@/common/skeleton'\nexport default defineComponent({\n name: 'EcanList',\n components: { Skeleton },\n props: {\n ...listComponentProps\n },\n setup (props) {\n const dataSource = ref<{[key:string]: any} []>(props.data)\n const style = usePickComponentStyle(props, ['backgroundColor'])\n const columnStyle = computed(() => {\n if (props.useRanking) {\n return {\n textAlign: 'center'\n }\n } else {\n return {\n textAlign: 'left'\n }\n }\n })\n type Format = 'money' | 'percentage' | 'contrast' | ''\n const formatFn = (value: string | number, format?: Format) => {\n if (format == null || format === '') return value\n const map = {\n money: formatMoney,\n percentage: formatPercentage,\n contrast: formatPercentage\n }\n return map[format](value) || ''\n }\n const contrastClass = (value: string | number, format: Format) => {\n const _value = parseFloat(value + '')\n if (format !== 'contrast') {\n return ''\n }\n switch (true) {\n case _value >= 0:\n return 'goUp'\n case _value < 0:\n return 'goDown'\n }\n }\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n\n try {\n loading.value = true\n const res = await requestData()\n dataSource.value = res?.data?.data.rows || []\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n handleRequestData()\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {})\n\n useOnEvent(props, {\n refreshData\n } as ListEvents)\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n style,\n formatFn,\n columnStyle,\n contrastClass,\n dataSource,\n loading,\n click\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n .ecan-list {\n overflow: hidden;\n }\n .ecan-list-content {\n width: 100%;\n height: 100%;\n overflow: auto;\n display: flex;\n align-content: flex-start;\n flex-wrap: wrap;\n }\n .title {\n position: absolute;\n z-index: 9;\n display: flex;\n align-items: center;\n height: 32px;\n width: 100%;\n font-size: 16px;\n color: #ffffff;\n }\n .title-inner {\n padding-left: 28px;\n padding-right: 20px;\n flex: 1;\n display: flex;\n height: 100%;\n }\n .title-placeholder {\n width: 100%;\n height: 32px;\n }\n .item {\n display: flex;\n align-items: center;\n height: 32px;\n padding-left: 28px;\n padding-right: 20px;\n width: 100%;\n font-size: 16px;\n color: #ffffff;\n }\n .column {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .ranking {\n flex: 1;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .icon {\n width: 12px;\n height: 8px;\n background: #21BEF7;\n margin-right: 17px;\n opacity: .6;\n }\n .item:nth-child(2) .icon {\n opacity: .8;\n }\n .item:first-child .icon{\n opacity: 1;\n }\n .sort {\n font-weight: 600;\n }\n .goUp {\n color: #FF512E;\n display: flex;\n align-items: center;\n &:before {\n content: '';\n display: block;\n background: url(\"../../assets/go-up.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n }\n\n .goDown {\n color: #39cf93;\n display: flex;\n align-items: center;\n &:before {\n content: '';\n display: block;\n background: url(\"../../assets/go-down.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n }\n .empty {\n text-align: center;\n margin-top: 15%;\n }\n</style>\n\n<style lang=\"less\">\n.ecan-list {\n *::-webkit-scrollbar-track {\n background-color: #fff;\n }\n\n .ant-table-cell-scrollbar {\n box-shadow: 0 1px 0 1px transparent;\n }\n *::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n *::-webkit-scrollbar-thumb {\n border-radius: 6px;\n -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.3);\n background-color: #c8c9ca;\n }\n}\n[datav-theme='darkBlue'] {\n .ecan-list {\n *::-webkit-scrollbar-thumb {\n background-color: #2f4dac !important;\n }\n *::-webkit-scrollbar-track{\n background-color: #192c70;\n }\n *::-webkit-scrollbar-corner {\n background-color: #192c70 !important;\n }\n .empty {\n color: #ffffff;\n }\n }\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport List from './List.vue'\nexport const EcanList = withInstall(List)\nexport default EcanList\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface ProportionProps extends Props {\n strokeColor: string // 进度条的色彩\n strokeLinecap: 'round' | 'square' // 进度条的样式\n trailColor: string // 未完成的分段的颜色\n strokeType: 'circle' | 'dashboard',\n data: { [key:string]: any }\n text: string\n fontSize: string\n color: string\n strokeWidth: number\n fontWeight: number\n strokeTextWidth: string\n lineHeight: string\n decimalFormat: boolean\n variableDefaultValue: string\n}\n\nexport const proportionProps: ProportionProps = {\n ...props,\n name: '占比图',\n keyName: '占比图',\n type: 'ecanProportion',\n strokeType: 'circle',\n width: '200px',\n height: '200px',\n strokeColor: '#4091f7',\n strokeLinecap: 'round',\n trailColor: '#f5f5f5',\n data: {\n percent: 0.30\n },\n text: '{percent}%',\n fontSize: '26px',\n color: '#4091f7',\n strokeWidth: 6,\n fontWeight: 400,\n strokeTextWidth: '100%',\n lineHeight: '26px',\n decimalFormat: true,\n variableDefaultValue: '0'\n}\n\nexport const proportionComponentProps = transformToComponentProps(proportionProps)\n\nexport const proportionEvents = ['refreshData', 'click']\n","<template>\n <div class=\"ecan-proportion\" :style=\"style\">\n <a-progress\n class=\"progress\"\n :percent=\"myValue\"\n :width=\"myWidth\"\n :type=\"strokeType\"\n :strokeColor=\"strokeColor\"\n :strokeLinecap=\"strokeLinecap\"\n :trailColor=\"trailColor\"\n :strokeWidth=\"strokeWidth\"\n :gapDegree=\"strokeType === 'dashboard' ? 75 : 0\"\n @click=\"click\"\n >\n <template #format>\n <skeleton v-if=\"loading\" :loading=\"loading\"/>\n <div\n v-else\n class=\"format\"\n :style=\"{\n width: strokeTextWidth,\n fontSize,\n color,\n fontWeight,\n lineHeight\n }\">\n {{ text }}\n </div>\n </template>\n </a-progress>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport 'ant-design-vue/es/progress/style'\nimport { Progress as AProgress } from 'ant-design-vue'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { proportionComponentProps } from './props'\nimport { GLOBAL_CONFIG, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '../../common/skeleton'\nimport { RequestModalParam } from '@/utils/types'\nimport runCode from '@/utils/runCode'\nexport default defineComponent({\n name: 'EcanProportion',\n components: {\n AProgress,\n Skeleton\n },\n props: {\n ...proportionComponentProps\n },\n setup (props) {\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const style = usePickComponentStyle(props)\n const myWidth = computed(() => {\n const width = props.width\n return parseFloat(width)\n })\n const myData = ref<{ [key:string]: any }>({})\n watch(() => props.data, () => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n myData.value = props.data\n }\n }, {\n immediate: true,\n deep: true\n })\n const myValue = computed(() => {\n const data = unref(myData)\n const defaultValue = +(props.variableDefaultValue)\n if (data == null) {\n if (!isNaN(defaultValue)) {\n return defaultValue\n } else {\n return 0\n }\n }\n const variables = (props.text).match(/\\{.+\\}/g) || []\n let value\n const valueSet = new Set(Object.keys(data))\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n const key = variable.slice(1, variable.length - 1)\n if (valueSet.has(key)) {\n value = data[key]\n break\n }\n }\n\n if (typeof value === 'number') {\n value = value * 100\n } else if (typeof value === 'string' && !isNaN(+value)) {\n value = (+value) * 100\n } else if (!isNaN(defaultValue)) {\n value = defaultValue * 100\n } else {\n value = 0\n }\n\n if (props.decimalFormat) {\n value = +value.toFixed(2)\n }\n return value\n })\n const text = computed(() => {\n let text = props.text\n if (text === '') return unref(myValue)\n const defaultValue = props.variableDefaultValue // 变量默认值\n const data = unref(myData) // { a: 1, b: 2 }\n const variables = (text).match(/\\{.+\\}/g) || []\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n let statement = variable.slice(1, variable.length - 1) // { a - b} => a - b\n const reg = /[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g\n const textVariables = variable.match(reg)\n for (let j = 0; j < textVariables?.length; j++) { // \"1 - 2\"\n const textVariable = textVariables[j]?.trim()\n if (data[textVariable] != null) {\n statement = statement.replace(textVariable, data[textVariable])\n } else {\n // statement = statement.replace(textVariable, defaultValue)\n }\n }\n // 匹配加减乘除\n let usedVariable:number | string = statement\n // 运行表达式\n try {\n if ((/\\(.*\\)/g).test(statement)) {\n usedVariable = runCode(statement)\n }\n } catch (e) {\n console.error(e)\n }\n if (typeof +usedVariable === 'number' && !isNaN(+usedVariable)) {\n usedVariable = (+usedVariable * 100)\n if (props.decimalFormat) {\n usedVariable = usedVariable.toFixed(2)\n }\n } else {\n usedVariable = defaultValue\n }\n text = text.replace(variable, usedVariable + '')\n }\n return text\n })\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n myData.value = res?.data?.data || {}\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const refreshData = () => {\n handleRequestData()\n }\n useOnEvent(props, {\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {})\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n\n return {\n style,\n myWidth,\n text,\n myValue,\n loading,\n click\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-proportion {\n overflow: hidden;\n}\n\n.progress {\n width: 100%;\n height: 100%;\n}\n\n.format {\n margin: 0 auto;\n}\n</style>\n","<template>\n <div class=\"ecan-proportion\" :style=\"style\">\n <a-progress\n class=\"progress\"\n :percent=\"myValue\"\n :width=\"myWidth\"\n :type=\"strokeType\"\n :strokeColor=\"strokeColor\"\n :strokeLinecap=\"strokeLinecap\"\n :trailColor=\"trailColor\"\n :strokeWidth=\"strokeWidth\"\n :gapDegree=\"strokeType === 'dashboard' ? 75 : 0\"\n @click=\"click\"\n >\n <template #format>\n <skeleton v-if=\"loading\" :loading=\"loading\"/>\n <div\n v-else\n class=\"format\"\n :style=\"{\n width: strokeTextWidth,\n fontSize,\n color,\n fontWeight,\n lineHeight\n }\">\n {{ text }}\n </div>\n </template>\n </a-progress>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport 'ant-design-vue/es/progress/style'\nimport { Progress as AProgress } from 'ant-design-vue'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { proportionComponentProps } from './props'\nimport { GLOBAL_CONFIG, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '../../common/skeleton'\nimport { RequestModalParam } from '@/utils/types'\nimport runCode from '@/utils/runCode'\nexport default defineComponent({\n name: 'EcanProportion',\n components: {\n AProgress,\n Skeleton\n },\n props: {\n ...proportionComponentProps\n },\n setup (props) {\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const style = usePickComponentStyle(props)\n const myWidth = computed(() => {\n const width = props.width\n return parseFloat(width)\n })\n const myData = ref<{ [key:string]: any }>({})\n watch(() => props.data, () => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n myData.value = props.data\n }\n }, {\n immediate: true,\n deep: true\n })\n const myValue = computed(() => {\n const data = unref(myData)\n const defaultValue = +(props.variableDefaultValue)\n if (data == null) {\n if (!isNaN(defaultValue)) {\n return defaultValue\n } else {\n return 0\n }\n }\n const variables = (props.text).match(/\\{.+\\}/g) || []\n let value\n const valueSet = new Set(Object.keys(data))\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n const key = variable.slice(1, variable.length - 1)\n if (valueSet.has(key)) {\n value = data[key]\n break\n }\n }\n\n if (typeof value === 'number') {\n value = value * 100\n } else if (typeof value === 'string' && !isNaN(+value)) {\n value = (+value) * 100\n } else if (!isNaN(defaultValue)) {\n value = defaultValue * 100\n } else {\n value = 0\n }\n\n if (props.decimalFormat) {\n value = +value.toFixed(2)\n }\n return value\n })\n const text = computed(() => {\n let text = props.text\n if (text === '') return unref(myValue)\n const defaultValue = props.variableDefaultValue // 变量默认值\n const data = unref(myData) // { a: 1, b: 2 }\n const variables = (text).match(/\\{.+\\}/g) || []\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i]\n let statement = variable.slice(1, variable.length - 1) // { a - b} => a - b\n const reg = /[\\u4e00-\\u9fa5a-z-_A-Z0-9]*/g\n const textVariables = variable.match(reg)\n for (let j = 0; j < textVariables?.length; j++) { // \"1 - 2\"\n const textVariable = textVariables[j]?.trim()\n if (data[textVariable] != null) {\n statement = statement.replace(textVariable, data[textVariable])\n } else {\n // statement = statement.replace(textVariable, defaultValue)\n }\n }\n // 匹配加减乘除\n let usedVariable:number | string = statement\n // 运行表达式\n try {\n if ((/\\(.*\\)/g).test(statement)) {\n usedVariable = runCode(statement)\n }\n } catch (e) {\n console.error(e)\n }\n if (typeof +usedVariable === 'number' && !isNaN(+usedVariable)) {\n usedVariable = (+usedVariable * 100)\n if (props.decimalFormat) {\n usedVariable = usedVariable.toFixed(2)\n }\n } else {\n usedVariable = defaultValue\n }\n text = text.replace(variable, usedVariable + '')\n }\n return text\n })\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n myData.value = res?.data?.data || {}\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const refreshData = () => {\n handleRequestData()\n }\n useOnEvent(props, {\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', () => {})\n\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n\n return {\n style,\n myWidth,\n text,\n myValue,\n loading,\n click\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-proportion {\n overflow: hidden;\n}\n\n.progress {\n width: 100%;\n height: 100%;\n}\n\n.format {\n margin: 0 auto;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Proportion from './Proportion.vue'\nexport const EcanProportion = withInstall(Proportion)\nexport default EcanProportion\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface InputProps extends Props {\n value: string,\n placeholder: string\n}\n\nexport const inputProps: InputProps = {\n ...props,\n width: '200px',\n id: '',\n left: '0px',\n top: '0px',\n name: '输入框',\n keyName: '输入框',\n rotate: '',\n type: 'ecanInput',\n value: '',\n placeholder: '请输入文字'\n}\n\n// 转化默认属性\nexport const inputComponentProps = transformToComponentProps(inputProps)\n\nexport const inputEvents = ['inputChange', 'inputBlur']\n","<template>\n <div\n class=\"ecan-input\"\n :style=\"style\"\n >\n <a-input\n class=\"input\"\n v-model:value=\"myValue\"\n :placeholder=\"placeholder\"\n @change=\"inputChange\"\n @blur=\"inputBlur\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, watch } from 'vue'\nimport { useEmitEvent, usePickComponentStyle } from '@/hooks'\nimport { Input as AInput } from 'ant-design-vue'\nimport 'ant-design-vue/es/input/style'\nimport { inputComponentProps } from './props'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport { debounce } from 'lodash-es'\nexport default defineComponent({\n name: 'EcanInput',\n components: {\n AInput\n },\n props: {\n ...inputComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myValue = ref<string>('')\n watch(() => props.value, (value: string) => {\n myValue.value = value\n }, {\n immediate: true\n })\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n const handleSetGlobalModel = () => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: myValue })\n }\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const inputChange = debounce(emitEvent('inputChange', () => {\n handleSetGlobalModel()\n }), 300)\n const inputBlur = emitEvent('inputBlur', () => {\n })\n return {\n style,\n myValue,\n inputBlur,\n inputChange\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-input {\n .ant-input {\n width: 100%;\n height: 100%;\n }\n}\n\n[datav-theme='light'] .ecan-input {\n .ant-input{\n color: rgba(0, 0, 0, 0.65);\n background-color: #ffffff;\n border: 1px solid #d9d9d9;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-input {\n .ant-input{\n border: 1px solid #1f63a3;\n background-color: #05164c;\n box-shadow: inset 0 0 10px #005efe;\n color: #ffffff;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-input\"\n :style=\"style\"\n >\n <a-input\n class=\"input\"\n v-model:value=\"myValue\"\n :placeholder=\"placeholder\"\n @change=\"inputChange\"\n @blur=\"inputBlur\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, watch } from 'vue'\nimport { useEmitEvent, usePickComponentStyle } from '@/hooks'\nimport { Input as AInput } from 'ant-design-vue'\nimport 'ant-design-vue/es/input/style'\nimport { inputComponentProps } from './props'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport { debounce } from 'lodash-es'\nexport default defineComponent({\n name: 'EcanInput',\n components: {\n AInput\n },\n props: {\n ...inputComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myValue = ref<string>('')\n watch(() => props.value, (value: string) => {\n myValue.value = value\n }, {\n immediate: true\n })\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n const handleSetGlobalModel = () => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: myValue })\n }\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const inputChange = debounce(emitEvent('inputChange', () => {\n handleSetGlobalModel()\n }), 300)\n const inputBlur = emitEvent('inputBlur', () => {\n })\n return {\n style,\n myValue,\n inputBlur,\n inputChange\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-input {\n .ant-input {\n width: 100%;\n height: 100%;\n }\n}\n\n[datav-theme='light'] .ecan-input {\n .ant-input{\n color: rgba(0, 0, 0, 0.65);\n background-color: #ffffff;\n border: 1px solid #d9d9d9;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-input {\n .ant-input{\n border: 1px solid #1f63a3;\n background-color: #05164c;\n box-shadow: inset 0 0 10px #005efe;\n color: #ffffff;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Input from './Input.vue'\nexport const EcanInput = withInstall(Input)\nexport default EcanInput\nexport * from './props'\n","import {\n Props,\n EventsProp,\n props,\n transformToComponentProps,\n DateOperate\n} from '@/utils/props'\n\nexport interface DatePickerProps extends Props, EventsProp {\n value: string\n picker: 'date' | 'week' | 'month' | 'quarter' | 'year'\n format: string\n showTime: boolean // 增加时间选择功能\n useCurrentTime: boolean\n operate: null | DateOperate\n}\n\nexport const datePickerProps: DatePickerProps = {\n ...props,\n height: '33px',\n width: '130px',\n id: '',\n left: '0px',\n top: '0px',\n name: '日期选择器',\n keyName: '日期选择器',\n rotate: '',\n type: 'ecanDatePicker',\n value: '',\n picker: 'date',\n format: 'YYYY-MM-DD',\n showTime: false,\n useCurrentTime: true,\n operate: null\n}\nexport const datePickerComponentProps = transformToComponentProps(datePickerProps)\n\nexport const datePickerEvents = ['dateChange']\n","<template>\n <div\n class=\"ecan-date-picker\"\n :style=\"style\"\n >\n <!-- 宽度style有效,class无效 -->\n <a-date-picker\n class=\"date-picker\"\n dropdownClassName=\"ecan-date-picker-dropdown\"\n v-model:value=\"myValue\"\n :format=\"format\"\n :picker=\"picker\"\n :showTime=\"showTime\"\n :locale=\"locale\"\n @change=\"change\"\n :getPopupContainer=\"getPopupContainer\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, unref, watch } from 'vue'\nimport { datePickerComponentProps } from './props'\nimport { DateOperate } from '@/utils/props'\nimport { DatePicker as ADatePicker } from 'ant-design-vue'\nimport 'ant-design-vue/es/date-picker/style'\nimport { usePickComponentStyle, useOnEvent, useEmitEvent } from '@/hooks'\nimport locale from 'ant-design-vue/es/date-picker/locale/zh_CN'\nimport dayjs, { Dayjs } from 'dayjs'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport useVariablesInText from '../../hooks/useVariablesInText'\nexport default defineComponent({\n name: 'EcanDatePicker',\n props: {\n ...datePickerComponentProps\n },\n components: {\n ADatePicker\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const myValue = ref<Dayjs | null>(null)\n watch(() => [props.value, props.useCurrentTime, props.operate], ([value, useCurrentTime, operate]: [string, boolean, DateOperate]) => {\n let _value: Dayjs = null\n if (value) {\n _value = dayjs(useVariablesInText(value))\n } else if (useCurrentTime) {\n _value = dayjs()\n }\n // 操作时间\n if (operate && _value) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n _value = _value.add(value, mode)\n break\n case 'minus':\n _value = _value.subtract(value, mode)\n }\n }\n myValue.value = _value\n }, {\n deep: true,\n immediate: true\n })\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n format: props.format,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const dateChange = emitEvent('dateChange', () => {\n })\n const change = () => {\n if (unref(myValue)) {\n dateChange()\n }\n }\n useOnEvent(props, {\n dateChange\n })\n return {\n style,\n getPopupContainer,\n myValue,\n locale,\n change\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-date-picker {\n .date-picker {\n width: 100%;\n height: 100%\n }\n}\n[datav-theme='light'] .ecan-date-picker {\n .ant-picker {\n background-color: #ffffff;\n color: rgba(0, 0, 0, 0.85);\n border: 1px solid #d9d9d9;\n }\n .ant-picker-input > input {\n color: rgba(0, 0, 0, 0.85);\n }\n .anticon-calendar {\n color: #333;\n }\n .anticon-close-circle {\n color: #333;\n }\n\n .ant-picker-input > input::placeholder {\n color: #bfbfbf;\n }\n}\n[datav-theme='darkBlue'] .ecan-date-picker {\n .ant-picker {\n background-color: #05164c;\n border: 1px solid #1f63a3;\n color: #fff;\n box-shadow: inset 0 0 10px #005efe;\n }\n .ant-picker-input > input {\n color: #ffffff;\n }\n .anticon-calendar {\n color: #ffffff;\n }\n .anticon-close-circle {\n color: #333;\n }\n}\n[datav-theme='darkBlue'] .ecan-date-picker-dropdown {\n .ant-picker-panel {\n background: #05174e;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-header {\n color: #69befa;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #69befa;\n }\n .ant-picker-header button {\n color: #69befa;\n }\n .ant-picker-content th {\n color: #69befa;\n }\n .ant-picker-content td {\n color: #69befa;\n }\n .ant-picker-today-btn {\n color: #69befa;\n }\n .ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner, .ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner {\n background: #1890ff;\n color: #ffffff;\n }\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner {\n color: #69befa;\n }\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover {\n background: #1890ff;\n color: #ffffff;\n }\n\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner {\n background: #1890ff;\n color: #ffffff;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-date-picker\"\n :style=\"style\"\n >\n <!-- 宽度style有效,class无效 -->\n <a-date-picker\n class=\"date-picker\"\n dropdownClassName=\"ecan-date-picker-dropdown\"\n v-model:value=\"myValue\"\n :format=\"format\"\n :picker=\"picker\"\n :showTime=\"showTime\"\n :locale=\"locale\"\n @change=\"change\"\n :getPopupContainer=\"getPopupContainer\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, unref, watch } from 'vue'\nimport { datePickerComponentProps } from './props'\nimport { DateOperate } from '@/utils/props'\nimport { DatePicker as ADatePicker } from 'ant-design-vue'\nimport 'ant-design-vue/es/date-picker/style'\nimport { usePickComponentStyle, useOnEvent, useEmitEvent } from '@/hooks'\nimport locale from 'ant-design-vue/es/date-picker/locale/zh_CN'\nimport dayjs, { Dayjs } from 'dayjs'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport useVariablesInText from '../../hooks/useVariablesInText'\nexport default defineComponent({\n name: 'EcanDatePicker',\n props: {\n ...datePickerComponentProps\n },\n components: {\n ADatePicker\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const myValue = ref<Dayjs | null>(null)\n watch(() => [props.value, props.useCurrentTime, props.operate], ([value, useCurrentTime, operate]: [string, boolean, DateOperate]) => {\n let _value: Dayjs = null\n if (value) {\n _value = dayjs(useVariablesInText(value))\n } else if (useCurrentTime) {\n _value = dayjs()\n }\n // 操作时间\n if (operate && _value) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n _value = _value.add(value, mode)\n break\n case 'minus':\n _value = _value.subtract(value, mode)\n }\n }\n myValue.value = _value\n }, {\n deep: true,\n immediate: true\n })\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n format: props.format,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const dateChange = emitEvent('dateChange', () => {\n })\n const change = () => {\n if (unref(myValue)) {\n dateChange()\n }\n }\n useOnEvent(props, {\n dateChange\n })\n return {\n style,\n getPopupContainer,\n myValue,\n locale,\n change\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-date-picker {\n .date-picker {\n width: 100%;\n height: 100%\n }\n}\n[datav-theme='light'] .ecan-date-picker {\n .ant-picker {\n background-color: #ffffff;\n color: rgba(0, 0, 0, 0.85);\n border: 1px solid #d9d9d9;\n }\n .ant-picker-input > input {\n color: rgba(0, 0, 0, 0.85);\n }\n .anticon-calendar {\n color: #333;\n }\n .anticon-close-circle {\n color: #333;\n }\n\n .ant-picker-input > input::placeholder {\n color: #bfbfbf;\n }\n}\n[datav-theme='darkBlue'] .ecan-date-picker {\n .ant-picker {\n background-color: #05164c;\n border: 1px solid #1f63a3;\n color: #fff;\n box-shadow: inset 0 0 10px #005efe;\n }\n .ant-picker-input > input {\n color: #ffffff;\n }\n .anticon-calendar {\n color: #ffffff;\n }\n .anticon-close-circle {\n color: #333;\n }\n}\n[datav-theme='darkBlue'] .ecan-date-picker-dropdown {\n .ant-picker-panel {\n background: #05174e;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-header {\n color: #69befa;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #69befa;\n }\n .ant-picker-header button {\n color: #69befa;\n }\n .ant-picker-content th {\n color: #69befa;\n }\n .ant-picker-content td {\n color: #69befa;\n }\n .ant-picker-today-btn {\n color: #69befa;\n }\n .ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner, .ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner {\n background: #1890ff;\n color: #ffffff;\n }\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner {\n color: #69befa;\n }\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover {\n background: #1890ff;\n color: #ffffff;\n }\n\n .ant-picker-time-panel-column > li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner {\n background: #1890ff;\n color: #ffffff;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport DatePicker from './DatePicker.vue'\nexport const EcanDatePicker = withInstall(DatePicker)\nexport default EcanDatePicker\nexport * from './props'\n","import { Props, props, transformToComponentProps, DateOperate } from '@/utils/props'\nimport { ManipulateType } from 'dayjs'\nexport interface RangePickerProps extends Props {\n picker: 'date' | 'week' | 'month' | 'quarter' | 'year'\n format: string\n limitStartTime: string\n limitEndTime: string\n startTime: string // 开始时间\n endTime: string // 结束时间\n useCurrentTime: boolean\n interval: number\n intervalUnit: ManipulateType\n operate: DateOperate\n}\n\nexport const rangePickerProps: RangePickerProps = {\n ...props,\n name: '日期范围选择器',\n keyName: '日期范围选择器',\n type: 'ecanRangePicker',\n width: '250px',\n height: '35px',\n picker: 'date',\n format: 'YYYY-MM-DD',\n startTime: '',\n endTime: '',\n useCurrentTime: true,\n interval: 1,\n intervalUnit: 'year',\n operate: null,\n limitStartTime: '',\n limitEndTime: ''\n}\n\nexport const rangePickerComponentProps = transformToComponentProps(rangePickerProps)\n\nexport const rangePickerEvents = ['dateChange']\n","<template>\n <div\n class=\"ecan-range-picker\"\n :style=\"style\"\n >\n <a-range-picker\n class=\"range-picker\"\n dropdownClassName=\"ecan-range-picker-dropdown\"\n v-model:value=\"myValue\"\n :format=\"format\"\n :picker=\"picker\"\n :locale=\"locale\"\n :getPopupContainer=\"getPopupContainer\"\n :disabled-date=\"disabledDate\"\n @change=\"change\"\n @calendarChange=\"calendarChange\"\n @openChange=\"openChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, unref, watch, ref } from 'vue'\nimport { rangePickerComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useVariablesInText } from '@/hooks'\nimport { RangePicker as ARangePicker } from 'ant-design-vue'\nimport locale from 'ant-design-vue/es/date-picker/locale/zh_CN'\n// antdv 中 range-picker 组件与 date-picker 共用一个样式\nimport 'ant-design-vue/es/date-picker/style'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport dayjs, { Dayjs, ManipulateType } from 'dayjs'\nimport { DateOperate } from '@/utils/props'\nexport default defineComponent({\n name: 'EcanRangePicker',\n components: {\n ARangePicker\n },\n props: {\n ...rangePickerComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const myValue = ref<[Dayjs, Dayjs]>([null, null])\n watch(() => [props.startTime, props.endTime, props.useCurrentTime, props.interval, props.intervalUnit, props.operate], ([startTime, endTime, useCurrentTime, interval, intervalUnit, operate]: [string, string, boolean, number, ManipulateType, DateOperate]) => {\n let _startTime: Dayjs = null\n let _endTime: Dayjs = null\n if (useCurrentTime) {\n _startTime = dayjs().subtract(interval, intervalUnit)\n _endTime = dayjs()\n }\n if (startTime) {\n _startTime = dayjs(useVariablesInText(startTime))\n }\n if (endTime) {\n _endTime = dayjs(useVariablesInText(endTime))\n }\n\n if (operate) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n _startTime = _startTime ? _startTime.add(value, mode) : _startTime\n _endTime = _endTime ? _endTime.add(value, mode) : _endTime\n break\n case 'minus':\n _startTime = _startTime ? _startTime.subtract(value, mode) : _startTime\n _endTime = _endTime ? _endTime.subtract(value, mode) : _endTime\n }\n }\n\n myValue.value = [_startTime, _endTime]\n }, {\n immediate: true\n })\n\n let calendarStartTime: Dayjs = unref(myValue)[0]\n let calendarEndTime: Dayjs = unref(myValue)[1]\n const calendarChange = (range: [Dayjs, Dayjs] | null) => {\n if (Array.isArray(range)) {\n calendarStartTime = range[0]\n calendarEndTime = range[1]\n // let { limitStartTime, limitEndTime } = props\n // const data = {\n // startTime: `${calendarStartTime || ''}`,\n // endTime: `${calendarEndTime || ''}`\n // }\n // limitStartTime = useVariablesInText(limitStartTime, { codeData: data })\n // limitEndTime = useVariablesInText(limitEndTime, { codeData: data })\n // if (limitStartTime && unref(myStartTime) < dayjs(limitStartTime)) {\n // myValue.value = [null, unref(myValue)[1]]\n // }\n // if (limitEndTime && unref(myEndTime) > dayjs(limitEndTime)) {\n // myValue.value = [unref(myValue)[0], null]\n // }\n } else {\n calendarStartTime = null\n calendarEndTime = null\n }\n }\n const disabledDate = (current: Dayjs) => {\n let isDisabled = false\n let { limitStartTime, limitEndTime } = props\n const data = {\n startTime: `${calendarStartTime || ''}`,\n endTime: `${calendarEndTime || ''}`\n }\n limitStartTime = useVariablesInText(limitStartTime, { codeData: data })\n limitEndTime = useVariablesInText(limitEndTime, { codeData: data })\n if (limitStartTime && limitEndTime) {\n isDisabled = !(dayjs(limitStartTime) < current && current < dayjs(limitEndTime))\n } else if (limitStartTime) {\n isDisabled = dayjs(limitStartTime) > current\n } else if (limitEndTime) {\n isDisabled = dayjs(limitEndTime) < current\n }\n return isDisabled\n }\n\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const myStartTime = computed(() => Array.isArray(unref(myValue)) ? unref(myValue)[0] : null)\n const myEndTime = computed(() => Array.isArray(unref(myValue)) ? unref(myValue)[1] : null)\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n format: props.format,\n startTime: myStartTime,\n endTime: myEndTime\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n let isDateChange = false\n const dateChange = emitEvent('dateChange', () => {\n })\n const openChange = (status: boolean) => {\n // 关闭时,判断时间是否改变,再触发事件\n const value = unref(myValue)\n // 判断有值\n const isNotNull = value && value[0] && value[1]\n if (status === false && isDateChange === true && isNotNull) {\n dateChange()\n isDateChange = false\n }\n }\n const change = () => {\n isDateChange = true\n }\n useOnEvent(props, {\n dateChange\n })\n return {\n style,\n getPopupContainer,\n locale,\n dateChange,\n myValue,\n disabledDate,\n calendarChange,\n openChange,\n change\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.range-picker {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n[datav-theme='light'] .ecan-range-picker{\n .ant-picker {\n background-color: #ffffff;\n color: rgba(0, 0, 0, 0.85);\n border: 1px solid #d9d9d9;\n }\n .ant-picker-input > input {\n color: rgba(0, 0, 0, 0.85);\n }\n .anticon-calendar {\n color: #333;\n }\n .anticon-close-circle {\n color: #333;\n }\n .ant-picker-input > input::placeholder {\n color: #bfbfbf;\n }\n .ant-picker-separator .anticon {\n color:#333;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-range-picker {\n .ant-picker {\n background-color: #05164c;\n border: 1px solid #1f63a3;\n color: #fff;\n box-shadow: inset 0 0 10px #005efe;\n }\n .ant-picker-input > input {\n color: #ffffff;\n }\n .anticon-calendar {\n color: #ffffff;\n }\n .anticon-close-circle {\n color: #333;\n }\n .ant-picker-separator .anticon {\n color:#fff;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-range-picker-dropdown {\n .ant-picker-panel {\n background: #05174e;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-header {\n color: #69befa;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #69befa;\n }\n .ant-picker-header button {\n color: #69befa;\n }\n .ant-picker-content th {\n color: #69befa;\n }\n .ant-picker-content td {\n color: #69befa;\n }\n .ant-picker-today-btn {\n color: #69befa;\n }\n .ant-picker-cell-disabled .ant-picker-cell-inner {\n color: #999;\n }\n .ant-picker-cell-disabled::before {\n background: #333;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-range-picker\"\n :style=\"style\"\n >\n <a-range-picker\n class=\"range-picker\"\n dropdownClassName=\"ecan-range-picker-dropdown\"\n v-model:value=\"myValue\"\n :format=\"format\"\n :picker=\"picker\"\n :locale=\"locale\"\n :getPopupContainer=\"getPopupContainer\"\n :disabled-date=\"disabledDate\"\n @change=\"change\"\n @calendarChange=\"calendarChange\"\n @openChange=\"openChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, unref, watch, ref } from 'vue'\nimport { rangePickerComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useVariablesInText } from '@/hooks'\nimport { RangePicker as ARangePicker } from 'ant-design-vue'\nimport locale from 'ant-design-vue/es/date-picker/locale/zh_CN'\n// antdv 中 range-picker 组件与 date-picker 共用一个样式\nimport 'ant-design-vue/es/date-picker/style'\nimport { GLOBAL_MODEL } from '@/utils/constant'\nimport dayjs, { Dayjs, ManipulateType } from 'dayjs'\nimport { DateOperate } from '@/utils/props'\nexport default defineComponent({\n name: 'EcanRangePicker',\n components: {\n ARangePicker\n },\n props: {\n ...rangePickerComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const myValue = ref<[Dayjs, Dayjs]>([null, null])\n watch(() => [props.startTime, props.endTime, props.useCurrentTime, props.interval, props.intervalUnit, props.operate], ([startTime, endTime, useCurrentTime, interval, intervalUnit, operate]: [string, string, boolean, number, ManipulateType, DateOperate]) => {\n let _startTime: Dayjs = null\n let _endTime: Dayjs = null\n if (useCurrentTime) {\n _startTime = dayjs().subtract(interval, intervalUnit)\n _endTime = dayjs()\n }\n if (startTime) {\n _startTime = dayjs(useVariablesInText(startTime))\n }\n if (endTime) {\n _endTime = dayjs(useVariablesInText(endTime))\n }\n\n if (operate) {\n const { type, value, mode } = operate\n switch (type) {\n case 'add':\n _startTime = _startTime ? _startTime.add(value, mode) : _startTime\n _endTime = _endTime ? _endTime.add(value, mode) : _endTime\n break\n case 'minus':\n _startTime = _startTime ? _startTime.subtract(value, mode) : _startTime\n _endTime = _endTime ? _endTime.subtract(value, mode) : _endTime\n }\n }\n\n myValue.value = [_startTime, _endTime]\n }, {\n immediate: true\n })\n\n let calendarStartTime: Dayjs = unref(myValue)[0]\n let calendarEndTime: Dayjs = unref(myValue)[1]\n const calendarChange = (range: [Dayjs, Dayjs] | null) => {\n if (Array.isArray(range)) {\n calendarStartTime = range[0]\n calendarEndTime = range[1]\n // let { limitStartTime, limitEndTime } = props\n // const data = {\n // startTime: `${calendarStartTime || ''}`,\n // endTime: `${calendarEndTime || ''}`\n // }\n // limitStartTime = useVariablesInText(limitStartTime, { codeData: data })\n // limitEndTime = useVariablesInText(limitEndTime, { codeData: data })\n // if (limitStartTime && unref(myStartTime) < dayjs(limitStartTime)) {\n // myValue.value = [null, unref(myValue)[1]]\n // }\n // if (limitEndTime && unref(myEndTime) > dayjs(limitEndTime)) {\n // myValue.value = [unref(myValue)[0], null]\n // }\n } else {\n calendarStartTime = null\n calendarEndTime = null\n }\n }\n const disabledDate = (current: Dayjs) => {\n let isDisabled = false\n let { limitStartTime, limitEndTime } = props\n const data = {\n startTime: `${calendarStartTime || ''}`,\n endTime: `${calendarEndTime || ''}`\n }\n limitStartTime = useVariablesInText(limitStartTime, { codeData: data })\n limitEndTime = useVariablesInText(limitEndTime, { codeData: data })\n if (limitStartTime && limitEndTime) {\n isDisabled = !(dayjs(limitStartTime) < current && current < dayjs(limitEndTime))\n } else if (limitStartTime) {\n isDisabled = dayjs(limitStartTime) > current\n } else if (limitEndTime) {\n isDisabled = dayjs(limitEndTime) < current\n }\n return isDisabled\n }\n\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const myStartTime = computed(() => Array.isArray(unref(myValue)) ? unref(myValue)[0] : null)\n const myEndTime = computed(() => Array.isArray(unref(myValue)) ? unref(myValue)[1] : null)\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n format: props.format,\n startTime: myStartTime,\n endTime: myEndTime\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n let isDateChange = false\n const dateChange = emitEvent('dateChange', () => {\n })\n const openChange = (status: boolean) => {\n // 关闭时,判断时间是否改变,再触发事件\n const value = unref(myValue)\n // 判断有值\n const isNotNull = value && value[0] && value[1]\n if (status === false && isDateChange === true && isNotNull) {\n dateChange()\n isDateChange = false\n }\n }\n const change = () => {\n isDateChange = true\n }\n useOnEvent(props, {\n dateChange\n })\n return {\n style,\n getPopupContainer,\n locale,\n dateChange,\n myValue,\n disabledDate,\n calendarChange,\n openChange,\n change\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.range-picker {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n[datav-theme='light'] .ecan-range-picker{\n .ant-picker {\n background-color: #ffffff;\n color: rgba(0, 0, 0, 0.85);\n border: 1px solid #d9d9d9;\n }\n .ant-picker-input > input {\n color: rgba(0, 0, 0, 0.85);\n }\n .anticon-calendar {\n color: #333;\n }\n .anticon-close-circle {\n color: #333;\n }\n .ant-picker-input > input::placeholder {\n color: #bfbfbf;\n }\n .ant-picker-separator .anticon {\n color:#333;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-range-picker {\n .ant-picker {\n background-color: #05164c;\n border: 1px solid #1f63a3;\n color: #fff;\n box-shadow: inset 0 0 10px #005efe;\n }\n .ant-picker-input > input {\n color: #ffffff;\n }\n .anticon-calendar {\n color: #ffffff;\n }\n .anticon-close-circle {\n color: #333;\n }\n .ant-picker-separator .anticon {\n color:#fff;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-range-picker-dropdown {\n .ant-picker-panel {\n background: #05174e;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-header {\n color: #69befa;\n border-bottom: 1px solid #69befa;\n }\n .ant-picker-panel .ant-picker-footer {\n border-top: 1px solid #69befa;\n }\n .ant-picker-header button {\n color: #69befa;\n }\n .ant-picker-content th {\n color: #69befa;\n }\n .ant-picker-content td {\n color: #69befa;\n }\n .ant-picker-today-btn {\n color: #69befa;\n }\n .ant-picker-cell-disabled .ant-picker-cell-inner {\n color: #999;\n }\n .ant-picker-cell-disabled::before {\n background: #333;\n }\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport RangePicker from './RangePicker.vue'\nexport const EcanRangePicker = withInstall(RangePicker)\nexport default EcanRangePicker\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface ButtonProps extends Props {\n text: string\n mode: 'primary' | 'dashed' | 'link' | 'text' | 'default'\n danger: boolean\n shape: 'default' | 'circle' | 'round'\n href: string\n target: 'self' | 'blank' | 'event'\n fontSize: string\n fontWeight: number\n}\n\nexport const buttonProps: ButtonProps = {\n ...props,\n width: '200px',\n name: '按钮',\n keyName: '按钮',\n type: 'ecanButton',\n text: '按钮',\n mode: 'default',\n danger: false,\n shape: 'default',\n href: '',\n target: 'self',\n fontSize: '14px',\n fontWeight: 400\n}\n\n// 转化默认属性\nexport const buttonComponentProps = transformToComponentProps(buttonProps)\n\nexport const buttonEvents = ['click']\n","<template>\n <div\n class=\"ecan-button\"\n :style=\"style\"\n >\n <a-button\n block\n @click=\"click\"\n :type=\"mode\"\n :danger=\"danger\"\n :shape=\"shape\"\n :href=\"myHref\"\n :target=\"myTarget\"\n >\n <span\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ myText }}\n </span>\n </a-button>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, unref } from 'vue'\nimport { usePickComponentStyle, useEmitEvent, useVariablesInText } from '@/hooks'\nimport { Button as AButton } from 'ant-design-vue'\nimport 'ant-design-vue/es/button/style'\nimport { buttonComponentProps } from './props'\nexport default defineComponent({\n name: 'EcanButton',\n components: {\n AButton\n },\n props: {\n ...buttonComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n // 拦截触发事件\n const emitEvent = useEmitEvent(props)\n // click 是 event 名称\n const click = emitEvent('click', () => {\n // 打开链接\n const url = unref(myHref)\n if (url && props.target === 'event') {\n window.parent.postMessage({\n type: 'openPage',\n url\n }, '*')\n }\n })\n\n const myText = computed(() => useVariablesInText(props.text))\n // 空字符串会刷新页面\n const myHref = computed(() => useVariablesInText(props.href) || null)\n const myTarget = computed(() => {\n const target = props.target\n if (target === 'event' || unref(myHref) == null) {\n return undefined\n } else {\n const map = {\n self: '_self',\n blank: '_blank'\n }\n return map[target]\n }\n })\n return {\n style,\n click,\n myText,\n myHref,\n myTarget\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-button {\n .ant-btn {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-button\"\n :style=\"style\"\n >\n <a-button\n block\n @click=\"click\"\n :type=\"mode\"\n :danger=\"danger\"\n :shape=\"shape\"\n :href=\"myHref\"\n :target=\"myTarget\"\n >\n <span\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ myText }}\n </span>\n </a-button>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, unref } from 'vue'\nimport { usePickComponentStyle, useEmitEvent, useVariablesInText } from '@/hooks'\nimport { Button as AButton } from 'ant-design-vue'\nimport 'ant-design-vue/es/button/style'\nimport { buttonComponentProps } from './props'\nexport default defineComponent({\n name: 'EcanButton',\n components: {\n AButton\n },\n props: {\n ...buttonComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n // 拦截触发事件\n const emitEvent = useEmitEvent(props)\n // click 是 event 名称\n const click = emitEvent('click', () => {\n // 打开链接\n const url = unref(myHref)\n if (url && props.target === 'event') {\n window.parent.postMessage({\n type: 'openPage',\n url\n }, '*')\n }\n })\n\n const myText = computed(() => useVariablesInText(props.text))\n // 空字符串会刷新页面\n const myHref = computed(() => useVariablesInText(props.href) || null)\n const myTarget = computed(() => {\n const target = props.target\n if (target === 'event' || unref(myHref) == null) {\n return undefined\n } else {\n const map = {\n self: '_self',\n blank: '_blank'\n }\n return map[target]\n }\n })\n return {\n style,\n click,\n myText,\n myHref,\n myTarget\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-button {\n .ant-btn {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Button from './Button.vue'\nexport const EcanButton = withInstall(Button)\nexport default EcanButton\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport type CheckboxOptions = {\n label: string\n value: string\n disabled?: boolean\n checked?: boolean\n indeterminate?: boolean\n} []\n\nexport interface CheckboxProps extends Props {\n value: string | string []\n data: CheckboxOptions\n}\n\nexport const checkboxProps: CheckboxProps = {\n ...props,\n width: '240px',\n id: '',\n left: '0px',\n top: '0px',\n name: '复选框',\n keyName: '复选框',\n rotate: '',\n type: 'ecanCheckbox',\n value: [],\n data: [\n { label: '选项一', value: '1', checked: true },\n { label: '选项二', value: '2', checked: true },\n { label: '选项三', value: '3' }\n ]\n}\n\n// 转化默认属性\nexport const checkboxComponentProps = transformToComponentProps(checkboxProps)\n\nexport const checkboxEvents = ['checkboxChange']\n","<template>\n <div class=\"ecan-checkbox\" :style=\"style\">\n <a-checkbox-group\n :options=\"myOption\"\n v-model:value=\"myValue\"\n @change=\"checkboxChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, watch } from 'vue'\nimport { CheckboxGroup as ACheckboxGroup } from 'ant-design-vue'\nimport 'ant-design-vue/es/checkbox/style'\nimport { checkboxComponentProps, CheckboxOptions } from './props'\nimport { useEmitEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default defineComponent({\n name: 'EcanCheckbox',\n components: {\n ACheckboxGroup\n },\n props: {\n ...checkboxComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myOption = ref<CheckboxOptions>([])\n const myValue = ref<string []>([])\n const handleDataAndOption = (data) => {\n const value = props.value\n let _value = [] as string []\n data.forEach((item) => {\n if (item.checked) {\n _value.push(item.value)\n }\n })\n if (typeof value === 'string' && value !== '') {\n _value = _value.concat(value.split(','))\n } else if (Array.isArray(value)) {\n _value = _value.concat(value)\n }\n myOption.value = data\n myValue.value = _value\n }\n watch(() => [props.data, props.value], ([data]: [CheckboxOptions, string | string []]) => {\n handleDataAndOption(data)\n }, {\n immediate: true,\n deep: true\n })\n const requestData = useRequestData(props)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n const res = await requestData()\n const data = res?.data?.data?.rows || []\n handleDataAndOption(data)\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const checkboxChange = emitEvent('checkboxChange', () => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: myValue })\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n myOption,\n style,\n myValue,\n checkboxChange\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-checkbox {\n .ant-checkbox-group {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: space-between;\n align-content: space-between;\n flex-wrap: wrap;\n }\n}\n</style>\n","<template>\n <div class=\"ecan-checkbox\" :style=\"style\">\n <a-checkbox-group\n :options=\"myOption\"\n v-model:value=\"myValue\"\n @change=\"checkboxChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, watch } from 'vue'\nimport { CheckboxGroup as ACheckboxGroup } from 'ant-design-vue'\nimport 'ant-design-vue/es/checkbox/style'\nimport { checkboxComponentProps, CheckboxOptions } from './props'\nimport { useEmitEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default defineComponent({\n name: 'EcanCheckbox',\n components: {\n ACheckboxGroup\n },\n props: {\n ...checkboxComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myOption = ref<CheckboxOptions>([])\n const myValue = ref<string []>([])\n const handleDataAndOption = (data) => {\n const value = props.value\n let _value = [] as string []\n data.forEach((item) => {\n if (item.checked) {\n _value.push(item.value)\n }\n })\n if (typeof value === 'string' && value !== '') {\n _value = _value.concat(value.split(','))\n } else if (Array.isArray(value)) {\n _value = _value.concat(value)\n }\n myOption.value = data\n myValue.value = _value\n }\n watch(() => [props.data, props.value], ([data]: [CheckboxOptions, string | string []]) => {\n handleDataAndOption(data)\n }, {\n immediate: true,\n deep: true\n })\n const requestData = useRequestData(props)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n const res = await requestData()\n const data = res?.data?.data?.rows || []\n handleDataAndOption(data)\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const checkboxChange = emitEvent('checkboxChange', () => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: myValue })\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n myOption,\n style,\n myValue,\n checkboxChange\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.ecan-checkbox {\n .ant-checkbox-group {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: space-between;\n align-content: space-between;\n flex-wrap: wrap;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Checkbox from './Checkbox.vue'\nexport const EcanCheckbox = withInstall(Checkbox)\nexport default EcanCheckbox\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface SelectOption {\n value: any\n label: string\n disabled?: boolean\n key?: string\n title?: string\n}\n\nexport type SelectOptions = SelectOption []\n\nexport interface SelectProps extends Props {\n data: SelectOptions // 同 options\n value: string,\n dataFieldNames: { label: string, value: string }\n mode: 'multiple' | 'tags' | 'combobox' | undefined\n maxTagCount: number | undefined\n autoClearSearchValue: boolean\n placeholder: string\n selectFirstOption: boolean\n}\n\nexport const selectProps: SelectProps = {\n ...props,\n name: '下拉框选择器',\n keyName: '下拉框选择器',\n width: '120px',\n height: '33px',\n type: 'ecanSelect',\n mode: undefined,\n data: [\n { label: '选项一', value: '1' },\n { label: '选项二', value: '2' },\n { label: '选项三', value: '3' }\n ],\n value: undefined,\n dataFieldNames: { label: 'label', value: 'value' },\n maxTagCount: 3,\n autoClearSearchValue: true,\n placeholder: '请选择',\n selectFirstOption: false\n}\n\nexport const selectComponentProps = transformToComponentProps(selectProps)\n\nexport const selectEvents = ['selectChange', 'refreshData']\n","<template>\n <div\n class=\"ecan-select\"\n :style=\"style\"\n >\n <a-select\n class=\"select\"\n v-model:value=\"myValue\"\n :placeholder=\"placeholder\"\n showSearch\n allowClear\n :options=\"options\"\n :mode=\"mode\"\n :getPopupContainer=\"getPopupContainer\"\n :fieldNames=\"dataFieldNames\"\n :maxTagCount=\"maxTagCount\"\n :filterOption=\"filterOption\"\n :loading=\"loading\"\n :autoClearSearchValue=\"autoClearSearchValue\"\n @change=\"selectChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, unref, watch } from 'vue'\nimport { Select as ASelect } from 'ant-design-vue'\nimport 'ant-design-vue/es/select/style'\nimport { selectComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default defineComponent({\n name: 'EcanSelect',\n components: {\n ASelect\n },\n props: {\n ...selectComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n // 挂在在 ProviderConfig 或者 body 下\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const requestData = useRequestData(props)\n const options = ref(props.data || [])\n const myValue = ref()\n watch(() => [props.value, props.mode, props.selectFirstOption], () => {\n const { mode, selectFirstOption, value } = props\n if (mode === 'multiple' || mode === 'tags' || mode === 'combobox') {\n if (value) {\n myValue.value = value.split(',')\n } else if (selectFirstOption) {\n myValue.value = [unref(options)[0]]\n }\n } else {\n if (value) {\n myValue.value = value\n } else if (selectFirstOption) {\n myValue.value = unref(options)[0]\n }\n }\n // props.value || props.data[0]\n }, {\n immediate: true\n })\n const dataFieldNames = props.dataFieldNames as { label:string, value:string }\n const filterOption = (input: string, option: any) => {\n const labelKey = dataFieldNames.label\n const valueKey = dataFieldNames.value\n let value: string | undefined\n // 没有 label 值才用 value\n // ant-select 组件如果没有传 label 值会使用 value 作为值\n const labelValue = option[labelKey]\n const valueValue = option[valueKey]\n if (labelValue != null) {\n value = labelValue\n } else if (valueValue != null) {\n value = valueValue\n }\n return !!(value?.toLowerCase().indexOf(input?.toLowerCase()) >= 0)\n }\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n options.value = res?.data?.data?.rows || []\n const firstOption = unref(options)[0]\n if (props.value === '' && firstOption != null) {\n myValue.value = firstOption[dataFieldNames.value]\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const selectChange = emitEvent('selectChange', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: myValue })\n })\n // TODO 传入需要注册的参数\n useOnEvent(props, {\n selectChange,\n refreshData: handleRequestData\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n style,\n getPopupContainer,\n myValue,\n selectChange,\n options,\n filterOption,\n loading\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.select {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-select {\n .ant-select-selector {\n height: 100%;\n }\n .ant-select {\n height: 100% !important;\n width: 100% !important;\n }\n .ant-select-selector {\n height: 100% !important;\n width: 100% !important;\n display: flex;\n align-items: center;\n input {\n height: 100% !important;\n }\n }\n}\n\n[datav-theme='light'] {\n .ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border: 1px solid #d9d9d9;\n }\n .ant-select-dropdown {\n color: rgba(0, 0, 0, 0.85);\n background: #ffffff;\n box-shadow: 0 2px 8px rgb(0 0 0 / 15%);\n }\n .ant-empty-img-simple-g {\n stroke: #d9d9d9;\n }\n .ant-empty-img-simple-ellipse {\n fill: #f5f5f5;\n }\n .ant-empty-img-simple-path {\n fill: #f5f5f5;\n stroke: #d9d9d9;\n }\n .ant-empty-description {\n color: rgba(0, 0, 0, 0.25);\n }\n .anticon-down {\n color: #333;\n }\n}\n\n[datav-theme='darkBlue'] {\n .ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border: 1px solid #1f63a3;\n background-color: #05164c;\n box-shadow: inset 0 0 10px #005efe;\n color: #ffffff;\n }\n .ant-select-dropdown {\n box-shadow: inset 0 0 10px #005efe;\n color: #fff;\n background-color: #05164c;\n }\n .ant-empty-img-simple-g {\n stroke: #69befa;\n }\n .ant-empty-img-simple-ellipse {\n fill-opacity: 0;\n }\n .ant-empty-img-simple-path {\n fill: #69befa;\n stroke: #69befa;\n }\n .ant-empty-description {\n color: #69befa;\n }\n .anticon-down {\n color: #ffffff;\n }\n .ant-select-item {\n color: #ffffff;\n }\n .ant-select-item-option-active {\n background: #1f63a3;\n }\n .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {\n background: #1f63a3;\n }\n}\n</style>\n","<template>\n <div\n class=\"ecan-select\"\n :style=\"style\"\n >\n <a-select\n class=\"select\"\n v-model:value=\"myValue\"\n :placeholder=\"placeholder\"\n showSearch\n allowClear\n :options=\"options\"\n :mode=\"mode\"\n :getPopupContainer=\"getPopupContainer\"\n :fieldNames=\"dataFieldNames\"\n :maxTagCount=\"maxTagCount\"\n :filterOption=\"filterOption\"\n :loading=\"loading\"\n :autoClearSearchValue=\"autoClearSearchValue\"\n @change=\"selectChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, ref, unref, watch } from 'vue'\nimport { Select as ASelect } from 'ant-design-vue'\nimport 'ant-design-vue/es/select/style'\nimport { selectComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default defineComponent({\n name: 'EcanSelect',\n components: {\n ASelect\n },\n props: {\n ...selectComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n // 挂在在 ProviderConfig 或者 body 下\n const getPopupContainer = () => document.getElementById('ProviderConfig') || document.body\n const requestData = useRequestData(props)\n const options = ref(props.data || [])\n const myValue = ref()\n watch(() => [props.value, props.mode, props.selectFirstOption], () => {\n const { mode, selectFirstOption, value } = props\n if (mode === 'multiple' || mode === 'tags' || mode === 'combobox') {\n if (value) {\n myValue.value = value.split(',')\n } else if (selectFirstOption) {\n myValue.value = [unref(options)[0]]\n }\n } else {\n if (value) {\n myValue.value = value\n } else if (selectFirstOption) {\n myValue.value = unref(options)[0]\n }\n }\n // props.value || props.data[0]\n }, {\n immediate: true\n })\n const dataFieldNames = props.dataFieldNames as { label:string, value:string }\n const filterOption = (input: string, option: any) => {\n const labelKey = dataFieldNames.label\n const valueKey = dataFieldNames.value\n let value: string | undefined\n // 没有 label 值才用 value\n // ant-select 组件如果没有传 label 值会使用 value 作为值\n const labelValue = option[labelKey]\n const valueValue = option[valueKey]\n if (labelValue != null) {\n value = labelValue\n } else if (valueValue != null) {\n value = valueValue\n }\n return !!(value?.toLowerCase().indexOf(input?.toLowerCase()) >= 0)\n }\n const loading = ref(false)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n options.value = res?.data?.data?.rows || []\n const firstOption = unref(options)[0]\n if (props.value === '' && firstOption != null) {\n myValue.value = firstOption[dataFieldNames.value]\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const selectChange = emitEvent('selectChange', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: myValue })\n })\n // TODO 传入需要注册的参数\n useOnEvent(props, {\n selectChange,\n refreshData: handleRequestData\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n return {\n style,\n getPopupContainer,\n myValue,\n selectChange,\n options,\n filterOption,\n loading\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.select {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-select {\n .ant-select-selector {\n height: 100%;\n }\n .ant-select {\n height: 100% !important;\n width: 100% !important;\n }\n .ant-select-selector {\n height: 100% !important;\n width: 100% !important;\n display: flex;\n align-items: center;\n input {\n height: 100% !important;\n }\n }\n}\n\n[datav-theme='light'] {\n .ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border: 1px solid #d9d9d9;\n }\n .ant-select-dropdown {\n color: rgba(0, 0, 0, 0.85);\n background: #ffffff;\n box-shadow: 0 2px 8px rgb(0 0 0 / 15%);\n }\n .ant-empty-img-simple-g {\n stroke: #d9d9d9;\n }\n .ant-empty-img-simple-ellipse {\n fill: #f5f5f5;\n }\n .ant-empty-img-simple-path {\n fill: #f5f5f5;\n stroke: #d9d9d9;\n }\n .ant-empty-description {\n color: rgba(0, 0, 0, 0.25);\n }\n .anticon-down {\n color: #333;\n }\n}\n\n[datav-theme='darkBlue'] {\n .ant-select:not(.ant-select-customize-input) .ant-select-selector {\n border: 1px solid #1f63a3;\n background-color: #05164c;\n box-shadow: inset 0 0 10px #005efe;\n color: #ffffff;\n }\n .ant-select-dropdown {\n box-shadow: inset 0 0 10px #005efe;\n color: #fff;\n background-color: #05164c;\n }\n .ant-empty-img-simple-g {\n stroke: #69befa;\n }\n .ant-empty-img-simple-ellipse {\n fill-opacity: 0;\n }\n .ant-empty-img-simple-path {\n fill: #69befa;\n stroke: #69befa;\n }\n .ant-empty-description {\n color: #69befa;\n }\n .anticon-down {\n color: #ffffff;\n }\n .ant-select-item {\n color: #ffffff;\n }\n .ant-select-item-option-active {\n background: #1f63a3;\n }\n .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {\n background: #1f63a3;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Select from './Select.vue'\nexport const EcanSelect = withInstall(Select)\nexport default EcanSelect\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface TreeSelectOption {\n value: any\n label: string\n disabled?: boolean\n key?: string\n title?: string\n children?: TreeSelectOption []\n}\n\nexport type TreeSelectOptions = TreeSelectOption []\n\nexport interface TreeSelectProps extends Props {\n data: TreeSelectOptions // 同 options\n value: string,\n dataFieldNames: { label: string, value: string, children: string }\n multiple: boolean // 多选\n maxTagCount: number | undefined\n placeholder: string\n treeCheckable: boolean // 复选框\n treeCheckStrictly: boolean\n selectFirstOption: boolean\n}\n\nexport const treeSelectProps: TreeSelectProps = {\n ...props,\n name: '树形下拉框选择器',\n keyName: '树形下拉框选择器',\n width: '120px',\n height: '33px',\n type: 'ecanTreeSelect',\n multiple: false,\n data: [\n {\n label: '选项一',\n value: '1',\n children: [\n {\n label: '子选项一',\n value: '1-1'\n },\n {\n label: '子选项二',\n value: '1-2'\n }\n ]\n },\n { label: '选项二', value: '2' },\n { label: '选项三', value: '3' }\n ],\n value: '',\n dataFieldNames: { label: 'label', value: 'value', children: 'children' },\n maxTagCount: 3,\n placeholder: '请选择',\n treeCheckable: false,\n treeCheckStrictly: false,\n selectFirstOption: false\n}\n\nexport const treeSelectComponentProps = transformToComponentProps(treeSelectProps)\n\nexport const treeSelectEvents = ['selectChange', 'refreshData']\n","<template>\n <div class=\"ecan-tree-select\" :style=\"style\">\n <a-tree-select\n class=\"tree-select\"\n v-model:value=\"myValue\"\n allowClear\n showSearch\n :loading=\"loading\"\n :fieldNames=\"dataFieldNames\"\n :treeData=\"treeData\"\n :maxTagCount=\"maxTagCount\"\n :multiple=\"multiple\"\n :treeCheckable=\"treeCheckable\"\n :filterTreeNode=\"filterTreeNode\"\n :placeholder=\"placeholder\"\n @change=\"selectChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { TreeSelect as ATreeSelect } from 'ant-design-vue'\nimport 'ant-design-vue/es/tree-select/style'\nimport { inject, ref, unref, watch } from 'vue'\nimport { treeSelectComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default {\n name: 'EcanTreeSelect',\n components: {\n ATreeSelect\n },\n props: {\n ...treeSelectComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const treeData = ref(props.data)\n const filterTreeNode = (inputValue: string, treeNode: any) => {\n const dataFieldNames = props.dataFieldNames\n const labelKey = dataFieldNames.label\n const valueKey = dataFieldNames.value\n let value: string | undefined\n // 没有 label 值才用 value\n // ant-select 组件如果没有传 label 值会使用 value 作为值\n const labelValue = treeNode[labelKey]\n const valueValue = treeNode[valueKey]\n if (labelValue != null) {\n value = labelValue\n } else if (valueValue != null) {\n value = valueValue\n }\n return !!(value?.toLowerCase().indexOf(inputValue?.toLowerCase()) >= 0)\n }\n const myValue = ref()\n watch(() => [props.multiple, props.value, props.treeCheckable, props.selectFirstOption], () => {\n const { multiple, value, selectFirstOption } = props\n if (multiple) {\n if (value) {\n myValue.value = value.split(',')\n } else if (selectFirstOption) {\n myValue.value = [unref(treeData)[0]]\n }\n } else {\n if (value) {\n myValue.value = value\n } else if (selectFirstOption) {\n myValue.value = unref(treeData)[0]\n }\n }\n }, {\n immediate: true\n })\n const loading = ref(false)\n const requestData = useRequestData(props)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n treeData.value = res?.data?.data?.rows || []\n const firstOption = unref(treeData)[0]\n if (props.value === '' && firstOption != null) {\n myValue.value = firstOption[props.dataFieldNames.value]\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const selectChange = emitEvent('selectChange', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: myValue })\n })\n useOnEvent(props, {\n selectChange,\n refreshData: handleRequestData\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.reque\n })\n return {\n style,\n treeData,\n filterTreeNode,\n myValue,\n loading,\n selectChange\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.tree-select {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-tree-select {\n .tree-select {\n .ant-select-selector {\n height: 100%;\n }\n }\n}\n</style>\n","<template>\n <div class=\"ecan-tree-select\" :style=\"style\">\n <a-tree-select\n class=\"tree-select\"\n v-model:value=\"myValue\"\n allowClear\n showSearch\n :loading=\"loading\"\n :fieldNames=\"dataFieldNames\"\n :treeData=\"treeData\"\n :maxTagCount=\"maxTagCount\"\n :multiple=\"multiple\"\n :treeCheckable=\"treeCheckable\"\n :filterTreeNode=\"filterTreeNode\"\n :placeholder=\"placeholder\"\n @change=\"selectChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { TreeSelect as ATreeSelect } from 'ant-design-vue'\nimport 'ant-design-vue/es/tree-select/style'\nimport { inject, ref, unref, watch } from 'vue'\nimport { treeSelectComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useRequestData } from '@/hooks'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport { RequestModalParam } from '@/utils/types'\nexport default {\n name: 'EcanTreeSelect',\n components: {\n ATreeSelect\n },\n props: {\n ...treeSelectComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const treeData = ref(props.data)\n const filterTreeNode = (inputValue: string, treeNode: any) => {\n const dataFieldNames = props.dataFieldNames\n const labelKey = dataFieldNames.label\n const valueKey = dataFieldNames.value\n let value: string | undefined\n // 没有 label 值才用 value\n // ant-select 组件如果没有传 label 值会使用 value 作为值\n const labelValue = treeNode[labelKey]\n const valueValue = treeNode[valueKey]\n if (labelValue != null) {\n value = labelValue\n } else if (valueValue != null) {\n value = valueValue\n }\n return !!(value?.toLowerCase().indexOf(inputValue?.toLowerCase()) >= 0)\n }\n const myValue = ref()\n watch(() => [props.multiple, props.value, props.treeCheckable, props.selectFirstOption], () => {\n const { multiple, value, selectFirstOption } = props\n if (multiple) {\n if (value) {\n myValue.value = value.split(',')\n } else if (selectFirstOption) {\n myValue.value = [unref(treeData)[0]]\n }\n } else {\n if (value) {\n myValue.value = value\n } else if (selectFirstOption) {\n myValue.value = unref(treeData)[0]\n }\n }\n }, {\n immediate: true\n })\n const loading = ref(false)\n const requestData = useRequestData(props)\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n treeData.value = res?.data?.data?.rows || []\n const firstOption = unref(treeData)[0]\n if (props.value === '' && firstOption != null) {\n myValue.value = firstOption[props.dataFieldNames.value]\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myValue\n })\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const selectChange = emitEvent('selectChange', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: myValue })\n })\n useOnEvent(props, {\n selectChange,\n refreshData: handleRequestData\n })\n const { setRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setRequest: ({ id, sortNum, requestFn }: RequestModalParam) => void 0\n })\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.reque\n })\n return {\n style,\n treeData,\n filterTreeNode,\n myValue,\n loading,\n selectChange\n }\n }\n}\n</script>\n\n<style lang=\"less\" scoped>\n.tree-select {\n width: 100%;\n height: 100%;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-tree-select {\n .tree-select {\n .ant-select-selector {\n height: 100%;\n }\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport TreeSelect from './TreeSelect.vue'\nexport const EcanTreeSelect = withInstall(TreeSelect)\nexport default EcanTreeSelect\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps,\n Data,\n ValueTypeDataFieldNames\n} from '@/utils/props'\n\nexport interface PieProps extends Props {\n data: Data\n titleText: string\n titleSubtext: string\n titleLeft: string\n colors: string[]\n backgroundColor: string\n tooltipShow: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n tooltipTrigger: 'item' | 'axis' | 'none'\n tooltipTextStyleColor: string\n tooltipFormatter: string\n legendShow: boolean\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal'\n legendTextStyleColor: string\n innerRadius: string\n outerRadius: string\n centerLeft: string\n centerTop: string\n minAngle: number\n labelShow: boolean\n labelFormatter: string\n labelFontSize: number\n labelPosition: 'outside' | 'inside' | 'center'\n labelLineShow: boolean\n labelColor: string\n isUseLabelColors: boolean\n labelLineLength: number\n labelLineLength2: number\n roseType: '' | 'radius' | 'area'\n valueTypeDataFieldNames: ValueTypeDataFieldNames,\n dataFieldConfigType: 'key' | 'value',\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n graphicConfig: { [key:string]: any }\n toolboxShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n}\n\nexport const pieProps: PieProps = {\n ...props,\n id: '',\n name: '饼图',\n keyName: '饼图',\n type: 'ecanPie',\n width: '400px',\n height: '400px',\n top: '',\n left: '',\n rotate: '',\n data: [\n { name: '名称一', value: 335 },\n { name: '名称二', value: 310 },\n { name: '名称三', value: 234 }\n ],\n titleText: '',\n titleSubtext: '',\n titleLeft: '',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n backgroundColor: '',\n tooltipShow: true,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true,\n tooltipTextStyleColor: '',\n tooltipTrigger: 'item',\n tooltipFormatter: '{marker} {b} {c} ({d}%)',\n legendShow: true,\n legendTextStyleColor: '#333',\n legendOrient: 'vertical',\n legendTop: 'top',\n legendLeft: 'left',\n innerRadius: '0%',\n outerRadius: '60%',\n centerLeft: '50%',\n centerTop: '50%',\n minAngle: 0,\n labelShow: true,\n labelColor: '#333',\n isUseLabelColors: false,\n labelFontSize: 12,\n labelPosition: 'outside',\n labelFormatter: '{b}\\\\n{d}%',\n labelLineShow: true,\n labelLineLength: 10,\n labelLineLength2: 15,\n roseType: '',\n valueTypeDataFieldNames: { name: 'name', value: 'value', type: 'type' },\n dataFieldConfigType: 'value',\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n graphicConfig: {},\n toolboxShow: false,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息'\n}\n// 转化默认属性\nexport const pieComponentProps = transformToComponentProps(pieProps)\n\nexport const pieEvents: Array<string> = ['click', 'refreshData', 'resetRecord']\n","import request from '@/utils/request'\nexport const useDownloadFile = async (downloadFileUrl: string) => {\n const res = await request.post(downloadFileUrl, {}, {\n responseType: 'blob'\n }) as any\n const { data, headers } = res\n const fileName = headers['content-disposition'].replace(/\\w+;filename=(.*)/, '$1')\n const blob = new Blob([data])\n const dom = document.createElement('a')\n const url = window.URL.createObjectURL(blob)\n dom.href = url\n dom.download = decodeURI(fileName)\n dom.style.display = 'none'\n document.body.appendChild(dom)\n dom.click()\n dom.parentNode?.removeChild(dom)\n window.URL.revokeObjectURL(url)\n}\nexport default useDownloadFile\n","import { transformToComponentProps } from '@/utils/props'\n\nexport type ModalPosition = 'default' | 'top' | 'center' | 'bottom'\n\nexport interface ModalProps {\n id: string\n type: string\n width: string\n height: string\n title: string\n titleFontSize: string\n titleColor: string\n backgroundColor: string\n backgroundImage: string\n backgroundSize: string\n keyName: string\n componentList: { [key: string]: any } []\n fullModal: boolean // 是否充满全屏\n originalWidth: string // 设计稿宽\n originalHeight: string // 设计稿长\n destroyOnClose: boolean\n position: ModalPosition\n}\n\nexport const modalProps: ModalProps = {\n id: '',\n type: 'ecanModal',\n title: '',\n titleFontSize: '14px',\n titleColor: '',\n width: '1000px',\n height: '800px',\n originalWidth: '1920px',\n originalHeight: '1080px',\n backgroundColor: '#fff',\n backgroundImage: '',\n backgroundSize: '100% 100%',\n keyName: '弹窗',\n componentList: [],\n fullModal: false,\n destroyOnClose: true,\n position: 'default'\n}\n\nexport const modalComponentProps = transformToComponentProps(modalProps)\n\nexport const modalEvents = ['showModal']\n","<template>\n <!-- centered + style 中的 verticalAlign 调整弹窗位置 -->\n <a-modal\n :getContainer=\"getContainer\"\n :wrapClassName=\"wrapClassName\"\n centered\n :visible=\"visible\"\n :footer=\"null\"\n :width=\"isFullModal || isFullWidth ? '100%' : modalWith\"\n :destroyOnClose=\"destroyOnClose\"\n :style=\"modalStyle\"\n :closable=\"false\"\n @ok=\"onOk\"\n @cancel=\"onCancel\"\n ref=\"modalRef\"\n >\n <div class=\"contain\" ref=\"containRef\" :style=\"containStyle\">\n <div class=\"content\" :style=\"contentStyle\" v-if=\"ready\">\n <div\n class=\"header-bar\"\n :style=\"{\n backgroundColor,\n padding: '20px 30px'\n }\"\n >\n <div\n v-if=\"title\"\n class=\"ant-modal-title\"\n :style=\"{\n fontSize: titleFontSize,\n color: titleColor\n }\"\n >\n {{ title }}\n </div>\n <close-outlined class=\"close-icon\" @click=\"onCancel\"/>\n </div>\n <div v-if=\"componentList.length\">\n <component\n v-for=\"(component, index) in componentList\"\n :key=\"(component.id) + index\"\n :is=\"component.type\"\n v-bind=\"component\"\n />\n </div>\n <slot v-else />\n </div>\n </div>\n </a-modal>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, nextTick, watch, ref, unref } from 'vue'\nimport { modalComponentProps, ModalPosition } from './props'\nimport { Modal as AModal } from 'ant-design-vue'\nimport 'ant-design-vue/es/modal/style'\nimport { useOnEvent, usePickComponentStyle, useImagePath } from '@/hooks'\nimport { REQUEST_MODEL, MODAL_MODEL } from '@/utils/constant'\nimport { debounce } from 'lodash-es'\nimport { CloseOutlined } from '@ant-design/icons-vue'\nexport default defineComponent({\n name: 'EcanModal',\n components: {\n AModal,\n CloseOutlined\n },\n props: {\n ...modalComponentProps\n },\n setup (props, { emit }) {\n const getContainer = () => document.getElementById('ProviderConfig') || document.body\n const modalStyle = computed(() => {\n const position = props.position as ModalPosition\n const map = {\n default: '',\n top: 'top',\n center: 'middle',\n bottom: 'bottom'\n }\n return {\n verticalAlign: map[position]\n }\n })\n const width = props.width as string\n const height = props.height as string\n const originalWidth = props.originalWidth as string\n const originalHeight = props.originalHeight as string\n const modalWith = ref('80%')\n const containWidth = ref(0)\n const scaleWidth = ref()\n const containHeight = ref(0)\n const containStyle = ref({})\n const style = usePickComponentStyle(props)\n const contentStyle = ref({})\n const ready = ref(false)\n const modalRef = ref<HTMLElement>()\n let observer: MutationObserver | null\n const updateSize = () => {\n scaleWidth.value = parseFloat(width) / parseFloat(originalWidth)\n const scaleHeight = parseFloat(height) / parseFloat(originalHeight)\n const screenWidth = document.body.offsetWidth\n const screenHeight = document.body.offsetHeight\n containWidth.value = screenWidth * unref(scaleWidth)\n containHeight.value = screenHeight * scaleHeight\n modalWith.value = `${unref(scaleWidth) * 100}%`\n containStyle.value = {\n width: `${unref(containWidth)}px`,\n height: `${unref(containHeight)}px`\n }\n contentStyle.value = {\n ...unref(style),\n backgroundImage: useImagePath(props.backgroundImage as string, true),\n transform: `scale(${unref(containWidth) / parseFloat(width)},${unref(containHeight) / parseFloat(height)})`\n }\n }\n const onResize = debounce(() => {\n updateSize()\n }, 100)\n const initMutationObserver = () => {\n const MutationObserver = window.MutationObserver\n observer = new MutationObserver(onResize)\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['style'],\n attributeOldValue: true\n })\n }\n const removeMutationObserver = () => {\n if (observer) {\n observer.disconnect()\n observer.takeRecords()\n observer = null\n }\n }\n\n const visible = ref(false)\n const { touchRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n touchRequest: () => void 0\n })\n const showModal = () => {\n visible.value = true\n }\n const hideModal = () => {\n emit('close')\n visible.value = false\n }\n const onOk = () => {\n hideModal()\n }\n const onCancel = () => {\n hideModal()\n }\n const { setModalModel, pushUseModalIds, popUseModalIds } = inject(MODAL_MODEL, {\n pushUseModalIds: (_key: string) => {},\n popUseModalIds: () => {},\n setModalModel: (_key: string, _value: any) => {}\n })\n const handleModalModel = () => {\n const id = props.id\n let keys = []\n const componentList = props.componentList\n console.log('componentList', componentList)\n if (Array.isArray(componentList)) {\n keys = componentList.map((component) => component.id)\n setModalModel(id, [...new Set(keys)])\n }\n }\n watch(() => visible.value, async (visible) => {\n if (visible) {\n ready.value = false\n pushUseModalIds(props.id)\n handleModalModel()\n await nextTick(() => {\n updateSize()\n window.addEventListener('resize', onResize)\n initMutationObserver()\n ready.value = true\n })\n touchRequest()\n } else {\n popUseModalIds()\n window.removeEventListener('resize', onResize)\n removeMutationObserver()\n }\n })\n const isFullWidth = computed(() => unref(scaleWidth) >= 1)\n const isFullModal = computed(() => props.fullModal)\n const wrapClassName = computed(() => {\n let className = 'ecan-modal'\n if (unref(isFullWidth)) className += ' ecan-full-width-modal'\n if (unref(isFullModal)) className += ' ecan-full-modal'\n return className\n })\n // 注册\n useOnEvent(props, {\n showModal\n })\n\n return {\n modalRef,\n containStyle,\n contentStyle,\n getContainer,\n modalStyle,\n modalWith,\n isFullModal,\n style,\n visible,\n showModal,\n onOk,\n onCancel,\n isFullWidth,\n wrapClassName,\n ready\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.contain {\n position: relative;\n overflow: hidden;\n}\n.content {\n transform-origin: left top;\n z-index: 999;\n\n .header-bar {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n\n .close-icon {\n font-size: 18px;\n cursor: pointer;\n margin: 0 0 0 auto;\n }\n }\n}\n</style>\n\n<style lang=\"less\">\n.ecan-modal {\n .ant-modal-body {\n padding: 0;\n }\n .ant-modal-header {\n padding: 0;\n border-bottom: none;\n background: none;\n }\n}\n\n.ecan-full-width-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n }\n .ant-modal-body {\n flex: 1;\n }\n}\n\n.ecan-full-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n height: calc(100vh);\n }\n .ant-modal-body {\n flex: 1;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-modal {\n .anticon-close > svg > path {\n fill: #fff;\n }\n}\n</style>\n","<template>\n <!-- centered + style 中的 verticalAlign 调整弹窗位置 -->\n <a-modal\n :getContainer=\"getContainer\"\n :wrapClassName=\"wrapClassName\"\n centered\n :visible=\"visible\"\n :footer=\"null\"\n :width=\"isFullModal || isFullWidth ? '100%' : modalWith\"\n :destroyOnClose=\"destroyOnClose\"\n :style=\"modalStyle\"\n :closable=\"false\"\n @ok=\"onOk\"\n @cancel=\"onCancel\"\n ref=\"modalRef\"\n >\n <div class=\"contain\" ref=\"containRef\" :style=\"containStyle\">\n <div class=\"content\" :style=\"contentStyle\" v-if=\"ready\">\n <div\n class=\"header-bar\"\n :style=\"{\n backgroundColor,\n padding: '20px 30px'\n }\"\n >\n <div\n v-if=\"title\"\n class=\"ant-modal-title\"\n :style=\"{\n fontSize: titleFontSize,\n color: titleColor\n }\"\n >\n {{ title }}\n </div>\n <close-outlined class=\"close-icon\" @click=\"onCancel\"/>\n </div>\n <div v-if=\"componentList.length\">\n <component\n v-for=\"(component, index) in componentList\"\n :key=\"(component.id) + index\"\n :is=\"component.type\"\n v-bind=\"component\"\n />\n </div>\n <slot v-else />\n </div>\n </div>\n </a-modal>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, nextTick, watch, ref, unref } from 'vue'\nimport { modalComponentProps, ModalPosition } from './props'\nimport { Modal as AModal } from 'ant-design-vue'\nimport 'ant-design-vue/es/modal/style'\nimport { useOnEvent, usePickComponentStyle, useImagePath } from '@/hooks'\nimport { REQUEST_MODEL, MODAL_MODEL } from '@/utils/constant'\nimport { debounce } from 'lodash-es'\nimport { CloseOutlined } from '@ant-design/icons-vue'\nexport default defineComponent({\n name: 'EcanModal',\n components: {\n AModal,\n CloseOutlined\n },\n props: {\n ...modalComponentProps\n },\n setup (props, { emit }) {\n const getContainer = () => document.getElementById('ProviderConfig') || document.body\n const modalStyle = computed(() => {\n const position = props.position as ModalPosition\n const map = {\n default: '',\n top: 'top',\n center: 'middle',\n bottom: 'bottom'\n }\n return {\n verticalAlign: map[position]\n }\n })\n const width = props.width as string\n const height = props.height as string\n const originalWidth = props.originalWidth as string\n const originalHeight = props.originalHeight as string\n const modalWith = ref('80%')\n const containWidth = ref(0)\n const scaleWidth = ref()\n const containHeight = ref(0)\n const containStyle = ref({})\n const style = usePickComponentStyle(props)\n const contentStyle = ref({})\n const ready = ref(false)\n const modalRef = ref<HTMLElement>()\n let observer: MutationObserver | null\n const updateSize = () => {\n scaleWidth.value = parseFloat(width) / parseFloat(originalWidth)\n const scaleHeight = parseFloat(height) / parseFloat(originalHeight)\n const screenWidth = document.body.offsetWidth\n const screenHeight = document.body.offsetHeight\n containWidth.value = screenWidth * unref(scaleWidth)\n containHeight.value = screenHeight * scaleHeight\n modalWith.value = `${unref(scaleWidth) * 100}%`\n containStyle.value = {\n width: `${unref(containWidth)}px`,\n height: `${unref(containHeight)}px`\n }\n contentStyle.value = {\n ...unref(style),\n backgroundImage: useImagePath(props.backgroundImage as string, true),\n transform: `scale(${unref(containWidth) / parseFloat(width)},${unref(containHeight) / parseFloat(height)})`\n }\n }\n const onResize = debounce(() => {\n updateSize()\n }, 100)\n const initMutationObserver = () => {\n const MutationObserver = window.MutationObserver\n observer = new MutationObserver(onResize)\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['style'],\n attributeOldValue: true\n })\n }\n const removeMutationObserver = () => {\n if (observer) {\n observer.disconnect()\n observer.takeRecords()\n observer = null\n }\n }\n\n const visible = ref(false)\n const { touchRequest } = inject(REQUEST_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n touchRequest: () => void 0\n })\n const showModal = () => {\n visible.value = true\n }\n const hideModal = () => {\n emit('close')\n visible.value = false\n }\n const onOk = () => {\n hideModal()\n }\n const onCancel = () => {\n hideModal()\n }\n const { setModalModel, pushUseModalIds, popUseModalIds } = inject(MODAL_MODEL, {\n pushUseModalIds: (_key: string) => {},\n popUseModalIds: () => {},\n setModalModel: (_key: string, _value: any) => {}\n })\n const handleModalModel = () => {\n const id = props.id\n let keys = []\n const componentList = props.componentList\n console.log('componentList', componentList)\n if (Array.isArray(componentList)) {\n keys = componentList.map((component) => component.id)\n setModalModel(id, [...new Set(keys)])\n }\n }\n watch(() => visible.value, async (visible) => {\n if (visible) {\n ready.value = false\n pushUseModalIds(props.id)\n handleModalModel()\n await nextTick(() => {\n updateSize()\n window.addEventListener('resize', onResize)\n initMutationObserver()\n ready.value = true\n })\n touchRequest()\n } else {\n popUseModalIds()\n window.removeEventListener('resize', onResize)\n removeMutationObserver()\n }\n })\n const isFullWidth = computed(() => unref(scaleWidth) >= 1)\n const isFullModal = computed(() => props.fullModal)\n const wrapClassName = computed(() => {\n let className = 'ecan-modal'\n if (unref(isFullWidth)) className += ' ecan-full-width-modal'\n if (unref(isFullModal)) className += ' ecan-full-modal'\n return className\n })\n // 注册\n useOnEvent(props, {\n showModal\n })\n\n return {\n modalRef,\n containStyle,\n contentStyle,\n getContainer,\n modalStyle,\n modalWith,\n isFullModal,\n style,\n visible,\n showModal,\n onOk,\n onCancel,\n isFullWidth,\n wrapClassName,\n ready\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.contain {\n position: relative;\n overflow: hidden;\n}\n.content {\n transform-origin: left top;\n z-index: 999;\n\n .header-bar {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n\n .close-icon {\n font-size: 18px;\n cursor: pointer;\n margin: 0 0 0 auto;\n }\n }\n}\n</style>\n\n<style lang=\"less\">\n.ecan-modal {\n .ant-modal-body {\n padding: 0;\n }\n .ant-modal-header {\n padding: 0;\n border-bottom: none;\n background: none;\n }\n}\n\n.ecan-full-width-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n }\n .ant-modal-body {\n flex: 1;\n }\n}\n\n.ecan-full-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n height: calc(100vh);\n }\n .ant-modal-body {\n flex: 1;\n }\n}\n\n[datav-theme='darkBlue'] .ecan-modal {\n .anticon-close > svg > path {\n fill: #fff;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Modal from './Modal.vue'\nexport const EcanModal = withInstall(Modal)\nexport default EcanModal\nexport * from './props'\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, watch, inject, ref, unref } from 'vue'\nimport {\n useEmitEvent,\n usePickComponentStyle,\n useRequestData,\n useTransformChartDataByAttrValue,\n useOnEvent,\n useVariablesInText,\n useIndicatorData\n} from '@/hooks'\nimport Echarts from '@/common/echarts'\nimport { pieComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { PieChart } from 'echarts/charts'\nimport { TitleComponent, TooltipComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { handleFormatter } from '@/utils/util'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { ValueTypeDataFieldNames } from '@/utils/props'\nimport Spin from '@/common/spin'\nimport { Modal as AModal } from 'ant-design-vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n PieChart,\n TitleComponent,\n ToolboxComponent,\n TooltipComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanPie',\n props: {\n ...pieComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataset = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const option = computed(() => {\n let { data = [] } = unref(dataset)[0] || {}\n if (Array.isArray(props.colors)) {\n const isUseLabelColors = props.isUseLabelColors\n const colors = props.colors\n data = data.map((item, index) => ({\n label: isUseLabelColors ? { color: colors[index] } : {},\n ...item\n }))\n }\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n // 提示\n tooltip: {\n show: props.tooltipShow,\n trigger: props.tooltipTrigger,\n formatter: (params) => {\n const { marker, seriesName, name, value, percent, data } = params || {}\n return useVariablesInText(\n props.tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n percent,\n a: seriesName,\n b: name,\n c: value,\n d: percent,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n }\n )\n },\n textStyle: {\n color: props.tooltipTextStyleColor\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: visible.value ? ZOOM_FONT_SIZE : props.labelFontSize\n }\n },\n color: props.colors,\n series: [\n {\n data,\n type: 'pie',\n radius: [props.innerRadius, props.outerRadius],\n center: [props.centerLeft, props.centerTop],\n roseType: props.roseType,\n avoidLabelOverlap: false,\n minAngle: props.minAngle,\n // data: data.value,\n // data: props.data,\n // dimensions: ['name', 'count'],\n label: {\n show: props.labelPosition !== 'center' && props.labelShow,\n color: props.labelColor,\n fontSize: visible.value ? ZOOM_FONT_SIZE : props.labelFontSize,\n position: props.labelPosition,\n formatter: handleFormatter(props.labelFormatter)\n },\n labelLine: {\n show: props.labelLineShow,\n length: props.labelLineLength,\n length2: props.labelLineLength2\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)'\n },\n label: {\n // show: props.labelPosition === 'center'\n }\n }\n }\n ]\n }\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], dataFieldNames?: ValueTypeDataFieldNames) => {\n const { dataset: d } = useTransformChartDataByAttrValue(data, dataFieldNames)\n dataset.value = d\n }\n\n const handleIndicatorDataset = (data: any = [], dataFieldNames?: ValueTypeDataFieldNames) => {\n const chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n dataset.value = chartData.dataset\n }\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, props.valueTypeDataFieldNames)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e?.data })\n })\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { data } = res.data || {}\n if (data) {\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let arr = []\n if (columns.length > 0) {\n const name = columns[0]\n const value = columns[1]\n arr = rows.map(item => {\n return {\n name: item[name],\n value: item[value]\n }\n })\n }\n handleIndicatorDataset(arr)\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n click\n })\n\n expose({\n refreshData\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n return {\n option,\n style,\n click,\n onClose,\n loading,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, watch, inject, ref, unref } from 'vue'\nimport {\n useEmitEvent,\n usePickComponentStyle,\n useRequestData,\n useTransformChartDataByAttrValue,\n useOnEvent,\n useVariablesInText,\n useIndicatorData\n} from '@/hooks'\nimport Echarts from '@/common/echarts'\nimport { pieComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { PieChart } from 'echarts/charts'\nimport { TitleComponent, TooltipComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { handleFormatter } from '@/utils/util'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { ValueTypeDataFieldNames } from '@/utils/props'\nimport Spin from '@/common/spin'\nimport { Modal as AModal } from 'ant-design-vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n PieChart,\n TitleComponent,\n ToolboxComponent,\n TooltipComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanPie',\n props: {\n ...pieComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataset = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const option = computed(() => {\n let { data = [] } = unref(dataset)[0] || {}\n if (Array.isArray(props.colors)) {\n const isUseLabelColors = props.isUseLabelColors\n const colors = props.colors\n data = data.map((item, index) => ({\n label: isUseLabelColors ? { color: colors[index] } : {},\n ...item\n }))\n }\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n // 提示\n tooltip: {\n show: props.tooltipShow,\n trigger: props.tooltipTrigger,\n formatter: (params) => {\n const { marker, seriesName, name, value, percent, data } = params || {}\n return useVariablesInText(\n props.tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n percent,\n a: seriesName,\n b: name,\n c: value,\n d: percent,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n }\n )\n },\n textStyle: {\n color: props.tooltipTextStyleColor\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: visible.value ? ZOOM_FONT_SIZE : props.labelFontSize\n }\n },\n color: props.colors,\n series: [\n {\n data,\n type: 'pie',\n radius: [props.innerRadius, props.outerRadius],\n center: [props.centerLeft, props.centerTop],\n roseType: props.roseType,\n avoidLabelOverlap: false,\n minAngle: props.minAngle,\n // data: data.value,\n // data: props.data,\n // dimensions: ['name', 'count'],\n label: {\n show: props.labelPosition !== 'center' && props.labelShow,\n color: props.labelColor,\n fontSize: visible.value ? ZOOM_FONT_SIZE : props.labelFontSize,\n position: props.labelPosition,\n formatter: handleFormatter(props.labelFormatter)\n },\n labelLine: {\n show: props.labelLineShow,\n length: props.labelLineLength,\n length2: props.labelLineLength2\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)'\n },\n label: {\n // show: props.labelPosition === 'center'\n }\n }\n }\n ]\n }\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], dataFieldNames?: ValueTypeDataFieldNames) => {\n const { dataset: d } = useTransformChartDataByAttrValue(data, dataFieldNames)\n dataset.value = d\n }\n\n const handleIndicatorDataset = (data: any = [], dataFieldNames?: ValueTypeDataFieldNames) => {\n const chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n dataset.value = chartData.dataset\n }\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, props.valueTypeDataFieldNames)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e?.data })\n })\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { data } = res.data || {}\n if (data) {\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let arr = []\n if (columns.length > 0) {\n const name = columns[0]\n const value = columns[1]\n arr = rows.map(item => {\n return {\n name: item[name],\n value: item[value]\n }\n })\n }\n handleIndicatorDataset(arr)\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n click\n })\n\n expose({\n refreshData\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n return {\n option,\n style,\n click,\n onClose,\n loading,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport Pie from './Pie.vue'\nexport const EcanPie = withInstall(Pie)\nexport default EcanPie\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps,\n Data,\n ValueTypeDataFieldNames,\n KeyTypeDataFieldNames\n} from '@/utils/props'\n\nexport interface LineProps extends Props {\n data: Data\n titleText: string\n titleSubtext: string\n titleLeft: string\n colors: string[]\n legendShow: boolean,\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal' // 标记点大小\n symbolSize: number // 线宽度\n lineStyleWidth: number // 线宽\n smooth: boolean // 光滑\n xAxisLabelInterval: number\n xAxisSplitLineShow: boolean // x轴展示分割线\n xAxisLabelColor: string // x轴名称颜色\n xAxisLineStyleColor: string // x轴名称颜色\n xAxisSplitLineStyleColor: string // x轴分割线颜色\n xAxisTickShow: boolean // 展示刻度\n xAxisLabelFormatter: string // 格式化\n xAxisInverse: boolean\n xAxisMinInterval: number\n xAxisLabelWidth: number | undefined // x轴名称宽度\n xAxisLabelOverflow: 'none' | 'truncate' | 'break' | 'breakAll' // x轴名称溢出操作\n xAxisLabelRotate: number // x轴名称旋转\n yAxisMinInterval: number\n yAxisInverse: boolean\n yAxisSplitLineShow: boolean // y轴展示分割线\n yAxisSplitLineStyleColor: string // y轴分割线颜色\n yAxisLabelColor: string // y轴名称颜色\n yAxisLineStyleColor: string // y轴名称颜色\n yAxisLabelFormatter: string // 格式化\n valueTypeDataFieldNames: ValueTypeDataFieldNames\n keyTypeDataFieldNames: KeyTypeDataFieldNames\n dataFieldConfigType: 'key' | 'value'\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n graphicConfig: { [key:string]: any }\n tooltipFormatter: string\n tooltipShow: boolean\n toolboxShow: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n areaStyleOpacity: number\n}\n\nexport const lineProps = {\n ...props,\n id: '',\n name: '折线图',\n keyName: '折线图',\n type: 'ecanLine',\n width: '400px',\n height: '400px',\n top: '',\n left: '',\n rotate: '',\n data: [\n { name: '名称一', value: 235, type: '类型一' },\n { name: '名称二', value: 280, type: '类型一' },\n { name: '名称三', value: 230, type: '类型一' },\n { name: '名称四', value: 335, type: '类型一' }\n ],\n titleText: '',\n titleSubtext: '',\n titleLeft: '',\n legendShow: true,\n legendOrient: 'horizontal',\n legendTop: 'top',\n legendLeft: 'center',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n symbolSize: 4,\n lineStyleWidth: 2,\n smooth: false,\n xAxisLabelWidth: undefined,\n xAxisLabelRotate: 0,\n xAxisLabelOverflow: 'none',\n xAxisLabelInterval: 0,\n xAxisSplitLineShow: true,\n xAxisSplitLineStyleColor: '#333',\n xAxisLabelColor: '#333',\n xAxisLineStyleColor: '#333',\n xAxisTickShow: true,\n xAxisLabelFormatter: '{value}', // 格式化\n xAxisMinInterval: 0,\n yAxisMinInterval: 0,\n yAxisSplitLineShow: true,\n yAxisSplitLineStyleColor: '#333',\n yAxisLabelColor: '#333',\n yAxisLineStyleColor: '#333',\n yAxisLabelFormatter: '{value}',\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n valueTypeDataFieldNames: { name: 'name', value: 'value', type: 'type' },\n keyTypeDataFieldNames: { name: 'name', types: [] },\n dataFieldConfigType: 'value',\n graphicConfig: {},\n tooltipShow: true,\n tooltipFormatter: '{marker} {a} {c}',\n toolboxShow: false,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息',\n areaStyleOpacity: 0\n}\n\n// 转化默认属性\nexport const lineComponentProps = transformToComponentProps(lineProps)\n\nexport const lineEvents = ['click', 'refreshData', 'resetRecord']\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n ref=\"echartRef\"\n :option=\"option\"\n autoresize\n v-on=\"eventObj\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport {\n useValueFormatter,\n useEmitEvent, useOnEvent,\n usePickComponentStyle,\n useRequestData,\n useTransformChartDataByAttrKey,\n useTransformChartDataByAttrValue, useVariablesInText, useIndicatorData\n} from '@/hooks'\nimport Echarts from '@/common/echarts'\nimport { lineComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { LineChart } from 'echarts/charts'\nimport { TitleComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames } from '@/utils/props'\nimport Spin from '@/common/spin/Spin.vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n LineChart,\n ToolboxComponent,\n TitleComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanLine',\n props: {\n ...lineComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const echartRef = ref()\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const series = ref<{ [key: string]: any }[]>([])\n const dimensions = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const eventObj = ref<{ [key: string]: any }>({})\n let currentData: { [key: string]: any } | undefined\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subText: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n tooltip: {\n trigger: 'axis',\n textStyle: {\n fontSize: fontSize.value\n },\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n currentData = params[0]?.data\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n for (let i = 0; i < len; i++) {\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n }\n },\n xAxis: {\n type: 'category',\n data: unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n }),\n minInterval: props.xAxisMinInterval,\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n type: 'value',\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n fontSize: fontSize.value\n }\n },\n series: unref(series)\n }\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], useDataFieldNames: boolean = false) => {\n // dataFieldNames 字段映射\n let chartData\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n for (let i = 0; i < len; i++) {\n temp.push({\n type: 'line',\n ...dataset[i],\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n areaStyle: {\n // color: {\n // type: 'linear',\n // x: 0,\n // y: 0,\n // x2: 0,\n // y2: 1,\n // colorStops: [{\n // offset: 0, color: props.colors[i] // 0% 处的颜色\n // }, {\n // offset: 1, color: '#fff' // 100% 处的颜色\n // }],\n // global: false // 缺省为 false\n // },\n opacity: props.areaStyleOpacity\n },\n lineStyle: {\n width: props.lineStyleWidth\n }\n })\n }\n series.value = temp\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n for (let i = 0; i < len; i++) {\n temp.push({\n type: 'line',\n ...dataset[i],\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n lineStyle: {\n width: props.lineStyleWidth\n }\n })\n }\n series.value = temp\n }\n\n // 静态数据\n watch(() => [props.data, props.symbolSize, props.smooth, props.lineStyleWidth, props.areaStyleOpacity], ([data]) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(data)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: props.tooltipShow ? currentData : e.data })\n })\n\n const customClick = (params) => {\n if (echartRef.value.chart.containPixel('grid', [params.offsetX, params.offsetY])) {\n click()\n }\n }\n\n if (props.tooltipShow) {\n eventObj.value['zr:click'] = customClick\n } else {\n eventObj.value.click = click\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n resetRecord,\n click\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n expose({\n refreshData\n })\n\n return {\n option,\n style,\n click,\n loading,\n onClose,\n ecanModal,\n eventObj,\n echartRef\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.full-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n height: calc(100vh);\n }\n .ant-modal-body {\n flex: 1;\n }\n\n .ant-modal-body {\n padding: 45px 30px 0;\n }\n}\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n ref=\"echartRef\"\n :option=\"option\"\n autoresize\n v-on=\"eventObj\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport {\n useValueFormatter,\n useEmitEvent, useOnEvent,\n usePickComponentStyle,\n useRequestData,\n useTransformChartDataByAttrKey,\n useTransformChartDataByAttrValue, useVariablesInText, useIndicatorData\n} from '@/hooks'\nimport Echarts from '@/common/echarts'\nimport { lineComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { LineChart } from 'echarts/charts'\nimport { TitleComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames } from '@/utils/props'\nimport Spin from '@/common/spin/Spin.vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n LineChart,\n ToolboxComponent,\n TitleComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanLine',\n props: {\n ...lineComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props, { expose }) {\n const echartRef = ref()\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const series = ref<{ [key: string]: any }[]>([])\n const dimensions = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const eventObj = ref<{ [key: string]: any }>({})\n let currentData: { [key: string]: any } | undefined\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subText: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n tooltip: {\n trigger: 'axis',\n textStyle: {\n fontSize: fontSize.value\n },\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n currentData = params[0]?.data\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n for (let i = 0; i < len; i++) {\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n }\n },\n xAxis: {\n type: 'category',\n data: unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n }),\n minInterval: props.xAxisMinInterval,\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n type: 'value',\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n fontSize: fontSize.value\n }\n },\n series: unref(series)\n }\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], useDataFieldNames: boolean = false) => {\n // dataFieldNames 字段映射\n let chartData\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n for (let i = 0; i < len; i++) {\n temp.push({\n type: 'line',\n ...dataset[i],\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n areaStyle: {\n // color: {\n // type: 'linear',\n // x: 0,\n // y: 0,\n // x2: 0,\n // y2: 1,\n // colorStops: [{\n // offset: 0, color: props.colors[i] // 0% 处的颜色\n // }, {\n // offset: 1, color: '#fff' // 100% 处的颜色\n // }],\n // global: false // 缺省为 false\n // },\n opacity: props.areaStyleOpacity\n },\n lineStyle: {\n width: props.lineStyleWidth\n }\n })\n }\n series.value = temp\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n for (let i = 0; i < len; i++) {\n temp.push({\n type: 'line',\n ...dataset[i],\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n lineStyle: {\n width: props.lineStyleWidth\n }\n })\n }\n series.value = temp\n }\n\n // 静态数据\n watch(() => [props.data, props.symbolSize, props.smooth, props.lineStyleWidth, props.areaStyleOpacity], ([data]) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(data)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: props.tooltipShow ? currentData : e.data })\n })\n\n const customClick = (params) => {\n if (echartRef.value.chart.containPixel('grid', [params.offsetX, params.offsetY])) {\n click()\n }\n }\n\n if (props.tooltipShow) {\n eventObj.value['zr:click'] = customClick\n } else {\n eventObj.value.click = click\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n resetRecord,\n click\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n expose({\n refreshData\n })\n\n return {\n option,\n style,\n click,\n loading,\n onClose,\n ecanModal,\n eventObj,\n echartRef\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.full-modal {\n .ant-modal {\n max-width: 100%;\n top: 0;\n padding-bottom: 0;\n margin: 0;\n }\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n height: calc(100vh);\n }\n .ant-modal-body {\n flex: 1;\n }\n\n .ant-modal-body {\n padding: 45px 30px 0;\n }\n}\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport Line from './Line.vue'\nexport const EcanLine = withInstall(Line)\nexport default EcanLine\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps,\n Data,\n KeyTypeDataFieldNames,\n ValueTypeDataFieldNames\n} from '@/utils/props'\n\nexport interface BarProps extends Props {\n data: Data\n titleText: string\n titleSubtext: string\n colors: string []\n legendShow: boolean\n legendTextStyleColor: string\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal'\n xAxisLabelInterval: number\n xAxisSplitLineShow: boolean // x轴展示分割线\n xAxisLabelColor: string // x轴名称颜色\n xAxisLabelWidth: number | undefined // x轴名称宽度\n xAxisLabelOverflow: 'none' | 'truncate' | 'break' | 'breakAll' // x轴名称溢出操作\n xAxisLabelRotate: number // x轴名称旋转\n xAxisLineStyleColor: string // x轴名称颜色\n xAxisTickShow: boolean // 展示刻度\n xAxisLabelFormatter: string\n xAxisSplitLineStyleColor: string // x轴分割线颜色\n xAxisInverse: boolean\n xAxisMinInterval: number\n yAxisMinInterval: number\n yAxisInverse: boolean\n yAxisLabelWidth: number | undefined // y轴名称宽度\n yAxisLabelOverflow: 'none' | 'truncate' | 'break' | 'breakAll' // y轴名称溢出操作\n yAxisLabelRotate: number // y轴名称旋转\n yAxisSplitLineShow: boolean // y轴展示分割线\n yAxisSplitLineStyleColor: string // y轴分割线颜色\n yAxisLabelColor: string // y轴名称颜色\n yAxisLineStyleColor: string // y轴名称颜色\n yAxisLabelFormatter: string\n valueTypeDataFieldNames: ValueTypeDataFieldNames\n keyTypeDataFieldNames: KeyTypeDataFieldNames\n dataFieldConfigType: 'key' | 'value'\n tooltipShow: boolean\n tooltipTextStyleColor: string\n tooltipFormatter: string,\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n barWidth: string\n graphicConfig: { [key:string]: any }\n toolboxShow: boolean\n toolboxLocation: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n isUseHorizontalAxis: boolean\n axisInverse: boolean\n isStack: boolean\n labelShow: boolean\n labelFontSize: string\n labelPosition: 'inside' | 'top' | 'bottom' | 'right' | 'left'\n labelColor: string\n}\n\nexport const barProps: BarProps = {\n ...props,\n id: '',\n name: '柱状图',\n keyName: '柱状图',\n type: 'ecanBar',\n width: '400px',\n height: '400px',\n top: '',\n left: '',\n rotate: '',\n xAxisLabelFormatter: '{value}',\n yAxisLabelFormatter: '{value}',\n data: [\n {\n name: '名称一',\n value: 335,\n type: '类型一'\n },\n {\n name: '名称二',\n value: 310,\n type: '类型一'\n },\n {\n name: '名称三',\n value: 310,\n type: '类型一'\n }\n ],\n titleText: '',\n titleSubtext: '',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n legendShow: true,\n legendTextStyleColor: '#333',\n legendOrient: 'horizontal',\n legendTop: 'top',\n legendLeft: 'center',\n tooltipShow: true,\n tooltipTextStyleColor: '',\n tooltipFormatter: '{marker} {a} {c}',\n xAxisSplitLineShow: true,\n xAxisSplitLineStyleColor: '#333',\n xAxisLabelInterval: 0,\n xAxisLabelColor: '#333',\n xAxisLabelWidth: undefined,\n xAxisLabelRotate: 0,\n xAxisLabelOverflow: 'none',\n xAxisLineStyleColor: '#333',\n xAxisTickShow: true,\n xAxisMinInterval: 0,\n yAxisMinInterval: 0,\n yAxisLabelWidth: undefined,\n yAxisLabelRotate: 0,\n yAxisLabelOverflow: 'none',\n yAxisSplitLineShow: true,\n yAxisSplitLineStyleColor: '#333',\n yAxisLabelColor: '#333',\n yAxisLineStyleColor: '#333',\n valueTypeDataFieldNames: { name: 'name', value: 'value', type: 'type' },\n keyTypeDataFieldNames: { name: 'name', types: [] },\n dataFieldConfigType: 'value',\n barWidth: '40%',\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n graphicConfig: {},\n toolboxShow: false,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息',\n isUseHorizontalAxis: false,\n axisInverse: false,\n xAxisInverse: false,\n yAxisInverse: false,\n isStack: false,\n labelShow: false,\n labelFontSize: '12px',\n labelPosition: 'inside',\n labelColor: '',\n toolboxLocation: false,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true\n}\n\n// 转化默认属性\nexport const barComponentProps = transformToComponentProps(barProps)\n\nexport const barEvents: string [] = ['refreshData', 'click', 'resetRecord']\n","<template>\n <div class=\"ecan-bar\" :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n ref=\"echartRef\"\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n <a-modal\n v-model:visible=\"locationVisible\"\n title=\"快速定位\"\n @ok=\"handleLocationOk\"\n >\n <div class=\"location-wrap\">\n <div class=\"location-text\">选择分类:</div>\n <a-select\n v-model:value=\"locationValue\"\n style=\"width: 100%;\"\n placeholder=\"请选择\"\n show-search\n :filter-option=\"onFilterOption\"\n >\n <a-select-option\n v-for=\"(opt, index) in locationNames\"\n :key=\"index\"\n :value=\"index\"\n >\n {{ opt.value }}\n </a-select-option>\n </a-select>\n </div>\n </a-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref, watch, inject, unref } from 'vue'\nimport {\n usePickComponentStyle,\n useOnEvent,\n useTransformChartDataByAttrValue,\n useTransformChartDataByAttrKey,\n useEmitEvent,\n useRequestData,\n useIndicatorData,\n useValueFormatter,\n useVariablesInText\n} from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames, Data } from '@/utils/props'\nimport Echarts from '@/common/echarts'\nimport { barComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { BarChart } from 'echarts/charts'\nimport Spin from '@/common/spin'\nimport { Modal as AModal } from 'ant-design-vue'\nimport {\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n} from 'echarts/components'\nimport { RequestModalParam } from '@/utils/types'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n BarChart,\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n])\nexport default defineComponent({\n name: 'EcanBar',\n props: {\n ...barComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal,\n AModal\n },\n setup (props, { expose }) {\n const echartRef = ref()\n const visible = ref(false)\n const locationVisible = ref(false)\n const locationValue = ref<number | null>(null)\n const locationNames = ref([])\n const style = usePickComponentStyle(props)\n const dataSource = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const series = computed(() => {\n const ds = unref(dataSource)\n const len = ds.length\n const series = []\n for (let i = 0; i < len; i++) {\n const item = {\n ...ds[i],\n type: 'bar',\n barWidth: props.barWidth\n } as { [key:string]: any }\n if (props.isStack) {\n item.stack = 'stack'\n }\n item.label = {\n show: props.labelShow,\n fontSize: props.labelFontSize,\n position: props.labelPosition,\n color: props.labelColor\n }\n series.push(item)\n }\n return series\n })\n const dimensions = ref<{ [key: string]: any }[]>([])\n const loading = ref(false)\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myLocation: {\n show: visible.value ? false : props.toolboxLocation,\n title: '快速定位',\n icon: 'path://M512 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z, M960 480h-33.632C910.752 276.16 747.84 113.248 544 97.632V64a32 32 0 1 0-64 0v33.632C276.16 113.248 113.248 276.16 97.632 480H64a32 32 0 0 0 0 64h33.632C113.248 747.84 276.16 910.752 480 926.368V960a32 32 0 1 0 64 0v-33.632C747.84 910.752 910.752 747.84 926.368 544H960a32 32 0 1 0 0-64zM544 862.368V800a32 32 0 1 0-64 0v62.368C311.424 847.104 176.896 712.576 161.632 544H224a32 32 0 1 0 0-64H161.632C176.896 311.424 311.424 176.896 480 161.632V224a32 32 0 0 0 64 0V161.632c168.576 15.296 303.104 149.792 318.368 318.368H800a32 32 0 1 0 0 64h62.368c-15.264 168.576-149.792 303.104-318.368 318.368z',\n onclick () {\n locationVisible.value = true\n const option = echartRef.value.chart.getOption()\n const { xAxis } = option || {}\n if (xAxis && xAxis.length) {\n locationNames.value = xAxis[0].data\n }\n }\n },\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n tooltip: {\n trigger: 'axis',\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n for (let i = 0; i < len; i++) {\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n },\n // valueFormatter: (value) => {\n // return useVariablesInText(props.tooltipValueFormatter as string, { value })\n // },\n textStyle: {\n color: props.tooltipTextStyleColor,\n fontSize: fontSize.value\n }\n },\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: fontSize.value\n }\n },\n xAxis: {\n type: props.isUseHorizontalAxis ? 'value' : 'category',\n data: props.isUseHorizontalAxis ? null : unref(xAxisData),\n inverse: props.isUseHorizontalAxis ? props.xAxisInverse : props.axisInverse,\n minInterval: props.xAxisMinInterval,\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n type: props.isUseHorizontalAxis ? 'category' : 'value',\n data: props.isUseHorizontalAxis ? unref(dimensions) : null,\n inverse: props.isUseHorizontalAxis ? props.axisInverse : props.yAxisInverse,\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n rotate: props.yAxisLabelRotate,\n width: props.yAxisLabelWidth,\n overflow: props.yAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n series: unref(series)\n }\n })\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const handleDataset = (data: Data = [], useDataFieldNames: boolean = false) => {\n let chartData = {} as { [key:string]: any }\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n dataSource.value = chartData.dataset\n dimensions.value = chartData.dimensions\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n dataSource.value = chartData.dataset\n dimensions.value = chartData.dimensions\n }\n\n const xAxisData = computed(() => {\n return unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n })\n })\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const onFilterOption = (input: string, option: any) => {\n return !!unref(locationNames)[option.value].value.includes(input)\n }\n\n const handleLocationOk = async () => {\n locationVisible.value = false\n const option = echartRef.value.chart.getOption()\n for (let i = 0; i < 7; i++) {\n await changeColor(option.series, option.color, i)\n }\n }\n\n const changeColor = (series: any [], color: [], i: number) => {\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n const chart = echartRef.value.chart\n series.forEach((s, index) => {\n const data = s.data\n let colorStr = ''\n if (i % 2) {\n colorStr = color[index] + 'a8'\n } else {\n colorStr = color[index]\n }\n data[locationValue.value].itemStyle = {\n color: colorStr\n }\n })\n chart.setOption({ series })\n resolve()\n }, 200)\n })\n }\n\n expose({\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e.data })\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n click,\n resetRecord\n })\n\n return {\n option,\n style,\n refreshData,\n click,\n loading,\n onClose,\n ecanModal,\n echartRef,\n handleLocationOk,\n onFilterOption,\n locationVisible,\n locationValue,\n locationNames\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n<style lang=\"less\" scoped>\n.location-wrap {\n display: flex;\n align-items: center;\n .location-text {\n white-space: nowrap;\n }\n}\n</style>\n","<template>\n <div class=\"ecan-bar\" :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n ref=\"echartRef\"\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n <a-modal\n v-model:visible=\"locationVisible\"\n title=\"快速定位\"\n @ok=\"handleLocationOk\"\n >\n <div class=\"location-wrap\">\n <div class=\"location-text\">选择分类:</div>\n <a-select\n v-model:value=\"locationValue\"\n style=\"width: 100%;\"\n placeholder=\"请选择\"\n show-search\n :filter-option=\"onFilterOption\"\n >\n <a-select-option\n v-for=\"(opt, index) in locationNames\"\n :key=\"index\"\n :value=\"index\"\n >\n {{ opt.value }}\n </a-select-option>\n </a-select>\n </div>\n </a-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref, watch, inject, unref } from 'vue'\nimport {\n usePickComponentStyle,\n useOnEvent,\n useTransformChartDataByAttrValue,\n useTransformChartDataByAttrKey,\n useEmitEvent,\n useRequestData,\n useIndicatorData,\n useValueFormatter,\n useVariablesInText\n} from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames, Data } from '@/utils/props'\nimport Echarts from '@/common/echarts'\nimport { barComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { BarChart } from 'echarts/charts'\nimport Spin from '@/common/spin'\nimport { Modal as AModal } from 'ant-design-vue'\nimport {\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n} from 'echarts/components'\nimport { RequestModalParam } from '@/utils/types'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n BarChart,\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n])\nexport default defineComponent({\n name: 'EcanBar',\n props: {\n ...barComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal,\n AModal\n },\n setup (props, { expose }) {\n const echartRef = ref()\n const visible = ref(false)\n const locationVisible = ref(false)\n const locationValue = ref<number | null>(null)\n const locationNames = ref([])\n const style = usePickComponentStyle(props)\n const dataSource = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const series = computed(() => {\n const ds = unref(dataSource)\n const len = ds.length\n const series = []\n for (let i = 0; i < len; i++) {\n const item = {\n ...ds[i],\n type: 'bar',\n barWidth: props.barWidth\n } as { [key:string]: any }\n if (props.isStack) {\n item.stack = 'stack'\n }\n item.label = {\n show: props.labelShow,\n fontSize: props.labelFontSize,\n position: props.labelPosition,\n color: props.labelColor\n }\n series.push(item)\n }\n return series\n })\n const dimensions = ref<{ [key: string]: any }[]>([])\n const loading = ref(false)\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myLocation: {\n show: visible.value ? false : props.toolboxLocation,\n title: '快速定位',\n icon: 'path://M512 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z, M960 480h-33.632C910.752 276.16 747.84 113.248 544 97.632V64a32 32 0 1 0-64 0v33.632C276.16 113.248 113.248 276.16 97.632 480H64a32 32 0 0 0 0 64h33.632C113.248 747.84 276.16 910.752 480 926.368V960a32 32 0 1 0 64 0v-33.632C747.84 910.752 910.752 747.84 926.368 544H960a32 32 0 1 0 0-64zM544 862.368V800a32 32 0 1 0-64 0v62.368C311.424 847.104 176.896 712.576 161.632 544H224a32 32 0 1 0 0-64H161.632C176.896 311.424 311.424 176.896 480 161.632V224a32 32 0 0 0 64 0V161.632c168.576 15.296 303.104 149.792 318.368 318.368H800a32 32 0 1 0 0 64h62.368c-15.264 168.576-149.792 303.104-318.368 318.368z',\n onclick () {\n locationVisible.value = true\n const option = echartRef.value.chart.getOption()\n const { xAxis } = option || {}\n if (xAxis && xAxis.length) {\n locationNames.value = xAxis[0].data\n }\n }\n },\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n tooltip: {\n trigger: 'axis',\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n for (let i = 0; i < len; i++) {\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n },\n // valueFormatter: (value) => {\n // return useVariablesInText(props.tooltipValueFormatter as string, { value })\n // },\n textStyle: {\n color: props.tooltipTextStyleColor,\n fontSize: fontSize.value\n }\n },\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: fontSize.value\n }\n },\n xAxis: {\n type: props.isUseHorizontalAxis ? 'value' : 'category',\n data: props.isUseHorizontalAxis ? null : unref(xAxisData),\n inverse: props.isUseHorizontalAxis ? props.xAxisInverse : props.axisInverse,\n minInterval: props.xAxisMinInterval,\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n type: props.isUseHorizontalAxis ? 'category' : 'value',\n data: props.isUseHorizontalAxis ? unref(dimensions) : null,\n inverse: props.isUseHorizontalAxis ? props.axisInverse : props.yAxisInverse,\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n rotate: props.yAxisLabelRotate,\n width: props.yAxisLabelWidth,\n overflow: props.yAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n series: unref(series)\n }\n })\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const handleDataset = (data: Data = [], useDataFieldNames: boolean = false) => {\n let chartData = {} as { [key:string]: any }\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n dataSource.value = chartData.dataset\n dimensions.value = chartData.dimensions\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n dataSource.value = chartData.dataset\n dimensions.value = chartData.dimensions\n }\n\n const xAxisData = computed(() => {\n return unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n })\n })\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const onFilterOption = (input: string, option: any) => {\n return !!unref(locationNames)[option.value].value.includes(input)\n }\n\n const handleLocationOk = async () => {\n locationVisible.value = false\n const option = echartRef.value.chart.getOption()\n for (let i = 0; i < 7; i++) {\n await changeColor(option.series, option.color, i)\n }\n }\n\n const changeColor = (series: any [], color: [], i: number) => {\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n const chart = echartRef.value.chart\n series.forEach((s, index) => {\n const data = s.data\n let colorStr = ''\n if (i % 2) {\n colorStr = color[index] + 'a8'\n } else {\n colorStr = color[index]\n }\n data[locationValue.value].itemStyle = {\n color: colorStr\n }\n })\n chart.setOption({ series })\n resolve()\n }, 200)\n })\n }\n\n expose({\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e.data })\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n click,\n resetRecord\n })\n\n return {\n option,\n style,\n refreshData,\n click,\n loading,\n onClose,\n ecanModal,\n echartRef,\n handleLocationOk,\n onFilterOption,\n locationVisible,\n locationValue,\n locationNames\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n<style lang=\"less\" scoped>\n.location-wrap {\n display: flex;\n align-items: center;\n .location-text {\n white-space: nowrap;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Bar from './Bar.vue'\nexport const EcanBar = withInstall(Bar)\nexport default EcanBar\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps,\n Data\n} from '@/utils/props'\n\nexport interface ScatterProps extends Props {\n data: Data\n titleText: string\n titleSubtext: string\n colors: string []\n legendShow: boolean,\n tooltipShow: boolean,\n tooltipTrigger: 'item' | 'axis' | 'none'\n tooltipFormatter: string\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal'\n symbolSize: number // 标记点大小\n xAxisLabelInterval: number\n xAxisLabelWidth: number | undefined // x轴名称宽度\n xAxisLabelOverflow: 'none' | 'truncate' | 'break' | 'breakAll' // x轴名称溢出操作\n xAxisLabelRotate: number // x轴名称旋转\n xAxisSplitLineShow: boolean // x轴展示分割线\n xAxisLabelColor: string // x轴名称颜色\n xAxisLineStyleColor: string // x轴名称颜色\n xAxisTickShow: boolean // 展示刻度\n xAxisLabelFormatter: string // 格式化\n yAxisSplitLineShow: boolean // y轴展示分割线\n xAxisSplitLineStyleColor: string // x轴分割线颜色\n yAxisSplitLineStyleColor: string // y轴分割线颜色\n yAxisLabelColor: string // y轴名称颜色\n yAxisLineStyleColor: string // y轴名称颜色\n yAxisLabelFormatter: string // 格式化\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n dataFieldNames: { name: string, value: string }\n graphicConfig: { [key:string]: any }\n toolboxShow: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n}\n\nexport const scatterProps: ScatterProps = {\n ...props,\n id: '',\n name: '散点图',\n keyName: '散点图',\n type: 'ecanScatter',\n width: '400px',\n height: '400px',\n top: '',\n left: '',\n rotate: '',\n data: [\n { name: 233, value: 335 },\n { name: 556, value: 310 },\n { name: 56, value: 234 }\n ],\n titleText: '',\n titleSubtext: '',\n tooltipShow: true,\n tooltipTrigger: 'item',\n tooltipFormatter: '{marker} {b} {c}',\n legendShow: false,\n legendOrient: 'horizontal',\n legendTop: 'top',\n legendLeft: 'center',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n symbolSize: 10,\n xAxisSplitLineShow: true,\n xAxisSplitLineStyleColor: '#333',\n xAxisLineStyleColor: '#333',\n xAxisTickShow: true,\n xAxisLabelColor: '#333',\n xAxisLabelOverflow: 'none',\n xAxisLabelInterval: 0,\n xAxisLabelWidth: undefined,\n xAxisLabelRotate: 0,\n xAxisLabelFormatter: '{value}',\n yAxisSplitLineShow: true,\n yAxisSplitLineStyleColor: '#333',\n yAxisLabelColor: '#333',\n yAxisLineStyleColor: '#333',\n yAxisLabelFormatter: '{value}',\n dataFieldNames: { name: 'name', value: 'value' },\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n graphicConfig: {},\n toolboxShow: false,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息'\n}\n\n// 转化默认属性\nexport const scatterComponentProps = transformToComponentProps(scatterProps)\n\nexport const scatterEvents = ['click', 'refreshData', 'resetRecord']\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref, watch, inject, unref } from 'vue'\nimport {\n useValueFormatter,\n useEmitEvent,\n useOnEvent,\n usePickComponentStyle,\n useRequestData,\n useVariablesInText\n} from '@/hooks'\nimport { RequestModalParam } from '@/utils/types'\nimport Echarts from '@/common/echarts'\nimport { scatterComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { ScatterChart } from 'echarts/charts'\nimport { TitleComponent, TooltipComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport Spin from '@/common/spin/Spin.vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n ScatterChart,\n ToolboxComponent,\n TitleComponent,\n TooltipComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanScatter',\n props: {\n ...scatterComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataset = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n xAxis: {\n // type: 'value'\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n // 提示\n tooltip: {\n show: props.tooltipShow,\n trigger: props.tooltipTrigger,\n formatter (params) {\n const { marker, seriesName } = params\n const record = params?.data?.record ?? {}\n const { name, value } = record\n return useVariablesInText(props.tooltipFormatter, {\n textData: {\n marker,\n seriesName,\n a: seriesName,\n b: name,\n c: value,\n ...record\n }\n })\n },\n axisPointer: {\n type: 'cross'\n },\n textStyle: {\n fontSize: fontSize.value\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n fontSize: fontSize.value\n }\n },\n series: [\n {\n data: unref(dataset),\n type: 'scatter',\n symbolSize: props.symbolSize\n }\n ]\n }\n })\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], dataFieldNames?: { name: string, value:string }) => {\n const { name: x = 'name', value: y = 'value' } = dataFieldNames || {}\n dataset.value = data.map(item => ({ value: [item[x], item[y]], record: item }))\n }\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, props.dataFieldNames)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const onClose = () => {\n visible.value = false\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: e?.data })\n })\n\n const refreshData = () => {\n handleRequestData()\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n click,\n resetRecord\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n }\n\n return {\n option,\n style,\n click,\n loading,\n onClose,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n :option=\"option\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </spin>\n </ecan-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref, watch, inject, unref } from 'vue'\nimport {\n useValueFormatter,\n useEmitEvent,\n useOnEvent,\n usePickComponentStyle,\n useRequestData,\n useVariablesInText\n} from '@/hooks'\nimport { RequestModalParam } from '@/utils/types'\nimport Echarts from '@/common/echarts'\nimport { scatterComponentProps } from './props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { ScatterChart } from 'echarts/charts'\nimport { TitleComponent, TooltipComponent, LegendComponent, ToolboxComponent } from 'echarts/components'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport Spin from '@/common/spin/Spin.vue'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n ScatterChart,\n ToolboxComponent,\n TitleComponent,\n TooltipComponent,\n LegendComponent\n])\nexport default defineComponent({\n name: 'EcanScatter',\n props: {\n ...scatterComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal\n },\n setup (props) {\n const visible = ref(false)\n const style = usePickComponentStyle(props)\n const dataset = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const option = computed(() => {\n // 这样写为了触发响应式\n // 返回函数中使用无法触发\n const xAxisLabelFormatter = props.xAxisLabelFormatter\n const yAxisLabelFormatter = props.yAxisLabelFormatter\n return {\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n xAxis: {\n // type: 'value'\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow,\n formatter (value: string) {\n return useValueFormatter(xAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: {\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(yAxisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n },\n // 提示\n tooltip: {\n show: props.tooltipShow,\n trigger: props.tooltipTrigger,\n formatter (params) {\n const { marker, seriesName } = params\n const record = params?.data?.record ?? {}\n const { name, value } = record\n return useVariablesInText(props.tooltipFormatter, {\n textData: {\n marker,\n seriesName,\n a: seriesName,\n b: name,\n c: value,\n ...record\n }\n })\n },\n axisPointer: {\n type: 'cross'\n },\n textStyle: {\n fontSize: fontSize.value\n }\n },\n // 图例\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n fontSize: fontSize.value\n }\n },\n series: [\n {\n data: unref(dataset),\n type: 'scatter',\n symbolSize: props.symbolSize\n }\n ]\n }\n })\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const handleDataset = (data: any = [], dataFieldNames?: { name: string, value:string }) => {\n const { name: x = 'name', value: y = 'value' } = dataFieldNames || {}\n dataset.value = data.map(item => ({ value: [item[x], item[y]], record: item }))\n }\n\n // 静态数据\n watch(() => props.data, (value: any) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const loading = ref(false)\n\n const requestData = useRequestData(props)\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n loading.value = true\n try {\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, props.dataFieldNames)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const onClose = () => {\n visible.value = false\n }\n\n const emitEvent = useEmitEvent(props)\n\n const click = emitEvent('click', (e) => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: e?.data })\n })\n\n const refreshData = () => {\n handleRequestData()\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n refreshData,\n click,\n resetRecord\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: handleRequestData,\n sortNum: props.requestSort\n })\n }\n\n return {\n option,\n style,\n click,\n loading,\n onClose,\n ecanModal\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Scatter from './Scatter.vue'\nexport const EcanScatter = withInstall(Scatter)\nexport default EcanScatter\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface CustomGraphProps extends Props {\n option: { [key:string]: any }\n optionCode: string\n}\n\nexport const customGraphProps: CustomGraphProps = {\n ...props,\n id: '',\n name: '自定义图表',\n keyName: '自定义图表',\n type: 'ecanCustomGraph',\n width: '400px',\n height: '400px',\n option: {},\n optionCode: ''\n}\n\n// 转化默认属性\nexport const customGraphComponentProps = transformToComponentProps(customGraphProps)\n","<template>\n <div :style=\"style\">\n <echarts\n :option=\"myOption\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, watch, ref } from 'vue'\nimport Echarts from '../../common/echarts'\nimport { customGraphComponentProps } from './props'\nimport { usePickComponentStyle } from '../../hooks'\nimport * as echarts from 'echarts'\n// import 'echarts/components'\nexport default defineComponent({\n name: 'EcanCustomGraph',\n props: {\n ...customGraphComponentProps\n },\n components: {\n Echarts\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myOption = ref()\n watch(() => props.optionCode, (optionCode: string) => {\n /* // eslint-disable-next-line\n let option = {}\n // eslint-disable-next-line\n eval(props.optionCode as string)\n myOption.value = option */\n try {\n // eslint-disable-next-line\n const evalCopy = eval\n myOption.value = evalCopy(optionCode)\n } catch (e) {\n console.error(e)\n }\n }, {\n immediate: true\n })\n return {\n style,\n myOption,\n echarts\n }\n }\n})\n</script>\n","<template>\n <div :style=\"style\">\n <echarts\n :option=\"myOption\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, watch, ref } from 'vue'\nimport Echarts from '../../common/echarts'\nimport { customGraphComponentProps } from './props'\nimport { usePickComponentStyle } from '../../hooks'\nimport * as echarts from 'echarts'\n// import 'echarts/components'\nexport default defineComponent({\n name: 'EcanCustomGraph',\n props: {\n ...customGraphComponentProps\n },\n components: {\n Echarts\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myOption = ref()\n watch(() => props.optionCode, (optionCode: string) => {\n /* // eslint-disable-next-line\n let option = {}\n // eslint-disable-next-line\n eval(props.optionCode as string)\n myOption.value = option */\n try {\n // eslint-disable-next-line\n const evalCopy = eval\n myOption.value = evalCopy(optionCode)\n } catch (e) {\n console.error(e)\n }\n }, {\n immediate: true\n })\n return {\n style,\n myOption,\n echarts\n }\n }\n})\n</script>\n","import { withInstall } from '../../utils/withInstall'\nimport CustomGraph from './CustomGraph.vue'\nexport const EcanCustomGraph = withInstall(CustomGraph)\nexport default EcanCustomGraph\nexport * from './props'\n","import {\n Data,\n Props,\n props,\n transformToComponentProps,\n ValueTypeDataFieldNames,\n KeyTypeDataFieldNames\n} from '@/utils/props'\n\nexport interface ComboGraphProps extends Props {\n data: Data,\n titleText: string\n titleSubtext: string\n colors: string []\n legendShow: boolean\n legendTextStyleColor: string\n legendLeft: 'left' | 'center' | 'right'\n legendTop: 'top' | 'middle' | 'bottom'\n legendOrient: 'vertical' | 'horizontal'\n xAxisLabelInterval: number\n xAxisSplitLineShow: boolean // x轴展示分割线\n xAxisMinInterval: number // 最小间距\n xAxisLabelColor: string // x轴名称颜色\n xAxisLabelRotate: number\n xAxisLabelOverflow: string\n xAxisLabelWidth: number | undefined // x轴名称宽度\n xAxisLineStyleColor: string // x轴名称颜色\n xAxisTickShow: boolean // 展示刻度\n yAxisSplitLineShow: boolean // y轴展示分割线\n xAxisSplitLineStyleColor: string // x轴分割线颜色\n yAxisSplitLineStyleColor: string // y轴分割线颜色\n yAxisLabelColor: string // y轴名称颜色\n yAxisLineStyleColor: string // y轴名称颜色\n valueTypeDataFieldNames: ValueTypeDataFieldNames\n keyTypeDataFieldNames: KeyTypeDataFieldNames\n tooltipShow: boolean\n tooltipTrigger: 'item' | 'axis' | 'none'\n tooltipTextStyleColor: string\n tooltipFormatter: string\n seriesTypes: { [key: string]: any } []\n dataFieldConfigType: 'key' | 'value'\n yAxis: { [key: string]: any } []\n yAxisMinInterval: number\n graphicConfig: { [key:string]: any }\n gridContainLabel: boolean\n gridTop: string\n gridBottom: string\n gridLeft: string\n gridRight: string\n toolboxShow: boolean\n toolboxLocation: boolean\n toolboxDownloadShow:boolean\n toolboxDataZoomShow: boolean\n toolboxInfoShow: boolean\n toolboxOrient: 'horizontal' | 'vertical'\n toolboxItemSize: number // 工具栏 icon 的大小。\n toolboxItemGap: number // 工具栏 icon 每项之间的间隔。横向布局时为水平间隔,纵向布局时为纵向间隔。\n toolboxLeft: 'left' | 'center' | 'right'\n toolboxTop: 'top'| 'middle'| 'bottom'\n toolboxIconStyleBorderColor: string\n toolboxDownloadUrl: string\n toolboxInfoText: string\n symbolSize: number // 线宽度\n lineStyleWidth: number // 线宽\n smooth: boolean // 光滑\n areaStyleOpacity: number\n barWidth: string\n}\n\nexport const comboGraphProps: ComboGraphProps = {\n ...props,\n id: '',\n name: '组合图表',\n keyName: '组合图表',\n type: 'ecanComboGraph',\n width: '400px',\n height: '400px',\n data: [\n {\n name: '名称一',\n value: 335,\n type: '类型一'\n },\n {\n name: '名称二',\n value: 410,\n type: '类型一'\n },\n {\n name: '名称三',\n value: 210,\n type: '类型一'\n },\n {\n name: '名称一',\n value: 510,\n type: '类型二'\n },\n {\n name: '名称二',\n value: 731,\n type: '类型二'\n },\n {\n name: '名称三',\n value: 910,\n type: '类型二'\n }\n ],\n titleText: '',\n titleSubtext: '',\n colors: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],\n legendShow: true,\n legendTextStyleColor: '#333',\n legendOrient: 'horizontal',\n legendTop: 'top',\n legendLeft: 'center',\n tooltipShow: true,\n tooltipTextStyleColor: '',\n tooltipTrigger: 'item',\n tooltipFormatter: '{marker} {a} {c}',\n xAxisLabelInterval: 0,\n xAxisSplitLineShow: true,\n xAxisLabelRotate: 0,\n xAxisLabelOverflow: 'none',\n xAxisLabelWidth: undefined,\n xAxisSplitLineStyleColor: '#333',\n xAxisLabelColor: '#333',\n xAxisLineStyleColor: '#333',\n xAxisTickShow: true,\n xAxisMinInterval: 0,\n yAxisMinInterval: 0,\n yAxisSplitLineShow: true,\n yAxisSplitLineStyleColor: '#333',\n yAxisLabelColor: '#333',\n yAxisLineStyleColor: '#333',\n valueTypeDataFieldNames: { name: 'name', value: 'value', type: 'type' },\n keyTypeDataFieldNames: { name: 'name', types: [] },\n dataFieldConfigType: 'value',\n seriesTypes: [\n {\n type: 'bar',\n axisIndex: 0\n },\n {\n type: 'line',\n axisIndex: 0\n }\n ],\n yAxis: [\n {\n axisLabelFormatter: '{value}'\n },\n {\n axisLabelFormatter: '{value}'\n }\n ],\n gridContainLabel: true,\n gridTop: '10%',\n gridBottom: '10%',\n gridLeft: '5%',\n gridRight: '5%',\n graphicConfig: {},\n toolboxShow: false,\n toolboxLocation: false,\n toolboxDownloadShow: true,\n toolboxDataZoomShow: true,\n toolboxInfoShow: true,\n toolboxOrient: 'horizontal',\n toolboxItemSize: 16,\n toolboxItemGap: 8,\n toolboxLeft: 'right',\n toolboxTop: 'top',\n toolboxIconStyleBorderColor: '#666',\n toolboxDownloadUrl: '',\n toolboxInfoText: '当前无说明信息',\n areaStyleOpacity: 0,\n symbolSize: 4,\n lineStyleWidth: 2,\n smooth: false,\n barWidth: '40%'\n}\n\n// 转化默认属性\nexport const comboGraphComponentProps = transformToComponentProps(comboGraphProps)\n\nexport const comboGraphEvents = ['refreshData', 'click', 'resetRecord']\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n ref=\"echartRef\"\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n </ecan-modal>\n <a-modal\n v-model:visible=\"locationVisible\"\n title=\"快速定位\"\n @ok=\"handleLocationOk\"\n >\n <div class=\"location-wrap\">\n <div class=\"location-text\">选择分类:</div>\n <a-select\n v-model:value=\"locationValue\"\n style=\"width: 100%;\"\n placeholder=\"请选择\"\n show-search\n :filter-option=\"onFilterOption\"\n >\n <a-select-option\n v-for=\"(opt, index) in locationNames\"\n :key=\"index\"\n :value=\"index\"\n >\n {{ opt.value }}\n </a-select-option>\n </a-select>\n </div>\n </a-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport {\n useEmitEvent,\n useOnEvent,\n usePickComponentStyle,\n useRequestData, useTransformChartDataByAttrKey,\n useTransformChartDataByAttrValue,\n useValueFormatter,\n useVariablesInText,\n useIndicatorData\n} from '@/hooks'\nimport { comboGraphComponentProps } from './props'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames } from '@/utils/props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { BarChart, LineChart } from 'echarts/charts'\nimport { DatasetComponent, LegendComponent, TitleComponent, ToolboxComponent } from 'echarts/components'\nimport Echarts from '@/common/echarts'\nimport Spin from '@/common/spin/'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n BarChart,\n LineChart,\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n])\nexport default defineComponent({\n name: 'EcanComboGraph',\n props: {\n ...comboGraphComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal,\n AModal\n },\n setup (props, { expose }) {\n const echartRef = ref()\n const visible = ref(false)\n const locationVisible = ref(false)\n const locationValue = ref<number | null>(null)\n const locationNames = ref([])\n const style = usePickComponentStyle(props)\n const series = ref<{ [key: string]: any }[]>([])\n const dimensions = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const option = computed(() => ({\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myLocation: {\n show: visible.value ? false : props.toolboxLocation,\n title: '快速定位',\n icon: 'path://M512 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z, M960 480h-33.632C910.752 276.16 747.84 113.248 544 97.632V64a32 32 0 1 0-64 0v33.632C276.16 113.248 113.248 276.16 97.632 480H64a32 32 0 0 0 0 64h33.632C113.248 747.84 276.16 910.752 480 926.368V960a32 32 0 1 0 64 0v-33.632C747.84 910.752 910.752 747.84 926.368 544H960a32 32 0 1 0 0-64zM544 862.368V800a32 32 0 1 0-64 0v62.368C311.424 847.104 176.896 712.576 161.632 544H224a32 32 0 1 0 0-64H161.632C176.896 311.424 311.424 176.896 480 161.632V224a32 32 0 0 0 64 0V161.632c168.576 15.296 303.104 149.792 318.368 318.368H800a32 32 0 1 0 0 64h62.368c-15.264 168.576-149.792 303.104-318.368 318.368z',\n onclick () {\n locationVisible.value = true\n const option = echartRef.value.chart.getOption()\n const { xAxis } = option || {}\n if (xAxis && xAxis.length) {\n locationNames.value = xAxis[0].data\n }\n }\n },\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: fontSize.value\n }\n },\n tooltip: {\n trigger: 'axis',\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n const { tooltipFormatter: _tooltipFormatter } = seriesType || {}\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n // 如果系列有提示框组件就使用自定义,没有就用默认的\n _tooltipFormatter || tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n seriesName,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n },\n textStyle: {\n color: props.tooltipTextStyleColor,\n fontSize: fontSize.value\n }\n },\n xAxis: {\n minInterval: props.xAxisMinInterval,\n type: 'category',\n data: unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n }),\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: unref(yAxis),\n series: unref(series)\n }))\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const handleDataset = (data: any = [], useDataFieldNames: boolean = false) => {\n // dataFieldNames 字段映射\n let chartData\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n // dataFieldNames 字段映射\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n const { type, axisIndex } = seriesType || {}\n let series = {\n type: type,\n yAxisIndex: axisIndex,\n ...dataset[i]\n } as { [key:string]: any }\n if (type === 'line') {\n series = {\n ...series,\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n areaStyle: {\n opacity: props.areaStyleOpacity\n },\n lineStyle: {\n width: props.lineStyleWidth\n }\n }\n }\n if (type === 'bar') {\n series = {\n ...series,\n barWidth: props.barWidth\n }\n }\n temp.push(series)\n }\n series.value = temp\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n // dataFieldNames 字段映射\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n temp.push({\n type: seriesType?.type,\n yAxisIndex: seriesType?.axisIndex,\n ...dataset[i]\n })\n }\n series.value = temp\n }\n\n // 静态数据\n watch(() => [props.data, props.seriesTypes, props.symbolSize, props.smooth, props.areaStyleOpacity, props.lineStyleWidth, props.barWidth], ([value]) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const yAxis = computed(() => {\n const yAxis = props.yAxis\n return yAxis?.map((axis) => {\n return {\n type: 'value',\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(axis.axisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n }\n })\n })\n\n const loading = ref(false)\n\n const requestData = useRequestData(props)\n\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const onFilterOption = (input: string, option: any) => {\n return !!unref(locationNames)[option.value].value.includes(input)\n }\n\n const handleLocationOk = async () => {\n locationVisible.value = false\n const option = echartRef.value.chart.getOption()\n for (let i = 0; i < 7; i++) {\n await changeColor(option.series, option.color, i)\n }\n }\n\n const changeColor = (series: any [], color: [], i: number) => {\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n const chart = echartRef.value.chart\n series.forEach((s, index) => {\n const data = s.data\n let colorStr = ''\n if (i % 2) {\n colorStr = color[index] + 'a8'\n } else {\n colorStr = color[index]\n }\n data[locationValue.value].itemStyle = {\n color: colorStr\n }\n })\n chart.setOption({ series })\n resolve()\n }, 200)\n })\n }\n\n expose({\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e?.data })\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n click\n })\n\n return {\n style,\n option,\n click,\n loading,\n onClose,\n ecanModal,\n echartRef,\n handleLocationOk,\n onFilterOption,\n locationVisible,\n locationValue,\n locationNames\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n<style lang=\"less\" scoped>\n.location-wrap {\n display: flex;\n align-items: center;\n .location-text {\n white-space: nowrap;\n }\n}\n</style>\n","<template>\n <div :style=\"style\">\n <spin :spinning=\"loading\">\n <echarts\n ref=\"echartRef\"\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n <ecan-modal\n width=\"1920px\"\n height=\"1080px\"\n ref=\"ecanModal\"\n @close=\"onClose\"\n >\n <spin class=\"spin-wrap\" :spinning=\"loading\">\n <echarts\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n @click=\"click\"\n />\n </spin>\n </ecan-modal>\n <a-modal\n v-model:visible=\"locationVisible\"\n title=\"快速定位\"\n @ok=\"handleLocationOk\"\n >\n <div class=\"location-wrap\">\n <div class=\"location-text\">选择分类:</div>\n <a-select\n v-model:value=\"locationValue\"\n style=\"width: 100%;\"\n placeholder=\"请选择\"\n show-search\n :filter-option=\"onFilterOption\"\n >\n <a-select-option\n v-for=\"(opt, index) in locationNames\"\n :key=\"index\"\n :value=\"index\"\n >\n {{ opt.value }}\n </a-select-option>\n </a-select>\n </div>\n </a-modal>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, unref, watch } from 'vue'\nimport {\n useEmitEvent,\n useOnEvent,\n usePickComponentStyle,\n useRequestData, useTransformChartDataByAttrKey,\n useTransformChartDataByAttrValue,\n useValueFormatter,\n useVariablesInText,\n useIndicatorData\n} from '@/hooks'\nimport { comboGraphComponentProps } from './props'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REQUEST_MODEL, ZOOM_FONT_SIZE } from '@/utils/constant'\nimport { KeyTypeDataFieldNames } from '@/utils/props'\nimport { use } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { BarChart, LineChart } from 'echarts/charts'\nimport { DatasetComponent, LegendComponent, TitleComponent, ToolboxComponent } from 'echarts/components'\nimport Echarts from '@/common/echarts'\nimport Spin from '@/common/spin/'\nimport useDownloadFile from '@/hooks/useDownloadFile'\nimport { Modal as AModal } from 'ant-design-vue'\nimport { RequestModalParam } from '@/utils/types'\nimport EcanModal from '@/container/modal'\nuse([\n CanvasRenderer,\n BarChart,\n LineChart,\n TitleComponent,\n LegendComponent,\n DatasetComponent,\n ToolboxComponent\n])\nexport default defineComponent({\n name: 'EcanComboGraph',\n props: {\n ...comboGraphComponentProps\n },\n components: {\n Spin,\n Echarts,\n EcanModal,\n AModal\n },\n setup (props, { expose }) {\n const echartRef = ref()\n const visible = ref(false)\n const locationVisible = ref(false)\n const locationValue = ref<number | null>(null)\n const locationNames = ref([])\n const style = usePickComponentStyle(props)\n const series = ref<{ [key: string]: any }[]>([])\n const dimensions = ref<{ [key: string]: any }[]>([])\n const ecanModal = ref()\n const fontSize = computed(() => visible.value ? ZOOM_FONT_SIZE : 12)\n const option = computed(() => ({\n title: {\n text: props.titleText,\n subtext: props.titleSubtext,\n left: 'center'\n },\n toolbox: {\n show: props.toolboxShow,\n left: props.toolboxLeft,\n top: props.toolboxTop,\n itemSize: props.toolboxItemSize,\n itemGap: props.toolboxItemGap,\n feature: {\n myLocation: {\n show: visible.value ? false : props.toolboxLocation,\n title: '快速定位',\n icon: 'path://M512 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z, M960 480h-33.632C910.752 276.16 747.84 113.248 544 97.632V64a32 32 0 1 0-64 0v33.632C276.16 113.248 113.248 276.16 97.632 480H64a32 32 0 0 0 0 64h33.632C113.248 747.84 276.16 910.752 480 926.368V960a32 32 0 1 0 64 0v-33.632C747.84 910.752 910.752 747.84 926.368 544H960a32 32 0 1 0 0-64zM544 862.368V800a32 32 0 1 0-64 0v62.368C311.424 847.104 176.896 712.576 161.632 544H224a32 32 0 1 0 0-64H161.632C176.896 311.424 311.424 176.896 480 161.632V224a32 32 0 0 0 64 0V161.632c168.576 15.296 303.104 149.792 318.368 318.368H800a32 32 0 1 0 0 64h62.368c-15.264 168.576-149.792 303.104-318.368 318.368z',\n onclick () {\n locationVisible.value = true\n const option = echartRef.value.chart.getOption()\n const { xAxis } = option || {}\n if (xAxis && xAxis.length) {\n locationNames.value = xAxis[0].data\n }\n }\n },\n myDownload: {\n show: props.toolboxDownloadShow,\n title: '数据下载',\n icon: 'path://M502.010485 765.939573c3.773953 3.719718 8.686846 5.573949 13.596669 5.573949 0.075725 0 0.151449-0.010233 0.227174-0.011256 0.329505 0.016373 0.654916 0.050142 0.988514 0.050142 0.706081 0 1.400906-0.042979 2.087545-0.116657 4.352121-0.366344 8.607028-2.190899 11.961426-5.496178l335.053985-330.166675c7.619538-7.509021 7.709589-19.773346 0.200568-27.393907s-19.774369-7.711636-27.39493-0.201591L536.193005 706.304358 536.193005 50.019207c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 657.032164-306.881342-302.44838c-7.618515-7.509021-19.883863-7.419993-27.393907 0.199545-7.509021 7.619538-7.419993 19.884886 0.199545 27.393907L502.010485 765.939573z, M867.170139 711.020776c-10.698666 0-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 13.054317-10.620895 23.675212-23.676236 23.675212L205.182103 919.486668c-13.054317 0-23.676236-10.620895-23.676236-23.675212L181.505867 730.391962c0-10.698666-8.67252-19.371186-19.371186-19.371186s-19.371186 8.67252-19.371186 19.371186l0 165.419494c0 34.416857 28.000728 62.416562 62.417585 62.416562l618.941638 0c34.417881 0 62.417585-27.999704 62.417585-62.416562L886.540302 730.391962C886.541325 719.693296 877.868805 711.020776 867.170139 711.020776z',\n onclick () {\n useDownloadFile(props.toolboxDownloadUrl)\n }\n },\n myDataZoom: {\n show: visible.value ? false : props.toolboxDataZoomShow,\n title: '放大',\n icon: 'path://M932.42 902.246667L792 761.793333A403.84 403.84 0 0 0 896 490.666667c0-223.86-181.473333-405.333333-405.333333-405.333334S85.333333 266.806667 85.333333 490.666667s181.473333 405.333333 405.333334 405.333333a403.84 403.84 0 0 0 271.126666-104l140.453334 140.453333a21.333333 21.333333 0 0 0 30.173333-30.173333zM128 490.666667c0-200.293333 162.373333-362.666667 362.666667-362.666667s362.666667 162.373333 362.666666 362.666667-162.373333 362.666667-362.666666 362.666666-362.666667-162.373333-362.666667-362.666666z m512 0a21.333333 21.333333 0 0 1-21.333333 21.333333H512v106.666667a21.333333 21.333333 0 0 1-42.666667 0V512H362.666667a21.333333 21.333333 0 0 1 0-42.666667h106.666666V362.666667a21.333333 21.333333 0 0 1 42.666667 0v106.666666h106.666667a21.333333 21.333333 0 0 1 21.333333 21.333334z',\n onclick () {\n visible.value = true\n ecanModal.value?.showModal()\n }\n },\n myInfo: {\n show: props.toolboxInfoShow,\n title: '说明信息',\n icon: 'path://M512.50142 958.397886c-119.320573 0-231.499491-46.465265-315.871087-130.837884C112.258737 743.188406 65.792449 631.010511 65.792449 511.688915c0-119.319549 46.466288-231.499491 130.837884-315.871087C281.002952 111.445208 393.180847 64.979944 512.50142 64.979944s231.499491 46.465265 315.871087 130.837884c84.372619 84.372619 130.837884 196.551538 130.837884 315.871087 0 119.321596-46.465265 231.499491-130.837884 315.871087C744.000911 911.932622 631.821993 958.397886 512.50142 958.397886zM512.50142 105.962334c-223.718271 0-405.726581 182.00831-405.726581 405.726581s182.00831 405.726581 405.726581 405.726581c223.718271 0 405.727605-182.00831 405.727605-405.726581S736.220714 105.962334 512.50142 105.962334z M510.150886 775.953647c-18.107403 0-32.745798-14.678304-32.745798-32.785707L477.405087 452.191846c0-18.108426 14.638395-32.785707 32.745798-32.785707 18.107403 0 32.745798 14.678304 32.745798 32.785707l0 290.976094C542.896684 761.275343 528.258289 775.953647 510.150886 775.953647z M511.357364 296.458969m-45.080731 0a44.054 44.054 0 1 0 90.161463 0 44.054 44.054 0 1 0-90.161463 0Z',\n onclick () {\n AModal.info({\n title: '说明信息',\n content: (props.toolboxInfoText)\n })\n }\n }\n }\n },\n grid: {\n top: props.gridTop,\n bottom: props.gridBottom,\n left: props.gridLeft,\n right: props.gridRight,\n containLabel: props.gridContainLabel\n },\n color: props.colors,\n legend: {\n show: props.legendShow,\n orient: props.legendOrient,\n top: props.legendTop,\n left: props.legendLeft,\n textStyle: {\n color: props.legendTextStyleColor,\n fontSize: fontSize.value\n }\n },\n tooltip: {\n trigger: 'axis',\n show: props.tooltipShow,\n formatter: (params) => {\n const len = params.length\n let formatter = ''\n let tooltipFormatter = props.tooltipFormatter\n if (tooltipFormatter === '') {\n tooltipFormatter = '{marker} {a} {c}'\n }\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n const { tooltipFormatter: _tooltipFormatter } = seriesType || {}\n const { marker, seriesName, name, value, data } = params[i] || {}\n if (i === 0) {\n formatter += `${name}<br/>`\n }\n formatter += useVariablesInText(\n // 如果系列有提示框组件就使用自定义,没有就用默认的\n _tooltipFormatter || tooltipFormatter,\n {\n textData: {\n marker,\n name,\n value,\n seriesName,\n a: seriesName,\n b: name,\n c: value,\n ...data\n }\n },\n {\n useNewline: true,\n useSpace: true\n })\n formatter += '<br/>'\n }\n return formatter\n },\n textStyle: {\n color: props.tooltipTextStyleColor,\n fontSize: fontSize.value\n }\n },\n xAxis: {\n minInterval: props.xAxisMinInterval,\n type: 'category',\n data: unref(dimensions).map((item) => {\n let result = {}\n if (item && typeof item === 'object') {\n result = {\n ...item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n } else {\n result = {\n value: item,\n textStyle: {\n fontSize: fontSize.value\n }\n }\n }\n return result\n }),\n splitLine: {\n show: props.xAxisSplitLineShow,\n lineStyle: {\n color: props.xAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n color: props.xAxisLabelColor,\n interval: props.xAxisLabelInterval,\n rotate: props.xAxisLabelRotate,\n width: props.xAxisLabelWidth,\n overflow: props.xAxisLabelOverflow\n },\n axisLine: {\n lineStyle: {\n color: props.xAxisLineStyleColor\n }\n },\n axisTick: {\n show: props.xAxisTickShow\n }\n },\n yAxis: unref(yAxis),\n series: unref(series)\n }))\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n const onClose = () => {\n visible.value = false\n }\n\n const handleDataset = (data: any = [], useDataFieldNames: boolean = false) => {\n // dataFieldNames 字段映射\n let chartData\n if (props.dataFieldConfigType === 'key') {\n const dataFieldNames = useDataFieldNames ? props.keyTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n } else if (props.dataFieldConfigType === 'value') {\n const dataFieldNames = useDataFieldNames ? props.valueTypeDataFieldNames : null\n chartData = useTransformChartDataByAttrValue(data, dataFieldNames)\n }\n // dataFieldNames 字段映射\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n const { type, axisIndex } = seriesType || {}\n let series = {\n type: type,\n yAxisIndex: axisIndex,\n ...dataset[i]\n } as { [key:string]: any }\n if (type === 'line') {\n series = {\n ...series,\n symbolSize: props.symbolSize,\n smooth: props.smooth,\n areaStyle: {\n opacity: props.areaStyleOpacity\n },\n lineStyle: {\n width: props.lineStyleWidth\n }\n }\n }\n if (type === 'bar') {\n series = {\n ...series,\n barWidth: props.barWidth\n }\n }\n temp.push(series)\n }\n series.value = temp\n }\n\n const handleIndicatorDataset = (data: any = [], keyTypeDataFieldNames: KeyTypeDataFieldNames, useDataFieldNames: boolean = false) => {\n const dataFieldNames = useDataFieldNames ? keyTypeDataFieldNames : null\n const chartData = useTransformChartDataByAttrKey(data, dataFieldNames)\n // dataFieldNames 字段映射\n dimensions.value = chartData.dimensions\n const dataset = chartData.dataset\n const temp = [] as { [key: string]: any } []\n const len = dataset.length\n const seriesTypes = props.seriesTypes\n for (let i = 0; i < len; i++) {\n const seriesType = seriesTypes[i]\n temp.push({\n type: seriesType?.type,\n yAxisIndex: seriesType?.axisIndex,\n ...dataset[i]\n })\n }\n series.value = temp\n }\n\n // 静态数据\n watch(() => [props.data, props.seriesTypes, props.symbolSize, props.smooth, props.areaStyleOpacity, props.lineStyleWidth, props.barWidth], ([value]) => {\n if (props.dataType === 'static' || unref(pageMode) === 'design') {\n handleDataset(value)\n }\n }, {\n immediate: true,\n deep: true\n })\n\n const yAxis = computed(() => {\n const yAxis = props.yAxis\n return yAxis?.map((axis) => {\n return {\n type: 'value',\n minInterval: props.yAxisMinInterval,\n splitLine: {\n show: props.yAxisSplitLineShow,\n lineStyle: {\n color: props.yAxisSplitLineStyleColor\n }\n },\n axisLabel: {\n fontSize: fontSize.value,\n color: props.yAxisLabelColor,\n formatter (value: string) {\n return useValueFormatter(axis.axisLabelFormatter, value)\n }\n },\n axisLine: {\n lineStyle: {\n color: props.yAxisLineStyleColor\n }\n }\n }\n })\n })\n\n const loading = ref(false)\n\n const requestData = useRequestData(props)\n\n // 动态数据\n const handleRequestData = async () => {\n if (props.dataType !== 'request') return\n try {\n loading.value = true\n const res = await requestData()\n handleDataset(res?.data?.data?.rows, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n const { columns = [], rows = [] } = res?.data?.data ?? {}\n let fieldNames\n if (columns.length > 0) {\n fieldNames = {\n name: columns[0],\n types: columns.slice(1).map(column => {\n return {\n label: column,\n value: column\n }\n })\n }\n }\n handleIndicatorDataset(rows, fieldNames, true)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n\n const refreshData = () => {\n switch (props.dataType) {\n case 'indicator':\n handleIndicatorData()\n break\n case 'request':\n handleRequestData()\n break\n }\n }\n\n const onFilterOption = (input: string, option: any) => {\n return !!unref(locationNames)[option.value].value.includes(input)\n }\n\n const handleLocationOk = async () => {\n locationVisible.value = false\n const option = echartRef.value.chart.getOption()\n for (let i = 0; i < 7; i++) {\n await changeColor(option.series, option.color, i)\n }\n }\n\n const changeColor = (series: any [], color: [], i: number) => {\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n const chart = echartRef.value.chart\n series.forEach((s, index) => {\n const data = s.data\n let colorStr = ''\n if (i % 2) {\n colorStr = color[index] + 'a8'\n } else {\n colorStr = color[index]\n }\n data[locationValue.value].itemStyle = {\n color: colorStr\n }\n })\n chart.setOption({ series })\n resolve()\n }, 200)\n })\n }\n\n expose({\n refreshData\n })\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n const click = emitEvent('click', (e) => {\n // TODO 设置是否保存钻取数据\n const modal = getGlobalModel(props.id)\n // 约定获取数据\n setGlobalModel(props.id, { ...modal, RECORD: e?.data })\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n click\n })\n\n return {\n style,\n option,\n click,\n loading,\n onClose,\n ecanModal,\n echartRef,\n handleLocationOk,\n onFilterOption,\n locationVisible,\n locationValue,\n locationNames\n }\n }\n})\n</script>\n\n<style lang=\"less\">\n.spin-wrap {\n padding: 0 30px 30px;\n}\n</style>\n<style lang=\"less\" scoped>\n.location-wrap {\n display: flex;\n align-items: center;\n .location-text {\n white-space: nowrap;\n }\n}\n</style>\n","import { withInstall } from '../../utils/withInstall'\nimport ComboGraph from './ComboGraph.vue'\nexport const EcanComboGraph = withInstall(ComboGraph)\nexport default EcanComboGraph\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface BorderProps extends Props {\n fontSize: string // 字体大小\n fontFamily: string // 字体\n fontWeight: number // 字体的粗细程度\n title: string\n mode: 'top-title' | 'no-title' | 'left-top'\n borderColor: string\n borderRadius: string\n borderStyle: string\n borderWidth: string\n backgroundColor: string\n useBorderModify: boolean\n textShadow: string\n data: { [key:string]: any }\n}\n\nexport const borderProps: BorderProps = {\n ...props,\n name: '边框',\n keyName: '边框',\n type: 'ecanBorder',\n width: '300px',\n height: '300px',\n zIndex: 0,\n fontSize: '16px',\n fontFamily: '',\n fontWeight: 700,\n title: '标题',\n mode: 'no-title',\n borderColor: '#eee',\n borderRadius: '5px',\n borderStyle: 'solid',\n borderWidth: '2px',\n backgroundColor: '#ffffff',\n useBorderModify: false,\n textShadow: '',\n data: {}\n}\n\nexport const borderComponentProps = transformToComponentProps(borderProps)\n\nexport const borderEvents = ['click']\n","<template>\n <div class=\"ecan-border\" :style=\"style\" @click=\"click\">\n <div\n class=\"no-title\"\n :style=\"borderStyle\"\n v-if=\"mode === 'no-title'\"\n >\n <template v-if=\"useBorderModify\">\n <div class=\"top-left border-item\"/>\n <div class=\"top-right border-item\"/>\n <div class=\"bottom-left border-item\"/>\n <div class=\"bottom-right border-item\"/>\n </template>\n </div>\n <div class=\"top-title\" :style=\"borderStyle\" v-if=\"mode === 'top-title'\">\n <div class=\"title-item-wrapper\">\n <div class=\"title-item\">\n <img\n class=\"title-decoration-left\"\n src=\"../../assets/border-title-decoration-left.png\"\n >\n <div class=\"title\">{{ title }}</div>\n <img\n class=\"title-decoration-right\"\n src=\"../../assets/border-title-decoration-right.png\"\n >\n </div>\n </div>\n <div class=\"top-left border-item\"/>\n <div class=\"top-right border-item\"/>\n <div class=\"bottom-left border-item\"/>\n <div class=\"bottom-right border-item\"/>\n </div>\n <div class=\"left-title\" v-if=\"mode === 'left-title'\">\n <div class=\"title\">\n <span>{{ title }}</span>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, watch } from 'vue'\nimport { borderComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle } from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanBorder',\n props: {\n ...borderComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props, ['background'])\n const { theme } = inject(GLOBAL_CONFIG, {\n theme: 'light'\n })\n const borderStyle = computed(() => {\n return {\n // borderWidth: props.borderWidth,\n // borderStyle: props.borderStyle,\n // borderRadius: props.borderRadius,\n // borderColor: props.borderColor,\n // backgroundColor: props.backgroundColor,\n width: '100%',\n height: '100%'\n }\n })\n const emitEvent = useEmitEvent(props)\n const click = emitEvent('click', () => {})\n const myData = ref<{ [key:string]: any } []>([])\n watch(() => props.data, (data: { [key:string]: any } []) => {\n myData.value = data\n }, {\n immediate: true,\n deep: true\n })\n useOnEvent(props, {\n click\n })\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myData\n })\n return {\n style,\n click,\n borderStyle,\n theme\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.top-title, .no-title {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n .border-item {\n position: absolute;\n z-index: 2;\n border-color: #50FCFC;\n border-style: solid;\n width: 13px;\n height: 11px;\n }\n .top-left {\n top: 0;\n left: 0;\n border-top-width: 1px;\n border-right-width: 0;\n border-bottom-width: 0;\n border-left-width: 1px;\n }\n .top-right {\n top: 0;\n right: -2px;\n border-top-width: 1px;\n border-right-width: 1px;\n border-bottom-width: 0;\n border-left-width: 0;\n }\n .bottom-left {\n bottom: -2px;\n left: 0;\n border-top-width: 0;\n border-right-width: 0;\n border-bottom-width: 1px;\n border-left-width: 1px;\n }\n .bottom-right {\n bottom: -2px;\n right: -2px;\n border-top-width: 0;\n border-right-width: 1px;\n border-bottom-width: 1px;\n border-left-width: 0;\n }\n .title-item-wrapper {\n width: 100%;\n padding: 5px 0;\n background-image: url(\"../../assets/border-title-background.png\");\n background-size: cover;\n display: grid;\n place-content: center;\n }\n .title-item {\n display: flex;\n align-items: center;\n }\n .title {\n padding: 0 17px;\n color: #d5fdfd;\n background: linear-gradient(0deg,#01aaff,#00eaff);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n .title-decoration-left {\n width: 58px;\n height: 14px;\n }\n .title-decoration-right {\n width: 58px;\n height: 14px;\n }\n}\n\n.left-title {\n position: relative;\n width: 100%;\n height: 100%;\n border: 2px solid #375A8899;\n border-radius: 0;\n .title {\n position: absolute;\n left: -33px;\n top: -14px;\n width: 33px;\n min-height: 194px;\n padding-top: 33px;\n padding-bottom: 31px;\n background-image: url(\"../../assets/border-left-title.png\");\n background-repeat: no-repeat;\n background-size: 100% 100%;\n color: #fff;\n font-weight: 500;\n text-align: center;\n span {\n writing-mode: vertical-lr;\n }\n }\n}\n</style>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAAcCAMAAACH42siAAAAZlBMVEUAAABBltJCldJCldFEk89BltJCltFBldI/lMBKndtmb9pCltNDldFAkclAldNBldJBltM/lM5AltNCldJBldJBlNJBltVBldJBlNJBlNI/lNNBldJBldNAldJBldJBldJBldNBldIiNK7WAAAAInRSTlMAM4BNGmaz5gQGbiAPCV1WQxUpOCY9EmxQSC2jdoacqZK8uPo7tAAAAZ9JREFUSMe90NmOwjAMheGka0J3SulCy/L+Lzk4I+HYhckEKs7dr1x8kQVM5YJMZ7SLiXVHOw817Z72cSns3BmziY7EnGRGjDqUpKt4pEZQKruvyaJt85YmBUebKLJVNUlpq6oOQ1tVVRzbqu6DwFb1NUlsVd3SNL0UDM0jqkaSqoeQqjKmahtQNUzuC1AtU1sF9KHmnmrtrSK6idqBWqE6GFVxFdGvqDGoJ01Qt7rfTEV0e7V6qSK6VjNPtTaqoOq8Ugnqr7aeav+rAuqrTh+qZw3o1urAVcFVQD3U6ZnaYY9MLZk6G5WhDaDFI9UeUPyE7gCNsAdAD9gxoBJ7ARRPUVwALXdu8/h/s3xmjtwUu0/M0M/UJzBjAei3TUTdpmKmcpkBmOHKBNTPzJi59zYJys3DO2aL78YcmNkLgrrM9m9TucwzmoBy08xlju+bgL42G4c5OcxqZSLqbwqXOVNTGXMWFD0ak6KN1ZKaojYmbribndW9MXELNQEFFUyiNqQlmEQ1JqpgErUifUUTUVEIupx1wzpjvWfdsh4FQX8ANe4nnpsb9NEAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAAcCAMAAACH42siAAAAaVBMVEUAAABElM9BltJCldJCldFBltJBldJCltFNmrNCmNNFldNAldJBldNBldRBldNBldNBldJCoNFBldJBltNBldJBldJAldJAltJBldJBldJBldNAlNFAldJBlNJAldJBldNBldJBldJBldLfIVowAAAAI3RSTlMAGjJNgGbmswMSCScgDTs/ZAVRK0eYj2s3r3AWveHEhXjeXb5rzlgAAAFqSURBVEjH1dbJVsJAEIXhHjJ05tlEooK8/0NKsbDrFjmHiBD0Lvqcf9PfthRM7xvoZMQuLHZaOejGYLtcdEItzI9oaLg5xIHj5hgcG262oXXcrGzJ23Umg5717C7NKBrAjOMDM8YgCI5ghmEPprUTmMZkrBOtdbJgfpZovho0gwzNOkfTam9k5jSGkKlTMOezWT3VLH5qlg8wQzSbO5jJ28l8Z+YLmZMwuz9lupvNXpjlFTMTZv7vzFSatTDtGnNeYdpNzZTMSJhx5f84m8Y3mSEzJzTVolko3J7Qve+a0J3vntDWffdEaMUQQo1vTWjuuyA0UWvUUarqzuqLUMPt1MD3uKTaTdRwvdrdorpFtfZtH6eyK2F3RS23U3uhlr9VB1TdE1V2h7Vr1O4mdbdera6o+Wq1Vqi2rEktFapGoZopVLVCtVCXag19IBPUiiWpBrojE1QNXZAp1/TYbhKdKVwuWotORKfn9wu/DSc/X9T6qgAAAABJRU5ErkJggg==\"","<template>\n <div class=\"ecan-border\" :style=\"style\" @click=\"click\">\n <div\n class=\"no-title\"\n :style=\"borderStyle\"\n v-if=\"mode === 'no-title'\"\n >\n <template v-if=\"useBorderModify\">\n <div class=\"top-left border-item\"/>\n <div class=\"top-right border-item\"/>\n <div class=\"bottom-left border-item\"/>\n <div class=\"bottom-right border-item\"/>\n </template>\n </div>\n <div class=\"top-title\" :style=\"borderStyle\" v-if=\"mode === 'top-title'\">\n <div class=\"title-item-wrapper\">\n <div class=\"title-item\">\n <img\n class=\"title-decoration-left\"\n src=\"../../assets/border-title-decoration-left.png\"\n >\n <div class=\"title\">{{ title }}</div>\n <img\n class=\"title-decoration-right\"\n src=\"../../assets/border-title-decoration-right.png\"\n >\n </div>\n </div>\n <div class=\"top-left border-item\"/>\n <div class=\"top-right border-item\"/>\n <div class=\"bottom-left border-item\"/>\n <div class=\"bottom-right border-item\"/>\n </div>\n <div class=\"left-title\" v-if=\"mode === 'left-title'\">\n <div class=\"title\">\n <span>{{ title }}</span>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref, watch } from 'vue'\nimport { borderComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle } from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanBorder',\n props: {\n ...borderComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props, ['background'])\n const { theme } = inject(GLOBAL_CONFIG, {\n theme: 'light'\n })\n const borderStyle = computed(() => {\n return {\n // borderWidth: props.borderWidth,\n // borderStyle: props.borderStyle,\n // borderRadius: props.borderRadius,\n // borderColor: props.borderColor,\n // backgroundColor: props.backgroundColor,\n width: '100%',\n height: '100%'\n }\n })\n const emitEvent = useEmitEvent(props)\n const click = emitEvent('click', () => {})\n const myData = ref<{ [key:string]: any } []>([])\n watch(() => props.data, (data: { [key:string]: any } []) => {\n myData.value = data\n }, {\n immediate: true,\n deep: true\n })\n useOnEvent(props, {\n click\n })\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n type: props.type,\n value: myData\n })\n return {\n style,\n click,\n borderStyle,\n theme\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.top-title, .no-title {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n .border-item {\n position: absolute;\n z-index: 2;\n border-color: #50FCFC;\n border-style: solid;\n width: 13px;\n height: 11px;\n }\n .top-left {\n top: 0;\n left: 0;\n border-top-width: 1px;\n border-right-width: 0;\n border-bottom-width: 0;\n border-left-width: 1px;\n }\n .top-right {\n top: 0;\n right: -2px;\n border-top-width: 1px;\n border-right-width: 1px;\n border-bottom-width: 0;\n border-left-width: 0;\n }\n .bottom-left {\n bottom: -2px;\n left: 0;\n border-top-width: 0;\n border-right-width: 0;\n border-bottom-width: 1px;\n border-left-width: 1px;\n }\n .bottom-right {\n bottom: -2px;\n right: -2px;\n border-top-width: 0;\n border-right-width: 1px;\n border-bottom-width: 1px;\n border-left-width: 0;\n }\n .title-item-wrapper {\n width: 100%;\n padding: 5px 0;\n background-image: url(\"../../assets/border-title-background.png\");\n background-size: cover;\n display: grid;\n place-content: center;\n }\n .title-item {\n display: flex;\n align-items: center;\n }\n .title {\n padding: 0 17px;\n color: #d5fdfd;\n background: linear-gradient(0deg,#01aaff,#00eaff);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n .title-decoration-left {\n width: 58px;\n height: 14px;\n }\n .title-decoration-right {\n width: 58px;\n height: 14px;\n }\n}\n\n.left-title {\n position: relative;\n width: 100%;\n height: 100%;\n border: 2px solid #375A8899;\n border-radius: 0;\n .title {\n position: absolute;\n left: -33px;\n top: -14px;\n width: 33px;\n min-height: 194px;\n padding-top: 33px;\n padding-bottom: 31px;\n background-image: url(\"../../assets/border-left-title.png\");\n background-repeat: no-repeat;\n background-size: 100% 100%;\n color: #fff;\n font-weight: 500;\n text-align: center;\n span {\n writing-mode: vertical-lr;\n }\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Border from './Border.vue'\nexport const EcanBorder = withInstall(Border)\nexport default EcanBorder\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface TabsProps extends Props {\n data: { [key:string]: any } []\n backgroundColor: string\n tabFontSize: string\n tabColor: string\n activeTabColor: string\n tabBackgroundImage: string\n tabBarGutter: string\n activeTabBackgroundImage\n value: string\n activeKey: number\n tabHorizontalPadding: string\n autoSwitch: boolean\n autoSwitchInterval: number\n // 包含组件id\n contains: string []\n tabFontWeight: number\n tabAlignItems: 'flex-start' | 'center' | 'flex-end'\n tabJustifyContent: 'flex-start' | 'center' | 'flex-end',\n tabFlexDirection: 'row' | 'column'\n}\n\nexport const tabsProps: TabsProps = {\n ...props,\n tabHorizontalPadding: '0px',\n type: 'ecanTabs',\n name: '标签页',\n keyName: '标签页',\n width: '500px',\n height: '400px',\n tabFontSize: '14px',\n backgroundColor: '#ffffff',\n activeTabColor: '#1890ff',\n tabBackgroundImage: '',\n activeTabBackgroundImage: '',\n tabColor: '#333',\n tabBarGutter: '24px',\n tabFontWeight: 400,\n value: '',\n activeKey: 0,\n autoSwitch: false,\n autoSwitchInterval: 5,\n contains: [],\n tabFlexDirection: 'row',\n data: [\n {\n title: '标签1'\n },\n {\n title: '标签2'\n },\n {\n title: '标签3'\n }\n ],\n tabAlignItems: 'flex-start',\n tabJustifyContent: 'flex-start'\n}\n\nexport const tabsComponentProps = transformToComponentProps(tabsProps)\n\nexport const tabsEvents = ['tabChange']\n","<template>\n <div class=\"ecan-tabs\" :style=\"style\">\n <div\n class=\"tabs-header\"\n :style=\"{\n fontSize: tabFontSize,\n alignItems: tabAlignItems,\n justifyContent: tabJustifyContent,\n flexDirection: tabFlexDirection\n }\"\n >\n <div\n class=\"tab\"\n :style=\"{\n padding: `5px ${tabHorizontalPadding}`,\n color: isActive(index) ? activeTabColor : tabColor,\n backgroundImage: isActive(index) ? useImagePath(activeTabBackgroundImage, true) : useImagePath(tabBackgroundImage, true),\n marginRight: tabFlexDirection === 'row' ? tabBarGutter : null,\n marginBottom: tabFlexDirection === 'column' ? tabBarGutter : null,\n fontWeight: tabFontWeight\n }\"\n v-for=\"(tab, index) in myData\"\n :key=\"index\"\n @click.prevent.stop=\"tabChange(tab, index)\"\n >\n <div\n class=\"tab-inner\"\n :style=\"{\n borderBottom: !activeTabBackgroundImage && !tabBackgroundImage ? `1px solid ${isActive(index) ? activeTabColor : 'transparent'}` : ''\n }\"\n >\n {{tab.title}}\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, onBeforeUnmount, onMounted, ref, unref, watch } from 'vue'\nimport { tabsComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useImagePath } from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REFRESH_PAGE } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanTabs',\n props: {\n ...tabsComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const activeKey = ref(0)\n watch(() => props.activeKey, (key) => {\n activeKey.value = key\n }, {\n immediate: true\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n let timer: ReturnType<typeof setInterval> = null\n const setAutoSwitch = () => {\n const maxKey = Array.isArray(unref(myData)) ? unref(myData).length - 1 : 0\n if (props.autoSwitch && maxKey > 0) {\n timer = setInterval(() => {\n const changeKey = unref(activeKey) + 1\n if (changeKey <= maxKey) {\n activeKey.value = changeKey\n } else {\n activeKey.value = 0\n }\n myValue.value = unref(myData)[unref(activeKey)]\n emitRefreshPage()\n }, props.autoSwitchInterval * 1000)\n }\n }\n onMounted(() => {\n if (unref(pageMode) !== 'design') {\n setAutoSwitch()\n }\n })\n onBeforeUnmount(() => {\n clearInterval(timer)\n })\n const myData = ref<{ [key:string]: any } []>([])\n const myValue = ref({})\n watch(() => props.data, (data: { [key:string]: any } []) => {\n myData.value = data\n myValue.value = Array.isArray(data) && data.length > 0 ? data[0] : {}\n }, {\n immediate: true,\n deep: true\n })\n const isActive = (index: number) => activeKey.value === index\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n value: myValue,\n activeKey\n })\n\n const { emitRefreshPage } = inject(REFRESH_PAGE, {\n // eslint-disable-next-line no-void\n emitRefreshPage: () => void 0\n })\n\n const tabChange = emitEvent('tabChange', (tab:{ [key:string]:any }, index: number) => {\n if (index !== unref(activeKey)) {\n myValue.value = tab\n activeKey.value = index\n emitRefreshPage()\n }\n })\n useOnEvent(props, {\n tabChange\n })\n return {\n style,\n activeKey,\n isActive,\n tabChange,\n myData,\n useImagePath\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-tabs {\n display: flex;\n}\n\n.tabs-header {\n width: 100%;\n color: #333333;\n display: flex;\n padding: 0 10px;\n}\n\n.tab {\n background-size: 100% 100%;\n background-repeat: no-repeat;\n cursor: default;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.tab:last-child {\n margin-bottom: 0 !important;\n margin-right: 0 !important;\n}\n\n.tabs-content {\n flex:1;\n}\n</style>\n","<template>\n <div class=\"ecan-tabs\" :style=\"style\">\n <div\n class=\"tabs-header\"\n :style=\"{\n fontSize: tabFontSize,\n alignItems: tabAlignItems,\n justifyContent: tabJustifyContent,\n flexDirection: tabFlexDirection\n }\"\n >\n <div\n class=\"tab\"\n :style=\"{\n padding: `5px ${tabHorizontalPadding}`,\n color: isActive(index) ? activeTabColor : tabColor,\n backgroundImage: isActive(index) ? useImagePath(activeTabBackgroundImage, true) : useImagePath(tabBackgroundImage, true),\n marginRight: tabFlexDirection === 'row' ? tabBarGutter : null,\n marginBottom: tabFlexDirection === 'column' ? tabBarGutter : null,\n fontWeight: tabFontWeight\n }\"\n v-for=\"(tab, index) in myData\"\n :key=\"index\"\n @click.prevent.stop=\"tabChange(tab, index)\"\n >\n <div\n class=\"tab-inner\"\n :style=\"{\n borderBottom: !activeTabBackgroundImage && !tabBackgroundImage ? `1px solid ${isActive(index) ? activeTabColor : 'transparent'}` : ''\n }\"\n >\n {{tab.title}}\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject, onBeforeUnmount, onMounted, ref, unref, watch } from 'vue'\nimport { tabsComponentProps } from './props'\nimport { useEmitEvent, useOnEvent, usePickComponentStyle, useImagePath } from '@/hooks'\nimport { GLOBAL_CONFIG, GLOBAL_MODEL, REFRESH_PAGE } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanTabs',\n props: {\n ...tabsComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const activeKey = ref(0)\n watch(() => props.activeKey, (key) => {\n activeKey.value = key\n }, {\n immediate: true\n })\n\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n\n let timer: ReturnType<typeof setInterval> = null\n const setAutoSwitch = () => {\n const maxKey = Array.isArray(unref(myData)) ? unref(myData).length - 1 : 0\n if (props.autoSwitch && maxKey > 0) {\n timer = setInterval(() => {\n const changeKey = unref(activeKey) + 1\n if (changeKey <= maxKey) {\n activeKey.value = changeKey\n } else {\n activeKey.value = 0\n }\n myValue.value = unref(myData)[unref(activeKey)]\n emitRefreshPage()\n }, props.autoSwitchInterval * 1000)\n }\n }\n onMounted(() => {\n if (unref(pageMode) !== 'design') {\n setAutoSwitch()\n }\n })\n onBeforeUnmount(() => {\n clearInterval(timer)\n })\n const myData = ref<{ [key:string]: any } []>([])\n const myValue = ref({})\n watch(() => props.data, (data: { [key:string]: any } []) => {\n myData.value = data\n myValue.value = Array.isArray(data) && data.length > 0 ? data[0] : {}\n }, {\n immediate: true,\n deep: true\n })\n const isActive = (index: number) => activeKey.value === index\n // 注册函数触发事件拦截器\n const emitEvent = useEmitEvent(props)\n const { setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n // 初始化设置值\n setGlobalModel(props.id, {\n value: myValue,\n activeKey\n })\n\n const { emitRefreshPage } = inject(REFRESH_PAGE, {\n // eslint-disable-next-line no-void\n emitRefreshPage: () => void 0\n })\n\n const tabChange = emitEvent('tabChange', (tab:{ [key:string]:any }, index: number) => {\n if (index !== unref(activeKey)) {\n myValue.value = tab\n activeKey.value = index\n emitRefreshPage()\n }\n })\n useOnEvent(props, {\n tabChange\n })\n return {\n style,\n activeKey,\n isActive,\n tabChange,\n myData,\n useImagePath\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-tabs {\n display: flex;\n}\n\n.tabs-header {\n width: 100%;\n color: #333333;\n display: flex;\n padding: 0 10px;\n}\n\n.tab {\n background-size: 100% 100%;\n background-repeat: no-repeat;\n cursor: default;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.tab:last-child {\n margin-bottom: 0 !important;\n margin-right: 0 !important;\n}\n\n.tabs-content {\n flex:1;\n}\n</style>\n","import Tabs from './Tabs.vue'\nimport { withInstall } from '../../utils/withInstall'\nexport const EcanTabs = withInstall(Tabs)\nexport default EcanTabs\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface ImageProps extends Props {\n imgUrl: string\n href: string\n target: 'self' | 'blank' | 'event' // 打开方式\n linkPage: string // 传入pageId\n}\n\nexport const imageProps: ImageProps = {\n ...props,\n name: '图片',\n keyName: '图片',\n type: 'ecanImage',\n width: '300px',\n height: '300px',\n imgUrl: '',\n target: 'self',\n href: '',\n linkPage: ''\n}\n\nexport const imageComponentProps = transformToComponentProps(imageProps)\n","<template>\n <img\n :style=\"style\"\n :src=\"myImgUrl\"\n v-if=\"myImgUrl !== ''\"\n @click=\"onClick\"\n />\n <div\n class=\"image-placeholder\"\n :style=\"style\"\n v-else\n >\n 请上传图片\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, unref } from 'vue'\nimport { imageComponentProps } from './props'\nimport { useImagePath, usePickComponentStyle, usePageUrl, useVariablesInText } from '@/hooks'\nimport { GLOBAL_CONFIG } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanImage',\n props: {\n ...imageComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myImgUrl = computed(() => useImagePath(props.imgUrl))\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const onClick = () => {\n // 空链接、空页面直接 return\n if (!props.linkPage && !props.href) return\n const linkPage = props.linkPage || ''\n const pageUrl = usePageUrl(unref(pageMode), linkPage)\n // 优先使用外部链接,再使用url\n const href = props.href\n let url = href || pageUrl\n url = useVariablesInText(url)\n const target = props.target\n if (!target) return\n if (target !== 'event') {\n window.open(url, '_' + target)\n } else {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n }\n return {\n style,\n myImgUrl,\n onClick\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.image-placeholder {\n display: grid;\n place-content: center;\n border: 1px solid #d9d9d9;\n font-size: 16px;\n color: #333;\n width: 100%;\n overflow: hidden;\n}\n</style>\n","<template>\n <img\n :style=\"style\"\n :src=\"myImgUrl\"\n v-if=\"myImgUrl !== ''\"\n @click=\"onClick\"\n />\n <div\n class=\"image-placeholder\"\n :style=\"style\"\n v-else\n >\n 请上传图片\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, unref } from 'vue'\nimport { imageComponentProps } from './props'\nimport { useImagePath, usePickComponentStyle, usePageUrl, useVariablesInText } from '@/hooks'\nimport { GLOBAL_CONFIG } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanImage',\n props: {\n ...imageComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const myImgUrl = computed(() => useImagePath(props.imgUrl))\n const { pageMode } = inject(GLOBAL_CONFIG, {\n pageMode: 'normal'\n })\n const onClick = () => {\n // 空链接、空页面直接 return\n if (!props.linkPage && !props.href) return\n const linkPage = props.linkPage || ''\n const pageUrl = usePageUrl(unref(pageMode), linkPage)\n // 优先使用外部链接,再使用url\n const href = props.href\n let url = href || pageUrl\n url = useVariablesInText(url)\n const target = props.target\n if (!target) return\n if (target !== 'event') {\n window.open(url, '_' + target)\n } else {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n }\n return {\n style,\n myImgUrl,\n onClick\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.image-placeholder {\n display: grid;\n place-content: center;\n border: 1px solid #d9d9d9;\n font-size: 16px;\n color: #333;\n width: 100%;\n overflow: hidden;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Image from './Image.vue'\nexport const EcanImage = withInstall(Image)\nexport default EcanImage\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface IframeProps extends Props {\n link: string,\n linkType: 'web' | 'erd'\n}\n\nexport const iframeProps: IframeProps = {\n ...props,\n name: '网页',\n keyName: '网页',\n type: 'ecanIframe',\n width: '300px',\n height: '300px',\n link: '',\n linkType: 'web'\n}\n\nexport const iframeComponentProps = transformToComponentProps(iframeProps)\n","<template>\n <iframe\n :src=\"myLink\"\n :style=\"style\"\n v-if=\"myLink\"\n />\n <div\n class=\"iframe-placeholder\"\n :style=\"style\"\n v-else\n >\n 请填写网页链接\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, inject, unref } from 'vue'\nimport { usePickComponentStyle, useVariablesInText } from '@/hooks'\nimport { iframeComponentProps } from '@/media/iframe/props'\nimport { GLOBAL_CONFIG, ERD_URL } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanIframe',\n props: {\n ...iframeComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const { contextRequestUrl } = inject(GLOBAL_CONFIG, {\n contextRequestUrl: ''\n })\n const myLink = computed(() => {\n let link = useVariablesInText(props.link)\n if (props.linkType === 'erd' && link != null) {\n let ctxErdUrl = unref(contextRequestUrl)\n if (ctxErdUrl[ctxErdUrl.length - 1] === '/') {\n ctxErdUrl += 'erdReport'\n } else {\n ctxErdUrl += '/erdReport'\n }\n const erdUrl = ERD_URL || ctxErdUrl\n link = `${erdUrl}?_t=0&uid=${link}`\n }\n return link\n })\n return {\n style,\n myLink\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.iframe-placeholder {\n display: grid;\n place-content: center;\n border: 1px solid #d9d9d9;\n font-size: 16px;\n color: #333;\n width: 100%;\n overflow: hidden;\n}\n</style>\n","<template>\n <iframe\n :src=\"myLink\"\n :style=\"style\"\n v-if=\"myLink\"\n />\n <div\n class=\"iframe-placeholder\"\n :style=\"style\"\n v-else\n >\n 请填写网页链接\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, inject, unref } from 'vue'\nimport { usePickComponentStyle, useVariablesInText } from '@/hooks'\nimport { iframeComponentProps } from '@/media/iframe/props'\nimport { GLOBAL_CONFIG, ERD_URL } from '@/utils/constant'\nexport default defineComponent({\n name: 'EcanIframe',\n props: {\n ...iframeComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props)\n const { contextRequestUrl } = inject(GLOBAL_CONFIG, {\n contextRequestUrl: ''\n })\n const myLink = computed(() => {\n let link = useVariablesInText(props.link)\n if (props.linkType === 'erd' && link != null) {\n let ctxErdUrl = unref(contextRequestUrl)\n if (ctxErdUrl[ctxErdUrl.length - 1] === '/') {\n ctxErdUrl += 'erdReport'\n } else {\n ctxErdUrl += '/erdReport'\n }\n const erdUrl = ERD_URL || ctxErdUrl\n link = `${erdUrl}?_t=0&uid=${link}`\n }\n return link\n })\n return {\n style,\n myLink\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.iframe-placeholder {\n display: grid;\n place-content: center;\n border: 1px solid #d9d9d9;\n font-size: 16px;\n color: #333;\n width: 100%;\n overflow: hidden;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Iframe from './Iframe.vue'\nexport const EcanIframe = withInstall(Iframe)\nexport default EcanIframe\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface TableProps extends Props {\n columns: { [key: string]: any } []\n data: { [key: string]: any } []\n bordered: boolean\n size: 'default' | 'middle' | 'small'\n isUseSeq: boolean\n columnsFixedNum: number\n scrollX: number\n paginationShow: boolean\n paginationPosition: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight'\n simple: boolean\n cellBackgroundColor: string\n borderColor: string\n paginationPageSize: number\n isUseAction: boolean // 添加操作列\n isUseExport: boolean // 导出数据\n actionColumnWidth: number\n actionList: { [key: string]: any } []\n headerFontSize: string\n headerFontWeight: number\n fontSize: string\n fontWeight: number\n isReverse: boolean\n clickHighlight: boolean\n filterDropdownHeight: string\n graphicConfig: { [key:string]: any }\n}\n\nexport const tableProps: TableProps = {\n ...props,\n zIndex: 2,\n name: '表格',\n keyName: '表格',\n type: 'ecanTable',\n width: '400px',\n height: '240px',\n bordered: false,\n headerFontSize: '14px',\n fontSize: '14px',\n isUseSeq: false,\n size: 'default',\n headerFontWeight: 400,\n isUseExport: false,\n fontWeight: 400,\n columnsFixedNum: 0,\n scrollX: 0,\n paginationShow: true,\n isReverse: false,\n simple: false,\n cellBackgroundColor: '',\n borderColor: '',\n paginationPosition: 'bottomRight',\n paginationPageSize: 10,\n isUseAction: false,\n clickHighlight: false,\n filterDropdownHeight: '200px',\n actionList: [{\n title: '',\n href: '',\n target: '',\n color: ''\n }],\n actionColumnWidth: 100,\n columns: [\n {\n title: '姓名',\n dataIndex: 'name'\n },\n {\n title: '年龄',\n dataIndex: 'age'\n },\n {\n title: '住址',\n dataIndex: 'address'\n }\n ],\n data: [\n {\n name: '小明',\n age: 32,\n address: '福州软件园'\n },\n {\n name: '小红',\n age: 25,\n address: '福州软件园'\n }\n ],\n graphicConfig: {}\n}\n\n// 转化默认属性\nexport const tableComponentProps = transformToComponentProps(tableProps)\n\nexport const tableEvents = ['click', 'refreshData', 'resetRecord', 'exportTableData']\n","<template>\n <div class=\"ecan-table\" :style=\"style\">\n <skeleton :loading=\"loading\">\n <div class=\"table-tool\" v-if=\"isUseExport\">\n <a-button class=\"export-button\" @click=\"exportTableData\">导出数据</a-button>\n </div>\n <a-table\n class=\"table\"\n :style=\"{\n height: '100%'\n }\"\n :columns=\"tableColumns\"\n :data-source=\"tableDataSource\"\n :bordered=\"bordered\"\n :size=\"size\"\n :customRow=\"customRow\"\n :scroll=\"{ x, y }\"\n :pagination=\"pagination\"\n @change=\"tableChange\"\n >\n <template #customFilterDropdown=\"{ column, selectedKeys, setSelectedKeys, confirm, clearFilters }\">\n <div\n class=\"ecan-table-filter\"\n :style=\"{\n height: filterDropdownHeight\n }\"\n >\n <a-input\n v-model:value=\"column.filterOptionsInputValue\"\n placeholder=\"请输入关键字\"\n :value=\"selectedKeys[0]\"\n class=\"filter-input\"\n @change=\"onSearchFilterOptions\"\n />\n <a-checkbox-group\n v-model:value=\"column.filterCheckboxGroupValue\"\n class=\"filter-checkbox\"\n :options=\"useFilterOptions(column)\"\n @change=\"useSetSelectedKeys(setSelectedKeys, column)\"\n >\n </a-checkbox-group>\n <div>\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"width: 90px; margin-right: 8px\"\n @click=\"() => confirm()\"\n >\n 搜索\n </a-button>\n <a-button\n size=\"small\"\n style=\"width: 90px\"\n @click.stop=\"onResetFilter(clearFilters, column)\"\n >\n 重置\n </a-button>\n </div>\n </div>\n </template>\n <template #bodyCell=\"{ column, index, text, record }\">\n <!--序号-->\n <template v-if=\"column.dataIndex === 'SEQ'\">\n <span>{{ index + 1 }}</span>\n </template>\n <!-- 操作列配置 -->\n <template v-else-if=\"column.dataIndex === 'ACTION'\">\n <div class=\"action-list\">\n <div class=\"action\" v-for=\"(action, index) in actionList\" :key=\"index\">\n <a\n :href=\"handleHref(action.href, record)\"\n :target=\"handleHrefTarget(action.target)\"\n :style=\"{\n color: action.color,\n fontSize,\n fontWeight\n }\"\n @click=\"onTouchHrefEvent(action.target, handleHref(action.href, record))\"\n >\n {{ action.title }}\n </a>\n </div>\n </div>\n </template>\n <!--进度条-->\n <template v-else-if=\"column.format === 'progress'\">\n <div class=\"progress-cell\">\n <div\n class=\"progress\"\n :style=\"{\n background: column.progressColor || '#1890ff',\n height: column.progressWidth || '18px',\n width: `${handleProgressText(text, column.progressTextDecimalPlaces)}%`\n }\"\n />\n <div\n class=\"progress-text\"\n :style=\"{\n color: handleProgressText(text) < 100 ? column.progressTextColor || '#333' : column.progressFinishedTextColor || '#fff'\n }\"\n >\n {{handleProgressText(text, column.progressTextDecimalPlaces)}}%\n </div>\n </div>\n </template>\n <template v-else>\n <div\n :class=\"[contrastClass(text, column.format)]\"\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ column.format != null ? formatFn(text, column.format) : text }}\n </div>\n </template>\n </template>\n <template #summary>\n <a-table-summary v-if=\"summaryList.length > 0\">\n <a-table-summary-row>\n <a-table-summary-cell\n v-for=\"(summary, index) in summaryList\"\n :key=\"index\"\n :index=\"index\"\n :style=\"{\n backgroundColor: cellBackgroundColor,\n textAlign: summary.cellAlign || 'center',\n color: summary.cellColor,\n borderBottomColor: borderColor,\n }\"\n >\n <div\n :class=\"[contrastClass(summary.total, summary.format)]\"\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ (summary.format != null || summary.format !== '') && formatFn(summary.total, summary.format) }}\n </div>\n </a-table-summary-cell>\n </a-table-summary-row>\n </a-table-summary>\n </template>\n </a-table>\n </skeleton>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, unref, ref, watch, inject, reactive } from 'vue'\nimport {\n Button as AButton,\n Input as AInput,\n CheckboxGroup as ACheckboxGroup,\n Table as ATable,\n TableSummary as ATableSummary,\n TableSummaryRow as ATableSummaryRow,\n TableSummaryCell as ATableSummaryCell,\n message\n} from 'ant-design-vue'\nimport 'ant-design-vue/es/input/style'\nimport 'ant-design-vue/es/checkbox/style'\nimport 'ant-design-vue/es/table/style'\nimport 'ant-design-vue/es/progress/style'\nimport { utils, writeFile } from 'xlsx'\nimport {\n usePickComponentStyle,\n useEmitEvent,\n useRequestData,\n useOnEvent,\n useIndicatorData,\n useVariablesInText\n} from '@/hooks'\nimport { tableComponentProps } from './props'\nimport { formatMoney, formatPercentage } from '@/utils/util'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '@/common/skeleton/Skeleton.vue'\nimport { cloneDeep, pick } from 'lodash-es'\nimport { RequestModalParam } from '@/utils/types'\nimport { Big } from 'big.js'\nexport default defineComponent({\n name: 'EcanTable',\n components: {\n Skeleton,\n AButton,\n AInput,\n ACheckboxGroup,\n ATable,\n ATableSummary,\n ATableSummaryRow,\n ATableSummaryCell\n },\n props: {\n ...tableComponentProps\n },\n setup (props, { expose }) {\n const style = usePickComponentStyle(props)\n const splitY = computed(() => {\n if (props.paginationShow) {\n switch (props.size) {\n case 'small':\n return 90\n case 'middle':\n return 100\n default:\n return 120\n }\n } else {\n switch (props.size) {\n case 'small':\n return 40\n case 'middle':\n return 47\n default:\n return 55\n }\n }\n })\n const x = computed(() => props.scrollX)\n const y = computed(() => parseFloat(props.height as string) - unref(splitY))\n const myColumns = ref<{ [key: string]: any } []>([])\n const myDataSource = ref<{ [key: string]: any } []>([])\n const tableColumns = ref<{ [key: string]: any } []>([])\n const tableDataSource = ref<{ [key: string]: any } []>([])\n const total = ref(0)\n const pageNum = ref(1)\n const pageSize = computed(() => props.paginationPageSize as number)\n const filterDataIndexList = reactive([])\n const handleChildrenColumns = (_columns: { [key: string]: any } [] = []) => {\n if (Array.isArray(_columns) && _columns.length > 0) {\n const len = _columns.length\n const columnsFixedNum = props.columnsFixedNum as number\n // 这里的循环为了 props 是引用类型,会造成脏数据(上次修改后,还会存在上次的数据)\n // 如果使用深拷贝会造成性能的浪费,循环来说相对更快\n for (let i = 0; i < len; i++) {\n const column = _columns[i]\n if (i < columnsFixedNum) {\n column.fixed = 'left'\n } else {\n column.fixed = false\n }\n const {\n cellAlign = 'center',\n cellColor,\n dataIndex,\n title,\n tableFilter,\n headerCellAlign,\n headerCellColor\n } = column\n if (tableFilter) {\n filterDataIndexList.push(dataIndex)\n column.filterOptionsInputValue = ''\n column.filterCheckboxGroupValue = []\n column.customFilterDropdown = true\n column.onFilter = (value, record) => record[dataIndex].toString().toLowerCase().includes(value.toLowerCase())\n }\n // 通用配置\n // 头部单元格\n column.customHeaderCell = () => ({\n style: {\n display: 'table-cell',\n verticalAlign: 'middle',\n fontSize: props.headerFontSize,\n fontWeight: props.headerFontWeight,\n textAlign: headerCellAlign || 'center',\n color: headerCellColor,\n borderBottomColor: props.borderColor\n }\n })\n // 表格单元格\n column.customCell = (record, rowIndex) => ({\n style: {\n textAlign: cellAlign,\n color: cellColor,\n backgroundColor: props.cellBackgroundColor,\n borderBottomColor: props.borderColor\n },\n class: {\n highlight: unref(useRowIndex) === rowIndex && props.clickHighlight\n },\n onClick: emitEvent('click', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n record = {\n dataIndex,\n title,\n ...record\n }\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: record })\n })\n })\n if (Array.isArray(column.children)) {\n handleChildrenColumns(column.children)\n }\n }\n }\n }\n const handleColumns = (columns: { [key: string]: any } [] = []) => {\n // 复制表头数据\n if (props.isUseSeq) {\n // 添加序号\n columns.unshift({\n title: '序号',\n dataIndex: 'SEQ',\n align: 'center'\n })\n }\n // 添加操作列\n if (props.isUseAction) {\n columns.push({\n title: '操作',\n dataIndex: 'ACTION',\n width: props.actionColumnWidth\n })\n }\n handleChildrenColumns(columns)\n return columns\n }\n watch(() => [\n props.columns,\n props.isUseSeq,\n props.isUseAction,\n props.columnsFixedNum,\n props.actionColumnWidth,\n props.cellBackgroundColor,\n props.borderColor\n ], () => {\n myColumns.value = handleColumns(cloneDeep(props.columns as any []))\n }, {\n immediate: true,\n deep: true\n })\n watch(() => [props.data, props.dataType], ([data, dataType]) => {\n if (dataType !== 'static') return\n myDataSource.value = data as { [key:string]:any } []\n }, {\n immediate: true\n })\n const allFilterOptions = ref({})\n const handleFilterCheckboxOptions = (dataSource: { [key:string]: any } []) => {\n if (Array.isArray(dataSource)) {\n const dataLen = dataSource.length\n const keys = filterDataIndexList\n const keysLen = keys.length\n const filterOptionsMap: { [key:string]: Set<string> } = {}\n for (let i = 0; i < dataLen; i++) {\n const record = dataSource[i]\n for (let j = 0; j < keysLen; j++) {\n const key = keys[j]\n if (filterOptionsMap[key]) {\n filterOptionsMap[key].add(record[key])\n } else {\n const set = new Set<string>()\n set.add(record[key])\n filterOptionsMap[key] = set\n }\n }\n }\n const _allFilterOptions: { [key:string]: { label:string, value: string } [] } = {}\n for (const key in filterOptionsMap) {\n if (Object.prototype.hasOwnProperty.call(filterOptionsMap, key)) {\n const optionsSet = filterOptionsMap[key]\n const options = Array.from(optionsSet)\n _allFilterOptions[key] = options.map((option) => ({ label: option, value: option }))\n }\n }\n allFilterOptions.value = _allFilterOptions\n }\n }\n watch(() => [props.isReverse, myColumns.value, myDataSource.value], () => {\n const _columns = unref(myColumns)\n const _dataSource = unref(myDataSource)\n handleFilterCheckboxOptions(_dataSource)\n if (props.isReverse) {\n const { columns, dataSource } = handleReverseTable(cloneDeep(_columns), cloneDeep(_dataSource))\n tableColumns.value = columns\n tableDataSource.value = dataSource\n } else {\n tableColumns.value = _columns\n tableDataSource.value = _dataSource\n }\n }, {\n immediate: true\n })\n const handleReverseTable = (columns: { [key:string]: any} [], dataSource: { [key:string]: any} []) => {\n const firstColumns = columns[0]\n const _columns = [{\n title: firstColumns.title,\n dataIndex: 'col0',\n key: 'col0',\n align: 'center'\n }] as { [key:string]: any } []\n for (let i = 0; i < dataSource.length; i++) {\n const data = dataSource[i]\n const dataIndex = 'col' + (i + 1)\n _columns.push({\n title: data[firstColumns.dataIndex],\n dataIndex,\n key: dataIndex,\n align: 'center'\n })\n }\n const _dataSource = [] as { [key:string]: any } []\n for (let i = 1; i < columns.length; i++) {\n const column = columns[i]\n const _data = { col0: column.title }\n for (let j = 0; j < dataSource.length; j++) {\n const data = dataSource[j]\n _data[`col${j + 1}`] = data[column.dataIndex]\n }\n _dataSource.push(_data)\n }\n return {\n columns: _columns,\n dataSource: _dataSource\n }\n }\n const orderCondition = ref<string>('')\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async (isUseLoading: boolean = true, params: { [key:string]: any } = {}) => {\n try {\n if (isUseLoading) loading.value = true\n // 初始参数:排序\n if (unref(orderCondition)) {\n params.orderCondition = unref(orderCondition)\n }\n // 分页\n if (props.paginationShow) {\n params = {\n pageNum: unref(pageNum),\n pageSize: unref(pageSize),\n layer: '1',\n ...params\n }\n }\n const res = await requestData(params)\n const { rows = [], total: tableTotal = 0 } = res?.data?.data || {}\n total.value = tableTotal\n if (Array.isArray(rows)) {\n myDataSource.value = rows\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const tableChange = ({ current }: { current: number }, _filters, sorter) => {\n pageNum.value = current\n if (sorter && Object.keys(sorter).length > 0) {\n const { field, order } = sorter as { field: string | null, order: 'ascend' | 'descend' }\n const map = {\n ascend: 'asc',\n descend: 'desc'\n }\n const fieldOrder = map[order]\n if (field != null && fieldOrder != null) {\n orderCondition.value = field + ' ' + fieldOrder\n pageNum.value = 1\n }\n }\n refreshData(false)\n }\n const pagination = computed(() => {\n const simple = props.simple\n const position = [props.paginationPosition]\n return props.paginationShow && {\n simple,\n position,\n total: unref(total),\n current: unref(pageNum),\n pageSize: unref(pageSize),\n showSizeChanger: false\n }\n })\n const formatBoolean = (value: string | number) => {\n if (+value === 1) return '是'\n if (+value === 0) return '否'\n return value\n }\n type Format = 'money' | 'percentage' | 'contrast' | 'boolean' | 'progress' | ''\n const formatFn = (value: string | number, format?: Format) => {\n if (format == null || format === '') return value\n const map = {\n money: formatMoney,\n percentage: formatPercentage,\n contrast: formatPercentage,\n boolean: formatBoolean\n }\n return map[format](value) || ''\n }\n const contrastClass = (value: string | number, format: Format) => {\n const _value = parseFloat(value + '')\n if (format !== 'contrast') {\n return ''\n }\n switch (true) {\n case _value >= 0:\n return 'goUp'\n case _value < 0:\n return 'goDown'\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const handleIndicatorDataset = (dataColumns: any [] = [], dataRows: { [key:string]: any }[] = []) => {\n const _columns = dataColumns.map((column: string) => ({ title: column, dataIndex: column, key: column }))\n myColumns.value = handleColumns(_columns)\n myDataSource.value = dataRows\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n handleIndicatorDataset(res?.data?.data?.columns, res?.data?.data?.rows)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const useRowIndex = ref(-1)\n\n const customRow = (record, index) => ({\n onClick: emitEvent('rowClick', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: record })\n useRowIndex.value = index\n })\n })\n\n const refreshData = (isUseLoading: boolean = true) => {\n switch (props.dataType) {\n case 'request':\n handleRequestData(isUseLoading)\n break\n case 'indicator':\n handleIndicatorData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n const summaryList = computed(() => {\n const columns = unref(tableColumns)\n const summaryList = [] as { [key: string]: any } []\n let calcTotalCount = 0\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]\n const { isCalcTotal } = column\n if (props.isUseSeq && i === 0) {\n summaryList.push({\n ...column,\n total: '小计'\n })\n } else if (isCalcTotal) {\n summaryList.push({\n ...column,\n index: i,\n total: 0\n })\n calcTotalCount++\n } else {\n summaryList.push({\n ...column\n })\n }\n }\n // 为空直接返回\n if (calcTotalCount === 0) return []\n const records = unref(tableDataSource)\n for (let i = 0; i < summaryList.length; i++) {\n const summary = summaryList[i]\n let total: number = 0\n const { isCalcTotal, dataIndex } = summary\n if (isCalcTotal === true) {\n for (let j = 0; j < records.length; j++) {\n const record = records[j]\n const num = +record[dataIndex]\n if (!isNaN(num)) {\n total = new Big(total).add(num).toNumber()\n }\n }\n summary.total = total\n }\n }\n return summaryList\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n expose({\n refreshData\n })\n\n const handleHref = (href: string = '', data: { [key:string]: any }) => {\n return useVariablesInText(href, data)\n }\n\n const handleHrefTarget = (target: 'self' | 'blank' | 'event') => {\n if (target === 'event') {\n return undefined\n } else {\n const map = {\n self: '_self',\n blank: '_blank'\n }\n return map[target]\n }\n }\n\n const onTouchHrefEvent = (target: 'self' | 'blank' | 'event', href: string = '') => {\n if (target === 'event') {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n }\n\n const useSetSelectedKeys = (setSelectedKeys, column) => {\n setSelectedKeys(column.filterCheckboxGroupValue)\n }\n\n const onResetFilter = (clearFilters, column) => {\n clearFilters({ confirm: true })\n column.filterOptionsInputValue = ''\n column.filterCheckboxGroupValue = []\n }\n const onSearchFilterOptions = () => {}\n const useFilterOptions = (column) => {\n const key = column.dataIndex\n if (typeof key === 'string') {\n let filterOptions = unref(allFilterOptions)[key]\n const _inputValue = unref(column.filterOptionsInputValue).trim()\n if (Array.isArray(filterOptions)) {\n filterOptions = filterOptions.filter((filterOption) => {\n if (typeof filterOption.label === 'string') {\n return filterOption.label.toLowerCase().includes(_inputValue.toLowerCase())\n }\n return true\n })\n return filterOptions\n }\n return []\n }\n return []\n }\n\n const exportTableData = async () => {\n const key = 'EXPORT_KEY'\n message.loading({\n key,\n content: '正在导出...',\n duration: 0\n })\n let rows = []\n if (props.dataType === 'static') {\n rows = props.data\n } else if (props.dataType === 'request') {\n const params = { layer: '1' } as { [key:string]:any }\n if (unref(orderCondition)) {\n params.orderCondition = unref(orderCondition)\n }\n const res = await requestData(params)\n rows = res?.data?.data?.rows || {}\n }\n const columns = unref(tableColumns)\n const columnKeys = []\n const columnValues = []\n columns?.forEach(column => {\n columnKeys.push(column.dataIndex)\n columnValues.push(column.title)\n })\n const data = rows.map(item => pick(item, columnKeys))\n // 导出excel\n const workBook = utils.book_new()\n const header = utils.aoa_to_sheet([columnValues])\n const sheet = utils.sheet_add_json(header, data, { skipHeader: true, origin: 'A2' })\n\n utils.book_append_sheet(workBook, sheet, 'sheet')\n\n writeFile(workBook, '表格数据.xlsx')\n message.success({ key, content: '导出成功' })\n }\n\n const handleProgressText = (text: string | number, decimalPlaces = 2) => {\n const num = (+text) * 100\n if (isNaN(num) || num <= 0) {\n return 0\n } else if (num >= 100) {\n return 100\n } else {\n return (num).toFixed(decimalPlaces)\n }\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n exportTableData\n })\n\n return {\n x,\n y,\n style,\n customRow,\n pagination,\n formatFn,\n contrastClass,\n tableChange,\n summaryList,\n loading,\n onTouchHrefEvent,\n handleHref,\n handleHrefTarget,\n useRowIndex,\n tableColumns,\n tableDataSource,\n useFilterOptions,\n useSetSelectedKeys,\n onResetFilter,\n onSearchFilterOptions,\n exportTableData,\n handleProgressText\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.table {\n width: 100%;\n}\n\n.table-tool {\n width: 100%;\n display: flex;\n justify-content: flex-end;\n}\n\n.export-button {\n margin-bottom: 8px;\n}\n\n.goUp {\n color: #FF512E;\n display: flex;\n align-items: center;\n justify-content: center;\n &:before {\n content: '';\n display: block;\n background-image: url(\"../../assets/go-up.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n}\n\n.goDown {\n color: #39cf93;\n display: flex;\n align-items: center;\n justify-content: center;\n &:before {\n content: '';\n display: block;\n background-image: url(\"../../assets/go-down.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n}\n\n.action-list {\n display: flex;\n width: 100%;\n}\n.action {\n flex: 1;\n}\n\n.filter-input {\n width: 188px;\n margin-bottom: 8px;\n display: block\n}\n\n.filter-checkbox {\n width: 188px;\n margin-bottom: 8px;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-table-filter {\n padding: 8px;\n display: flex;\n flex-direction: column;\n .ant-checkbox-group {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .ant-checkbox-wrapper {\n width: 100%;\n padding: 5px 0;\n font-size: 16px;\n &:hover {\n background-color: #f5f5f5;\n }\n .ant-checkbox + span {\n width: 100%;\n word-break: break-all;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical\n }\n }\n}\n\n.ecan-table {\n .highlight {\n background: #e6f7ff !important;\n }\n\n .progress-cell {\n width:100%;\n display: flex;\n align-items: center;\n .progress-text {\n position: absolute;\n right: 20px;\n }\n }\n\n *::-webkit-scrollbar {\n //width: 6px;\n //height: 6px;\n }\n\n *::-webkit-scrollbar-thumb {\n border-radius: 3px;\n -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);\n background-color: #c8c9ca !important;\n }\n\n *::-webkit-scrollbar-track {\n background-color: #fff;\n }\n\n .ant-table-cell-scrollbar {\n box-shadow: 0 1px 0 1px transparent;\n }\n\n .ant-table {\n color: rgba(0, 0, 0, .65);\n background: #ffffff;\n }\n\n .ant-table-thead > tr > th {\n color: rgba(0, 0, 0, .85);\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .ant-table-tbody > tr > td {\n border-bottom: 1px solid #f0f0f0;\n }\n\n .ant-table-bordered {\n .ant-table-container {\n border: 1px solid #f0f0f0 !important;\n }\n\n .ant-table-cell {\n border-right: 1px solid #f0f0f0 !important;\n }\n }\n\n .anticon {\n color: #bfbfbf;\n }\n\n}\n\n[datav-theme='darkBlue'] {\n .ecan-table {\n .highlight {\n background: #225b98 !important;\n }\n\n *::-webkit-scrollbar-thumb {\n background-color: #2f4dac !important;\n }\n\n *::-webkit-scrollbar-track {\n background-color: #192c70;\n }\n\n *::-webkit-scrollbar-corner {\n background-color: #192c70 !important;\n }\n .ant-table {\n color: #e8e8e8;\n background: #071655;\n }\n\n .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table,\n .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table {\n border-top: 1px solid #3e8ee3 !important;\n }\n\n .ant-table-thead > tr > th {\n color: #cdd0f7;\n background: #17338c;\n border-bottom: 1px solid #3e8ee3;\n }\n\n .ant-table-tbody > tr > td {\n border-bottom: 1px solid #3e8ee3;\n }\n\n .ant-table-bordered {\n .ant-table-container {\n border: 1px solid #3e8ee3 !important;\n }\n\n .ant-table-cell {\n border-right: 1px solid #3e8ee3 !important;\n }\n }\n\n .ant-pagination-item-link {\n background: #17338c !important;\n }\n\n .ant-pagination-item {\n background: #17338c !important;\n }\n\n .anticon {\n color: rgba(255, 255, 255, .65) !important;\n }\n\n .ant-table-tbody > tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {\n background: #225b98;\n }\n }\n\n td.ant-table-column-sort {\n background: #225b98;\n }\n}\n</style>\n","<template>\n <div class=\"ecan-table\" :style=\"style\">\n <skeleton :loading=\"loading\">\n <div class=\"table-tool\" v-if=\"isUseExport\">\n <a-button class=\"export-button\" @click=\"exportTableData\">导出数据</a-button>\n </div>\n <a-table\n class=\"table\"\n :style=\"{\n height: '100%'\n }\"\n :columns=\"tableColumns\"\n :data-source=\"tableDataSource\"\n :bordered=\"bordered\"\n :size=\"size\"\n :customRow=\"customRow\"\n :scroll=\"{ x, y }\"\n :pagination=\"pagination\"\n @change=\"tableChange\"\n >\n <template #customFilterDropdown=\"{ column, selectedKeys, setSelectedKeys, confirm, clearFilters }\">\n <div\n class=\"ecan-table-filter\"\n :style=\"{\n height: filterDropdownHeight\n }\"\n >\n <a-input\n v-model:value=\"column.filterOptionsInputValue\"\n placeholder=\"请输入关键字\"\n :value=\"selectedKeys[0]\"\n class=\"filter-input\"\n @change=\"onSearchFilterOptions\"\n />\n <a-checkbox-group\n v-model:value=\"column.filterCheckboxGroupValue\"\n class=\"filter-checkbox\"\n :options=\"useFilterOptions(column)\"\n @change=\"useSetSelectedKeys(setSelectedKeys, column)\"\n >\n </a-checkbox-group>\n <div>\n <a-button\n type=\"primary\"\n size=\"small\"\n style=\"width: 90px; margin-right: 8px\"\n @click=\"() => confirm()\"\n >\n 搜索\n </a-button>\n <a-button\n size=\"small\"\n style=\"width: 90px\"\n @click.stop=\"onResetFilter(clearFilters, column)\"\n >\n 重置\n </a-button>\n </div>\n </div>\n </template>\n <template #bodyCell=\"{ column, index, text, record }\">\n <!--序号-->\n <template v-if=\"column.dataIndex === 'SEQ'\">\n <span>{{ index + 1 }}</span>\n </template>\n <!-- 操作列配置 -->\n <template v-else-if=\"column.dataIndex === 'ACTION'\">\n <div class=\"action-list\">\n <div class=\"action\" v-for=\"(action, index) in actionList\" :key=\"index\">\n <a\n :href=\"handleHref(action.href, record)\"\n :target=\"handleHrefTarget(action.target)\"\n :style=\"{\n color: action.color,\n fontSize,\n fontWeight\n }\"\n @click=\"onTouchHrefEvent(action.target, handleHref(action.href, record))\"\n >\n {{ action.title }}\n </a>\n </div>\n </div>\n </template>\n <!--进度条-->\n <template v-else-if=\"column.format === 'progress'\">\n <div class=\"progress-cell\">\n <div\n class=\"progress\"\n :style=\"{\n background: column.progressColor || '#1890ff',\n height: column.progressWidth || '18px',\n width: `${handleProgressText(text, column.progressTextDecimalPlaces)}%`\n }\"\n />\n <div\n class=\"progress-text\"\n :style=\"{\n color: handleProgressText(text) < 100 ? column.progressTextColor || '#333' : column.progressFinishedTextColor || '#fff'\n }\"\n >\n {{handleProgressText(text, column.progressTextDecimalPlaces)}}%\n </div>\n </div>\n </template>\n <template v-else>\n <div\n :class=\"[contrastClass(text, column.format)]\"\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ column.format != null ? formatFn(text, column.format) : text }}\n </div>\n </template>\n </template>\n <template #summary>\n <a-table-summary v-if=\"summaryList.length > 0\">\n <a-table-summary-row>\n <a-table-summary-cell\n v-for=\"(summary, index) in summaryList\"\n :key=\"index\"\n :index=\"index\"\n :style=\"{\n backgroundColor: cellBackgroundColor,\n textAlign: summary.cellAlign || 'center',\n color: summary.cellColor,\n borderBottomColor: borderColor,\n }\"\n >\n <div\n :class=\"[contrastClass(summary.total, summary.format)]\"\n :style=\"{\n fontSize,\n fontWeight\n }\"\n >\n {{ (summary.format != null || summary.format !== '') && formatFn(summary.total, summary.format) }}\n </div>\n </a-table-summary-cell>\n </a-table-summary-row>\n </a-table-summary>\n </template>\n </a-table>\n </skeleton>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, unref, ref, watch, inject, reactive } from 'vue'\nimport {\n Button as AButton,\n Input as AInput,\n CheckboxGroup as ACheckboxGroup,\n Table as ATable,\n TableSummary as ATableSummary,\n TableSummaryRow as ATableSummaryRow,\n TableSummaryCell as ATableSummaryCell,\n message\n} from 'ant-design-vue'\nimport 'ant-design-vue/es/input/style'\nimport 'ant-design-vue/es/checkbox/style'\nimport 'ant-design-vue/es/table/style'\nimport 'ant-design-vue/es/progress/style'\nimport { utils, writeFile } from 'xlsx'\nimport {\n usePickComponentStyle,\n useEmitEvent,\n useRequestData,\n useOnEvent,\n useIndicatorData,\n useVariablesInText\n} from '@/hooks'\nimport { tableComponentProps } from './props'\nimport { formatMoney, formatPercentage } from '@/utils/util'\nimport { GLOBAL_MODEL, REQUEST_MODEL } from '@/utils/constant'\nimport Skeleton from '@/common/skeleton/Skeleton.vue'\nimport { cloneDeep, pick } from 'lodash-es'\nimport { RequestModalParam } from '@/utils/types'\nimport { Big } from 'big.js'\nexport default defineComponent({\n name: 'EcanTable',\n components: {\n Skeleton,\n AButton,\n AInput,\n ACheckboxGroup,\n ATable,\n ATableSummary,\n ATableSummaryRow,\n ATableSummaryCell\n },\n props: {\n ...tableComponentProps\n },\n setup (props, { expose }) {\n const style = usePickComponentStyle(props)\n const splitY = computed(() => {\n if (props.paginationShow) {\n switch (props.size) {\n case 'small':\n return 90\n case 'middle':\n return 100\n default:\n return 120\n }\n } else {\n switch (props.size) {\n case 'small':\n return 40\n case 'middle':\n return 47\n default:\n return 55\n }\n }\n })\n const x = computed(() => props.scrollX)\n const y = computed(() => parseFloat(props.height as string) - unref(splitY))\n const myColumns = ref<{ [key: string]: any } []>([])\n const myDataSource = ref<{ [key: string]: any } []>([])\n const tableColumns = ref<{ [key: string]: any } []>([])\n const tableDataSource = ref<{ [key: string]: any } []>([])\n const total = ref(0)\n const pageNum = ref(1)\n const pageSize = computed(() => props.paginationPageSize as number)\n const filterDataIndexList = reactive([])\n const handleChildrenColumns = (_columns: { [key: string]: any } [] = []) => {\n if (Array.isArray(_columns) && _columns.length > 0) {\n const len = _columns.length\n const columnsFixedNum = props.columnsFixedNum as number\n // 这里的循环为了 props 是引用类型,会造成脏数据(上次修改后,还会存在上次的数据)\n // 如果使用深拷贝会造成性能的浪费,循环来说相对更快\n for (let i = 0; i < len; i++) {\n const column = _columns[i]\n if (i < columnsFixedNum) {\n column.fixed = 'left'\n } else {\n column.fixed = false\n }\n const {\n cellAlign = 'center',\n cellColor,\n dataIndex,\n title,\n tableFilter,\n headerCellAlign,\n headerCellColor\n } = column\n if (tableFilter) {\n filterDataIndexList.push(dataIndex)\n column.filterOptionsInputValue = ''\n column.filterCheckboxGroupValue = []\n column.customFilterDropdown = true\n column.onFilter = (value, record) => record[dataIndex].toString().toLowerCase().includes(value.toLowerCase())\n }\n // 通用配置\n // 头部单元格\n column.customHeaderCell = () => ({\n style: {\n display: 'table-cell',\n verticalAlign: 'middle',\n fontSize: props.headerFontSize,\n fontWeight: props.headerFontWeight,\n textAlign: headerCellAlign || 'center',\n color: headerCellColor,\n borderBottomColor: props.borderColor\n }\n })\n // 表格单元格\n column.customCell = (record, rowIndex) => ({\n style: {\n textAlign: cellAlign,\n color: cellColor,\n backgroundColor: props.cellBackgroundColor,\n borderBottomColor: props.borderColor\n },\n class: {\n highlight: unref(useRowIndex) === rowIndex && props.clickHighlight\n },\n onClick: emitEvent('click', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n record = {\n dataIndex,\n title,\n ...record\n }\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: record })\n })\n })\n if (Array.isArray(column.children)) {\n handleChildrenColumns(column.children)\n }\n }\n }\n }\n const handleColumns = (columns: { [key: string]: any } [] = []) => {\n // 复制表头数据\n if (props.isUseSeq) {\n // 添加序号\n columns.unshift({\n title: '序号',\n dataIndex: 'SEQ',\n align: 'center'\n })\n }\n // 添加操作列\n if (props.isUseAction) {\n columns.push({\n title: '操作',\n dataIndex: 'ACTION',\n width: props.actionColumnWidth\n })\n }\n handleChildrenColumns(columns)\n return columns\n }\n watch(() => [\n props.columns,\n props.isUseSeq,\n props.isUseAction,\n props.columnsFixedNum,\n props.actionColumnWidth,\n props.cellBackgroundColor,\n props.borderColor\n ], () => {\n myColumns.value = handleColumns(cloneDeep(props.columns as any []))\n }, {\n immediate: true,\n deep: true\n })\n watch(() => [props.data, props.dataType], ([data, dataType]) => {\n if (dataType !== 'static') return\n myDataSource.value = data as { [key:string]:any } []\n }, {\n immediate: true\n })\n const allFilterOptions = ref({})\n const handleFilterCheckboxOptions = (dataSource: { [key:string]: any } []) => {\n if (Array.isArray(dataSource)) {\n const dataLen = dataSource.length\n const keys = filterDataIndexList\n const keysLen = keys.length\n const filterOptionsMap: { [key:string]: Set<string> } = {}\n for (let i = 0; i < dataLen; i++) {\n const record = dataSource[i]\n for (let j = 0; j < keysLen; j++) {\n const key = keys[j]\n if (filterOptionsMap[key]) {\n filterOptionsMap[key].add(record[key])\n } else {\n const set = new Set<string>()\n set.add(record[key])\n filterOptionsMap[key] = set\n }\n }\n }\n const _allFilterOptions: { [key:string]: { label:string, value: string } [] } = {}\n for (const key in filterOptionsMap) {\n if (Object.prototype.hasOwnProperty.call(filterOptionsMap, key)) {\n const optionsSet = filterOptionsMap[key]\n const options = Array.from(optionsSet)\n _allFilterOptions[key] = options.map((option) => ({ label: option, value: option }))\n }\n }\n allFilterOptions.value = _allFilterOptions\n }\n }\n watch(() => [props.isReverse, myColumns.value, myDataSource.value], () => {\n const _columns = unref(myColumns)\n const _dataSource = unref(myDataSource)\n handleFilterCheckboxOptions(_dataSource)\n if (props.isReverse) {\n const { columns, dataSource } = handleReverseTable(cloneDeep(_columns), cloneDeep(_dataSource))\n tableColumns.value = columns\n tableDataSource.value = dataSource\n } else {\n tableColumns.value = _columns\n tableDataSource.value = _dataSource\n }\n }, {\n immediate: true\n })\n const handleReverseTable = (columns: { [key:string]: any} [], dataSource: { [key:string]: any} []) => {\n const firstColumns = columns[0]\n const _columns = [{\n title: firstColumns.title,\n dataIndex: 'col0',\n key: 'col0',\n align: 'center'\n }] as { [key:string]: any } []\n for (let i = 0; i < dataSource.length; i++) {\n const data = dataSource[i]\n const dataIndex = 'col' + (i + 1)\n _columns.push({\n title: data[firstColumns.dataIndex],\n dataIndex,\n key: dataIndex,\n align: 'center'\n })\n }\n const _dataSource = [] as { [key:string]: any } []\n for (let i = 1; i < columns.length; i++) {\n const column = columns[i]\n const _data = { col0: column.title }\n for (let j = 0; j < dataSource.length; j++) {\n const data = dataSource[j]\n _data[`col${j + 1}`] = data[column.dataIndex]\n }\n _dataSource.push(_data)\n }\n return {\n columns: _columns,\n dataSource: _dataSource\n }\n }\n const orderCondition = ref<string>('')\n const requestData = useRequestData(props)\n const loading = ref(false)\n const handleRequestData = async (isUseLoading: boolean = true, params: { [key:string]: any } = {}) => {\n try {\n if (isUseLoading) loading.value = true\n // 初始参数:排序\n if (unref(orderCondition)) {\n params.orderCondition = unref(orderCondition)\n }\n // 分页\n if (props.paginationShow) {\n params = {\n pageNum: unref(pageNum),\n pageSize: unref(pageSize),\n layer: '1',\n ...params\n }\n }\n const res = await requestData(params)\n const { rows = [], total: tableTotal = 0 } = res?.data?.data || {}\n total.value = tableTotal\n if (Array.isArray(rows)) {\n myDataSource.value = rows\n }\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const tableChange = ({ current }: { current: number }, _filters, sorter) => {\n pageNum.value = current\n if (sorter && Object.keys(sorter).length > 0) {\n const { field, order } = sorter as { field: string | null, order: 'ascend' | 'descend' }\n const map = {\n ascend: 'asc',\n descend: 'desc'\n }\n const fieldOrder = map[order]\n if (field != null && fieldOrder != null) {\n orderCondition.value = field + ' ' + fieldOrder\n pageNum.value = 1\n }\n }\n refreshData(false)\n }\n const pagination = computed(() => {\n const simple = props.simple\n const position = [props.paginationPosition]\n return props.paginationShow && {\n simple,\n position,\n total: unref(total),\n current: unref(pageNum),\n pageSize: unref(pageSize),\n showSizeChanger: false\n }\n })\n const formatBoolean = (value: string | number) => {\n if (+value === 1) return '是'\n if (+value === 0) return '否'\n return value\n }\n type Format = 'money' | 'percentage' | 'contrast' | 'boolean' | 'progress' | ''\n const formatFn = (value: string | number, format?: Format) => {\n if (format == null || format === '') return value\n const map = {\n money: formatMoney,\n percentage: formatPercentage,\n contrast: formatPercentage,\n boolean: formatBoolean\n }\n return map[format](value) || ''\n }\n const contrastClass = (value: string | number, format: Format) => {\n const _value = parseFloat(value + '')\n if (format !== 'contrast') {\n return ''\n }\n switch (true) {\n case _value >= 0:\n return 'goUp'\n case _value < 0:\n return 'goDown'\n }\n }\n\n const emitEvent = useEmitEvent(props)\n\n const { getGlobalModel, setGlobalModel } = inject(GLOBAL_MODEL, {\n // @ts-ignore\n // eslint-disable-next-line no-void\n getGlobalModel: (key: string) => void 0,\n // @ts-ignore\n // eslint-disable-next-line no-void\n setGlobalModel: (key: string, value: any) => void 0\n })\n\n const handleIndicatorDataset = (dataColumns: any [] = [], dataRows: { [key:string]: any }[] = []) => {\n const _columns = dataColumns.map((column: string) => ({ title: column, dataIndex: column, key: column }))\n myColumns.value = handleColumns(_columns)\n myDataSource.value = dataRows\n }\n\n // 指标库\n const indicatorData = useIndicatorData(props)\n const handleIndicatorData = async () => {\n try {\n loading.value = true\n const res = await indicatorData()\n handleIndicatorDataset(res?.data?.data?.columns, res?.data?.data?.rows)\n } catch (e) {\n console.error(e)\n } finally {\n loading.value = false\n }\n }\n const useRowIndex = ref(-1)\n\n const customRow = (record, index) => ({\n onClick: emitEvent('rowClick', () => {\n const id = props.id\n const modal = getGlobalModel(id)\n // 约定获取数据\n setGlobalModel(id, { ...modal, RECORD: record })\n useRowIndex.value = index\n })\n })\n\n const refreshData = (isUseLoading: boolean = true) => {\n switch (props.dataType) {\n case 'request':\n handleRequestData(isUseLoading)\n break\n case 'indicator':\n handleIndicatorData()\n break\n }\n }\n\n const resetRecord = () => {\n const id = props.id\n const modal = getGlobalModel(id)\n setGlobalModel(id, { ...modal, RECORD: '' })\n }\n\n const summaryList = computed(() => {\n const columns = unref(tableColumns)\n const summaryList = [] as { [key: string]: any } []\n let calcTotalCount = 0\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i]\n const { isCalcTotal } = column\n if (props.isUseSeq && i === 0) {\n summaryList.push({\n ...column,\n total: '小计'\n })\n } else if (isCalcTotal) {\n summaryList.push({\n ...column,\n index: i,\n total: 0\n })\n calcTotalCount++\n } else {\n summaryList.push({\n ...column\n })\n }\n }\n // 为空直接返回\n if (calcTotalCount === 0) return []\n const records = unref(tableDataSource)\n for (let i = 0; i < summaryList.length; i++) {\n const summary = summaryList[i]\n let total: number = 0\n const { isCalcTotal, dataIndex } = summary\n if (isCalcTotal === true) {\n for (let j = 0; j < records.length; j++) {\n const record = records[j]\n const num = +record[dataIndex]\n if (!isNaN(num)) {\n total = new Big(total).add(num).toNumber()\n }\n }\n summary.total = total\n }\n }\n return summaryList\n })\n\n const { setRequest } = inject(REQUEST_MODEL, {\n setRequest: (_requestModalParam: RequestModalParam) => {}\n })\n\n if (typeof setRequest === 'function') {\n setRequest({\n id: props.id,\n requestFn: refreshData,\n sortNum: props.requestSort\n })\n }\n\n expose({\n refreshData\n })\n\n const handleHref = (href: string = '', data: { [key:string]: any }) => {\n return useVariablesInText(href, data)\n }\n\n const handleHrefTarget = (target: 'self' | 'blank' | 'event') => {\n if (target === 'event') {\n return undefined\n } else {\n const map = {\n self: '_self',\n blank: '_blank'\n }\n return map[target]\n }\n }\n\n const onTouchHrefEvent = (target: 'self' | 'blank' | 'event', href: string = '') => {\n if (target === 'event') {\n window.parent.postMessage({\n type: 'openPage',\n url: href\n }, '*')\n }\n }\n\n const useSetSelectedKeys = (setSelectedKeys, column) => {\n setSelectedKeys(column.filterCheckboxGroupValue)\n }\n\n const onResetFilter = (clearFilters, column) => {\n clearFilters({ confirm: true })\n column.filterOptionsInputValue = ''\n column.filterCheckboxGroupValue = []\n }\n const onSearchFilterOptions = () => {}\n const useFilterOptions = (column) => {\n const key = column.dataIndex\n if (typeof key === 'string') {\n let filterOptions = unref(allFilterOptions)[key]\n const _inputValue = unref(column.filterOptionsInputValue).trim()\n if (Array.isArray(filterOptions)) {\n filterOptions = filterOptions.filter((filterOption) => {\n if (typeof filterOption.label === 'string') {\n return filterOption.label.toLowerCase().includes(_inputValue.toLowerCase())\n }\n return true\n })\n return filterOptions\n }\n return []\n }\n return []\n }\n\n const exportTableData = async () => {\n const key = 'EXPORT_KEY'\n message.loading({\n key,\n content: '正在导出...',\n duration: 0\n })\n let rows = []\n if (props.dataType === 'static') {\n rows = props.data\n } else if (props.dataType === 'request') {\n const params = { layer: '1' } as { [key:string]:any }\n if (unref(orderCondition)) {\n params.orderCondition = unref(orderCondition)\n }\n const res = await requestData(params)\n rows = res?.data?.data?.rows || {}\n }\n const columns = unref(tableColumns)\n const columnKeys = []\n const columnValues = []\n columns?.forEach(column => {\n columnKeys.push(column.dataIndex)\n columnValues.push(column.title)\n })\n const data = rows.map(item => pick(item, columnKeys))\n // 导出excel\n const workBook = utils.book_new()\n const header = utils.aoa_to_sheet([columnValues])\n const sheet = utils.sheet_add_json(header, data, { skipHeader: true, origin: 'A2' })\n\n utils.book_append_sheet(workBook, sheet, 'sheet')\n\n writeFile(workBook, '表格数据.xlsx')\n message.success({ key, content: '导出成功' })\n }\n\n const handleProgressText = (text: string | number, decimalPlaces = 2) => {\n const num = (+text) * 100\n if (isNaN(num) || num <= 0) {\n return 0\n } else if (num >= 100) {\n return 100\n } else {\n return (num).toFixed(decimalPlaces)\n }\n }\n\n useOnEvent(props, {\n resetRecord,\n refreshData,\n exportTableData\n })\n\n return {\n x,\n y,\n style,\n customRow,\n pagination,\n formatFn,\n contrastClass,\n tableChange,\n summaryList,\n loading,\n onTouchHrefEvent,\n handleHref,\n handleHrefTarget,\n useRowIndex,\n tableColumns,\n tableDataSource,\n useFilterOptions,\n useSetSelectedKeys,\n onResetFilter,\n onSearchFilterOptions,\n exportTableData,\n handleProgressText\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.table {\n width: 100%;\n}\n\n.table-tool {\n width: 100%;\n display: flex;\n justify-content: flex-end;\n}\n\n.export-button {\n margin-bottom: 8px;\n}\n\n.goUp {\n color: #FF512E;\n display: flex;\n align-items: center;\n justify-content: center;\n &:before {\n content: '';\n display: block;\n background-image: url(\"../../assets/go-up.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n}\n\n.goDown {\n color: #39cf93;\n display: flex;\n align-items: center;\n justify-content: center;\n &:before {\n content: '';\n display: block;\n background-image: url(\"../../assets/go-down.png\");\n width: 12px;\n height: 12px;\n background-repeat: no-repeat;\n background-size: cover;\n margin-right: 2px;\n }\n}\n\n.action-list {\n display: flex;\n width: 100%;\n}\n.action {\n flex: 1;\n}\n\n.filter-input {\n width: 188px;\n margin-bottom: 8px;\n display: block\n}\n\n.filter-checkbox {\n width: 188px;\n margin-bottom: 8px;\n}\n</style>\n\n<style lang=\"less\">\n.ecan-table-filter {\n padding: 8px;\n display: flex;\n flex-direction: column;\n .ant-checkbox-group {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .ant-checkbox-wrapper {\n width: 100%;\n padding: 5px 0;\n font-size: 16px;\n &:hover {\n background-color: #f5f5f5;\n }\n .ant-checkbox + span {\n width: 100%;\n word-break: break-all;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical\n }\n }\n}\n\n.ecan-table {\n .highlight {\n background: #e6f7ff !important;\n }\n\n .progress-cell {\n width:100%;\n display: flex;\n align-items: center;\n .progress-text {\n position: absolute;\n right: 20px;\n }\n }\n\n *::-webkit-scrollbar {\n //width: 6px;\n //height: 6px;\n }\n\n *::-webkit-scrollbar-thumb {\n border-radius: 3px;\n -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);\n background-color: #c8c9ca !important;\n }\n\n *::-webkit-scrollbar-track {\n background-color: #fff;\n }\n\n .ant-table-cell-scrollbar {\n box-shadow: 0 1px 0 1px transparent;\n }\n\n .ant-table {\n color: rgba(0, 0, 0, .65);\n background: #ffffff;\n }\n\n .ant-table-thead > tr > th {\n color: rgba(0, 0, 0, .85);\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n }\n\n .ant-table-tbody > tr > td {\n border-bottom: 1px solid #f0f0f0;\n }\n\n .ant-table-bordered {\n .ant-table-container {\n border: 1px solid #f0f0f0 !important;\n }\n\n .ant-table-cell {\n border-right: 1px solid #f0f0f0 !important;\n }\n }\n\n .anticon {\n color: #bfbfbf;\n }\n\n}\n\n[datav-theme='darkBlue'] {\n .ecan-table {\n .highlight {\n background: #225b98 !important;\n }\n\n *::-webkit-scrollbar-thumb {\n background-color: #2f4dac !important;\n }\n\n *::-webkit-scrollbar-track {\n background-color: #192c70;\n }\n\n *::-webkit-scrollbar-corner {\n background-color: #192c70 !important;\n }\n .ant-table {\n color: #e8e8e8;\n background: #071655;\n }\n\n .ant-table.ant-table-bordered > .ant-table-container > .ant-table-content > table,\n .ant-table.ant-table-bordered > .ant-table-container > .ant-table-header > table {\n border-top: 1px solid #3e8ee3 !important;\n }\n\n .ant-table-thead > tr > th {\n color: #cdd0f7;\n background: #17338c;\n border-bottom: 1px solid #3e8ee3;\n }\n\n .ant-table-tbody > tr > td {\n border-bottom: 1px solid #3e8ee3;\n }\n\n .ant-table-bordered {\n .ant-table-container {\n border: 1px solid #3e8ee3 !important;\n }\n\n .ant-table-cell {\n border-right: 1px solid #3e8ee3 !important;\n }\n }\n\n .ant-pagination-item-link {\n background: #17338c !important;\n }\n\n .ant-pagination-item {\n background: #17338c !important;\n }\n\n .anticon {\n color: rgba(255, 255, 255, .65) !important;\n }\n\n .ant-table-tbody > tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected) > td {\n background: #225b98;\n }\n }\n\n td.ant-table-column-sort {\n background: #225b98;\n }\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Table from './Table.vue'\nexport const EcanTable = withInstall(Table)\nexport default EcanTable\nexport * from './props'\n","import {\n Props,\n props,\n transformToComponentProps\n} from '@/utils/props'\n\nexport interface MapProps extends Props {\n mapJson: { name: string, value: string, path: string } | null,\n data: { [key:string]: any } []\n backgroundImage: string\n backgroundImageRepeat: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat',\n symbolImage: string // 图标\n symbolWidth: number\n symbolHeight: number\n geoZoom: number\n geoRoam: boolean\n geoCenter: string\n geoBackgroundImage: string\n geoBackgroundImageRepeat: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat'\n geoLabelShow: boolean\n geoLabelColor: string\n geoLabelFontSize: number\n geoItemStyleAreaColor: string\n geoItemStyleBorderColor: string\n geoItemStyleBorderWidth: number\n geoItemStyleShadowColor: string\n geoItemStyleShadowOffsetX: number\n geoItemStyleShadowOffsetY: number\n geoItemStyleShadowBlur: number\n geoEmphasisDisabled: boolean\n geoEmphasisLabelColor: string\n geoEmphasisItemStyleAreaColor: string\n geoEmphasisItemStyleBorderColor: string\n itemStyleColor: string\n labelFontSize: number\n labelFormatter: string\n labelShow: boolean\n labelColor: string\n tooltipShow: boolean\n tooltipTextStyleColor: string\n tooltipFormatter: string\n}\n\nexport const mapProps: MapProps = {\n ...props,\n mapJson: null,\n data: [],\n name: '地图',\n keyName: '地图',\n type: 'ecanMap',\n width: '400px',\n height: '400px',\n backgroundImage: '',\n backgroundImageRepeat: 'no-repeat',\n geoBackgroundImage: '',\n geoBackgroundImageRepeat: 'no-repeat',\n symbolImage: '',\n symbolWidth: 10,\n symbolHeight: 10,\n itemStyleColor: '#11BFDA',\n labelFontSize: 14,\n labelShow: true,\n geoLabelShow: true,\n geoLabelColor: '#000',\n geoZoom: 1,\n geoRoam: false,\n geoCenter: '',\n geoLabelFontSize: 12,\n labelColor: '',\n labelFormatter: '{b}',\n geoItemStyleAreaColor: '#eee',\n geoItemStyleBorderColor: '#000',\n geoItemStyleBorderWidth: 1,\n geoItemStyleShadowColor: '',\n geoItemStyleShadowOffsetX: 0,\n geoItemStyleShadowOffsetY: 0,\n geoItemStyleShadowBlur: 0,\n geoEmphasisDisabled: false,\n geoEmphasisLabelColor: '#fff',\n geoEmphasisItemStyleAreaColor: '#f00',\n geoEmphasisItemStyleBorderColor: '#000',\n tooltipShow: true,\n tooltipTextStyleColor: '',\n tooltipFormatter: '{b}'\n}\n\nexport const mapComponentProps = transformToComponentProps(mapProps)\n","<template>\n <div class=\"ecan-map\" :style=\"style\">\n <echarts\n v-if=\"isLoadedData\"\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n <img\n ref=\"geoBackgroundImageRef\"\n v-show=\"false\"\n :src=\"myGeoBackgroundImage\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, watch, ref, unref } from 'vue'\nimport { mapComponentProps } from './props'\nimport Echarts from '@/common/echarts'\nimport { use, registerMap } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { MapChart, ScatterChart } from 'echarts/charts'\nimport { VisualMapComponent, TooltipComponent, GraphicComponent } from 'echarts/components'\nimport request from '@/utils/request'\nimport { usePickComponentStyle, useImagePath } from '../../hooks'\nuse([\n CanvasRenderer,\n MapChart,\n ScatterChart,\n VisualMapComponent,\n TooltipComponent,\n GraphicComponent\n])\nexport default defineComponent({\n name: 'EcanMap',\n components: {\n Echarts\n },\n props: {\n ...mapComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props, ['backgroundImage'])\n const geoBackgroundImageRef = ref()\n const myGeoBackgroundImage = computed(() => useImagePath(props.geoBackgroundImage))\n const myBackgroundImage = computed(() => useImagePath(props.backgroundImage))\n const areaColor = computed(() => {\n const backgroundImage = props.geoBackgroundImage\n if (backgroundImage) {\n return {\n image: unref(geoBackgroundImageRef),\n repeat: props.geoBackgroundImageRepeat\n }\n }\n return props.geoItemStyleAreaColor\n })\n const symbol = computed(() => {\n const symbolImage = props.symbolImage\n if (props.symbolImage) {\n return 'image://' + useImagePath(symbolImage)\n }\n return 'circle'\n })\n const option = computed(() => {\n const geoCenter = props.geoCenter\n let center: undefined | Array<any>\n if (typeof geoCenter === 'string' && geoCenter !== '') {\n center = geoCenter.split(',')\n }\n return {\n // backgroundColor: unref(background),\n tooltip: {\n show: true\n },\n graphic: [\n { // 一个图形元素,类型是 image。\n type: 'image',\n style: {\n width: parseFloat(props.width),\n height: parseFloat(props.height),\n image: unref(myBackgroundImage)\n },\n top: 'center'\n }\n ],\n geo: {\n zoom: props.geoZoom,\n roam: props.geoRoam,\n center,\n map: 'map',\n tooltip: {\n show: false\n },\n label: { // 地图上显示文字属性\n show: props.geoLabelShow,\n color: props.geoLabelColor,\n fontSize: props.geoLabelFontSize\n },\n itemStyle: { // 地图上板块属性\n areaColor: unref(areaColor),\n borderColor: props.geoItemStyleBorderColor,\n borderWidth: props.geoItemStyleBorderWidth,\n shadowColor: props.geoItemStyleShadowColor,\n shadowBlur: props.geoItemStyleShadowBlur,\n shadowOffsetX: props.geoItemStyleShadowOffsetX,\n shadowOffsetY: props.geoItemStyleShadowOffsetY\n },\n emphasis: { // 当鼠标悬停的时候\n disabled: props.geoEmphasisDisabled,\n label: {\n color: props.geoEmphasisLabelColor\n },\n itemStyle: {\n areaColor: props.geoEmphasisItemStyleAreaColor,\n borderColor: props.geoEmphasisItemStyleBorderColor\n }\n }\n },\n series: [\n {\n type: 'scatter',\n coordinateSystem: 'geo',\n itemStyle: {\n color: props.itemStyleColor\n },\n symbol: unref(symbol),\n symbolSize: [props.symbolWidth, props.symbolHeight],\n label: {\n show: props.labelShow,\n fontSize: props.labelFontSize,\n formatter: props.labelFormatter,\n color: props.labelColor\n },\n tooltip: {\n show: props.tooltipShow,\n formatter: props.tooltipFormatter,\n textStyle: {\n color: props.tooltipTextStyleColor\n }\n },\n data: props.data\n }\n ]\n }\n })\n // const echarts = ref()\n const isLoadedData = ref(false)\n const handleRegisterMap = async () => {\n const mapJson = props.mapJson\n if (mapJson != null && mapJson.path) {\n // @ts-ignore\n const res = await request(window?.config?.uploadPath + mapJson.path)\n registerMap('map', (res?.data || {}) as any)\n }\n isLoadedData.value = true\n }\n watch(() => props.mapJson, () => {\n handleRegisterMap()\n }, {\n immediate: true,\n deep: true\n })\n return {\n option,\n style,\n isLoadedData,\n geoBackgroundImageRef,\n myGeoBackgroundImage\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-map {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n</style>\n","<template>\n <div class=\"ecan-map\" :style=\"style\">\n <echarts\n v-if=\"isLoadedData\"\n :option=\"option\"\n :update-options=\"{ notMerge: true }\"\n autoresize\n />\n <img\n ref=\"geoBackgroundImageRef\"\n v-show=\"false\"\n :src=\"myGeoBackgroundImage\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, watch, ref, unref } from 'vue'\nimport { mapComponentProps } from './props'\nimport Echarts from '@/common/echarts'\nimport { use, registerMap } from 'echarts/core'\nimport { CanvasRenderer } from 'echarts/renderers'\nimport { MapChart, ScatterChart } from 'echarts/charts'\nimport { VisualMapComponent, TooltipComponent, GraphicComponent } from 'echarts/components'\nimport request from '@/utils/request'\nimport { usePickComponentStyle, useImagePath } from '../../hooks'\nuse([\n CanvasRenderer,\n MapChart,\n ScatterChart,\n VisualMapComponent,\n TooltipComponent,\n GraphicComponent\n])\nexport default defineComponent({\n name: 'EcanMap',\n components: {\n Echarts\n },\n props: {\n ...mapComponentProps\n },\n setup (props) {\n const style = usePickComponentStyle(props, ['backgroundImage'])\n const geoBackgroundImageRef = ref()\n const myGeoBackgroundImage = computed(() => useImagePath(props.geoBackgroundImage))\n const myBackgroundImage = computed(() => useImagePath(props.backgroundImage))\n const areaColor = computed(() => {\n const backgroundImage = props.geoBackgroundImage\n if (backgroundImage) {\n return {\n image: unref(geoBackgroundImageRef),\n repeat: props.geoBackgroundImageRepeat\n }\n }\n return props.geoItemStyleAreaColor\n })\n const symbol = computed(() => {\n const symbolImage = props.symbolImage\n if (props.symbolImage) {\n return 'image://' + useImagePath(symbolImage)\n }\n return 'circle'\n })\n const option = computed(() => {\n const geoCenter = props.geoCenter\n let center: undefined | Array<any>\n if (typeof geoCenter === 'string' && geoCenter !== '') {\n center = geoCenter.split(',')\n }\n return {\n // backgroundColor: unref(background),\n tooltip: {\n show: true\n },\n graphic: [\n { // 一个图形元素,类型是 image。\n type: 'image',\n style: {\n width: parseFloat(props.width),\n height: parseFloat(props.height),\n image: unref(myBackgroundImage)\n },\n top: 'center'\n }\n ],\n geo: {\n zoom: props.geoZoom,\n roam: props.geoRoam,\n center,\n map: 'map',\n tooltip: {\n show: false\n },\n label: { // 地图上显示文字属性\n show: props.geoLabelShow,\n color: props.geoLabelColor,\n fontSize: props.geoLabelFontSize\n },\n itemStyle: { // 地图上板块属性\n areaColor: unref(areaColor),\n borderColor: props.geoItemStyleBorderColor,\n borderWidth: props.geoItemStyleBorderWidth,\n shadowColor: props.geoItemStyleShadowColor,\n shadowBlur: props.geoItemStyleShadowBlur,\n shadowOffsetX: props.geoItemStyleShadowOffsetX,\n shadowOffsetY: props.geoItemStyleShadowOffsetY\n },\n emphasis: { // 当鼠标悬停的时候\n disabled: props.geoEmphasisDisabled,\n label: {\n color: props.geoEmphasisLabelColor\n },\n itemStyle: {\n areaColor: props.geoEmphasisItemStyleAreaColor,\n borderColor: props.geoEmphasisItemStyleBorderColor\n }\n }\n },\n series: [\n {\n type: 'scatter',\n coordinateSystem: 'geo',\n itemStyle: {\n color: props.itemStyleColor\n },\n symbol: unref(symbol),\n symbolSize: [props.symbolWidth, props.symbolHeight],\n label: {\n show: props.labelShow,\n fontSize: props.labelFontSize,\n formatter: props.labelFormatter,\n color: props.labelColor\n },\n tooltip: {\n show: props.tooltipShow,\n formatter: props.tooltipFormatter,\n textStyle: {\n color: props.tooltipTextStyleColor\n }\n },\n data: props.data\n }\n ]\n }\n })\n // const echarts = ref()\n const isLoadedData = ref(false)\n const handleRegisterMap = async () => {\n const mapJson = props.mapJson\n if (mapJson != null && mapJson.path) {\n // @ts-ignore\n const res = await request(window?.config?.uploadPath + mapJson.path)\n registerMap('map', (res?.data || {}) as any)\n }\n isLoadedData.value = true\n }\n watch(() => props.mapJson, () => {\n handleRegisterMap()\n }, {\n immediate: true,\n deep: true\n })\n return {\n option,\n style,\n isLoadedData,\n geoBackgroundImageRef,\n myGeoBackgroundImage\n }\n }\n})\n</script>\n\n<style scoped lang=\"less\">\n.ecan-map {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n</style>\n","import { withInstall } from '@/utils/withInstall'\nimport Map from './Map.vue'\nexport const EcanMap = withInstall(Map)\nexport default EcanMap\nexport * from './props'\n","import { App } from 'vue'\nimport * as components from './components'\nconst install = (app: App) => {\n Object.keys(components).forEach(key => {\n const component = components[key]\n if (component.install) {\n app.use(component)\n }\n })\n}\n\n// 部分导出\nexport * from './components'\n// 全局安装\nexport default {\n install\n}\n"],"names":["METHOD_NAMES","usePublicAPI","chart","init","makePublicMethod","name","args","makePublicMethods","methods","useAutoresize","autoresize","root","resizeListener","watch","_","cleanup","throttle","addListener","removeListener","autoresizeProps","LOADING_OPTIONS_KEY","useLoading","loading","loadingOptions","defaultLoadingOptions","inject","realLoadingOptions","computed","unref","watchEffect","instance","loadingProps","onRE","isOn","key","omitOn","attrs","result","TAG_NAME","THEME_KEY","INIT_OPTIONS_KEY","UPDATE_OPTIONS_KEY","Echarts","defineComponent","props","listeners","shallowRef","manualOption","defaultTheme","defaultInitOptions","defaultUpdateOptions","manualUpdate","toRefs","realOption","realTheme","realInitOptions","realUpdateOptions","nonEventAttrs","option","initChart","realListeners","event","handler","resize","e","commit","nextTick","setOption","updateOptions","unwatchOption","publicApi","onMounted","onUnmounted","h","bound01","n","max","isOnePointZero","isPercent","isPercentage","boundAlpha","a","convertToPercentage","pad2","c","rgbToRgb","r","g","b","hue2rgb","p","q","t","hslToRgb","s","l","rgbToHsv","min","v","d","hsvToRgb","i","f","mod","rgbToHex","allow3Char","hex","convertHexToDecimal","parseIntFromHex","val","names","inputToRGB","color","rgb","ok","format","stringInputToObject","isValidCSSUnit","CSS_INTEGER","CSS_NUMBER","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","matchers","named","match","hueStep","saturationStep","saturationStep2","brightnessStep1","brightnessStep2","lightColorCount","darkColorCount","darkColorMap","toHsv","_ref","hsv","toHex","_ref2","mix","rgb1","rgb2","amount","getHue","light","hue","getSaturation","saturation","getValue","value","generate","opts","patterns","pColor","colorString","_i","_hsv","_colorString","_ref3","index","opacity","darkColorString","presetPrimaryColors","presetPalettes","presetDarkPalettes","containers","styleElements","usage","createStyleElement","styleElement","insertCss","css","options","position","container","containerId","_objectSpread","target","source","ownKeys","sym","_defineProperty","obj","warn","valid","message","warning","isIconDefinition","node","rootProps","child","getSecondaryColor","primaryColor","generateColor","normalizeTwoToneColors","twoToneColor","iconStyles","cssInjectedFlag","useInsertStyles","styleStr","_excluded","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","sourceSymbolKeys","sourceKeys","twoToneColorPalette","setTwoToneColors","secondaryColor","getTwoToneColors","IconBase","context","_props$context$attrs","icon","restProps","colors","VueIcon","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","o","minLen","_arrayLikeToArray","len","arr2","_arr","_n","_d","_s","_e","err","setTwoToneColor","_normalizeTwoToneColo","_normalizeTwoToneColo2","getTwoToneColor","Icon","_classObj","cls","spin","rotate","tabindex","onClick","classObj","svgClassString","iconTabIndex","svgStyle","_createVNode","AntdIcon","CloseOutlined","CloseOutlinedSvg","CloseOutlined$1","LoadingOutlined","LoadingOutlinedSvg","LoadingOutlined$1","_sfc_main$s","ASpin","_component_a_spin","_resolveComponent","_createElementBlock","_hoisted_1","_ctx","_openBlock","_createBlock","_renderSlot","_sfc_main$r","ASkeleton","_component_a_skeleton","withInstall","main","extra","app","comp","transformToComponentProps","componentProps","prop","pageConfig","pageConfigComponentProps","styleList","usePickComponentStyle","excludeStyleList","finalStyleList","without","pick","EVENT_BUS","GLOBAL_CONFIG","GLOBAL_MODEL","REQUEST_MODEL","GLOBAL_TOKEN","REFRESH_PAGE","MODAL_MODEL","ZOOM_FONT_SIZE","INDICATOR_URL","_a","_b","BASE_URL","_c","ERD_URL","useOnEvent","events","id","eventBus","useEmitEvent","type","touchEventId","ref","on","callback","emitEvent","useTransformChartDataByAttrValue","data","dataFieldNames","set","map","item","x","y","dimensions","dataset","requestErrorTip","request","axios","response","error","config","status","handleFormatter","formatter","formatMoney","decimalPlaces","_value","formatThousands","formatPercentage","strValue","lowerCaseIncludes","v1","v2","runCode","code","useFn","dayjs","paramsStr","params","runFn","useVariablesInText","textData","codeData","useNewline","useSpace","variables","variable","statement","reg","textVariables","j","textVariable","usedVariable","useRequestData","callBack","requestUrl","method","headers","requestParams","requestInterval","isOpenRequestTimer","contextRequestUrl","getGlobalModel","_key","url","requestData","_params","param","record","propKey","operate","mode","urlParams","keys","last","keysLen","_param","isSetUrlParams","urlStr","res","requestDataTimer","useTransformChartDataByAttrKey","types","dataLen","typesLen","vs","label","m","useImagePath","path","isFormat","imagePath","usePageUrl","pageMode","pageId","envPageUrl","proPageUrl","useValueFormatter","useIndicatorData","requestToken","handleQueryColumn","queryColumn","location","show","indexCode","handleIndicator","indicator","calcType","builtInFormula","builtInValueSource","builtInCalcWay","formula","conditions","handleSqlConditions","controlList","sqlConditions","control","conditionLabel","conditionKey","conditionValueType","sqlCondition","model","graphicConfig","dataViewId","plugin","layer","chartType","classificationList","seriesList","leftAxisList","rightAxisList","queryColumnList","indicators","dataSourceId","idxLibMode","preview","classification","sort","customGroup","series","queryColumns","indicatorList","leftAxis","rightAxis","useHrefParamsToGlobalVariables","keyAndValue","_sfc_main$q","style","width","height","originalWidth","originalHeight","ready","observer","initSize","resolve","updateSize","updateScale","currentWidth","currentHeight","realWidth","realHeight","widthScale","heightScale","onResize","debounce","initMutationObserver","MutationObserver","removeMutationObserver","_sfc_render","_cache","$props","$setup","$data","$options","_normalizeStyle","EcanPageConfig","providerConfig","providerConfigComponentProps","_sfc_main$p","expose","setTheme","theme","provide","globalModel","setGlobalModel","useModalIds","popUseModalIds","pushUseModalIds","modalModel","getModalModel","setModalModel","mitt","eventBusKeySet","onEvent","k","onBeforeUnmount","offEvent","eventName","currentModalId","tokenNum","requestModel","requestMap","setRequest","requestFn","sortNum","requestFnList","handleRequestFnList","reject","resultList","list","queryUserToken","token","touchRequest","requestModelArr","emitRefreshPage","onRefreshPage","EcanProviderConfig","textProps","textComponentProps","textEvents","goUp","goDown","_sfc_main$o","Skeleton","myData","dataType","myText","text","replaceStatement","handleRequestData","refreshData","click","linkPage","pageUrl","href","valueChange","oldValue","_component_skeleton","EcanText","_sfc_main$n","EcanScrollText","timeDisplayProps","timeDisplayComponentProps","timeDisplayEvents","_sfc_main$m","handleTimeValue","time","setTimer","timer","clearTimer","timeChange","intervalTime","modeMap","EcanTimeDisplay","listProps","listComponentProps","listEvents","_sfc_main$l","dataSource","columnStyle","formatFn","contrastClass","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_7","_withCtx","_Fragment","_renderList","count","_createCommentVNode","column","_hoisted_5","_normalizeClass","EcanList","proportionProps","proportionComponentProps","proportionEvents","_sfc_main$k","AProgress","myWidth","myValue","defaultValue","valueSet","_component_a_progress","EcanProportion","inputProps","inputComponentProps","inputEvents","_sfc_main$j","AInput","handleSetGlobalModel","modal","inputChange","inputBlur","_component_a_input","$event","EcanInput","datePickerProps","datePickerComponentProps","datePickerEvents","_sfc_main$i","ADatePicker","getPopupContainer","useCurrentTime","dateChange","change","locale","_component_a_date_picker","EcanDatePicker","rangePickerProps","rangePickerComponentProps","rangePickerEvents","_sfc_main$h","ARangePicker","startTime","endTime","interval","intervalUnit","_startTime","_endTime","calendarStartTime","calendarEndTime","calendarChange","range","disabledDate","current","isDisabled","limitStartTime","limitEndTime","myStartTime","myEndTime","isDateChange","openChange","isNotNull","_component_a_range_picker","EcanRangePicker","buttonProps","buttonComponentProps","buttonEvents","_sfc_main$g","AButton","myHref","myTarget","_component_a_button","_createElementVNode","EcanButton","checkboxProps","checkboxComponentProps","checkboxEvents","_sfc_main$f","ACheckboxGroup","myOption","handleDataAndOption","checkboxChange","_component_a_checkbox_group","EcanCheckbox","selectProps","selectComponentProps","selectEvents","_sfc_main$e","ASelect","selectFirstOption","filterOption","input","labelKey","valueKey","labelValue","valueValue","firstOption","selectChange","_component_a_select","EcanSelect","treeSelectProps","treeSelectComponentProps","treeSelectEvents","_sfc_main$d","ATreeSelect","treeData","filterTreeNode","inputValue","treeNode","multiple","_component_a_tree_select","EcanTreeSelect","pieProps","pieComponentProps","pieEvents","useDownloadFile","downloadFileUrl","fileName","blob","dom","modalProps","modalComponentProps","modalEvents","_sfc_main$c","AModal","emit","getContainer","modalStyle","modalWith","containWidth","scaleWidth","containHeight","containStyle","contentStyle","modalRef","scaleHeight","screenWidth","screenHeight","visible","showModal","hideModal","onOk","onCancel","handleModalModel","componentList","component","isFullWidth","isFullModal","wrapClassName","className","_component_a_modal","_toDisplayString","_component_close_outlined","_resolveDynamicComponent","_mergeProps","EcanModal","use","CanvasRenderer","PieChart","TitleComponent","ToolboxComponent","TooltipComponent","LegendComponent","_sfc_main$b","Spin","ecanModal","isUseLabelColors","marker","seriesName","percent","onClose","handleDataset","handleIndicatorDataset","chartData","indicatorData","handleIndicatorData","columns","rows","_requestModalParam","_component_spin","_component_echarts","_component_ecan_modal","EcanPie","lineProps","lineComponentProps","lineEvents","LineChart","_sfc_main$a","echartRef","fontSize","eventObj","currentData","xAxisLabelFormatter","yAxisLabelFormatter","tooltipFormatter","useDataFieldNames","temp","keyTypeDataFieldNames","customClick","fieldNames","EcanLine","barProps","barComponentProps","barEvents","BarChart","DatasetComponent","_sfc_main$9","locationVisible","locationValue","locationNames","ds","xAxis","xAxisData","onFilterOption","handleLocationOk","changeColor","colorStr","_withScopeId","_pushScopeId","_popScopeId","opt","_component_a_select_option","EcanBar","scatterProps","scatterComponentProps","scatterEvents","ScatterChart","_sfc_main$8","EcanScatter","customGraphProps","customGraphComponentProps","_sfc_main$7","optionCode","evalCopy","echarts","EcanCustomGraph","comboGraphProps","comboGraphComponentProps","comboGraphEvents","_sfc_main$6","seriesTypes","seriesType","_tooltipFormatter","yAxis","axisIndex","axis","EcanComboGraph","borderProps","borderComponentProps","borderEvents","_sfc_main$5","borderStyle","_imports_0","_imports_1","_hoisted_6","_hoisted_8","_hoisted_9","_hoisted_14","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_15","EcanBorder","tabsProps","tabsComponentProps","tabsEvents","_sfc_main$4","activeKey","setAutoSwitch","maxKey","changeKey","isActive","tabChange","tab","_withModifiers","EcanTabs","imageProps","imageComponentProps","_sfc_main$3","myImgUrl","EcanImage","iframeProps","iframeComponentProps","_sfc_main$2","myLink","link","ctxErdUrl","EcanIframe","tableProps","tableComponentProps","tableEvents","_sfc_main$1","ATable","ATableSummary","ATableSummaryRow","ATableSummaryCell","splitY","myColumns","myDataSource","tableColumns","tableDataSource","total","pageNum","pageSize","filterDataIndexList","reactive","handleChildrenColumns","_columns","columnsFixedNum","cellAlign","cellColor","dataIndex","title","tableFilter","headerCellAlign","headerCellColor","rowIndex","useRowIndex","handleColumns","cloneDeep","allFilterOptions","handleFilterCheckboxOptions","filterOptionsMap","_allFilterOptions","optionsSet","_dataSource","handleReverseTable","firstColumns","_data","orderCondition","isUseLoading","tableTotal","tableChange","_filters","sorter","field","order","fieldOrder","pagination","simple","formatBoolean","dataColumns","dataRows","customRow","resetRecord","summaryList","calcTotalCount","isCalcTotal","records","summary","num","Big","handleHref","handleHrefTarget","onTouchHrefEvent","useSetSelectedKeys","setSelectedKeys","onResetFilter","clearFilters","onSearchFilterOptions","useFilterOptions","filterOptions","_inputValue","exportTableData","columnKeys","columnValues","workBook","utils","header","sheet","writeFile","handleProgressText","_component_a_table","selectedKeys","confirm","action","_component_a_table_summary","_component_a_table_summary_row","_component_a_table_summary_cell","EcanTable","mapProps","mapComponentProps","MapChart","VisualMapComponent","GraphicComponent","_sfc_main","geoBackgroundImageRef","myGeoBackgroundImage","myBackgroundImage","areaColor","symbol","symbolImage","geoCenter","center","isLoadedData","handleRegisterMap","mapJson","registerMap","_withDirectives","EcanMap","components"],"mappings":"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","x_google_ignoreList":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,23]}