diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..dccf841 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset=utf-8 +end_of_line=lf +insert_final_newline=true +indent_style=space +indent_size=2 +max_line_length = 100 + +[*.{yml,yaml,json}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.env b/.env new file mode 100644 index 0000000..59112ed --- /dev/null +++ b/.env @@ -0,0 +1,8 @@ +# 端口号 +VITE_PORT = 3100 + +# 网站标题 +VITE_GLOB_APP_TITLE = 加载中... + +# 简称,用于配置文件名字 不要出现空格、数字开头等特殊字符 +VITE_GLOB_APP_SHORT_NAME = yunzhu diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..4bd9e88 --- /dev/null +++ b/.env.development @@ -0,0 +1,23 @@ +# 资源公共路径,需要以 /开头和结尾 +VITE_PUBLIC_PATH = / + +# 本地开发代理,可以解决跨域及多地址代理 +# 如果接口地址匹配到,则会转发到http://localhost:30000,防止本地出现跨域问题 +# 可以有多个,注意多个不能换行,否则代理将会失效 +VITE_PROXY = [["/dev","http://localhost:40001"], ["/reportDev","http://localhost:32000"]] + +# 是否删除Console.log +VITE_DROP_CONSOLE = false + +# 接口地址 +# 如果没有跨域问题,直接在这里配置即可 +VITE_GLOB_API_URL=/dev + +# 报表接口 +VITE_GLOB_REPORT_API_URL=/reportDev + +# WebSocket基础地址 +VITE_GLOB_WEBSOCKET_URL='ws://localhost:40001' + +# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换 +VITE_GLOB_API_URL_PREFIX= diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..c4eb6f2 --- /dev/null +++ b/.env.production @@ -0,0 +1,31 @@ +# 资源公共路径,需要以 / 开头和结尾 +VITE_PUBLIC_PATH = / + +# 是否删除Console.log +VITE_DROP_CONSOLE = true + +# 打包是否输出gz|br文件 +# 可选: gzip | brotli | none +# 也可以有多个, 例如 'gzip'|'brotli',这样会同时生成.gz和.br文件 +VITE_BUILD_COMPRESS = 'gzip' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +# 是否在打包时使用cdn替换本地库,内网环境请设置为false +VITE_CDN = false + +# 接口地址 可以由nginx做转发或者直接写实际地址 +VITE_GLOB_API_URL= + +# 报表接口地址 可以由nginx做转发或者直接写实际地址 +VITE_GLOB_REPORT_API_URL= + +# WebSocket基础地址 (为空时默认取当前url路径,若需要自定义,请输入) +VITE_GLOB_WEBSOCKET_URL= + +# 接口地址前缀 +VITE_GLOB_API_URL_PREFIX= + +# 打包是否开启pwa功能 +VITE_USE_PWA = false diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..9e1eb28 --- /dev/null +++ b/.env.test @@ -0,0 +1,34 @@ +NODE_ENV=production + +# 资源公共路径,需要以 / 开头和结尾 +VITE_PUBLIC_PATH = / + +# 是否删除Console.log +VITE_DROP_CONSOLE = true + +# 打包是否输出gz|br文件 +# 可选: gzip | brotli | none +# 也可以有多个, 例如 'gzip'|'brotli',这样会同时生成.gz和.br文件 +VITE_BUILD_COMPRESS = 'gzip' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +# 是否在打包时使用cdn替换本地库,内网环境请设置为false +VITE_CDN = false + +# 接口地址 可以由nginx做转发或者直接写实际地址 +VITE_GLOB_API_URL= + +# 报表接口地址 可以由nginx做转发或者直接写实际地址 +VITE_GLOB_REPORT_API_URL= + +# WebSocket基础地址 (为空时默认取当前url路径,若需要自定义,请输入) +VITE_GLOB_WEBSOCKET_URL= + +# 接口地址前缀 +VITE_GLOB_API_URL_PREFIX= + +# 打包是否开启pwa功能 +VITE_USE_PWA = false + diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..476f185 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,16 @@ + +*.sh +node_modules +*.md +*.woff +*.ttf +.vscode +.idea +dist +/public +/docs +.husky +.local +/bin +Dockerfile +/src diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..9aa3e10 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,76 @@ +module.exports = { + root: true, + env: { + browser: true, + node: true, + es6: true, + }, + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser', + ecmaVersion: 2020, + sourceType: 'module', + jsxPragma: 'React', + ecmaFeatures: { + jsx: true, + }, + }, + extends: [ + 'plugin:vue/vue3-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + rules: { + 'vue/script-setup-uses-vars': 'error', + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'off', + 'vue/custom-event-name-casing': 'off', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + 'space-before-function-paren': 'off', + + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/require-default-prop': 'off', + 'vue/require-explicit-emits': 'off', + 'vue/html-self-closing': [ + 'error', + { + html: { + void: 'always', + normal: 'never', + component: 'always', + }, + svg: 'always', + math: 'always', + }, + ], + 'vue/multi-word-component-names': 'off', + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd2c0c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +node_modules +.DS_Store +dist +.cache + +tests/server/static +tests/server/static/upload + +.local +# local env files +.env.local +.env.*.local +.eslintcache + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +# .vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.vscode diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000..866381f --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,6 @@ +ports: + - port: 3344 + onOpen: open-preview +tasks: + - init: pnpm install + command: pnpm run dev diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..5e4c7f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry = "https://registry.npmmirror.com" diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..f7e39e6 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +/dist/* +.local +.output.js +/node_modules/** + +**/*.svg +**/*.sh + +/public/* diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 0000000..0517076 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,3 @@ +/dist/* +/public/* +public/* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ed5b242 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +# 基础镜像 +# nodejs请勿使用alpine版本,以免出现依赖安装失败的问题 +FROM node:20-alpine as build-stage +LABEL maintainer=yunzhupaas-team + +# 设置时区 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +# 指定临时工作目录 +WORKDIR /temp + +# 安装pnpm +RUN npm install -g pnpm@9.9.0 --registry=https://registry.npmmirror.com + +# 复制项目 +COPY . . + +# 安装依赖 +RUN pnpm install --registry https://registry.npmmirror.com + +# 构建项目 +RUN pnpm build + +# 基础镜像 +FROM nginx:stable-alpine as production-stage + +# 指定运行时的工作目录 +ENV WORKDIR /data/yunzhupaas/yunzhupaas-web-vue3 +WORKDIR $WORKDIR + +# 将构建文件拷贝到运行时目录中 +COPY --from=build-stage /temp/dist ${WORKDIR} + +# 复制Nginx配置 +COPY deploy/default.conf /etc/nginx/conf.d/ + +# 指定容器内运行端口 +EXPOSE 80 diff --git a/README b/README deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md new file mode 100644 index 0000000..69cafd9 --- /dev/null +++ b/README.md @@ -0,0 +1,157 @@ +## 一 环境要求 + +### 1.1 开发环境 + +- 操作系统:`Windows 10/11`,`MacOS`; +- `Node 16.15.0` 及以上版本(某些情况下可能需要安装 `Python3` 环境); +- `pnpm v8.1.0`及以上版本; +- `Visual Studio Code` (简称 VSCode) + +### 1.2 运行环境 + +`Nginx` 建议使用 `1.18.0` 及以上版本、兼容 `OpenResty` 或 `TongHttpServer` 6.0(国产信创) + +## 二 浏览器支持 + +> 支持现代浏览器,不支持 IE + +| IE | Edge | Firefox | Chrome | Safari | +| ----------- | --------------- | --------------- | --------------- | --------------- | +| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions | + +## 三 关联项目 + +> 需要使用下表中的对应分支 + +| 项目 | 分支 | 说明 | +| ------------------------ | ------------- | ---------------------- | +| **后端**(任一后端服务) | | | +| yunzhupaas-java-boot | v5.2.x-stable | Java 单体项目源码 | +| yunzhupaas-java-cloud | v5.2.x-stable | Java 微服务项目源码 | +| yunzhupaas-dotnet | v5.2.x-stable | .NET 单体项目源码 | +| yunzhupaas-dotnet-cloud | v5.2.x-stable | .NET 微服务项目源码 | +| **前端** | | | +| yunzhupaas-web-datascreen-vue3 | v5.2.x-stable | 大屏前端项目源码(Vue3) | +| yunzhupaas-web-datareport | v5.2.x-stable | 报表前端项目源码 | + +## 四 使用说明 + +### 4.1 开发环境 + +#### 4.1.1 安装 pnpm + +> 推荐使用 `pnpm` + +在 Windows 的 `PowerShell` 中执行如下命令 + +```bash +iwr https://get.pnpm.io/install.ps1 -useb | iex +``` + +MacOS 通过 `Homebrew` 安装 `pnpm`
若已经安装了 `Homebrew` 软件包管理器,则可以使用如下命令赖安装 pnpm: + +```bash +brew install pnpm +``` + +也可以通过 npm 安装 pnpm + +```bash +npm install -g pnpm +或 +npm install -g @pnpm/exe +``` + +#### 4.1.2 安装依赖 + +使用如下命令安装项目依赖 + +```bash +pnpm install --registry http://registry.npmmirror.com +``` + +#### 4.1.3 后端接口配置 + +修改项目根目录 `.env.development` 中的后端接口地址 + +- Java 项目本地开发默认接口地址:`http://localhost:30000` +- .NET 项目本地开发默认接口地址:`http://localhost:5000` + +```bash +# 第7行,后端接口 +VITE_PROXY = [["/dev","http://localhost:40001"]] + +# 第17行,websocket地址 +# 在本地开发环境,将后端默认接口地址的协议改成 ws 即可 +VITE_GLOB_WEBSOCKET_URL='ws://localhost:40001' +``` + +#### 4.1.4 关联项目配置 + +打开 `/src/hooks/setting/index.ts` 配置文件,默认配置如下所示 + +```bash +... +const glob: Readonly = { + title: VITE_GLOB_APP_TITLE, + apiUrl: VITE_GLOB_API_URL, + shortName: VITE_GLOB_APP_SHORT_NAME, + urlPrefix: VITE_GLOB_API_URL_PREFIX, + uploadUrl: VITE_GLOB_API_URL + '/api/file/Uploader', + webSocketUrl: VITE_GLOB_WEBSOCKET_URL, + cipherKey: 'EY8WePvjM5GGwQzn', // 加密key + aMapJsKey: '26a65601349a5ec88318721884ef81b5', + aMapWebKey: '09485f01587712b3c04e5a9abf324237', + aMapSecurityJsCode: '243e837c2ba077b4143b9a9dd2893992', + // 本地文件预览 + filePreviewServer: isDevMode() ? 'http://localhost:30090/FileServer' : VITE_GLOB_API_URL + '/FileServer', + // 大屏应用前端路径 + dataVUrl: isDevMode() ? 'http://localhost:8100/DataV/' : prodUrlPrefix + '/DataV/', + // 数据报表接口 + reportServer: isDevMode() ? 'http://localhost:30007' : VITE_GLOB_API_URL + '/ReportServer', + // 报表前端路径 + report: isDevMode() ? 'http://localhost:8200' : VITE_GLOB_API_URL + '/Report', +}; +... +``` + +#### 4.1.5 本地运行 + +完成上述操作后,使用如下命令运行前端项目 + +```bash +pnpm dev +``` + +### 4.2 运行环境 + +> 测试或生产环境 + +如果需要测试或生产环境发布,使用如下命令打包项目 + +```bash +pnpm build +``` + +然后将项目根目录下 `/dist/` 中所有的文件上传至服务器。 + +## 五 常见问题 + +### 5.1 修改项目基本信息 + +打开项目根目录 `.env` 文件,可以看到 `本地运行端口号`、`网站标题`、`简称` 等配置。 + +```bash +# 端口号 +VITE_PORT = 3100 + +# 网站标题 +VITE_GLOB_APP_TITLE = 云筑项目管理平台 + +# 简称,用于配置文件名字 不要出现空格、数字开头等特殊字符 +VITE_GLOB_APP_SHORT_NAME = yunzhu +``` + +### 5.2 代码更新后报错 + +在开发或打包时报依赖缺失,可以先删除项目根目录下的 `pnpm-lock.yaml` 文件,然后重新执行 `pnpm install` 安装依赖即可解决。 diff --git a/build/config/themeConfig.ts b/build/config/themeConfig.ts new file mode 100644 index 0000000..8eded56 --- /dev/null +++ b/build/config/themeConfig.ts @@ -0,0 +1,67 @@ +import { generate } from '@ant-design/colors'; + +export const primaryColor = '#1890ff'; + +export const darkMode = 'light'; + +type Fn = (...arg: any) => any; + +type GenerateTheme = 'default' | 'dark'; + +export interface GenerateColorsParams { + mixLighten: Fn; + mixDarken: Fn; + tinycolor: any; + color?: string; +} + +export function generateAntColors(color: string, theme: GenerateTheme = 'default') { + return generate(color, { + theme, + }); +} + +export function getThemeColors(color?: string) { + const tc = color || primaryColor; + const lightColors = generateAntColors(tc); + const primary = lightColors[5]; + const modeColors = generateAntColors(primary, 'dark'); + + return [...lightColors, ...modeColors]; +} + +export function generateColors({ color = primaryColor, mixLighten, mixDarken, tinycolor }: GenerateColorsParams) { + const arr = new Array(19).fill(0); + const lightens = arr.map((_t, i) => { + return mixLighten(color, i / 5); + }); + + const darkens = arr.map((_t, i) => { + return mixDarken(color, i / 5); + }); + + const alphaColors = arr.map((_t, i) => { + return tinycolor(color) + .setAlpha(i / 20) + .toRgbString(); + }); + + const shortAlphaColors = alphaColors.map(item => item.replace(/\s/g, '').replace(/0\./g, '.')); + + const tinycolorLightens = arr + .map((_t, i) => { + return tinycolor(color) + .lighten(i * 5) + .toHexString(); + }) + .filter(item => item !== '#ffffff'); + + const tinycolorDarkens = arr + .map((_t, i) => { + return tinycolor(color) + .darken(i * 5) + .toHexString(); + }) + .filter(item => item !== '#000000'); + return [...lightens, ...darkens, ...alphaColors, ...shortAlphaColors, ...tinycolorDarkens, ...tinycolorLightens].filter(item => !item.includes('-')); +} diff --git a/build/constant.ts b/build/constant.ts new file mode 100644 index 0000000..2c6119c --- /dev/null +++ b/build/constant.ts @@ -0,0 +1,6 @@ +/** + * The name of the configuration file entered in the production environment + */ +export const GLOB_CONFIG_FILE_NAME = '_app.config.js'; + +export const OUTPUT_DIR = 'dist'; diff --git a/build/generate/generateModifyVars.ts b/build/generate/generateModifyVars.ts new file mode 100644 index 0000000..edab0bb --- /dev/null +++ b/build/generate/generateModifyVars.ts @@ -0,0 +1,53 @@ +import { primaryColor } from '../config/themeConfig'; +import { resolve } from 'path'; +import { generate } from '@ant-design/colors'; +import { theme } from 'ant-design-vue/lib'; +import convertLegacyToken from 'ant-design-vue/lib/theme/convertLegacyToken'; +const { defaultAlgorithm, defaultSeed } = theme; + +function generateAntColors(color: string, theme: 'default' | 'dark' = 'default') { + return generate(color, { + theme, + }); +} + +/** + * less global variable + */ +export function generateModifyVars() { + const palettes = generateAntColors(primaryColor); + const primary = palettes[5]; + + const primaryColorObj: Record = {}; + + for (let index = 0; index < 10; index++) { + primaryColorObj[`primary-${index + 1}`] = palettes[index]; + } + + const mapToken = defaultAlgorithm(defaultSeed); + const v3Token = convertLegacyToken(mapToken); + return { + ...v3Token, + // Used for global import to avoid the need to import each style file separately + // reference: Avoid repeated references + hack: `true; @import (reference) "${resolve('src/design/config.less')}";`, + 'primary-color': primary, + ...primaryColorObj, + 'info-color': primary, + 'processing-color': primary, + 'success-color': '#55D187', // Success color + 'error-color': '#ED6F6F', // False color + 'warning-color': '#EFBD47', // Warning color + 'btn-info-color': '#909399', + 'text-color-secondary': 'rgba(0, 0, 0, 0.45)', + 'border-color-base1': '#f0f0f0', + 'font-size-base': '14px', // Main font size + 'border-radius-base': '2px', // Component/float fillet + 'link-color': primary, // Link color + 'app-base-background': '#eaecf0', + 'app-content-background': '#F1F4F8', // Link color + 'app-main-background': '#ebeef5', + 'selected-hover-bg': '#f5f5f5', + 'hover-background': '#f5f7fa', + }; +} diff --git a/build/generate/icon/index.ts b/build/generate/icon/index.ts new file mode 100644 index 0000000..b01fec4 --- /dev/null +++ b/build/generate/icon/index.ts @@ -0,0 +1,72 @@ +import path from 'path'; +import fs from 'fs-extra'; +import inquirer from 'inquirer'; +import colors from 'picocolors'; +import pkg from '../../../package.json'; + +async function generateIcon() { + const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json'); + + const raw = await fs.readJSON(path.join(dir, 'collections.json')); + + const collections = Object.entries(raw).map(([id, v]) => ({ + ...(v as any), + id, + })); + + const choices = collections.map((item) => ({ key: item.id, value: item.id, name: item.name })); + + inquirer + .prompt([ + { + type: 'list', + name: 'useType', + choices: [ + { key: 'local', value: 'local', name: 'Local' }, + { key: 'onLine', value: 'onLine', name: 'OnLine' }, + ], + message: 'How to use icons?', + }, + { + type: 'list', + name: 'iconSet', + choices: choices, + message: 'Select the icon set that needs to be generated?', + }, + { + type: 'input', + name: 'output', + message: 'Select the icon set that needs to be generated?', + default: 'src/components/Icon/data', + }, + ]) + .then(async (answers) => { + const { iconSet, output, useType } = answers; + const outputDir = path.resolve(process.cwd(), output); + fs.ensureDir(outputDir); + const genCollections = collections.filter((item) => [iconSet].includes(item.id)); + const prefixSet: string[] = []; + for (const info of genCollections) { + const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`)); + if (data) { + const { prefix } = data; + const isLocal = useType === 'local'; + const icons = Object.keys(data.icons).map( + (item) => `${isLocal ? prefix + ':' : ''}${item}`, + ); + + await fs.writeFileSync( + path.join(output, `icons.data.ts`), + `export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}`, + ); + prefixSet.push(prefix); + } + } + fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite')); + console.log( + `✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`, + ); + }); +} + +generateIcon(); diff --git a/build/getConfigFileName.ts b/build/getConfigFileName.ts new file mode 100644 index 0000000..46cb902 --- /dev/null +++ b/build/getConfigFileName.ts @@ -0,0 +1,7 @@ +/** + * Get the configuration file variable name + * @param env + */ +export const getConfigFileName = (env: Record) => { + return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`.toUpperCase().replace(/\s/g, ''); +}; diff --git a/build/script/buildConf.ts b/build/script/buildConf.ts new file mode 100644 index 0000000..0c8089c --- /dev/null +++ b/build/script/buildConf.ts @@ -0,0 +1,47 @@ +/** + * Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging + */ +import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant'; +import fs, { writeFileSync } from 'fs-extra'; +import colors from 'picocolors'; + +import { getEnvConfig, getRootPath } from '../utils'; +import { getConfigFileName } from '../getConfigFileName'; + +import pkg from '../../package.json'; + +interface CreateConfigParams { + configName: string; + config: any; + configFileName?: string; +} + +function createConfig(params: CreateConfigParams) { + const { configName, config, configFileName } = params; + try { + const windowConf = `window.${configName}`; + // Ensure that the variable will not be modified + let configStr = `${windowConf}=${JSON.stringify(config)};`; + configStr += ` + Object.freeze(${windowConf}); + Object.defineProperty(window, "${configName}", { + configurable: false, + writable: false, + }); + `.replace(/\s/g, ''); + + fs.mkdirp(getRootPath(OUTPUT_DIR)); + writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr); + + console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`); + console.log(colors.gray(OUTPUT_DIR + '/' + colors.green(configFileName)) + '\n'); + } catch (error) { + console.log(colors.red('configuration file configuration file failed to package:\n' + error)); + } +} + +export function runBuildConfig() { + const config = getEnvConfig(); + const configFileName = getConfigFileName(config); + createConfig({ config, configName: configFileName, configFileName: GLOB_CONFIG_FILE_NAME }); +} diff --git a/build/script/postBuild.ts b/build/script/postBuild.ts new file mode 100644 index 0000000..42635d8 --- /dev/null +++ b/build/script/postBuild.ts @@ -0,0 +1,23 @@ +// #!/usr/bin/env node + +import { runBuildConfig } from './buildConf'; +import colors from 'picocolors'; + +import pkg from '../../package.json'; + +export const runBuild = async () => { + try { + const argvList = process.argv.splice(2); + + // Generate configuration file + if (!argvList.includes('disabled-config')) { + runBuildConfig(); + } + + console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - build successfully!'); + } catch (error) { + console.log(colors.red('vite build error:\n' + error)); + process.exit(1); + } +}; +runBuild(); diff --git a/build/utils.ts b/build/utils.ts new file mode 100644 index 0000000..d027507 --- /dev/null +++ b/build/utils.ts @@ -0,0 +1,88 @@ +import fs from 'fs'; +import path from 'path'; +import dotenv from 'dotenv'; + +export function isDevFn(mode: string): boolean { + return mode === 'development'; +} + +export function isProdFn(mode: string): boolean { + return mode === 'production'; +} + +/** + * Whether to generate package preview + */ +export function isReportMode(): boolean { + return process.env.REPORT === 'true'; +} + +// Read all environment variable configuration files to process.env +export function wrapperEnv(envConf: Recordable): ViteEnv { + const ret: any = {}; + + for (const envName of Object.keys(envConf)) { + let realName = envConf[envName].replace(/\\n/g, '\n'); + realName = realName === 'true' ? true : realName === 'false' ? false : realName; + if (envName === 'VITE_PROXY' && realName) { + try { + realName = JSON.parse(realName.replace(/'/g, '"')); + } catch (error) { + realName = ''; + } + } + ret[envName] = realName; + // if (typeof realName === 'string') { + // process.env[envName] = realName; + // } else if (typeof realName === 'object') { + // process.env[envName] = JSON.stringify(realName); + // } + } + return ret; +} + +/** + * 获取当前环境下生效的配置文件名 + */ +function getConfFiles() { + const script = process.env.npm_lifecycle_script; + const reg = new RegExp('--mode ([a-z_\\d]+)'); + const result = reg.exec(script as string) as any; + if (result) { + const mode = result[1] as string; + return ['.env', `.env.${mode}`]; + } + return ['.env', '.env.production']; +} + +/** + * Get the environment variables starting with the specified prefix + * @param match prefix + * @param confFiles ext + */ +export function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFiles()) { + let envConfig = {}; + confFiles.forEach(item => { + try { + const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item))); + envConfig = { ...envConfig, ...env }; + } catch (e) { + console.error(`Error in parsing ${item}`, e); + } + }); + const reg = new RegExp(`^(${match})`); + Object.keys(envConfig).forEach(key => { + if (!reg.test(key)) { + Reflect.deleteProperty(envConfig, key); + } + }); + return envConfig; +} + +/** + * Get user root directory + * @param dir file path + */ +export function getRootPath(...dir: string[]) { + return path.resolve(process.cwd(), ...dir); +} diff --git a/build/vite/plugin/cdn.ts b/build/vite/plugin/cdn.ts new file mode 100644 index 0000000..04b67d6 --- /dev/null +++ b/build/vite/plugin/cdn.ts @@ -0,0 +1,49 @@ +import { Plugin as importToCDN } from 'vite-plugin-cdn-import'; + +/** + * @description 打包时采用`cdn`模式,仅限外网使用(默认不采用,如果需要采用cdn模式,请在 .env.production 文件,将 VITE_CDN 设置成true) + * 平台采用国内cdn:https://www.bootcdn.cn,当然你也可以选择 https://unpkg.com 或者 https://www.jsdelivr.com + * 注意:上面提到的仅限外网使用也不是完全肯定的,如果你们公司内网部署的有相关js、css文件,也可以将下面配置对应改一下,整一套内网版cdn + */ +export const configCdnPlugin = importToCDN({ + //(prodUrl解释: name: 对应下面modules的name,version: 自动读取本地package.json中dependencies依赖中对应包的版本号,path: 对应下面modules的path,当然也可写完整路径,会替换prodUrl) + prodUrl: 'https://cdn.bootcdn.net/ajax/libs/{name}/{version}/{path}', + modules: [ + { + name: 'vue', + var: 'Vue', + path: 'vue.global.prod.min.js', + }, + { + name: 'vue-router', + var: 'VueRouter', + path: 'vue-router.global.min.js', + }, + // 项目中没有直接安装vue-demi,但是pinia用到了,所以需要在引入pinia前引入vue-demi(https://github.com/vuejs/pinia/blob/v2/packages/pinia/package.json#L77) + { + name: 'vue-demi', + var: 'VueDemi', + path: 'https://cdn.bootcdn.net/ajax/libs/vue-demi/0.14.5/index.iife.min.js', + }, + { + name: 'pinia', + var: 'Pinia', + path: 'pinia.iife.min.js', + }, + { + name: 'axios', + var: 'axios', + path: 'axios.min.js', + }, + { + name: 'dayjs', + var: 'dayjs', + path: 'dayjs.min.js', + }, + { + name: 'echarts', + var: 'echarts', + path: 'echarts.min.js', + }, + ], +}); diff --git a/build/vite/plugin/compress.ts b/build/vite/plugin/compress.ts new file mode 100644 index 0000000..ff4f631 --- /dev/null +++ b/build/vite/plugin/compress.ts @@ -0,0 +1,35 @@ +/** + * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated + * https://github.com/anncwb/vite-plugin-compression + */ +import type { PluginOption } from 'vite'; +import compressPlugin from 'vite-plugin-compression'; + +export function configCompressPlugin( + compress: 'gzip' | 'brotli' | 'none', + deleteOriginFile = false, +): PluginOption | PluginOption[] { + const compressList = compress.split(','); + + const plugins: PluginOption[] = []; + + if (compressList.includes('gzip')) { + plugins.push( + compressPlugin({ + ext: '.gz', + deleteOriginFile, + }), + ); + } + + if (compressList.includes('brotli')) { + plugins.push( + compressPlugin({ + ext: '.br', + algorithm: 'brotliCompress', + deleteOriginFile, + }), + ); + } + return plugins; +} diff --git a/build/vite/plugin/html.ts b/build/vite/plugin/html.ts new file mode 100644 index 0000000..6af034a --- /dev/null +++ b/build/vite/plugin/html.ts @@ -0,0 +1,40 @@ +/** + * Plugin to minimize and use ejs template syntax in index.html. + * https://github.com/anncwb/vite-plugin-html + */ +import type { PluginOption } from 'vite'; +import { createHtmlPlugin } from 'vite-plugin-html'; +import pkg from '../../../package.json'; +import { GLOB_CONFIG_FILE_NAME } from '../../constant'; + +export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) { + const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env; + + const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`; + + const getAppConfigSrc = () => { + return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`; + }; + + const htmlPlugin: PluginOption[] = createHtmlPlugin({ + minify: isBuild, + inject: { + // Inject data into ejs template + data: { + title: VITE_GLOB_APP_TITLE, + }, + // Embed the generated app.config.js file + tags: isBuild + ? [ + { + tag: 'script', + attrs: { + src: getAppConfigSrc(), + }, + }, + ] + : [], + }, + }); + return htmlPlugin; +} diff --git a/build/vite/plugin/index.ts b/build/vite/plugin/index.ts new file mode 100644 index 0000000..f86c299 --- /dev/null +++ b/build/vite/plugin/index.ts @@ -0,0 +1,69 @@ +import { PluginOption } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import purgeIcons from 'vite-plugin-purge-icons'; +import windiCSS from 'vite-plugin-windicss'; +import VitePluginCertificate from 'vite-plugin-mkcert'; +// import vueSetupExtend from 'vite-plugin-vue-setup-extend'; +import { configHtmlPlugin } from './html'; +import { configPwaConfig } from './pwa'; +import { configCompressPlugin } from './compress'; +import { configVisualizerConfig } from './visualizer'; +import { configThemePlugin } from './theme'; +import { configSvgIconsPlugin } from './svgSprite'; +import { configCdnPlugin } from './cdn'; + +export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { + const { VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE, VITE_CDN } = viteEnv; + + const vitePlugins: (PluginOption | PluginOption[])[] = [ + // have to + vue({ + template: { + compilerOptions: { + // 解决vue3上marquee标签报错 + isCustomElement: tag => tag === 'marquee', + }, + }, + }), + // have to + vueJsx(), + // support name + // vueSetupExtend(), + VitePluginCertificate({ + source: 'coding', + }), + ]; + + // vite-plugin-windicss + vitePlugins.push(windiCSS()); + + // vite-plugin-html + vitePlugins.push(configHtmlPlugin(viteEnv, isBuild)); + + // vite-plugin-svg-icons + vitePlugins.push(configSvgIconsPlugin(isBuild)); + + // vite-plugin-purge-icons + vitePlugins.push(purgeIcons()); + + // rollup-plugin-visualizer + vitePlugins.push(configVisualizerConfig()); + + // vite-plugin-theme + vitePlugins.push(configThemePlugin(isBuild)); + + // The following plugins only work in the production environment + if (isBuild) { + // vite-plugin-cdn-import + if (VITE_CDN) vitePlugins.push(configCdnPlugin); + + // rollup-plugin-gzip + vitePlugins.push(configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE)); + + // vite-plugin-pwa + vitePlugins.push(configPwaConfig(viteEnv)); + } + + return vitePlugins; +} diff --git a/build/vite/plugin/purgeIcons.ts b/build/vite/plugin/purgeIcons.ts new file mode 100644 index 0000000..6b3a858 --- /dev/null +++ b/build/vite/plugin/purgeIcons.ts @@ -0,0 +1,5 @@ +import PurgeIcons from 'vite-plugin-purge-icons'; + +export function configPurgeIconsPlugin() { + return PurgeIcons(); +} diff --git a/build/vite/plugin/pwa.ts b/build/vite/plugin/pwa.ts new file mode 100644 index 0000000..f41da95 --- /dev/null +++ b/build/vite/plugin/pwa.ts @@ -0,0 +1,33 @@ +/** + * Yunzhupaas-config PWA for Vite + * https://github.com/antfu/vite-plugin-pwa + */ +import { VitePWA } from 'vite-plugin-pwa'; + +export function configPwaConfig(env: ViteEnv) { + const { VITE_USE_PWA, VITE_GLOB_APP_TITLE, VITE_GLOB_APP_SHORT_NAME } = env; + + if (VITE_USE_PWA) { + // vite-plugin-pwa + const pwaPlugin = VitePWA({ + manifest: { + name: VITE_GLOB_APP_TITLE, + short_name: VITE_GLOB_APP_SHORT_NAME, + icons: [ + { + src: './resource/img/pwa-192x192.png', + sizes: '192x192', + type: 'image/png', + }, + { + src: './resource/img/pwa-512x512.png', + sizes: '512x512', + type: 'image/png', + }, + ], + }, + }); + return pwaPlugin; + } + return []; +} diff --git a/build/vite/plugin/styleImport.ts b/build/vite/plugin/styleImport.ts new file mode 100644 index 0000000..38005b6 --- /dev/null +++ b/build/vite/plugin/styleImport.ts @@ -0,0 +1,82 @@ +/** + * Introduces component library styles on demand. + * https://github.com/anncwb/vite-plugin-style-import + */ +import { createStyleImportPlugin } from 'vite-plugin-style-import'; + +export function configStyleImportPlugin(_isBuild: boolean) { + if (!_isBuild) { + return []; + } + const styleImportPlugin = createStyleImportPlugin({ + libs: [ + { + libraryName: 'ant-design-vue', + esModule: true, + resolveStyle: name => { + // 这里是无需额外引入样式文件的“子组件”列表 + const ignoreList = [ + 'anchor-link', + 'sub-menu', + 'menu-item', + 'menu-divider', + 'menu-item-group', + 'breadcrumb-item', + 'breadcrumb-separator', + 'form-item', + 'step', + 'select-option', + 'select-opt-group', + 'card-grid', + 'card-meta', + 'collapse-panel', + 'descriptions-item', + 'list-item', + 'list-item-meta', + 'table-column', + 'table-column-group', + 'tab-pane', + 'tab-content', + 'timeline-item', + 'tree-node', + 'skeleton-input', + 'skeleton-avatar', + 'skeleton-title', + 'skeleton-paragraph', + 'skeleton-image', + 'skeleton-button', + ]; + // 这里是需要额外引入样式的子组件列表 + // 单独引入子组件时需引入组件样式,否则会在打包后导致子组件样式丢失 + const replaceList = { + textarea: 'input', + 'typography-text': 'typography', + 'typography-title': 'typography', + 'typography-paragraph': 'typography', + 'typography-link': 'typography', + 'dropdown-button': 'dropdown', + 'input-password': 'input', + 'input-search': 'input', + 'input-group': 'input', + 'radio-group': 'radio', + 'checkbox-group': 'checkbox', + 'layout-sider': 'layout', + 'layout-content': 'layout', + 'layout-footer': 'layout', + 'layout-header': 'layout', + 'month-picker': 'date-picker', + 'range-picker': 'date-picker', + 'image-preview-group': 'image', + }; + + return ignoreList.includes(name) + ? '' + : replaceList.hasOwnProperty(name) + ? `ant-design-vue/es/${replaceList[name]}/style/index` + : `ant-design-vue/es/${name}/style/index`; + }, + }, + ], + }); + return styleImportPlugin; +} diff --git a/build/vite/plugin/svgIcons.ts b/build/vite/plugin/svgIcons.ts new file mode 100644 index 0000000..571e9b5 --- /dev/null +++ b/build/vite/plugin/svgIcons.ts @@ -0,0 +1,10 @@ +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; +import path from 'path'; + +export function configSvgIconsPlugin(isBuild: boolean) { + return createSvgIconsPlugin({ + iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], + svgoOptions: isBuild, + symbolId: 'icon-[dir]-[name]', + }); +} diff --git a/build/vite/plugin/svgSprite.ts b/build/vite/plugin/svgSprite.ts new file mode 100644 index 0000000..61f637f --- /dev/null +++ b/build/vite/plugin/svgSprite.ts @@ -0,0 +1,17 @@ +/** + * Vite Plugin for fast creating SVG sprites. + * https://github.com/anncwb/vite-plugin-svg-icons + */ + +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; +import path from 'path'; + +export function configSvgIconsPlugin(isBuild: boolean) { + const svgIconsPlugin = createSvgIconsPlugin({ + iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], + svgoOptions: isBuild, + // default + symbolId: 'icon-[dir]-[name]', + }); + return svgIconsPlugin; +} diff --git a/build/vite/plugin/theme.ts b/build/vite/plugin/theme.ts new file mode 100644 index 0000000..b6d83a9 --- /dev/null +++ b/build/vite/plugin/theme.ts @@ -0,0 +1,101 @@ +/** + * Vite plugin for website theme color switching + * https://github.com/anncwb/vite-plugin-theme + */ +import type { PluginOption } from 'vite'; +import path from 'path'; +import { viteThemePlugin, antdDarkThemePlugin, mixLighten, mixDarken, tinycolor } from '@rys-fe/vite-plugin-theme'; +import { getThemeColors, generateColors } from '../../config/themeConfig'; +import { generateModifyVars } from '../../generate/generateModifyVars'; + +export function configThemePlugin(isBuild: boolean): PluginOption[] { + const colors = generateColors({ + mixDarken, + mixLighten, + tinycolor, + }); + + // update-begin-修复编译后主题色切换不生效黑屏的问题----------------------- + // https://github.com/vbenjs/vue-vben-admin/issues/1445 + // 抽取出viteThemePlugin插件,下方会根据不同环境设置enforce + const vite_theme_plugin = viteThemePlugin({ + resolveSelector: s => { + s = s.trim(); + switch (s) { + case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon': + return '.ant-steps-item-icon > .ant-steps-icon'; + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)': + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover': + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active': + return s; + case '.ant-steps-item-icon > .ant-steps-icon': + return s; + case '.ant-select-item-option-selected:not(.ant-select-item-option-disabled)': + return s; + default: + if (s.indexOf('.ant-btn') >= -1) { + // 按钮被重新定制过,需要过滤掉class防止覆盖 + return s; + } + } + return s.startsWith('[data-theme') ? s : `[data-theme] ${s}`; + }, + colorVariables: [...getThemeColors(), ...colors], + }); + vite_theme_plugin.forEach(function (item) { + //对vite:theme插件特殊配置 + if ('vite:theme' === item.name) { + // 打包时去除enforce: "post",vite 2.6.x适配,否则生成app-theme-style为空,因为async transform(code, id) {的code没有正确获取 + if (isBuild) { + delete item.enforce; + } + } + }); + // update-end-修复编译后主题色切换不生效黑屏的问题----------------------- + + const plugin = [ + vite_theme_plugin, + antdDarkThemePlugin({ + preloadFiles: [path.resolve(process.cwd(), 'src/design/index.less')], + filter: id => (isBuild ? !id.endsWith('antd.less') : true), + // extractCss: false, + darkModifyVars: { + ...generateModifyVars(), + 'text-color': '#c9d1d9', + 'primary-1': 'rgb(255 255 255 / 8%)', + 'text-color-base': '#c9d1d9', + 'text-color-label': '#606266', + 'component-background': '#151515', + 'hover-background': '#333333', + 'heading-color': 'rgb(255 255 255 / 65%)', + // black: '#0e1117', + // #8b949e + 'text-color-secondary': '#8b949e', + 'border-color-base': '#303030', + 'border-color-base1': '#303030', + // 'border-color-split': '#30363d', + 'item-active-bg': '#111b26', + 'app-base-background': '#1e1e1e', + 'app-content-background': '#1e1e1e', + 'app-main-background': '#333333', + 'tree-node-selected-bg': '#11263c', + 'selected-hover-bg': 'rgba(255, 255, 255, 0.08)', + + 'alert-success-border-color': '#274916', + 'alert-success-bg-color': '#162312', + 'alert-success-icon-color': '#49aa19', + 'alert-info-border-color': '#153450', + 'alert-info-bg-color': '#111b26', + 'alert-info-icon-color': '#177ddc', + 'alert-warning-border-color': '#594214', + 'alert-warning-bg-color': '#2b2111', + 'alert-warning-icon-color': '#d89614', + 'alert-error-border-color': '#58181c', + 'alert-error-bg-color': '#2a1215', + 'alert-error-icon-color': '#a61d24', + }, + }), + ]; + + return plugin as unknown as PluginOption[]; +} diff --git a/build/vite/plugin/visualizer.ts b/build/vite/plugin/visualizer.ts new file mode 100644 index 0000000..75d4451 --- /dev/null +++ b/build/vite/plugin/visualizer.ts @@ -0,0 +1,17 @@ +/** + * Package file volume analysis + */ +import visualizer from 'rollup-plugin-visualizer'; +import { isReportMode } from '../../utils'; + +export function configVisualizerConfig() { + if (isReportMode()) { + return visualizer({ + filename: './node_modules/.cache/visualizer/stats.html', + open: true, + gzipSize: true, + brotliSize: true, + }) as Plugin; + } + return []; +} diff --git a/build/vite/plugin/windicss.ts b/build/vite/plugin/windicss.ts new file mode 100644 index 0000000..499ffad --- /dev/null +++ b/build/vite/plugin/windicss.ts @@ -0,0 +1,6 @@ +import type { Plugin } from 'vite'; +import WindiCSS from 'vite-plugin-windicss'; + +export function configWindiCssPlugin(): Plugin[] { + return (WindiCSS() as Plugin[]).filter(Boolean); +} diff --git a/build/vite/proxy.ts b/build/vite/proxy.ts new file mode 100644 index 0000000..05e6002 --- /dev/null +++ b/build/vite/proxy.ts @@ -0,0 +1,34 @@ +/** + * Used to parse the .env.development proxy configuration + */ +import type { ProxyOptions } from 'vite'; + +type ProxyItem = [string, string]; + +type ProxyList = ProxyItem[]; + +type ProxyTargetList = Record; + +const httpsRE = /^https:\/\//; + +/** + * Generate proxy + * @param list + */ +export function createProxy(list: ProxyList = []) { + const ret: ProxyTargetList = {}; + for (const [prefix, target] of list) { + const isHttps = httpsRE.test(target); + + // https://github.com/http-party/node-http-proxy#options + ret[prefix] = { + target: target, + changeOrigin: true, + ws: true, + rewrite: path => path.replace(new RegExp(`^${prefix}`), ''), + // https is require secure=false + ...(isHttps ? { secure: false } : {}), + }; + } + return ret; +} diff --git a/deploy/default.conf b/deploy/default.conf new file mode 100644 index 0000000..5eb2383 --- /dev/null +++ b/deploy/default.conf @@ -0,0 +1,83 @@ +server { + listen 80; + server_name localhost; + root /data/yunzhupaas/yunzhupaas-web-vue3; + index index.html; + + gzip on; + gzip_static on; + gzip_min_length 1k; + gzip_comp_level 4; + gzip_proxied any; + gzip_types text/plain text/xml text/css; + gzip_vary on; + gzip_http_version 1.0; + gzip_disable "MSIE [1-6]\.(?!.*SV1)"; + + # YUNZHUPAAS-START + # 设置上传文件的大小 + client_max_body_size 100m; + + # 添加头部信息 + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-NginX-Proxy true; + # This is necessary to pass the correct IP to be hashed + real_ip_header X-Real-IP; + proxy_connect_timeout 300; + + # 前端主项目伪静态 + location / { + try_files $uri $uri/ /index.html; + } + + # 大屏伪静态 + location /DataV { + try_files $uri $uri/ /DataV/index.html; + } + + # 报表伪静态 + location /Report/icons/{ + try_files $uri $uri/ /Report/icons/; + } + + # 主项目后端接口 + location /api/ { + proxy_pass http://yunzhupaas-gateway-external.java-cloud-v510:40001; + } + + location /websocket { + proxy_pass http://yunzhupaas-gateway-external.java-cloud-v510:40001/api/message/websocket; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 600s; + } + + # 报表后端接口 + location /ReportServer/ { + proxy_pass http://yunzhupaas-datareport-external.java-cloud-v510:30007/; + } + + # Flowable后端接口 + location /api/Flow { + proxy_pass http://yunzhupaas-flowable-external.java-cloud-v510:31000; + } + + # Univer后端接口 + location /api/Report { + proxy_pass http://yunzhupaas-univer-external.java-cloud-v510:32000; + } + + # 文件预览 + location /FileServer { + proxy_pass http://yunzhupaas-file-preview-external.java-cloud-v510:30090; + } + + location ~ /FileServer/*.*\.(js|css)?$ { + proxy_pass http://yunzhupaas-file-preview-external.java-cloud-v510:30090; + } + # YUNZHUPAAS-END +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..f0e7200 --- /dev/null +++ b/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + <%= title %> + + + + +
+
+
+
+ +
+
+
+
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..5936d10 --- /dev/null +++ b/package.json @@ -0,0 +1,206 @@ +{ + "name": "yunzhupaas-web-vue3", + "version": "5.2.0", + "description": "云筑项目管理平台", + "author": { + "name": "深圳市乐程软件有限公司", + "email": "service@yunzhupaas.cn", + "url": "https://www.yunzhupaas.cn" + }, + "homepage": "https://www.yunzhupaas.cn", + "scripts": { + "commit": "czg", + "bootstrap": "pnpm install --registry=https://registry.npmmirror.com", + "serve": "npm run dev", + "dev": "vite", + "build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts", + "build:test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode test && esno ./build/script/postBuild.ts", + "build:no-cache": "pnpm clean:cache && npm run build", + "report": "cross-env REPORT=true npm run build", + "type:check": "vue-tsc --noEmit --skipLibCheck", + "preview": "npm run build && vite preview", + "preview:dist": "vite preview", + "log": "conventional-changelog -p angular -i CHANGELOG.md -s", + "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite", + "clean:lib": "rimraf node_modules", + "lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix", + "lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", + "lint:lint-staged": "lint-staged", + "reinstall": "rimraf pnpm-lock.yaml && rimraf package.lock.json && rimraf node_modules && npm run bootstrap", + "gen:icon": "esno ./build/generate/icon/index.ts" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "eslint --fix", + "prettier --write" + ], + "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [ + "prettier --write--parser json" + ], + "package.json": [ + "prettier --write" + ], + "*.vue": [ + "eslint --fix", + "prettier --write", + "stylelint --fix" + ], + "*.{scss,less,styl,html}": [ + "stylelint --fix", + "prettier --write" + ], + "*.md": [ + "prettier --write" + ] + }, + "config": { + "commitizen": { + "path": "node_modules/cz-git" + } + }, + "dependencies": { + "@amap/amap-jsapi-loader": "^1.0.1", + "@ant-design/colors": "^7.1.0", + "@ant-design/icons-vue": "^7.0.1", + "@fullcalendar/core": "^6.1.14", + "@fullcalendar/daygrid": "^6.1.14", + "@fullcalendar/interaction": "^6.1.14", + "@fullcalendar/timegrid": "^6.1.14", + "@fullcalendar/vue3": "^6.1.14", + "@iconify/iconify": "^3.1.0", + "@logicflow/core": "^1.2.1", + "@logicflow/extension": "^1.2.1", + "@vue/runtime-core": "^3.4.27", + "@vue/shared": "^3.4.27", + "@vueuse/core": "^10.1.2", + "@vueuse/shared": "^10.1.2", + "@zxcvbn-ts/core": "^2.2.1", + "ant-design-vue": "^4.2.3", + "axios": "^1.4.0", + "bpmn-js": "16.3.2", + "bpmn-js-properties-panel": "5.7.0", + "camunda-bpmn-moddle": "6.1.2", + "codemirror": "^5.65.12", + "cron-parser": "^4.8.1", + "cropperjs": "^1.5.13", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.7", + "diagram-js": "11.9.1", + "diagram-js-minimap": "4.1.0", + "echarts": "^5.4.2", + "echarts-stat": "^1.2.0", + "inherits-browser": "^0.1.0", + "intro.js": "^7.0.1", + "jsbarcode": "^3.11.5", + "lodash-es": "^4.17.21", + "min-dash": "^4.2.1", + "min-dom": "^4.1.0", + "monaco-editor": "^0.38.0", + "nprogress": "^0.2.0", + "path-to-regexp": "^6.2.1", + "pinia": "^2.1.3", + "print-js": "^1.6.0", + "qrcode": "^1.5.1", + "qs": "^6.11.1", + "reconnecting-websocket": "^4.4.0", + "resize-observer-polyfill": "^1.5.1", + "showdown": "^2.1.0", + "sortablejs": "^1.15.0", + "spark-md5": "^3.0.2", + "terser": "^5.14.2", + "tiny-svg": "^3.0.1", + "tinymce": "^5.10.7", + "v-code-diff": "^1.13.1", + "vditor": "^3.9.1", + "vue": "^3.4.27", + "vue-grid-layout": "^3.0.0-beta1", + "vue-i18n": "^9.13.1", + "vue-json-pretty": "^2.2.4", + "vue-plugin-hiprint": "0.0.57-beta24", + "vue-router": "^4.3.2", + "vue-simple-uploader": "1.0.0", + "vue-types": "^5.1.2", + "vue3-draggable-resizable": "^1.6.5", + "vue3-tree-org": "^4.2.2", + "vuedraggable": "^4.1.0", + "xlsx": "^0.18.5", + "zero-bpmn": "1.1.1", + "zero-univer": "1.1.2" + }, + "devDependencies": { + "@commitlint/cli": "^17.8.1", + "@commitlint/config-conventional": "^17.8.1", + "@iconify/json": "^2.2.43", + "@purge-icons/generated": "^0.9.0", + "@rys-fe/vite-plugin-theme": "^0.8.6", + "@types/codemirror": "^5.60.7", + "@types/crypto-js": "^4.2.2", + "@types/fs-extra": "^11.0.1", + "@types/inquirer": "^8.2.6", + "@types/intro.js": "^5.1.1", + "@types/lodash-es": "^4.17.7", + "@types/node": "^18.15.11", + "@types/nprogress": "^0.2.0", + "@types/qrcode": "^1.5.0", + "@types/qs": "^6.9.7", + "@types/showdown": "^2.0.0", + "@types/sortablejs": "^1.15.1", + "@typescript-eslint/eslint-plugin": "^5.57.0", + "@typescript-eslint/parser": "^5.57.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "@vue/compiler-sfc": "^3.4.27", + "@vue/test-utils": "^2.4.5", + "autoprefixer": "^10.4.14", + "conventional-changelog-cli": "^2.2.2", + "cross-env": "^7.0.3", + "cz-git": "^1.6.1", + "czg": "^1.6.1", + "dotenv": "^16.0.3", + "eslint": "^8.37.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-vue": "^9.10.0", + "esno": "^0.16.3", + "fs-extra": "^11.1.1", + "inquirer": "^9.1.5", + "jquery": "^3.7.1", + "less": "^4.1.3", + "lint-staged": "13.2.0", + "npm-run-all": "^4.1.5", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "postcss-html": "^1.5.0", + "postcss-less": "^6.0.0", + "prettier": "^2.8.8", + "rimraf": "^4.4.1", + "rollup": "^3.7.4", + "rollup-plugin-visualizer": "^5.9.0", + "stylelint": "^15.4.0", + "stylelint-config-prettier": "^9.0.3", + "stylelint-config-recommended": "^11.0.0", + "stylelint-config-recommended-vue": "^1.4.0", + "stylelint-config-standard": "^32.0.0", + "stylelint-order": "^6.0.3", + "ts-node": "^10.9.1", + "typescript": "^5.4.5", + "vite": "^4.5.3", + "vite-plugin-cdn-import": "^0.3.5", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-html": "^3.2.0", + "vite-plugin-mkcert": "^1.10.1", + "vite-plugin-purge-icons": "^0.9.2", + "vite-plugin-pwa": "^0.14.0", + "vite-plugin-style-import": "^2.0.0", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-vue-setup-extend": "^0.4.0", + "vite-plugin-windicss": "^1.8.10", + "vue-eslint-parser": "^9.1.1", + "vue-tsc": "^2.0.19" + }, + "engines": { + "node": ">=16.15.0", + "pnpm": ">=8.1.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..6ae5326 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,14173 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@amap/amap-jsapi-loader': + specifier: ^1.0.1 + version: 1.0.1 + '@ant-design/colors': + specifier: ^7.1.0 + version: 7.2.1 + '@ant-design/icons-vue': + specifier: ^7.0.1 + version: 7.0.1(vue@3.5.30) + '@fullcalendar/core': + specifier: ^6.1.14 + version: 6.1.20 + '@fullcalendar/daygrid': + specifier: ^6.1.14 + version: 6.1.20(@fullcalendar/core@6.1.20) + '@fullcalendar/interaction': + specifier: ^6.1.14 + version: 6.1.20(@fullcalendar/core@6.1.20) + '@fullcalendar/timegrid': + specifier: ^6.1.14 + version: 6.1.20(@fullcalendar/core@6.1.20) + '@fullcalendar/vue3': + specifier: ^6.1.14 + version: 6.1.20(@fullcalendar/core@6.1.20)(vue@3.5.30) + '@iconify/iconify': + specifier: ^3.1.0 + version: 3.1.1 + '@logicflow/core': + specifier: ^1.2.1 + version: 1.2.28 + '@logicflow/extension': + specifier: ^1.2.1 + version: 1.2.28(ts-node@10.9.2) + '@vue/runtime-core': + specifier: ^3.4.27 + version: 3.5.30 + '@vue/shared': + specifier: ^3.4.27 + version: 3.5.30 + '@vueuse/core': + specifier: ^10.1.2 + version: 10.11.1(vue@3.5.30) + '@vueuse/shared': + specifier: ^10.1.2 + version: 10.11.1(vue@3.5.30) + '@zxcvbn-ts/core': + specifier: ^2.2.1 + version: 2.2.1 + ant-design-vue: + specifier: ^4.2.3 + version: 4.2.6(vue@3.5.30) + axios: + specifier: ^1.4.0 + version: 1.13.6(debug@4.4.3) + bpmn-js: + specifier: 16.3.2 + version: 16.3.2 + bpmn-js-properties-panel: + specifier: 5.7.0 + version: 5.7.0(@bpmn-io/properties-panel@3.40.4)(bpmn-js@16.3.2)(camunda-bpmn-js-behaviors@1.14.1)(diagram-js@11.9.1) + camunda-bpmn-moddle: + specifier: 6.1.2 + version: 6.1.2(bpmn-js@16.3.2)(diagram-js@11.9.1) + codemirror: + specifier: ^5.65.12 + version: 5.65.21 + cron-parser: + specifier: ^4.8.1 + version: 4.9.0 + cropperjs: + specifier: ^1.5.13 + version: 1.6.2 + crypto-js: + specifier: ^4.1.1 + version: 4.2.0 + dayjs: + specifier: ^1.11.7 + version: 1.11.20 + diagram-js: + specifier: 11.9.1 + version: 11.9.1 + diagram-js-minimap: + specifier: 4.1.0 + version: 4.1.0 + echarts: + specifier: ^5.4.2 + version: 5.6.0 + echarts-stat: + specifier: ^1.2.0 + version: 1.2.0 + inherits-browser: + specifier: ^0.1.0 + version: 0.1.0 + intro.js: + specifier: ^7.0.1 + version: 7.2.0 + jsbarcode: + specifier: ^3.11.5 + version: 3.12.3 + lodash-es: + specifier: ^4.17.21 + version: 4.17.23 + min-dash: + specifier: ^4.2.1 + version: 4.2.3 + min-dom: + specifier: ^4.1.0 + version: 4.2.1 + monaco-editor: + specifier: ^0.38.0 + version: 0.38.0 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + path-to-regexp: + specifier: ^6.2.1 + version: 6.3.0 + pinia: + specifier: ^2.1.3 + version: 2.3.1(typescript@5.9.3)(vue@3.5.30) + print-js: + specifier: ^1.6.0 + version: 1.6.0 + qrcode: + specifier: ^1.5.1 + version: 1.5.4 + qs: + specifier: ^6.11.1 + version: 6.15.0 + reconnecting-websocket: + specifier: ^4.4.0 + version: 4.4.0 + resize-observer-polyfill: + specifier: ^1.5.1 + version: 1.5.1 + showdown: + specifier: ^2.1.0 + version: 2.1.0 + sortablejs: + specifier: ^1.15.0 + version: 1.15.7 + spark-md5: + specifier: ^3.0.2 + version: 3.0.2 + terser: + specifier: ^5.14.2 + version: 5.46.1 + tiny-svg: + specifier: ^3.0.1 + version: 3.1.3 + tinymce: + specifier: ^5.10.7 + version: 5.10.9 + v-code-diff: + specifier: ^1.13.1 + version: 1.13.1(vue@3.5.30) + vditor: + specifier: ^3.9.1 + version: 3.11.2 + vue: + specifier: ^3.4.27 + version: 3.5.30(typescript@5.9.3) + vue-grid-layout: + specifier: ^3.0.0-beta1 + version: 3.0.0-beta1(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27)(typescript@5.9.3) + vue-i18n: + specifier: ^9.13.1 + version: 9.14.5(vue@3.5.30) + vue-json-pretty: + specifier: ^2.2.4 + version: 2.6.0(vue@3.5.30) + vue-plugin-hiprint: + specifier: 0.0.57-beta24 + version: 0.0.57-beta24 + vue-router: + specifier: ^4.3.2 + version: 4.6.4(vue@3.5.30) + vue-simple-uploader: + specifier: 1.0.0 + version: 1.0.0(vue@3.5.30) + vue-types: + specifier: ^5.1.2 + version: 5.1.3(vue@3.5.30) + vue3-draggable-resizable: + specifier: ^1.6.5 + version: 1.6.5 + vue3-tree-org: + specifier: ^4.2.2 + version: 4.2.2(vue@3.5.30) + vuedraggable: + specifier: ^4.1.0 + version: 4.1.0(vue@3.5.30) + xlsx: + specifier: ^0.18.5 + version: 0.18.5 + zero-bpmn: + specifier: 1.1.1 + version: 1.1.1(@bpmn-io/properties-panel@3.40.4)(camunda-bpmn-js-behaviors@1.14.1)(typescript@5.9.3) + zero-univer: + specifier: 1.1.2 + version: 1.1.2(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + +devDependencies: + '@commitlint/cli': + specifier: ^17.8.1 + version: 17.8.1 + '@commitlint/config-conventional': + specifier: ^17.8.1 + version: 17.8.1 + '@iconify/json': + specifier: ^2.2.43 + version: 2.2.453 + '@purge-icons/generated': + specifier: ^0.9.0 + version: 0.9.0 + '@rys-fe/vite-plugin-theme': + specifier: ^0.8.6 + version: 0.8.6(vite@4.5.14) + '@types/codemirror': + specifier: ^5.60.7 + version: 5.60.17 + '@types/crypto-js': + specifier: ^4.2.2 + version: 4.2.2 + '@types/fs-extra': + specifier: ^11.0.1 + version: 11.0.4 + '@types/inquirer': + specifier: ^8.2.6 + version: 8.2.12 + '@types/intro.js': + specifier: ^5.1.1 + version: 5.1.5 + '@types/lodash-es': + specifier: ^4.17.7 + version: 4.17.12 + '@types/node': + specifier: ^18.15.11 + version: 18.19.130 + '@types/nprogress': + specifier: ^0.2.0 + version: 0.2.3 + '@types/qrcode': + specifier: ^1.5.0 + version: 1.5.6 + '@types/qs': + specifier: ^6.9.7 + version: 6.15.0 + '@types/showdown': + specifier: ^2.0.0 + version: 2.0.6 + '@types/sortablejs': + specifier: ^1.15.1 + version: 1.15.9 + '@typescript-eslint/eslint-plugin': + specifier: ^5.57.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^5.57.0 + version: 5.62.0(eslint@8.57.1)(typescript@5.9.3) + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.14)(vue@3.5.30) + '@vitejs/plugin-vue-jsx': + specifier: ^3.0.1 + version: 3.1.0(vite@4.5.14)(vue@3.5.30) + '@vue/compiler-sfc': + specifier: ^3.4.27 + version: 3.5.30 + '@vue/test-utils': + specifier: ^2.4.5 + version: 2.4.6 + autoprefixer: + specifier: ^10.4.14 + version: 10.4.27(postcss@8.5.8) + conventional-changelog-cli: + specifier: ^2.2.2 + version: 2.2.2 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cz-git: + specifier: ^1.6.1 + version: 1.12.0 + czg: + specifier: ^1.6.1 + version: 1.12.0 + dotenv: + specifier: ^16.0.3 + version: 16.6.1 + eslint: + specifier: ^8.37.0 + version: 8.57.1 + eslint-config-prettier: + specifier: ^8.8.0 + version: 8.10.2(eslint@8.57.1) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.5(eslint-config-prettier@8.10.2)(eslint@8.57.1)(prettier@2.8.8) + eslint-plugin-vue: + specifier: ^9.10.0 + version: 9.33.0(eslint@8.57.1) + esno: + specifier: ^0.16.3 + version: 0.16.3 + fs-extra: + specifier: ^11.1.1 + version: 11.3.4 + inquirer: + specifier: ^9.1.5 + version: 9.3.8(@types/node@18.19.130) + jquery: + specifier: ^3.7.1 + version: 3.7.1 + less: + specifier: ^4.1.3 + version: 4.6.4 + lint-staged: + specifier: 13.2.0 + version: 13.2.0 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + picocolors: + specifier: ^1.0.0 + version: 1.1.1 + postcss: + specifier: ^8.4.21 + version: 8.5.8 + postcss-html: + specifier: ^1.5.0 + version: 1.8.1 + postcss-less: + specifier: ^6.0.0 + version: 6.0.0(postcss@8.5.8) + prettier: + specifier: ^2.8.8 + version: 2.8.8 + rimraf: + specifier: ^4.4.1 + version: 4.4.1 + rollup: + specifier: ^3.7.4 + version: 3.30.0 + rollup-plugin-visualizer: + specifier: ^5.9.0 + version: 5.14.0(rollup@3.30.0) + stylelint: + specifier: ^15.4.0 + version: 15.11.0(typescript@5.9.3) + stylelint-config-prettier: + specifier: ^9.0.3 + version: 9.0.5(stylelint@15.11.0) + stylelint-config-recommended: + specifier: ^11.0.0 + version: 11.0.0(stylelint@15.11.0) + stylelint-config-recommended-vue: + specifier: ^1.4.0 + version: 1.6.1(postcss-html@1.8.1)(stylelint@15.11.0) + stylelint-config-standard: + specifier: ^32.0.0 + version: 32.0.0(stylelint@15.11.0) + stylelint-order: + specifier: ^6.0.3 + version: 6.0.4(stylelint@15.11.0) + ts-node: + specifier: ^10.9.1 + version: 10.9.2(@types/node@18.19.130)(typescript@5.9.3) + typescript: + specifier: ^5.4.5 + version: 5.9.3 + vite: + specifier: ^4.5.3 + version: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + vite-plugin-cdn-import: + specifier: ^0.3.5 + version: 0.3.5(rollup@3.30.0) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@4.5.14) + vite-plugin-html: + specifier: ^3.2.0 + version: 3.2.2(vite@4.5.14) + vite-plugin-mkcert: + specifier: ^1.10.1 + version: 1.17.10(vite@4.5.14) + vite-plugin-purge-icons: + specifier: ^0.9.2 + version: 0.9.2(vite@4.5.14) + vite-plugin-pwa: + specifier: ^0.14.0 + version: 0.14.7(vite@4.5.14)(workbox-build@6.6.0)(workbox-window@6.6.0) + vite-plugin-style-import: + specifier: ^2.0.0 + version: 2.0.0(vite@4.5.14) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@4.5.14) + vite-plugin-vue-setup-extend: + specifier: ^0.4.0 + version: 0.4.0(vite@4.5.14) + vite-plugin-windicss: + specifier: ^1.8.10 + version: 1.9.4(vite@4.5.14) + vue-eslint-parser: + specifier: ^9.1.1 + version: 9.4.3(eslint@8.57.1) + vue-tsc: + specifier: ^2.0.19 + version: 2.2.12(typescript@5.9.3) + +packages: + + /@amap/amap-jsapi-loader@1.0.1: + resolution: {integrity: sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==} + dev: false + + /@ant-design/colors@6.0.0: + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + dependencies: + '@ctrl/tinycolor': 3.6.1 + dev: false + + /@ant-design/colors@7.2.1: + resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==} + dependencies: + '@ant-design/fast-color': 2.0.6 + dev: false + + /@ant-design/fast-color@2.0.6: + resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==} + engines: {node: '>=8.x'} + dependencies: + '@babel/runtime': 7.29.2 + dev: false + + /@ant-design/icons-svg@4.4.2: + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + dev: false + + /@ant-design/icons-vue@7.0.1(vue@3.5.30): + resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==} + peerDependencies: + vue: '>=3.0.3' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /@antfu/utils@0.7.10: + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + dev: true + + /@apideck/better-ajv-errors@0.3.6(ajv@8.18.0): + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.18.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + + /@babel/code-frame@7.29.0: + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + /@babel/compat-data@7.29.0: + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.29.0: + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.29.1: + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + /@babel/helper-annotate-as-pure@7.27.3: + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.29.0 + dev: true + + /@babel/helper-compilation-targets@7.28.6: + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.29.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0): + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0): + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-globals@7.28.0: + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-member-expression-to-functions@7.28.5: + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-imports@7.28.6: + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + /@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + /@babel/helper-optimise-call-expression@7.27.1: + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.29.0 + dev: true + + /@babel/helper-plugin-utils@7.28.6: + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.27.1: + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-string-parser@7.27.1: + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.28.5: + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.27.1: + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.28.6: + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.29.2: + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + /@babel/parser@7.29.2: + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.29.0 + + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0): + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: false + + /@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0): + resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 + dev: true + + /@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0): + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0): + resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0): + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0): + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0): + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0): + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/preset-env@7.29.2(@babel/core@7.29.0): + resolution: {integrity: sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.29.0 + esutils: 2.0.3 + dev: true + + /@babel/runtime@7.29.2: + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + /@babel/template@7.28.6: + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + + /@babel/traverse@7.29.0: + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.29.0: + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: false + + /@bpmn-io/cm-theme@0.1.0-alpha.2: + resolution: {integrity: sha512-ZILgiYzxk3KMvxplUXmdRFQo45/JehDPg5k9tWfehmzUOSE13ssyLPil8uCloMQnb3yyzyOWTjb/wzKXTHlFQw==} + dependencies: + '@codemirror/language': 6.12.2 + '@codemirror/view': 6.40.0 + '@lezer/highlight': 1.2.3 + dev: false + + /@bpmn-io/diagram-js-ui@0.2.3: + resolution: {integrity: sha512-OGyjZKvGK8tHSZ0l7RfeKhilGoOGtFDcoqSGYkX0uhFlo99OVZ9Jn1K7TJGzcE9BdKwvA5Y5kGqHEhdTxHvFfw==} + dependencies: + htm: 3.1.1 + preact: 10.29.0 + dev: false + + /@bpmn-io/extract-process-variables@0.8.0: + resolution: {integrity: sha512-yAS7ZYX+D56K+luC36u96eRMLb4VHcPUwTUqMZ/Z/Je2gou2DJLRbuBTHAB4jjKt4wFCHSG4B8Y+TrBciEYf4w==} + dependencies: + min-dash: 4.2.3 + dev: false + + /@bpmn-io/feel-editor@2.5.2: + resolution: {integrity: sha512-pxbhUDAlLe+zDAvmG7Y057o8rnVImKYEbgjH4+zZiq3WjPw5bZYu2kraJfpWMs3xkyOCvLR6H3J3f8yJRuHmgw==} + engines: {node: '>= 20'} + dependencies: + '@bpmn-io/feel-lint': 3.1.0 + '@bpmn-io/lang-feel': 3.0.0 + '@camunda/feel-builtins': 1.1.0 + '@codemirror/autocomplete': 6.20.1 + '@codemirror/commands': 6.10.3 + '@codemirror/language': 6.12.2 + '@codemirror/lint': 6.9.5 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.40.0 + '@lezer/highlight': 1.2.3 + min-dom: 5.3.0 + mitt: 3.0.1 + dev: false + + /@bpmn-io/feel-lint@3.1.0: + resolution: {integrity: sha512-nOCYWMXgwR0joU4XKhu4f3P5f4/AsmuyiV1e+fzcXTCh7iMLU8VYdHXSIzZuJ0zxz3Gsnp7A8S8lt+HJ43H6IA==} + dependencies: + '@bpmn-io/lezer-feel': 2.3.1 + '@codemirror/language': 6.12.2 + dev: false + + /@bpmn-io/feelin@6.1.0: + resolution: {integrity: sha512-nqmmlHRD9tl0ZcpYTEkZdpc/rAMoYc+ct0SOg9fFIFWRaEApme3DuXC7v9AMA5g+upGCKd6cUc3t97y+unpfMw==} + engines: {node: '>= 20.12.0'} + dependencies: + '@bpmn-io/lezer-feel': 2.3.1 + '@lezer/common': 1.5.1 + luxon: 3.7.2 + min-dash: 5.0.0 + dev: false + + /@bpmn-io/lang-feel@3.0.0: + resolution: {integrity: sha512-t/k0z5AW18J7Qz2i/bIFAlvlcS63RuyQB9OQ0YiC1WyMosxXRAnv98LHnVbwirx9vje1DLll85tkBT2B8KLjmQ==} + engines: {node: '>= 20.12.0'} + dependencies: + '@bpmn-io/lezer-feel': 2.3.1 + '@codemirror/autocomplete': 6.20.1 + '@codemirror/language': 6.12.2 + '@lezer/common': 1.5.1 + dev: false + + /@bpmn-io/lezer-feel@2.3.1: + resolution: {integrity: sha512-MNe3M7XUuUk0OvrIIXM0m7M2hNLouxPqJyqd6+XCDMy9dsan0zLA0vl7Cu8ypCbsAlViIGIvYdkjzZNiXd3gng==} + engines: {node: '>= 20.12.0'} + dependencies: + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + min-dash: 5.0.0 + dev: false + + /@bpmn-io/properties-panel@3.40.4: + resolution: {integrity: sha512-0u3bUbvLnD/DGW/SAG52zh9LmGX6YOwaavh0ac3CuFN7+Ba/Uf1kkZzEBHi+Qo8xkDtL5p2xxeP+2sIO67hJyA==} + dependencies: + '@bpmn-io/feel-editor': 2.5.2 + '@carbon/icons': 11.76.0 + '@codemirror/view': 6.40.0 + classnames: 2.5.1 + feelers: 1.5.1 + focus-trap: 8.0.1 + min-dash: 5.0.0 + min-dom: 5.3.0 + dev: false + + /@camunda/feel-builtins@1.1.0: + resolution: {integrity: sha512-aBIGrXkURxDxBulrkaF1AOV261RSyukA5UWGRgDiULvlJ+P6/dYX7boBuO8Be9OP/hjAjZoTbK1kKcuqfCp7ng==} + dev: false + + /@carbon/icons@11.76.0: + resolution: {integrity: sha512-e9XnUWPgxsyvgCL/ti/Ee2fItqRs/WrHkwy7GPqbEGdGZKSd9pBvO+jN7nxBT5TLdA50q26t5hR0U2taEyc5Kg==} + requiresBuild: true + dependencies: + '@ibm/telemetry-js': 1.11.0 + dev: false + + /@claviska/jquery-minicolors@2.3.6(jquery@3.7.1): + resolution: {integrity: sha512-8Ro6D4GCrmOl41+6w4NFhEOpx8vjxwVRI69bulXsFDt49uVRKhLU5TnzEV7AmOJrylkVq+ugnYNMiGHBieeKUQ==} + peerDependencies: + jquery: '>= 1.7.x' + dependencies: + jquery: 3.7.1 + dev: false + + /@codemirror/autocomplete@6.20.1: + resolution: {integrity: sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==} + dependencies: + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.40.0 + '@lezer/common': 1.5.1 + dev: false + + /@codemirror/commands@6.10.3: + resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} + dependencies: + '@codemirror/language': 6.12.2 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.40.0 + '@lezer/common': 1.5.1 + dev: false + + /@codemirror/language@6.12.2: + resolution: {integrity: sha512-jEPmz2nGGDxhRTg3lTpzmIyGKxz3Gp3SJES4b0nAuE5SWQoKdT5GoQ69cwMmFd+wvFUhYirtDTr0/DRHpQAyWg==} + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.40.0 + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + style-mod: 4.1.3 + dev: false + + /@codemirror/lint@6.9.5: + resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==} + dependencies: + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.40.0 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.6.0: + resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} + dependencies: + '@marijn/find-cluster-break': 1.0.2 + dev: false + + /@codemirror/view@6.40.0: + resolution: {integrity: sha512-WA0zdU7xfF10+5I3HhUUq3kqOx3KjqmtQ9lqZjfK7jtYk4G72YW9rezcSywpaUMCWOMlq+6E0pO1IWg1TNIhtg==} + dependencies: + '@codemirror/state': 6.6.0 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + dev: false + + /@commitlint/cli@17.8.1: + resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==} + engines: {node: '>=v14'} + hasBin: true + dependencies: + '@commitlint/format': 17.8.1 + '@commitlint/lint': 17.8.1 + '@commitlint/load': 17.8.1 + '@commitlint/read': 17.8.1 + '@commitlint/types': 17.8.1 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional@17.8.1: + resolution: {integrity: sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==} + engines: {node: '>=v14'} + dependencies: + conventional-changelog-conventionalcommits: 6.1.0 + dev: true + + /@commitlint/config-validator@17.8.1: + resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + ajv: 8.18.0 + dev: true + + /@commitlint/ensure@17.8.1: + resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@17.8.1: + resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/format@17.8.1: + resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@17.8.1: + resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + semver: 7.5.4 + dev: true + + /@commitlint/lint@17.8.1: + resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/is-ignored': 17.8.1 + '@commitlint/parse': 17.8.1 + '@commitlint/rules': 17.8.1 + '@commitlint/types': 17.8.1 + dev: true + + /@commitlint/load@17.8.1: + resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.8.1 + '@commitlint/execute-rule': 17.8.1 + '@commitlint/resolve-extends': 17.8.1 + '@commitlint/types': 17.8.1 + '@types/node': 20.5.1 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.9.3) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.2)(typescript@5.9.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/message@17.8.1: + resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/parse@17.8.1: + resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + conventional-changelog-angular: 6.0.0 + conventional-commits-parser: 4.0.0 + dev: true + + /@commitlint/read@17.8.1: + resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/top-level': 17.8.1 + '@commitlint/types': 17.8.1 + fs-extra: 11.3.4 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@17.8.1: + resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.8.1 + '@commitlint/types': 17.8.1 + import-fresh: 3.3.1 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@17.8.1: + resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/ensure': 17.8.1 + '@commitlint/message': 17.8.1 + '@commitlint/to-lines': 17.8.1 + '@commitlint/types': 17.8.1 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@17.8.1: + resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/top-level@17.8.1: + resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==} + engines: {node: '>=v14'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@17.8.1: + resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + /@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1): + resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-tokenizer': ^2.4.1 + dependencies: + '@csstools/css-tokenizer': 2.4.1 + dev: true + + /@csstools/css-tokenizer@2.4.1: + resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==} + engines: {node: ^14 || ^16 || >=18} + dev: true + + /@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1): + resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.7.1 + '@csstools/css-tokenizer': ^2.4.1 + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + dev: true + + /@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.2): + resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.13 + dependencies: + postcss-selector-parser: 6.1.2 + dev: true + + /@ctrl/tinycolor@3.6.1: + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + dev: false + + /@emotion/hash@0.9.2: + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.9.1(eslint@8.57.1): + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.12.2: + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.14.0 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.1: + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@flatten-js/interval-tree@1.1.4: + resolution: {integrity: sha512-o4emRDDvGdkwX18BSVSXH8q27qAL7Z2WDHSN75C8xyRSE4A8UOkig0mWSGoT5M5KaTHZxoLmalFwOTQmbRusUg==} + dev: false + + /@floating-ui/core@1.7.5: + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + dependencies: + '@floating-ui/utils': 0.2.11 + dev: false + + /@floating-ui/dom@1.7.6: + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + dev: false + + /@floating-ui/utils@0.2.11: + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + dev: false + + /@fullcalendar/core@6.1.20: + resolution: {integrity: sha512-1cukXLlePFiJ8YKXn/4tMKsy0etxYLCkXk8nUCFi11nRONF2Ba2CD5b21/ovtOO2tL6afTJfwmc1ed3HG7eB1g==} + dependencies: + preact: 10.12.1 + dev: false + + /@fullcalendar/daygrid@6.1.20(@fullcalendar/core@6.1.20): + resolution: {integrity: sha512-AO9vqhkLP77EesmJzuU+IGXgxNulsA8mgQHynclJ8U70vSwAVnbcLG9qftiTAFSlZjiY/NvhE7sflve6cJelyQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.20 + dependencies: + '@fullcalendar/core': 6.1.20 + dev: false + + /@fullcalendar/interaction@6.1.20(@fullcalendar/core@6.1.20): + resolution: {integrity: sha512-p6txmc5txL0bMiPaJxe2ip6o0T384TyoD2KGdsU6UjZ5yoBlaY+dg7kxfnYKpYMzEJLG58n+URrHr2PgNL2fyA==} + peerDependencies: + '@fullcalendar/core': ~6.1.20 + dependencies: + '@fullcalendar/core': 6.1.20 + dev: false + + /@fullcalendar/timegrid@6.1.20(@fullcalendar/core@6.1.20): + resolution: {integrity: sha512-4H+/MWbz3ntA50lrPif+7TsvMeX3R1GSYjiLULz0+zEJ7/Yfd9pupZmAwUs/PBpA6aAcFmeRr0laWfcz1a9V1A==} + peerDependencies: + '@fullcalendar/core': ~6.1.20 + dependencies: + '@fullcalendar/core': 6.1.20 + '@fullcalendar/daygrid': 6.1.20(@fullcalendar/core@6.1.20) + dev: false + + /@fullcalendar/vue3@6.1.20(@fullcalendar/core@6.1.20)(vue@3.5.30): + resolution: {integrity: sha512-8qg6pS27II9QBwFkkJC+7SfflMpWqOe7i3ii5ODq9KpLAjwQAd/zjfq8RvKR1Yryoh5UmMCmvRbMB7i4RGtqog==} + peerDependencies: + '@fullcalendar/core': ~6.1.20 + vue: ^3.0.11 + dependencies: + '@fullcalendar/core': 6.1.20 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /@grpc/grpc-js@1.14.3: + resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} + engines: {node: '>=12.10.0'} + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + dev: false + + /@grpc/proto-loader@0.8.0: + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + dev: false + + /@humanwhocodes/config-array@0.13.0: + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@ibm/telemetry-js@1.11.0: + resolution: {integrity: sha512-RO/9j+URJnSfseWg9ZkEX9p+a3Ousd33DBU7rOafoZB08RqdzxFVYJ2/iM50dkBuD0o7WX7GYt1sLbNgCoE+pA==} + hasBin: true + dev: false + + /@iconify/iconify@2.1.2: + resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==} + deprecated: no longer maintained, switch to modern iconify-icon web component + dependencies: + cross-fetch: 3.2.0 + transitivePeerDependencies: + - encoding + dev: true + + /@iconify/iconify@3.1.1: + resolution: {integrity: sha512-1nemfyD/OJzh9ALepH7YfuuP8BdEB24Skhd8DXWh0hzcOxImbb1ZizSZkpCzAwSZSGcJFmscIBaBQu+yLyWaxQ==} + deprecated: no longer maintained, switch to modern iconify-icon web component + dependencies: + '@iconify/types': 2.0.0 + + /@iconify/json@2.2.453: + resolution: {integrity: sha512-LL3avJyZUFtB/Ts1WbpunFZ58XnodcQn0xMLQbm9gxuuZNpnt2D89n+CstNHpqheynDz+nZVSSvKko1bFXBOTA==} + dependencies: + '@iconify/types': 2.0.0 + pathe: 2.0.3 + dev: true + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + /@inquirer/external-editor@1.0.3(@types/node@18.19.130): + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 18.19.130 + chardet: 2.1.1 + iconv-lite: 0.7.2 + dev: true + + /@inquirer/figures@1.0.15: + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + dev: true + + /@interactjs/actions@1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-FCRg5KwB+stkPcAMx/Cn0fgGP6p4LyMX9S/Upcn/W+hpYme31bPi54PCqmOebzz6myTthN6zFf9jMyLOqtI/gg==} + peerDependencies: + '@interactjs/core': 1.10.27 + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/auto-scroll@1.10.27(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-zPg5TnVsZv+9Hnt4qnbxLvBMf+rIWHkoJVoSETEbLNaj90C8hIyr0pVwukSUySSgDhCgQ7np0f3pg4INLq9beQ==} + peerDependencies: + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/auto-start@1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-ECLBO/nxmaF1knncJKIE5F7la3KKRgEkn0Cu2JTPOYj9xy/LpfYElo3wkRHsodgOqF651nR70GK2/IzPR2lO9A==} + peerDependencies: + '@interactjs/core': 1.10.27 + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/core@1.10.27(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-SliUr/3ZbLAdED8LokzYzWHWMdCB5Cq+UnpXuRy+BIod1j97m4IUFf/D1iIKUBBjBcucgXbz28z96WnenVCB7Q==} + peerDependencies: + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/utils': 1.10.27 + dev: false + + /@interactjs/dev-tools@1.10.27(@interactjs/modifiers@1.10.27)(@interactjs/utils@1.10.27)(typescript@5.9.3): + resolution: {integrity: sha512-YolmBwRaKH1gWbvyLeV3m5QSwtD38lOZnCBA87PCAlcd9PQAC2gb03fEPeEyD336bE20oLB8f0WZt4Wre+afiw==} + peerDependencies: + '@interactjs/modifiers': 1.10.27 + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/modifiers': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + vue: 3.5.30(typescript@5.9.3) + transitivePeerDependencies: + - typescript + dev: false + + /@interactjs/inertia@1.10.27(@interactjs/core@1.10.27)(@interactjs/modifiers@1.10.27)(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-S/SVj/M0D+wWWPVXHcXN/YUWOK51LFJsEA+CTgVnFhlSU04+1FUvNLwilCZcHgECu1RJxZNKDwZysDATg+r8jQ==} + peerDependencies: + '@interactjs/core': 1.10.27 + '@interactjs/modifiers': 1.10.27 + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/modifiers': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/offset': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/interact@1.10.27: + resolution: {integrity: sha512-XdH3A2UUzjEFGGJgFuJlhiz99tE8jB8xNh/DmnoMuL6uOQPxNA+sWRnzEVjG0+zY2P3/dbhEpi4Cn3FLPzydwA==} + dependencies: + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + dev: false + + /@interactjs/interactjs@1.10.27(typescript@5.9.3): + resolution: {integrity: sha512-UwhfUZMZVXUY72efPABuKSBz1sUY+r+49v8t6Ku9o5Jq76AKg9mwmdGszIlOn3ppnFDDjvtzK/8TL+Sbd0EQEA==} + dependencies: + '@interactjs/actions': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/auto-scroll': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/auto-start': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/dev-tools': 1.10.27(@interactjs/modifiers@1.10.27)(@interactjs/utils@1.10.27)(typescript@5.9.3) + '@interactjs/inertia': 1.10.27(@interactjs/core@1.10.27)(@interactjs/modifiers@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/interact': 1.10.27 + '@interactjs/modifiers': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/offset': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/pointer-events': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/reflow': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + transitivePeerDependencies: + - typescript + dev: false + + /@interactjs/modifiers@1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-ei/qfoQ+9/8k6WzNzdNqHI6cWkIV576N4Ap16r5CoqOWwhA6Xzj3OMHf1g0t1O4eSq2HdJsVJn3eLNfw9HsbeQ==} + peerDependencies: + '@interactjs/core': 1.10.27 + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/snappers': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/offset@1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-AezsLiuK+Qv4jXdYuRa65HJ2pMFMZPlqiAep6ZRLwhP9HE7O75c0EAm+gfx+dpPrHNHs6J9LaiKSZl+B+A2qAw==} + peerDependencies: + '@interactjs/core': 1.10.27 + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/pointer-events@1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-Yo5SS6PhWfC93gHNxnwwW0wvebo5hSYJKGaSnAHO4f9Lh25yibecMnmPBmiEfWVcdMboK/kXrme43mHQaRegVg==} + peerDependencies: + '@interactjs/core': 1.10.27 + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/reflow@1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-Msm0QdYFr40oSsPFxyCR3dHN/pQx34k7QSkdN1uIsUn/drrm+YSFvrvVOu99DFOwr7gTThr5vNe06Sz4vubTSA==} + peerDependencies: + '@interactjs/core': 1.10.27 + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/snappers@1.10.27(@interactjs/utils@1.10.27): + resolution: {integrity: sha512-HZLZ0XSi6HI08OmTv/HKG6AltQoaKAALLQ+KDW92utj3XSgw7oren0KsWUKPhaPg3Av7R1jFQd08s+uafqIlLw==} + peerDependencies: + '@interactjs/utils': 1.10.27 + dependencies: + '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 + dev: false + + /@interactjs/utils@1.10.27: + resolution: {integrity: sha512-+qfLOio2OxQqg1cXSnRaCl+N8MQDQLDS9w+aOGxH8YLAhIMyt7Asxx/46//sT8orgsi16pmlBPtngPHT9s8zKw==} + dev: false + + /@intlify/core-base@9.14.5: + resolution: {integrity: sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==} + engines: {node: '>= 16'} + dependencies: + '@intlify/message-compiler': 9.14.5 + '@intlify/shared': 9.14.5 + dev: false + + /@intlify/message-compiler@9.14.5: + resolution: {integrity: sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==} + engines: {node: '>= 16'} + dependencies: + '@intlify/shared': 9.14.5 + source-map-js: 1.2.1 + dev: false + + /@intlify/shared@9.14.5: + resolution: {integrity: sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==} + engines: {node: '>= 16'} + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.2 + resolve-from: 5.0.0 + dev: false + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: false + + /@jest/console@27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: false + + /@jest/core@27.5.1(ts-node@10.9.2): + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(ts-node@10.9.2) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.8 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + + /@jest/environment@27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + jest-mock: 27.5.1 + dev: false + + /@jest/fake-timers@27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 18.19.130 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: false + + /@jest/globals@27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: false + + /@jest/reporters@27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + chalk: 4.1.2 + collect-v8-coverage: 1.0.3 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.2.0 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@jest/source-map@27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: false + + /@jest/test-result@27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.3 + dev: false + + /@jest/test-sequencer@27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@jest/transform@27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.29.0 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.19.130 + '@types/yargs': 16.0.11 + chalk: 4.1.2 + dev: false + + /@jridgewell/gen-mapping@0.3.13: + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + /@jridgewell/remapping@2.3.5: + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.11: + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + /@jridgewell/sourcemap-codec@1.5.5: + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + /@jridgewell/trace-mapping@0.3.31: + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + /@js-sdsl/ordered-map@4.4.2: + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + dev: false + + /@lezer/common@1.5.1: + resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} + dev: false + + /@lezer/highlight@1.2.3: + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + dependencies: + '@lezer/common': 1.5.1 + dev: false + + /@lezer/lr@1.4.8: + resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} + dependencies: + '@lezer/common': 1.5.1 + dev: false + + /@lezer/markdown@1.6.3: + resolution: {integrity: sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==} + dependencies: + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + dev: false + + /@logicflow/core@1.2.28: + resolution: {integrity: sha512-xj9zxYsudK9YLI2UrUa9mXWd4tp8z56Rx4il9Fc/baUWEDwogjqCgblSKepGxEgTX2XX2fQIfUrzqEUoWu2VYQ==} + dependencies: + '@types/mousetrap': 1.6.15 + mousetrap: 1.6.5 + preact: 10.29.0 + dev: false + + /@logicflow/extension@1.2.28(ts-node@10.9.2): + resolution: {integrity: sha512-OHaO57SxjNwDDYVAqrJp/fq9g0NDc4elHmZnWGIqLbkbOMJhiU9IUT2WWK6DctUoYzxhGzTR4Ai5S/TFZ9JjGA==} + dependencies: + '@logicflow/core': 1.2.28 + jest: 27.5.1(ts-node@10.9.2) + lodash-es: 4.17.23 + preact: 10.29.0 + transitivePeerDependencies: + - bufferutil + - canvas + - node-notifier + - supports-color + - ts-node + - utf-8-validate + dev: false + + /@marijn/find-cluster-break@1.0.2: + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + dev: false + + /@noble/ed25519@2.1.0: + resolution: {integrity: sha512-KM4qTyXPinyCgMzeYJH/UudpdL+paJXtY3CHtHYZQtBkS8MZoPr4rOikZllIutJe0d06QDQKisyn02gxZ8TcQA==} + dev: false + + /@noble/hashes@1.6.1: + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + dev: true + + /@one-ini/wasm@0.1.1: + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@purge-icons/core@0.9.1: + resolution: {integrity: sha512-sx8/a30MbbqQVEqhuMPE1wJpdVRRbEmwEPZpFzVkcDixzX4p+R2A0WVxqkb0xfHUBAVQwrSE2SeAyniIQLqbLw==} + dependencies: + '@iconify/iconify': 2.1.2 + axios: 0.26.1(debug@4.4.3) + debug: 4.4.3 + fast-glob: 3.3.3 + fs-extra: 10.1.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@purge-icons/generated@0.9.0: + resolution: {integrity: sha512-s2t+1oVtGDV6KtqfCXtUOhxfeYvOdDF90IVm+nMs/6bUP0HeGZLslguuL/AibpwtfL4FA/oCsIu/RhwapgAdJw==} + dependencies: + '@iconify/iconify': 3.1.1 + dev: true + + /@rc-component/color-picker@2.0.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@ant-design/fast-color': 2.0.6 + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@rc-component/mini-decimal@1.1.3: + resolution: {integrity: sha512-bk/FJ09fLf+NLODMAFll6CfYrHPBioTedhW6lxDBuuWucJEqFUd4l/D/5JgIi3dina6sYahB8iuPAZTNz2pMxw==} + engines: {node: '>=8.x'} + dependencies: + '@babel/runtime': 7.29.2 + dev: false + + /@rc-component/portal@1.1.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@rc-component/trigger@2.3.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(rollup@2.80.0): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@rollup/pluginutils': 3.1.0(rollup@2.80.0) + rollup: 2.80.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@rollup/plugin-node-resolve@11.2.1(rollup@2.80.0): + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.80.0) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.11 + rollup: 2.80.0 + dev: true + + /@rollup/plugin-replace@2.4.2(rollup@2.80.0): + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.80.0) + magic-string: 0.25.9 + rollup: 2.80.0 + dev: true + + /@rollup/plugin-replace@5.0.7(rollup@3.30.0): + resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@3.30.0) + magic-string: 0.30.21 + rollup: 3.30.0 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@2.80.0): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.80.0 + dev: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/pluginutils@5.3.0(rollup@3.30.0): + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + rollup: 3.30.0 + dev: true + + /@rys-fe/vite-plugin-theme@0.8.6(vite@4.5.14): + resolution: {integrity: sha512-9j6yMhNRCDxv4Wpimo0EDZf/KU5FgJtjMPVYBaFv4SPClLOEx5kkpcRuDrVBaB4IzM1qizRlxUK4jd9Klxyqig==} + peerDependencies: + vite: '>=2.0.0-beta.49' + dependencies: + '@types/node': 14.18.63 + '@types/tinycolor2': 1.4.6 + chalk: 4.1.2 + clean-css: 5.3.3 + debug: 4.4.3 + esbuild: 0.11.23 + esbuild-plugin-alias: 0.1.2 + tinycolor2: 1.6.0 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@simonwep/pickr@1.8.2: + resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} + dependencies: + core-js: 3.49.0 + nanopop: 2.4.2 + dev: false + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: false + + /@sinonjs/fake-timers@8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: false + + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + dev: false + + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.12 + dev: true + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: false + + /@tsconfig/node10@1.0.12: + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + dev: false + + /@types/babel__generator@7.27.0: + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + dependencies: + '@babel/types': 7.29.0 + dev: false + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + dev: false + + /@types/babel__traverse@7.28.0: + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + dependencies: + '@babel/types': 7.29.0 + dev: false + + /@types/codemirror@5.60.17: + resolution: {integrity: sha512-AZq2FIsUHVMlp7VSe2hTfl5w4pcUkoFkM3zVsRKsn1ca8CXRDYvnin04+HP2REkwsxemuHqvDofdlhUWNpbwfw==} + dependencies: + '@types/tern': 0.23.9 + dev: true + + /@types/crypto-js@4.2.2: + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} + dev: true + + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + + /@types/estree@1.0.8: + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + dev: true + + /@types/fs-extra@11.0.4: + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 18.19.130 + dev: true + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 18.19.130 + dev: false + + /@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14): + resolution: {integrity: sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==} + peerDependencies: + '@types/react': '*' + dependencies: + '@types/react': 19.2.14 + hoist-non-react-statics: 3.3.2 + dev: false + + /@types/inquirer@8.2.12: + resolution: {integrity: sha512-YxURZF2ZsSjU5TAe06tW0M3sL4UI9AMPA6dd8I72uOtppzNafcY38xkYgCZ/vsVOAyNdzHmvtTpLWilOrbP0dQ==} + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.2 + dev: true + + /@types/intro.js@5.1.5: + resolution: {integrity: sha512-TT1d8ayz07svlBcoqh26sNpQaU6bBpdFcCC+IMZHp46NNX2mYAHAVefM3wCmQSd4UWhhObeMjFByw2IaPKOXlw==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: false + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: false + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/jsonfile@6.1.4: + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + dependencies: + '@types/node': 18.19.130 + dev: true + + /@types/lodash-es@4.17.12: + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + dependencies: + '@types/lodash': 4.17.24 + dev: true + + /@types/lodash@4.17.24: + resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/mousetrap@1.6.15: + resolution: {integrity: sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==} + dev: false + + /@types/node@14.18.63: + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + dev: true + + /@types/node@18.19.130: + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + dependencies: + undici-types: 5.26.5 + + /@types/node@20.5.1: + resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} + dev: true + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/nprogress@0.2.3: + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + dev: true + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: false + + /@types/qrcode@1.5.6: + resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} + dependencies: + '@types/node': 18.19.130 + dev: true + + /@types/qs@6.15.0: + resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} + dev: true + + /@types/raf@3.4.3: + resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} + dev: false + + /@types/react-redux@7.1.34: + resolution: {integrity: sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==} + dependencies: + '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.14) + '@types/react': 19.2.14 + hoist-non-react-statics: 3.3.2 + redux: 4.2.1 + dev: false + + /@types/react@19.2.14: + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + dependencies: + csstype: 3.2.3 + dev: false + + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 18.19.130 + dev: true + + /@types/semver@7.7.1: + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + dev: true + + /@types/showdown@2.0.6: + resolution: {integrity: sha512-pTvD/0CIeqe4x23+YJWlX2gArHa8G0J0Oh6GKaVXV7TAeickpkkZiNOgFcFcmLQ5lB/K0qBJL1FtRYltBfbGCQ==} + dev: true + + /@types/sortablejs@1.15.9: + resolution: {integrity: sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==} + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: false + + /@types/svgo@2.6.4: + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + dependencies: + '@types/node': 18.19.130 + dev: true + + /@types/tern@0.23.9: + resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} + dependencies: + '@types/estree': 1.0.8 + dev: true + + /@types/through@0.0.33: + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + dependencies: + '@types/node': 18.19.130 + dev: true + + /@types/tinycolor2@1.4.6: + resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + dev: true + + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: true + + /@types/web-bluetooth@0.0.20: + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + dev: false + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: false + + /@types/yargs@16.0.11: + resolution: {integrity: sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: false + + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.9.3): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.4 + tsutils: 3.21.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.9.3): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.9.3): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + tsutils: 3.21.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.4 + tsutils: 3.21.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.9.3): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.3.0: + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + dev: true + + /@univerjs-pro/engine-pivot@0.5.5: + resolution: {integrity: sha512-j/1Psojj1QwfPXRUf5BDErqKBQLz9pYyQU0PEovWXCDk513m4unu56DoW0UgOLbkXfqFitwGmTe5kjUckwoOIg==} + dev: false + + /@univerjs-pro/license@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-mlWIYPNlJOhpgkX8ygo5YREKjjzV4poFZueuNPcTTvazxupY7c9fIWNAGjiG1zytwi5QThHaGU8OLU5cs9N+Ew==} + dependencies: + '@noble/ed25519': 2.1.0 + '@noble/hashes': 1.6.1 + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + - rxjs + dev: false + + /@univerjs-pro/sheets-pivot-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-ooaNmghytIfRpwhkGwrKqeh9YAtj+pxTFBWddA+Up2P3KxuYaJIqlVg8YHARhCXVmMcoYmhno0u6D9MnlVHQYg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs-pro/engine-pivot': 0.5.5 + '@univerjs-pro/sheets-pivot': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + react-beautiful-dnd: 13.1.1(react-dom@18.3.1)(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-native + - typescript + dev: false + + /@univerjs-pro/sheets-pivot@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-mEp5ZpsrONUP6mFc60Tzl9ABBQopjOupGCl9ZEjxEmA79UNg/zK+DTyVebWYpi3iB8vqla43rE5RTtYbW/CRQQ==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs-pro/engine-pivot': 0.5.5 + '@univerjs-pro/license': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/rpc': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/core@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/protocol': 0.1.40(@grpc/grpc-js@1.14.3)(rxjs@7.8.2) + '@wendellhu/redi': 0.17.0 + dayjs: 1.11.20 + fast-diff: 1.3.0 + kdbush: 4.0.2 + lodash-es: 4.17.23 + nanoid: 5.0.9 + numeral: 2.0.6 + numfmt: 2.5.2 + ot-json1: 1.0.2 + rbush: 4.0.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + dev: false + + /@univerjs/data-validation@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-rddXbY8DNrahSMyOx8tzISdKjJ6U3w+1tjABw26exdQwPkUYFV28mGL7erIcSLgUVtRzkmEvviouSDrE/g2Fmw==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/design@0.5.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bf3ZEPsIIUto6kGQDhpS4bs5IONmsKKIeiEKW7Tq9OTeLhpCcMH+COMRzIDPtImiaun9PS8bshoIH6PLbTGzCw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@rc-component/color-picker': 2.0.1(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.3.1(react-dom@18.3.1)(react@18.3.1) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + clsx: 2.1.1 + dayjs: 1.11.20 + rc-dialog: 9.6.0(react-dom@18.3.1)(react@18.3.1) + rc-dropdown: 4.2.1(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.8.0(react-dom@18.3.1)(react@18.3.1) + rc-input-number: 9.5.0(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.16.1(react-dom@18.3.1)(react@18.3.1) + rc-picker: 4.11.3(dayjs@1.11.20)(react-dom@18.3.1)(react@18.3.1) + rc-segmented: 2.7.1(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.16.8(react-dom@18.3.1)(react@18.3.1) + rc-textarea: 1.10.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.19.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-draggable: 4.5.0(react-dom@18.3.1)(react@18.3.1) + react-grid-layout: 1.5.3(react-dom@18.3.1)(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + tailwind-merge: 2.6.1 + transitivePeerDependencies: + - date-fns + - luxon + - moment + dev: false + + /@univerjs/docs-drawing-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-xmYSw//c+/nOlj/89e5IxIANxSVnQMbzCfdFJGAsA49xY2v83dmygncP17GSHHpfYvk0kj/dyX7jHW5QWi5TfA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/docs-drawing@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-utTF/evzF5F7I0jC/pRhZBnga5CyMoFp18P3ERKpnTB1J5bXhMTj5tSesS2e5OiyDz9TFymB0DrJzMs2/akdFg==} + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + - rxjs + dev: false + + /@univerjs/docs-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-pr7XlC5yECZHhkTVykR9qyO6f0bVZ9R8lXGb/njAuHx5su8E9Rc+51gw1cUd1lX2ke/nTB02290VB+aCJmxfMQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/docs@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-doSwZwITsZefCqHNl7XGua4Rcduk8N6V/Mwd8wjUZXyuf7UiJSlgxYKUtzwMm6GSKcTfOoXEG1reBgsLWjNVaQ==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/drawing-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-Cl0ujy7QsYcJcunG5ofpHTaXDQTHx86p/KcNA6KIvOq8fOSNcuVDQjaoIGWgoUKVuhfG+KOJcTM1Bt07GBm/Sw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/drawing@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-xAl45E4izbbIx10bC1uQQNUNWRmdIqm0y1aShEuow81a9P6A7FKYG9v/6PKsBW9QQq4yLcCWkJ2awBfh6yw29Q==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + ot-json1: 1.0.2 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/engine-formula@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@flatten-js/interval-tree': 1.1.4 + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/rpc': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + decimal.js: 10.6.0 + numfmt: 2.5.2 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/engine-numfmt@0.5.5: + resolution: {integrity: sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==} + dev: false + + /@univerjs/engine-render@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-FzGPRdgfD0F17DQEtBkeWrAQ8p8bS7JD/hWB42V+W87CYkOrvkZ33/7F4/7k5mXnK0CFrp0H+GQjh98aI8BRiw==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + cjk-regex: 3.4.0 + franc-min: 6.2.0 + opentype.js: 1.3.4 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/facade@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-TPO8HR1I7ro9NretADLYDzkRfsQeCGjMvQzT+PH4YlEHzm0fa7Cs82VPYUv0HV78pTrGha7hxdN5B9VdTHIVIA==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/network': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-numfmt': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-thread-comment': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-zen-editor': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react + - react-dom + - typescript + dev: false + + /@univerjs/find-replace@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-b9MLbrZUNRmiIXNEKo5yPbabc1q3JHxY6MXDkMFrijiNmbHh2si6ehjtMl3bbp5wgjieEX3cULeFAKUI5viyuw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/icons@0.2.14(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FBaotSjU72Pe4b8dKwo8wjO8lWstIqCDmEdqIhuOc8nXwFjyiqgxGnOMCe0YxrpZqlWe8DsoqjvnQfWFShFkiA==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@univerjs/network@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-XX6KPurV0JAFD6wSELG+6A1Gcry4yRuRs9anATYSyi9AYMOzh9DlmG48daP+R60P+RANpP0qKMoB0/zEnEFEDg==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/protocol@0.1.40(@grpc/grpc-js@1.14.3)(rxjs@7.8.2): + resolution: {integrity: sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + '@grpc/grpc-js': '>=1' + rxjs: '>=7.8' + dependencies: + '@grpc/grpc-js': 1.14.3 + rxjs: 7.8.2 + dev: false + + /@univerjs/protocol@0.1.43(@grpc/grpc-js@1.14.3)(rxjs@7.8.2): + resolution: {integrity: sha512-arQJP3emdEdV0qqE/Xl0LqSZS3Kvg71hsp4jzjFl7RkkR/HSe3vBXdgRcmVkWa+BIS29yyfvFdkAJhrvKIHgGA==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + '@grpc/grpc-js': '>=1' + rxjs: '>=7.8' + dependencies: + '@grpc/grpc-js': 1.14.3 + rxjs: 7.8.2 + dev: false + + /@univerjs/rpc@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/sheets-conditional-formatting-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-+/tZQLFAI5I5UdH05HoEPG1mE3m75g6N5CxJsKn7FMsF0hjn+PlyBIQMMsrXjbzcgIX5b1fIqiOemJWL/y04Lg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-grid-layout: 1.5.3(react-dom@18.3.1)(react@18.3.1) + react-resizable: 3.1.3(react-dom@18.3.1)(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - typescript + dev: false + + /@univerjs/sheets-conditional-formatting@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-ecBWHe3NAXJ3odlXVmlT5BFSc+KYH6ksAUQi3FxWpzcfEQHnGs84RcgYE4lWnGslTxglYlt1d9n87tPndXsN0A==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/sheets-crosshair-highlight@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-VuucP3pnMJGnyEk1g5J6tA09unTHoTAXzKDKD2XB5dAih3Z5hiM5NE3Y9catvXSaN+jUxA5TcavhiMj+HTb7pQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-data-validation-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-jje2uiiyZlyVVTppsojo/kHmPi8ybdHXb2B1PVK4Qom8P3uytyl+iWNSmtPiCpynvBpM4kFe703ZNb8Tw9wgmg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@flatten-js/interval-tree': 1.1.4 + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/data-validation': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-numfmt': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-data-validation@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-80JQh66sPW4fmcZOjechKx9bVeDbxTx+7YE4X1mLP+KoylVxzEup9kgjzjq7LCw/zePpdiZNuqFzPNwl+YFxLw==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/data-validation': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/protocol': 0.1.40(@grpc/grpc-js@1.14.3)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/sheets-drawing-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-Db85r4ydJhBFyiTZeveWlPkoO1+e/aAUrbhQtFkejg92EQ5/E8JyXGAqB7hFNd10NNXp1dRGxycn7t0Z/uWKsw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs-drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-drawing@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-lyL4oHv1u4YZZANIiBpy+pswrFot9n3yJKB8TgGDpsevHeeaYPd4/WoJkJipPdM34RC7LwanIZ2xijpN9sfBsQ==} + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + - rxjs + dev: false + + /@univerjs/sheets-filter-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-nnkmE0oCaLmLaDxgTSuWyHeSJcPn7Wj8/9K6q65PGWN7gpRSOvmARfGzoiNOrcJCLlnyekoqYouwFCw8eN4qyQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/rpc': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + rc-virtual-list: 3.19.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-filter@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-laLkEgtp2VoO2//DuVbK+eEaz/nvyqsZbZ+lcIQCjZ48NE7T4JZPodLl1q8pfj9N7MlIgOBxo2NxnWiQdU7IEw==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/sheets-find-replace@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-3SIqG2Px8UVkuOMRD1XsNv+1xBNMwxqyjBMT545sywPypOmOQ6mQ6Lnx9K5QjQ2l4nmk9s2wExL+BExpwKh4sQ==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/find-replace': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react + - react-dom + - typescript + dev: false + + /@univerjs/sheets-formula-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-Pi6GUCPT6rDovvn/+9Lub7CU9EEy3KA7YMykMPyii0Bujm16W92iyGmyx7aUqHvKWEjdrR+MUQCCzZQNnrcrsA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-formula@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-EC0v3S346Hebj+KTJqOhygvzugNv4AmPnmGkhYX7yjiZqkwWoUQU5NnRMua3xJq9iY9itxTiUZ2wo86EFJ5b3A==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/rpc': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/sheets-hyper-link-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-SBDR4SANwfKL7aF1j1DRlzxO6FsExD84l2NgQ2uPpDE6TGZfsF6gX6TZbxu4uKdY8/SgtT0miB81Aipg4/JqzA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-hyper-link': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-hyper-link@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-RKLCSbfZdexcx6YscOwP5VH8c0FAfQhd3lC/xaamDGIA2ibJWMPmLhW2XAEvEUvRE72FZN4+Tbsc8HHrOxTmSQ==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/protocol': 0.1.40(@grpc/grpc-js@1.14.3)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/sheets-numfmt-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-b8ndwsZgdfHqnx5dP3cQE5iQhhWOP/8DUmg/2kjmWXblXoFMKBAj07KfXQCQiMA3v0F8nmmjnEYJsK1D1Oc7Mw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-numfmt': 0.5.5 + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-numfmt@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-J5BDLCxnpiG1u7WxTBDeQGr4JWHn/BIKT1jAaFOJ8rUvb/6LL3DogRt9KWjDkU1FjU5grhR/YmH2zWalVorwlw==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-numfmt': 0.5.5 + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/sheets-sort-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-zQyX8YsEbk3bNcyelfeW+bC2Nlfkr7OzNp4998KDs122SSqnGAPp7/661xf/JFdYKY+MwiXjwVNdZUjec00pIA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-sort': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + rc-virtual-list: 3.19.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-sort@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-sqf2UYc3d7A2KXnDsjmi9bAyISS2K3BkYfa921be+j6DPs3cnH7uJ5QjrwIVTvEY0hPW6RuKV98OaDcm/yuGSg==} + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + - rxjs + dev: false + + /@univerjs/sheets-thread-comment-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-HppCYW/59AWv5ty5udWlJBqLxxUKrtofB95syHPtI5SKy+4qHOo24+2GsujObqeccJn2H7aNcxC4BZmDeW4E1w==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-thread-comment': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/thread-comment': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-thread-comment@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-SKFgs7J2v+/zi4ZEe0GvdmQdmxG8OAmtf++2hMjHBaNuD0uBX7jdee4BAf3VelzxqCJuv7v8E0z3/a9xZAtVCg==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/thread-comment': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/sheets-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-ouuG+k+Y6YI0StI1s6YfzA+filhLj33iUTNQgJbTP0N+WJ1Le/ZezWFBnZ1isZtGRFXiFKv74vuAABc5WkVL2g==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-numfmt': 0.5.5 + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/protocol': 0.1.40(@grpc/grpc-js@1.14.3)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/telemetry': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets-zen-editor@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-sbcs8NX/on6sQRV7U2zEXiJnmBAco70V3/8Dlt/LrdyVixV9XuTAX0hSzAT3RelYKhvrQyu2Dicr5V4nktcLNg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/sheets@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-numfmt': 0.5.5 + '@univerjs/protocol': 0.1.40(@grpc/grpc-js@1.14.3)(rxjs@7.8.2) + '@univerjs/rpc': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/telemetry@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-q82fkhdXMd6VEIkkWJ1LnbcV01r/+AgApfJbFcZ/827IKHVuSUPzobbFC1tLFJfM+VDWLxiTBPBM5UmphAgTPQ==} + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + - rxjs + dev: false + + /@univerjs/thread-comment-ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-1hPi7i0vKnVQJhKBMcbJx+BpQEXhdtVOvVUNtD9VisIYy4FhOb8iI2o0jGlK5G/yHFG12FGOQSO/YMH95E9dbA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/thread-comment': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + clsx: 2.1.1 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/thread-comment@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-uwD7MUaeJkDX64FhiMegT5OzI+XOkR7GkWTA96ZnjKcDZ1NzuQyqkNQXIie7xl2IWpanGBDFbsY4IBwNeM3s9w==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/protocol': 0.1.40(@grpc/grpc-js@1.14.3)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@univerjs/ui@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-c455sy91IVOSaphc9ISZtkznLxIZL306N1JnOoGhvvzlFl0fgFQSIrobnQE2mhcpHysQguDp2GfnXFlb0vfoog==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + clsx: 2.1.1 + localforage: 1.10.0 + rc-notification: 5.6.4(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + optionalDependencies: + vue: 3.5.30(typescript@5.9.3) + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - typescript + dev: false + + /@univerjs/uniscript@0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-1vVwo/mYHhciwlYrlioQYMu4cxBue+7jgOledUM5CCLD+zT+wbU6hDP6p+waA2MUILFaxT3rx0rvYrnlboOTQQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + monaco-editor: 0.52.2 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - date-fns + - luxon + - moment + - react-dom + - typescript + dev: false + + /@univerjs/watermark@0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2): + resolution: {integrity: sha512-iayRm9iDPpFgVprNyLvzSDP41Hfn3qknhy2wQwGiPF14tRShsN9Mm8wvf//wctmcLOizxmh1ISuWCX0fDM+xew==} + peerDependencies: + rxjs: '>=7.0.0' + dependencies: + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + clsx: 2.1.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@grpc/grpc-js' + - react + dev: false + + /@vitejs/plugin-vue-jsx@3.1.0(vite@4.5.14)(vue@3.5.30): + resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0) + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + vue: 3.5.30(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue@4.6.2(vite@4.5.14)(vue@3.5.30): + resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + vue: 3.5.30(typescript@5.9.3) + dev: true + + /@volar/language-core@2.4.15: + resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} + dependencies: + '@volar/source-map': 2.4.15 + dev: true + + /@volar/source-map@2.4.15: + resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} + dev: true + + /@volar/typescript@2.4.15: + resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==} + dependencies: + '@volar/language-core': 2.4.15 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + dev: true + + /@vue/babel-helper-vue-transform-on@1.5.0: + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} + dev: true + + /@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.0): + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.29.0) + '@vue/shared': 3.5.30 + transitivePeerDependencies: + - supports-color + dev: true + + /@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.29.0): + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/parser': 7.29.2 + '@vue/compiler-sfc': 3.5.30 + transitivePeerDependencies: + - supports-color + dev: true + + /@vue/compiler-core@3.5.30: + resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==} + dependencies: + '@babel/parser': 7.29.2 + '@vue/shared': 3.5.30 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + /@vue/compiler-dom@3.5.30: + resolution: {integrity: sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==} + dependencies: + '@vue/compiler-core': 3.5.30 + '@vue/shared': 3.5.30 + + /@vue/compiler-sfc@3.5.30: + resolution: {integrity: sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==} + dependencies: + '@babel/parser': 7.29.2 + '@vue/compiler-core': 3.5.30 + '@vue/compiler-dom': 3.5.30 + '@vue/compiler-ssr': 3.5.30 + '@vue/shared': 3.5.30 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.8 + source-map-js: 1.2.1 + + /@vue/compiler-ssr@3.5.30: + resolution: {integrity: sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==} + dependencies: + '@vue/compiler-dom': 3.5.30 + '@vue/shared': 3.5.30 + + /@vue/compiler-vue2@2.7.16: + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /@vue/devtools-api@6.6.4: + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + dev: false + + /@vue/language-core@2.2.12(typescript@5.9.3): + resolution: {integrity: sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 2.4.15 + '@vue/compiler-dom': 3.5.30 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.30 + alien-signals: 1.0.13 + minimatch: 9.0.9 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + typescript: 5.9.3 + dev: true + + /@vue/reactivity@3.5.30: + resolution: {integrity: sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==} + dependencies: + '@vue/shared': 3.5.30 + + /@vue/runtime-core@3.5.30: + resolution: {integrity: sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==} + dependencies: + '@vue/reactivity': 3.5.30 + '@vue/shared': 3.5.30 + + /@vue/runtime-dom@3.5.30: + resolution: {integrity: sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==} + dependencies: + '@vue/reactivity': 3.5.30 + '@vue/runtime-core': 3.5.30 + '@vue/shared': 3.5.30 + csstype: 3.2.3 + + /@vue/server-renderer@3.5.30(vue@3.5.30): + resolution: {integrity: sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==} + peerDependencies: + vue: 3.5.30 + dependencies: + '@vue/compiler-ssr': 3.5.30 + '@vue/shared': 3.5.30 + vue: 3.5.30(typescript@5.9.3) + + /@vue/shared@3.5.30: + resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==} + + /@vue/test-utils@2.4.6: + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + dependencies: + js-beautify: 1.15.4 + vue-component-type-helpers: 2.2.12 + dev: true + + /@vueuse/core@10.11.1(vue@3.5.30): + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.30) + vue-demi: 0.14.10(vue@3.5.30) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata@10.11.1: + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + dev: false + + /@vueuse/shared@10.11.1(vue@3.5.30): + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + dependencies: + vue-demi: 0.14.10(vue@3.5.30) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@wendellhu/redi@0.17.0: + resolution: {integrity: sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==} + dev: false + + /@windicss/config@1.9.4: + resolution: {integrity: sha512-vKXJlEC01/LFuYLF6XZsrCv13QKsxByWFqzDRctTva+O4yqr5j0e5VWB4Dr2tgzVbZuYG5ewg7qywAI/9JD0Cw==} + dependencies: + debug: 4.4.3 + jiti: 1.21.7 + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@windicss/plugin-utils@1.9.4: + resolution: {integrity: sha512-GUAX0z+wnq6Rn3+YGJli/keGja73+a6I/PtTpH8EMlNNHrHBbqsbyY5+25QagV39rHwTe/IbkiSdD3csP8L6MA==} + dependencies: + '@antfu/utils': 0.7.10 + '@windicss/config': 1.9.4 + debug: 4.4.3 + fast-glob: 3.3.3 + magic-string: 0.30.21 + micromatch: 4.0.8 + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@wtto00/html2canvas@1.4.3: + resolution: {integrity: sha512-jwsb+xL8N+gjrSNABSaFdxmWtE4c7RNFjP20lo1G7gs63Qqo1phhxVBTzxc/apDVh6LgXsU2l5bwKtXd9uz65w==} + engines: {node: '>=8.0.0'} + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + + /@zxcvbn-ts/core@2.2.1: + resolution: {integrity: sha512-Cg1JyRpCDIF+Dh3nauqygmmCYxogNVZDxSn+9PgkPD1HZ2QiJe4elruVJrGmYRS7muGmZ1hNJq8ySQdPv6GHaw==} + dependencies: + fastest-levenshtein: 1.0.16 + dev: false + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + dev: false + + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: false + + /acorn-jsx@5.3.2(acorn@8.16.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.16.0 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.16.0 + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + + /adler-32@1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: false + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + dev: true + + /alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false + + /ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + dev: true + + /ant-design-vue@4.2.6(vue@3.5.30): + resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + vue: '>=3.2.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-vue': 7.0.1(vue@3.5.30) + '@babel/runtime': 7.29.2 + '@ctrl/tinycolor': 3.6.1 + '@emotion/hash': 0.9.2 + '@emotion/unitless': 0.8.1 + '@simonwep/pickr': 1.8.2 + array-tree-filter: 2.1.0 + async-validator: 4.2.5 + csstype: 3.2.3 + dayjs: 1.11.20 + dom-align: 1.12.4 + dom-scroll-into-view: 2.0.1 + lodash: 4.17.23 + lodash-es: 4.17.23 + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.31 + shallow-equal: 1.2.1 + stylis: 4.3.6 + throttle-debounce: 5.0.2 + vue: 3.5.30(typescript@5.9.3) + vue-types: 3.0.2(vue@3.5.30) + warning: 4.0.3 + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-move@3.0.1: + resolution: {integrity: sha512-H3Of6NIn2nNU1gsVDqDnYKY/LCdWvCMMOWifNGhKcVQgiZ6nOek39aESOvro6zmueP07exSl93YLvkN4fZOkSg==} + engines: {node: '>=10'} + dev: false + + /array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + + /async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + dev: false + + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + /autoprefixer@10.4.27(postcss@8.5.8): + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001780 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: true + + /axios@0.26.1(debug@4.4.3): + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + dependencies: + follow-redirects: 1.15.11(debug@4.4.3) + transitivePeerDependencies: + - debug + dev: true + + /axios@1.13.6(debug@4.4.3): + resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} + dependencies: + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + /babel-jest@27.5.1(@babel/core@7.29.0): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.29.0 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.29.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.28.6 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-jest-hoist@27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + dev: false + + /babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + dev: false + + /babel-preset-jest@27.5.1(@babel/core@7.29.0): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + dev: true + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /baseline-browser-mapping@2.10.10: + resolution: {integrity: sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + /batch-processor@1.0.0: + resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} + dev: false + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /bpmn-js-properties-panel@5.7.0(@bpmn-io/properties-panel@3.40.4)(bpmn-js@16.3.2)(camunda-bpmn-js-behaviors@1.14.1)(diagram-js@11.9.1): + resolution: {integrity: sha512-6dbMf69FthXP+J3rLzN0ot88n55fyoVLMFO0vX2/yI1fgzhvi14TTOvZEYGi7KVvJIQDPV5YYtxSytUL3t0B9A==} + peerDependencies: + '@bpmn-io/properties-panel': '>= 3.7' + bpmn-js: '>= 11.5' + camunda-bpmn-js-behaviors: '>= 0.4' + diagram-js: '>= 11.9' + dependencies: + '@bpmn-io/extract-process-variables': 0.8.0 + '@bpmn-io/properties-panel': 3.40.4 + array-move: 3.0.1 + bpmn-js: 16.3.2 + camunda-bpmn-js-behaviors: 1.14.1(bpmn-js@16.3.2)(camunda-bpmn-moddle@6.1.2)(zeebe-bpmn-moddle@1.12.0) + diagram-js: 11.9.1 + ids: 1.0.5 + min-dash: 4.2.3 + min-dom: 4.2.1 + dev: false + + /bpmn-js@16.3.2: + resolution: {integrity: sha512-8jWzcagdNPtnnng3S2VvhweuD1R4UNRYslfkkPNlI37Qe2yJArnZF1Z8poMr9U9bRgzhQQ82M2q3ybCT36WJ2g==} + dependencies: + bpmn-moddle: 8.1.0 + diagram-js: 13.4.0 + diagram-js-direct-editing: 2.1.2(diagram-js@13.4.0) + ids: 1.0.5 + inherits-browser: 0.1.0 + min-dash: 4.2.3 + min-dom: 4.2.1 + tiny-svg: 3.1.3 + dev: false + + /bpmn-moddle@8.1.0: + resolution: {integrity: sha512-yI5OAFfYVJwViKTsTsonVfCBPtB3MlefADUORwNIxxBOMp21vnoxuxsdgUWlPH/dvAEZh/+mr8UtqOBNu8NC5Q==} + dependencies: + min-dash: 4.2.3 + moddle: 6.2.3 + moddle-xml: 10.1.0 + dev: false + + /brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: false + + /browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + baseline-browser-mapping: 2.10.10 + caniuse-lite: 1.0.30001780 + electron-to-chromium: 1.5.321 + node-releases: 2.0.36 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: false + + /btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /bwip-js@4.8.0: + resolution: {integrity: sha512-gUDkDHSTv8/DJhomSIbO0fX/Dx0MO/sgllLxJyJfu4WixCQe9nfGJzmHm64ZCbxo+gUYQEsQcRmqcwcwPRwUkg==} + hasBin: true + dev: false + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + dev: true + + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase-keys@7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + dependencies: + camelcase: 6.3.0 + map-obj: 4.3.0 + quick-lru: 5.1.1 + type-fest: 1.4.0 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /camunda-bpmn-js-behaviors@1.14.1(bpmn-js@16.3.2)(camunda-bpmn-moddle@6.1.2)(zeebe-bpmn-moddle@1.12.0): + resolution: {integrity: sha512-M+awrL4PuKFi8kemtjLV8A32zODVQ2/cLuaHl2lZt5EKmMjxGb41BL3ulDRaK1Je712/zFTliYKNDX3IsLAvpQ==} + peerDependencies: + bpmn-js: '>= 9' + camunda-bpmn-moddle: '>= 7' + zeebe-bpmn-moddle: '>= 0.18' + dependencies: + bpmn-js: 16.3.2 + camunda-bpmn-moddle: 6.1.2(bpmn-js@16.3.2)(diagram-js@11.9.1) + ids: 3.0.2 + min-dash: 5.0.0 + zeebe-bpmn-moddle: 1.12.0 + dev: false + + /camunda-bpmn-moddle@6.1.2(bpmn-js@16.3.2)(diagram-js@11.9.1): + resolution: {integrity: sha512-DfhOTeq8oN01cB5sLE6Rq34/9xGD15/Y14pEM+YBIjgvV6Rclh+BgIa/2aRMm8An4Kc/itm2tECYiDr8p/FyTQ==} + peerDependencies: + bpmn-js: ^6.x || ^7.x || ^8.x || ^9.x + diagram-js: ^5.x || ^6.x || ^7.x || ^8.x + dependencies: + bpmn-js: 16.3.2 + diagram-js: 11.9.1 + min-dash: 3.8.1 + dev: false + + /caniuse-lite@1.0.30001780: + resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} + + /canvg@3.0.11: + resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} + engines: {node: '>=10.0.0'} + dependencies: + '@babel/runtime': 7.29.2 + '@types/raf': 3.4.3 + core-js: 3.49.0 + raf: 3.4.1 + regenerator-runtime: 0.13.11 + rgbcolor: 1.0.1 + stackblur-canvas: 2.7.0 + svg-pathdata: 6.0.3 + dev: false + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 + dev: true + + /cfb@1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + dev: false + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: false + + /chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: false + + /cjk-regex@3.4.0: + resolution: {integrity: sha512-m+gbmlIP6gAG7tDvo2kpeSPAz/uh5wY5/zx10ymjdpbbiTHNTNoYnP2lCiyqtmbLxwhEdq8/lsVbsy4GTc9oUw==} + engines: {node: '>=16'} + dependencies: + regexp-util: 2.0.3 + unicode-regex: 4.2.0 + dev: false + + /cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + dev: false + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + dev: false + + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: true + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /codemirror@5.65.21: + resolution: {integrity: sha512-6teYk0bA0nR3QP0ihGMoxuKzpl5W80FpnHpBJpgy66NK3cZv5b/d/HY8PnRvfSsCG1MTfr92u2WUl+wT0E40mQ==} + dev: false + + /codepage@1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + dev: false + + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: false + + /collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + dev: false + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: false + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: true + + /component-event@0.2.1: + resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==} + dev: false + + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + dev: true + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + dev: true + + /console@0.7.2: + resolution: {integrity: sha512-+JSDwGunA4MTEgAV/4VBKwUHonP8CzJ/6GIuwPi6acKFqFfHUdSGCm89ZxZ5FfGWdZfkdgAroy5bJ5FSeN/t4g==} + dev: true + + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case: 2.0.2 + dev: true + + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-angular@6.0.0: + resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} + engines: {node: '>=14'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-cli@2.2.2: + resolution: {integrity: sha512-8grMV5Jo8S0kP3yoMeJxV2P5R6VJOqK72IiSV9t/4H5r/HiRqEBQ83bYGuz4Yzfdj4bjaAEhZN/FFbsFXr5bOA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + add-stream: 1.0.0 + conventional-changelog: 3.1.25 + lodash: 4.17.23 + meow: 8.1.2 + tempfile: 3.0.0 + dev: true + + /conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.23 + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits@6.1.0: + resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} + engines: {node: '>=14'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.23 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + dev: true + + /conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + dev: true + + /conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + lodash: 4.17.23 + meow: 8.1.2 + semver: 6.3.1 + split: 1.0.1 + through2: 4.0.2 + dev: true + + /conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + dev: true + + /conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.23 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + dependencies: + browserslist: 4.28.1 + dev: true + + /core-js@3.49.0: + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} + requiresBuild: true + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.2)(typescript@5.9.3): + resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} + engines: {node: '>=v14.21.3'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=4' + dependencies: + '@types/node': 20.5.1 + cosmiconfig: 8.3.6(typescript@5.9.3) + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.3) + typescript: 5.9.3 + dev: true + + /cosmiconfig@8.3.6(typescript@5.9.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.9.3 + dev: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + + /cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + dependencies: + luxon: 3.7.2 + dev: false + + /cropperjs@1.6.2: + resolution: {integrity: sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==} + dev: false + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.6 + dev: true + + /cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + /cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: false + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + + /css-box-model@1.2.1: + resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} + dependencies: + tiny-invariant: 1.3.3 + dev: false + + /css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} + dev: true + + /css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + dependencies: + utrie: 1.0.2 + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + dev: true + + /css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + dev: true + + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: false + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: false + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: false + + /csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + /cz-git@1.12.0: + resolution: {integrity: sha512-LaZ+8whPPUOo6Y0Zy4nIbf6JOleV3ejp41sT6N4RPKiKKA+ICWf4ueeIlxIO8b6JtdlDxRzHH/EcRji07nDxcg==} + engines: {node: '>=v12.20.0'} + dev: true + + /czg@1.12.0: + resolution: {integrity: sha512-LGltcoZ5m7vhe3WNw16QXqd5WurnHegx9V15MwZJtFAU2AVCYLCqDbwxPUgZOnAcdzzooq33ONcU148HOQsjdA==} + engines: {node: '>=v12.20.0'} + hasBin: true + dev: true + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: false + + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + dev: false + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decamelize@5.0.1: + resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} + engines: {node: '>=10'} + dev: true + + /decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + dev: false + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.7 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: false + + /diagram-js-direct-editing@2.1.2(diagram-js@13.4.0): + resolution: {integrity: sha512-VpccLAnLqLF1cp3fk363QUbRVTd/qTcj2oOb+IqgcmOiWszJp7J9Ta6y5GjUvw48hDZpzCatlmWwA4CJ3MaYGQ==} + peerDependencies: + diagram-js: '*' + dependencies: + diagram-js: 13.4.0 + min-dash: 4.2.3 + min-dom: 4.2.1 + dev: false + + /diagram-js-minimap@4.1.0: + resolution: {integrity: sha512-osuQ7ETbhmlqoMU2g7OsXRYEeyXJihGbhv5WtcsSAN4vvxSrqZm7ndwXoHPV1Q1j3e2kfOuBRU2X4WUG0qewig==} + dependencies: + hammerjs: 2.0.8 + min-dash: 4.2.3 + min-dom: 4.2.1 + tiny-svg: 3.1.3 + dev: false + + /diagram-js@11.9.1: + resolution: {integrity: sha512-qhqNSCq1k4ftHMJy0czNPlA5rFyccv/TakXrDYOtSpdrPJ0zHqWzZdw9/Of5UpixxPsMkoeu6U7Ox1sXLKRp3Q==} + dependencies: + '@bpmn-io/diagram-js-ui': 0.2.3 + clsx: 1.2.1 + css.escape: 1.5.1 + didi: 9.0.2 + hammerjs: 2.0.8 + inherits-browser: 0.1.0 + min-dash: 4.2.3 + min-dom: 4.2.1 + object-refs: 0.3.0 + path-intersection: 2.2.1 + tiny-svg: 3.1.3 + dev: false + + /diagram-js@13.4.0: + resolution: {integrity: sha512-JI6UI74J3TgRcgBhuZZJso//bUdh22rcVu9XSf1EBVisKPt9c+woKzOrr/79OutXvft+1NOLNEiBg58kZ8p7+Q==} + dependencies: + '@bpmn-io/diagram-js-ui': 0.2.3 + clsx: 2.1.1 + didi: 10.2.2 + hammerjs: 2.0.8 + inherits-browser: 0.1.0 + min-dash: 4.2.3 + min-dom: 4.2.1 + object-refs: 0.4.0 + path-intersection: 3.1.0 + tiny-svg: 3.1.3 + dev: false + + /didi@10.2.2: + resolution: {integrity: sha512-l8NYkYFXV1izHI65EyT8EXOjUZtKmQkHLTT89cSP7HU5J/G7AOj0dXKtLc04EXYlga99PBY18IPjOeZ+c3DI4w==} + engines: {node: '>= 16'} + dev: false + + /didi@9.0.2: + resolution: {integrity: sha512-q2+aj+lnJcUweV7A9pdUrwFr4LHVmRPwTmQLtHPFz4aT7IBoryN6Iy+jmFku+oIzr5ebBkvtBCOb87+dJhb7bg==} + dev: false + + /diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dev: false + + /diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + + /diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + /diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + dev: false + + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + dev: false + + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.29.2 + csstype: 3.2.3 + dev: false + + /dom-scroll-into-view@2.0.1: + resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} + dev: false + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 5.0.0 + dev: false + + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domify@1.4.2: + resolution: {integrity: sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA==} + dev: false + + /domify@3.0.0: + resolution: {integrity: sha512-bs2yO68JDFOm6rKv8f0EnrM2cENduhRkpqOtt/s5l5JBA/eqGBZCzLPmdYoHtJ6utgLGgcBajFsEQbl12pT0lQ==} + engines: {node: '>=20'} + dev: false + + /dompurify@2.5.9: + resolution: {integrity: sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==} + requiresBuild: true + dev: false + optional: true + + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dev: true + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /echarts-stat@1.2.0: + resolution: {integrity: sha512-zLd7Kgs+tuTSeaK0VQEMNmnMivEkhvHIk1gpBtLzpRerfcIQ+Bd5XudOMmtwpaTc1WDZbA7d1V//iiBccR46Qg==} + dev: false + + /echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + dev: false + + /editorconfig@1.0.7: + resolution: {integrity: sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.9 + semver: 7.7.4 + dev: true + + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.9.4 + dev: true + + /electron-to-chromium@1.5.321: + resolution: {integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==} + + /element-resize-detector@1.2.4: + resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} + dependencies: + batch-processor: 1.0.0 + dev: false + + /emittery@0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.18.3 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + dev: false + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: true + optional: true + + /error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + dev: true + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-module-lexer@0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + dev: true + + /esbuild-plugin-alias@0.1.2: + resolution: {integrity: sha512-WsX0OJy8IGOsGZV+4oHEU5B6XQUpxOsZN1iSoYf9COTDbY7WXcOwd1oCLYNWUIWCExyGXSghIGq2k7sXBldxwQ==} + dev: true + + /esbuild@0.11.23: + resolution: {integrity: sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==} + hasBin: true + requiresBuild: true + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: false + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-config-prettier@8.10.2(eslint@8.57.1): + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.1 + dev: true + + /eslint-plugin-prettier@4.2.5(eslint-config-prettier@8.10.2)(eslint@8.57.1)(prettier@2.8.8): + resolution: {integrity: sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.1 + eslint-config-prettier: 8.10.2(eslint@8.57.1) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.1 + dev: true + + /eslint-plugin-vue@9.33.0(eslint@8.57.1): + resolution: {integrity: sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + eslint: 8.57.1 + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.4 + vue-eslint-parser: 9.4.3(eslint@8.57.1) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.14.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /esno@0.16.3: + resolution: {integrity: sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==} + hasBin: true + dependencies: + tsx: 3.14.0 + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: false + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /expect@27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + /fast-equals@4.0.3: + resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} + dev: false + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + dev: true + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + /fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + dependencies: + reusify: 1.1.0 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: false + + /feelers@1.5.1: + resolution: {integrity: sha512-LKIAqtScSfy55Tw62DhBcxIT3k2XnppzWrkmGfsbdad0a+TxMfaLF1CSYhoVRF5FvPAUXvor1Ux/75wtBaDYpA==} + dependencies: + '@bpmn-io/cm-theme': 0.1.0-alpha.2 + '@bpmn-io/feel-lint': 3.1.0 + '@bpmn-io/feelin': 6.1.0 + '@bpmn-io/lezer-feel': 2.3.1 + '@codemirror/autocomplete': 6.20.1 + '@codemirror/commands': 6.10.3 + '@codemirror/language': 6.12.2 + '@codemirror/lint': 6.9.5 + '@codemirror/state': 6.6.0 + '@codemirror/view': 6.40.0 + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + '@lezer/markdown': 1.6.3 + min-dom: 5.3.0 + dev: false + + /fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-entry-cache@7.0.2: + resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} + engines: {node: '>=12.0.0'} + dependencies: + flat-cache: 3.2.0 + dev: true + + /filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + dependencies: + minimatch: 5.1.9 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + dev: true + + /focus-trap@8.0.1: + resolution: {integrity: sha512-9ptSG6z51YQOstI/oN4XuVGP/03u2nh0g//qz7L6zX0i6PZiPnkcf3GenXq7N2hZnASXaMxTPpbKwdI+PFvxlw==} + dependencies: + tabbable: 6.4.0 + dev: false + + /follow-redirects@1.15.11(debug@4.4.3): + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.4.3 + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + dev: true + + /form-data@3.0.4: + resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + dev: false + + /form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + /frac@1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + dev: false + + /fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /franc-min@6.2.0: + resolution: {integrity: sha512-1uDIEUSlUZgvJa2AKYR/dmJC66v/PvGQ9mWfI9nOr/kPpMFyvswK0gPXOwpYJYiYD008PpHLkGfG58SPjQJFxw==} + dependencies: + trigram-utils: 2.0.1 + dev: false + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + dev: true + + /fs-extra@11.3.4: + resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: false + + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + dev: true + + /get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.23 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. + hasBin: true + dependencies: + meow: 8.1.2 + semver: 6.3.1 + dev: true + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@9.3.4: + resolution: {integrity: sha512-qaSc49hojMOv1EPM4EuyITjDSgSKI0rthoHnvE81tcOi1SCVndHko7auqxdQ14eiQG2NDBJBE86+2xIrbIvrbA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.7 + minipass: 4.2.8 + path-scurry: 1.11.1 + dev: true + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + dev: true + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /hammerjs@2.0.8: + resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} + engines: {node: '>=0.8.0'} + dev: false + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + dev: true + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: true + + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + dependencies: + capital-case: 1.0.4 + tslib: 2.8.1 + dev: true + + /highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /htm@3.1.1: + resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} + dev: false + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: false + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: false + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.46.1 + dev: true + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + + /html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + optional: true + + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + dev: true + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: false + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + + /iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: true + + /ids@1.0.5: + resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==} + dev: false + + /ids@3.0.2: + resolution: {integrity: sha512-t6YJP4mdC+GHF96Nbis/4FEANhP/8VWmYMvUuYpXvSdrhg5hpIVbq2XZlOA3UWTbtdwPCi0q7jEXOdHkAnqOnw==} + engines: {node: '>= 20.12'} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: false + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits-browser@0.1.0: + resolution: {integrity: sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /inquirer@9.3.8(@types/node@18.19.130): + resolution: {integrity: sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==} + engines: {node: '>=18'} + dependencies: + '@inquirer/external-editor': 1.0.3(@types/node@18.19.130) + '@inquirer/figures': 1.0.15 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + transitivePeerDependencies: + - '@types/node' + dev: true + + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + + /intro.js@7.2.0: + resolution: {integrity: sha512-qbMfaB70rOXVBceIWNYnYTpVTiZsvQh/MIkfdQbpA9di9VBfj1GigUPfcCv3aOfsbrtPcri8vTLTA4FcEDcHSQ==} + dev: false + + /is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.1.0 + dev: true + + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: false + + /is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + dev: false + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: false + + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.8 + dev: true + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + dev: true + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.20 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + dev: true + + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: false + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: false + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: false + + /istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: false + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + dev: true + + /jest-changed-files@27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.2 + dev: false + + /jest-circus@27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-cli@27.5.1(ts-node@10.9.2): + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(ts-node@10.9.2) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.2.0 + jest-config: 27.5.1(ts-node@10.9.2) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + + /jest-config@27.5.1(ts-node@10.9.2): + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.29.0 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.29.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@18.19.130)(typescript@5.9.3) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + + /jest-diff@27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: false + + /jest-docblock@27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: false + + /jest-each@27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: false + + /jest-environment-jsdom@27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + + /jest-environment-node@27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: false + + /jest-get-type@27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + + /jest-haste-map@27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.9 + '@types/node': 18.19.130 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /jest-jasmine2@27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-leak-detector@27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: false + + /jest-matcher-utils@27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: false + + /jest-message-util@27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.29.0 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: false + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + dev: false + + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: false + + /jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + + /jest-resolve-dependencies@27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-resolve@27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.11 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: false + + /jest-runner@27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.11 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + + /jest-runtime@27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.4.3 + collect-v8-coverage: 1.0.3 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-serializer@27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 18.19.130 + graceful-fs: 4.2.11 + dev: false + + /jest-snapshot@27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.28.0 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.11 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: false + + /jest-validate@27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: false + + /jest-watcher@27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.19.130 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: false + + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.19.130 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.19.130 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: false + + /jest@27.5.1(ts-node@10.9.2): + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(ts-node@10.9.2) + import-local: 3.2.0 + jest-cli: 27.5.1(ts-node@10.9.2) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + + /jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + dev: true + + /jquery@3.7.1: + resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} + + /js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: true + + /js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.7 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + dev: true + + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + dev: true + + /js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsbarcode@3.12.3: + resolution: {integrity: sha512-CuHU9hC6dPsHF5oVFMo8NW76uQVjH4L22CsP4hW+dNnGywJHC/B0ThA1CTDVLnxKLrrpYdicBLnd2xsgTfRnvg==} + dev: false + + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.16.0 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.6.0 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.4 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.23 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.10 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: true + + /jspdf@2.5.2: + resolution: {integrity: sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==} + dependencies: + '@babel/runtime': 7.29.2 + atob: 2.1.2 + btoa: 1.2.1 + fflate: 0.8.2 + optionalDependencies: + canvg: 3.0.11 + core-js: 3.49.0 + dompurify: 2.5.9 + html2canvas: 1.4.1 + dev: false + + /kdbush@4.0.2: + resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + + /known-css-properties@0.29.0: + resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} + dev: true + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /less@4.6.4: + resolution: {integrity: sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==} + engines: {node: '>=18'} + hasBin: true + dependencies: + copy-anything: 3.0.5 + parse-node-version: 1.0.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.5.0 + source-map: 0.6.1 + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /lint-staged@13.2.0: + resolution: {integrity: sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + chalk: 5.2.0 + cli-truncate: 3.1.0 + commander: 10.0.1 + debug: 4.4.3 + execa: 7.2.0 + lilconfig: 2.1.0 + listr2: 5.0.8 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-inspect: 1.13.4 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.8.3 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + + /listr2@5.0.8: + resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.4.1 + rxjs: 7.8.2 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + dev: true + + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.8.1 + dev: true + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + optional: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.7.4 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: false + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + /mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + dev: true + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + + /memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + dev: false + + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /meow@10.1.5: + resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 7.0.2 + decamelize: 5.0.1 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 8.0.0 + redent: 4.0.0 + trim-newlines: 4.1.1 + type-fest: 1.4.0 + yargs-parser: 20.2.9 + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-dash@3.8.1: + resolution: {integrity: sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==} + dev: false + + /min-dash@4.2.3: + resolution: {integrity: sha512-VLMYQI5+FcD9Ad24VcB08uA83B07OhueAlZ88jBK6PyupTvEJwllTMUqMy0wPGYs7pZUEtEEMWdHB63m3LtEcg==} + dev: false + + /min-dash@5.0.0: + resolution: {integrity: sha512-EGuoBnVL7/Fnv2sqakpX5WGmZehZ3YMmLayT7sM8E9DRU74kkeyMg4Rik1lsOkR2GbFNeBca4/L+UfU6gF0Edw==} + dev: false + + /min-dom@4.2.1: + resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==} + dependencies: + component-event: 0.2.1 + domify: 1.4.2 + min-dash: 4.2.3 + dev: false + + /min-dom@5.3.0: + resolution: {integrity: sha512-0w5FEBgPAyHhmFojW3zxd7we3D+m5XYS3E/06OyvxmbHJoiQVa4Nagj6RWvoAKYRw5xth6cP5TMePc5cR1M9hA==} + dependencies: + domify: 3.0.0 + min-dash: 5.0.0 + dev: false + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + dependencies: + brace-expansion: 1.1.12 + + /minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.2 + dev: true + + /minimatch@8.0.7: + resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.2 + dev: true + + /minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.2 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /mitt@2.1.0: + resolution: {integrity: sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==} + dev: false + + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /moddle-xml@10.1.0: + resolution: {integrity: sha512-erWckwLt+dYskewKXJso9u+aAZ5172lOiYxSOqKCPTy7L/xmqH1PoeoA7eVC7oJTt3PqF5TkZzUmbjGH6soQBg==} + dependencies: + min-dash: 4.2.3 + moddle: 6.2.3 + saxen: 8.1.2 + dev: false + + /moddle@6.2.3: + resolution: {integrity: sha512-bLVN+ZHL3aKnhxc19XtjUfvdJsS3EsiEJC7bT6YPD11qYmTzvsxrGgyYz1Ouof7TZuGw0lDJ1OLmEnxcpQWk3Q==} + dependencies: + min-dash: 4.2.3 + dev: false + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /monaco-editor@0.38.0: + resolution: {integrity: sha512-11Fkh6yzEmwx7O0YoLxeae0qEGFwmyPRlVxpg7oF9czOOCB/iCjdJrG5I67da5WiXK3YJCxoz9TJFE8Tfq/v9A==} + dev: false + + /monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + dev: false + + /mousetrap@1.6.5: + resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + dev: true + + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /n-gram@2.0.2: + resolution: {integrity: sha512-S24aGsn+HLBxUGVAUFOwGpKs7LBcG4RudKU//eWzt/mQ97/NMKQxDWHyHx63UNWk/OOdihgmzoETn1tf5nQDzQ==} + dev: false + + /nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanoid@5.0.9: + resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} + engines: {node: ^18 || >=20} + hasBin: true + dev: false + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /nanopop@2.4.2: + resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} + dev: false + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /needle@3.5.0: + resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + sax: 1.6.0 + dev: true + optional: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + dependencies: + css-select: 4.3.0 + he: 1.2.0 + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: false + + /node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + + /nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.11 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.7.4 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.6 + memorystream: 0.3.1 + minimatch: 3.1.5 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.3 + string.prototype.padend: 3.1.6 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /numeral@2.0.6: + resolution: {integrity: sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==} + dev: false + + /numfmt@2.5.2: + resolution: {integrity: sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==} + dev: false + + /nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + dev: false + + /nzh@1.0.14: + resolution: {integrity: sha512-wKgaqCSZdrySvB4RWop5g+v6IDv2IErsT6rjq06Bg0yiT9hiHYZO12GMGx/xweGVLcO2lDjX5RqWD0S/Jy9z5Q==} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object-refs@0.3.0: + resolution: {integrity: sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ==} + dev: false + + /object-refs@0.4.0: + resolution: {integrity: sha512-6kJqKWryKZmtte6QYvouas0/EIJKPI1/MMIuRsiBlNuhIMfqYTggzX2F1AJ2+cDs288xyi9GL7FyasHINR98BQ==} + dev: false + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /opentype.js@1.3.4: + resolution: {integrity: sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + string.prototype.codepointat: 0.2.1 + tiny-inflate: 1.0.3 + dev: false + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /ot-json1@1.0.2: + resolution: {integrity: sha512-IhxkqVWQqlkWULoi/Q2AdzKk0N5vQRbUMUwubFXFCPcY4TsOZjmp2YKrk0/z1TeiECPadWEK060sdFdQ3Grokg==} + dependencies: + ot-text-unicode: 4.0.0 + dev: false + + /ot-text-unicode@4.0.0: + resolution: {integrity: sha512-W7ZLU8QXesY2wagYFv47zErXud3E93FGImmSGJsQnBzE+idcPPyo2u2KMilIrTwBh4pbCizy71qRjmmV6aDhcQ==} + dependencies: + unicount: 1.1.0 + dev: false + + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + dev: true + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.4 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-intersection@2.2.1: + resolution: {integrity: sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==} + dev: false + + /path-intersection@3.1.0: + resolution: {integrity: sha512-3xS3lvv/vuwm5aH2BVvNRvnvwR2Drde7jQClKpCXTYXIMMjcw/EnMhzCgeHwqbCpzi760PEfAkU53vSIlrNr9A==} + engines: {node: '>= 14.20'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + dev: true + + /path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + dev: false + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + dev: true + + /pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + dev: true + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: false + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + dev: true + + /pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + requiresBuild: true + dev: true + optional: true + + /pinia@2.3.1(typescript@5.9.3)(vue@3.5.30): + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/devtools-api': 6.6.4 + typescript: 5.9.3 + vue: 3.5.30(typescript@5.9.3) + vue-demi: 0.14.10(vue@3.5.30) + transitivePeerDependencies: + - '@vue/composition-api' + dev: false + + /pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + dev: false + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + dev: false + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: true + + /postcss-html@1.8.1: + resolution: {integrity: sha512-OLF6P7qctfAWayOhLpcVnTGqVeJzu2W3WpIYelfz2+JV5oGxfkcEvweN9U4XpeqE0P98dcD9ssusGwlF0TK0uQ==} + engines: {node: ^12 || >=14} + dependencies: + htmlparser2: 8.0.2 + js-tokens: 9.0.1 + postcss: 8.5.8 + postcss-safe-parser: 6.0.0(postcss@8.5.8) + dev: true + + /postcss-less@6.0.0(postcss@8.5.8): + resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==} + engines: {node: '>=12'} + peerDependencies: + postcss: ^8.3.5 + dependencies: + postcss: 8.5.8 + dev: true + + /postcss-prefix-selector@1.16.1(postcss@5.2.18): + resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==} + peerDependencies: + postcss: '>4 <9' + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + dev: true + + /postcss-safe-parser@6.0.0(postcss@8.5.8): + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + dependencies: + postcss: 8.5.8 + dev: true + + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-sorting@8.0.2(postcss@8.5.8): + resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} + peerDependencies: + postcss: ^8.4.20 + dependencies: + postcss: 8.5.8 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + dev: true + + /postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + /posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + dev: true + + /posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + dev: true + + /posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /preact@10.12.1: + resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} + dev: false + + /preact@10.29.0: + resolution: {integrity: sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==} + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: false + + /print-js@1.6.0: + resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==} + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + + /protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.19.130 + long: 5.3.2 + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + requiresBuild: true + dev: true + optional: true + + /psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + dependencies: + punycode: 2.3.1 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + dev: true + + /qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + + /qs@6.15.0: + resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: false + + /query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /quickselect@3.0.0: + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + dev: false + + /raf-schd@4.0.3: + resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} + dev: false + + /raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + dependencies: + performance-now: 2.1.0 + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rbush@4.0.1: + resolution: {integrity: sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==} + dependencies: + quickselect: 3.0.0 + dev: false + + /rc-dialog@9.6.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-dropdown@4.2.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/trigger': 2.3.1(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-input-number@9.5.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/mini-decimal': 1.1.3 + classnames: 2.5.1 + rc-input: 1.8.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-input@1.8.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-menu@9.16.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/trigger': 2.3.1(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.5.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-motion@2.9.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-notification@5.6.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-overflow@1.5.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-picker@4.11.3(dayjs@1.11.20)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==} + engines: {node: '>=8.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/trigger': 2.3.1(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + dayjs: 1.11.20 + rc-overflow: 1.5.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-resize-observer@1.4.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + resize-observer-polyfill: 1.5.1 + dev: false + + /rc-segmented@2.7.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-izj1Nw/Dw2Vb7EVr+D/E9lUTkBe+kKC+SAFSU9zqr7WV2W5Ktaa9Gc7cB2jTqgk8GROJayltaec+DBlYKc6d+g==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-select@14.16.8(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/trigger': 2.3.1(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.5.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.19.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-textarea@1.10.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-input: 1.8.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /rc-util@5.44.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + dev: false + + /rc-virtual-list@3.19.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-beautiful-dnd@13.1.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==} + deprecated: 'react-beautiful-dnd is now deprecated. Context and options: https://github.com/atlassian/react-beautiful-dnd/issues/2672' + peerDependencies: + react: ^16.8.5 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.29.2 + css-box-model: 1.2.1 + memoize-one: 5.2.1 + raf-schd: 4.0.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-redux: 7.2.9(react-dom@18.3.1)(react@18.3.1) + redux: 4.2.1 + use-memo-one: 1.1.3(react@18.3.1) + transitivePeerDependencies: + - react-native + dev: false + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + dev: false + + /react-draggable@4.5.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-grid-layout@1.5.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KaG6IbjD6fYhagUtIvOzhftXG+ViKZjCjADe86X1KHl7C/dsBN2z0mi14nbvZKTkp0RKiil9RPcJBgq3LnoA8g==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 2.1.1 + fast-equals: 4.0.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-draggable: 4.5.0(react-dom@18.3.1)(react@18.3.1) + react-resizable: 3.1.3(react-dom@18.3.1)(react@18.3.1) + resize-observer-polyfill: 1.5.1 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: false + + /react-redux@7.2.9(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} + peerDependencies: + react: ^16.8.3 || ^17 || ^18 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.29.2 + '@types/react-redux': 7.1.34 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 17.0.2 + dev: false + + /react-resizable@3.1.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-liJBNayhX7qA4tBJiBD321FDhJxgGTJ07uzH5zSORXoE8h7PyEZ8mLqmosST7ppf6C4zUsbd2gzDMmBCfFp9Lw==} + peerDependencies: + react: '>= 16.3' + react-dom: '>= 16.3' + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-draggable: 4.5.0(react-dom@18.3.1)(react@18.3.1) + dev: false + + /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.29.2 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg-up@8.0.0: + resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} + engines: {node: '>=12'} + dependencies: + find-up: 5.0.0 + read-pkg: 6.0.0 + type-fest: 1.4.0 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-pkg@6.0.0: + resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} + engines: {node: '>=12'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 1.4.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /reconnecting-websocket@4.4.0: + resolution: {integrity: sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==} + dev: false + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + dependencies: + indent-string: 5.0.0 + strip-indent: 4.1.1 + dev: true + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.29.2 + dev: false + + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + + /regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexp-util@2.0.3: + resolution: {integrity: sha512-GP6h9OgJmhAZpb3dbNbXTfRWVnGcoMhWRZv/HxgM4/qCVqs1P9ukQdYxaUhjWBSAs9oJ/uPXUUvGT1VMe0Bs0Q==} + engines: {node: '>=16'} + dev: false + + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + dev: true + + /regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + dev: true + + /regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + dev: true + + /regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + dependencies: + jsesc: 3.1.0 + dev: true + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: false + + /resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + dev: true + + /rgbcolor@1.0.1: + resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} + engines: {node: '>= 0.8.15'} + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 9.3.4 + dev: true + + /rollup-plugin-external-globals@0.6.1(rollup@3.30.0): + resolution: {integrity: sha512-mlp3KNa5sE4Sp9UUR2rjBrxjG79OyZAh/QC18RHIjM+iYkbBwNXSo8DHRMZWtzJTrH8GxQ+SJvCTN3i14uMXIA==} + peerDependencies: + rollup: ^2.25.0 + dependencies: + '@rollup/pluginutils': 4.2.1 + estree-walker: 2.0.2 + is-reference: 1.2.1 + magic-string: 0.25.9 + rollup: 3.30.0 + dev: true + + /rollup-plugin-purge-icons@0.9.1: + resolution: {integrity: sha512-hRDKBsPUz47UMdBufki2feTmBF2ClEJlYqL7N6vpVAHSLd7V2BJUaNKOF7YYbLMofVVF+9hm44YSkYO6k9hUgg==} + engines: {node: '>= 12'} + dependencies: + '@purge-icons/core': 0.9.1 + '@purge-icons/generated': 0.9.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /rollup-plugin-terser@7.0.2(rollup@2.80.0): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.29.0 + jest-worker: 26.6.2 + rollup: 2.80.0 + serialize-javascript: 4.0.0 + terser: 5.46.1 + dev: true + + /rollup-plugin-visualizer@5.14.0(rollup@3.30.0): + resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 4.0.3 + rollup: 3.30.0 + source-map: 0.7.6 + yargs: 17.7.2 + dev: true + + /rollup@2.80.0: + resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup@3.30.0: + resolution: {integrity: sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + dependencies: + tslib: 2.8.1 + + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + dev: true + + /saxen@8.1.2: + resolution: {integrity: sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==} + dev: false + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: false + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + dependencies: + compute-scroll-into-view: 1.0.20 + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 + dev: true + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /shallow-equal@1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} + dev: false + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + dev: true + + /showdown@2.1.0: + resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==} + hasBin: true + dependencies: + commander: 9.5.0 + dev: false + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /simple-uploader.js@0.6.0: + resolution: {integrity: sha512-EXN+o+LD6PVnfzTq/usP8k8yYrI6wKrAx8e+fPcPLVzzttonkyn1KT+Ycx5JnPBSnp6lpiVhNG4JhDJucdPnhA==} + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 4.0.0 + dev: true + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-client: 6.6.4 + socket.io-parser: 4.2.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.6: + resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: false + + /sortablejs@1.14.0: + resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==} + dev: false + + /sortablejs@1.15.7: + resolution: {integrity: sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==} + dev: false + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + dependencies: + whatwg-url: 7.1.0 + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + dev: false + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + dev: true + + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + dev: true + + /spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /ssf@0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + dependencies: + frac: 1.1.2 + dev: false + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: false + + /stackblur-canvas@2.7.0: + resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==} + engines: {node: '>=0.1.14'} + dev: false + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + dev: true + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + dev: true + + /string.prototype.codepointat@0.2.1: + resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + dev: false + + /string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + dev: true + + /string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + dev: true + + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.2.2 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: false + + /strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + dev: false + + /style-search@0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + dev: true + + /stylelint-config-html@1.1.0(postcss-html@1.8.1)(stylelint@15.11.0): + resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: 1.8.1 + stylelint: 15.11.0(typescript@5.9.3) + dev: true + + /stylelint-config-prettier@9.0.5(stylelint@15.11.0): + resolution: {integrity: sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==} + engines: {node: '>= 12'} + hasBin: true + peerDependencies: + stylelint: '>= 11.x < 15' + dependencies: + stylelint: 15.11.0(typescript@5.9.3) + dev: true + + /stylelint-config-recommended-vue@1.6.1(postcss-html@1.8.1)(stylelint@15.11.0): + resolution: {integrity: sha512-lLW7hTIMBiTfjenGuDq2kyHA6fBWd/+Df7MO4/AWOxiFeXP9clbpKgg27kHfwA3H7UNMGC7aeP3mNlZB5LMmEQ==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: 1.8.1 + semver: 7.7.4 + stylelint: 15.11.0(typescript@5.9.3) + stylelint-config-html: 1.1.0(postcss-html@1.8.1)(stylelint@15.11.0) + stylelint-config-recommended: 11.0.0(stylelint@15.11.0) + dev: true + + /stylelint-config-recommended@11.0.0(stylelint@15.11.0): + resolution: {integrity: sha512-SoGIHNI748OCZn6BxFYT83ytWoYETCINVHV3LKScVAWQQauWdvmdDqJC5YXWjpBbxg2E761Tg5aUGKLFOVhEkA==} + peerDependencies: + stylelint: ^15.3.0 + dependencies: + stylelint: 15.11.0(typescript@5.9.3) + dev: true + + /stylelint-config-standard@32.0.0(stylelint@15.11.0): + resolution: {integrity: sha512-UnGJxYDyYFrIE9CjDMZRkrNh2o4lOtO+MVZ9qG5b8yARfsWho0GMx4YvhHfsv8zKKgHeWX2wfeyxmuoqcaYZ4w==} + peerDependencies: + stylelint: ^15.4.0 + dependencies: + stylelint: 15.11.0(typescript@5.9.3) + stylelint-config-recommended: 11.0.0(stylelint@15.11.0) + dev: true + + /stylelint-order@6.0.4(stylelint@15.11.0): + resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 + dependencies: + postcss: 8.5.8 + postcss-sorting: 8.0.2(postcss@8.5.8) + stylelint: 15.11.0(typescript@5.9.3) + dev: true + + /stylelint@15.11.0(typescript@5.9.3): + resolution: {integrity: sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1) + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 8.3.6(typescript@5.9.3) + css-functions-list: 3.3.3 + css-tree: 2.3.1 + debug: 4.4.3 + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 7.0.2 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.3.2 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.29.0 + mathml-tag-names: 2.1.3 + meow: 10.1.5 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.8 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 6.0.0(postcss@8.5.8) + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + supports-hyperlinks: 3.2.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + dev: false + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: false + + /supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.1(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.11 + transitivePeerDependencies: + - supports-color + dev: true + + /svg-pathdata@6.0.3: + resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} + engines: {node: '>=12.0.0'} + dev: false + + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true + + /svgo@2.8.2: + resolution: {integrity: sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + sax: 1.6.0 + stable: 0.1.8 + dev: true + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: false + + /tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + dev: false + + /table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.18.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tailwind-merge@2.6.1: + resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==} + dev: false + + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: true + + /tempfile@3.0.0: + resolution: {integrity: sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==} + engines: {node: '>=8'} + dependencies: + temp-dir: 2.0.0 + uuid: 3.4.0 + dev: true + + /tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: false + + /terser@5.46.1: + resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.5 + dev: false + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + dependencies: + utrie: 1.0.2 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: false + + /throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + dev: false + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + dev: false + + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: false + + /tiny-svg@3.1.3: + resolution: {integrity: sha512-9mwnPqXInRsBmH/DO6NMxBE++9LsqpVXQSSTZGc5bomoKKvL5OX/Hlotw7XVXP6XLRcHWIzZpxfovGqWKgCypQ==} + dev: false + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: true + + /tinymce@5.10.9: + resolution: {integrity: sha512-5bkrors87X9LhYX2xq8GgPHrIgJYHl87YNs+kBcjQ5I3CiUgzo/vFcGvT3MZQ9QHsEeYMhYO6a5CLGGffR8hMg==} + dev: false + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: false + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.1 + dev: false + + /traverse@0.6.11: + resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} + engines: {node: '>= 0.4'} + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.20 + dev: true + + /trigram-utils@2.0.1: + resolution: {integrity: sha512-nfWIXHEaB+HdyslAfMxSqWKDdmqY9I32jS7GnqpdWQnLH89r6A5sdk3fDVYqGAZ0CrT8ovAFSAo6HRiWcWNIGQ==} + dependencies: + collapse-white-space: 2.1.0 + n-gram: 2.0.2 + dev: false + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + dev: true + + /ts-node@10.9.2(@types/node@18.19.130)(typescript@5.9.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.19.130 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + /ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.5.1 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + dev: false + + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + /tsutils@3.21.0(typescript@5.9.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.9.3 + dev: true + + /tsx@3.14.0: + resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==} + hasBin: true + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.13.7 + source-map-support: 0.5.21 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: false + + /type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + dev: true + + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false + + /typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + dev: true + + /typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + /uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + dev: true + + /unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + dev: true + + /unicode-regex@4.2.0: + resolution: {integrity: sha512-fEYz7CCnvHDAdrb8OYAP7qlQCWzXBO5cHXQ3XI+HoZaBpiAwyC6b2nixMGl91yrDYEIRm7NDskgTvnLZ7mqrKQ==} + engines: {node: '>=16'} + dependencies: + regexp-util: 2.0.3 + dev: false + + /unicount@1.1.0: + resolution: {integrity: sha512-RlwWt1ywVW4WErPGAVHw/rIuJ2+MxvTME0siJ6lk9zBhpDfExDbspe6SRlWT3qU6AucNjotPl9qAJRVjP7guCQ==} + dev: false + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.2.3(browserslist@4.28.1): + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.8.1 + dev: true + + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + dependencies: + tslib: 2.8.1 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /use-memo-one@1.1.3(react@18.3.1): + resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.3.1 + dev: false + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /v-code-diff@1.13.1(vue@3.5.30): + resolution: {integrity: sha512-9LTV1dZhC1oYTntyB94vfumGgsfIX5u0fEDSI2Txx4vCE5sI5LkgeLJRRy2SsTVZmDcV+R73sBr0GpPn0TJxMw==} + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.4.9 + vue: ^2.6.0 || >=3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + diff: 5.2.2 + diff-match-patch: 1.0.5 + highlight.js: 11.11.1 + vue: 3.5.30(typescript@5.9.3) + vue-demi: 0.14.10(vue@3.5.30) + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + /v8-to-istanbul@8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 1.9.0 + source-map: 0.7.6 + dev: false + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vditor@3.11.2: + resolution: {integrity: sha512-8QguQQUPWbBFocnfQmWjz4jiykQnvsmCuhOomGIVVK7vc+dQq2h8w9qQQuEjUTZpnZT5fEdYbj4aLr1NGdAZaA==} + dependencies: + diff-match-patch: 1.0.5 + dev: false + + /vite-plugin-cdn-import@0.3.5(rollup@3.30.0): + resolution: {integrity: sha512-e1raoalfBiIhv+hnMeSp1UNjloDDBhHpeFxkwRRdPBmTdDRqdEEn8owUmT5u8UBSVCs4xN3n/od4a91vXEhXPQ==} + dependencies: + rollup-plugin-external-globals: 0.6.1(rollup@3.30.0) + transitivePeerDependencies: + - rollup + dev: true + + /vite-plugin-compression@0.5.1(vite@4.5.14): + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + chalk: 4.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-html@3.2.2(vite@4.5.14): + resolution: {integrity: sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + colorette: 2.0.20 + connect-history-api-fallback: 1.6.0 + consola: 2.15.3 + dotenv: 16.6.1 + dotenv-expand: 8.0.3 + ejs: 3.1.10 + fast-glob: 3.3.3 + fs-extra: 10.1.0 + html-minifier-terser: 6.1.0 + node-html-parser: 5.4.2 + pathe: 0.2.0 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + dev: true + + /vite-plugin-mkcert@1.17.10(vite@4.5.14): + resolution: {integrity: sha512-703hecAoGZYgNrkY76OIbo0M9j0tfGIIM6n7c0sYvhaczQMPwD0nFi+bS44d8kwdbCtV7885FYBWnTzhsaC7QQ==} + engines: {node: '>=v16.7.0'} + peerDependencies: + vite: '>=3' + dependencies: + axios: 1.13.6(debug@4.4.3) + debug: 4.4.3 + picocolors: 1.1.1 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-purge-icons@0.9.2(vite@4.5.14): + resolution: {integrity: sha512-vxJEMyNyckqLr/4HPsW9P6BMLUvOVMvjjFz3jLl4Wke1KWE8ITJUxIUwodxaOmEp9L2lxVk5an3TYeycZCfqFw==} + engines: {node: '>= 12'} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + '@purge-icons/core': 0.9.1 + '@purge-icons/generated': 0.9.0 + rollup-plugin-purge-icons: 0.9.1 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /vite-plugin-pwa@0.14.7(vite@4.5.14)(workbox-build@6.6.0)(workbox-window@6.6.0): + resolution: {integrity: sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==} + peerDependencies: + vite: ^3.1.0 || ^4.0.0 + workbox-build: ^6.5.4 + workbox-window: ^6.5.4 + dependencies: + '@rollup/plugin-replace': 5.0.7(rollup@3.30.0) + debug: 4.4.3 + fast-glob: 3.3.3 + pretty-bytes: 6.1.1 + rollup: 3.30.0 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + workbox-build: 6.6.0 + workbox-window: 6.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-style-import@2.0.0(vite@4.5.14): + resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + change-case: 4.1.2 + console: 0.7.2 + es-module-lexer: 0.9.3 + fs-extra: 10.1.0 + magic-string: 0.25.9 + pathe: 0.2.0 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + dev: true + + /vite-plugin-svg-icons@2.0.1(vite@4.5.14): + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.6 + debug: 4.4.3 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.2 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-vue-setup-extend@0.4.0(vite@4.5.14): + resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@vue/compiler-sfc': 3.5.30 + magic-string: 0.25.9 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + dev: true + + /vite-plugin-windicss@1.9.4(vite@4.5.14): + resolution: {integrity: sha512-3t1AUVrs2XBXGc2BefRPRvy1CLy8qA/5A1J1Z73Ej1DIx+puXn39MQSWluxZ2FHEz8z9OEIvsoIIPc/s/P3OmQ==} + peerDependencies: + vite: '*' + dependencies: + '@windicss/plugin-utils': 1.9.4 + debug: 4.4.3 + kolorist: 1.8.0 + vite: 4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1) + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /vite@4.5.14(@types/node@18.19.130)(less@4.6.4)(terser@5.46.1): + resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.19.130 + esbuild: 0.18.20 + less: 4.6.4 + postcss: 8.5.8 + rollup: 3.30.0 + terser: 5.46.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + dev: true + + /vue-component-type-helpers@2.2.12: + resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==} + dev: true + + /vue-demi@0.14.10(vue@3.5.30): + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.5.30(typescript@5.9.3) + dev: false + + /vue-eslint-parser@9.4.3(eslint@8.57.1): + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.4.3 + eslint: 8.57.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + lodash: 4.17.23 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-grid-layout@3.0.0-beta1(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27)(typescript@5.9.3): + resolution: {integrity: sha512-MsW0yfYNtnAO/uDhfZvkP6effxSJxvhAFbIL37x6Rn3vW9xf0WHVefKaSbQMLpSq3mXnR6ut0pg2Cd5lqIIZzg==} + dependencies: + '@interactjs/actions': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/auto-start': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + '@interactjs/dev-tools': 1.10.27(@interactjs/modifiers@1.10.27)(@interactjs/utils@1.10.27)(typescript@5.9.3) + '@interactjs/interactjs': 1.10.27(typescript@5.9.3) + '@interactjs/modifiers': 1.10.27(@interactjs/core@1.10.27)(@interactjs/utils@1.10.27) + element-resize-detector: 1.2.4 + mitt: 2.1.0 + transitivePeerDependencies: + - '@interactjs/core' + - '@interactjs/utils' + - typescript + dev: false + + /vue-i18n@9.14.5(vue@3.5.30): + resolution: {integrity: sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==} + engines: {node: '>= 16'} + deprecated: v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html + peerDependencies: + vue: ^3.0.0 + dependencies: + '@intlify/core-base': 9.14.5 + '@intlify/shared': 9.14.5 + '@vue/devtools-api': 6.6.4 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /vue-json-pretty@2.6.0(vue@3.5.30): + resolution: {integrity: sha512-glz1aBVS35EO8+S9agIl3WOQaW2cJZW192UVKTuGmryx01ZvOVWc4pR3t+5UcyY4jdOfBUgVHjcpRpcnjRhCAg==} + engines: {node: '>= 10.0.0', npm: '>= 5.0.0'} + peerDependencies: + vue: '>=3.0.0' + dependencies: + vue: 3.5.30(typescript@5.9.3) + dev: false + + /vue-plugin-hiprint@0.0.57-beta24: + resolution: {integrity: sha512-xtQAVYORPMZwkoxhPMILiDlLOyT9mH11KPH5InKXqCu6J3fz4Q60sWzut+7NDu1k8ezhK8gSC+Stdrkg9WhBIw==} + engines: {node: 16.x} + dependencies: + '@claviska/jquery-minicolors': 2.3.6(jquery@3.7.1) + '@wtto00/html2canvas': 1.4.3 + bwip-js: 4.8.0 + canvg: 3.0.11 + jquery: 3.7.1 + jsbarcode: 3.12.3 + jspdf: 2.5.2 + lodash: 4.17.23 + nzh: 1.0.14 + socket.io-client: 4.8.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /vue-router@4.6.4(vue@3.5.30): + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /vue-simple-uploader@1.0.0(vue@3.5.30): + resolution: {integrity: sha512-GRc24H4Iswa1QOtIXDmWUS541HOHIdF0kQ/K6mj0XneCGZC3bDvnkb3fQetFJjS20PvvqBqgAlY8jG3+lLmjtQ==} + engines: {node: '>= 4.0.0', npm: '>= 3.0.0'} + peerDependencies: + vue: '>=3.1' + dependencies: + simple-uploader.js: 0.6.0 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /vue-tsc@2.2.12(typescript@5.9.3): + resolution: {integrity: sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + dependencies: + '@volar/typescript': 2.4.15 + '@vue/language-core': 2.2.12(typescript@5.9.3) + typescript: 5.9.3 + dev: true + + /vue-types@3.0.2(vue@3.5.30): + resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} + engines: {node: '>=10.15.0'} + peerDependencies: + vue: ^3.0.0 + dependencies: + is-plain-object: 3.0.1 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /vue-types@5.1.3(vue@3.5.30): + resolution: {integrity: sha512-3Wy6QcZl0VusCCHX3vYrWSILFlrOB2EQDoySnuYmASM5cUp1FivJGfkS5lp1CutDgyRb41g32r/1QCmiBj5i1Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + vue: ^2.0.0 || ^3.0.0 + peerDependenciesMeta: + vue: + optional: true + dependencies: + is-plain-object: 5.0.0 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /vue3-draggable-resizable@1.6.5: + resolution: {integrity: sha512-31142E31fGNnq3HKqvmFLSsqIbhck7TyGuQWhUKrDw6DOcGAuRx4ddRjaxvT6fe7dgeKH53qAh+i0ZlWtPLl2g==} + dev: false + + /vue3-tree-org@4.2.2(vue@3.5.30): + resolution: {integrity: sha512-AG2SykyD6dw0jIyqBm8iuF9j9GWli6KrwudxR1RjULCCBTDFsoNm7MmP/weKT7wowN/sPk+e2RsnvEJMw2OJMw==} + peerDependencies: + vue: ^3.0.0 + dependencies: + core-js: 3.49.0 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /vue@3.5.30(typescript@5.9.3): + resolution: {integrity: sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.5.30 + '@vue/compiler-sfc': 3.5.30 + '@vue/runtime-dom': 3.5.30 + '@vue/server-renderer': 3.5.30(vue@3.5.30) + '@vue/shared': 3.5.30 + typescript: 5.9.3 + + /vuedraggable@4.1.0(vue@3.5.30): + resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==} + peerDependencies: + vue: ^3.0.1 + dependencies: + sortablejs: 1.14.0 + vue: 3.5.30(typescript@5.9.3) + dev: false + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: false + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: false + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: false + + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: false + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: false + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: false + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.23 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: false + + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + dev: true + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + + /which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /windicss@3.5.6: + resolution: {integrity: sha512-P1mzPEjgFMZLX0ZqfFht4fhV/FX8DTG7ERG1fBLiWvd34pTLVReS5CVsewKn9PApSgXnVfPWwvq+qUsRwpnwFA==} + engines: {node: '>= 12'} + hasBin: true + dev: true + + /wmf@1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /word@0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /workbox-background-sync@6.6.0: + resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} + dependencies: + idb: 7.1.1 + workbox-core: 6.6.0 + dev: true + + /workbox-broadcast-update@6.6.0: + resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-build@6.6.0: + resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.18.0) + '@babel/core': 7.29.0 + '@babel/preset-env': 7.29.2(@babel/core@7.29.0) + '@babel/runtime': 7.29.2 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.0)(rollup@2.80.0) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.80.0) + '@rollup/plugin-replace': 2.4.2(rollup@2.80.0) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.18.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.23 + pretty-bytes: 5.6.0 + rollup: 2.80.0 + rollup-plugin-terser: 7.0.2(rollup@2.80.0) + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 6.6.0 + workbox-broadcast-update: 6.6.0 + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-google-analytics: 6.6.0 + workbox-navigation-preload: 6.6.0 + workbox-precaching: 6.6.0 + workbox-range-requests: 6.6.0 + workbox-recipes: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + workbox-streams: 6.6.0 + workbox-sw: 6.6.0 + workbox-window: 6.6.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + + /workbox-cacheable-response@6.6.0: + resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} + deprecated: workbox-background-sync@6.6.0 + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-core@6.6.0: + resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} + dev: true + + /workbox-expiration@6.6.0: + resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} + dependencies: + idb: 7.1.1 + workbox-core: 6.6.0 + dev: true + + /workbox-google-analytics@6.6.0: + resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained + dependencies: + workbox-background-sync: 6.6.0 + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: true + + /workbox-navigation-preload@6.6.0: + resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-precaching@6.6.0: + resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: true + + /workbox-range-requests@6.6.0: + resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-recipes@6.6.0: + resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} + dependencies: + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-precaching: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: true + + /workbox-routing@6.6.0: + resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-strategies@6.6.0: + resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} + dependencies: + workbox-core: 6.6.0 + dev: true + + /workbox-streams@6.6.0: + resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + dev: true + + /workbox-sw@6.6.0: + resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} + dev: true + + /workbox-window@6.6.0: + resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 6.6.0 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: false + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xlsx@0.18.5: + resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + adler-32: 1.3.1 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + dev: false + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: false + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: false + + /xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + dev: true + + /zeebe-bpmn-moddle@1.12.0: + resolution: {integrity: sha512-wYKfgdV5suCNx4IVaq0qOjHRxSQ5XOkxfwC8EBHuGCtmEVk8zv1VRg0opV0kVQe89jvRH3iF3Yl/DoB6qiCV5Q==} + dev: false + + /zero-bpmn@1.1.1(@bpmn-io/properties-panel@3.40.4)(camunda-bpmn-js-behaviors@1.14.1)(typescript@5.9.3): + resolution: {integrity: sha512-QrL6NM3xEfAk0OjnSGfPF4N90y+HrBeb0mKLAn7nuwJJ8Zxpm/aFc5IgJElIIaDZ7970DdyAhGTEcpntmeikfQ==} + dependencies: + '@ant-design/icons-vue': 7.0.1(vue@3.5.30) + ant-design-vue: 4.2.6(vue@3.5.30) + bpmn-js: 16.3.2 + bpmn-js-properties-panel: 5.7.0(@bpmn-io/properties-panel@3.40.4)(bpmn-js@16.3.2)(camunda-bpmn-js-behaviors@1.14.1)(diagram-js@11.9.1) + camunda-bpmn-moddle: 6.1.2(bpmn-js@16.3.2)(diagram-js@11.9.1) + diagram-js: 11.9.1 + diagram-js-minimap: 4.1.0 + inherits-browser: 0.1.0 + lodash-es: 4.17.23 + min-dash: 4.2.3 + min-dom: 4.2.1 + tiny-svg: 3.1.3 + vue: 3.5.30(typescript@5.9.3) + transitivePeerDependencies: + - '@bpmn-io/properties-panel' + - camunda-bpmn-js-behaviors + - typescript + dev: false + + /zero-univer@1.1.2(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3): + resolution: {integrity: sha512-nNQVTlQkN3IFHKz2sCjp5+3RnMJ5gJVAy3WLjyoSabHw6k6pujoPjkI4BFl3CeQRP1xgNdco33sZeI1IW5RGEg==} + dependencies: + '@univerjs-pro/engine-pivot': 0.5.5 + '@univerjs-pro/sheets-pivot': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/core': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/data-validation': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/design': 0.5.5(react-dom@18.3.1)(react@18.3.1) + '@univerjs/docs': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/docs-drawing-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/docs-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/engine-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/facade': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/find-replace': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/icons': 0.2.14(react-dom@18.3.1)(react@18.3.1) + '@univerjs/protocol': 0.1.43(@grpc/grpc-js@1.14.3)(rxjs@7.8.2) + '@univerjs/sheets': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-crosshair-highlight': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-data-validation': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-data-validation-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-drawing': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-drawing-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-filter': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-filter-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-find-replace': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-formula': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-hyper-link': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-numfmt': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-numfmt-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-sort': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-sort-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-thread-comment': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-thread-comment-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/sheets-zen-editor': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/thread-comment': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/ui': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/uniscript': 0.5.5(@grpc/grpc-js@1.14.3)(react-dom@18.3.1)(react@18.3.1)(rxjs@7.8.2)(typescript@5.9.3) + '@univerjs/watermark': 0.5.5(@grpc/grpc-js@1.14.3)(react@18.3.1)(rxjs@7.8.2) + ant-design-vue: 4.2.6(vue@3.5.30) + echarts: 5.6.0 + pinia: 2.3.1(typescript@5.9.3)(vue@3.5.30) + vue: 3.5.30(typescript@5.9.3) + transitivePeerDependencies: + - '@grpc/grpc-js' + - '@vue/composition-api' + - date-fns + - luxon + - moment + - react + - react-dom + - react-native + - rxjs + - typescript + dev: false + + /zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + dependencies: + tslib: 2.3.0 + dev: false diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..a47ef4f --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {}, + }, +}; diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..4003b36 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,13 @@ +module.exports = { + printWidth: 160, + semi: true, + vueIndentScriptAndStyle: true, + singleQuote: true, + trailingComma: 'all', + proseWrap: 'never', + htmlWhitespaceSensitivity: 'strict', + endOfLine: 'auto', + bracketSameLine: true, + jsxBracketSameLine: true, + arrowParens: 'avoid', +}; diff --git a/public/cdn/socials/dingtalk.png b/public/cdn/socials/dingtalk.png new file mode 100644 index 0000000..fe0b109 Binary files /dev/null and b/public/cdn/socials/dingtalk.png differ diff --git a/public/cdn/socials/feishu.png b/public/cdn/socials/feishu.png new file mode 100644 index 0000000..110b6ac Binary files /dev/null and b/public/cdn/socials/feishu.png differ diff --git a/public/cdn/socials/gitHub.png b/public/cdn/socials/gitHub.png new file mode 100644 index 0000000..e56677c Binary files /dev/null and b/public/cdn/socials/gitHub.png differ diff --git a/public/cdn/socials/qq.png b/public/cdn/socials/qq.png new file mode 100644 index 0000000..3f358d8 Binary files /dev/null and b/public/cdn/socials/qq.png differ diff --git a/public/cdn/socials/wechat_open.png b/public/cdn/socials/wechat_open.png new file mode 100644 index 0000000..08e2a29 Binary files /dev/null and b/public/cdn/socials/wechat_open.png differ diff --git a/public/cdn/socials/wxWork.png b/public/cdn/socials/wxWork.png new file mode 100644 index 0000000..ef9da21 Binary files /dev/null and b/public/cdn/socials/wxWork.png differ diff --git a/public/css/fonts/ym-custom/iconfont.css b/public/css/fonts/ym-custom/iconfont.css new file mode 100644 index 0000000..62844d7 --- /dev/null +++ b/public/css/fonts/ym-custom/iconfont.css @@ -0,0 +1,7203 @@ +@font-face { + font-family: "ym-custom"; + /* Project id 2016749 */ + src: url('iconfont.woff2?t=1620963811584') format('woff2'), + url('iconfont.woff?t=1620963811584') format('woff'), + url('iconfont.ttf?t=1620963811584') format('truetype'); +} + +.ym-custom { + font-family: "ym-custom" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.ym-custom-battery-charging-3:before { + content: "\e6a2"; +} + +.ym-custom-cloud-print-outline:before { + content: "\e7a2"; +} + +.ym-custom-filter-outline:before { + content: "\e8a2"; +} + +.ym-custom-instapaper:before { + content: "\e9a2"; +} + +.ym-custom-package-variant-closed:before { + content: "\eaa2"; +} + +.ym-custom-signal-g2:before { + content: "\eba2"; +} + +.ym-custom-view-module:before { + content: "\eca2"; +} + +.ym-custom-battery-charging-4:before { + content: "\e6a3"; +} + +.ym-custom-cloud-upload:before { + content: "\e7a3"; +} + +.ym-custom-filter-variant:before { + content: "\e8a3"; +} + +.ym-custom-invert-colors:before { + content: "\e9a3"; +} + +.ym-custom-page-first:before { + content: "\eaa3"; +} + +.ym-custom-signal-hspa:before { + content: "\eba3"; +} + +.ym-custom-view-parallel:before { + content: "\eca3"; +} + +.ym-custom-battery-charging-5:before { + content: "\e6a4"; +} + +.ym-custom-cloud-sync:before { + content: "\e7a4"; +} + +.ym-custom-fish:before { + content: "\e8a4"; +} + +.ym-custom-itunes:before { + content: "\e9a4"; +} + +.ym-custom-palette:before { + content: "\eaa4"; +} + +.ym-custom-signal-hspa-plus:before { + content: "\eba4"; +} + +.ym-custom-view-quilt:before { + content: "\eca4"; +} + +.ym-custom-battery-charging-6:before { + content: "\e6a5"; +} + +.ym-custom-code-array:before { + content: "\e7a5"; +} + +.ym-custom-flag:before { + content: "\e8a5"; +} + +.ym-custom-internet-explorer:before { + content: "\e9a5"; +} + +.ym-custom-page-last:before { + content: "\eaa5"; +} + +.ym-custom-signal-variant:before { + content: "\eba5"; +} + +.ym-custom-view-stream:before { + content: "\eca5"; +} + +.ym-custom-battery-minus:before { + content: "\e6a6"; +} + +.ym-custom-code-brackets:before { + content: "\e7a6"; +} + +.ym-custom-firefox:before { + content: "\e8a6"; +} + +.ym-custom-jeepney:before { + content: "\e9a6"; +} + +.ym-custom-palette-advanced:before { + content: "\eaa6"; +} + +.ym-custom-silverware-fork:before { + content: "\eba6"; +} + +.ym-custom-view-sequential:before { + content: "\eca6"; +} + +.ym-custom-battery-outline:before { + content: "\e6a7"; +} + +.ym-custom-code-braces:before { + content: "\e7a7"; +} + +.ym-custom-fingerprint:before { + content: "\e8a7"; +} + +.ym-custom-jira:before { + content: "\e9a7"; +} + +.ym-custom-panda:before { + content: "\eaa7"; +} + +.ym-custom-sign-caution:before { + content: "\eba7"; +} + +.ym-custom-view-headline:before { + content: "\eca7"; +} + +.ym-custom-battery-negative:before { + content: "\e6a8"; +} + +.ym-custom-code-equal:before { + content: "\e7a8"; +} + +.ym-custom-fire:before { + content: "\e8a8"; +} + +.ym-custom-jsfiddle:before { + content: "\e9a8"; +} + +.ym-custom-pandora:before { + content: "\eaa8"; +} + +.ym-custom-silverware:before { + content: "\eba8"; +} + +.ym-custom-view-week:before { + content: "\eca8"; +} + +.ym-custom-battery-positive:before { + content: "\e6a9"; +} + +.ym-custom-code-greater-than:before { + content: "\e7a9"; +} + +.ym-custom-flag-checkered:before { + content: "\e8a9"; +} + +.ym-custom-keg:before { + content: "\e9a9"; +} + +.ym-custom-panorama:before { + content: "\eaa9"; +} + +.ym-custom-silverware-spoon:before { + content: "\eba9"; +} + +.ym-custom-vimeo:before { + content: "\eca9"; +} + +.ym-custom-battery-plus:before { + content: "\e6aa"; +} + +.ym-custom-code-less-than:before { + content: "\e7aa"; +} + +.ym-custom-flag-triangle:before { + content: "\e8aa"; +} + +.ym-custom-json:before { + content: "\e9aa"; +} + +.ym-custom-panorama-fisheye:before { + content: "\eaaa"; +} + +.ym-custom-silverware-variant:before { + content: "\ebaa"; +} + +.ym-custom-vine:before { + content: "\ecaa"; +} + +.ym-custom-battery-unknown:before { + content: "\e6ab"; +} + +.ym-custom-code-greater-than-or-equal:before { + content: "\e7ab"; +} + +.ym-custom-flag-outline:before { + content: "\e8ab"; +} + +.ym-custom-kettle:before { + content: "\e9ab"; +} + +.ym-custom-panorama-horizontal:before { + content: "\eaab"; +} + +.ym-custom-sim:before { + content: "\ebab"; +} + +.ym-custom-view-grid:before { + content: "\ecab"; +} + +.ym-custom-beach:before { + content: "\e6ac"; +} + +.ym-custom-code-less-than-or-equal:before { + content: "\e7ac"; +} + +.ym-custom-flag-variant:before { + content: "\e8ac"; +} + +.ym-custom-key:before { + content: "\e9ac"; +} + +.ym-custom-panorama-vertical:before { + content: "\eaac"; +} + +.ym-custom-sim-alert:before { + content: "\ebac"; +} + +.ym-custom-visualstudio:before { + content: "\ecac"; +} + +.ym-custom-beats:before { + content: "\e6ad"; +} + +.ym-custom-code-not-equal:before { + content: "\e7ad"; +} + +.ym-custom-flag-outline-variant:before { + content: "\e8ad"; +} + +.ym-custom-key-change:before { + content: "\e9ad"; +} + +.ym-custom-panorama-wide-angle:before { + content: "\eaad"; +} + +.ym-custom-skip-backward:before { + content: "\ebad"; +} + +.ym-custom-violin:before { + content: "\ecad"; +} + +.ym-custom-beaker:before { + content: "\e6ae"; +} + +.ym-custom-code-not-equal-variant:before { + content: "\e7ae"; +} + +.ym-custom-flash-auto:before { + content: "\e8ae"; +} + +.ym-custom-key-minus:before { + content: "\e9ae"; +} + +.ym-custom-paper-cut-vertical:before { + content: "\eaae"; +} + +.ym-custom-sitemap:before { + content: "\ebae"; +} + +.ym-custom-vk:before { + content: "\ecae"; +} + +.ym-custom-bell:before { + content: "\e6af"; +} + +.ym-custom-code-parentheses:before { + content: "\e7af"; +} + +.ym-custom-flash:before { + content: "\e8af"; +} + +.ym-custom-key-remove:before { + content: "\e9af"; +} + +.ym-custom-paperclip:before { + content: "\eaaf"; +} + +.ym-custom-skip-next:before { + content: "\ebaf"; +} + +.ym-custom-vk-box:before { + content: "\ecaf"; +} + +.ym-custom-beer:before { + content: "\e6b0"; +} + +.ym-custom-code-string:before { + content: "\e7b0"; +} + +.ym-custom-flashlight:before { + content: "\e8b0"; +} + +.ym-custom-key-plus:before { + content: "\e9b0"; +} + +.ym-custom-parking:before { + content: "\eab0"; +} + +.ym-custom-skip-forward:before { + content: "\ebb0"; +} + +.ym-custom-vk-circle:before { + content: "\ecb0"; +} + +.ym-custom-behance:before { + content: "\e6b1"; +} + +.ym-custom-codepen:before { + content: "\e7b1"; +} + +.ym-custom-flash-outline:before { + content: "\e8b1"; +} + +.ym-custom-keyboard:before { + content: "\e9b1"; +} + +.ym-custom-pause:before { + content: "\eab1"; +} + +.ym-custom-sim-off:before { + content: "\ebb1"; +} + +.ym-custom-vlc:before { + content: "\ecb1"; +} + +.ym-custom-bell-off:before { + content: "\e6b2"; +} + +.ym-custom-code-tags:before { + content: "\e7b2"; +} + +.ym-custom-flash-off:before { + content: "\e8b2"; +} + +.ym-custom-keyboard-caps:before { + content: "\e9b2"; +} + +.ym-custom-pause-circle:before { + content: "\eab2"; +} + +.ym-custom-skip-next-circle:before { + content: "\ebb2"; +} + +.ym-custom-voice:before { + content: "\ecb2"; +} + +.ym-custom-bell-plus:before { + content: "\e6b3"; +} + +.ym-custom-code-tags-check:before { + content: "\e7b3"; +} + +.ym-custom-flask:before { + content: "\e8b3"; +} + +.ym-custom-keyboard-backspace:before { + content: "\e9b3"; +} + +.ym-custom-pause-circle-outline:before { + content: "\eab3"; +} + +.ym-custom-skip-previous:before { + content: "\ebb3"; +} + +.ym-custom-voicemail:before { + content: "\ecb3"; +} + +.ym-custom-bell-outline:before { + content: "\e6b4"; +} + +.ym-custom-coffee:before { + content: "\e7b4"; +} + +.ym-custom-flashlight-off:before { + content: "\e8b4"; +} + +.ym-custom-keyboard-close:before { + content: "\e9b4"; +} + +.ym-custom-pause-octagon:before { + content: "\eab4"; +} + +.ym-custom-skip-previous-circle:before { + content: "\ebb4"; +} + +.ym-custom-volume-high:before { + content: "\ecb4"; +} + +.ym-custom-bell-ring:before { + content: "\e6b5"; +} + +.ym-custom-coffee-outline:before { + content: "\e7b5"; +} + +.ym-custom-flash-red-eye:before { + content: "\e8b5"; +} + +.ym-custom-keyboard-return:before { + content: "\e9b5"; +} + +.ym-custom-pause-octagon-outline:before { + content: "\eab5"; +} + +.ym-custom-skip-next-circle-outline:before { + content: "\ebb5"; +} + +.ym-custom-volume-low:before { + content: "\ecb5"; +} + +.ym-custom-bell-ring-outline:before { + content: "\e6b6"; +} + +.ym-custom-coffee-to-go:before { + content: "\e7b6"; +} + +.ym-custom-flask-empty:before { + content: "\e8b6"; +} + +.ym-custom-keyboard-off:before { + content: "\e9b6"; +} + +.ym-custom-paw:before { + content: "\eab6"; +} + +.ym-custom-skip-previous-circle-outline:before { + content: "\ebb6"; +} + +.ym-custom-volume-medium:before { + content: "\ecb6"; +} + +.ym-custom-bell-sleep:before { + content: "\e6b7"; +} + +.ym-custom-coin:before { + content: "\e7b7"; +} + +.ym-custom-flask-outline:before { + content: "\e8b7"; +} + +.ym-custom-key-variant:before { + content: "\e9b7"; +} + +.ym-custom-pencil:before { + content: "\eab7"; +} + +.ym-custom-skull:before { + content: "\ebb7"; +} + +.ym-custom-volume-off:before { + content: "\ecb7"; +} + +.ym-custom-beta:before { + content: "\e6b8"; +} + +.ym-custom-coins:before { + content: "\e7b8"; +} + +.ym-custom-flip-to-back:before { + content: "\e8b8"; +} + +.ym-custom-keyboard-variant:before { + content: "\e9b8"; +} + +.ym-custom-paw-off:before { + content: "\eab8"; +} + +.ym-custom-skype:before { + content: "\ebb8"; +} + +.ym-custom-walk:before { + content: "\ecb8"; +} + +.ym-custom-bible:before { + content: "\e6b9"; +} + +.ym-custom-collage:before { + content: "\e7b9"; +} + +.ym-custom-flattr:before { + content: "\e8b9"; +} + +.ym-custom-label:before { + content: "\e9b9"; +} + +.ym-custom-pencil-box:before { + content: "\eab9"; +} + +.ym-custom-skype-business:before { + content: "\ebb9"; +} + +.ym-custom-vpn:before { + content: "\ecb9"; +} + +.ym-custom-bike:before { + content: "\e6ba"; +} + +.ym-custom-color-helper:before { + content: "\e7ba"; +} + +.ym-custom-flask-empty-outline:before { + content: "\e8ba"; +} + +.ym-custom-kodi:before { + content: "\e9ba"; +} + +.ym-custom-pencil-box-outline:before { + content: "\eaba"; +} + +.ym-custom-slack:before { + content: "\ebba"; +} + +.ym-custom-wallet:before { + content: "\ecba"; +} + +.ym-custom-bing:before { + content: "\e6bb"; +} + +.ym-custom-comment:before { + content: "\e7bb"; +} + +.ym-custom-flip-to-front:before { + content: "\e8bb"; +} + +.ym-custom-keyboard-tab:before { + content: "\e9bb"; +} + +.ym-custom-pencil-circle:before { + content: "\eabb"; +} + +.ym-custom-sleep:before { + content: "\ebbb"; +} + +.ym-custom-wallet-giftcard:before { + content: "\ecbb"; +} + +.ym-custom-binoculars:before { + content: "\e6bc"; +} + +.ym-custom-comment-account:before { + content: "\e7bc"; +} + +.ym-custom-floppy:before { + content: "\e8bc"; +} + +.ym-custom-label-outline:before { + content: "\e9bc"; +} + +.ym-custom-pencil-lock:before { + content: "\eabc"; +} + +.ym-custom-smoking:before { + content: "\ebbc"; +} + +.ym-custom-wallet-travel:before { + content: "\ecbc"; +} + +.ym-custom-bio:before { + content: "\e6bd"; +} + +.ym-custom-comment-alert:before { + content: "\e7bd"; +} + +.ym-custom-flower:before { + content: "\e8bd"; +} + +.ym-custom-lambda:before { + content: "\e9bd"; +} + +.ym-custom-pencil-off:before { + content: "\eabd"; +} + +.ym-custom-sleep-off:before { + content: "\ebbd"; +} + +.ym-custom-wallet-membership:before { + content: "\ecbd"; +} + +.ym-custom-biohazard:before { + content: "\e6be"; +} + +.ym-custom-comment-account-outline:before { + content: "\e7be"; +} + +.ym-custom-folder:before { + content: "\e8be"; +} + +.ym-custom-lamp:before { + content: "\e9be"; +} + +.ym-custom-pen:before { + content: "\eabe"; +} + +.ym-custom-smoking-off:before { + content: "\ebbe"; +} + +.ym-custom-wan:before { + content: "\ecbe"; +} + +.ym-custom-bitbucket:before { + content: "\e6bf"; +} + +.ym-custom-comment-alert-outline:before { + content: "\e7bf"; +} + +.ym-custom-folder-account:before { + content: "\e8bf"; +} + +.ym-custom-lan:before { + content: "\e9bf"; +} + +.ym-custom-pentagon-outline:before { + content: "\eabf"; +} + +.ym-custom-snapchat:before { + content: "\ebbf"; +} + +.ym-custom-washing-machine:before { + content: "\ecbf"; +} + +.ym-custom-black-mesa:before { + content: "\e6c0"; +} + +.ym-custom-comment-check:before { + content: "\e7c0"; +} + +.ym-custom-folder-google-drive:before { + content: "\e8c0"; +} + +.ym-custom-lan-disconnect:before { + content: "\e9c0"; +} + +.ym-custom-pentagon:before { + content: "\eac0"; +} + +.ym-custom-sofa:before { + content: "\ebc0"; +} + +.ym-custom-watch:before { + content: "\ecc0"; +} + +.ym-custom-blackberry:before { + content: "\e6c1"; +} + +.ym-custom-comment-check-outline:before { + content: "\e7c1"; +} + +.ym-custom-folder-download:before { + content: "\e8c1"; +} + +.ym-custom-language-c:before { + content: "\e9c1"; +} + +.ym-custom-pharmacy:before { + content: "\eac1"; +} + +.ym-custom-snowman:before { + content: "\ebc1"; +} + +.ym-custom-watch-import:before { + content: "\ecc1"; +} + +.ym-custom-blender:before { + content: "\e6c2"; +} + +.ym-custom-comment-multiple-outline:before { + content: "\e7c2"; +} + +.ym-custom-folder-image:before { + content: "\e8c2"; +} + +.ym-custom-lan-connect:before { + content: "\e9c2"; +} + +.ym-custom-percent:before { + content: "\eac2"; +} + +.ym-custom-soccer:before { + content: "\ebc2"; +} + +.ym-custom-watch-export:before { + content: "\ecc2"; +} + +.ym-custom-blinds:before { + content: "\e6c3"; +} + +.ym-custom-comment-outline:before { + content: "\e7c3"; +} + +.ym-custom-folder-lock:before { + content: "\e8c3"; +} + +.ym-custom-language-cpp:before { + content: "\e9c3"; +} + +.ym-custom-phone:before { + content: "\eac3"; +} + +.ym-custom-solid:before { + content: "\ebc3"; +} + +.ym-custom-water:before { + content: "\ecc3"; +} + +.ym-custom-block-helper:before { + content: "\e6c4"; +} + +.ym-custom-comment-plus-outline:before { + content: "\e7c4"; +} + +.ym-custom-folder-lock-open:before { + content: "\e8c4"; +} + +.ym-custom-language-css:before { + content: "\e9c4"; +} + +.ym-custom-phone-bluetooth:before { + content: "\eac4"; +} + +.ym-custom-sort:before { + content: "\ebc4"; +} + +.ym-custom-watch-vibrate:before { + content: "\ecc4"; +} + +.ym-custom-bluetooth:before { + content: "\e6c5"; +} + +.ym-custom-comment-processing:before { + content: "\e7c5"; +} + +.ym-custom-folder-multiple:before { + content: "\e8c5"; +} + +.ym-custom-language-csharp:before { + content: "\e9c5"; +} + +.ym-custom-phone-classic:before { + content: "\eac5"; +} + +.ym-custom-sort-descending:before { + content: "\ebc5"; +} + +.ym-custom-watermark:before { + content: "\ecc5"; +} + +.ym-custom-bluetooth-audio:before { + content: "\e6c6"; +} + +.ym-custom-comment-processing-outline:before { + content: "\e7c6"; +} + +.ym-custom-folder-multiple-image:before { + content: "\e8c6"; +} + +.ym-custom-language-html:before { + content: "\e9c6"; +} + +.ym-custom-phone-incoming:before { + content: "\eac6"; +} + +.ym-custom-sort-alphabetical:before { + content: "\ebc6"; +} + +.ym-custom-water-percent:before { + content: "\ecc6"; +} + +.ym-custom-blogger:before { + content: "\e6c7"; +} + +.ym-custom-comment-question-outline:before { + content: "\e7c7"; +} + +.ym-custom-folder-outline:before { + content: "\e8c7"; +} + +.ym-custom-language-javascript:before { + content: "\e9c7"; +} + +.ym-custom-phone-hangup:before { + content: "\eac7"; +} + +.ym-custom-sort-ascending:before { + content: "\ebc7"; +} + +.ym-custom-weather-cloudy:before { + content: "\ecc7"; +} + +.ym-custom-bluetooth-connect:before { + content: "\e6c8"; +} + +.ym-custom-comment-text-outline:before { + content: "\e7c8"; +} + +.ym-custom-folder-remove:before { + content: "\e8c8"; +} + +.ym-custom-language-php:before { + content: "\e9c8"; +} + +.ym-custom-phone-in-talk:before { + content: "\eac8"; +} + +.ym-custom-sort-numeric:before { + content: "\ebc8"; +} + +.ym-custom-water-pump:before { + content: "\ecc8"; +} + +.ym-custom-bluetooth-off:before { + content: "\e6c9"; +} + +.ym-custom-comment-remove-outline:before { + content: "\e7c9"; +} + +.ym-custom-folder-star:before { + content: "\e8c9"; +} + +.ym-custom-language-python-text:before { + content: "\e9c9"; +} + +.ym-custom-phone-forward:before { + content: "\eac9"; +} + +.ym-custom-sort-variant:before { + content: "\ebc9"; +} + +.ym-custom-water-off:before { + content: "\ecc9"; +} + +.ym-custom-bluetooth-settings:before { + content: "\e6ca"; +} + +.ym-custom-comment-text:before { + content: "\e7ca"; +} + +.ym-custom-folder-upload:before { + content: "\e8ca"; +} + +.ym-custom-language-python:before { + content: "\e9ca"; +} + +.ym-custom-phone-locked:before { + content: "\eaca"; +} + +.ym-custom-soundcloud:before { + content: "\ebca"; +} + +.ym-custom-weather-fog:before { + content: "\ecca"; +} + +.ym-custom-bluetooth-transfer:before { + content: "\e6cb"; +} + +.ym-custom-compare:before { + content: "\e7cb"; +} + +.ym-custom-food:before { + content: "\e8cb"; +} + +.ym-custom-laptop:before { + content: "\e9cb"; +} + +.ym-custom-phone-minus:before { + content: "\eacb"; +} + +.ym-custom-source-commit:before { + content: "\ebcb"; +} + +.ym-custom-weather-night:before { + content: "\eccb"; +} + +.ym-custom-blur:before { + content: "\e6cc"; +} + +.ym-custom-compass:before { + content: "\e7cc"; +} + +.ym-custom-folder-move:before { + content: "\e8cc"; +} + +.ym-custom-language-swift:before { + content: "\e9cc"; +} + +.ym-custom-phone-log:before { + content: "\eacc"; +} + +.ym-custom-source-branch:before { + content: "\ebcc"; +} + +.ym-custom-weather-lightning-rainy:before { + content: "\eccc"; +} + +.ym-custom-blur-linear:before { + content: "\e6cd"; +} + +.ym-custom-compass-outline:before { + content: "\e7cd"; +} + +.ym-custom-folder-plus:before { + content: "\e8cd"; +} + +.ym-custom-lan-pending:before { + content: "\e9cd"; +} + +.ym-custom-phone-outgoing:before { + content: "\eacd"; +} + +.ym-custom-source-commit-end:before { + content: "\ebcd"; +} + +.ym-custom-weather-hail:before { + content: "\eccd"; +} + +.ym-custom-blur-off:before { + content: "\e6ce"; +} + +.ym-custom-contact-mail:before { + content: "\e7ce"; +} + +.ym-custom-food-apple:before { + content: "\e8ce"; +} + +.ym-custom-laptop-chromebook:before { + content: "\e9ce"; +} + +.ym-custom-phone-plus:before { + content: "\eace"; +} + +.ym-custom-source-commit-end-local:before { + content: "\ebce"; +} + +.ym-custom-weather-lightning:before { + content: "\ecce"; +} + +.ym-custom-blur-radial:before { + content: "\e6cf"; +} + +.ym-custom-console:before { + content: "\e7cf"; +} + +.ym-custom-food-fork-drink:before { + content: "\e8cf"; +} + +.ym-custom-laptop-off:before { + content: "\e9cf"; +} + +.ym-custom-phone-missed:before { + content: "\eacf"; +} + +.ym-custom-source-commit-next-local:before { + content: "\ebcf"; +} + +.ym-custom-weather-partlycloudy:before { + content: "\eccf"; +} + +.ym-custom-bomb:before { + content: "\e6d0"; +} + +.ym-custom-contacts:before { + content: "\e7d0"; +} + +.ym-custom-food-variant:before { + content: "\e8d0"; +} + +.ym-custom-laptop-mac:before { + content: "\e9d0"; +} + +.ym-custom-phone-paused:before { + content: "\ead0"; +} + +.ym-custom-source-commit-start:before { + content: "\ebd0"; +} + +.ym-custom-weather-pouring:before { + content: "\ecd0"; +} + +.ym-custom-bomb-off:before { + content: "\e6d1"; +} + +.ym-custom-content-duplicate:before { + content: "\e7d1"; +} + +.ym-custom-football:before { + content: "\e8d1"; +} + +.ym-custom-laptop-windows:before { + content: "\e9d1"; +} + +.ym-custom-phone-settings:before { + content: "\ead1"; +} + +.ym-custom-source-commit-local:before { + content: "\ebd1"; +} + +.ym-custom-weather-rainy:before { + content: "\ecd1"; +} + +.ym-custom-bone:before { + content: "\e6d2"; +} + +.ym-custom-content-copy:before { + content: "\e7d2"; +} + +.ym-custom-food-off:before { + content: "\e8d2"; +} + +.ym-custom-lastfm:before { + content: "\e9d2"; +} + +.ym-custom-phone-voip:before { + content: "\ead2"; +} + +.ym-custom-source-commit-start-next-local:before { + content: "\ebd2"; +} + +.ym-custom-weather-sunny:before { + content: "\ecd2"; +} + +.ym-custom-book:before { + content: "\e6d3"; +} + +.ym-custom-content-paste:before { + content: "\e7d3"; +} + +.ym-custom-football-australian:before { + content: "\e8d3"; +} + +.ym-custom-launch:before { + content: "\e9d3"; +} + +.ym-custom-pi-box:before { + content: "\ead3"; +} + +.ym-custom-source-fork:before { + content: "\ebd3"; +} + +.ym-custom-weather-snowy:before { + content: "\ecd3"; +} + +.ym-custom-bookmark:before { + content: "\e6d4"; +} + +.ym-custom-content-cut:before { + content: "\e7d4"; +} + +.ym-custom-football-helmet:before { + content: "\e8d4"; +} + +.ym-custom-layers:before { + content: "\e9d4"; +} + +.ym-custom-pi:before { + content: "\ead4"; +} + +.ym-custom-speaker:before { + content: "\ebd4"; +} + +.ym-custom-weather-snowy-rainy:before { + content: "\ecd4"; +} + +.ym-custom-bookmark-check:before { + content: "\e6d5"; +} + +.ym-custom-content-save-all:before { + content: "\e7d5"; +} + +.ym-custom-format-align-center:before { + content: "\e8d5"; +} + +.ym-custom-layers-off:before { + content: "\e9d5"; +} + +.ym-custom-piano:before { + content: "\ead5"; +} + +.ym-custom-source-pull:before { + content: "\ebd5"; +} + +.ym-custom-weather-sunset-down:before { + content: "\ecd5"; +} + +.ym-custom-bookmark-music:before { + content: "\e6d6"; +} + +.ym-custom-content-save:before { + content: "\e7d6"; +} + +.ym-custom-format-align-justify:before { + content: "\e8d6"; +} + +.ym-custom-leaf:before { + content: "\e9d6"; +} + +.ym-custom-pig:before { + content: "\ead6"; +} + +.ym-custom-source-merge:before { + content: "\ebd6"; +} + +.ym-custom-weather-sunset:before { + content: "\ecd6"; +} + +.ym-custom-bookmark-plus:before { + content: "\e6d7"; +} + +.ym-custom-content-save-settings:before { + content: "\e7d7"; +} + +.ym-custom-format-align-left:before { + content: "\e8d7"; +} + +.ym-custom-lead-pencil:before { + content: "\e9d7"; +} + +.ym-custom-pill:before { + content: "\ead7"; +} + +.ym-custom-speaker-off:before { + content: "\ebd7"; +} + +.ym-custom-weather-sunset-up:before { + content: "\ecd7"; +} + +.ym-custom-bookmark-plus-outline:before { + content: "\e6d8"; +} + +.ym-custom-contrast-circle:before { + content: "\e7d8"; +} + +.ym-custom-format-align-right:before { + content: "\e8d8"; +} + +.ym-custom-led-off:before { + content: "\e9d8"; +} + +.ym-custom-pillar:before { + content: "\ead8"; +} + +.ym-custom-speaker-wireless:before { + content: "\ebd8"; +} + +.ym-custom-weather-windy:before { + content: "\ecd8"; +} + +.ym-custom-bookmark-outline:before { + content: "\e6d9"; +} + +.ym-custom-contrast:before { + content: "\e7d9"; +} + +.ym-custom-format-annotation-plus:before { + content: "\e8d9"; +} + +.ym-custom-led-on:before { + content: "\e9d9"; +} + +.ym-custom-pine-tree:before { + content: "\ead9"; +} + +.ym-custom-spellcheck:before { + content: "\ebd9"; +} + +.ym-custom-weather-windy-variant:before { + content: "\ecd9"; +} + +.ym-custom-bookmark-remove:before { + content: "\e6da"; +} + +.ym-custom-contrast-box:before { + content: "\e7da"; +} + +.ym-custom-format-bold:before { + content: "\e8da"; +} + +.ym-custom-led-outline:before { + content: "\e9da"; +} + +.ym-custom-pin:before { + content: "\eada"; +} + +.ym-custom-speedometer:before { + content: "\ebda"; +} + +.ym-custom-web:before { + content: "\ecda"; +} + +.ym-custom-book-minus:before { + content: "\e6db"; +} + +.ym-custom-cookie:before { + content: "\e7db"; +} + +.ym-custom-format-clear:before { + content: "\e8db"; +} + +.ym-custom-led-variant-on:before { + content: "\e9db"; +} + +.ym-custom-pin-off:before { + content: "\eadb"; +} + +.ym-custom-spotify:before { + content: "\ebdb"; +} + +.ym-custom-weight:before { + content: "\ecdb"; +} + +.ym-custom-book-multiple:before { + content: "\e6dc"; +} + +.ym-custom-copyright:before { + content: "\e7dc"; +} + +.ym-custom-format-color-fill:before { + content: "\e8dc"; +} + +.ym-custom-led-variant-off:before { + content: "\e9dc"; +} + +.ym-custom-pine-tree-box:before { + content: "\eadc"; +} + +.ym-custom-spotlight:before { + content: "\ebdc"; +} + +.ym-custom-webhook:before { + content: "\ecdc"; +} + +.ym-custom-book-multiple-variant:before { + content: "\e6dd"; +} + +.ym-custom-counter:before { + content: "\e7dd"; +} + +.ym-custom-format-color-text:before { + content: "\e8dd"; +} + +.ym-custom-led-variant-outline:before { + content: "\e9dd"; +} + +.ym-custom-pinterest:before { + content: "\eadd"; +} + +.ym-custom-spotlight-beam:before { + content: "\ebdd"; +} + +.ym-custom-weight-kilogram:before { + content: "\ecdd"; +} + +.ym-custom-book-open:before { + content: "\e6de"; +} + +.ym-custom-creation:before { + content: "\e7de"; +} + +.ym-custom-format-float-center:before { + content: "\e8de"; +} + +.ym-custom-library:before { + content: "\e9de"; +} + +.ym-custom-pinterest-box:before { + content: "\eade"; +} + +.ym-custom-spray:before { + content: "\ebde"; +} + +.ym-custom-whatsapp:before { + content: "\ecde"; +} + +.ym-custom-book-open-page-variant:before { + content: "\e6df"; +} + +.ym-custom-cow:before { + content: "\e7df"; +} + +.ym-custom-format-float-left:before { + content: "\e8df"; +} + +.ym-custom-library-books:before { + content: "\e9df"; +} + +.ym-custom-pistol:before { + content: "\eadf"; +} + +.ym-custom-square-inc:before { + content: "\ebdf"; +} + +.ym-custom-webcam:before { + content: "\ecdf"; +} + +.ym-custom-book-plus:before { + content: "\e6e0"; +} + +.ym-custom-credit-card:before { + content: "\e7e0"; +} + +.ym-custom-format-float-none:before { + content: "\e8e0"; +} + +.ym-custom-library-music:before { + content: "\e9e0"; +} + +.ym-custom-pizza:before { + content: "\eae0"; +} + +.ym-custom-stackexchange:before { + content: "\ebe0"; +} + +.ym-custom-wechat:before { + content: "\ece0"; +} + +.ym-custom-book-open-variant:before { + content: "\e6e1"; +} + +.ym-custom-credit-card-multiple:before { + content: "\e7e1"; +} + +.ym-custom-format-float-right:before { + content: "\e8e1"; +} + +.ym-custom-library-plus:before { + content: "\e9e1"; +} + +.ym-custom-plane-shield:before { + content: "\eae1"; +} + +.ym-custom-square-inc-cash:before { + content: "\ebe1"; +} + +.ym-custom-white-balance-auto:before { + content: "\ece1"; +} + +.ym-custom-book-variant:before { + content: "\e6e2"; +} + +.ym-custom-credit-card-off:before { + content: "\e7e2"; +} + +.ym-custom-format-header-:before { + content: "\e8e2"; +} + +.ym-custom-lightbulb-on-outline:before { + content: "\e9e2"; +} + +.ym-custom-play:before { + content: "\eae2"; +} + +.ym-custom-stackoverflow:before { + content: "\ebe2"; +} + +.ym-custom-white-balance-iridescent:before { + content: "\ece2"; +} + +.ym-custom-boombox:before { + content: "\e6e3"; +} + +.ym-custom-credit-card-plus:before { + content: "\e7e3"; +} + +.ym-custom-format-header-1:before { + content: "\e8e3"; +} + +.ym-custom-lightbulb:before { + content: "\e9e3"; +} + +.ym-custom-play-box-outline:before { + content: "\eae3"; +} + +.ym-custom-stadium:before { + content: "\ebe3"; +} + +.ym-custom-wheelchair-accessibility:before { + content: "\ece3"; +} + +.ym-custom-border-all:before { + content: "\e6e4"; +} + +.ym-custom-crop:before { + content: "\e7e4"; +} + +.ym-custom-format-header-2:before { + content: "\e8e4"; +} + +.ym-custom-lightbulb-on:before { + content: "\e9e4"; +} + +.ym-custom-play-circle:before { + content: "\eae4"; +} + +.ym-custom-stairs:before { + content: "\ebe4"; +} + +.ym-custom-white-balance-incandescent:before { + content: "\ece4"; +} + +.ym-custom-border-bottom:before { + content: "\e6e5"; +} + +.ym-custom-crop-free:before { + content: "\e7e5"; +} + +.ym-custom-format-header-3:before { + content: "\e8e5"; +} + +.ym-custom-lightbulb-outline:before { + content: "\e9e5"; +} + +.ym-custom-play-circle-outline:before { + content: "\eae5"; +} + +.ym-custom-star-circle:before { + content: "\ebe5"; +} + +.ym-custom-widgets:before { + content: "\ece5"; +} + +.ym-custom-border-color:before { + content: "\e6e6"; +} + +.ym-custom-credit-card-scan:before { + content: "\e7e6"; +} + +.ym-custom-format-header-4:before { + content: "\e8e6"; +} + +.ym-custom-link:before { + content: "\e9e6"; +} + +.ym-custom-playlist-check:before { + content: "\eae6"; +} + +.ym-custom-star-half:before { + content: "\ebe6"; +} + +.ym-custom-white-balance-sunny:before { + content: "\ece6"; +} + +.ym-custom-border-horizontal:before { + content: "\e6e7"; +} + +.ym-custom-crop-landscape:before { + content: "\e7e7"; +} + +.ym-custom-format-header-decrease:before { + content: "\e8e7"; +} + +.ym-custom-linkedin:before { + content: "\e9e7"; +} + +.ym-custom-playlist-play:before { + content: "\eae7"; +} + +.ym-custom-star:before { + content: "\ebe7"; +} + +.ym-custom-wiiu:before { + content: "\ece7"; +} + +.ym-custom-border-inside:before { + content: "\e6e8"; +} + +.ym-custom-crop-portrait:before { + content: "\e7e8"; +} + +.ym-custom-format-header-5:before { + content: "\e8e8"; +} + +.ym-custom-link-off:before { + content: "\e9e8"; +} + +.ym-custom-playlist-minus:before { + content: "\eae8"; +} + +.ym-custom-star-off:before { + content: "\ebe8"; +} + +.ym-custom-wifi:before { + content: "\ece8"; +} + +.ym-custom-border-none:before { + content: "\e6e9"; +} + +.ym-custom-crop-rotate:before { + content: "\e7e9"; +} + +.ym-custom-format-header-equal:before { + content: "\e8e9"; +} + +.ym-custom-link-variant-off:before { + content: "\e9e9"; +} + +.ym-custom-playlist-remove:before { + content: "\eae9"; +} + +.ym-custom-star-outline:before { + content: "\ebe9"; +} + +.ym-custom-wifi-off:before { + content: "\ece9"; +} + +.ym-custom-border-left:before { + content: "\e6ea"; +} + +.ym-custom-crop-square:before { + content: "\e7ea"; +} + +.ym-custom-format-header-increase:before { + content: "\e8ea"; +} + +.ym-custom-link-variant:before { + content: "\e9ea"; +} + +.ym-custom-playlist-plus:before { + content: "\eaea"; +} + +.ym-custom-steam:before { + content: "\ebea"; +} + +.ym-custom-wii:before { + content: "\ecea"; +} + +.ym-custom-border-outside:before { + content: "\e6eb"; +} + +.ym-custom-crosshairs:before { + content: "\e7eb"; +} + +.ym-custom-format-header-pound:before { + content: "\e8eb"; +} + +.ym-custom-linkedin-box:before { + content: "\e9eb"; +} + +.ym-custom-play-pause:before { + content: "\eaeb"; +} + +.ym-custom-steering:before { + content: "\ebeb"; +} + +.ym-custom-window-close:before { + content: "\eceb"; +} + +.ym-custom-border-right:before { + content: "\e6ec"; +} + +.ym-custom-crosshairs-gps:before { + content: "\e7ec"; +} + +.ym-custom-format-horizontal-align-center:before { + content: "\e8ec"; +} + +.ym-custom-linux:before { + content: "\e9ec"; +} + +.ym-custom-playstation:before { + content: "\eaec"; +} + +.ym-custom-step-backward:before { + content: "\ebec"; +} + +.ym-custom-wikipedia:before { + content: "\ecec"; +} + +.ym-custom-border-top:before { + content: "\e6ed"; +} + +.ym-custom-cube:before { + content: "\e7ed"; +} + +.ym-custom-format-horizontal-align-left:before { + content: "\e8ed"; +} + +.ym-custom-lock:before { + content: "\e9ed"; +} + +.ym-custom-plex:before { + content: "\eaed"; +} + +.ym-custom-step-forward:before { + content: "\ebed"; +} + +.ym-custom-window-maximize:before { + content: "\eced"; +} + +.ym-custom-border-style:before { + content: "\e6ee"; +} + +.ym-custom-crown:before { + content: "\e7ee"; +} + +.ym-custom-format-indent-increase:before { + content: "\e8ee"; +} + +.ym-custom-lock-outline:before { + content: "\e9ee"; +} + +.ym-custom-plus:before { + content: "\eaee"; +} + +.ym-custom-step-forward-:before { + content: "\ebee"; +} + +.ym-custom-window-open:before { + content: "\ecee"; +} + +.ym-custom-border-vertical:before { + content: "\e6ef"; +} + +.ym-custom-cube-outline:before { + content: "\e7ef"; +} + +.ym-custom-format-indent-decrease:before { + content: "\e8ef"; +} + +.ym-custom-lock-open-outline:before { + content: "\e9ef"; +} + +.ym-custom-plus-box-outline:before { + content: "\eaef"; +} + +.ym-custom-step-backward-:before { + content: "\ebef"; +} + +.ym-custom-window-restore:before { + content: "\ecef"; +} + +.ym-custom-bowl:before { + content: "\e6f0"; +} + +.ym-custom-cube-send:before { + content: "\e7f0"; +} + +.ym-custom-format-line-spacing:before { + content: "\e8f0"; +} + +.ym-custom-lock-open:before { + content: "\e9f0"; +} + +.ym-custom-plus-box:before { + content: "\eaf0"; +} + +.ym-custom-stethoscope:before { + content: "\ebf0"; +} + +.ym-custom-windows:before { + content: "\ecf0"; +} + +.ym-custom-box-shadow:before { + content: "\e6f1"; +} + +.ym-custom-cup:before { + content: "\e7f1"; +} + +.ym-custom-format-italic:before { + content: "\e8f1"; +} + +.ym-custom-lock-pattern:before { + content: "\e9f1"; +} + +.ym-custom-plus-circle:before { + content: "\eaf1"; +} + +.ym-custom-sticker:before { + content: "\ebf1"; +} + +.ym-custom-window-minimize:before { + content: "\ecf1"; +} + +.ym-custom-bow-tie:before { + content: "\e6f2"; +} + +.ym-custom-cube-unfolded:before { + content: "\e7f2"; +} + +.ym-custom-format-line-style:before { + content: "\e8f2"; +} + +.ym-custom-login:before { + content: "\e9f2"; +} + +.ym-custom-plus-circle-multiple-outline:before { + content: "\eaf2"; +} + +.ym-custom-stocking:before { + content: "\ebf2"; +} + +.ym-custom-window-closed:before { + content: "\ecf2"; +} + +.ym-custom-bowling:before { + content: "\e6f3"; +} + +.ym-custom-cup-off:before { + content: "\e7f3"; +} + +.ym-custom-format-horizontal-align-right:before { + content: "\e8f3"; +} + +.ym-custom-lock-plus:before { + content: "\e9f3"; +} + +.ym-custom-plus-network:before { + content: "\eaf3"; +} + +.ym-custom-stop:before { + content: "\ebf3"; +} + +.ym-custom-worker:before { + content: "\ecf3"; +} + +.ym-custom-box-cutter:before { + content: "\e6f4"; +} + +.ym-custom-cup-water:before { + content: "\e7f4"; +} + +.ym-custom-format-line-weight:before { + content: "\e8f4"; +} + +.ym-custom-login-variant:before { + content: "\e9f4"; +} + +.ym-custom-plus-one:before { + content: "\eaf4"; +} + +.ym-custom-stop-circle-outline:before { + content: "\ebf4"; +} + +.ym-custom-wordpress:before { + content: "\ecf4"; +} + +.ym-custom-box:before { + content: "\e6f5"; +} + +.ym-custom-currency-btc:before { + content: "\e7f5"; +} + +.ym-custom-format-list-bulleted:before { + content: "\e8f5"; +} + +.ym-custom-logout:before { + content: "\e9f5"; +} + +.ym-custom-plus-circle-outline:before { + content: "\eaf5"; +} + +.ym-custom-stop-circle:before { + content: "\ebf5"; +} + +.ym-custom-wrench:before { + content: "\ecf5"; +} + +.ym-custom-bridge:before { + content: "\e6f6"; +} + +.ym-custom-currency-gbp:before { + content: "\e7f6"; +} + +.ym-custom-format-list-bulleted-type:before { + content: "\e8f6"; +} + +.ym-custom-logout-variant:before { + content: "\e9f6"; +} + +.ym-custom-pocket:before { + content: "\eaf6"; +} + +.ym-custom-store:before { + content: "\ebf6"; +} + +.ym-custom-wrap:before { + content: "\ecf6"; +} + +.ym-custom-briefcase:before { + content: "\e6f7"; +} + +.ym-custom-currency-eur:before { + content: "\e7f7"; +} + +.ym-custom-format-page-break:before { + content: "\e8f7"; +} + +.ym-custom-looks:before { + content: "\e9f7"; +} + +.ym-custom-plus-outline:before { + content: "\eaf7"; +} + +.ym-custom-store--hour:before { + content: "\ebf7"; +} + +.ym-custom-wunderlist:before { + content: "\ecf7"; +} + +.ym-custom-briefcase-check:before { + content: "\e6f8"; +} + +.ym-custom-currency-inr:before { + content: "\e7f8"; +} + +.ym-custom-format-list-numbers:before { + content: "\e8f8"; +} + +.ym-custom-loop:before { + content: "\e9f8"; +} + +.ym-custom-polaroid:before { + content: "\eaf8"; +} + +.ym-custom-stove:before { + content: "\ebf8"; +} + +.ym-custom-xaml:before { + content: "\ecf8"; +} + +.ym-custom-briefcase-download:before { + content: "\e6f9"; +} + +.ym-custom-currency-ngn:before { + content: "\e7f9"; +} + +.ym-custom-format-paragraph:before { + content: "\e8f9"; +} + +.ym-custom-loupe:before { + content: "\e9f9"; +} + +.ym-custom-poll:before { + content: "\eaf9"; +} + +.ym-custom-subway:before { + content: "\ebf9"; +} + +.ym-custom-xbox:before { + content: "\ecf9"; +} + +.ym-custom-briefcase-upload:before { + content: "\e6fa"; +} + +.ym-custom-currency-rub:before { + content: "\e7fa"; +} + +.ym-custom-format-pilcrow:before { + content: "\e8fa"; +} + +.ym-custom-lumx:before { + content: "\e9fa"; +} + +.ym-custom-pokeball:before { + content: "\eafa"; +} + +.ym-custom-subdirectory-arrow-left:before { + content: "\ebfa"; +} + +.ym-custom-xbox-controller:before { + content: "\ecfa"; +} + +.ym-custom-brightness-:before { + content: "\e6fb"; +} + +.ym-custom-currency-try:before { + content: "\e7fb"; +} + +.ym-custom-format-quote:before { + content: "\e8fb"; +} + +.ym-custom-magnet:before { + content: "\e9fb"; +} + +.ym-custom-poll-box:before { + content: "\eafb"; +} + +.ym-custom-subdirectory-arrow-right:before { + content: "\ebfb"; +} + +.ym-custom-xbox-controller-off:before { + content: "\ecfb"; +} + +.ym-custom-brightness-1:before { + content: "\e6fc"; +} + +.ym-custom-currency-usd:before { + content: "\e7fc"; +} + +.ym-custom-format-paint:before { + content: "\e8fc"; +} + +.ym-custom-magnet-on:before { + content: "\e9fc"; +} + +.ym-custom-polymer:before { + content: "\eafc"; +} + +.ym-custom-subway-variant:before { + content: "\ebfc"; +} + +.ym-custom-xda:before { + content: "\ecfc"; +} + +.ym-custom-brightness-2:before { + content: "\e6fd"; +} + +.ym-custom-currency-usd-off:before { + content: "\e7fd"; +} + +.ym-custom-format-size:before { + content: "\e8fd"; +} + +.ym-custom-magnify:before { + content: "\e9fd"; +} + +.ym-custom-play-protected-content:before { + content: "\eafd"; +} + +.ym-custom-sunglasses:before { + content: "\ebfd"; +} + +.ym-custom-xing:before { + content: "\ecfd"; +} + +.ym-custom-brightness-3:before { + content: "\e6fe"; +} + +.ym-custom-cursor-default:before { + content: "\e7fe"; +} + +.ym-custom-format-section:before { + content: "\e8fe"; +} + +.ym-custom-magnify-plus:before { + content: "\e9fe"; +} + +.ym-custom-pool:before { + content: "\eafe"; +} + +.ym-custom-swap-horizontal:before { + content: "\ebfe"; +} + +.ym-custom-xing-circle:before { + content: "\ecfe"; +} + +.ym-custom-brightness-4:before { + content: "\e6ff"; +} + +.ym-custom-cursor-default-outline:before { + content: "\e7ff"; +} + +.ym-custom-format-strikethrough:before { + content: "\e8ff"; +} + +.ym-custom-magnify-minus:before { + content: "\e9ff"; +} + +.ym-custom-pot:before { + content: "\eaff"; +} + +.ym-custom-surround-sound:before { + content: "\ebff"; +} + +.ym-custom-xing-box:before { + content: "\ecff"; +} + +.ym-custom-brightness-5:before { + content: "\e700"; +} + +.ym-custom-cursor-pointer:before { + content: "\e800"; +} + +.ym-custom-format-strikethrough-variant:before { + content: "\e900"; +} + +.ym-custom-map:before { + content: "\ea00"; +} + +.ym-custom-popcorn:before { + content: "\eb00"; +} + +.ym-custom-swap-vertical:before { + content: "\ec00"; +} + +.ym-custom-xml:before { + content: "\ed00"; +} + +.ym-custom-access-point:before { + content: "\e601"; +} + +.ym-custom-brightness-6:before { + content: "\e701"; +} + +.ym-custom-cursor-move:before { + content: "\e801"; +} + +.ym-custom-format-subscript:before { + content: "\e901"; +} + +.ym-custom-mail-ru:before { + content: "\ea01"; +} + +.ym-custom-pound:before { + content: "\eb01"; +} + +.ym-custom-swim:before { + content: "\ec01"; +} + +.ym-custom-yelp:before { + content: "\ed01"; +} + +.ym-custom-account-box-outline:before { + content: "\e602"; +} + +.ym-custom-broom:before { + content: "\e702"; +} + +.ym-custom-cursor-text:before { + content: "\e802"; +} + +.ym-custom-format-superscript:before { + content: "\e902"; +} + +.ym-custom-map-marker:before { + content: "\ea02"; +} + +.ym-custom-pound-box:before { + content: "\eb02"; +} + +.ym-custom-switch:before { + content: "\ec02"; +} + +.ym-custom-yeast:before { + content: "\ed02"; +} + +.ym-custom-account-box:before { + content: "\e603"; +} + +.ym-custom-brightness-auto:before { + content: "\e703"; +} + +.ym-custom-database:before { + content: "\e803"; +} + +.ym-custom-format-text:before { + content: "\e903"; +} + +.ym-custom-map-marker-minus:before { + content: "\ea03"; +} + +.ym-custom-pot-mix:before { + content: "\eb03"; +} + +.ym-custom-sync:before { + content: "\ec03"; +} + +.ym-custom-yin-yang:before { + content: "\ed03"; +} + +.ym-custom-access-point-network:before { + content: "\e604"; +} + +.ym-custom-brush:before { + content: "\e704"; +} + +.ym-custom-database-minus:before { + content: "\e804"; +} + +.ym-custom-format-textdirection-l-to-r:before { + content: "\e904"; +} + +.ym-custom-map-marker-circle:before { + content: "\ea04"; +} + +.ym-custom-power:before { + content: "\eb04"; +} + +.ym-custom-sync-alert:before { + content: "\ec04"; +} + +.ym-custom-youtube-play:before { + content: "\ed04"; +} + +.ym-custom-account-alert:before { + content: "\e605"; +} + +.ym-custom-bug:before { + content: "\e705"; +} + +.ym-custom-database-plus:before { + content: "\e805"; +} + +.ym-custom-format-textdirection-r-to-l:before { + content: "\e905"; +} + +.ym-custom-map-marker-multiple:before { + content: "\ea05"; +} + +.ym-custom-power-plug:before { + content: "\eb05"; +} + +.ym-custom-tab:before { + content: "\ec05"; +} + +.ym-custom-zip-box:before { + content: "\ed05"; +} + +.ym-custom-account-card-details:before { + content: "\e606"; +} + +.ym-custom-buffer:before { + content: "\e706"; +} + +.ym-custom-debug-step-into:before { + content: "\e806"; +} + +.ym-custom-format-title:before { + content: "\e906"; +} + +.ym-custom-map-marker-off:before { + content: "\ea06"; +} + +.ym-custom-power-settings:before { + content: "\eb06"; +} + +.ym-custom-table:before { + content: "\ec06"; +} + +.ym-custom-account:before { + content: "\e607"; +} + +.ym-custom-bulletin-board:before { + content: "\e707"; +} + +.ym-custom-debug-step-over:before { + content: "\e807"; +} + +.ym-custom-format-vertical-align-bottom:before { + content: "\e907"; +} + +.ym-custom-map-marker-plus:before { + content: "\ea07"; +} + +.ym-custom-power-plug-off:before { + content: "\eb07"; +} + +.ym-custom-table-column-plus-before:before { + content: "\ec07"; +} + +.ym-custom-account-check:before { + content: "\e608"; +} + +.ym-custom-bullhorn:before { + content: "\e708"; +} + +.ym-custom-debug-step-out:before { + content: "\e808"; +} + +.ym-custom-format-underline:before { + content: "\e908"; +} + +.ym-custom-map-marker-radius:before { + content: "\ea08"; +} + +.ym-custom-power-socket:before { + content: "\eb08"; +} + +.ym-custom-table-column-plus-after:before { + content: "\ec08"; +} + +.ym-custom-account-key:before { + content: "\e609"; +} + +.ym-custom-bullseye:before { + content: "\e709"; +} + +.ym-custom-decimal-decrease:before { + content: "\e809"; +} + +.ym-custom-format-vertical-align-center:before { + content: "\e909"; +} + +.ym-custom-markdown:before { + content: "\ea09"; +} + +.ym-custom-prescription:before { + content: "\eb09"; +} + +.ym-custom-table-column-remove:before { + content: "\ec09"; +} + +.ym-custom-account-convert:before { + content: "\e60a"; +} + +.ym-custom-bus:before { + content: "\e70a"; +} + +.ym-custom-delete:before { + content: "\e80a"; +} + +.ym-custom-format-vertical-align-top:before { + content: "\e90a"; +} + +.ym-custom-margin:before { + content: "\ea0a"; +} + +.ym-custom-presentation:before { + content: "\eb0a"; +} + +.ym-custom-table-column-width:before { + content: "\ec0a"; +} + +.ym-custom-account-circle:before { + content: "\e60b"; +} + +.ym-custom-burst-mode:before { + content: "\e70b"; +} + +.ym-custom-decimal-increase:before { + content: "\e80b"; +} + +.ym-custom-format-wrap-inline:before { + content: "\e90b"; +} + +.ym-custom-marker:before { + content: "\ea0b"; +} + +.ym-custom-presentation-play:before { + content: "\eb0b"; +} + +.ym-custom-table-large:before { + content: "\ec0b"; +} + +.ym-custom-account-minus:before { + content: "\e60c"; +} + +.ym-custom-cake:before { + content: "\e70c"; +} + +.ym-custom-delete-circle:before { + content: "\e80c"; +} + +.ym-custom-format-wrap-tight:before { + content: "\e90c"; +} + +.ym-custom-marker-check:before { + content: "\ea0c"; +} + +.ym-custom-printer:before { + content: "\eb0c"; +} + +.ym-custom-table-row-height:before { + content: "\ec0c"; +} + +.ym-custom-account-location:before { + content: "\e60d"; +} + +.ym-custom-cake-layered:before { + content: "\e70d"; +} + +.ym-custom-delete-empty:before { + content: "\e80d"; +} + +.ym-custom-format-wrap-top-bottom:before { + content: "\e90d"; +} + +.ym-custom-material-ui:before { + content: "\ea0d"; +} + +.ym-custom-printer-d:before { + content: "\eb0d"; +} + +.ym-custom-table-edit:before { + content: "\ec0d"; +} + +.ym-custom-account-multiple:before { + content: "\e60e"; +} + +.ym-custom-cached:before { + content: "\e70e"; +} + +.ym-custom-delete-forever:before { + content: "\e80e"; +} + +.ym-custom-format-wrap-square:before { + content: "\e90e"; +} + +.ym-custom-martini:before { + content: "\ea0e"; +} + +.ym-custom-printer-alert:before { + content: "\eb0e"; +} + +.ym-custom-table-row-plus-after:before { + content: "\ec0e"; +} + +.ym-custom-account-multiple-minus:before { + content: "\e60f"; +} + +.ym-custom-calculator:before { + content: "\e70f"; +} + +.ym-custom-delete-sweep:before { + content: "\e80f"; +} + +.ym-custom-forum:before { + content: "\e90f"; +} + +.ym-custom-math-compass:before { + content: "\ea0f"; +} + +.ym-custom-printer-settings:before { + content: "\eb0f"; +} + +.ym-custom-sword:before { + content: "\ec0f"; +} + +.ym-custom-account-multiple-plus:before { + content: "\e610"; +} + +.ym-custom-cake-variant:before { + content: "\e710"; +} + +.ym-custom-delete-variant:before { + content: "\e810"; +} + +.ym-custom-forward:before { + content: "\e910"; +} + +.ym-custom-matrix:before { + content: "\ea10"; +} + +.ym-custom-priority-high:before { + content: "\eb10"; +} + +.ym-custom-sync-off:before { + content: "\ec10"; +} + +.ym-custom-account-multiple-outline:before { + content: "\e611"; +} + +.ym-custom-calendar:before { + content: "\e711"; +} + +.ym-custom-delta:before { + content: "\e811"; +} + +.ym-custom-foursquare:before { + content: "\e911"; +} + +.ym-custom-maxcdn:before { + content: "\ea11"; +} + +.ym-custom-priority-low:before { + content: "\eb11"; +} + +.ym-custom-table-row-plus-before:before { + content: "\ec11"; +} + +.ym-custom-account-plus:before { + content: "\e612"; +} + +.ym-custom-calendar-blank:before { + content: "\e712"; +} + +.ym-custom-deskphone:before { + content: "\e812"; +} + +.ym-custom-fridge:before { + content: "\e912"; +} + +.ym-custom-medical-bag:before { + content: "\ea12"; +} + +.ym-custom-professional-hexagon:before { + content: "\eb12"; +} + +.ym-custom-tablet:before { + content: "\ec12"; +} + +.ym-custom-account-network:before { + content: "\e613"; +} + +.ym-custom-calendar-check:before { + content: "\e713"; +} + +.ym-custom-desktop-mac:before { + content: "\e813"; +} + +.ym-custom-fridge-filled:before { + content: "\e913"; +} + +.ym-custom-medium:before { + content: "\ea13"; +} + +.ym-custom-projector-screen:before { + content: "\eb13"; +} + +.ym-custom-table-row-remove:before { + content: "\ec13"; +} + +.ym-custom-account-off:before { + content: "\e614"; +} + +.ym-custom-calendar-clock:before { + content: "\e714"; +} + +.ym-custom-deviantart:before { + content: "\e814"; +} + +.ym-custom-fridge-filled-bottom:before { + content: "\e914"; +} + +.ym-custom-memory:before { + content: "\ea14"; +} + +.ym-custom-projector:before { + content: "\eb14"; +} + +.ym-custom-tablet-android:before { + content: "\ec14"; +} + +.ym-custom-account-outline:before { + content: "\e615"; +} + +.ym-custom-calendar-plus:before { + content: "\e715"; +} + +.ym-custom-desktop-tower:before { + content: "\e815"; +} + +.ym-custom-fridge-filled-top:before { + content: "\e915"; +} + +.ym-custom-menu:before { + content: "\ea15"; +} + +.ym-custom-publish:before { + content: "\eb15"; +} + +.ym-custom-tablet-ipad:before { + content: "\ec15"; +} + +.ym-custom-account-remove:before { + content: "\e616"; +} + +.ym-custom-calendar-multiple:before { + content: "\e716"; +} + +.ym-custom-details:before { + content: "\e816"; +} + +.ym-custom-fullscreen:before { + content: "\e916"; +} + +.ym-custom-menu-down:before { + content: "\ea16"; +} + +.ym-custom-pulse:before { + content: "\eb16"; +} + +.ym-custom-tab-unselected:before { + content: "\ec16"; +} + +.ym-custom-account-star:before { + content: "\e617"; +} + +.ym-custom-calendar-multiple-check:before { + content: "\e717"; +} + +.ym-custom-developer-board:before { + content: "\e817"; +} + +.ym-custom-fullscreen-exit:before { + content: "\e917"; +} + +.ym-custom-menu-down-outline:before { + content: "\ea17"; +} + +.ym-custom-puzzle:before { + content: "\eb17"; +} + +.ym-custom-tag-heart:before { + content: "\ec17"; +} + +.ym-custom-account-settings:before { + content: "\e618"; +} + +.ym-custom-calendar-range:before { + content: "\e718"; +} + +.ym-custom-dialpad:before { + content: "\e818"; +} + +.ym-custom-gamepad:before { + content: "\e918"; +} + +.ym-custom-menu-left:before { + content: "\ea18"; +} + +.ym-custom-qrcode:before { + content: "\eb18"; +} + +.ym-custom-tag:before { + content: "\ec18"; +} + +.ym-custom-account-settings-variant:before { + content: "\e619"; +} + +.ym-custom-calendar-question:before { + content: "\e719"; +} + +.ym-custom-dice-:before { + content: "\e819"; +} + +.ym-custom-function:before { + content: "\e919"; +} + +.ym-custom-menu-right:before { + content: "\ea19"; +} + +.ym-custom-qrcode-scan:before { + content: "\eb19"; +} + +.ym-custom-tag-faces:before { + content: "\ec19"; +} + +.ym-custom-account-search:before { + content: "\e61a"; +} + +.ym-custom-calendar-remove:before { + content: "\e71a"; +} + +.ym-custom-diamond:before { + content: "\e81a"; +} + +.ym-custom-garage:before { + content: "\e91a"; +} + +.ym-custom-menu-up:before { + content: "\ea1a"; +} + +.ym-custom-qqchat:before { + content: "\eb1a"; +} + +.ym-custom-tag-multiple:before { + content: "\ec1a"; +} + +.ym-custom-account-star-variant:before { + content: "\e61b"; +} + +.ym-custom-calendar-today:before { + content: "\e71b"; +} + +.ym-custom-dice-1:before { + content: "\e81b"; +} + +.ym-custom-gamepad-variant:before { + content: "\e91b"; +} + +.ym-custom-message:before { + content: "\ea1b"; +} + +.ym-custom-quadcopter:before { + content: "\eb1b"; +} + +.ym-custom-tag-outline:before { + content: "\ec1b"; +} + +.ym-custom-account-switch:before { + content: "\e61c"; +} + +.ym-custom-call-merge:before { + content: "\e71c"; +} + +.ym-custom-dice-2:before { + content: "\e81c"; +} + +.ym-custom-garage-open:before { + content: "\e91c"; +} + +.ym-custom-message-bulleted:before { + content: "\ea1c"; +} + +.ym-custom-quality-high:before { + content: "\eb1c"; +} + +.ym-custom-tag-text-outline:before { + content: "\ec1c"; +} + +.ym-custom-adjust:before { + content: "\e61d"; +} + +.ym-custom-call-made:before { + content: "\e71d"; +} + +.ym-custom-dice-d:before { + content: "\e81d"; +} + +.ym-custom-gas-cylinder:before { + content: "\e91d"; +} + +.ym-custom-menu-up-outline:before { + content: "\ea1d"; +} + +.ym-custom-quicktime:before { + content: "\eb1d"; +} + +.ym-custom-target:before { + content: "\ec1d"; +} + +.ym-custom-air-conditioner:before { + content: "\e61e"; +} + +.ym-custom-calendar-text:before { + content: "\e71e"; +} + +.ym-custom-dice-3:before { + content: "\e81e"; +} + +.ym-custom-gas-station:before { + content: "\e91e"; +} + +.ym-custom-message-alert:before { + content: "\ea1e"; +} + +.ym-custom-radar:before { + content: "\eb1e"; +} + +.ym-custom-teamviewer:before { + content: "\ec1e"; +} + +.ym-custom-airballoon:before { + content: "\e61f"; +} + +.ym-custom-call-missed:before { + content: "\e71f"; +} + +.ym-custom-dice-d1:before { + content: "\e81f"; +} + +.ym-custom-gate:before { + content: "\e91f"; +} + +.ym-custom-message-bulleted-off:before { + content: "\ea1f"; +} + +.ym-custom-radio:before { + content: "\eb1f"; +} + +.ym-custom-taxi:before { + content: "\ec1f"; +} + +.ym-custom-airplane-landing:before { + content: "\e620"; +} + +.ym-custom-call-received:before { + content: "\e720"; +} + +.ym-custom-dice-d2:before { + content: "\e820"; +} + +.ym-custom-gauge:before { + content: "\e920"; +} + +.ym-custom-message-draw:before { + content: "\ea20"; +} + +.ym-custom-radiator:before { + content: "\eb20"; +} + +.ym-custom-telegram:before { + content: "\ec20"; +} + +.ym-custom-airplane-off:before { + content: "\e621"; +} + +.ym-custom-call-split:before { + content: "\e721"; +} + +.ym-custom-dice-4:before { + content: "\e821"; +} + +.ym-custom-gavel:before { + content: "\e921"; +} + +.ym-custom-message-image:before { + content: "\ea21"; +} + +.ym-custom-radioactive:before { + content: "\eb21"; +} + +.ym-custom-television:before { + content: "\ec21"; +} + +.ym-custom-airplay:before { + content: "\e622"; +} + +.ym-custom-camcorder-box:before { + content: "\e722"; +} + +.ym-custom-dice-d3:before { + content: "\e822"; +} + +.ym-custom-gender-female:before { + content: "\e922"; +} + +.ym-custom-message-outline:before { + content: "\ea22"; +} + +.ym-custom-radiobox-marked:before { + content: "\eb22"; +} + +.ym-custom-television-guide:before { + content: "\ec22"; +} + +.ym-custom-airplane-takeoff:before { + content: "\e623"; +} + +.ym-custom-camcorder:before { + content: "\e723"; +} + +.ym-custom-dictionary:before { + content: "\e823"; +} + +.ym-custom-gender-male:before { + content: "\e923"; +} + +.ym-custom-message-processing:before { + content: "\ea23"; +} + +.ym-custom-radiobox-blank:before { + content: "\eb23"; +} + +.ym-custom-temperature-celsius:before { + content: "\ec23"; +} + +.ym-custom-airplane:before { + content: "\e624"; +} + +.ym-custom-camcorder-box-off:before { + content: "\e724"; +} + +.ym-custom-dice-5:before { + content: "\e824"; +} + +.ym-custom-gender-male-female:before { + content: "\e924"; +} + +.ym-custom-message-reply:before { + content: "\ea24"; +} + +.ym-custom-radio-handheld:before { + content: "\eb24"; +} + +.ym-custom-temperature-kelvin:before { + content: "\ec24"; +} + +.ym-custom-alarm:before { + content: "\e625"; +} + +.ym-custom-camcorder-off:before { + content: "\e725"; +} + +.ym-custom-directions-fork:before { + content: "\e825"; +} + +.ym-custom-gender-transgender:before { + content: "\e925"; +} + +.ym-custom-message-plus:before { + content: "\ea25"; +} + +.ym-custom-radio-tower:before { + content: "\eb25"; +} + +.ym-custom-temperature-fahrenheit:before { + content: "\ec25"; +} + +.ym-custom-alarm-check:before { + content: "\e626"; +} + +.ym-custom-camera:before { + content: "\e726"; +} + +.ym-custom-directions:before { + content: "\e826"; +} + +.ym-custom-ghost:before { + content: "\e926"; +} + +.ym-custom-message-reply-text:before { + content: "\ea26"; +} + +.ym-custom-raspberrypi:before { + content: "\eb26"; +} + +.ym-custom-tennis:before { + content: "\ec26"; +} + +.ym-custom-alarm-multiple:before { + content: "\e627"; +} + +.ym-custom-camera-enhance:before { + content: "\e727"; +} + +.ym-custom-discord:before { + content: "\e827"; +} + +.ym-custom-git:before { + content: "\e927"; +} + +.ym-custom-message-text:before { + content: "\ea27"; +} + +.ym-custom-ray-end:before { + content: "\eb27"; +} + +.ym-custom-tent:before { + content: "\ec27"; +} + +.ym-custom-alarm-snooze:before { + content: "\e628"; +} + +.ym-custom-camera-burst:before { + content: "\e728"; +} + +.ym-custom-disk:before { + content: "\e828"; +} + +.ym-custom-gift:before { + content: "\e928"; +} + +.ym-custom-message-text-outline:before { + content: "\ea28"; +} + +.ym-custom-ray-end-arrow:before { + content: "\eb28"; +} + +.ym-custom-terrain:before { + content: "\ec28"; +} + +.ym-custom-alarm-off:before { + content: "\e629"; +} + +.ym-custom-camera-front:before { + content: "\e729"; +} + +.ym-custom-disk-alert:before { + content: "\e829"; +} + +.ym-custom-github-box:before { + content: "\e929"; +} + +.ym-custom-message-video:before { + content: "\ea29"; +} + +.ym-custom-ray-start:before { + content: "\eb29"; +} + +.ym-custom-test-tube:before { + content: "\ec29"; +} + +.ym-custom-alarm-plus:before { + content: "\e62a"; +} + +.ym-custom-camera-front-variant:before { + content: "\e72a"; +} + +.ym-custom-disqus:before { + content: "\e82a"; +} + +.ym-custom-github-circle:before { + content: "\e92a"; +} + +.ym-custom-meteor:before { + content: "\ea2a"; +} + +.ym-custom-ray-start-arrow:before { + content: "\eb2a"; +} + +.ym-custom-text-shadow:before { + content: "\ec2a"; +} + +.ym-custom-alert:before { + content: "\e62b"; +} + +.ym-custom-camera-iris:before { + content: "\e72b"; +} + +.ym-custom-disqus-outline:before { + content: "\e82b"; +} + +.ym-custom-glass-stange:before { + content: "\e92b"; +} + +.ym-custom-microphone:before { + content: "\ea2b"; +} + +.ym-custom-ray-start-end:before { + content: "\eb2b"; +} + +.ym-custom-textbox:before { + content: "\ec2b"; +} + +.ym-custom-alert-box:before { + content: "\e62c"; +} + +.ym-custom-camera-off:before { + content: "\e72c"; +} + +.ym-custom-division-box:before { + content: "\e82c"; +} + +.ym-custom-glassdoor:before { + content: "\e92c"; +} + +.ym-custom-microphone-off:before { + content: "\ea2c"; +} + +.ym-custom-ray-vertex:before { + content: "\eb2c"; +} + +.ym-custom-text-to-speech:before { + content: "\ec2c"; +} + +.ym-custom-alert-circle:before { + content: "\e62d"; +} + +.ym-custom-camera-party-mode:before { + content: "\e72d"; +} + +.ym-custom-division:before { + content: "\e82d"; +} + +.ym-custom-glasses:before { + content: "\e92d"; +} + +.ym-custom-microphone-outline:before { + content: "\ea2d"; +} + +.ym-custom-rdio:before { + content: "\eb2d"; +} + +.ym-custom-text-to-speech-off:before { + content: "\ec2d"; +} + +.ym-custom-alert-circle-outline:before { + content: "\e62e"; +} + +.ym-custom-camera-rear:before { + content: "\e72e"; +} + +.ym-custom-dna:before { + content: "\e82e"; +} + +.ym-custom-glass-mug:before { + content: "\e92e"; +} + +.ym-custom-microphone-settings:before { + content: "\ea2e"; +} + +.ym-custom-readability:before { + content: "\eb2e"; +} + +.ym-custom-texture:before { + content: "\ec2e"; +} + +.ym-custom-alert-octagon:before { + content: "\e62f"; +} + +.ym-custom-camera-rear-variant:before { + content: "\e72f"; +} + +.ym-custom-dns:before { + content: "\e82f"; +} + +.ym-custom-glass-flute:before { + content: "\e92f"; +} + +.ym-custom-microphone-variant:before { + content: "\ea2f"; +} + +.ym-custom-receipt:before { + content: "\eb2f"; +} + +.ym-custom-theater:before { + content: "\ec2f"; +} + +.ym-custom-all-inclusive:before { + content: "\e630"; +} + +.ym-custom-camera-switch:before { + content: "\e730"; +} + +.ym-custom-dolby:before { + content: "\e830"; +} + +.ym-custom-glass-tulip:before { + content: "\e930"; +} + +.ym-custom-microphone-variant-off:before { + content: "\ea30"; +} + +.ym-custom-read:before { + content: "\eb30"; +} + +.ym-custom-theme-light-dark:before { + content: "\ec30"; +} + +.ym-custom-alert-outline:before { + content: "\e631"; +} + +.ym-custom-camera-timer:before { + content: "\e731"; +} + +.ym-custom-do-not-disturb-off:before { + content: "\e831"; +} + +.ym-custom-gnome:before { + content: "\e931"; +} + +.ym-custom-microscope:before { + content: "\ea31"; +} + +.ym-custom-recycle:before { + content: "\eb31"; +} + +.ym-custom-thermometer-lines:before { + content: "\ec31"; +} + +.ym-custom-alpha:before { + content: "\e632"; +} + +.ym-custom-candle:before { + content: "\e732"; +} + +.ym-custom-do-not-disturb:before { + content: "\e832"; +} + +.ym-custom-google:before { + content: "\e932"; +} + +.ym-custom-minecraft:before { + content: "\ea32"; +} + +.ym-custom-record:before { + content: "\eb32"; +} + +.ym-custom-thumb-down:before { + content: "\ec32"; +} + +.ym-custom-alphabetical:before { + content: "\e633"; +} + +.ym-custom-candycane:before { + content: "\e733"; +} + +.ym-custom-domain:before { + content: "\e833"; +} + +.ym-custom-gondola:before { + content: "\e933"; +} + +.ym-custom-microsoft:before { + content: "\ea33"; +} + +.ym-custom-record-rec:before { + content: "\eb33"; +} + +.ym-custom-thermometer:before { + content: "\ec33"; +} + +.ym-custom-altimeter:before { + content: "\e634"; +} + +.ym-custom-car:before { + content: "\e734"; +} + +.ym-custom-dots-horizontal:before { + content: "\e834"; +} + +.ym-custom-google-cardboard:before { + content: "\e934"; +} + +.ym-custom-minus:before { + content: "\ea34"; +} + +.ym-custom-redo:before { + content: "\eb34"; +} + +.ym-custom-thumbs-up-down:before { + content: "\ec34"; +} + +.ym-custom-amazon:before { + content: "\e635"; +} + +.ym-custom-car-battery:before { + content: "\e735"; +} + +.ym-custom-dots-vertical:before { + content: "\e835"; +} + +.ym-custom-gmail:before { + content: "\e935"; +} + +.ym-custom-minus-box:before { + content: "\ea35"; +} + +.ym-custom-redo-variant:before { + content: "\eb35"; +} + +.ym-custom-thumb-down-outline:before { + content: "\ec35"; +} + +.ym-custom-amazon-clouddrive:before { + content: "\e636"; +} + +.ym-custom-car-connected:before { + content: "\e736"; +} + +.ym-custom-douban:before { + content: "\e836"; +} + +.ym-custom-google-chrome:before { + content: "\e936"; +} + +.ym-custom-minus-circle:before { + content: "\ea36"; +} + +.ym-custom-reddit:before { + content: "\eb36"; +} + +.ym-custom-thumb-up:before { + content: "\ec36"; +} + +.ym-custom-amplifier:before { + content: "\e637"; +} + +.ym-custom-cards:before { + content: "\e737"; +} + +.ym-custom-drag:before { + content: "\e837"; +} + +.ym-custom-google-circles-communities:before { + content: "\e937"; +} + +.ym-custom-minus-circle-outline:before { + content: "\ea37"; +} + +.ym-custom-refresh:before { + content: "\eb37"; +} + +.ym-custom-thumb-up-outline:before { + content: "\ec37"; +} + +.ym-custom-ambulance:before { + content: "\e638"; +} + +.ym-custom-cards-outline:before { + content: "\e738"; +} + +.ym-custom-download:before { + content: "\e838"; +} + +.ym-custom-google-circles:before { + content: "\e938"; +} + +.ym-custom-minus-network:before { + content: "\ea38"; +} + +.ym-custom-regex:before { + content: "\eb38"; +} + +.ym-custom-ticket:before { + content: "\ec38"; +} + +.ym-custom-android-debug-bridge:before { + content: "\e639"; +} + +.ym-custom-cards-variant:before { + content: "\e739"; +} + +.ym-custom-drag-horizontal:before { + content: "\e839"; +} + +.ym-custom-google-circles-group:before { + content: "\e939"; +} + +.ym-custom-mixcloud:before { + content: "\ea39"; +} + +.ym-custom-relative-scale:before { + content: "\eb39"; +} + +.ym-custom-ticket-account:before { + content: "\ec39"; +} + +.ym-custom-anchor:before { + content: "\e63a"; +} + +.ym-custom-cards-playing-outline:before { + content: "\e73a"; +} + +.ym-custom-drag-vertical:before { + content: "\e83a"; +} + +.ym-custom-google-circles-extended:before { + content: "\e93a"; +} + +.ym-custom-monitor:before { + content: "\ea3a"; +} + +.ym-custom-reload:before { + content: "\eb3a"; +} + +.ym-custom-ticket-confirmation:before { + content: "\ec3a"; +} + +.ym-custom-android:before { + content: "\e63b"; +} + +.ym-custom-cart:before { + content: "\e73b"; +} + +.ym-custom-drawing:before { + content: "\e83b"; +} + +.ym-custom-google-controller:before { + content: "\e93b"; +} + +.ym-custom-monitor-multiple:before { + content: "\ea3b"; +} + +.ym-custom-remote:before { + content: "\eb3b"; +} + +.ym-custom-ticket-percent:before { + content: "\ec3b"; +} + +.ym-custom-angular:before { + content: "\e63c"; +} + +.ym-custom-carrot:before { + content: "\e73c"; +} + +.ym-custom-drawing-box:before { + content: "\e83c"; +} + +.ym-custom-google-drive:before { + content: "\e93c"; +} + +.ym-custom-motorbike:before { + content: "\ea3c"; +} + +.ym-custom-reorder-horizontal:before { + content: "\eb3c"; +} + +.ym-custom-tie:before { + content: "\ec3c"; +} + +.ym-custom-apple-ios:before { + content: "\e63d"; +} + +.ym-custom-cart-off:before { + content: "\e73d"; +} + +.ym-custom-drone:before { + content: "\e83d"; +} + +.ym-custom-google-controller-off:before { + content: "\e93d"; +} + +.ym-custom-more:before { + content: "\ea3d"; +} + +.ym-custom-rename-box:before { + content: "\eb3d"; +} + +.ym-custom-tilde:before { + content: "\ec3d"; +} + +.ym-custom-apple-finder:before { + content: "\e63e"; +} + +.ym-custom-cart-outline:before { + content: "\e73e"; +} + +.ym-custom-dribbble:before { + content: "\e83e"; +} + +.ym-custom-google-earth:before { + content: "\e93e"; +} + +.ym-custom-mouse:before { + content: "\ea3e"; +} + +.ym-custom-reorder-vertical:before { + content: "\eb3e"; +} + +.ym-custom-timelapse:before { + content: "\ec3e"; +} + +.ym-custom-animation:before { + content: "\e63f"; +} + +.ym-custom-cart-plus:before { + content: "\e73f"; +} + +.ym-custom-dribbble-box:before { + content: "\e83f"; +} + +.ym-custom-google-glass:before { + content: "\e93f"; +} + +.ym-custom-mouse-variant:before { + content: "\ea3f"; +} + +.ym-custom-repeat:before { + content: "\eb3f"; +} + +.ym-custom-timer-:before { + content: "\ec3f"; +} + +.ym-custom-android-studio:before { + content: "\e640"; +} + +.ym-custom-car-wash:before { + content: "\e740"; +} + +.ym-custom-dropbox:before { + content: "\e840"; +} + +.ym-custom-google-keep:before { + content: "\e940"; +} + +.ym-custom-mouse-off:before { + content: "\ea40"; +} + +.ym-custom-repeat-off:before { + content: "\eb40"; +} + +.ym-custom-timer:before { + content: "\ec40"; +} + +.ym-custom-apple:before { + content: "\e641"; +} + +.ym-custom-case-sensitive-alt:before { + content: "\e741"; +} + +.ym-custom-drupal:before { + content: "\e841"; +} + +.ym-custom-google-maps:before { + content: "\e941"; +} + +.ym-custom-mouse-variant-off:before { + content: "\ea41"; +} + +.ym-custom-reply:before { + content: "\eb41"; +} + +.ym-custom-timer-1:before { + content: "\ec41"; +} + +.ym-custom-apple-keyboard-caps:before { + content: "\e642"; +} + +.ym-custom-cash:before { + content: "\e742"; +} + +.ym-custom-duck:before { + content: "\e842"; +} + +.ym-custom-google-nearby:before { + content: "\e942"; +} + +.ym-custom-move-resize:before { + content: "\ea42"; +} + +.ym-custom-repeat-once:before { + content: "\eb42"; +} + +.ym-custom-timer-off:before { + content: "\ec42"; +} + +.ym-custom-apple-keyboard-command:before { + content: "\e643"; +} + +.ym-custom-cash-multiple:before { + content: "\e743"; +} + +.ym-custom-dumbbell:before { + content: "\e843"; +} + +.ym-custom-google-pages:before { + content: "\e943"; +} + +.ym-custom-move-resize-variant:before { + content: "\ea43"; +} + +.ym-custom-replay:before { + content: "\eb43"; +} + +.ym-custom-timer-sand:before { + content: "\ec43"; +} + +.ym-custom-apple-keyboard-control:before { + content: "\e644"; +} + +.ym-custom-cash-:before { + content: "\e744"; +} + +.ym-custom-earth-box:before { + content: "\e844"; +} + +.ym-custom-google-photos:before { + content: "\e944"; +} + +.ym-custom-movie:before { + content: "\ea44"; +} + +.ym-custom-reply-all:before { + content: "\eb44"; +} + +.ym-custom-timer-sand-empty:before { + content: "\ec44"; +} + +.ym-custom-apple-keyboard-shift:before { + content: "\e645"; +} + +.ym-custom-cash-usd:before { + content: "\e745"; +} + +.ym-custom-earth:before { + content: "\e845"; +} + +.ym-custom-google-physical-web:before { + content: "\e945"; +} + +.ym-custom-multiplication:before { + content: "\ea45"; +} + +.ym-custom-reproduction:before { + content: "\eb45"; +} + +.ym-custom-toggle-switch:before { + content: "\ec45"; +} + +.ym-custom-apple-keyboard-option:before { + content: "\e646"; +} + +.ym-custom-cast-connected:before { + content: "\e746"; +} + +.ym-custom-earth-box-off:before { + content: "\e846"; +} + +.ym-custom-google-play:before { + content: "\e946"; +} + +.ym-custom-music-box-outline:before { + content: "\ea46"; +} + +.ym-custom-rewind:before { + content: "\eb46"; +} + +.ym-custom-timetable:before { + content: "\ec46"; +} + +.ym-custom-apple-mobileme:before { + content: "\e647"; +} + +.ym-custom-cast:before { + content: "\e747"; +} + +.ym-custom-edge:before { + content: "\e847"; +} + +.ym-custom-google-plus:before { + content: "\e947"; +} + +.ym-custom-multiplication-box:before { + content: "\ea47"; +} + +.ym-custom-resize-bottom-right:before { + content: "\eb47"; +} + +.ym-custom-toggle-switch-off:before { + content: "\ec47"; +} + +.ym-custom-apple-safari:before { + content: "\e648"; +} + +.ym-custom-cellphone:before { + content: "\e748"; +} + +.ym-custom-elevation-decline:before { + content: "\e848"; +} + +.ym-custom-google-translate:before { + content: "\e948"; +} + +.ym-custom-music-box:before { + content: "\ea48"; +} + +.ym-custom-responsive:before { + content: "\eb48"; +} + +.ym-custom-tooltip:before { + content: "\ec48"; +} + +.ym-custom-appnet:before { + content: "\e649"; +} + +.ym-custom-castle:before { + content: "\e749"; +} + +.ym-custom-eject:before { + content: "\e849"; +} + +.ym-custom-google-plus-box:before { + content: "\e949"; +} + +.ym-custom-music-circle:before { + content: "\ea49"; +} + +.ym-custom-restore:before { + content: "\eb49"; +} + +.ym-custom-tooltip-edit:before { + content: "\ec49"; +} + +.ym-custom-application:before { + content: "\e64a"; +} + +.ym-custom-cat:before { + content: "\e74a"; +} + +.ym-custom-earth-off:before { + content: "\e84a"; +} + +.ym-custom-google-wallet:before { + content: "\e94a"; +} + +.ym-custom-music-note:before { + content: "\ea4a"; +} + +.ym-custom-rewind-outline:before { + content: "\eb4a"; +} + +.ym-custom-tooltip-image:before { + content: "\ec4a"; +} + +.ym-custom-apps:before { + content: "\e64b"; +} + +.ym-custom-cellphone-android:before { + content: "\e74b"; +} + +.ym-custom-elevator:before { + content: "\e84b"; +} + +.ym-custom-gradient:before { + content: "\e94b"; +} + +.ym-custom-music-note-bluetooth:before { + content: "\ea4b"; +} + +.ym-custom-rhombus:before { + content: "\eb4b"; +} + +.ym-custom-tooltip-outline:before { + content: "\ec4b"; +} + +.ym-custom-arrange-send-to-back:before { + content: "\e64c"; +} + +.ym-custom-cellphone-dock:before { + content: "\e74c"; +} + +.ym-custom-elevation-rise:before { + content: "\e84c"; +} + +.ym-custom-grease-pencil:before { + content: "\e94c"; +} + +.ym-custom-music-note-bluetooth-off:before { + content: "\ea4c"; +} + +.ym-custom-road:before { + content: "\eb4c"; +} + +.ym-custom-tooltip-outline-plus:before { + content: "\ec4c"; +} + +.ym-custom-arrange-send-backward:before { + content: "\e64d"; +} + +.ym-custom-cellphone-iphone:before { + content: "\e74d"; +} + +.ym-custom-email:before { + content: "\e84d"; +} + +.ym-custom-grid:before { + content: "\e94d"; +} + +.ym-custom-music-note-half:before { + content: "\ea4d"; +} + +.ym-custom-ribbon:before { + content: "\eb4d"; +} + +.ym-custom-tooltip-text:before { + content: "\ec4d"; +} + +.ym-custom-arrange-bring-forward:before { + content: "\e64e"; +} + +.ym-custom-cellphone-basic:before { + content: "\e74e"; +} + +.ym-custom-email-open:before { + content: "\e84e"; +} + +.ym-custom-guitar-electric:before { + content: "\e94e"; +} + +.ym-custom-music-note-eighth:before { + content: "\ea4e"; +} + +.ym-custom-road-variant:before { + content: "\eb4e"; +} + +.ym-custom-tooth:before { + content: "\ec4e"; +} + +.ym-custom-archive:before { + content: "\e64f"; +} + +.ym-custom-cellphone-link:before { + content: "\e74f"; +} + +.ym-custom-email-outline:before { + content: "\e84f"; +} + +.ym-custom-grid-off:before { + content: "\e94f"; +} + +.ym-custom-music-note-off:before { + content: "\ea4f"; +} + +.ym-custom-rhombus-outline:before { + content: "\eb4f"; +} + +.ym-custom-tor:before { + content: "\ec4f"; +} + +.ym-custom-arrange-bring-to-front:before { + content: "\e650"; +} + +.ym-custom-cellphone-link-off:before { + content: "\e750"; +} + +.ym-custom-email-open-outline:before { + content: "\e850"; +} + +.ym-custom-guitar-pick:before { + content: "\e950"; +} + +.ym-custom-music-note-quarter:before { + content: "\ea50"; +} + +.ym-custom-robot:before { + content: "\eb50"; +} + +.ym-custom-tower-beach:before { + content: "\ec50"; +} + +.ym-custom-arrow-all:before { + content: "\e651"; +} + +.ym-custom-cellphone-settings:before { + content: "\e751"; +} + +.ym-custom-email-variant:before { + content: "\e851"; +} + +.ym-custom-group:before { + content: "\e951"; +} + +.ym-custom-music-note-sixteenth:before { + content: "\ea51"; +} + +.ym-custom-rocket:before { + content: "\eb51"; +} + +.ym-custom-train:before { + content: "\ec51"; +} + +.ym-custom-arrow-bottom-right:before { + content: "\e652"; +} + +.ym-custom-certificate:before { + content: "\e752"; +} + +.ym-custom-email-secure:before { + content: "\e852"; +} + +.ym-custom-guitar-pick-outline:before { + content: "\e952"; +} + +.ym-custom-music-note-whole:before { + content: "\ea52"; +} + +.ym-custom-roomba:before { + content: "\eb52"; +} + +.ym-custom-tower-fire:before { + content: "\ec52"; +} + +.ym-custom-arrow-bottom-left:before { + content: "\e653"; +} + +.ym-custom-chair-school:before { + content: "\e753"; +} + +.ym-custom-emoticon:before { + content: "\e853"; +} + +.ym-custom-hackernews:before { + content: "\e953"; +} + +.ym-custom-nature:before { + content: "\ea53"; +} + +.ym-custom-rotate-d:before { + content: "\eb53"; +} + +.ym-custom-traffic-light:before { + content: "\ec53"; +} + +.ym-custom-arrow-compress:before { + content: "\e654"; +} + +.ym-custom-chart-arc:before { + content: "\e754"; +} + +.ym-custom-emby:before { + content: "\e854"; +} + +.ym-custom-hand-pointing-right:before { + content: "\e954"; +} + +.ym-custom-nature-people:before { + content: "\ea54"; +} + +.ym-custom-rotate-left:before { + content: "\eb54"; +} + +.ym-custom-transfer:before { + content: "\ec54"; +} + +.ym-custom-arrow-compress-all:before { + content: "\e655"; +} + +.ym-custom-chart-areaspline:before { + content: "\e755"; +} + +.ym-custom-emoticon-dead:before { + content: "\e855"; +} + +.ym-custom-hamburger:before { + content: "\e955"; +} + +.ym-custom-needle:before { + content: "\ea55"; +} + +.ym-custom-rotate-:before { + content: "\eb55"; +} + +.ym-custom-transcribe-close:before { + content: "\ec55"; +} + +.ym-custom-arrow-down:before { + content: "\e656"; +} + +.ym-custom-chart-bar:before { + content: "\e756"; +} + +.ym-custom-emoticon-cool:before { + content: "\e856"; +} + +.ym-custom-hangouts:before { + content: "\e956"; +} + +.ym-custom-navigation:before { + content: "\ea56"; +} + +.ym-custom-rotate-right:before { + content: "\eb56"; +} + +.ym-custom-transcribe:before { + content: "\ec56"; +} + +.ym-custom-arrow-down-bold:before { + content: "\e657"; +} + +.ym-custom-chart-bubble:before { + content: "\e757"; +} + +.ym-custom-emoticon-devil:before { + content: "\e857"; +} + +.ym-custom-harddisk:before { + content: "\e957"; +} + +.ym-custom-near-me:before { + content: "\ea57"; +} + +.ym-custom-rotate-left-variant:before { + content: "\eb57"; +} + +.ym-custom-translate:before { + content: "\ec57"; +} + +.ym-custom-arrow-down-bold-circle-outline:before { + content: "\e658"; +} + +.ym-custom-chart-histogram:before { + content: "\e758"; +} + +.ym-custom-emoticon-excited:before { + content: "\e858"; +} + +.ym-custom-headphones:before { + content: "\e958"; +} + +.ym-custom-nest-protect:before { + content: "\ea58"; +} + +.ym-custom-rotate-right-variant:before { + content: "\eb58"; +} + +.ym-custom-transit-transfer:before { + content: "\ec58"; +} + +.ym-custom-arrow-down-bold-circle:before { + content: "\e659"; +} + +.ym-custom-chart-line:before { + content: "\e759"; +} + +.ym-custom-emoticon-happy:before { + content: "\e859"; +} + +.ym-custom-headphones-box:before { + content: "\e959"; +} + +.ym-custom-nest-thermostat:before { + content: "\ea59"; +} + +.ym-custom-rounded-corner:before { + content: "\eb59"; +} + +.ym-custom-tram:before { + content: "\ec59"; +} + +.ym-custom-arrow-down-box:before { + content: "\e65a"; +} + +.ym-custom-chart-pie:before { + content: "\e75a"; +} + +.ym-custom-emoticon-neutral:before { + content: "\e85a"; +} + +.ym-custom-headphones-settings:before { + content: "\e95a"; +} + +.ym-custom-new-box:before { + content: "\ea5a"; +} + +.ym-custom-routes:before { + content: "\eb5a"; +} + +.ym-custom-tree:before { + content: "\ec5a"; +} + +.ym-custom-arrow-down-drop-circle-outline:before { + content: "\e65b"; +} + +.ym-custom-chart-gantt:before { + content: "\e75b"; +} + +.ym-custom-emoticon-sad:before { + content: "\e85b"; +} + +.ym-custom-headset:before { + content: "\e95b"; +} + +.ym-custom-newspaper:before { + content: "\ea5b"; +} + +.ym-custom-router-wireless:before { + content: "\eb5b"; +} + +.ym-custom-treasure-chest:before { + content: "\ec5b"; +} + +.ym-custom-arrow-expand:before { + content: "\e65c"; +} + +.ym-custom-chart-scatterplot-hexbin:before { + content: "\e75c"; +} + +.ym-custom-emoticon-poop:before { + content: "\e85c"; +} + +.ym-custom-hanger:before { + content: "\e95c"; +} + +.ym-custom-nfc:before { + content: "\ea5c"; +} + +.ym-custom-rowing:before { + content: "\eb5c"; +} + +.ym-custom-trending-up:before { + content: "\ec5c"; +} + +.ym-custom-arrow-down-drop-circle:before { + content: "\e65d"; +} + +.ym-custom-chart-timeline:before { + content: "\e75d"; +} + +.ym-custom-emoticon-tongue:before { + content: "\e85d"; +} + +.ym-custom-headset-dock:before { + content: "\e95d"; +} + +.ym-custom-nfc-variant:before { + content: "\ea5d"; +} + +.ym-custom-rss:before { + content: "\eb5d"; +} + +.ym-custom-trending-neutral:before { + content: "\ec5d"; +} + +.ym-custom-arrow-down-bold-hexagon-outline:before { + content: "\e65e"; +} + +.ym-custom-check:before { + content: "\e75e"; +} + +.ym-custom-engine:before { + content: "\e85e"; +} + +.ym-custom-headset-off:before { + content: "\e95e"; +} + +.ym-custom-nodejs:before { + content: "\ea5e"; +} + +.ym-custom-rss-box:before { + content: "\eb5e"; +} + +.ym-custom-trello:before { + content: "\ec5e"; +} + +.ym-custom-arrow-expand-all:before { + content: "\e65f"; +} + +.ym-custom-check-all:before { + content: "\e75f"; +} + +.ym-custom-engine-outline:before { + content: "\e85f"; +} + +.ym-custom-heart:before { + content: "\e95f"; +} + +.ym-custom-note:before { + content: "\ea5f"; +} + +.ym-custom-ruler:before { + content: "\eb5f"; +} + +.ym-custom-trending-down:before { + content: "\ec5f"; +} + +.ym-custom-arrow-left:before { + content: "\e660"; +} + +.ym-custom-checkbox-blank:before { + content: "\e760"; +} + +.ym-custom-equal:before { + content: "\e860"; +} + +.ym-custom-heart-box-outline:before { + content: "\e960"; +} + +.ym-custom-nfc-tap:before { + content: "\ea60"; +} + +.ym-custom-sale:before { + content: "\eb60"; +} + +.ym-custom-triangle:before { + content: "\ec60"; +} + +.ym-custom-arrow-left-bold:before { + content: "\e661"; +} + +.ym-custom-checkbox-blank-circle:before { + content: "\e761"; +} + +.ym-custom-eraser:before { + content: "\e861"; +} + +.ym-custom-heart-broken:before { + content: "\e961"; +} + +.ym-custom-note-multiple:before { + content: "\ea61"; +} + +.ym-custom-run:before { + content: "\eb61"; +} + +.ym-custom-triangle-outline:before { + content: "\ec61"; +} + +.ym-custom-arrow-left-bold-circle:before { + content: "\e662"; +} + +.ym-custom-checkbox-blank-circle-outline:before { + content: "\e762"; +} + +.ym-custom-eraser-variant:before { + content: "\e862"; +} + +.ym-custom-heart-box:before { + content: "\e962"; +} + +.ym-custom-note-multiple-outline:before { + content: "\ea62"; +} + +.ym-custom-satellite:before { + content: "\eb62"; +} + +.ym-custom-trophy-award:before { + content: "\ec62"; +} + +.ym-custom-arrow-left-bold-circle-outline:before { + content: "\e663"; +} + +.ym-custom-checkbox-blank-outline:before { + content: "\e763"; +} + +.ym-custom-equal-box:before { + content: "\e863"; +} + +.ym-custom-heart-half-outline:before { + content: "\e963"; +} + +.ym-custom-note-outline:before { + content: "\ea63"; +} + +.ym-custom-satellite-variant:before { + content: "\eb63"; +} + +.ym-custom-trophy-outline:before { + content: "\ec63"; +} + +.ym-custom-arrow-left-bold-hexagon-outline:before { + content: "\e664"; +} + +.ym-custom-checkbox-marked-circle:before { + content: "\e764"; +} + +.ym-custom-escalator:before { + content: "\e864"; +} + +.ym-custom-heart-half-part:before { + content: "\e964"; +} + +.ym-custom-note-plus:before { + content: "\ea64"; +} + +.ym-custom-saxophone:before { + content: "\eb64"; +} + +.ym-custom-trophy:before { + content: "\ec64"; +} + +.ym-custom-arrow-left-box:before { + content: "\e665"; +} + +.ym-custom-checkbox-marked-circle-outline:before { + content: "\e765"; +} + +.ym-custom-ethernet-cable:before { + content: "\e865"; +} + +.ym-custom-heart-half-part-outline:before { + content: "\e965"; +} + +.ym-custom-note-text:before { + content: "\ea65"; +} + +.ym-custom-scale:before { + content: "\eb65"; +} + +.ym-custom-trophy-variant:before { + content: "\ec65"; +} + +.ym-custom-arrow-left-drop-circle:before { + content: "\e666"; +} + +.ym-custom-checkbox-marked-outline:before { + content: "\e766"; +} + +.ym-custom-ethernet:before { + content: "\e866"; +} + +.ym-custom-help:before { + content: "\e966"; +} + +.ym-custom-note-plus-outline:before { + content: "\ea66"; +} + +.ym-custom-scale-balance:before { + content: "\eb66"; +} + +.ym-custom-trophy-variant-outline:before { + content: "\ec66"; +} + +.ym-custom-arrow-left-drop-circle-outline:before { + content: "\e667"; +} + +.ym-custom-checkbox-marked:before { + content: "\e767"; +} + +.ym-custom-ethernet-cable-off:before { + content: "\e867"; +} + +.ym-custom-heart-outline:before { + content: "\e967"; +} + +.ym-custom-notification-clear-all:before { + content: "\ea67"; +} + +.ym-custom-scale-bathroom:before { + content: "\eb67"; +} + +.ym-custom-truck-delivery:before { + content: "\ec67"; +} + +.ym-custom-arrow-right:before { + content: "\e668"; +} + +.ym-custom-checkbox-multiple-blank-circle:before { + content: "\e768"; +} + +.ym-custom-etsy:before { + content: "\e868"; +} + +.ym-custom-heart-pulse:before { + content: "\e968"; +} + +.ym-custom-npm:before { + content: "\ea68"; +} + +.ym-custom-scanner:before { + content: "\eb68"; +} + +.ym-custom-truck-trailer:before { + content: "\ec68"; +} + +.ym-custom-arrow-right-bold-circle:before { + content: "\e669"; +} + +.ym-custom-checkbox-multiple-blank:before { + content: "\e769"; +} + +.ym-custom-evernote:before { + content: "\e869"; +} + +.ym-custom-help-circle:before { + content: "\e969"; +} + +.ym-custom-nuke:before { + content: "\ea69"; +} + +.ym-custom-school:before { + content: "\eb69"; +} + +.ym-custom-tshirt-crew:before { + content: "\ec69"; +} + +.ym-custom-arrow-right-bold:before { + content: "\e66a"; +} + +.ym-custom-checkbox-multiple-blank-circle-outline:before { + content: "\e76a"; +} + +.ym-custom-ev-station:before { + content: "\e86a"; +} + +.ym-custom-help-circle-outline:before { + content: "\e96a"; +} + +.ym-custom-numeric:before { + content: "\ea6a"; +} + +.ym-custom-screen-rotation:before { + content: "\eb6a"; +} + +.ym-custom-tshirt-v:before { + content: "\ec6a"; +} + +.ym-custom-arrow-right-bold-circle-outline:before { + content: "\e66b"; +} + +.ym-custom-checkbox-multiple-blank-outline:before { + content: "\e76b"; +} + +.ym-custom-exclamation:before { + content: "\e86b"; +} + +.ym-custom-hexagon:before { + content: "\e96b"; +} + +.ym-custom-numeric--box:before { + content: "\ea6b"; +} + +.ym-custom-screen-rotation-lock:before { + content: "\eb6b"; +} + +.ym-custom-tumblr:before { + content: "\ec6b"; +} + +.ym-custom-arrow-right-box:before { + content: "\e66c"; +} + +.ym-custom-checkbox-multiple-marked:before { + content: "\e76c"; +} + +.ym-custom-exit-to-app:before { + content: "\e86c"; +} + +.ym-custom-highway:before { + content: "\e96c"; +} + +.ym-custom-numeric--box-multiple-outline:before { + content: "\ea6c"; +} + +.ym-custom-screwdriver:before { + content: "\eb6c"; +} + +.ym-custom-tumblr-reblog:before { + content: "\ec6c"; +} + +.ym-custom-arrow-right-bold-hexagon-outline:before { + content: "\e66d"; +} + +.ym-custom-checkbox-multiple-marked-circle:before { + content: "\e76d"; +} + +.ym-custom-export:before { + content: "\e86d"; +} + +.ym-custom-hexagon-outline:before { + content: "\e96d"; +} + +.ym-custom-numeric--box-outline:before { + content: "\ea6d"; +} + +.ym-custom-script:before { + content: "\eb6d"; +} + +.ym-custom-tune:before { + content: "\ec6d"; +} + +.ym-custom-arrow-right-drop-circle:before { + content: "\e66e"; +} + +.ym-custom-checkbox-multiple-marked-circle-outline:before { + content: "\e76e"; +} + +.ym-custom-eye:before { + content: "\e86e"; +} + +.ym-custom-history:before { + content: "\e96e"; +} + +.ym-custom-numeric--box1:before { + content: "\ea6e"; +} + +.ym-custom-sd:before { + content: "\eb6e"; +} + +.ym-custom-truck:before { + content: "\ec6e"; +} + +.ym-custom-arrow-right-drop-circle-outline:before { + content: "\e66f"; +} + +.ym-custom-check-circle:before { + content: "\e76f"; +} + +.ym-custom-eyedropper:before { + content: "\e86f"; +} + +.ym-custom-home:before { + content: "\e96f"; +} + +.ym-custom-numeric--box-outline1:before { + content: "\ea6f"; +} + +.ym-custom-seat-flat:before { + content: "\eb6f"; +} + +.ym-custom-tune-vertical:before { + content: "\ec6f"; +} + +.ym-custom-arrow-top-right:before { + content: "\e670"; +} + +.ym-custom-checkbox-multiple-marked-outline:before { + content: "\e770"; +} + +.ym-custom-eye-off:before { + content: "\e870"; +} + +.ym-custom-hololens:before { + content: "\e970"; +} + +.ym-custom-numeric--box-multiple-outline1:before { + content: "\ea70"; +} + +.ym-custom-seat-flat-angled:before { + content: "\eb70"; +} + +.ym-custom-twitch:before { + content: "\ec70"; +} + +.ym-custom-arrow-up:before { + content: "\e671"; +} + +.ym-custom-checkerboard:before { + content: "\e771"; +} + +.ym-custom-eyedropper-variant:before { + content: "\e871"; +} + +.ym-custom-home-modern:before { + content: "\e971"; +} + +.ym-custom-numeric--box2:before { + content: "\ea71"; +} + +.ym-custom-seat-individual-suite:before { + content: "\eb71"; +} + +.ym-custom-twitter:before { + content: "\ec71"; +} + +.ym-custom-arrow-up-bold:before { + content: "\e672"; +} + +.ym-custom-check-circle-outline:before { + content: "\e772"; +} + +.ym-custom-face:before { + content: "\e872"; +} + +.ym-custom-home-outline:before { + content: "\e972"; +} + +.ym-custom-numeric--box-multiple-outline2:before { + content: "\ea72"; +} + +.ym-custom-seal:before { + content: "\eb72"; +} + +.ym-custom-twitter-circle:before { + content: "\ec72"; +} + +.ym-custom-arrow-top-left:before { + content: "\e673"; +} + +.ym-custom-chemical-weapon:before { + content: "\e773"; +} + +.ym-custom-facebook-box:before { + content: "\e873"; +} + +.ym-custom-home-variant:before { + content: "\e973"; +} + +.ym-custom-numeric--box-outline2:before { + content: "\ea73"; +} + +.ym-custom-seat-legroom-extra:before { + content: "\eb73"; +} + +.ym-custom-twitter-box:before { + content: "\ec73"; +} + +.ym-custom-arrow-up-bold-circle:before { + content: "\e674"; +} + +.ym-custom-chevron-double-down:before { + content: "\e774"; +} + +.ym-custom-facebook:before { + content: "\e874"; +} + +.ym-custom-home-map-marker:before { + content: "\e974"; +} + +.ym-custom-numeric--box-multiple-outline3:before { + content: "\ea74"; +} + +.ym-custom-seat-legroom-normal:before { + content: "\eb74"; +} + +.ym-custom-umbraco:before { + content: "\ec74"; +} + +.ym-custom-arrow-up-bold-circle-outline:before { + content: "\e675"; +} + +.ym-custom-chevron-double-left:before { + content: "\e775"; +} + +.ym-custom-face-profile:before { + content: "\e875"; +} + +.ym-custom-hook:before { + content: "\e975"; +} + +.ym-custom-numeric--box-outline3:before { + content: "\ea75"; +} + +.ym-custom-seat-recline-extra:before { + content: "\eb75"; +} + +.ym-custom-twitter-retweet:before { + content: "\ec75"; +} + +.ym-custom-arrow-up-bold-hexagon-outline:before { + content: "\e676"; +} + +.ym-custom-chevron-double-right:before { + content: "\e776"; +} + +.ym-custom-facebook-messenger:before { + content: "\e876"; +} + +.ym-custom-hook-off:before { + content: "\e976"; +} + +.ym-custom-numeric--box3:before { + content: "\ea76"; +} + +.ym-custom-seat-legroom-reduced:before { + content: "\eb76"; +} + +.ym-custom-ubuntu:before { + content: "\ec76"; +} + +.ym-custom-arrow-up-box:before { + content: "\e677"; +} + +.ym-custom-chevron-double-up:before { + content: "\e777"; +} + +.ym-custom-factory:before { + content: "\e877"; +} + +.ym-custom-hops:before { + content: "\e977"; +} + +.ym-custom-numeric--box4:before { + content: "\ea77"; +} + +.ym-custom-seat-recline-normal:before { + content: "\eb77"; +} + +.ym-custom-umbrella:before { + content: "\ec77"; +} + +.ym-custom-album:before { + content: "\e678"; +} + +.ym-custom-chevron-down:before { + content: "\e778"; +} + +.ym-custom-fast-forward:before { + content: "\e878"; +} + +.ym-custom-hospital:before { + content: "\e978"; +} + +.ym-custom-numeric--box-outline4:before { + content: "\ea78"; +} + +.ym-custom-security:before { + content: "\eb78"; +} + +.ym-custom-unfold-less:before { + content: "\ec78"; +} + +.ym-custom-assistant:before { + content: "\e679"; +} + +.ym-custom-chevron-left:before { + content: "\e779"; +} + +.ym-custom-fan:before { + content: "\e879"; +} + +.ym-custom-hospital-building:before { + content: "\e979"; +} + +.ym-custom-numeric--box-multiple-outline4:before { + content: "\ea79"; +} + +.ym-custom-security-home:before { + content: "\eb79"; +} + +.ym-custom-undo-variant:before { + content: "\ec79"; +} + +.ym-custom-arrow-up-drop-circle-outline:before { + content: "\e67a"; +} + +.ym-custom-chevron-right:before { + content: "\e77a"; +} + +.ym-custom-fast-forward-outline:before { + content: "\e87a"; +} + +.ym-custom-hospital-marker:before { + content: "\e97a"; +} + +.ym-custom-numeric--box5:before { + content: "\ea7a"; +} + +.ym-custom-security-network:before { + content: "\eb7a"; +} + +.ym-custom-undo:before { + content: "\ec7a"; +} + +.ym-custom-arrow-up-drop-circle:before { + content: "\e67b"; +} + +.ym-custom-chevron-up:before { + content: "\e77b"; +} + +.ym-custom-fax:before { + content: "\e87b"; +} + +.ym-custom-hotel:before { + content: "\e97b"; +} + +.ym-custom-numeric--box-multiple-outline5:before { + content: "\ea7b"; +} + +.ym-custom-select-all:before { + content: "\eb7b"; +} + +.ym-custom-unfold-more:before { + content: "\ec7b"; +} + +.ym-custom-attachment:before { + content: "\e67c"; +} + +.ym-custom-church:before { + content: "\e77c"; +} + +.ym-custom-feather:before { + content: "\e87c"; +} + +.ym-custom-houzz:before { + content: "\e97c"; +} + +.ym-custom-numeric--box-outline5:before { + content: "\ea7c"; +} + +.ym-custom-select-inverse:before { + content: "\eb7c"; +} + +.ym-custom-ungroup:before { + content: "\ec7c"; +} + +.ym-custom-asterisk:before { + content: "\e67d"; +} + +.ym-custom-chip:before { + content: "\e77d"; +} + +.ym-custom-ferry:before { + content: "\e87d"; +} + +.ym-custom-houzz-box:before { + content: "\e97d"; +} + +.ym-custom-numeric--box6:before { + content: "\ea7d"; +} + +.ym-custom-select:before { + content: "\eb7d"; +} + +.ym-custom-umbrella-outline:before { + content: "\ec7d"; +} + +.ym-custom-at:before { + content: "\e67e"; +} + +.ym-custom-cisco-webex:before { + content: "\e77e"; +} + +.ym-custom-file:before { + content: "\e87e"; +} + +.ym-custom-human-child:before { + content: "\e97e"; +} + +.ym-custom-numeric--box-multiple-outline6:before { + content: "\ea7e"; +} + +.ym-custom-selection:before { + content: "\eb7e"; +} + +.ym-custom-update:before { + content: "\ec7e"; +} + +.ym-custom-audiobook:before { + content: "\e67f"; +} + +.ym-custom-city:before { + content: "\e77f"; +} + +.ym-custom-file-chart:before { + content: "\e87f"; +} + +.ym-custom-human:before { + content: "\e97f"; +} + +.ym-custom-numeric--box7:before { + content: "\ea7f"; +} + +.ym-custom-select-off:before { + content: "\eb7f"; +} + +.ym-custom-untappd:before { + content: "\ec7f"; +} + +.ym-custom-auto-fix:before { + content: "\e680"; +} + +.ym-custom-clipboard:before { + content: "\e780"; +} + +.ym-custom-file-check:before { + content: "\e880"; +} + +.ym-custom-human-greeting:before { + content: "\e980"; +} + +.ym-custom-numeric--box-outline6:before { + content: "\ea80"; +} + +.ym-custom-send:before { + content: "\eb80"; +} + +.ym-custom-unity:before { + content: "\ec80"; +} + +.ym-custom-auto-upload:before { + content: "\e681"; +} + +.ym-custom-clipboard-account:before { + content: "\e781"; +} + +.ym-custom-file-cloud:before { + content: "\e881"; +} + +.ym-custom-human-female:before { + content: "\e981"; +} + +.ym-custom-numeric--box-multiple-outline7:before { + content: "\ea81"; +} + +.ym-custom-serial-port:before { + content: "\eb81"; +} + +.ym-custom-upload:before { + content: "\ec81"; +} + +.ym-custom-autorenew:before { + content: "\e682"; +} + +.ym-custom-clipboard-arrow-down:before { + content: "\e782"; +} + +.ym-custom-file-delimited:before { + content: "\e882"; +} + +.ym-custom-human-handsup:before { + content: "\e982"; +} + +.ym-custom-numeric--box-outline7:before { + content: "\ea82"; +} + +.ym-custom-server-minus:before { + content: "\eb82"; +} + +.ym-custom-vector-arrange-above:before { + content: "\ec82"; +} + +.ym-custom-av-timer:before { + content: "\e683"; +} + +.ym-custom-clipboard-alert:before { + content: "\e783"; +} + +.ym-custom-file-document-box:before { + content: "\e883"; +} + +.ym-custom-human-handsdown:before { + content: "\e983"; +} + +.ym-custom-numeric--box8:before { + content: "\ea83"; +} + +.ym-custom-server:before { + content: "\eb83"; +} + +.ym-custom-usb:before { + content: "\ec83"; +} + +.ym-custom-backspace:before { + content: "\e684"; +} + +.ym-custom-clipboard-arrow-left:before { + content: "\e784"; +} + +.ym-custom-file-excel:before { + content: "\e884"; +} + +.ym-custom-human-male-female:before { + content: "\e984"; +} + +.ym-custom-numeric--box-multiple-outline8:before { + content: "\ea84"; +} + +.ym-custom-server-network-off:before { + content: "\eb84"; +} + +.ym-custom-vector-arrange-below:before { + content: "\ec84"; +} + +.ym-custom-backburger:before { + content: "\e685"; +} + +.ym-custom-clipboard-check:before { + content: "\e785"; +} + +.ym-custom-file-document:before { + content: "\e885"; +} + +.ym-custom-human-male:before { + content: "\e985"; +} + +.ym-custom-numeric--box9:before { + content: "\ea85"; +} + +.ym-custom-server-network:before { + content: "\eb85"; +} + +.ym-custom-vector-circle:before { + content: "\ec85"; +} + +.ym-custom-baby-buggy:before { + content: "\e686"; +} + +.ym-custom-clipboard-flow:before { + content: "\e786"; +} + +.ym-custom-file-excel-box:before { + content: "\e886"; +} + +.ym-custom-human-pregnant:before { + content: "\e986"; +} + +.ym-custom-numeric--box-outline8:before { + content: "\ea86"; +} + +.ym-custom-server-off:before { + content: "\eb86"; +} + +.ym-custom-vector-combine:before { + content: "\ec86"; +} + +.ym-custom-baby:before { + content: "\e687"; +} + +.ym-custom-clipboard-outline:before { + content: "\e787"; +} + +.ym-custom-file-export:before { + content: "\e887"; +} + +.ym-custom-image:before { + content: "\e987"; +} + +.ym-custom-numeric--box-multiple-outline9:before { + content: "\ea87"; +} + +.ym-custom-server-plus:before { + content: "\eb87"; +} + +.ym-custom-vector-circle-variant:before { + content: "\ec87"; +} + +.ym-custom-bandcamp:before { + content: "\e688"; +} + +.ym-custom-clipboard-text:before { + content: "\e788"; +} + +.ym-custom-file-find:before { + content: "\e888"; +} + +.ym-custom-image-album:before { + content: "\e988"; +} + +.ym-custom-numeric--box-outline9:before { + content: "\ea88"; +} + +.ym-custom-server-remove:before { + content: "\eb88"; +} + +.ym-custom-vector-curve:before { + content: "\ec88"; +} + +.ym-custom-bank:before { + content: "\e689"; +} + +.ym-custom-clippy:before { + content: "\e789"; +} + +.ym-custom-file-image:before { + content: "\e889"; +} + +.ym-custom-image-area:before { + content: "\e989"; +} + +.ym-custom-numeric--plus-box:before { + content: "\ea89"; +} + +.ym-custom-shape-circle-plus:before { + content: "\eb89"; +} + +.ym-custom-vector-difference:before { + content: "\ec89"; +} + +.ym-custom-backup-restore:before { + content: "\e68a"; +} + +.ym-custom-clock:before { + content: "\e78a"; +} + +.ym-custom-file-hidden:before { + content: "\e88a"; +} + +.ym-custom-image-area-close:before { + content: "\e98a"; +} + +.ym-custom-numeric--plus-box-multiple-outline:before { + content: "\ea8a"; +} + +.ym-custom-server-security:before { + content: "\eb8a"; +} + +.ym-custom-vector-difference-ba:before { + content: "\ec8a"; +} + +.ym-custom-barley:before { + content: "\e68b"; +} + +.ym-custom-clock-end:before { + content: "\e78b"; +} + +.ym-custom-file-import:before { + content: "\e88b"; +} + +.ym-custom-image-filter-black-white:before { + content: "\e98b"; +} + +.ym-custom-nutrition:before { + content: "\ea8b"; +} + +.ym-custom-settings-box:before { + content: "\eb8b"; +} + +.ym-custom-vector-difference-ab:before { + content: "\ec8b"; +} + +.ym-custom-barcode-scan:before { + content: "\e68c"; +} + +.ym-custom-clock-alert:before { + content: "\e78c"; +} + +.ym-custom-file-lock:before { + content: "\e88c"; +} + +.ym-custom-image-filter:before { + content: "\e98c"; +} + +.ym-custom-numeric--plus-box-outline:before { + content: "\ea8c"; +} + +.ym-custom-shape-polygon-plus:before { + content: "\eb8c"; +} + +.ym-custom-vector-line:before { + content: "\ec8c"; +} + +.ym-custom-barcode:before { + content: "\e68d"; +} + +.ym-custom-clock-in:before { + content: "\e78d"; +} + +.ym-custom-file-multiple:before { + content: "\e88d"; +} + +.ym-custom-image-broken-variant:before { + content: "\e98d"; +} + +.ym-custom-oar:before { + content: "\ea8d"; +} + +.ym-custom-settings:before { + content: "\eb8d"; +} + +.ym-custom-vector-intersection:before { + content: "\ec8d"; +} + +.ym-custom-barrel:before { + content: "\e68e"; +} + +.ym-custom-clock-out:before { + content: "\e78e"; +} + +.ym-custom-file-outline:before { + content: "\e88e"; +} + +.ym-custom-image-broken:before { + content: "\e98e"; +} + +.ym-custom-octagon:before { + content: "\ea8e"; +} + +.ym-custom-shape-plus:before { + content: "\eb8e"; +} + +.ym-custom-vector-point:before { + content: "\ec8e"; +} + +.ym-custom-basecamp:before { + content: "\e68f"; +} + +.ym-custom-clock-fast:before { + content: "\e78f"; +} + +.ym-custom-file-music:before { + content: "\e88f"; +} + +.ym-custom-image-filter-center-focus-weak:before { + content: "\e98f"; +} + +.ym-custom-octagon-outline:before { + content: "\ea8f"; +} + +.ym-custom-share:before { + content: "\eb8f"; +} + +.ym-custom-vector-polygon:before { + content: "\ec8f"; +} + +.ym-custom-basket:before { + content: "\e690"; +} + +.ym-custom-clock-start:before { + content: "\e790"; +} + +.ym-custom-file-pdf:before { + content: "\e890"; +} + +.ym-custom-image-filter-center-focus:before { + content: "\e990"; +} + +.ym-custom-odnoklassniki:before { + content: "\ea90"; +} + +.ym-custom-shape-square-plus:before { + content: "\eb90"; +} + +.ym-custom-vector-polyline:before { + content: "\ec90"; +} + +.ym-custom-basket-fill:before { + content: "\e691"; +} + +.ym-custom-close-box:before { + content: "\e791"; +} + +.ym-custom-file-powerpoint:before { + content: "\e891"; +} + +.ym-custom-image-filter-drama:before { + content: "\e991"; +} + +.ym-custom-office:before { + content: "\ea91"; +} + +.ym-custom-share-variant:before { + content: "\eb91"; +} + +.ym-custom-vector-rectangle:before { + content: "\ec91"; +} + +.ym-custom-battery:before { + content: "\e692"; +} + +.ym-custom-close-box-outline:before { + content: "\e792"; +} + +.ym-custom-file-pdf-box:before { + content: "\e892"; +} + +.ym-custom-image-filter-frames:before { + content: "\e992"; +} + +.ym-custom-oil-temperature:before { + content: "\ea92"; +} + +.ym-custom-shield:before { + content: "\eb92"; +} + +.ym-custom-vector-selection:before { + content: "\ec92"; +} + +.ym-custom-basket-unfill:before { + content: "\e693"; +} + +.ym-custom-close-circle:before { + content: "\e793"; +} + +.ym-custom-file-powerpoint-box:before { + content: "\e893"; +} + +.ym-custom-image-filter-hdr:before { + content: "\e993"; +} + +.ym-custom-oil:before { + content: "\ea93"; +} + +.ym-custom-shopping:before { + content: "\eb93"; +} + +.ym-custom-vector-square:before { + content: "\ec93"; +} + +.ym-custom-battery-:before { + content: "\e694"; +} + +.ym-custom-close-circle-outline:before { + content: "\e794"; +} + +.ym-custom-file-restore:before { + content: "\e894"; +} + +.ym-custom-image-filter-none:before { + content: "\e994"; +} + +.ym-custom-omega:before { + content: "\ea94"; +} + +.ym-custom-shovel:before { + content: "\eb94"; +} + +.ym-custom-vector-triangle:before { + content: "\ec94"; +} + +.ym-custom-battery-1:before { + content: "\e695"; +} + +.ym-custom-close:before { + content: "\e795"; +} + +.ym-custom-file-send:before { + content: "\e895"; +} + +.ym-custom-image-filter-tilt-shift:before { + content: "\e995"; +} + +.ym-custom-opacity:before { + content: "\ea95"; +} + +.ym-custom-shopping-music:before { + content: "\eb95"; +} + +.ym-custom-vector-union:before { + content: "\ec95"; +} + +.ym-custom-battery-2:before { + content: "\e696"; +} + +.ym-custom-closed-caption:before { + content: "\e796"; +} + +.ym-custom-file-tree:before { + content: "\e896"; +} + +.ym-custom-image-filter-vintage:before { + content: "\e996"; +} + +.ym-custom-onedrive:before { + content: "\ea96"; +} + +.ym-custom-shovel-off:before { + content: "\eb96"; +} + +.ym-custom-vibrate:before { + content: "\ec96"; +} + +.ym-custom-battery-3:before { + content: "\e697"; +} + +.ym-custom-close-octagon:before { + content: "\e797"; +} + +.ym-custom-file-video:before { + content: "\e897"; +} + +.ym-custom-image-multiple:before { + content: "\e997"; +} + +.ym-custom-openid:before { + content: "\ea97"; +} + +.ym-custom-shredder:before { + content: "\eb97"; +} + +.ym-custom-verified:before { + content: "\ec97"; +} + +.ym-custom-battery-4:before { + content: "\e698"; +} + +.ym-custom-close-outline:before { + content: "\e798"; +} + +.ym-custom-file-word:before { + content: "\e898"; +} + +.ym-custom-import:before { + content: "\e998"; +} + +.ym-custom-open-in-new:before { + content: "\ea98"; +} + +.ym-custom-shuffle:before { + content: "\eb98"; +} + +.ym-custom-video:before { + content: "\ec98"; +} + +.ym-custom-battery-5:before { + content: "\e699"; +} + +.ym-custom-close-network:before { + content: "\e799"; +} + +.ym-custom-file-presentation-box:before { + content: "\e899"; +} + +.ym-custom-inbox-arrow-down:before { + content: "\e999"; +} + +.ym-custom-open-in-app:before { + content: "\ea99"; +} + +.ym-custom-shuffle-disabled:before { + content: "\eb99"; +} + +.ym-custom-video-off:before { + content: "\ec99"; +} + +.ym-custom-battery-6:before { + content: "\e69a"; +} + +.ym-custom-cloud:before { + content: "\e79a"; +} + +.ym-custom-file-word-box:before { + content: "\e89a"; +} + +.ym-custom-inbox:before { + content: "\e99a"; +} + +.ym-custom-opera:before { + content: "\ea9a"; +} + +.ym-custom-shuffle-variant:before { + content: "\eb9a"; +} + +.ym-custom-video-switch:before { + content: "\ec9a"; +} + +.ym-custom-battery-7:before { + content: "\e69b"; +} + +.ym-custom-close-octagon-outline:before { + content: "\e79b"; +} + +.ym-custom-file-xml:before { + content: "\e89b"; +} + +.ym-custom-incognito:before { + content: "\e99b"; +} + +.ym-custom-ornament:before { + content: "\ea9b"; +} + +.ym-custom-shape-rectangle-plus:before { + content: "\eb9b"; +} + +.ym-custom-view-agenda:before { + content: "\ec9b"; +} + +.ym-custom-battery-8:before { + content: "\e69c"; +} + +.ym-custom-cloud-check:before { + content: "\e79c"; +} + +.ym-custom-film:before { + content: "\e89c"; +} + +.ym-custom-inbox-arrow-up:before { + content: "\e99c"; +} + +.ym-custom-ornament-variant:before { + content: "\ea9c"; +} + +.ym-custom-shield-outline:before { + content: "\eb9c"; +} + +.ym-custom-view-array:before { + content: "\ec9c"; +} + +.ym-custom-battery-charging-:before { + content: "\e69d"; +} + +.ym-custom-cloud-download:before { + content: "\e79d"; +} + +.ym-custom-filmstrip:before { + content: "\e89d"; +} + +.ym-custom-infinity:before { + content: "\e99d"; +} + +.ym-custom-owl:before { + content: "\ea9d"; +} + +.ym-custom-sigma:before { + content: "\eb9d"; +} + +.ym-custom-view-carousel:before { + content: "\ec9d"; +} + +.ym-custom-battery-alert:before { + content: "\e69e"; +} + +.ym-custom-cloud-outline-off:before { + content: "\e79e"; +} + +.ym-custom-filmstrip-off:before { + content: "\e89e"; +} + +.ym-custom-information-outline:before { + content: "\e99e"; +} + +.ym-custom-package:before { + content: "\ea9e"; +} + +.ym-custom-sigma-lower:before { + content: "\eb9e"; +} + +.ym-custom-view-column:before { + content: "\ec9e"; +} + +.ym-custom-battery-charging:before { + content: "\e69f"; +} + +.ym-custom-cloud-outline:before { + content: "\e79f"; +} + +.ym-custom-filter:before { + content: "\e89f"; +} + +.ym-custom-information:before { + content: "\e99f"; +} + +.ym-custom-package-down:before { + content: "\ea9f"; +} + +.ym-custom-signal:before { + content: "\eb9f"; +} + +.ym-custom-view-dashboard:before { + content: "\ec9f"; +} + +.ym-custom-battery-charging-1:before { + content: "\e6a0"; +} + +.ym-custom-cloud-circle:before { + content: "\e7a0"; +} + +.ym-custom-filter-remove:before { + content: "\e8a0"; +} + +.ym-custom-information-variant:before { + content: "\e9a0"; +} + +.ym-custom-package-up:before { + content: "\eaa0"; +} + +.ym-custom-signal-g:before { + content: "\eba0"; +} + +.ym-custom-view-day:before { + content: "\eca0"; +} + +.ym-custom-battery-charging-2:before { + content: "\e6a1"; +} + +.ym-custom-cloud-print:before { + content: "\e7a1"; +} + +.ym-custom-filter-remove-outline:before { + content: "\e8a1"; +} + +.ym-custom-instagram:before { + content: "\e9a1"; +} + +.ym-custom-package-variant:before { + content: "\eaa1"; +} + +.ym-custom-signal-g1:before { + content: "\eba1"; +} + +.ym-custom-view-list:before { + content: "\eca1"; +} \ No newline at end of file diff --git a/public/css/fonts/ym-custom/iconfont.ttf b/public/css/fonts/ym-custom/iconfont.ttf new file mode 100644 index 0000000..adee1d9 Binary files /dev/null and b/public/css/fonts/ym-custom/iconfont.ttf differ diff --git a/public/css/fonts/ym-custom/iconfont.woff b/public/css/fonts/ym-custom/iconfont.woff new file mode 100644 index 0000000..ec8d93d Binary files /dev/null and b/public/css/fonts/ym-custom/iconfont.woff differ diff --git a/public/css/fonts/ym-custom/iconfont.woff2 b/public/css/fonts/ym-custom/iconfont.woff2 new file mode 100644 index 0000000..d2a9837 Binary files /dev/null and b/public/css/fonts/ym-custom/iconfont.woff2 differ diff --git a/public/css/fonts/ym/iconfont.css b/public/css/fonts/ym/iconfont.css new file mode 100644 index 0000000..0d66857 --- /dev/null +++ b/public/css/fonts/ym/iconfont.css @@ -0,0 +1,2527 @@ +@font-face { + font-family: "icon-ym"; /* Project id 3271933 */ + src: url('iconfont.woff2?t=1740455314854') format('woff2'), + url('iconfont.woff?t=1740455314854') format('woff'), + url('iconfont.ttf?t=1740455314854') format('truetype'); +} + +.icon-ym { + font-family: "icon-ym" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-ym-ai:before { + content: "\e97a"; +} + +.icon-ym-harmonyOS:before { + content: "\e979"; +} + +.icon-ym-flow-node-paste:before { + content: "\e974"; +} + +.icon-ym-flow-node-parallel:before { + content: "\e975"; +} + +.icon-ym-flow-node-copy:before { + content: "\e976"; +} + +.icon-ym-ai-list:before { + content: "\e977"; +} + +.icon-ym-flow-node-condition-multiple:before { + content: "\e978"; +} + +.icon-ym-flow-node-cope:before { + content: "\e96f"; +} + +.icon-ym-select-cell:before { + content: "\e970"; +} + +.icon-ym-flow-node-condition-single:before { + content: "\e971"; +} + +.icon-ym-shortcut1:before { + content: "\e972"; +} + +.icon-ym-ai-form:before { + content: "\e973"; +} + +.icon-ym-right-join:before { + content: "\e96b"; +} + +.icon-ym-left-join:before { + content: "\e96c"; +} + +.icon-ym-inner-join:before { + content: "\e96d"; +} + +.icon-ym-full-join:before { + content: "\e96e"; +} + +.icon-ym-flow-trigger-timer:before { + content: "\e968"; +} + +.icon-ym-flow-trigger-event:before { + content: "\e969"; +} + +.icon-ym-dataLog:before { + content: "\e96a"; +} + +.icon-ym-save:before { + content: "\e962"; +} + +.icon-ym-flow-view:before { + content: "\e963"; +} + +.icon-ym-batch-action:before { + content: "\e964"; +} + +.icon-ym-print-template:before { + content: "\e965"; +} + +.icon-ym-flow-trigger-webhook:before { + content: "\e966"; +} + +.icon-ym-flow-trigger-notice:before { + content: "\e967"; +} + +.icon-ym-kit:before { + content: "\e960"; +} + +.icon-ym-kit-fill:before { + content: "\e961"; +} + +.icon-ym-tip:before { + content: "\e934"; +} + +.icon-ym-flow-minus:before { + content: "\e935"; +} + +.icon-ym-flow-history:before { + content: "\e936"; +} + +.icon-ym-flow-align-middle:before { + content: "\e938"; +} + +.icon-ym-flow-align-bottom:before { + content: "\e93c"; +} + +.icon-ym-beautify-horizontal:before { + content: "\e949"; +} + +.icon-ym-flow-aerial-view:before { + content: "\e94a"; +} + +.icon-ym-flow-align-center:before { + content: "\e950"; +} + +.icon-ym-beautify-vertical:before { + content: "\e954"; +} + +.icon-ym-flow-align-left:before { + content: "\e90a"; +} + +.icon-ym-flow-selection:before { + content: "\e911"; +} + +.icon-ym-flow-node-timer1:before { + content: "\e915"; +} + +.icon-ym-flow-shortcut:before { + content: "\e91d"; +} + +.icon-ym-flow-focus:before { + content: "\e922"; +} + +.icon-ym-flow-node-approve:before { + content: "\e923"; +} + +.icon-ym-flow-plus:before { + content: "\e925"; +} + +.icon-ym-flow-node-system-task:before { + content: "\e927"; +} + +.icon-ym-flow-move:before { + content: "\e92b"; +} + +.icon-ym-flow-align-let:before { + content: "\e92c"; +} + +.icon-ym-redo:before { + content: "\e92d"; +} + +.icon-ym-flow-align-right:before { + content: "\e930"; +} + +.icon-ym-undo:before { + content: "\e932"; +} + +.icon-ym-flow-align-top:before { + content: "\e904"; +} + +.icon-ym-hLine:before { + content: "\e951"; +} + +.icon-ym-vLine:before { + content: "\e953"; +} + +.icon-ym-header-notice:before { + content: "\e95f"; +} + +.icon-ym-header-fullscreen1:before { + content: "\e917"; +} + +.icon-ym-cell:before { + content: "\e928"; +} + +.icon-ym-header-search:before { + content: "\e92e"; +} + +.icon-ym-header-config:before { + content: "\e92f"; +} + +.icon-ym-header-fullscreen-exit1:before { + content: "\e956"; +} + +.icon-ym-flowToSign:before { + content: "\e95d"; +} + +.icon-ym-flowDoing:before { + content: "\e95e"; +} + +.icon-ym-header-chat:before { + content: "\e907"; +} + +.icon-ym-header-sys-toggle:before { + content: "\e90d"; +} + +.icon-ym-schedule:before { + content: "\e910"; +} + +.icon-ym-caret-left:before { + content: "\e95c"; +} + +.icon-ym-btn-export1:before { + content: "\e959"; +} + +.icon-ym-caret-right:before { + content: "\e95a"; +} + +.icon-ym-btn-import1:before { + content: "\e95b"; +} + +.icon-ym-rect:before { + content: "\e955"; +} + +.icon-ym-combination:before { + content: "\e957"; +} + +.icon-ym-oval:before { + content: "\e958"; +} + +.icon-ym-header-star-fill:before { + content: "\e952"; +} + +.icon-ym-flow-node-subFlow:before { + content: "\e93a"; +} + +.icon-ym-flow-node-end:before { + content: "\e93d"; +} + +.icon-ym-flow-node-branch:before { + content: "\e943"; +} + +.icon-ym-flow-node-condition:before { + content: "\e919"; +} + +.icon-ym-flow-node-timer:before { + content: "\e92a"; +} + +.icon-ym-flow-node-interflow:before { + content: "\e933"; +} + +.icon-ym-recovery:before { + content: "\e94f"; +} + +.icon-ym-share-cancel:before { + content: "\e94e"; +} + +.icon-ym-upload1:before { + content: "\e91f"; +} + +.icon-ym-add-folder:before { + content: "\e94d"; +} + +.icon-ym-tile-mode:before { + content: "\e94b"; +} + +.icon-ym-folder:before { + content: "\e94c"; +} + +.icon-ym-app-more:before { + content: "\e916"; +} + +.icon-ym-add-cancel:before { + content: "\e940"; +} + +.icon-ym-app-rename:before { + content: "\e941"; +} + +.icon-ym-flow-node-start:before { + content: "\e942"; +} + +.icon-ym-app-role-toggle:before { + content: "\e944"; +} + +.icon-ym-auth-group:before { + content: "\e945"; +} + +.icon-ym-app-delete:before { + content: "\e946"; +} + +.icon-ym-app-share:before { + content: "\e947"; +} + +.icon-ym-app-schedule:before { + content: "\e948"; +} + +.icon-ym-dark:before { + content: "\e937"; +} + +.icon-ym-app-todo:before { + content: "\e939"; +} + +.icon-ym-app-download:before { + content: "\e93b"; +} + +.icon-ym-app-move:before { + content: "\e93e"; +} + +.icon-ym-app-document:before { + content: "\e93f"; +} + +.icon-ym-header-star:before { + content: "\e929"; +} + +.icon-ym-msg-read-all:before { + content: "\e931"; +} + +.icon-ym-more-vertical:before { + content: "\e91e"; +} + +.icon-ym-more:before { + content: "\e920"; +} + +.icon-ym-header-fullscreen:before { + content: "\e921"; +} + +.icon-ym-nav-home-fill:before { + content: "\e924"; +} + +.icon-ym-tip-filled:before { + content: "\e926"; +} + +.icon-ym-flow-line:before { + content: "\e912"; +} + +.icon-ym-header-refresh:before { + content: "\e913"; +} + +.icon-ym-shareMe-filled:before { + content: "\e914"; +} + +.icon-ym-share-filled:before { + content: "\e918"; +} + +.icon-ym-trash-filled:before { + content: "\e91a"; +} + +.icon-ym-header-lang:before { + content: "\e91b"; +} + +.icon-ym-app-entrust:before { + content: "\e91c"; +} + +.icon-ym-release:before { + content: "\e90e"; +} + +.icon-ym-star-filled:before { + content: "\e90f"; +} + +.icon-ym-header-role-toggle:before { + content: "\e906"; +} + +.icon-ym-light:before { + content: "\e908"; +} + +.icon-ym-header-fullscreen-exit:before { + content: "\e909"; +} + +.icon-ym-org-tree:before { + content: "\e90b"; +} + +.icon-ym-app-checkAll:before { + content: "\e90c"; +} + +.icon-ym-thumb-mode:before { + content: "\e905"; +} + +.icon-ym-generator-steps:before { + content: "\e7ed"; +} + +.icon-ym-portal-custom-echart:before { + content: "\e903"; +} + +.icon-ym-signature1:before { + content: "\e902"; +} + +.icon-ym-launch:before { + content: "\e901"; +} + +.icon-ym-turn:before { + content: "\e8fa"; +} + +.icon-ym-roll-call:before { + content: "\e8fb"; +} + +.icon-ym-comment-img:before { + content: "\e8fc"; +} + +.icon-ym-condition:before { + content: "\e8fd"; +} + +.icon-ym-generator-iframe:before { + content: "\e8fe"; +} + +.icon-ym-edit:before { + content: "\e8ff"; +} + +.icon-ym-comment-file:before { + content: "\e900"; +} + +.icon-ym-emoji:before { + content: "\e8f7"; +} + +.icon-ym-generator-location:before { + content: "\e8f8"; +} + +.icon-ym-chat:before { + content: "\e8f9"; +} + +.icon-ym-synForThird:before { + content: "\e8f6"; +} + +.icon-ym-authGroup:before { + content: "\e8f2"; +} + +.icon-ym-fail:before { + content: "\e8f3"; +} + +.icon-ym-success:before { + content: "\e8f4"; +} + +.icon-ym-clock:before { + content: "\e8f5"; +} + +.icon-ym-view:before { + content: "\e8f1"; +} + +.icon-ym-shortcut:before { + content: "\e8f0"; +} + +.icon-ym-liveData:before { + content: "\e8ef"; +} + +.icon-ym-generator-autoComplete:before { + content: "\e8eb"; +} + +.icon-ym-contacts:before { + content: "\e8ec"; +} + +.icon-ym-portal-text:before { + content: "\e8ed"; +} + +.icon-ym-portal-mapChart:before { + content: "\e8ee"; +} + +.icon-ym-generator-tableGrid:before { + content: "\e8db"; +} + +.icon-ym-portal-card:before { + content: "\e8dc"; +} + +.icon-ym-portal-carousel:before { + content: "\e8dd"; +} + +.icon-ym-generator-insertCol:before { + content: "\e8de"; +} + +.icon-ym-generator-insertRow:before { + content: "\e8df"; +} + +.icon-ym-btn-batch:before { + content: "\e8e0"; +} + +.icon-ym-portal-collapse:before { + content: "\e8e1"; +} + +.icon-ym-portal-rankList:before { + content: "\e8e2"; +} + +.icon-ym-portal-image:before { + content: "\e8e3"; +} + +.icon-ym-portal-tab:before { + content: "\e8e4"; +} + +.icon-ym-portal-video:before { + content: "\e8e5"; +} + +.icon-ym-generator-TableSettings:before { + content: "\e8e6"; +} + +.icon-ym-btn-common:before { + content: "\e8e7"; +} + +.icon-ym-portal-iframe:before { + content: "\e8e8"; +} + +.icon-ym-portal-timeAxis:before { + content: "\e8e9"; +} + +.icon-ym-portal-schedule:before { + content: "\e8ea"; +} + +.icon-ym-flowEntrust-app:before { + content: "\e8da"; +} + +.icon-ym-btn-download:before { + content: "\e8d9"; +} + +.icon-ym-btn-upload:before { + content: "\e8d7"; +} + +.icon-ym-right:before { + content: "\e8d4"; +} + +.icon-ym-left:before { + content: "\e8d5"; +} + +.icon-ym-arrow-down:before { + content: "\e8d6"; +} + +.icon-ym-add-flow:before { + content: "\e8d8"; +} + +.icon-ym-launchFlow:before { + content: "\e8d2"; +} + +.icon-ym-funcFlow:before { + content: "\e8d3"; +} + +.icon-ym-accountConfig:before { + content: "\e8cb"; +} + +.icon-ym-sendConfig:before { + content: "\e8cc"; +} + +.icon-ym-smsConfig:before { + content: "\e8cd"; +} + +.icon-ym-emailConfig:before { + content: "\e8ce"; +} + +.icon-ym-msgCenter:before { + content: "\e8cf"; +} + +.icon-ym-msgTemplate:before { + content: "\e8d0"; +} + +.icon-ym-msgMonitor:before { + content: "\e8d1"; +} + +.icon-ym-logo-webhook:before { + content: "\e8ca"; +} + +.icon-ym-logo-github:before { + content: "\e8b0"; +} + +.icon-ym-logo-feishu:before { + content: "\e8c5"; +} + +.icon-ym-logo-dingding:before { + content: "\e8c6"; +} + +.icon-ym-logo-wechat:before { + content: "\e8c7"; +} + +.icon-ym-logo-qq:before { + content: "\e8c8"; +} + +.icon-ym-logo-wxWork:before { + content: "\e8c9"; +} + +.icon-ym-position1:before { + content: "\e8c3"; +} + +.icon-ym-generator-popupTableSelect:before { + content: "\e8c4"; +} + +.icon-ym-gradeManage:before { + content: "\e8c2"; +} + +.icon-ym-fold:before { + content: "\e829"; +} + +.icon-ym-customForm:before { + content: "\e857"; +} + +.icon-ym-branch:before { + content: "\e8b1"; +} + +.icon-ym-codeGeneration1:before { + content: "\e8b2"; +} + +.icon-ym-filter:before { + content: "\e8b3"; +} + +.icon-ym-download:before { + content: "\e8b4"; +} + +.icon-ym-functionForm:before { + content: "\e8b5"; +} + +.icon-ym-unfold:before { + content: "\e8b6"; +} + +.icon-ym-node:before { + content: "\e8b7"; +} + +.icon-ym-nav-home:before { + content: "\e8b8"; +} + +.icon-ym-systemForm:before { + content: "\e8b9"; +} + +.icon-ym-generator-link:before { + content: "\e8ba"; +} + +.icon-ym-timer:before { + content: "\e8bb"; +} + +.icon-ym-generator-alert:before { + content: "\e8bc"; +} + +.icon-ym-generator-group1:before { + content: "\e8bd"; +} + +.icon-ym-generator-role:before { + content: "\e8be"; +} + +.icon-ym-systemToggle:before { + content: "\e8bf"; +} + +.icon-ym-upload:before { + content: "\e8c0"; +} + +.icon-ym-generator-department1:before { + content: "\e8c1"; +} + +.icon-ym-signature:before { + content: "\e8af"; +} + +.icon-ym-yingyong:before { + content: "\e81e"; +} + +.icon-ym-generator-section:before { + content: "\e853"; +} + +.icon-ym-lianxi:before { + content: "\e873"; +} + +.icon-ym-bigScreenExampl:before { + content: "\e755"; +} + +.icon-ym-appForm:before { + content: "\e756"; +} + +.icon-ym-authorize:before { + content: "\e75c"; +} + +.icon-ym-dataApplication:before { + content: "\e75d"; +} + +.icon-ym-dataDictionary:before { + content: "\e76c"; +} + +.icon-ym-codeGeneration:before { + content: "\e76f"; +} + +.icon-ym-documentPreviewExample:before { + content: "\e77b"; +} + +.icon-ym-dataInterface:before { + content: "\e78f"; +} + +.icon-ym-bigScreenDesign:before { + content: "\e7a7"; +} + +.icon-ym-dataSync:before { + content: "\e7ab"; +} + +.icon-ym-extend:before { + content: "\e7b1"; +} + +.icon-ym-flowForm:before { + content: "\e7b2"; +} + +.icon-ym-dataModel:before { + content: "\e7bb"; +} + +.icon-ym-formExample:before { + content: "\e7c8"; +} + +.icon-ym-department:before { + content: "\e812"; +} + +.icon-ym-dataSource:before { + content: "\e816"; +} + +.icon-ym-flowLaunch:before { + content: "\e81b"; +} + +.icon-ym-flowForm1:before { + content: "\e81f"; +} + +.icon-ym-formDesign:before { + content: "\e827"; +} + +.icon-ym-highchartsWordcloud:before { + content: "\e82c"; +} + +.icon-ym-dataBackup:before { + content: "\e830"; +} + +.icon-ym-flowEntrust:before { + content: "\e831"; +} + +.icon-ym-role:before { + content: "\e832"; +} + +.icon-ym-information:before { + content: "\e834"; +} + +.icon-ym-portalDesign:before { + content: "\e83b"; +} + +.icon-ym-highchartsColumn:before { + content: "\e83c"; +} + +.icon-ym-onlineUser:before { + content: "\e83f"; +} + +.icon-ym-sysMonitor:before { + content: "\e842"; +} + +.icon-ym-sysCache:before { + content: "\e843"; +} + +.icon-ym-organization:before { + content: "\e845"; +} + +.icon-ym-flowTodo:before { + content: "\e847"; +} + +.icon-ym-pause:before { + content: "\e849"; +} + +.icon-ym-report-icon-preview-pageIndex:before { + content: "\e84c"; +} + +.icon-ym-sysProvince:before { + content: "\e850"; +} + +.icon-ym-sysNotice:before { + content: "\e851"; +} + +.icon-ym-wf-finishedProduct:before { + content: "\e852"; +} + +.icon-ym-reportExample:before { + content: "\e85d"; +} + +.icon-ym-wf-crmOrder:before { + content: "\e864"; +} + +.icon-ym-signetExample:before { + content: "\e866"; +} + +.icon-ym-position:before { + content: "\e867"; +} + +.icon-ym-permission:before { + content: "\e868"; +} + +.icon-ym-user:before { + content: "\e871"; +} + +.icon-ym-wf-expenseExpenditure:before { + content: "\e877"; +} + +.icon-ym-onlineDevelopment:before { + content: "\e87a"; +} + +.icon-ym-sysBillRule:before { + content: "\e88b"; +} + +.icon-ym-system:before { + content: "\e892"; +} + +.icon-ym-reportDesign:before { + content: "\e896"; +} + +.icon-ym-sysQuartz:before { + content: "\e897"; +} + +.icon-ym-workFlow:before { + content: "\e89e"; +} + +.icon-ym-sysIcon:before { + content: "\e8a4"; +} + +.icon-ym-huibao:before { + content: "\e8a5"; +} + +.icon-ym-webForm:before { + content: "\e8a6"; +} + +.icon-ym-wf-staffOvertime:before { + content: "\e8a7"; +} + +.icon-ym-tree-manage1:before { + content: "\e8a8"; +} + +.icon-ym-webDesign:before { + content: "\e8a9"; +} + +.icon-ym-wf-receiptSign:before { + content: "\e8aa"; +} + +.icon-ym-windows:before { + content: "\e8ab"; +} + +.icon-ym-systemTemplate:before { + content: "\e8ac"; +} + +.icon-ym-sysLog:before { + content: "\e8ad"; +} + +.icon-ym-sysConfig:before { + content: "\e8ae"; +} + +.icon-ym-header-pannel:before { + content: "\e7cf"; +} + +.icon-ym-search:before { + content: "\e804"; +} + +.icon-ym-header-message:before { + content: "\e810"; +} + +.icon-ym-generator-jobs:before { + content: "\e819"; +} + +.icon-ym-clean:before { + content: "\e83e"; +} + +.icon-ym-header-IM:before { + content: "\e899"; +} + +.icon-ym-header-language:before { + content: "\e8a3"; +} + +.icon-ym-flowDone-app:before { + content: "\e7a6"; +} + +.icon-ym-flowLaunch-app:before { + content: "\e7b3"; +} + +.icon-ym-addFlow:before { + content: "\e7b8"; +} + +.icon-ym-flowCopy-app:before { + content: "\e7bf"; +} + +.icon-ym-flowTodo-app:before { + content: "\e8a2"; +} + +.icon-ym-mobile:before { + content: "\e7dc"; +} + +.icon-ym-pc:before { + content: "\e7ee"; +} + +.icon-ym-video-play:before { + content: "\e8a1"; +} + +.icon-ym-header-collapse1:before { + content: "\e809"; +} + +.icon-ym-xitong:before { + content: "\e814"; +} + +.icon-ym-full-screen1:before { + content: "\e7d0"; +} + +.icon-ym-file-html1:before { + content: "\e7d1"; +} + +.icon-ym-generator-area:before { + content: "\e7d2"; +} + +.icon-ym-generator-modifytime:before { + content: "\e7d3"; +} + +.icon-ym-generator-fold:before { + content: "\e7d4"; +} + +.icon-ym-generator-founder:before { + content: "\e7d5"; +} + +.icon-ym-generator-line:before { + content: "\e7d6"; +} + +.icon-ym-generator-department:before { + content: "\e7d7"; +} + +.icon-ym-generator-function:before { + content: "\e7d8"; +} + +.icon-ym-generator-notice:before { + content: "\e7d9"; +} + +.icon-ym-generator-Provinces:before { + content: "\e7da"; +} + +.icon-ym-generator-popup-attr:before { + content: "\e7dd"; +} + +.icon-ym-generator-divider:before { + content: "\e7de"; +} + +.icon-ym-generator-radio:before { + content: "\e7df"; +} + +.icon-ym-generator-menu:before { + content: "\e7e0"; +} + +.icon-ym-generator-popup:before { + content: "\e7e1"; +} + +.icon-ym-generator-input:before { + content: "\e7e2"; +} + +.icon-ym-generator-rich-text:before { + content: "\e7e3"; +} + +.icon-ym-generator-Panel:before { + content: "\e7e4"; +} + +.icon-ym-generator-table:before { + content: "\e7e5"; +} + +.icon-ym-generator-radar:before { + content: "\e7e6"; +} + +.icon-ym-generator-password:before { + content: "\e7e7"; +} + +.icon-ym-generator-component:before { + content: "\e7e8"; +} + +.icon-ym-generator-station:before { + content: "\e7e9"; +} + +.icon-ym-generator-rate:before { + content: "\e7ea"; +} + +.icon-ym-generator-subFlow1:before { + content: "\e7eb"; +} + +.icon-ym-generator-number:before { + content: "\e7ec"; +} + +.icon-ym-generator-flow:before { + content: "\e7ef"; +} + +.icon-ym-generator-color:before { + content: "\e7f0"; +} + +.icon-ym-generator-label:before { + content: "\e7f1"; +} + +.icon-ym-generator-nature:before { + content: "\e7f2"; +} + +.icon-ym-generator-select:before { + content: "\e7f3"; +} + +.icon-ym-generator-slider:before { + content: "\e7f4"; +} + +.icon-ym-generator-qrcode:before { + content: "\e7f5"; +} + +.icon-ym-generator-group:before { + content: "\e7f6"; +} + +.icon-ym-generator-time:before { + content: "\e7f7"; +} + +.icon-ym-generator-user:before { + content: "\e7f8"; +} + +.icon-ym-generator-modifier:before { + content: "\e7f9"; +} + +.icon-ym-h5:before { + content: "\e7fa"; +} + +.icon-ym-generator-tree:before { + content: "\e7fb"; +} + +.icon-ym-gonggao:before { + content: "\e7fc"; +} + +.icon-ym-generator-kanban:before { + content: "\e7fd"; +} + +.icon-ym-generator-textarea:before { + content: "\e7fe"; +} + +.icon-ym-generator-todo:before { + content: "\e7ff"; +} + +.icon-ym-header-loginOut:before { + content: "\e800"; +} + +.icon-ym-header-expand:before { + content: "\e801"; +} + +.icon-ym-generator-time-range:before { + content: "\e802"; +} + +.icon-ym-header-lockScreen:before { + content: "\e803"; +} + +.icon-ym-generator-switch:before { + content: "\e805"; +} + +.icon-ym-header-feedBack:before { + content: "\e806"; +} + +.icon-ym-header-skins:before { + content: "\e807"; +} + +.icon-ym-global-role:before { + content: "\e808"; +} + +.icon-ym-highchartsBullet:before { + content: "\e80b"; +} + +.icon-ym-header-userInfo:before { + content: "\e80c"; +} + +.icon-ym-generator-upload:before { + content: "\e80d"; +} + +.icon-ym-generator-todolist:before { + content: "\e80e"; +} + +.icon-ym-highchartsArea:before { + content: "\e80f"; +} + +.icon-ym-highchartsFunnel:before { + content: "\e811"; +} + +.icon-ym-highcharts:before { + content: "\e813"; +} + +.icon-ym-header-about:before { + content: "\e815"; +} + +.icon-ym-importAndExportExample:before { + content: "\e817"; +} + +.icon-ym-highchartsScatter:before { + content: "\e818"; +} + +.icon-ym-header-language1:before { + content: "\e81a"; +} + +.icon-ym-mpMenu:before { + content: "\e81c"; +} + +.icon-ym-group:before { + content: "\e81d"; +} + +.icon-ym-nav-close:before { + content: "\e820"; +} + +.icon-ym-highchartsLine:before { + content: "\e821"; +} + +.icon-ym-ios:before { + content: "\e822"; +} + +.icon-ym-highchartsBellcurve:before { + content: "\e823"; +} + +.icon-ym-mpMaterial:before { + content: "\e824"; +} + +.icon-ym-mpMessage:before { + content: "\e825"; +} + +.icon-ym-message:before { + content: "\e826"; +} + +.icon-ym-java:before { + content: "\e828"; +} + +.icon-ym-orderDemo:before { + content: "\e82a"; +} + +.icon-ym-position-1:before { + content: "\e82b"; +} + +.icon-ym-nav-next:before { + content: "\e82d"; +} + +.icon-ym-projectExample:before { + content: "\e82f"; +} + +.icon-ym-mapExample:before { + content: "\e833"; +} + +.icon-ym-qyUser:before { + content: "\e835"; +} + +.icon-ym-scanCode1:before { + content: "\e836"; +} + +.icon-ym-report-icon-picture:before { + content: "\e837"; +} + +.icon-ym-mpConfig:before { + content: "\e838"; +} + +.icon-ym-options1:before { + content: "\e839"; +} + +.icon-ym-nav-prev:before { + content: "\e83a"; +} + +.icon-ym-scheduleExample:before { + content: "\e83d"; +} + +.icon-ym-Refresh:before { + content: "\e840"; +} + +.icon-ym-options:before { + content: "\e841"; +} + +.icon-ym-saolian:before { + content: "\e844"; +} + +.icon-ym-shezhi:before { + content: "\e846"; +} + +.icon-ym-sysMenu:before { + content: "\e848"; +} + +.icon-ym-barCodeExample:before { + content: "\e73b"; +} + +.icon-ym-sysLanguage:before { + content: "\e84a"; +} + +.icon-ym-report-icon-pie:before { + content: "\e84b"; +} + +.icon-ym-bigScreenExample1:before { + content: "\e73e"; +} + +.icon-ym-bigDataExample:before { + content: "\e73f"; +} + +.icon-ym-orderExample:before { + content: "\e84d"; +} + +.icon-ym-preview-excel-paging:before { + content: "\e84e"; +} + +.icon-ym-btn-import:before { + content: "\e741"; +} + +.icon-ym-tableExample:before { + content: "\e84f"; +} + +.icon-ym-btn-collapse:before { + content: "\e742"; +} + +.icon-ym-btn-edit:before { + content: "\e743"; +} + +.icon-ym-chartExample:before { + content: "\e744"; +} + +.icon-ym-btn-refresh:before { + content: "\e746"; +} + +.icon-ym-tree-department:before { + content: "\e855"; +} + +.icon-ym-checktriangle:before { + content: "\e747"; +} + +.icon-ym-btn-fields:before { + content: "\e748"; +} + +.icon-ym-tree-department2:before { + content: "\e858"; +} + +.icon-ym-btn-export:before { + content: "\e749"; +} + +.icon-ym-tree-normal1:before { + content: "\e859"; +} + +.icon-ym-btn-preview:before { + content: "\e74a"; +} + +.icon-ym-tree-normal:before { + content: "\e85a"; +} + +.icon-ym-tree-organization3:before { + content: "\e85b"; +} + +.icon-ym-btn-add:before { + content: "\e74c"; +} + +.icon-ym-tree-position2:before { + content: "\e85c"; +} + +.icon-ym-btn-expand:before { + content: "\e74e"; +} + +.icon-ym-tree-user2:before { + content: "\e85e"; +} + +.icon-ym-daiban1:before { + content: "\e74f"; +} + +.icon-ym-tree-department1:before { + content: "\e85f"; +} + +.icon-ym-daka:before { + content: "\e750"; +} + +.icon-ym-tableExample1:before { + content: "\e860"; +} + +.icon-ym-tree-manage:before { + content: "\e861"; +} + +.icon-ym-android:before { + content: "\e752"; +} + +.icon-ym-wf-applyDeliverGoods:before { + content: "\e862"; +} + +.icon-ym-darg:before { + content: "\e753"; +} + +.icon-ym-wechat1:before { + content: "\e863"; +} + +.icon-ym-duties:before { + content: "\e754"; +} + +.icon-ym-tree-position1:before { + content: "\e865"; +} + +.icon-ym-echartsColumn:before { + content: "\e757"; +} + +.icon-ym-delete:before { + content: "\e758"; +} + +.icon-ym-echartsCandlestick:before { + content: "\e759"; +} + +.icon-ym-visual-studio:before { + content: "\e869"; +} + +.icon-ym-btn-remove:before { + content: "\e75a"; +} + +.icon-ym-wf-conBilling:before { + content: "\e86a"; +} + +.icon-ym-echartsFunnel:before { + content: "\e75b"; +} + +.icon-ym-wf-batchPack:before { + content: "\e86b"; +} + +.icon-ym-tree-department-1:before { + content: "\e86c"; +} + +.icon-ym-wf-articlesWarehous:before { + content: "\e86d"; +} + +.icon-ym-emailExample:before { + content: "\e75e"; +} + +.icon-ym-wf-applyMeeting:before { + content: "\e86e"; +} + +.icon-ym-dingdang:before { + content: "\e75f"; +} + +.icon-ym-wf-batchTable:before { + content: "\e86f"; +} + +.icon-ym-echartsLineArea:before { + content: "\e760"; +} + +.icon-ym-wf-applyBanquet:before { + content: "\e870"; +} + +.icon-ym-crm:before { + content: "\e761"; +} + +.icon-ym-extend-ambulance:before { + content: "\e762"; +} + +.icon-ym-wf-documentApproval:before { + content: "\e872"; +} + +.icon-ym-echartsScatter:before { + content: "\e763"; +} + +.icon-ym-wf-archivalBorrow:before { + content: "\e874"; +} + +.icon-ym-dbLink:before { + content: "\e764"; +} + +.icon-ym-wf-debitBill:before { + content: "\e875"; +} + +.icon-ym-dot-net:before { + content: "\e765"; +} + +.icon-ym-weChat:before { + content: "\e876"; +} + +.icon-ym-extend-exclamation-triangle:before { + content: "\e766"; +} + +.icon-ym-btn-copy:before { + content: "\e767"; +} + +.icon-ym-wf-contractApproval:before { + content: "\e879"; +} + +.icon-ym-documentExample:before { + content: "\e768"; +} + +.icon-ym-echartsLineBar:before { + content: "\e769"; +} + +.icon-ym-wf-documentSigning:before { + content: "\e87b"; +} + +.icon-ym-extend-clock:before { + content: "\e76a"; +} + +.icon-ym-wf-contractApprovalSheet:before { + content: "\e87d"; +} + +.icon-ym-extend-check-circle-o:before { + content: "\e76b"; +} + +.icon-ym-wf-leaveApply:before { + content: "\e87f"; +} + +.icon-ym-wf-letterService:before { + content: "\e880"; +} + +.icon-ym-erweima:before { + content: "\e76d"; +} + +.icon-ym-wf-officeSupplies:before { + content: "\e881"; +} + +.icon-ym-echartsBarAcross:before { + content: "\e76e"; +} + +.icon-ym-wf-payDistribution:before { + content: "\e882"; +} + +.icon-ym-wf-incomeRecognition:before { + content: "\e883"; +} + +.icon-ym-extend-eye:before { + content: "\e770"; +} + +.icon-ym-wf-postBatchTab:before { + content: "\e884"; +} + +.icon-ym-extend-circle:before { + content: "\e771"; +} + +.icon-ym-wf-quotationApproval:before { + content: "\e885"; +} + +.icon-ym-extend-bar-chart:before { + content: "\e772"; +} + +.icon-ym-wf-rewardPunishment:before { + content: "\e886"; +} + +.icon-ym-extend-mail-forward:before { + content: "\e773"; +} + +.icon-ym-wf-monthlyReport:before { + content: "\e887"; +} + +.icon-ym-extend-car:before { + content: "\e774"; +} + +.icon-ym-wf-materialRequisition:before { + content: "\e888"; +} + +.icon-ym-extend-meh:before { + content: "\e775"; +} + +.icon-ym-wf-procurementMaterial:before { + content: "\e889"; +} + +.icon-ym-extend-cog:before { + content: "\e776"; +} + +.icon-ym-wf-outboundOrder:before { + content: "\e88a"; +} + +.icon-ym-extend-minus-circle:before { + content: "\e777"; +} + +.icon-ym-echartsPie:before { + content: "\e778"; +} + +.icon-ym-wf-receiptProcessing:before { + content: "\e88c"; +} + +.icon-ym-extend-envelope:before { + content: "\e779"; +} + +.icon-ym-wf-salesOrder:before { + content: "\e88d"; +} + +.icon-ym-compress-screen:before { + content: "\e77a"; +} + +.icon-ym-wf-salesSupport:before { + content: "\e88e"; +} + +.icon-ym-wf-travelApply:before { + content: "\e88f"; +} + +.icon-ym-echartsTree:before { + content: "\e77c"; +} + +.icon-ym-wf-paymentApply:before { + content: "\e890"; +} + +.icon-ym-extend-star-o:before { + content: "\e77d"; +} + +.icon-ym-wf-violationHandling:before { + content: "\e891"; +} + +.icon-ym-extend-paper-plane:before { + content: "\e77e"; +} + +.icon-ym-extend-history:before { + content: "\e77f"; +} + +.icon-ym-wf-purchaseList:before { + content: "\e893"; +} + +.icon-ym-echartsGauge:before { + content: "\e780"; +} + +.icon-ym-wf-warehouseReceipt:before { + content: "\e894"; +} + +.icon-ym-extend-edit:before { + content: "\e781"; +} + +.icon-ym-wf-workContactSheet:before { + content: "\e895"; +} + +.icon-ym-extend-plane:before { + content: "\e782"; +} + +.icon-ym-file-blank:before { + content: "\e783"; +} + +.icon-ym-extend-folder-open:before { + content: "\e784"; +} + +.icon-ym-wf-travelReimbursement:before { + content: "\e898"; +} + +.icon-ym-extend-thumbs-up:before { + content: "\e785"; +} + +.icon-ym-extend-truck:before { + content: "\e786"; +} + +.icon-ym-wf-supplementCard:before { + content: "\e89a"; +} + +.icon-ym-extend-folder:before { + content: "\e787"; +} + +.icon-ym-zhanghao:before { + content: "\e89b"; +} + +.icon-ym-extend-paperclip:before { + content: "\e788"; +} + +.icon-ym-zuzhi:before { + content: "\e89c"; +} + +.icon-ym-extend-star:before { + content: "\e789"; +} + +.icon-ym-xingcheng:before { + content: "\e89d"; +} + +.icon-ym-extend-train:before { + content: "\e78a"; +} + +.icon-ym-extend-motorcycle:before { + content: "\e78b"; +} + +.icon-ym-wf-vehicleApply:before { + content: "\e89f"; +} + +.icon-ym-file-photo:before { + content: "\e78c"; +} + +.icon-ym-zujian:before { + content: "\e8a0"; +} + +.icon-ym-extend-subway:before { + content: "\e78d"; +} + +.icon-ym-extend-envelope-open-o:before { + content: "\e78e"; +} + +.icon-ym-file-csv1:before { + content: "\e790"; +} + +.icon-ym-extend-pencil:before { + content: "\e791"; +} + +.icon-ym-extend-bicycle:before { + content: "\e792"; +} + +.icon-ym-extend-save:before { + content: "\e793"; +} + +.icon-ym-extend-trash:before { + content: "\e795"; +} + +.icon-ym-extend-bus:before { + content: "\e796"; +} + +.icon-ym-file-eps:before { + content: "\e797"; +} + +.icon-ym-file-ai:before { + content: "\e798"; +} + +.icon-ym-extend-share:before { + content: "\e799"; +} + +.icon-ym-file-audio:before { + content: "\e79b"; +} + +.icon-ym-file-word:before { + content: "\e79c"; +} + +.icon-ym-file-pdf:before { + content: "\e79d"; +} + +.icon-ym-file-code:before { + content: "\e79f"; +} + +.icon-ym-flowCirculate:before { + content: "\e7a1"; +} + +.icon-ym-file-ppt:before { + content: "\e7a4"; +} + +.icon-ym-file-video:before { + content: "\e7a5"; +} + +.icon-ym-file-zip:before { + content: "\e7a8"; +} + +.icon-ym-flowDone:before { + content: "\e7a9"; +} + +.icon-ym-file-psd:before { + content: "\e7aa"; +} + +.icon-ym-gangwei2:before { + content: "\e7ac"; +} + +.icon-ym-full-screen:before { + content: "\e7ad"; +} + +.icon-ym-file-rar:before { + content: "\e7ae"; +} + +.icon-ym-file-visio-1:before { + content: "\e7af"; +} + +.icon-ym-file-movie:before { + content: "\e7b0"; +} + +.icon-ym-generator-barcode:before { + content: "\e7b4"; +} + +.icon-ym-flowDesign:before { + content: "\e7b5"; +} + +.icon-ym-formExample1:before { + content: "\e7b7"; +} + +.icon-ym-file-xml:before { + content: "\e7b9"; +} + +.icon-ym-flowMonitor:before { + content: "\e7ba"; +} + +.icon-ym-extend-rocket:before { + content: "\e7bc"; +} + +.icon-ym-file-image:before { + content: "\e7bd"; +} + +.icon-ym-generator-bar:before { + content: "\e7be"; +} + +.icon-ym-generator-date-range:before { + content: "\e7c0"; +} + +.icon-ym-generator-date:before { + content: "\e7c1"; +} + +.icon-ym-generator-card:before { + content: "\e7c2"; +} + +.icon-ym-file-visio:before { + content: "\e7c3"; +} + +.icon-ym-generator-dictionary:before { + content: "\e7c4"; +} + +.icon-ym-generator-email:before { + content: "\e7c5"; +} + +.icon-ym-generator-company:before { + content: "\e7c6"; +} + +.icon-ym-generator-annular:before { + content: "\e7c7"; +} + +.icon-ym-generator-button:before { + content: "\e7c9"; +} + +.icon-ym-generator-count:before { + content: "\e7ca"; +} + +.icon-ym-generator-layout:before { + content: "\e7cb"; +} + +.icon-ym-file-excel:before { + content: "\e7cc"; +} + +.icon-ym-generator-cascader:before { + content: "\e7cd"; +} + +.icon-ym-generator-checkbox:before { + content: "\e7ce"; +} + +.icon-ym-highchartsGauge:before { + content: "\e856"; +} + +.icon-ym-wf-outgoingApply:before { + content: "\e854"; +} + +.icon-ym-mac:before { + content: "\e7db"; +} + +.icon-ym-appDesign:before { + content: "\e6f9"; +} + +.icon-ym-generator-pie:before { + content: "\e60b"; +} + +.icon-ym-scanCode:before { + content: "\e87e"; +} + +.icon-ym-mpUser:before { + content: "\e794"; +} + +.icon-ym-printExample:before { + content: "\e79a"; +} + +.icon-ym-qyOrg:before { + content: "\e79e"; +} + +.icon-ym-qyMessage:before { + content: "\e7a0"; +} + +.icon-ym-generator-subFlow:before { + content: "\e61b"; +} + +.icon-ym-reportExample1:before { + content: "\e7a2"; +} + +.icon-ym-qyConfig:before { + content: "\e7a3"; +} + +.icon-ym-saoyisao:before { + content: "\e623"; +} + +.icon-ym-highcharts-Pie:before { + content: "\e7b6"; +} + +.icon-ym-report-icon-area:before { + content: "\e63e"; +} + +.icon-ym-report-icon-arrow-down:before { + content: "\e63f"; +} + +.icon-ym-report-icon-align-left:before { + content: "\e640"; +} + +.icon-ym-report-icon-align-top:before { + content: "\e641"; +} + +.icon-ym-report-icon-border-all:before { + content: "\e642"; +} + +.icon-ym-report-icon-align-bottom:before { + content: "\e643"; +} + +.icon-ym-report-icon-align-right:before { + content: "\e644"; +} + +.icon-ym-report-icon-bold:before { + content: "\e645"; +} + +.icon-ym-report-icon-border-bottom:before { + content: "\e646"; +} + +.icon-ym-report-icon-align-center:before { + content: "\e647"; +} + +.icon-ym-report-icon-border-right:before { + content: "\e648"; +} + +.icon-ym-report-icon-bubble:before { + content: "\e649"; +} + +.icon-ym-report-icon-diagram:before { + content: "\e64a"; +} + +.icon-ym-report-icon-enlarge:before { + content: "\e64b"; +} + +.icon-ym-report-icon-align-middle:before { + content: "\e64c"; +} + +.icon-ym-report-icon-preview-pagePre:before { + content: "\e64e"; +} + +.icon-ym-report-icon-border-left:before { + content: "\e64f"; +} + +.icon-ym-report-icon-font:before { + content: "\e652"; +} + +.icon-ym-report-icon-border-top:before { + content: "\e653"; +} + +.icon-ym-report-icon-background-color:before { + content: "\e656"; +} + +.icon-ym-report-icon-border-custom:before { + content: "\e657"; +} + +.icon-ym-report-icon-horizontal-column:before { + content: "\e65c"; +} + +.icon-ym-report-icon-column:before { + content: "\e65d"; +} + +.icon-ym-report-icon-font-type:before { + content: "\e65e"; +} + +.icon-ym-report-icon-import-excel:before { + content: "\e65f"; +} + +.icon-ym-report-icon-restore:before { + content: "\e662"; +} + +.icon-ym-report-icon-oblique-head:before { + content: "\e663"; +} + +.icon-ym-report-icon-preview-pdf:before { + content: "\e664"; +} + +.icon-ym-report-icon-preview-pageNext:before { + content: "\e665"; +} + +.icon-ym-report-icon-preview-print:before { + content: "\e666"; +} + +.icon-ym-report-icon-preview-pageLast:before { + content: "\e667"; +} + +.icon-ym-report-icon-preview-excel-paging:before { + content: "\e669"; +} + +.icon-ym-report-icon-radar:before { + content: "\e66a"; +} + +.icon-ym-report-icon-border-none:before { + content: "\e66b"; +} + +.icon-ym-report-icon-preview-word:before { + content: "\e66c"; +} + +.icon-ym-report-icon-scatter:before { + content: "\e66f"; +} + +.icon-ym-report-icon-preview-printPreview:before { + content: "\e670"; +} + +.icon-ym-report-icon-preview-excel-with-paging-sheet:before { + content: "\e671"; +} + +.icon-ym-report-icon-fontsize:before { + content: "\e672"; +} + +.icon-ym-report-icon-search-setting:before { + content: "\e673"; +} + +.icon-ym-report-icon-preview-excel:before { + content: "\e674"; +} + +.icon-ym-report-icon-undo:before { + content: "\e675"; +} + +.icon-ym-report-icon-shrink:before { + content: "\e676"; +} + +.icon-ym-report-icon-configuration:before { + content: "\e677"; +} + +.icon-ym-report-icon-preview-refresh:before { + content: "\e678"; +} + +.icon-ym-report-icon-underline:before { + content: "\e679"; +} + +.icon-ym-report-icon-italic:before { + content: "\e67b"; +} + +.icon-ym-report-icon-preview-printPdf:before { + content: "\e67c"; +} + +.icon-ym-report-icon-merge-cell:before { + content: "\e67a"; +} + +.icon-ym-report-icon-polar-plot:before { + content: "\e650"; +} + +.icon-ym-report-icon-page-preview:before { + content: "\e668"; +} + +.icon-ym-report-icon-doughnut:before { + content: "\e66e"; +} + +.icon-ym-report-icon-preview:before { + content: "\e655"; +} + +.icon-ym-pageDesign:before { + content: "\e684"; +} + +.icon-ym-customUrl:before { + content: "\e685"; +} + +.icon-ym-btn-clearn:before { + content: "\e80a"; +} + +.icon-ym-tree-organization1:before { + content: "\e82e"; +} + +.icon-ym-generator-documents:before { + content: "\e878"; +} + +.icon-ym-generator-createtime:before { + content: "\e87c"; +} + diff --git a/public/css/fonts/ym/iconfont.ttf b/public/css/fonts/ym/iconfont.ttf new file mode 100644 index 0000000..3b84266 Binary files /dev/null and b/public/css/fonts/ym/iconfont.ttf differ diff --git a/public/css/fonts/ym/iconfont.woff b/public/css/fonts/ym/iconfont.woff new file mode 100644 index 0000000..3ae8e6c Binary files /dev/null and b/public/css/fonts/ym/iconfont.woff differ diff --git a/public/css/fonts/ym/iconfont.woff2 b/public/css/fonts/ym/iconfont.woff2 new file mode 100644 index 0000000..2c1b35d Binary files /dev/null and b/public/css/fonts/ym/iconfont.woff2 differ diff --git a/public/css/index.css b/public/css/index.css new file mode 100644 index 0000000..f75df7b --- /dev/null +++ b/public/css/index.css @@ -0,0 +1,135 @@ + html[data-theme='dark'] .app-loading { + background-color: #2c344a; + } + + html[data-theme='dark'] .app-loading .app-loading-title { + color: rgb(255 255 255 / 85%); + } + html[data-theme="dark"] .ant-steps-navigation .ant-steps-item::after { + border-bottom: none; + border-left: none; +} + + .app-loading { + display: flex; + width: 100%; + height: 100%; + justify-content: center; + align-items: center; + flex-direction: column; + background-color: #f4f7f9; + } + + .app-loading .app-loading-wrap { + position: absolute; + top: 50%; + left: 50%; + display: flex; + transform: translate3d(-50%, -50%, 0); + justify-content: center; + align-items: center; + flex-direction: column; + } + + .app-loading .dots { + display: flex; + padding: 98px; + justify-content: center; + align-items: center; + } + + .app-loading .app-loading-title { + display: flex; + margin-top: 30px; + font-size: 30px; + color: rgb(0 0 0 / 85%); + justify-content: center; + align-items: center; + } + + .app-loading .app-loading-logo { + display: block; + width: 90px; + margin: 0 auto; + margin-bottom: 20px; + border: none; + } + + .dot { + position: relative; + display: inline-block; + width: 48px; + height: 48px; + margin-top: 30px; + font-size: 32px; + transform: rotate(45deg); + box-sizing: border-box; + animation: antRotate 1.2s infinite linear; + } + + .dot i { + position: absolute; + display: block; + width: 20px; + height: 20px; + background-color: #0065cc; + border-radius: 100%; + opacity: 30%; + transform: scale(0.75); + animation: antSpinMove 1s infinite linear alternate; + transform-origin: 50% 50%; + } + + .dot i:nth-child(1) { + top: 0; + left: 0; + } + + .dot i:nth-child(2) { + top: 0; + right: 0; + animation-delay: 0.4s; + } + + .dot i:nth-child(3) { + right: 0; + bottom: 0; + animation-delay: 0.8s; + } + + .dot i:nth-child(4) { + bottom: 0; + left: 0; + animation-delay: 1.2s; + } + + @keyframes antRotate { + to { + transform: rotate(405deg); + } + } + + @-webkit-keyframes antRotate { + to { + transform: rotate(405deg); + } + } + + @keyframes antSpinMove { + to { + opacity: 100%; + } + } + + @-webkit-keyframes antSpinMove { + to { + opacity: 100%; + } + } + + @media (max-width: 600px) { + .app-loading .app-loading-logo, + .app-loading .app-loading-title { + display: none; + } + } diff --git a/public/css/print-lock.css b/public/css/print-lock.css new file mode 100644 index 0000000..82c1404 --- /dev/null +++ b/public/css/print-lock.css @@ -0,0 +1,352 @@ +@media print { + body { + margin: 0px; + padding: 0px; + } +} + +@page { + margin: 0; +} + +.hiprint-printPaper * { + box-sizing: border-box; + -moz-box-sizing: border-box; /* Firefox */ + -webkit-box-sizing: border-box; /* Safari */ +} + +.hiprint-printPaper *:focus { + outline: -webkit-focus-ring-color auto 0px; +} + +.hiprint-printPaper { + position: relative; + padding: 0 0 0 0; + page-break-after: always; + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -moz-user-select: none; /* Firefox */ + user-select: none; + overflow-x: hidden; + overflow: hidden; +} + +.hiprint-printPaper .hiprint-printPaper-content { + position: relative; +} + +/* 火狐浏览器打印 第一页过后 重叠问题 */ +@-moz-document url-prefix() { + .hiprint-printPaper .hiprint-printPaper-content { + position: relative; + margin-top: 20px; + top: -20px + } +} + +.hiprint-printPaper.design { + overflow: visible; +} + + +.hiprint-printTemplate .hiprint-printPanel { + page-break-after: always; +} + +.hiprint-printPaper, hiprint-printPanel { + box-sizing: border-box; + border: 0px; +} + +.hiprint-printPanel .hiprint-printPaper:last-child { + page-break-after: avoid; +} + +.hiprint-printTemplate .hiprint-printPanel:last-child { + page-break-after: avoid; +} + +.hiprint-printPaper .hideheaderLinetarget { + border-top: 0px dashed rgb(201, 190, 190) !important; +} + +.hiprint-printPaper .hidefooterLinetarget { + border-top: 0px dashed rgb(201, 190, 190) !important; +} + +.hiprint-printPaper.design { + border: 1px dashed rgba(170, 170, 170, 0.7); +} + +.design .hiprint-printElement-table-content, .design .hiprint-printElement-longText-content { + overflow: hidden; + box-sizing: border-box; +} + +.design .resize-panel { + box-sizing: border-box; + border: 1px dotted; +} + +.hiprint-printElement-text { + background-color: transparent; + background-repeat: repeat; + padding: 0 0 0 0; + border: 0.75pt none rgb(0, 0, 0); + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + line-height: 9.75pt; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; +} + +.design .hiprint-printElement-text-content { + border: 1px dashed rgb(206, 188, 188); + box-sizing: border-box; +} + +.hiprint-printElement-longText { + background-color: transparent; + background-repeat: repeat; + border: 0.75pt none rgb(0, 0, 0); + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + line-height: 9.75pt; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; + /*white-space: pre-wrap*/ +} + + +.hiprint-printElement-table { + background-color: transparent; + background-repeat: repeat; + color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); + border-style: none; + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + padding: 0 0 0 0; + box-sizing: border-box; + line-height: 9.75pt; +} + +.hiprint-printElement-table thead { + background: #e8e8e8; + font-weight: 700; +} + +table.hiprint-printElement-tableTarget { + width: 100%; +} + +.hiprint-printElement-tableTarget, .hiprint-printElement-tableTarget tr, .hiprint-printElement-tableTarget td { + border-color: rgb(0, 0, 0); + /*border-style: none;*/ + /*border: 1px solid rgb(0, 0, 0);*/ + font-weight: normal; + direction: ltr; + padding-bottom: 0pt; + padding-left: 4pt; + padding-right: 4pt; + padding-top: 0pt; + text-decoration: none; + vertical-align: middle; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; + /*line-height: 9.75pt; + font-size: 9pt;*/ +} + +.hiprint-printElement-tableTarget-border-all { + border: 1px solid; +} +.hiprint-printElement-tableTarget-border-none { + border: 0px solid; +} +.hiprint-printElement-tableTarget-border-lr { + border-left: 1px solid; + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-left { + border-left: 1px solid; +} +.hiprint-printElement-tableTarget-border-right { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-tb { + border-top: 1px solid; + border-bottom: 1px solid; +} +.hiprint-printElement-tableTarget-border-top { + border-top: 1px solid; +} +.hiprint-printElement-tableTarget-border-bottom { + border-bottom: 1px solid; +} + +.hiprint-printElement-tableTarget-border-td-none td { + border: 0px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:not(:nth-last-child(-n+2)) { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:not(last-child) { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:last-child { + border-left: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:last-child:first-child { + border-left: none; +} + +/*.hiprint-printElement-tableTarget tr,*/ +.hiprint-printElement-tableTarget td { + height: 18pt; +} + +.hiprint-printPaper .hiprint-paperNumber { + font-size: 9pt; +} + +.design .hiprint-printElement-table-handle { + position: absolute; + height: 21pt; + width: 21pt; + background: red; + z-index: 1; +} + +.hiprint-printPaper .hiprint-paperNumber-disabled { + float: right !important; + right: 0 !important; + color: gainsboro !important; +} + +.hiprint-printElement-vline, .hiprint-printElement-hline { + border: 0px none rgb(0, 0, 0); + +} + +.hiprint-printElement-vline { + border-left: 0.75pt solid #000; + border-right: 0px none rgb(0, 0, 0) !important; + border-bottom: 0px none rgb(0, 0, 0) !important; + border-top: 0px none rgb(0, 0, 0) !important; +} + +.hiprint-printElement-hline { + border-top: 0.75pt solid #000; + border-right: 0px none rgb(0, 0, 0) !important; + border-bottom: 0px none rgb(0, 0, 0) !important; + border-left: 0px none rgb(0, 0, 0) !important; +} + +.hiprint-printElement-oval, .hiprint-printElement-rect { + border: 0.75pt solid #000; +} + +.hiprint-text-content-middle { +} + +.hiprint-text-content-middle > div { + display: grid; + align-items: center; +} + +.hiprint-text-content-bottom { +} + +.hiprint-text-content-bottom > div { + display: grid; + align-items: flex-end; +} + +.hiprint-text-content-wrap { +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-nowrap { + white-space: nowrap; +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-clip { + white-space: nowrap; + overflow: hidden; + text-overflow: clip; +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-ellipsis { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/*hi-grid-row */ +.hi-grid-row { + position: relative; + height: auto; + margin-right: 0; + margin-left: 0; + zoom: 1; + display: block; + box-sizing: border-box; +} + +.hi-grid-row::after, .hi-grid-row::before { + display: table; + content: ''; + box-sizing: border-box; +} + +.hi-grid-col { + display: block; + box-sizing: border-box; + position: relative; + float: left; + flex: 0 0 auto; +} + +.table-grid-row { + margin-left: -0pt; + margin-right: -0pt; +} + +.tableGridColumnsGutterRow { + padding-left: 0pt; + padding-right: 0pt; +} + +.hiprint-gridColumnsFooter { + text-align: left; + clear: both; +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..427ba6b Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/resource/emoji/100.gif b/public/resource/emoji/100.gif new file mode 100644 index 0000000..2378eb4 Binary files /dev/null and b/public/resource/emoji/100.gif differ diff --git a/public/resource/emoji/101.gif b/public/resource/emoji/101.gif new file mode 100644 index 0000000..574caa7 Binary files /dev/null and b/public/resource/emoji/101.gif differ diff --git a/public/resource/emoji/102.gif b/public/resource/emoji/102.gif new file mode 100644 index 0000000..64b71c7 Binary files /dev/null and b/public/resource/emoji/102.gif differ diff --git a/public/resource/emoji/103.gif b/public/resource/emoji/103.gif new file mode 100644 index 0000000..ddc55f6 Binary files /dev/null and b/public/resource/emoji/103.gif differ diff --git a/public/resource/emoji/104.gif b/public/resource/emoji/104.gif new file mode 100644 index 0000000..aa9f755 Binary files /dev/null and b/public/resource/emoji/104.gif differ diff --git a/public/resource/emoji/105.gif b/public/resource/emoji/105.gif new file mode 100644 index 0000000..a2069d9 Binary files /dev/null and b/public/resource/emoji/105.gif differ diff --git a/public/resource/emoji/106.gif b/public/resource/emoji/106.gif new file mode 100644 index 0000000..364a2f2 Binary files /dev/null and b/public/resource/emoji/106.gif differ diff --git a/public/resource/emoji/107.gif b/public/resource/emoji/107.gif new file mode 100644 index 0000000..eb82906 Binary files /dev/null and b/public/resource/emoji/107.gif differ diff --git a/public/resource/emoji/108.gif b/public/resource/emoji/108.gif new file mode 100644 index 0000000..d6e17f7 Binary files /dev/null and b/public/resource/emoji/108.gif differ diff --git a/public/resource/emoji/109.gif b/public/resource/emoji/109.gif new file mode 100644 index 0000000..e38ccd8 Binary files /dev/null and b/public/resource/emoji/109.gif differ diff --git a/public/resource/emoji/110.gif b/public/resource/emoji/110.gif new file mode 100644 index 0000000..fb4daf1 Binary files /dev/null and b/public/resource/emoji/110.gif differ diff --git a/public/resource/emoji/111.gif b/public/resource/emoji/111.gif new file mode 100644 index 0000000..156bd67 Binary files /dev/null and b/public/resource/emoji/111.gif differ diff --git a/public/resource/emoji/112.gif b/public/resource/emoji/112.gif new file mode 100644 index 0000000..4ee3c71 Binary files /dev/null and b/public/resource/emoji/112.gif differ diff --git a/public/resource/emoji/113.gif b/public/resource/emoji/113.gif new file mode 100644 index 0000000..bcdf0ff Binary files /dev/null and b/public/resource/emoji/113.gif differ diff --git a/public/resource/emoji/114.gif b/public/resource/emoji/114.gif new file mode 100644 index 0000000..9778059 Binary files /dev/null and b/public/resource/emoji/114.gif differ diff --git a/public/resource/emoji/115.gif b/public/resource/emoji/115.gif new file mode 100644 index 0000000..87a52f3 Binary files /dev/null and b/public/resource/emoji/115.gif differ diff --git a/public/resource/emoji/116.gif b/public/resource/emoji/116.gif new file mode 100644 index 0000000..73af643 Binary files /dev/null and b/public/resource/emoji/116.gif differ diff --git a/public/resource/emoji/117.gif b/public/resource/emoji/117.gif new file mode 100644 index 0000000..0468b91 Binary files /dev/null and b/public/resource/emoji/117.gif differ diff --git a/public/resource/emoji/118.gif b/public/resource/emoji/118.gif new file mode 100644 index 0000000..a877841 Binary files /dev/null and b/public/resource/emoji/118.gif differ diff --git a/public/resource/emoji/119.gif b/public/resource/emoji/119.gif new file mode 100644 index 0000000..421062d Binary files /dev/null and b/public/resource/emoji/119.gif differ diff --git a/public/resource/emoji/120.gif b/public/resource/emoji/120.gif new file mode 100644 index 0000000..b1ef5c7 Binary files /dev/null and b/public/resource/emoji/120.gif differ diff --git a/public/resource/emoji/121.gif b/public/resource/emoji/121.gif new file mode 100644 index 0000000..97495df Binary files /dev/null and b/public/resource/emoji/121.gif differ diff --git a/public/resource/emoji/122.gif b/public/resource/emoji/122.gif new file mode 100644 index 0000000..8623717 Binary files /dev/null and b/public/resource/emoji/122.gif differ diff --git a/public/resource/emoji/123.gif b/public/resource/emoji/123.gif new file mode 100644 index 0000000..72a5f3d Binary files /dev/null and b/public/resource/emoji/123.gif differ diff --git a/public/resource/emoji/124.gif b/public/resource/emoji/124.gif new file mode 100644 index 0000000..9974dbe Binary files /dev/null and b/public/resource/emoji/124.gif differ diff --git a/public/resource/emoji/125.gif b/public/resource/emoji/125.gif new file mode 100644 index 0000000..aaca1f7 Binary files /dev/null and b/public/resource/emoji/125.gif differ diff --git a/public/resource/emoji/126.gif b/public/resource/emoji/126.gif new file mode 100644 index 0000000..2aa7522 Binary files /dev/null and b/public/resource/emoji/126.gif differ diff --git a/public/resource/emoji/127.gif b/public/resource/emoji/127.gif new file mode 100644 index 0000000..b59f3c6 Binary files /dev/null and b/public/resource/emoji/127.gif differ diff --git a/public/resource/emoji/128.gif b/public/resource/emoji/128.gif new file mode 100644 index 0000000..cbed60d Binary files /dev/null and b/public/resource/emoji/128.gif differ diff --git a/public/resource/emoji/129.gif b/public/resource/emoji/129.gif new file mode 100644 index 0000000..05d9353 Binary files /dev/null and b/public/resource/emoji/129.gif differ diff --git a/public/resource/emoji/130.gif b/public/resource/emoji/130.gif new file mode 100644 index 0000000..ae2036b Binary files /dev/null and b/public/resource/emoji/130.gif differ diff --git a/public/resource/emoji/131.gif b/public/resource/emoji/131.gif new file mode 100644 index 0000000..dbba4ca Binary files /dev/null and b/public/resource/emoji/131.gif differ diff --git a/public/resource/emoji/132.gif b/public/resource/emoji/132.gif new file mode 100644 index 0000000..652ec1c Binary files /dev/null and b/public/resource/emoji/132.gif differ diff --git a/public/resource/emoji/133.gif b/public/resource/emoji/133.gif new file mode 100644 index 0000000..8e335c4 Binary files /dev/null and b/public/resource/emoji/133.gif differ diff --git a/public/resource/emoji/134.gif b/public/resource/emoji/134.gif new file mode 100644 index 0000000..fcf91ea Binary files /dev/null and b/public/resource/emoji/134.gif differ diff --git a/public/resource/emoji/135.gif b/public/resource/emoji/135.gif new file mode 100644 index 0000000..003124b Binary files /dev/null and b/public/resource/emoji/135.gif differ diff --git a/public/resource/emoji/136.gif b/public/resource/emoji/136.gif new file mode 100644 index 0000000..b2080f2 Binary files /dev/null and b/public/resource/emoji/136.gif differ diff --git a/public/resource/emoji/137.gif b/public/resource/emoji/137.gif new file mode 100644 index 0000000..de27554 Binary files /dev/null and b/public/resource/emoji/137.gif differ diff --git a/public/resource/emoji/138.gif b/public/resource/emoji/138.gif new file mode 100644 index 0000000..293a32f Binary files /dev/null and b/public/resource/emoji/138.gif differ diff --git a/public/resource/emoji/139.gif b/public/resource/emoji/139.gif new file mode 100644 index 0000000..55631ca Binary files /dev/null and b/public/resource/emoji/139.gif differ diff --git a/public/resource/emoji/140.gif b/public/resource/emoji/140.gif new file mode 100644 index 0000000..a5d3c79 Binary files /dev/null and b/public/resource/emoji/140.gif differ diff --git a/public/resource/emoji/141.gif b/public/resource/emoji/141.gif new file mode 100644 index 0000000..3c16c48 Binary files /dev/null and b/public/resource/emoji/141.gif differ diff --git a/public/resource/emoji/142.gif b/public/resource/emoji/142.gif new file mode 100644 index 0000000..627c579 Binary files /dev/null and b/public/resource/emoji/142.gif differ diff --git a/public/resource/emoji/143.gif b/public/resource/emoji/143.gif new file mode 100644 index 0000000..4023df7 Binary files /dev/null and b/public/resource/emoji/143.gif differ diff --git a/public/resource/emoji/144.gif b/public/resource/emoji/144.gif new file mode 100644 index 0000000..a9b8c84 Binary files /dev/null and b/public/resource/emoji/144.gif differ diff --git a/public/resource/emoji/145.gif b/public/resource/emoji/145.gif new file mode 100644 index 0000000..d6db48f Binary files /dev/null and b/public/resource/emoji/145.gif differ diff --git a/public/resource/emoji/146.gif b/public/resource/emoji/146.gif new file mode 100644 index 0000000..0f03b7d Binary files /dev/null and b/public/resource/emoji/146.gif differ diff --git a/public/resource/emoji/147.gif b/public/resource/emoji/147.gif new file mode 100644 index 0000000..6e2f1fd Binary files /dev/null and b/public/resource/emoji/147.gif differ diff --git a/public/resource/emoji/148.gif b/public/resource/emoji/148.gif new file mode 100644 index 0000000..11e7ddc Binary files /dev/null and b/public/resource/emoji/148.gif differ diff --git a/public/resource/emoji/149.gif b/public/resource/emoji/149.gif new file mode 100644 index 0000000..f85e1c0 Binary files /dev/null and b/public/resource/emoji/149.gif differ diff --git a/public/resource/emoji/150.gif b/public/resource/emoji/150.gif new file mode 100644 index 0000000..444083f Binary files /dev/null and b/public/resource/emoji/150.gif differ diff --git a/public/resource/emoji/151.gif b/public/resource/emoji/151.gif new file mode 100644 index 0000000..c875ea7 Binary files /dev/null and b/public/resource/emoji/151.gif differ diff --git a/public/resource/emoji/152.gif b/public/resource/emoji/152.gif new file mode 100644 index 0000000..df63eac Binary files /dev/null and b/public/resource/emoji/152.gif differ diff --git a/public/resource/emoji/153.gif b/public/resource/emoji/153.gif new file mode 100644 index 0000000..dc696d6 Binary files /dev/null and b/public/resource/emoji/153.gif differ diff --git a/public/resource/emoji/154.gif b/public/resource/emoji/154.gif new file mode 100644 index 0000000..d28380b Binary files /dev/null and b/public/resource/emoji/154.gif differ diff --git a/public/resource/emoji/155.gif b/public/resource/emoji/155.gif new file mode 100644 index 0000000..9042b9d Binary files /dev/null and b/public/resource/emoji/155.gif differ diff --git a/public/resource/emoji/156.gif b/public/resource/emoji/156.gif new file mode 100644 index 0000000..edf96f0 Binary files /dev/null and b/public/resource/emoji/156.gif differ diff --git a/public/resource/emoji/157.gif b/public/resource/emoji/157.gif new file mode 100644 index 0000000..da352f3 Binary files /dev/null and b/public/resource/emoji/157.gif differ diff --git a/public/resource/emoji/158.gif b/public/resource/emoji/158.gif new file mode 100644 index 0000000..4faf41f Binary files /dev/null and b/public/resource/emoji/158.gif differ diff --git a/public/resource/emoji/159.gif b/public/resource/emoji/159.gif new file mode 100644 index 0000000..918288b Binary files /dev/null and b/public/resource/emoji/159.gif differ diff --git a/public/resource/emoji/160.gif b/public/resource/emoji/160.gif new file mode 100644 index 0000000..869559e Binary files /dev/null and b/public/resource/emoji/160.gif differ diff --git a/public/resource/emoji/161.gif b/public/resource/emoji/161.gif new file mode 100644 index 0000000..d347251 Binary files /dev/null and b/public/resource/emoji/161.gif differ diff --git a/public/resource/emoji/162.gif b/public/resource/emoji/162.gif new file mode 100644 index 0000000..be2b213 Binary files /dev/null and b/public/resource/emoji/162.gif differ diff --git a/public/resource/emoji/163.gif b/public/resource/emoji/163.gif new file mode 100644 index 0000000..d58fcf6 Binary files /dev/null and b/public/resource/emoji/163.gif differ diff --git a/public/resource/emoji/164.gif b/public/resource/emoji/164.gif new file mode 100644 index 0000000..c4e00bd Binary files /dev/null and b/public/resource/emoji/164.gif differ diff --git a/public/resource/emoji/165.gif b/public/resource/emoji/165.gif new file mode 100644 index 0000000..3549c83 Binary files /dev/null and b/public/resource/emoji/165.gif differ diff --git a/public/resource/emoji/166.gif b/public/resource/emoji/166.gif new file mode 100644 index 0000000..f99e583 Binary files /dev/null and b/public/resource/emoji/166.gif differ diff --git a/public/resource/emoji/167.gif b/public/resource/emoji/167.gif new file mode 100644 index 0000000..441da4a Binary files /dev/null and b/public/resource/emoji/167.gif differ diff --git a/public/resource/emoji/168.gif b/public/resource/emoji/168.gif new file mode 100644 index 0000000..b74d3cb Binary files /dev/null and b/public/resource/emoji/168.gif differ diff --git a/public/resource/emoji/169.gif b/public/resource/emoji/169.gif new file mode 100644 index 0000000..2639428 Binary files /dev/null and b/public/resource/emoji/169.gif differ diff --git a/public/resource/emoji/170.gif b/public/resource/emoji/170.gif new file mode 100644 index 0000000..5d96fa5 Binary files /dev/null and b/public/resource/emoji/170.gif differ diff --git a/public/resource/emoji/171.gif b/public/resource/emoji/171.gif new file mode 100644 index 0000000..8053885 Binary files /dev/null and b/public/resource/emoji/171.gif differ diff --git a/public/resource/emoji/172.gif b/public/resource/emoji/172.gif new file mode 100644 index 0000000..ae51343 Binary files /dev/null and b/public/resource/emoji/172.gif differ diff --git a/public/resource/emoji/173.gif b/public/resource/emoji/173.gif new file mode 100644 index 0000000..c0293c3 Binary files /dev/null and b/public/resource/emoji/173.gif differ diff --git a/public/resource/emoji/174.gif b/public/resource/emoji/174.gif new file mode 100644 index 0000000..31203c5 Binary files /dev/null and b/public/resource/emoji/174.gif differ diff --git a/public/resource/emoji/175.gif b/public/resource/emoji/175.gif new file mode 100644 index 0000000..f71d4a1 Binary files /dev/null and b/public/resource/emoji/175.gif differ diff --git a/public/resource/emoji/176.gif b/public/resource/emoji/176.gif new file mode 100644 index 0000000..41f821e Binary files /dev/null and b/public/resource/emoji/176.gif differ diff --git a/public/resource/emoji/177.gif b/public/resource/emoji/177.gif new file mode 100644 index 0000000..8f882f5 Binary files /dev/null and b/public/resource/emoji/177.gif differ diff --git a/public/resource/emoji/178.gif b/public/resource/emoji/178.gif new file mode 100644 index 0000000..557551d Binary files /dev/null and b/public/resource/emoji/178.gif differ diff --git a/public/resource/emoji/179.gif b/public/resource/emoji/179.gif new file mode 100644 index 0000000..6bc874d Binary files /dev/null and b/public/resource/emoji/179.gif differ diff --git a/public/resource/emoji/180.gif b/public/resource/emoji/180.gif new file mode 100644 index 0000000..9a77936 Binary files /dev/null and b/public/resource/emoji/180.gif differ diff --git a/public/resource/emoji/181.gif b/public/resource/emoji/181.gif new file mode 100644 index 0000000..2329101 Binary files /dev/null and b/public/resource/emoji/181.gif differ diff --git a/public/resource/emoji/182.gif b/public/resource/emoji/182.gif new file mode 100644 index 0000000..644748a Binary files /dev/null and b/public/resource/emoji/182.gif differ diff --git a/public/resource/emoji/183.gif b/public/resource/emoji/183.gif new file mode 100644 index 0000000..fbf275b Binary files /dev/null and b/public/resource/emoji/183.gif differ diff --git a/public/resource/emoji/184.gif b/public/resource/emoji/184.gif new file mode 100644 index 0000000..bfc39e4 Binary files /dev/null and b/public/resource/emoji/184.gif differ diff --git a/public/resource/emoji/185.gif b/public/resource/emoji/185.gif new file mode 100644 index 0000000..f1f6aa3 Binary files /dev/null and b/public/resource/emoji/185.gif differ diff --git a/public/resource/emoji/186.gif b/public/resource/emoji/186.gif new file mode 100644 index 0000000..860885d Binary files /dev/null and b/public/resource/emoji/186.gif differ diff --git a/public/resource/emoji/187.gif b/public/resource/emoji/187.gif new file mode 100644 index 0000000..3b88548 Binary files /dev/null and b/public/resource/emoji/187.gif differ diff --git a/public/resource/emoji/188.gif b/public/resource/emoji/188.gif new file mode 100644 index 0000000..947934f Binary files /dev/null and b/public/resource/emoji/188.gif differ diff --git a/public/resource/emoji/189.gif b/public/resource/emoji/189.gif new file mode 100644 index 0000000..fdb9f32 Binary files /dev/null and b/public/resource/emoji/189.gif differ diff --git a/public/resource/emoji/190.gif b/public/resource/emoji/190.gif new file mode 100644 index 0000000..ddd6178 Binary files /dev/null and b/public/resource/emoji/190.gif differ diff --git a/public/resource/emoji/191.gif b/public/resource/emoji/191.gif new file mode 100644 index 0000000..35d794c Binary files /dev/null and b/public/resource/emoji/191.gif differ diff --git a/public/resource/emoji/192.gif b/public/resource/emoji/192.gif new file mode 100644 index 0000000..61a10bc Binary files /dev/null and b/public/resource/emoji/192.gif differ diff --git a/public/resource/emoji/193.gif b/public/resource/emoji/193.gif new file mode 100644 index 0000000..ee297f9 Binary files /dev/null and b/public/resource/emoji/193.gif differ diff --git a/public/resource/emoji/194.gif b/public/resource/emoji/194.gif new file mode 100644 index 0000000..c8c1fc3 Binary files /dev/null and b/public/resource/emoji/194.gif differ diff --git a/public/resource/emoji/195.gif b/public/resource/emoji/195.gif new file mode 100644 index 0000000..5ef6d38 Binary files /dev/null and b/public/resource/emoji/195.gif differ diff --git a/public/resource/emoji/196.gif b/public/resource/emoji/196.gif new file mode 100644 index 0000000..a1aee93 Binary files /dev/null and b/public/resource/emoji/196.gif differ diff --git a/public/resource/emoji/197.gif b/public/resource/emoji/197.gif new file mode 100644 index 0000000..08a1e56 Binary files /dev/null and b/public/resource/emoji/197.gif differ diff --git a/public/resource/emoji/198.gif b/public/resource/emoji/198.gif new file mode 100644 index 0000000..d161bc4 Binary files /dev/null and b/public/resource/emoji/198.gif differ diff --git a/public/resource/emoji/199.gif b/public/resource/emoji/199.gif new file mode 100644 index 0000000..58192b0 Binary files /dev/null and b/public/resource/emoji/199.gif differ diff --git a/public/resource/emoji/200.png b/public/resource/emoji/200.png new file mode 100644 index 0000000..56df9d2 Binary files /dev/null and b/public/resource/emoji/200.png differ diff --git a/public/resource/emoji/201.png b/public/resource/emoji/201.png new file mode 100644 index 0000000..b72e9f8 Binary files /dev/null and b/public/resource/emoji/201.png differ diff --git a/public/resource/emoji/202.png b/public/resource/emoji/202.png new file mode 100644 index 0000000..f8f7f35 Binary files /dev/null and b/public/resource/emoji/202.png differ diff --git a/public/resource/emoji/203.png b/public/resource/emoji/203.png new file mode 100644 index 0000000..ae7c82a Binary files /dev/null and b/public/resource/emoji/203.png differ diff --git a/public/resource/emoji/204.png b/public/resource/emoji/204.png new file mode 100644 index 0000000..7303da1 Binary files /dev/null and b/public/resource/emoji/204.png differ diff --git a/public/resource/emoji/205.png b/public/resource/emoji/205.png new file mode 100644 index 0000000..0643682 Binary files /dev/null and b/public/resource/emoji/205.png differ diff --git a/public/resource/emoji/206.png b/public/resource/emoji/206.png new file mode 100644 index 0000000..4693154 Binary files /dev/null and b/public/resource/emoji/206.png differ diff --git a/public/resource/emoji/207.png b/public/resource/emoji/207.png new file mode 100644 index 0000000..390cc86 Binary files /dev/null and b/public/resource/emoji/207.png differ diff --git a/public/resource/emoji/208.png b/public/resource/emoji/208.png new file mode 100644 index 0000000..02ab03b Binary files /dev/null and b/public/resource/emoji/208.png differ diff --git a/public/resource/emoji/209.png b/public/resource/emoji/209.png new file mode 100644 index 0000000..7b09611 Binary files /dev/null and b/public/resource/emoji/209.png differ diff --git a/public/resource/emoji/210.png b/public/resource/emoji/210.png new file mode 100644 index 0000000..982ec91 Binary files /dev/null and b/public/resource/emoji/210.png differ diff --git a/public/resource/emoji/211.png b/public/resource/emoji/211.png new file mode 100644 index 0000000..7d847cc Binary files /dev/null and b/public/resource/emoji/211.png differ diff --git a/public/resource/emoji/212.png b/public/resource/emoji/212.png new file mode 100644 index 0000000..07db6f9 Binary files /dev/null and b/public/resource/emoji/212.png differ diff --git a/public/resource/emoji/213.png b/public/resource/emoji/213.png new file mode 100644 index 0000000..90d08b0 Binary files /dev/null and b/public/resource/emoji/213.png differ diff --git a/public/resource/emoji/214.png b/public/resource/emoji/214.png new file mode 100644 index 0000000..bbf7c9e Binary files /dev/null and b/public/resource/emoji/214.png differ diff --git a/public/resource/emoji/215.png b/public/resource/emoji/215.png new file mode 100644 index 0000000..6e0b52f Binary files /dev/null and b/public/resource/emoji/215.png differ diff --git a/public/resource/emoji/216.png b/public/resource/emoji/216.png new file mode 100644 index 0000000..d86bac8 Binary files /dev/null and b/public/resource/emoji/216.png differ diff --git a/public/resource/emoji/217.png b/public/resource/emoji/217.png new file mode 100644 index 0000000..73346e3 Binary files /dev/null and b/public/resource/emoji/217.png differ diff --git a/public/resource/emoji/218.png b/public/resource/emoji/218.png new file mode 100644 index 0000000..988414f Binary files /dev/null and b/public/resource/emoji/218.png differ diff --git a/public/resource/emoji/219.png b/public/resource/emoji/219.png new file mode 100644 index 0000000..80f3cbc Binary files /dev/null and b/public/resource/emoji/219.png differ diff --git a/public/resource/img/logo.png b/public/resource/img/logo.png new file mode 100644 index 0000000..6a7f929 Binary files /dev/null and b/public/resource/img/logo.png differ diff --git a/public/resource/img/pwa-192x192.png b/public/resource/img/pwa-192x192.png new file mode 100644 index 0000000..6a7f929 Binary files /dev/null and b/public/resource/img/pwa-192x192.png differ diff --git a/public/resource/img/pwa-512x512.png b/public/resource/img/pwa-512x512.png new file mode 100644 index 0000000..6a7f929 Binary files /dev/null and b/public/resource/img/pwa-512x512.png differ diff --git a/public/resource/tinymce/langs/en.js b/public/resource/tinymce/langs/en.js new file mode 100644 index 0000000..27337c3 --- /dev/null +++ b/public/resource/tinymce/langs/en.js @@ -0,0 +1,419 @@ +tinymce.addI18n('es', { + Redo: 'Rehacer', + Undo: 'Deshacer', + Cut: 'Cortar', + Copy: 'Copiar', + Paste: 'Pegar', + 'Select all': 'Seleccionar todo', + 'New document': 'Nuevo documento', + Ok: 'Ok', + Cancel: 'Cancelar', + 'Visual aids': 'Ayudas visuales', + Bold: 'Negrita', + Italic: 'Cursiva', + Underline: 'Subrayado', + Strikethrough: 'Tachado', + Superscript: 'Super\u00edndice', + Subscript: 'Sub\u00edndice', + 'Clear formatting': 'Limpiar formato', + 'Align left': 'Alinear a la izquierda', + 'Align center': 'Alinear al centro', + 'Align right': 'Alinear a la derecha', + Justify: 'Justificar', + 'Bullet list': 'Lista de vi\u00f1etas', + 'Numbered list': 'Lista numerada', + 'Decrease indent': 'Disminuir sangr\u00eda', + 'Increase indent': 'Incrementar sangr\u00eda', + Close: 'Cerrar', + Formats: 'Formatos', + "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": 'Su navegador no es compatible con el acceso directo al portapapeles. Use las teclas Crtl+X\/C\/V de su teclado.', + Headers: 'Encabezados', + 'Header 1': 'Encabezado 1', + 'Header 2': 'Encabezado 2', + 'Header 3': 'Encabezado 3', + 'Header 4': 'Encabezado 4', + 'Header 5': 'Encabezado 5', + 'Header 6': 'Encabezado 6', + Headings: 'Encabezados', + 'Heading 1': 'Encabezado 1', + 'Heading 2': 'Encabezado 2', + 'Heading 3': 'Encabezado 3', + 'Heading 4': 'Encabezado 4', + 'Heading 5': 'Encabezado 5', + 'Heading 6': 'Encabezado 6', + Preformatted: 'Con formato previo', + Div: 'Div', + Pre: 'Pre', + Code: 'C\u00f3digo', + Paragraph: 'P\u00e1rrafo', + Blockquote: 'Blockquote', + Inline: 'Alineado', + Blocks: 'Bloques', + 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': 'Pegar est\u00e1 ahora en modo de texto plano. El contenido se pegar\u00e1 como texto plano hasta que desactive esta opci\u00f3n.', + Fonts: 'Fuentes', + 'Font Sizes': 'Tama\u00f1os de fuente', + Class: 'Clase', + 'Browse for an image': 'Buscar una imagen', + OR: 'OR', + 'Drop an image here': 'Arrastre una imagen aqu\u00ed', + Upload: 'Cargar', + Block: 'Bloque', + Align: 'Alinear', + Default: 'Por defecto', + Circle: 'C\u00edrculo', + Disc: 'Disco', + Square: 'Cuadrado', + 'Lower Alpha': 'Inferior Alfa', + 'Lower Greek': 'Inferior Griega', + 'Lower Roman': 'Inferior Romana', + 'Upper Alpha': 'Superior Alfa', + 'Upper Roman': 'Superior Romana', + 'Anchor...': 'Anclaje...', + Name: 'Nombre', + Id: 'Id', + 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': 'Deber\u00eda comenzar por una letra, seguida solo de letras, n\u00fameros, guiones, puntos, dos puntos o guiones bajos.', + 'You have unsaved changes are you sure you want to navigate away?': 'Tiene cambios sin guardar. \u00bfEst\u00e1 seguro de que quiere salir?', + 'Restore last draft': 'Restaurar el \u00faltimo borrador', + 'Special character...': 'Car\u00e1cter especial...', + 'Source code': 'C\u00f3digo fuente', + 'Insert\/Edit code sample': 'Insertar\/editar c\u00f3digo de prueba', + Language: 'Idioma', + 'Code sample...': 'Ejemplo de c\u00f3digo...', + 'Color Picker': 'Selector de colores', + R: 'R', + G: 'V', + B: 'A', + 'Left to right': 'De izquierda a derecha', + 'Right to left': 'De derecha a izquierda', + 'Emoticons...': 'Emoticones...', + 'Metadata and Document Properties': 'Metadatos y propiedades del documento', + Title: 'T\u00edtulo', + Keywords: 'Palabras clave', + Description: 'Descripci\u00f3n', + Robots: 'Robots', + Author: 'Autor', + Encoding: 'Codificaci\u00f3n', + Fullscreen: 'Pantalla completa', + Action: 'Acci\u00f3n', + Shortcut: 'Atajo', + Help: 'Ayuda', + Address: 'Direcci\u00f3n', + 'Focus to menubar': 'Enfocar la barra del men\u00fa', + 'Focus to toolbar': 'Enfocar la barra de herramientas', + 'Focus to element path': 'Enfocar la ruta del elemento', + 'Focus to contextual toolbar': 'Enfocar la barra de herramientas contextual', + 'Insert link (if link plugin activated)': 'Insertar enlace (si el complemento de enlace est\u00e1 activado)', + 'Save (if save plugin activated)': 'Guardar (si el componente de salvar est\u00e1 activado)', + 'Find (if searchreplace plugin activated)': 'Buscar (si el complemento buscar-remplazar est\u00e1 activado)', + 'Plugins installed ({0}):': 'Plugins instalados ({0}):', + 'Premium plugins:': 'Complementos premium:', + 'Learn more...': 'Aprende m\u00e1s...', + 'You are using {0}': 'Estas usando {0}', + Plugins: 'Complementos', + 'Handy Shortcuts': 'Accesos directos', + 'Horizontal line': 'L\u00ednea horizontal', + 'Insert\/edit image': 'Insertar\/editar imagen', + 'Image description': 'Descripci\u00f3n de la imagen', + Source: 'Enlace', + Dimensions: 'Dimensiones', + 'Constrain proportions': 'Restringir proporciones', + General: 'General', + Advanced: 'Avanzado', + Style: 'Estilo', + 'Vertical space': 'Espacio vertical', + 'Horizontal space': 'Espacio horizontal', + Border: 'Borde', + 'Insert image': 'Insertar imagen', + 'Image...': 'Imagen...', + 'Image list': 'Lista de im\u00e1genes', + 'Rotate counterclockwise': 'Girar a la izquierda', + 'Rotate clockwise': 'Girar a la derecha', + 'Flip vertically': 'Invertir verticalmente', + 'Flip horizontally': 'Invertir horizontalmente', + 'Edit image': 'Editar imagen', + 'Image options': 'Opciones de imagen', + 'Zoom in': 'Acercar', + 'Zoom out': 'Alejar', + Crop: 'Recortar', + Resize: 'Redimensionar', + Orientation: 'Orientaci\u00f3n', + Brightness: 'Brillo', + Sharpen: 'Forma', + Contrast: 'Contraste', + 'Color levels': 'Niveles de color', + Gamma: 'Gamma', + Invert: 'Invertir', + Apply: 'Aplicar', + Back: 'Atr\u00e1s', + 'Insert date\/time': 'Insertar fecha\/hora', + 'Date\/time': 'Fecha\/hora', + 'Insert\/Edit Link': 'Insertar\/editar enlace', + 'Insert\/edit link': 'Insertar\/editar enlace', + 'Text to display': 'Texto para mostrar', + Url: 'URL', + 'Open link in...': 'Abrir enlace en...', + 'Current window': 'Ventana actual', + None: 'Ninguno', + 'New window': 'Nueva ventana', + 'Remove link': 'Quitar enlace', + Anchors: 'Anclas', + 'Link...': 'Enlace...', + 'Paste or type a link': 'Pega o introduce un enlace', + 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': 'El enlace que has introducido no parece ser una direcci\u00f3n de correo electr\u00f3nico. Quieres a\u00f1adir el prefijo necesario mailto: ?', + 'The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?': 'El enlace que has introducido no parece ser una enlace externo. Quieres a\u00f1adir el prefijo necesario http:\/\/ ?', + 'Link list': 'Lista de enlaces', + 'Insert video': 'Insertar video', + 'Insert\/edit video': 'Insertar\/editar video', + 'Insert\/edit media': 'Insertar\/editar medio', + 'Alternative source': 'Enlace alternativo', + 'Alternative source URL': 'Origen de URL alternativo', + 'Media poster (Image URL)': 'P\u00f3ster de medio (URL de imagen)', + 'Paste your embed code below:': 'Pega tu c\u00f3digo embebido debajo', + Embed: 'Incrustado', + 'Media...': 'Medios...', + 'Nonbreaking space': 'Espacio fijo', + 'Page break': 'Salto de p\u00e1gina', + 'Paste as text': 'Pegar como texto', + Preview: 'Previsualizar', + 'Print...': 'Imprimir...', + Save: 'Guardar', + Find: 'Buscar', + 'Replace with': 'Reemplazar con', + Replace: 'Reemplazar', + 'Replace all': 'Reemplazar todo', + Previous: 'Anterior', + Next: 'Siguiente', + 'Find and replace...': 'Buscar y reemplazar...', + 'Could not find the specified string.': 'No se encuentra la cadena de texto especificada', + 'Match case': 'Coincidencia exacta', + 'Find whole words only': 'Solo palabras completas', + 'Spell check': 'Revisar ortograf\u00eda', + Ignore: 'Ignorar', + 'Ignore all': 'Ignorar todos', + Finish: 'Finalizar', + 'Add to Dictionary': 'A\u00f1adir al Diccionario', + 'Insert table': 'Insertar tabla', + 'Table properties': 'Propiedades de la tabla', + 'Delete table': 'Eliminar tabla', + Cell: 'Celda', + Row: 'Fila', + Column: 'Columna', + 'Cell properties': 'Propiedades de la celda', + 'Merge cells': 'Combinar celdas', + 'Split cell': 'Dividir celdas', + 'Insert row before': 'Insertar fila antes', + 'Insert row after': 'Insertar fila despu\u00e9s ', + 'Delete row': 'Eliminar fila', + 'Row properties': 'Propiedades de la fila', + 'Cut row': 'Cortar fila', + 'Copy row': 'Copiar fila', + 'Paste row before': 'Pegar la fila antes', + 'Paste row after': 'Pegar la fila despu\u00e9s', + 'Insert column before': 'Insertar columna antes', + 'Insert column after': 'Insertar columna despu\u00e9s', + 'Delete column': 'Eliminar columna', + Cols: 'Columnas', + Rows: 'Filas', + Width: 'Ancho', + Height: 'Alto', + 'Cell spacing': 'Espacio entre celdas', + 'Cell padding': 'Relleno de celda', + 'Show caption': 'Mostrar t\u00edtulo', + Left: 'Izquierda', + Center: 'Centrado', + Right: 'Derecha', + 'Cell type': 'Tipo de celda', + Scope: '\u00c1mbito', + Alignment: 'Alineaci\u00f3n', + 'H Align': 'Alineamiento Horizontal', + 'V Align': 'Alineamiento Vertical', + Top: 'Arriba', + Middle: 'Centro', + Bottom: 'Abajo', + 'Header cell': 'Celda de la cebecera', + 'Row group': 'Grupo de filas', + 'Column group': 'Grupo de columnas', + 'Row type': 'Tipo de fila', + Header: 'Cabecera', + Body: 'Cuerpo', + Footer: 'Pie de p\u00e1gina', + 'Border color': 'Color del borde', + 'Insert template...': 'Insertar plantilla...', + Templates: 'Plantillas', + Template: 'Plantilla', + 'Text color': 'Color del texto', + 'Background color': 'Color de fondo', + 'Custom...': 'Personalizar...', + 'Custom color': 'Color personalizado', + 'No color': 'Sin color', + 'Remove color': 'Quitar color', + 'Table of Contents': 'Tabla de contenidos', + 'Show blocks': 'Mostrar bloques', + 'Show invisible characters': 'Mostrar caracteres invisibles', + 'Word count': 'Contar palabras', + Count: 'Recuento', + Document: 'Documento', + Selection: 'Selecci\u00f3n', + Words: 'Palabras', + 'Words: {0}': 'Palabras: {0}', + '{0} words': '{0} palabras', + File: 'Archivo', + Edit: 'Editar', + Insert: 'Insertar', + View: 'Ver', + Format: 'Formato', + Table: 'Tabla', + Tools: 'Herramientas', + 'Powered by {0}': 'Desarrollado por {0}', + 'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': '\u00c1rea de texto enriquecido. Pulse ALT-F9 para el menu. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para ayuda', + 'Image title': 'Titulo de imagen', + 'Border width': 'Ancho de borde', + 'Border style': 'Estilo de borde', + Error: 'Error', + Warn: 'Advertencia', + Valid: 'V\u00e1lido', + 'To open the popup, press Shift+Enter': 'Para abrir el elemento emergente, pulse May\u00fas+Intro', + 'Rich Text Area. Press ALT-0 for help.': '\u00c1rea de texto enriquecido. Pulse ALT-0 para abrir la ayuda.', + 'System Font': 'Fuente de sistema', + 'Failed to upload image: {0}': 'Fallo al cargar imagen: {0}', + 'Failed to load plugin: {0} from url {1}': 'Fallo al cargar complemento: {0} desde URL {1}', + 'Failed to load plugin url: {0}': 'Fallo al cargar URL del complemento: {0}', + 'Failed to initialize plugin: {0}': 'Fallo al iniciar el complemento: {0}', + example: 'ejemplo', + Search: 'Buscar', + All: 'Todo', + Currency: 'Divisa', + Text: 'Texto', + Quotations: 'Comillas', + Mathematical: 'S\u00edmbolo matem\u00e1tico', + 'Extended Latin': 'Latino extendido A', + Symbols: 'S\u00edmbolos', + Arrows: 'Flechas', + 'User Defined': 'Definido por el usuario', + 'dollar sign': 'signo de d\u00f3lar', + 'currency sign': 'signo de divisa', + 'euro-currency sign': 'signo de euro', + 'colon sign': 'signo de dos puntos', + 'cruzeiro sign': 'signo de cruceiro', + 'french franc sign': 'signo de franco franc\u00e9s', + 'lira sign': 'signo de lira', + 'mill sign': 'signo de mill', + 'naira sign': 'signo de naira', + 'peseta sign': 'signo de peseta', + 'rupee sign': 'signo de rupia', + 'won sign': 'signo de won', + 'new sheqel sign': 'signo de nuevo s\u00e9quel', + 'dong sign': 'signo de dong', + 'kip sign': 'signo de kip', + 'tugrik sign': 'signo de tugrik', + 'drachma sign': 'signo de dracma', + 'german penny symbol': 'signo de penique alem\u00e1n', + 'peso sign': 'signo de peso', + 'guarani sign': 'signo de guaran\u00ed', + 'austral sign': 'signo de austral', + 'hryvnia sign': 'signo de grivna', + 'cedi sign': 'signo de cedi', + 'livre tournois sign': 'signo de libra tornesa', + 'spesmilo sign': 'signo de spesmilo', + 'tenge sign': 'signo de tenge', + 'indian rupee sign': 'signo de rupia india', + 'turkish lira sign': 'signo de lira turca', + 'nordic mark sign': 'signo de marco n\u00f3rdico', + 'manat sign': 'signo de manat', + 'ruble sign': 'signo de rublo', + 'yen character': 'car\u00e1cter de yen', + 'yuan character': 'car\u00e1cter de yuan', + 'yuan character, in hong kong and taiwan': 'car\u00e1cter de yuan en Hong Kong y Taiw\u00e1n', + 'yen\/yuan character variant one': 'Variante uno de car\u00e1cter de yen\/yuan', + 'Loading emoticons...': 'Cargando emoticonos...', + 'Could not load emoticons': 'No se han podido cargar los emoticonos', + People: 'Personas', + 'Animals and Nature': 'Animales y naturaleza', + 'Food and Drink': 'Comida y bebida', + Activity: 'Actividad', + 'Travel and Places': 'Viajes y lugares', + Objects: 'Objetos', + Flags: 'Banderas', + Characters: 'Caracteres', + 'Characters (no spaces)': 'Caracteres (sin espacios)', + '{0} characters': '{0} caracteres', + 'Error: Form submit field collision.': 'Error: Colisi\u00f3n de campo al enviar formulario.', + 'Error: No form element found.': 'Error: No se encuentra ning\u00fan elemento de formulario.', + Update: 'Actualizar', + 'Color swatch': 'Muestrario de colores', + Turquoise: 'Turquesa', + Green: 'Verde', + Blue: 'Azul', + Purple: 'P\u00farpura', + 'Navy Blue': 'Azul marino', + 'Dark Turquoise': 'Turquesa oscuro', + 'Dark Green': 'Verde oscuro', + 'Medium Blue': 'Azul medio', + 'Medium Purple': 'P\u00farpura medio', + 'Midnight Blue': 'Azul medio', + Yellow: 'Amarillo', + Orange: 'Naranja', + Red: 'Rojo', + 'Light Gray': 'Gris claro', + Gray: 'Gris', + 'Dark Yellow': 'Amarillo oscuro', + 'Dark Orange': 'Naranja oscuro', + 'Dark Red': 'Rojo oscuro', + 'Medium Gray': 'Gris medio', + 'Dark Gray': 'Gris oscuro', + 'Light Green': 'Verde claro', + 'Light Yellow': 'Amarillo claro', + 'Light Red': 'Rojo claro', + 'Light Purple': 'Morado claro', + 'Light Blue': 'Azul claro', + 'Dark Purple': 'Morado oscuro', + 'Dark Blue': 'Azul oscuro', + Black: 'Negro', + White: 'Blanco', + 'Switch to or from fullscreen mode': 'Activar o desactivar modo pantalla completa', + 'Open help dialog': 'Abrir di\u00e1logo de ayuda', + history: 'historial', + styles: 'estilos', + formatting: 'formato', + alignment: 'alineaci\u00f3n', + indentation: 'sangr\u00eda', + 'permanent pen': 'bol\u00edgrafo permanente', + comments: 'comentarios', + 'Format Painter': 'Copiar formato', + 'Insert\/edit iframe': 'Insertar\/editar iframe', + Capitalization: 'Uso de may\u00fasculas', + lowercase: 'min\u00fasculas', + UPPERCASE: 'MAY\u00daSCULAS', + 'Title Case': 'Tipo T\u00edtulo', + 'Permanent Pen Properties': 'Propiedades del bol\u00edgrafo permanente', + 'Permanent pen properties...': 'Propiedades del bol\u00edgrafo permanente...', + Font: 'Fuente', + Size: 'Tama\u00f1o', + 'More...': 'M\u00e1s...', + 'Spellcheck Language': 'Corrector', + 'Select...': 'Seleccionar...', + Preferences: 'Preferencias', + Yes: 'S\u00ed', + No: 'No', + 'Keyboard Navigation': 'Navegaci\u00f3n con el teclado', + Version: 'Versi\u00f3n', + Anchor: 'Ancla', + 'Special character': 'Car\u00e1cter especial', + 'Code sample': 'Ejemplo de c\u00f3digo', + Color: 'Color', + Emoticons: 'Emoticonos', + 'Document properties': 'Propiedades del documento', + Image: 'Imagen', + 'Insert link': 'Insertar enlace', + Target: 'Destino', + Link: 'Enlace', + Poster: 'Miniatura', + Media: 'Media', + Print: 'Imprimir', + Prev: 'Anterior', + 'Find and replace': 'Buscar y reemplazar', + 'Whole words': 'Palabras completas', + Spellcheck: 'Corrector ortogr\u00e1fico', + Caption: 'Subt\u00edtulo', + 'Insert template': 'Insertar plantilla' +}) diff --git a/public/resource/tinymce/langs/zh_CN.js b/public/resource/tinymce/langs/zh_CN.js new file mode 100644 index 0000000..bcd8774 --- /dev/null +++ b/public/resource/tinymce/langs/zh_CN.js @@ -0,0 +1,389 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u505a", +"Undo": "\u64a4\u9500", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", +"Div": "Div", +"Pre": "Pre", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u6587\u533a\u5757", +"Inline": "\u6587\u672c", +"Blocks": "\u57fa\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Fonts": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "\u7c7b\u578b", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor...": "\u951a\u70b9...", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special characters...": "\u7279\u6b8a\u5b57\u7b26...", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", +"Color Picker": "\u9009\u8272\u5668", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image...": "\u56fe\u7247...", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", +"Current window": "\u5f53\u524d\u7a97\u53e3", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link...": "\u94fe\u63a5...", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media...": "\u591a\u5a92\u4f53...", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print...": "\u6253\u5370...", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Previous": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Find whole words only": "\u5168\u5b57\u5339\u914d", +"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Show caption": "\u663e\u793a\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template...": "\u63d2\u5165\u6a21\u677f...", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Remove color": "\u79fb\u9664\u989c\u8272", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Word count": "\u5b57\u6570", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", +"Image title": "\u56fe\u7247\u6807\u9898", +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", +"Border style": "\u8fb9\u6846\u6837\u5f0f", +"Error": "\u9519\u8bef", +"Warn": "\u8b66\u544a", +"Valid": "\u6709\u6548", +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", +"System Font": "\u7cfb\u7edf\u5b57\u4f53", +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", +"example": "\u793a\u4f8b", +"Search": "\u641c\u7d22", +"All": "\u5168\u90e8", +"Currency": "\u8d27\u5e01", +"Text": "\u6587\u5b57", +"Quotations": "\u5f15\u7528", +"Mathematical": "\u6570\u5b66", +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", +"Symbols": "\u7b26\u53f7", +"Arrows": "\u7bad\u5934", +"User Defined": "\u81ea\u5b9a\u4e49", +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", +"currency sign": "\u8d27\u5e01\u7b26\u53f7", +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", +"colon sign": "\u5192\u53f7", +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", +"lira sign": "\u91cc\u62c9\u7b26\u53f7", +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", +"naira sign": "\u5948\u62c9\u7b26\u53f7", +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", +"won sign": "\u97e9\u5143\u7b26\u53f7", +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", +"austral sign": "\u6fb3\u5143\u7b26\u53f7", +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", +"cedi sign": "\u585e\u5730\u7b26\u53f7", +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", +"spesmilo sign": "spesmilo\u7b26\u53f7", +"tenge sign": "\u575a\u6208\u7b26\u53f7", +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", +"ruble sign": "\u5362\u5e03\u7b26\u53f7", +"yen character": "\u65e5\u5143\u5b57\u6837", +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", +"People": "\u4eba\u7c7b", +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", +"Activity": "\u6d3b\u52a8", +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", +"Objects": "\u7269\u4ef6", +"Flags": "\u65d7\u5e1c", +"Characters": "\u5b57\u7b26", +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", +"Update": "\u66f4\u65b0", +"Color swatch": "\u989c\u8272\u6837\u672c", +"Turquoise": "\u9752\u7eff\u8272", +"Green": "\u7eff\u8272", +"Blue": "\u84dd\u8272", +"Purple": "\u7d2b\u8272", +"Navy Blue": "\u6d77\u519b\u84dd", +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", +"Dark Green": "\u6df1\u7eff\u8272", +"Medium Blue": "\u4e2d\u84dd\u8272", +"Medium Purple": "\u4e2d\u7d2b\u8272", +"Midnight Blue": "\u6df1\u84dd\u8272", +"Yellow": "\u9ec4\u8272", +"Orange": "\u6a59\u8272", +"Red": "\u7ea2\u8272", +"Light Gray": "\u6d45\u7070\u8272", +"Gray": "\u7070\u8272", +"Dark Yellow": "\u6697\u9ec4\u8272", +"Dark Orange": "\u6df1\u6a59\u8272", +"Dark Red": "\u6df1\u7ea2\u8272", +"Medium Gray": "\u4e2d\u7070\u8272", +"Dark Gray": "\u6df1\u7070\u8272", +"Black": "\u9ed1\u8272", +"White": "\u767d\u8272", +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", +"history": "\u5386\u53f2", +"styles": "\u6837\u5f0f", +"formatting": "\u683c\u5f0f\u5316", +"alignment": "\u5bf9\u9f50", +"indentation": "\u7f29\u8fdb", +"permanent pen": "\u8bb0\u53f7\u7b14", +"comments": "\u5907\u6ce8", +"Anchor": "\u951a\u70b9", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Image": "\u56fe\u7247", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"Link": "\u94fe\u63a5", +"Poster": "\u5c01\u9762", +"Media": "\u5a92\u4f53", +"Print": "\u6253\u5370", +"Prev": "\u4e0a\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Caption": "\u6807\u9898", +"Insert template": "\u63d2\u5165\u6a21\u677f" +}); diff --git a/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css b/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css new file mode 100644 index 0000000..0e4ed10 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonyunzhupaas%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonyunzhupaas%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/content.min.css b/public/resource/tinymce/skins/ui/oxide-dark/content.min.css new file mode 100644 index 0000000..4a8b670 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonyunzhupaas%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonyunzhupaas%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#282a36}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6272a4}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#ff79c6}.token.boolean,.token.number{color:#bd93f9}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#50fa7b}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#f1fa8c}.token.keyword{color:#8be9fd}.token.important,.token.regex{color:#ffb86c}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #4099ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #4099ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #4099ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #4099ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #4099ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#4099ff}.mce-content-body .mce-edit-focus{outline:3px solid #4099ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid transparent;bottom:-1px;content:'';left:-1px;mix-blend-mode:lighten;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#4099ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css b/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css new file mode 100644 index 0000000..35f7dc0 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css b/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css new file mode 100644 index 0000000..e71f6f0 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox{box-shadow:none;box-sizing:content-box;color:#2a3746;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #000;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #000;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #000;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#000;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.5);border-color:#207ab7;color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.5);border-color:rgba(255,165,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.5);border-color:rgba(204,0,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.5);border-color:rgba(120,171,70,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.8)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#3d546f;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3d546f;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#fff;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#3d546f;background-image:none;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:hover:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:active:not(:disabled){background-color:#2b3b4e;background-image:none;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked[disabled]{background-color:#3d546f;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:focus:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:active:not(:disabled){background-color:#2b3b4e;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#fff}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(255,255,255,.2)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(255,255,255,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#1a1a1a;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#333;color:#fff;cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#fff;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#2b3b4e;color:#fff}.tox .tox-collection--list .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#4a5562;color:#fff}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(255,255,255,.5);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#fff}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(255,255,255,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#2b3b4e;border:1px solid #1a1a1a;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #000}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #000}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#4a5562}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#2b3b4e;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#fff;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(255,255,255,.5);font-size:12px}.tox .tox-comment__body{color:#fff;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(255,255,255,.5);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#2b3b4e;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(43,59,78,0),#2b3b4e);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#2b3b4e;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#fff;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#2b3b4e;box-shadow:0 0 8px 8px #2b3b4e;color:#fff;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#2b3b4e;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(255,255,255,.5)}.tox .tox-user__name{color:rgba(255,255,255,.5);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(34,47,62,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#222f3e}.tox .tox-dialog{background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(42,55,70,.15),0 0 40px 1px rgba(42,55,70,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#2b3b4e;border-bottom:none;color:#fff;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#fff;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(255,255,255,.5);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#fff}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#fff;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#fff;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#2b3b4e;border-top:1px solid #000;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(34,47,62,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #000}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #000;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(255,255,255,.5);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #000}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(42,55,70,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(255,255,255,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(255,255,255,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #2b3b4e;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(255,255,255,.5);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#fff}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#000;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:#fff;display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #000}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn--active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#fff}.tox .tox-notification--success p{color:#fff}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#fff}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#fff}.tox .tox-notification--error p{color:#fff}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#fff}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#fff}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#fff}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#fff}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#fff}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#fff}.tox .tox-notification--info p{color:#fff}.tox .tox-notification--info a{color:#fff}.tox .tox-notification--info svg{fill:#fff}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#fff;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#222f3e transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#000 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #222f3e transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #000 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #222f3e transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #000 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #222f3e;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #000;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#222f3e;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #000;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(255,255,255,.5);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#222f3e;border-top:1px solid #000;color:#fff;display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:#fff;text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:#fff}.tox .tox-statusbar__resize-handle:focus svg{background-color:#4a5562;border-radius:1px;box-shadow:0 0 0 2px #4a5562}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(34,47,62,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#fff}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#4a5562;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:hover svg{fill:#fff}.tox .tox-tbtn:active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:active svg{fill:#fff}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#fff}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #4a5562 inset}.tox .tox-split-button:focus{background:#4a5562;box-shadow:none;color:#fff}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-toolbar-overlord{background-color:#222f3e}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #000;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #000}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #000}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #000}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#3d546f;border-radius:3px;box-shadow:0 2px 4px rgba(42,55,70,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #3d546f;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #3d546f;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #3d546f;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #3d546f;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #000;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #000;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css b/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css new file mode 100644 index 0000000..3a45cac --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}} diff --git a/public/resource/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css b/public/resource/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css new file mode 100644 index 0000000..a0893b9 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} diff --git a/public/resource/tinymce/skins/ui/oxide/content.inline.min.css b/public/resource/tinymce/skins/ui/oxide/content.inline.min.css new file mode 100644 index 0000000..0e4ed10 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/content.inline.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonyunzhupaas%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonyunzhupaas%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'} diff --git a/public/resource/tinymce/skins/ui/oxide/content.min.css b/public/resource/tinymce/skins/ui/oxide/content.min.css new file mode 100644 index 0000000..6fe4957 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/content.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonyunzhupaas%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonyunzhupaas%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonyunzhupaas%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css b/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css new file mode 100644 index 0000000..35f7dc0 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} diff --git a/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff b/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff new file mode 100644 index 0000000..1e3be03 Binary files /dev/null and b/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff differ diff --git a/public/resource/tinymce/skins/ui/oxide/skin.min.css b/public/resource/tinymce/skins/ui/oxide/skin.min.css new file mode 100644 index 0000000..f570b8e --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/skin.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #ccc;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#222f3e;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#222f3e}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #ccc;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #dee0e2 inset}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #ccc;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #ccc}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #ccc}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #ccc}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:3px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #ccc;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #ccc;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px} diff --git a/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css b/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css new file mode 100644 index 0000000..3a45cac --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}} diff --git a/public/resource/tinymce/skins/ui/oxide/skin.shadowdom.min.css b/public/resource/tinymce/skins/ui/oxide/skin.shadowdom.min.css new file mode 100644 index 0000000..a0893b9 --- /dev/null +++ b/public/resource/tinymce/skins/ui/oxide/skin.shadowdom.min.css @@ -0,0 +1,7 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..558ad27 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,92 @@ + + + diff --git a/src/api/basic/common.ts b/src/api/basic/common.ts new file mode 100644 index 0000000..db7d4d7 --- /dev/null +++ b/src/api/basic/common.ts @@ -0,0 +1,57 @@ +import { defHttp } from '@/utils/http/axios'; +import { ContentTypeEnum } from '@/enums/httpEnum'; + +enum Api { + PreviewFile = '/api/file/Uploader/Preview', + Merge = '/api/file/merge', + AMap = '/api/system/Location', +} + +// 获取下载文件链接 +export function getDownloadUrl(type: string, fileName: string = '') { + return defHttp.get({ url: `/api/file/Download/${type}/${fileName}` }); +} +// 获取全部下载文件链接(打包下载) +export function getPackDownloadUrl(type: string, data) { + return defHttp.post({ url: `/api/file/PackDownload/${type}`, data }); +} +// 预览文件 +export function previewFile(data) { + return defHttp.get({ url: Api.PreviewFile, data }); +} +// 分片组装 +export function chunkMerge(data) { + return defHttp.post({ url: Api.Merge, data, headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED } }); +} +// 下载导入示例模板 +export function getTemplateDownload(url, data) { + return defHttp.get({ url: `/api/${url}/TemplateDownload`, data }); +} +// 下载导入示例模板 +export function getImportPreview(url, data) { + return defHttp.get({ url: `/api/${url}/ImportPreview`, data }); +} +// 导入数据 +export function importData(url, data) { + return defHttp.post({ url: `/api/${url}/ImportData`, data }); +} +// 导入数据 +export function getImportExceptionData(url, data) { + return defHttp.post({ url: `/api/${url}/ImportExceptionData`, data }); +} +// 查询附近数据 +export function getAroundList(data) { + return defHttp.get({ url: Api.AMap + '/around', data }); +} +// 根据关键字查询附近数据 +export function getTextList(data) { + return defHttp.get({ url: Api.AMap + '/text', data }); +} +// 输入提示 +export function getInputTips(data) { + return defHttp.get({ url: Api.AMap + '/inputtips', data }); +} +// 导入 +export function upload(url, data) { + return defHttp.post({ url: url, data, headers: { 'Content-Type': ContentTypeEnum.FORM_DATA } }); +} diff --git a/src/api/basic/model/userModel.ts b/src/api/basic/model/userModel.ts new file mode 100644 index 0000000..aff0da8 --- /dev/null +++ b/src/api/basic/model/userModel.ts @@ -0,0 +1,98 @@ +import type { UserInfo, SysConfigInfo, PermissionInfo } from '#/store'; +import type { RouteMeta } from 'vue-router'; + +/** + * @description: 登录请求基础参数 + */ +export interface LoginParams { + /** 账号 */ + account: string; + /** 密码 */ + password: string; + /** 验证码(可选) */ + code?: string; + /** 来源(可选) */ + origin?: string; + /** 时间戳(可选) */ + timestamp?: number | string; + /** 零号票证(可选) */ + yunzhupaas_ticket?: string; +} + +/** + * @description: 登录接口请求参数 + */ +export interface LoginRequestParams extends LoginParams { + /** 授权类型(如:password、captcha 等) */ + grant_type: string; +} + +/** + * @description: 后端返回的菜单项结构 + */ +export interface BackMenu { + /** 菜单 ID */ + id: string; + /** 菜单编码 */ + enCode: string; + /** 菜单名称 */ + fullName: string; + /** 菜单图标 */ + icon: string; + /** 链接目标(打开方式) */ + linkTarget: string; + /** 父级菜单 ID */ + parentId: string; + /** 是否有子菜单 */ + hasChildren: boolean; + /** 扩展属性 JSON 字符串 */ + propertyJson: string; + /** 排序码 */ + sortCode: number; + /** 菜单类型(1-目录,2-菜单,3-按钮等) */ + type: number; + /** 菜单地址/路由路径 */ + urlAddress: string; + /** 路由路径(可选,用于前端路由构建) */ + path?: string; + /** 子菜单列表(可选) */ + children?: Nullable; +} + +/** + * @description: 路由配置项结构 + */ +export interface RouteItem { + /** 路由路径 */ + path: string; + /** 路由组件 */ + component: any; + /** 路由元信息 */ + meta: RouteMeta; + /** 路由名称(可选) */ + name?: string; + /** 路由别名(可选) */ + alias?: string | string[]; + /** 重定向路径(可选) */ + redirect?: string; + /** 是否区分大小写(可选) */ + caseSensitive?: boolean; + /** 子路由列表(可选) */ + children?: RouteItem[]; +} + +/** + * @description: 获取用户信息接口返回值 + */ +export interface GetUserInfoModel { + /** 菜单列表 */ + menuList: BackMenu[]; + /** 权限列表 */ + permissionList: PermissionInfo[]; + /** 路由列表 */ + routerList: BackMenu[]; + /** 系统配置信息 */ + sysConfigInfo: SysConfigInfo; + /** 用户基本信息 */ + userInfo: UserInfo; +} diff --git a/src/api/basic/user.ts b/src/api/basic/user.ts new file mode 100644 index 0000000..8ac0bcb --- /dev/null +++ b/src/api/basic/user.ts @@ -0,0 +1,66 @@ +import { defHttp } from '@/utils/http/axios'; +import { LoginParams } from './model/userModel'; +import { ContentTypeEnum } from '@/enums/httpEnum'; +import { getYunzhupaasAppId } from '@/utils/yunzhupaas'; + +enum Api { + Prefix = '/api/oauth', + Login = '/api/oauth/Login', + Logout = '/api/oauth/Logout', + GetUserInfo = '/api/oauth/CurrentUser', + Unlock = '/api/oauth/LockScreen', +} + +// 用户登录 +export function loginApi(params: LoginParams) { + return defHttp.post({ url: Api.Login, params, headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED } }); +} +// 获取当前用户信息 +export function getUserInfo() { + const systemCode = getYunzhupaasAppId() ? getYunzhupaasAppId().replace('YUNZHUPAAS_APP_', '') : ''; + return defHttp.get({ url: Api.GetUserInfo, data: { systemCode } }); +} +// 退出登陆 +export function doLogout() { + return defHttp.get({ url: Api.Logout }); +} +// 锁屏解锁登录 +export function unlock(data: LoginParams) { + return defHttp.post({ url: Api.Unlock, data }); +} +// 获取系统默认配置 +export function getConfig(account) { + return defHttp.get({ url: Api.Prefix + `/getConfig/${account}` }); +} +// 修改密码信息发送 +export function updatePasswordMessage() { + return defHttp.post({ url: Api.Prefix + '/updatePasswordMessage' }); +} +// 获取登录配置 +export function getLoginConfig() { + return defHttp.get({ url: Api.Prefix + `/getLoginConfig` }); +} +// 获取登录票据 +export function getTicket() { + return defHttp.get({ url: Api.Prefix + `/getTicket` }); +} +// 根据票据获取登录状态 +export function getTicketStatus(ticket) { + return defHttp.get({ url: Api.Prefix + `/getTicketStatus/${ticket}` }); +} +// 第三方登录回调列表后点击登录 +export function socialsLogin(params) { + return defHttp.post({ url: Api.Prefix + `/Login/socials`, params, headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED } }); +} +// 扫码登陆获取凭证 +export function getCodeCertificate() { + return defHttp.get({ url: Api.Prefix + `/codeCertificate` }); +} +// 扫码登陆获取凭证状态 +export function getCodeCertificateStatus(ticket) { + return defHttp.get({ url: Api.Prefix + `/codeCertificateStatus/${ticket}` }); +} +// 扫码登陆设置凭证状态 +export function setCodeCertificateStatus(ticket, status) { + return defHttp.get({ url: Api.Prefix + `/setCodeCertificateStatus/${ticket}/${status}` }); +} diff --git a/src/api/extend/bigData.ts b/src/api/extend/bigData.ts new file mode 100644 index 0000000..79ecd7b --- /dev/null +++ b/src/api/extend/bigData.ts @@ -0,0 +1,14 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/extend/BigData', +} + +// 获取数据列表(分页) +export function getBigDataList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 预览数据库表 +export function createBigData() { + return defHttp.post({ url: Api.Prefix }); +} diff --git a/src/api/extend/documentPreview.ts b/src/api/extend/documentPreview.ts new file mode 100644 index 0000000..4605d6d --- /dev/null +++ b/src/api/extend/documentPreview.ts @@ -0,0 +1,14 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/extend/DocumentPreview', +} + +// 获取文档列表 +export function getDocumentPreviewList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 文件在线预览 +export function previewFile(fileId, type) { + return defHttp.get({ url: Api.Prefix + `/${fileId}/Preview?previewType=${type}` }); +} diff --git a/src/api/extend/email.ts b/src/api/extend/email.ts new file mode 100644 index 0000000..ffe986b --- /dev/null +++ b/src/api/extend/email.ts @@ -0,0 +1,58 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/extend/Email', +} + +// 获取邮件列表(收件箱、标星件、草稿箱、已发送) +export function getEmailList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取邮箱配置 +export function getConfigInfo() { + return defHttp.get({ url: Api.Prefix + '/Config' }); +} +// 更新邮件配置 +export function saveConfig(data) { + return defHttp.put({ url: Api.Prefix + '/Config', data }); +} +// 邮箱配置-测试连接 +export function checkMail(data) { + return defHttp.post({ url: Api.Prefix + '/Config/Actions/CheckMail', data }); +} +// 发邮件 +export function saveSent(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 存草稿 +export function saveDraft(data) { + return defHttp.post({ url: Api.Prefix + `/Actions/SaveDraft`, data }); +} +// 获取邮件信息 +export function getEmailInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 删除邮件 +export function delEmail(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} +// 设置已读邮件 +export function setRead(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/Actions/Read` }); +} +// 设置未读邮件 +export function setUnread(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/Actions/Unread` }); +} +// 设置标星邮件 +export function setStar(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/Actions/Star` }); +} +// 设置取消标星 +export function setUnStar(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/Actions/Unstar` }); +} +// 收邮件 +export function receive() { + return defHttp.post({ url: Api.Prefix + `/Receive` }); +} diff --git a/src/api/extend/employee.ts b/src/api/extend/employee.ts new file mode 100644 index 0000000..25ec3a3 --- /dev/null +++ b/src/api/extend/employee.ts @@ -0,0 +1,30 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/extend/Employee', +} + +// 获取职员列表 +export function getEmployeeList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 删除职员 +export function delEmployee(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 导出Excel +export function exportExcel(data) { + return defHttp.get({ url: Api.Prefix + `/ExportData`, data }); +} +// 导入模板下载 +export function templateDownload() { + return defHttp.get({ url: Api.Prefix + `/TemplateDownload` }); +} +// 导入 +export function importData(data) { + return defHttp.post({ url: Api.Prefix + `/ImportData`, data }); +} +// 导入预览 +export function importPreview(data) { + return defHttp.get({ url: Api.Prefix + `/ImportPreview`, data }); +} diff --git a/src/api/extend/order.ts b/src/api/extend/order.ts new file mode 100644 index 0000000..0530bbc --- /dev/null +++ b/src/api/extend/order.ts @@ -0,0 +1,30 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/extend/CrmOrder', +} + +// 获取订单列表 +export function getOrderList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 删除订单 +export function delOrder(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 获取订单列表-订单商品 +export function getOrderEntryList(id) { + return defHttp.get({ url: Api.Prefix + `/OrderEntry/${id}/Items` }); +} +// 获取订单列表-收款计划 +export function getOrderPlanList(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/CollectionPlan` }); +} +// 获取客户列表 +export function getCustomerList(keyword?) { + return defHttp.get({ url: Api.Prefix + `/Customer`, data: { keyword } }); +} +// 获取客户列表 +export function getGoodsList(data) { + return defHttp.get({ url: Api.Prefix + `/Goods`, data }); +} diff --git a/src/api/extend/projectGantt.ts b/src/api/extend/projectGantt.ts new file mode 100644 index 0000000..2d84171 --- /dev/null +++ b/src/api/extend/projectGantt.ts @@ -0,0 +1,46 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/extend/ProjectGantt', +} + +//获取项目管理列表 +export function getProjectList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 添加项目 +export function createProject(data) { + return defHttp.post({ url: Api.Prefix, data }, { useCipher: true }); +} +// 修改项目 +export function updateProject(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}`, data }); +} +// 删除项目/任务 +export function delProject(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} +// 获取项目信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 获取项目任务列表 +export function getTaskList(data) { + return defHttp.get({ url: Api.Prefix + `/${data.projectId}/Task`, data }); +} +// 获取项目任务树形(新建任务) +export function getTaskSelector(projectId, id = 0) { + return defHttp.get({ url: Api.Prefix + `/${projectId}/Task/Selector/${id}` }); +} +// 获取项目任务信息 +export function getTaskInfo(id) { + return defHttp.get({ url: Api.Prefix + `/Task/${id}` }); +} +// 添加项目任务 +export function createTask(data) { + return defHttp.post({ url: Api.Prefix + `/Task`, data }); +} +// 修改项目任务 +export function updateTask(data) { + return defHttp.put({ url: Api.Prefix + `/Task/${data.id}`, data }); +} diff --git a/src/api/extend/saleOrder.ts b/src/api/extend/saleOrder.ts new file mode 100644 index 0000000..c75072f --- /dev/null +++ b/src/api/extend/saleOrder.ts @@ -0,0 +1,50 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/extend/saleOrder', +} + +// 获取订单列表 +export function getOrderList(data) { + return defHttp.get({ url: Api.Prefix + '/Product', data }); +} +//订单详情 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/Product/${id}` }); +} +//新建订单 +export function createOrder(data) { + return defHttp.post({ url: Api.Prefix + `/Product`, data }); +} +// 编辑订单 +export function updateOrder(data) { + return defHttp.put({ url: Api.Prefix + `/Product/${data.id}`, data }); +} +// 删除订单 +export function delOrder(id) { + return defHttp.delete({ url: Api.Prefix + `/Product/${id}` }); +} +// 获取客户类别 +export function getCustomer(data) { + return defHttp.get({ url: Api.Prefix + '/Customer', data }); +} +// 获取分类 +export function getProductClassify() { + return defHttp.get({ url: Api.Prefix + '/Classify' }); +} +// 获取商品列表 +export function getGoodsList(data) { + return defHttp.get({ url: Api.Prefix + '/Goods', data }); +} +// 获取商品列表(通过type) +export function getGoodsListByType(type) { + return defHttp.get({ url: Api.Prefix + `/Goods/getGoodList?type=${type}` }); +} +// 获取销售明细 +export function getProductEntry(id) { + return defHttp.get({ url: Api.Prefix + `/Product/ProductEntry/${id}` }); +} +// 产品下拉 +export function getGoodsSelector(data) { + return defHttp.get({ url: Api.Prefix + '/Goods/Selector', data }); +} diff --git a/src/api/extend/table.ts b/src/api/extend/table.ts new file mode 100644 index 0000000..c7feba6 --- /dev/null +++ b/src/api/extend/table.ts @@ -0,0 +1,62 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/extend/TableExample', +} + +// 获取城市信息列表 +export function getCityList(id) { + return defHttp.get({ url: Api.Prefix + `/CityList/${id}` }); +} +// 新建项目 +export function createTable(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 删除项目 +export function delTable(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} +// 获取延伸扩展列表 +export function getIndustryList(data) { + return defHttp.get({ url: Api.Prefix + `/IndustryList`, data }); +} +// 获取普通表格示例信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 获取表格数据列表 +export function getTableList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取表格分组列表 +export function getTableListAll(data) { + return defHttp.get({ url: Api.Prefix + `/All`, data }); +} +// 行编辑 +export function updateTableRow(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}/Actions/RowsEdit`, data }); +} +// 获取批注 +export function getPostilList(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Postil` }); +} +// 发送批注 +export function sendPostil(id, data) { + return defHttp.post({ url: Api.Prefix + `/${id}/Postil`, data }); +} +// 删除批注 +export function delPostil(id, index) { + return defHttp.delete({ url: Api.Prefix + `/${id}/Postil/${index}` }); +} +// 更新项目 +export function updateTable(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}`, data }); +} +// 更新标记 +export function updateSign(id, data) { + return defHttp.put({ url: Api.Prefix + `/UpdateSign/${id}`, data }); +} +// 列表(树形表格) +export function getTableListByType(data) { + return defHttp.get({ url: Api.Prefix + `/ControlSample/${data.typeId}`, data }); +} diff --git a/src/api/msgCenter/accountConfig.ts b/src/api/msgCenter/accountConfig.ts new file mode 100644 index 0000000..91baf42 --- /dev/null +++ b/src/api/msgCenter/accountConfig.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/message/AccountConfig', +} + +// 获取配置列表 +export function getConfigList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建配置 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改配置 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取配置 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除配置 +export function delConfig(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制配置 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 测试配置 +export function testConfig(data) { + return defHttp.post({ url: Api.Prefix + `/${data.testType}`, data }); +} diff --git a/src/api/msgCenter/msgMonitor.ts b/src/api/msgCenter/msgMonitor.ts new file mode 100644 index 0000000..7016f6c --- /dev/null +++ b/src/api/msgCenter/msgMonitor.ts @@ -0,0 +1,22 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/message/MessageMonitor', +} + +// 获取消息监控列表 +export function getMsgMonitorList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取详情 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/detail/' + id }); +} +// 批量删除 +export function delMsgMonitor(data) { + return defHttp.delete({ url: Api.Prefix + '/batchRemove', data }); +} +// 一键清空 +export function emptyMsgMonitor() { + return defHttp.delete({ url: Api.Prefix + '/empty' }); +} diff --git a/src/api/msgCenter/msgTemplate.ts b/src/api/msgCenter/msgTemplate.ts new file mode 100644 index 0000000..72f880c --- /dev/null +++ b/src/api/msgCenter/msgTemplate.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/message/MessageTemplateConfig', +} + +// 获取消息模板列表 +export function getMsgTemplateList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建消息模板 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改消息模板 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取消息模板 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除消息模板 +export function delMsgTemplate(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制消息模板 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 测试发送配置 +export function testMsgTemplate(data) { + return defHttp.post({ url: Api.Prefix + `/testSendMail`, data }); +} diff --git a/src/api/msgCenter/sendConfig.ts b/src/api/msgCenter/sendConfig.ts new file mode 100644 index 0000000..297f6da --- /dev/null +++ b/src/api/msgCenter/sendConfig.ts @@ -0,0 +1,42 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/message/SendMessageConfig', +} + +// 获取发送配置列表(分页) +export function getSendConfigList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建发送配置 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改发送配置 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取发送配置 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除发送配置 +export function delSendConfig(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制发送配置 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 测试发送配置获取配置信息 +export function getTestSendConfig(id) { + return defHttp.post({ url: Api.Prefix + `/getTestConfig/${id}` }); +} +// 测试发送配置 +export function testSendConfig(data) { + return defHttp.post({ url: Api.Prefix + `/testSendConfig`, data }); +} +// 发送配置下拉列表 +export function getSendConfigSelect(data) { + return defHttp.get({ url: Api.Prefix + `/getSendConfigList`, data }); +} diff --git a/src/api/onlineDev/dataReport.ts b/src/api/onlineDev/dataReport.ts new file mode 100644 index 0000000..1439d84 --- /dev/null +++ b/src/api/onlineDev/dataReport.ts @@ -0,0 +1,33 @@ +import { defHttp } from '@/utils/http/axios'; +import { useGlobSetting } from '@/hooks/setting'; + +enum Api { + Prefix = '/Data', +} + +const { reportServer } = useGlobSetting(); + +// 获取报表列表 +export function getDataReportList(data) { + return defHttp.get({ url: reportServer + Api.Prefix, data }); +} +// 获取报表下拉列表 +export function getDataReportSelector() { + return defHttp.get({ url: reportServer + Api.Prefix + '/Selector' }); +} +// 删除报表 +export function delDataReport(id) { + return defHttp.delete({ url: reportServer + Api.Prefix + '/' + id }); +} +// 复制报表 +export function copy(id) { + return defHttp.post({ url: reportServer + Api.Prefix + `/${id}/Actions/Copy` }); +} +// 启用禁用报表 +export function release(id) { + return defHttp.put({ url: reportServer + Api.Prefix + `/${id}/Actions/State` }); +} +// 获取信息 +export function getDataReportInfo(id) { + return defHttp.get({ url: reportServer + Api.Prefix + `/${id}` }); +} diff --git a/src/api/onlineDev/dataV.ts b/src/api/onlineDev/dataV.ts new file mode 100644 index 0000000..5753a9f --- /dev/null +++ b/src/api/onlineDev/dataV.ts @@ -0,0 +1,10 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/blade-visual/visual', +} + +// 获取大屏下拉框 +export function getDataVSelector() { + return defHttp.get({ url: Api.Prefix + '/Selector' }); +} diff --git a/src/api/onlineDev/integrate.ts b/src/api/onlineDev/integrate.ts new file mode 100644 index 0000000..78c94f0 --- /dev/null +++ b/src/api/onlineDev/integrate.ts @@ -0,0 +1,76 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/visualdev/Integrate', + TaskPrefix = '/api/visualdev/IntegrateTask', + WebhookPrefix = '/api/visualdev/Hooks', +} + +// 获取集成助手列表 +export function getIntegrateList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取集成助手信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 删除集成助手 +export function delIntegrate(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} +// 修改集成助手 +export function update(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}`, data }); +} +// 新建集成助手 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 复制集成助手 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 导出集成助手 +export function exportData(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 更新用户状态 +export function updateState(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/Actions/State` }); +} +// 获取执行列表 +export function getQueueList(data) { + return defHttp.get({ url: Api.TaskPrefix + '/queueList', data }); +} +// 获取日志列表 +export function getTaskList(data) { + return defHttp.get({ url: Api.TaskPrefix, data }); +} +// 删除日志 +export function delTask(id) { + return defHttp.delete({ url: Api.TaskPrefix + `/${id}` }); +} +// 重试日志 +export function retryTask(id) { + return defHttp.put({ url: Api.TaskPrefix + `/${id}/retry` }); +} +// 日志详情 +export function getTaskInfo(id) { + return defHttp.get({ url: Api.TaskPrefix + `/${id}` }); +} +// 节点重试 +export function nodeRetryTask(data) { + return defHttp.get({ url: Api.TaskPrefix + `/${data.id}/nodeRetry`, data }); +} +// 获取webhookUrl +export function getWebhookUrl(id) { + return defHttp.get({ url: Api.WebhookPrefix + `/getUrl`, data: { id } }); +} +// 获取webhook字段 +export function getWebhookParams(randomStr) { + return defHttp.get({ url: Api.WebhookPrefix + `/getParams/${randomStr}` }); +} +// webhook开启接收请求 +export function webhookStart(id, randomStr) { + return defHttp.get({ url: Api.WebhookPrefix + `/${id}/start/${randomStr}` }); +} diff --git a/src/api/onlineDev/portal.ts b/src/api/onlineDev/portal.ts new file mode 100644 index 0000000..1404006 --- /dev/null +++ b/src/api/onlineDev/portal.ts @@ -0,0 +1,114 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/visualdev/Portal', + AtlasPrefix = '/api/system/atlas', + DashboardPrefix = '/api/visualdev/Dashboard', + portalPrefix = '/api/system/PortalManage', +} + +// 获取门户列表 +export function getPortalList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取门户信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 删除门户 +export function delPortal(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} +// 修改门户 +export function updatePortal(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}`, data }); +} +// 新建门户 +export function createPortal(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 复制门户 +export function copyPortal(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 导出门户 +export function exportPortal(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 获取门户下拉框列表 +export function getPortalSelector(type?, systemId?) { + return defHttp.get({ url: Api.Prefix + '/Selector?platform=Web', data: { type, systemId } }); +} +// 切换用户门户默认显示 +export function setDefaultPortal(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/Actions/SetDefault?platform=Web` }); +} +// 获取门户展示数据(权限) +export function getAuthPortal(id, data) { + return defHttp.get({ url: Api.Prefix + `/${id}/auth`, data }); +} +// 获取全国省市区 +export function getAtlas() { + return defHttp.get({ url: Api.AtlasPrefix }); +} +// 获取地图json +export function getMapData(data) { + return defHttp.get({ url: Api.AtlasPrefix + '/geojson', data }); +} +// 用户拖拽后更新 +export function UpdateCustomPortal(id, data) { + return defHttp.put({ url: Api.Prefix + `/Custom/Save/${id}`, data }); +} +// 获取我的待办 +export function getFlowTodoCount(data) { + return defHttp.post({ url: Api.DashboardPrefix + '/FlowTodoCount', data }); +} +// 获取通知公告 +export function getNoticeList(data) { + return defHttp.post({ url: Api.DashboardPrefix + '/Notice', data }); +} +// 获取未读邮件 +export function getEmailList() { + return defHttp.get({ url: Api.DashboardPrefix + '/Email' }); +} +// 获取待办事项 +export function getFlowTodoList(type) { + return defHttp.get({ url: Api.DashboardPrefix + '/FlowTodo?type=' + type }); +} +// 获取我的待办事项 +export function getMyFlowTodoList(data) { + return defHttp.get({ url: Api.DashboardPrefix + '/MyFlowTodo', data }); +} +//发布 +export function release(id, data) { + return defHttp.put({ url: Api.Prefix + `/Actions/release/${id}`, data }); +} +// 获取门户管理列表 +export function getPortalManageList(data) { + return defHttp.get({ url: Api.portalPrefix + `/list/${data.systemId}`, data }); +} +// 获取门户名称列表 +export function getPortalManageSelector(data) { + return defHttp.get({ url: Api.Prefix + `/manage/Selector/${data.systemId}`, data }); +} +// 获取门户管理详情 +export function getPortalManageInfo(id) { + return defHttp.get({ url: Api.portalPrefix + `/${id}` }); +} +// 新建门户管理 +export function createPortalManage(data) { + return defHttp.post({ url: Api.portalPrefix, data }); +} +// 编辑门户管理 +export function updatePortalManage(data) { + return defHttp.put({ url: Api.portalPrefix + `/${data.id}`, data }); +} +// 删除门户管理 +export function delPortalManage(id) { + return defHttp.delete({ url: Api.portalPrefix + `/${id}` }); +} + +// 获取应用列表(发布过滤) +export function getSystemListFilter(data, id) { + return defHttp.get({ url: Api.Prefix + `/systemFilter/${id}`, data }); +} diff --git a/src/api/onlineDev/report.ts b/src/api/onlineDev/report.ts new file mode 100644 index 0000000..97ba4fb --- /dev/null +++ b/src/api/onlineDev/report.ts @@ -0,0 +1,104 @@ +import { reportHttp } from '@/utils/http/axios'; +import { ContentTypeEnum } from '@/enums/httpEnum'; + +enum Api { + Prefix = '/api/Report', +} + +/** + * univer报表 + */ +// 获取报表模板列表(分页) +export function getReportList(data) { + return reportHttp.get({ url: Api.Prefix, data }); +} +// 新建报表模板 +export function createReport(data) { + return reportHttp.post({ url: Api.Prefix, data }); +} +// 修改报表模板 +export function updateReport(data) { + return reportHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取报表模板 +export function getReportInfo(id) { + return reportHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除报表模板 +export function delReport(id) { + return reportHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制报表模板 +export function copy(id) { + return reportHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 列表导出报表 +export function upload(url, data) { + return reportHttp.post({ url: url, data, headers: { 'Content-Type': ContentTypeEnum.FORM_DATA } }); +} +// 导出数据报表模板数据 +export function exportData(id) { + return reportHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 获取数据和报表模板 +export function getData(data) { + return reportHttp.post({ url: Api.Prefix + `/Data`, data }); +} +// 修改报表设计 +export function saveVersion(data) { + return reportHttp.post({ url: Api.Prefix + '/Save', data }); +} +// 获取报表设计详情 +export function getVersionInfo(id) { + return reportHttp.get({ url: Api.Prefix + '/Info/' + id }); +} +// 获取报表版本 +export function getVersionList(id) { + return reportHttp.get({ url: Api.Prefix + '/Version/' + id }); +} +// 删除报表版本 +export function delVersion(id) { + return reportHttp.delete({ url: Api.Prefix + `/Info/${id}` }); +} +// 新增报表版本 +export function copyVersion(id) { + return reportHttp.post({ url: Api.Prefix + `/Info/${id}` }); +} +// 预览设计 +export function getPreviewDesign(id, data?: any) { + return reportHttp.post({ url: Api.Prefix + `/data/${id}/preview`, data }); +} +// 预览设计(通过报表大id获取) +export function getPreviewTemplate(id, data?: any) { + return reportHttp.post({ url: Api.Prefix + `/data/${id}/previewTemplate`, data }); +} +// 菜单 +export function getReportSelector() { + return reportHttp.get({ url: Api.Prefix + '/Selector' }); +} +// 上传图片 +export function uploadFileImage(data) { + return reportHttp.post({ url: Api.Prefix + '/data/upload/file', data, headers: { 'Content-Type': ContentTypeEnum.FORM_DATA } }); +} +// 上传图片 +export function uploadImg(data) { + return reportHttp.post({ url: Api.Prefix + '/data/downImg', data }); +} +// 上传excel +export function uploadFileExcel(data) { + return reportHttp.post({ url: Api.Prefix + '/data/ImportExcel', data, headers: { 'Content-Type': ContentTypeEnum.FORM_DATA } }); +} +// 下载excel +export function exportFileExcel(id, data) { + return reportHttp.post({ url: Api.Prefix + `/data/${id}/DownExcel`, data }); +} + +// 获取已发布菜单 +export function getReleaseMenu(id) { + return reportHttp.get({ url: Api.Prefix + `/${id}/getReleaseMenu` }); +} +// 生成菜单 +export function createMenu(id, data) { + return reportHttp.post({ url: Api.Prefix + `/${id}/Actions/Module`, data }); +} + diff --git a/src/api/onlineDev/shortLink.ts b/src/api/onlineDev/shortLink.ts new file mode 100644 index 0000000..3507b27 --- /dev/null +++ b/src/api/onlineDev/shortLink.ts @@ -0,0 +1,38 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/visualdev/ShortLink', +} + +// 获取外链信息 +export function getShortLinkInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 保存外链信息 +export function updateShortLink(data) { + return defHttp.put({ url: Api.Prefix, data }); +} +// 获取外链信息(渲染列表) +export function getConfig(id, encryption = '') { + return defHttp.get({ url: Api.Prefix + `/getConfig/${id}` + (encryption ? '?encryption=' + encryption : '') }); +} +// 校验外链密码 +export function checkPwd(data) { + return defHttp.post({ url: Api.Prefix + `/checkPwd`, data }); +} +// 获取外链列表表单配置JSON +export function getConfigData(modelId, encryption = '') { + return defHttp.get({ url: Api.Prefix + `/${modelId}/Config` + (encryption ? '?encryption=' + encryption : '') }); +} +// 获取外链数据列表 +export function getModelList(data) { + return defHttp.post({ url: Api.Prefix + `/${data.modelId}/ListLink` + (data.encryption ? '?encryption=' + data.encryption : ''), data }); +} +// 新建外链数据 +export function createModel(modelId, data, encryption = '') { + return defHttp.post({ url: Api.Prefix + `/${modelId}` + (encryption ? '?encryption=' + encryption : ''), data }); +} +// 获取外链数据详情 +export function getDataChange(modelId, id, encryption = '') { + return defHttp.get({ url: Api.Prefix + `/${modelId}/${id}/DataChange` + (encryption ? '?encryption=' + encryption : '') }); +} diff --git a/src/api/onlineDev/visualDev.ts b/src/api/onlineDev/visualDev.ts new file mode 100644 index 0000000..aeb4a81 --- /dev/null +++ b/src/api/onlineDev/visualDev.ts @@ -0,0 +1,177 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/visualdev/Base', + GenPrefix = '/api/visualdev/Generater', + OnlinePrefix = '/api/visualdev/OnlineDev', + LogPrefix = '/api/visualdev/OnlineLog', + PersonalPrefix = '/api/visualdev/personal', + AiPrefix = '/api/visualdev/ai/form', +} + +// 获取功能列表 +export function getVisualDevList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取功能列表(集成助手用) +export function getVisualDevFormList(data) { + return defHttp.get({ url: Api.Prefix + '/list', data }); +} +// 新建功能 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改功能 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取功能 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除功能 +export function delVisualDev(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制功能 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 发布 +export function release(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Release` }); +} +// 获取已发布菜单 +export function getReleaseMenu(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/getReleaseMenu` }); +} +// 生成菜单 +export function createMenu(id, data) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Module`, data }); +} +// 获取表单主表属性列表 +export function getFormDataFields(id, filterType = 0) { + return defHttp.get({ url: Api.Prefix + `/${id}/FormDataFields?filterType=${filterType}` }); +} +// 获取表单主表数据下拉框 +export function getFieldDataSelect(data) { + return defHttp.get({ url: Api.Prefix + `/${data.modelId}/FieldDataSelect`, data }); +} +// 获取表单主表数据下拉框--传输路径 +export function getByUrlDataSelect(data) { + console.log("data.modelId",data.modelId); + + return defHttp.post({ url: `${data.modelId}`, data }); +} +// 获取功能下拉框列表 +export function getVisualDevSelector(data) { + return defHttp.get({ url: Api.Prefix + `/Selector`, data }); +} +// 回滚模板 +export function rollbackTemplate(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/RollbackTemplate` }); +} + +// 代码下载 +export function downloadCode(id, data) { + return defHttp.post({ url: Api.GenPrefix + `/${id}/Actions/DownloadCode`, data }); +} +// 代码预览 +export function codePreview(id, data) { + return defHttp.post({ url: Api.GenPrefix + `/${id}/Actions/CodePreview`, data }); +} +// 获取代码生成命名规范 +export function getAliasInfo(id) { + return defHttp.get({ url: Api.GenPrefix + `/${id}/Alias/Info` }); +} +// 更新代码生成命名规范 +export function saveAlias(id, data) { + return defHttp.post({ url: Api.GenPrefix + `/${id}/Alias/Save`, data }); +} + +// 获取列表表单配置JSON +export function getConfigData(modelId, data = {}) { + return defHttp.get({ url: Api.OnlinePrefix + `/${modelId}/Config`, data }); +} +// 通过菜单id获取列表表单配置JSON +export function getConfigDataByMenuId(data = {}) { + return defHttp.get({ url: Api.OnlinePrefix + `/Config`, data }, { errorMessageMode: 'none' }); +} +// 获取表单配置JSON +export function getFormData(modelId) { + return defHttp.get({ url: Api.OnlinePrefix + `/${modelId}/FormData` }); +} +// 获取数据列表 +export function getModelList(data) { + return defHttp.post({ url: Api.OnlinePrefix + `/${data.modelId}/List`, data }); +} +// 新建数据 +export function createModel(modelId, data) { + return defHttp.post({ url: Api.OnlinePrefix + `/${modelId}`, data }); +} +// 修改数据 +export function updateModel(modelId, data) { + return defHttp.put({ url: Api.OnlinePrefix + `/${modelId}/${data.id}`, data }); +} +// 获取数据信息 +export function getModelInfo(modelId, id, menuId = '') { + return defHttp.get({ url: Api.OnlinePrefix + `/${modelId}/${id}`, data: { menuId } }); +} +// 获取修改记录列表 +export function getDataLogList(data) { + return defHttp.get({ url: Api.LogPrefix, data }); +} +// 删除数据 +export function delModel(modelId, id) { + return defHttp.delete({ url: Api.OnlinePrefix + `/${modelId}/${id}` }); +} +// 批量删除数据 +export function batchDelete(modelId, data) { + return defHttp.post({ url: Api.OnlinePrefix + `/batchDelete/${modelId}`, data }); +} +// 获取数据详情 +export function getDataChange(modelId, data) { + return defHttp.post({ url: Api.OnlinePrefix + `/${modelId}/DataChange`, data }); +} +// 导出数据 +export function exportModel(modelId, data) { + return defHttp.post({ url: Api.OnlinePrefix + `/${modelId}/Actions/ExportData`, data }); +} +// 下载模板 +export function getTemplate(modelId) { + return defHttp.get({ url: Api.OnlinePrefix + `/${modelId}/Template` }); +} +// 导出模板 +export function exportData(modelId) { + return defHttp.post({ url: Api.OnlinePrefix + `/${modelId}/Actions/Export` }); +} +// 自定义按钮发起流程 +export function launchFlow(modelId, data) { + return defHttp.post({ url: Api.OnlinePrefix + `/${modelId}/actionLaunchFlow`, data }); +} + +// 获取视图列表 +export function getViewList(data) { + return defHttp.get({ url: Api.PersonalPrefix, data }); +} +// 删除视图 +export function delView(id, menuId) { + return defHttp.delete({ url: Api.PersonalPrefix + `/${id}?menuId=${menuId}` }); +} +// 新建视图 +export function createView(data) { + return defHttp.post({ url: Api.PersonalPrefix, data }); +} +// 修改视图 +export function updateView(data) { + return defHttp.put({ url: Api.PersonalPrefix + '/' + data.id, data }); +} +// 设置默认视图 +export function setDefaultView(id, menuId) { + return defHttp.put({ url: Api.PersonalPrefix + `/${id}/setDefault?menuId=${menuId}` }); +} + +// 获取ai字段 +export function getAiInfo(data) { + return defHttp.post({ url: Api.AiPrefix, data }); +} diff --git a/src/api/permission/authorize.ts b/src/api/permission/authorize.ts new file mode 100644 index 0000000..d2a1443 --- /dev/null +++ b/src/api/permission/authorize.ts @@ -0,0 +1,42 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/Authority', +} + +// 获取岗位/角色/用户权限树形结构及数据 +export function getAuthorizeValues(objectId, data) { + return defHttp.post({ url: Api.Prefix + `/Data/${objectId}/Values`, data }); +} +// 更新岗位/角色/用户权限 +export function updateAuthorizeList(objectId, data) { + return defHttp.put({ url: Api.Prefix + `/Data/${objectId}`, data }); +} +// 批量设置权限 +export function updateBatchAuthorize(data) { + return defHttp.post({ url: Api.Prefix + `/Data/Batch`, data }); +} +// 获取功能权限数据 +export function getModelData(id, ObjectType) { + return defHttp.get({ url: Api.Prefix + `/Model/${id}/${ObjectType}` }); +} +// 设置/更新功能权限 +export function setModelData(id, data) { + return defHttp.put({ url: Api.Prefix + `/Model/${id}`, data }); +} +// 获取通用权限树形结构及数据(门户、流程、打印模板) +export function getCommonAuthorizeValues(type = 'Portal', objectId) { + return defHttp.get({ url: Api.Prefix + `/${type}/${objectId}` }); +} +// 更新通用权限 +export function updateCommonAuthorizeList(type, objectId, data) { + return defHttp.post({ url: Api.Prefix + `/${type}/${objectId}`, data }); +} +// 获取流程权限数据 +export function getFlowAuthorize(id) { + return defHttp.get({ url: Api.Prefix + `/GroupFlow/${id}` }); +} +// 更新流程权限 +export function updateFlowAuthorize(id, data) { + return defHttp.post({ url: Api.Prefix + `/GroupFlow/${id}`, data }); +} diff --git a/src/api/permission/gradeManage.ts b/src/api/permission/gradeManage.ts new file mode 100644 index 0000000..b791167 --- /dev/null +++ b/src/api/permission/gradeManage.ts @@ -0,0 +1,30 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/organizeAdminIsTrator', +} + +// 获取分级管理员列表 +export function getGradeManageList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取分级管理员下拉框列表 +export function getSelectorOrgList(userId) { + return defHttp.get({ url: Api.Prefix + `/Selector?userId=${userId}` }); +} +// 获取分级管理员下拉框列表(异步) +export function getSelectorAsyncOrgList(id = '0', userId) { + return defHttp.get({ url: Api.Prefix + `/SelectAsyncList/${id || '0'}?userId=${userId}` }); +} +// 获取分级管理(除了组织信息) +export function getInfo(userId) { + return defHttp.get({ url: Api.Prefix + `/organizeSelector?userId=${userId}` }); +} +// 新建分级管理员 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 删除分级管理员 +export function delGradeManage(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/permission/group.ts b/src/api/permission/group.ts new file mode 100644 index 0000000..1cc0877 --- /dev/null +++ b/src/api/permission/group.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/Group', +} + +// 获取分组列表 +export function getGroupList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取分组下拉框列表 +export function getGroupSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 新建分组 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改分组 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取分组 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除分组 +export function delGroup(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 获取选中角色基本信息 +export function getGroupByCondition(data) { + return defHttp.post({ url: Api.Prefix + `/GroupCondition`, data }); +} diff --git a/src/api/permission/onlineUser.ts b/src/api/permission/onlineUser.ts new file mode 100644 index 0000000..e0830d3 --- /dev/null +++ b/src/api/permission/onlineUser.ts @@ -0,0 +1,18 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/OnlineUser', +} + +// 获取在线用户列表 +export function getOnlineUser(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 批量强制下线 +export function batchDelOnlineUser(ids) { + return defHttp.delete({ url: Api.Prefix, data: { ids } }); +} +// 强制下线 +export function deleteOnlineUser(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} diff --git a/src/api/permission/organize.ts b/src/api/permission/organize.ts new file mode 100644 index 0000000..144d5f0 --- /dev/null +++ b/src/api/permission/organize.ts @@ -0,0 +1,107 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/Organize', + DepartmentPrefix = '/api/permission/Organize/Department', +} + +// 获取组织/公司列表 +export function getOrganizeList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取组织/公司列表异步 +export function getOrganizeSyncList(data) { + return defHttp.get({ url: Api.Prefix + `/AsyncList/${data.parentId}`, data }); +} +// 获取组织/公司下拉框列表 +export function getOrganizeSelector(id = '0') { + return defHttp.get({ url: Api.Prefix + `/Selector/${id || '0'}` }); +} +// 获取组织/公司下拉框列表异步 +export function getOrganizeSelectAsyncList(id = '0') { + return defHttp.get({ url: Api.Prefix + `/SelectAsyncList/${id || '0'}` }); +} +// 获取组织/公司下拉框列表(带权限) +export function getOrganizeSelectorByAuth(id = '0') { + return defHttp.get({ url: Api.Prefix + `/SelectorByAuth/${id || '0'}` }); +} +// 获取组织/公司下拉框列表(带权限)异步 +export function getOrganizeSelectorAsyncByAuth(id = '0', data) { + return defHttp.get({ url: Api.Prefix + `/SelectAsyncByAuth/${id || '0'}`, data }); +} +// 获取组织/公司树形 +export function getOrganizeTree() { + return defHttp.get({ url: Api.Prefix + `/Tree` }); +} +// 新建组织/公司 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改组织/公司 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取组织/公司 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除组织/公司 +export function delOrganize(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 获取选中组织、部门基本信息 +export function getSelectedList(ids) { + return defHttp.post({ url: Api.Prefix + `/SelectedList`, data: { ids } }); +} +// 通过部门id获取部门树形 +export function getOrgByOrganizeCondition(data) { + return defHttp.post({ url: Api.Prefix + `/OrganizeCondition`, data }); +} +// 导出组织Excel +export function exportExcel(data) { + return defHttp.get({ url: Api.Prefix + `/ExportData`, data }); +} +// 公司导入模板下载 +export function templateDownload() { + return defHttp.get({ url: Api.Prefix + `/TemplateDownload` }); +} +// 公司导入 +export function importData(data) { + return defHttp.post({ url: Api.Prefix + `/ImportData`, data }); +} +// 公司导入预览 +export function importPreview(data) { + return defHttp.get({ url: Api.Prefix + `/ImportPreview`, data }); +} +// 公司导出错误数据 +export function exportExceptionData(data) { + return defHttp.post({ url: Api.Prefix + `/ExportExceptionData`, data }); +} +// 获取部门下拉框列表(公司+部门) +export function getDepartmentSelector(id = '0') { + return defHttp.get({ url: Api.DepartmentPrefix + `/Selector/${id || '0'}` }); +} +// 获取部门下拉框列表(公司+部门)异步 +export function getDepartmentSelectAsyncList(id = '0', data = {}) { + return defHttp.get({ url: Api.DepartmentPrefix + `/SelectAsyncList/${id || '0'}`, data }); +} +// 获取部门下拉框列表(公司+部门) ---带权限 +export function getDepartmentSelectorByAuth(id = '0') { + return defHttp.get({ url: Api.DepartmentPrefix + `/SelectorByAuth/${id || '0'}` }); +} +// 获取部门下拉框列表(公司+部门) ---带权限异步 +export function getDepartmentSelectorAsyncByAuth(id = '0', data) { + return defHttp.get({ url: Api.DepartmentPrefix + `/SelectAsyncByAuth/${id || '0'}`, data }); +} +// 新建组织/公司 +export function createDepartment(data) { + return defHttp.post({ url: Api.DepartmentPrefix, data }); +} +// 修改部门 +export function updateDepartment(data) { + return defHttp.put({ url: Api.DepartmentPrefix + '/' + data.id, data }); +} +// 获取部门 +export function getDepartmentInfo(id) { + return defHttp.get({ url: Api.DepartmentPrefix + '/' + id }); +} diff --git a/src/api/permission/permissionGroup.ts b/src/api/permission/permissionGroup.ts new file mode 100644 index 0000000..54adb36 --- /dev/null +++ b/src/api/permission/permissionGroup.ts @@ -0,0 +1,50 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/PermissionGroup', +} + +//获取权限列表 +export function getList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取权限信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 删除权限 +export function del(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} +// 修改权限 +export function update(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}`, data }); +} +// 新建权限 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 复制权限 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +//获取权限成员 +export function getPermissionMember(id) { + return defHttp.get({ url: Api.Prefix + `/PermissionMember/${id}` }); +} +//保存权限成员 +export function savePermissionMember(data) { + return defHttp.post({ url: Api.Prefix + `/PermissionMember/${data.id}`, data }); +} +//获取权限组下拉 +export function getPermissionSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 查看权限组 +export function getPermissionGroup(data) { + return defHttp.get({ url: Api.Prefix + `/getPermissionGroup`, data }); +} +// 通过权限组id获取相关权限 +export function getPermissionInfo(data) { + return defHttp.get({ url: Api.Prefix + `/getPermission`, data }); +} diff --git a/src/api/permission/position.ts b/src/api/permission/position.ts new file mode 100644 index 0000000..b54e39c --- /dev/null +++ b/src/api/permission/position.ts @@ -0,0 +1,62 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/Position', +} + +// 获取岗位列表(分页) +export function getPositionList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取岗位下拉框列表(公司+部门+岗位) +export function getPositionSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 获取全部岗位管理信息列表 +export function getPositionListAll() { + return defHttp.get({ url: Api.Prefix + `/All` }); +} +// 新建岗位 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改岗位 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取岗位 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除岗位 +export function delPosition(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 通过组织id获取岗位列表 +export function getPositionByOrganize(organizeIds) { + return defHttp.post({ url: Api.Prefix + `/getListByOrgIds`, data: { organizeIds } }); +} +// 通过部门id,岗位id获取岗位树形 +export function getPositionByCondition(data) { + return defHttp.post({ url: Api.Prefix + `/PositionCondition`, data }); +} +// 导出岗位Excel +export function exportExcel(data) { + return defHttp.get({ url: Api.Prefix + `/ExportData`, data }); +} +// 岗位导入模板下载 +export function templateDownload() { + return defHttp.get({ url: Api.Prefix + `/TemplateDownload` }); +} +// 岗位导入 +export function importData(data) { + return defHttp.post({ url: Api.Prefix + `/ImportData`, data }); +} +// 岗位导入预览 +export function importPreview(data) { + return defHttp.get({ url: Api.Prefix + `/ImportPreview`, data }); +} +// 岗位导出错误数据 +export function exportExceptionData(data) { + return defHttp.post({ url: Api.Prefix + `/ExportExceptionData`, data }); +} diff --git a/src/api/permission/role.ts b/src/api/permission/role.ts new file mode 100644 index 0000000..0fc2c88 --- /dev/null +++ b/src/api/permission/role.ts @@ -0,0 +1,62 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/Role', +} + +// 获取角色列表 +export function getRoleList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取角色下拉框列表 +export function getRoleSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 获取角色下拉框列表(带权限) +export function getRoleSelectorByPermission() { + return defHttp.get({ url: Api.Prefix + `/SelectorByPermission` }); +} +// 新建角色 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改角色 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取角色 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除角色 +export function delRole(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 通过组织id获取角色列表 +export function getRoleByOrganize(organizeIds) { + return defHttp.post({ url: Api.Prefix + `/getListByOrgIds`, data: { organizeIds } }); +} +// 获取选中角色基本信息 +export function getRoleByCondition(data) { + return defHttp.post({ url: Api.Prefix + `/RoleCondition`, data }); +} +// 导出角色Excel +export function exportExcel(data) { + return defHttp.get({ url: Api.Prefix + `/ExportData`, data }); +} +// 角色导入模板下载 +export function templateDownload() { + return defHttp.get({ url: Api.Prefix + `/TemplateDownload` }); +} +// 角色导入 +export function importData(data) { + return defHttp.post({ url: Api.Prefix + `/ImportData`, data }); +} +// 角色导入预览 +export function importPreview(data) { + return defHttp.get({ url: Api.Prefix + `/ImportPreview`, data }); +} +// 角色导出错误数据 +export function exportExceptionData(data) { + return defHttp.post({ url: Api.Prefix + `/ExportExceptionData`, data }); +} diff --git a/src/api/permission/socialsUser.ts b/src/api/permission/socialsUser.ts new file mode 100644 index 0000000..02580ae --- /dev/null +++ b/src/api/permission/socialsUser.ts @@ -0,0 +1,26 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/socials', +} + +// 获取用户授权列表 +export function getSocialsLoginList(data) { + return defHttp.get({ url: Api.Prefix + `/login`, data }); +} +// 获取用户授权列表 +export function getSocialsUserList() { + return defHttp.get({ url: Api.Prefix }); +} +// 获取用户授权列表(用户管理) +export function getSocialsUserListByUser(userId) { + return defHttp.get({ url: Api.Prefix + `?userId=${userId}` }); +} +// 第三方绑定 +export function socialsBind(name) { + return defHttp.get({ url: Api.Prefix + `/render/${name}` }); +} +// 解绑 +export function deleteSocials(userId, id) { + return defHttp.delete({ url: Api.Prefix + `/${id}?userId=${userId}` }); +} diff --git a/src/api/permission/user.ts b/src/api/permission/user.ts new file mode 100644 index 0000000..5b9b36a --- /dev/null +++ b/src/api/permission/user.ts @@ -0,0 +1,127 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/Users', +} + +// 获取用户列表 +export function getUserList(params) { + return defHttp.get({ url: Api.Prefix, params }); +} +// 获取所有用户列表 +export function getUserListAll() { + return defHttp.get({ url: Api.Prefix + '/All' }); +} +// 获取用户下拉框列表(公司+部门+用户) +export function getUserSelector() { + return defHttp.get({ url: Api.Prefix + '/Selector' }); +} +// 新建用户 +export function createUser(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改用户 +export function updateUser(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取用户信息 +export function getUserInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除用户 +export function delUser(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 修改用户密码 +export function resetUserPassword(data) { + return defHttp.post({ url: Api.Prefix + `/${data.id}/Actions/ResetPassword`, data }); +} +// 更新用户状态 +export function updateUserState(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/Actions/State` }); +} +// 解除锁定 +export function unlockUser(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/Actions/unlock` }); +} +// IM通讯获取用户 +export function getImUser(data) { + return defHttp.get({ url: Api.Prefix + '/ImUser', data }); +} +// 获取用户下拉框列表 +export function getImUserSelector(organizeId, data = {}) { + return defHttp.post({ url: Api.Prefix + `/ImUser/Selector/${organizeId}`, data }); +} +// 获取用户基本信息 +export function getUserInfoList(ids) { + return defHttp.post({ url: Api.Prefix + `/getUserList`, data: { ids } }); +} +// 获取我的下属 +export function getSubordinates(keyword) { + const data = { keyword }; + return defHttp.post({ url: Api.Prefix + `/getSubordinates`, data }); +} +// 获取当前组织用户 +export function getOrganization(data) { + return defHttp.get({ url: Api.Prefix + `/getOrganization`, data }); +} +// 通过岗位id获取用户树 +export function getUsersByPositionId(data) { + return defHttp.get({ url: Api.Prefix + `/GetUsersByPositionId`, data }); +} +// 通过角色id获取用户列表 +export function getUsersByRoleId(data) { + return defHttp.get({ url: Api.Prefix + `/getUsersByRoleId`, data }); +} +// 通过角色id获取组织下的用户列表 +export function getUsersByRoleOrgId(data) { + return defHttp.get({ url: Api.Prefix + `/GetUsersByRoleOrgId`, data }); +} +// 通过部门id,岗位id,角色id,分组id,用户id获取用户列表(带分页) +export function getUsersByUserCondition(data) { + return defHttp.post({ url: Api.Prefix + `/UserCondition`, data }); +} +// 导出用户Excel +export function exportExcel(data) { + return defHttp.get({ url: Api.Prefix + `/ExportData`, data }); +} +// 用户导入模板下载 +export function templateDownload() { + return defHttp.get({ url: Api.Prefix + `/TemplateDownload` }); +} +// 导入 +export function importData(data) { + return defHttp.post({ url: Api.Prefix + `/ImportData`, data }); +} +// 导入预览 +export function importPreview(data) { + return defHttp.get({ url: Api.Prefix + `/ImportPreview`, data }); +} +// 导出错误数据 +export function exportExceptionData(data) { + return defHttp.post({ url: Api.Prefix + `/ExportExceptionData`, data }); +} +// 获取用户下拉框列表 +export function getListByAuthorize(organizeId, keyword) { + return defHttp.post({ url: Api.Prefix + `/GetListByAuthorize/${organizeId}`, data: { keyword } }); +} +// 获取选中组织、岗位、角色、用户基本信息 +export function getSelectedList(ids) { + return defHttp.post({ url: Api.Prefix + `/getSelectedList`, data: { ids } }); +} +// 获取选中组织、岗位、角色、用户基本信息 +export function getSelectedUserList(data) { + return defHttp.post({ url: Api.Prefix + `/getSelectedUserList`, data }); +} +// 获取离职交接数据 +export function getWorkByUser(data) { + return defHttp.get({ url: Api.Prefix + `/getWorkByUser`, data }); +} +// 工作交接 +export function workHandover(data) { + return defHttp.post({ url: Api.Prefix + `/workHandover`, data }); +} +// 获取用户列表(同一部门、同一岗位、同一公司) +export function getReceiveUserList(data) { + return defHttp.get({ url: Api.Prefix + `/ReceiveUserList`, data }); +} diff --git a/src/api/permission/userRelation.ts b/src/api/permission/userRelation.ts new file mode 100644 index 0000000..c04f839 --- /dev/null +++ b/src/api/permission/userRelation.ts @@ -0,0 +1,14 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/UserRelation', +} + +// 获取岗位/角色成员列表 +export function getUserRelationList(objectId) { + return defHttp.get({ url: Api.Prefix + `/${objectId}` }); +} +// 添加/更新岗位或角色成员 +export function createUserRelation(data) { + return defHttp.post({ url: Api.Prefix + `/${data.objectId}`, data }); +} diff --git a/src/api/permission/userSetting.ts b/src/api/permission/userSetting.ts new file mode 100644 index 0000000..8e5a32c --- /dev/null +++ b/src/api/permission/userSetting.ts @@ -0,0 +1,74 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/permission/Users/Current', +} + +// 更新当前用户头像 +export function updateAvatar(name) { + return defHttp.put({ url: Api.Prefix + `/Avatar/${name}` }); +} +// 获取当前用户个人资料 +export function getUserSettingInfo() { + return defHttp.get({ url: Api.Prefix + `/BaseInfo` }); +} +// 更新当前用户个人资料 +export function updateUserInfo(data) { + return defHttp.put({ url: Api.Prefix + `/BaseInfo`, data }); +} +// 修改当前用户密码 +export function updatePassword(data) { + return defHttp.post({ url: Api.Prefix + `/Actions/ModifyPassword`, data }); +} +// 更新当前用户系统主题 +export function updateTheme(data) { + return defHttp.put({ url: Api.Prefix + `/SystemTheme`, data }); +} +// 更新当前用户系统语言 +export function updateLanguage(data) { + return defHttp.put({ url: Api.Prefix + `/SystemLanguage`, data }); +} +// 获取我的下属 +export function getSubordinate(id = '0') { + return defHttp.get({ url: Api.Prefix + `/Subordinate/${id}` }); +} +// 获取当前用户系统权限 +export function getAuthorizeList() { + return defHttp.get({ url: Api.Prefix + `/Authorize` }); +} +// 获取系统日志 +export function getLogList(data) { + return defHttp.get({ url: Api.Prefix + `/SystemLog`, data }); +} +// 获取当前用户所有组织 +export function getUserOrganizes() { + return defHttp.get({ url: Api.Prefix + `/getUserOrganizes` }); +} +// 获取当前用户所有岗位 +export function getUserPositions() { + return defHttp.get({ url: Api.Prefix + `/getUserPositions` }); +} +// 获取当前用户所有角色 +export function getUserRoles(data) { + return defHttp.get({ url: Api.Prefix + `/getUserRoles`, data }); +} +// 设置主要组织、主要岗位、切换系统 +export function setMajor(data) { + return defHttp.put({ url: Api.Prefix + `/major`, data }); +} +// 获取系统日志 +export function getSignList() { + return defHttp.get({ url: Api.Prefix + `/SignImg` }); +} +// 新建个性签名 +export function createSign(data) { + return defHttp.post({ url: Api.Prefix + `/SignImg`, data }); +} +// 删除个性签名 +export function deleteSign(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}/SignImg` }); +} +// 设置默认签名 +export function updateDefaultSign(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/SignImg` }); +} diff --git a/src/api/system/advancedQuery.ts b/src/api/system/advancedQuery.ts new file mode 100644 index 0000000..123e63f --- /dev/null +++ b/src/api/system/advancedQuery.ts @@ -0,0 +1,26 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/AdvancedQuery', +} + +// 获取方案列表 +export function getAdvancedQueryList(moduleId) { + return defHttp.get({ url: Api.Prefix + `/${moduleId}/List` }); +} +// 新建方案 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改方案 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取方案 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除方案 +export function delAdvancedQuery(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/system/aiChat.ts b/src/api/system/aiChat.ts new file mode 100644 index 0000000..30c1936 --- /dev/null +++ b/src/api/system/aiChat.ts @@ -0,0 +1,26 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/Aichat', +} + +// ai发送对话 +export function send(data) { + return defHttp.post({ url: Api.Prefix + '/send', data }); +} +//ai会话列表 +export function historyList() { + return defHttp.get({ url: Api.Prefix + '/history/list' }); +} +//ai会话记录 +export function historyGet(id) { + return defHttp.get({ url: Api.Prefix + `/history/get/${id}` }); +} +//保存历史记录 +export function historySave(data) { + return defHttp.post({ url: Api.Prefix + `/history/save`, data }); +} +//删除历史记录 +export function historyDelete(id) { + return defHttp.delete({ url: Api.Prefix + `/history/delete/${id}` }); +} diff --git a/src/api/system/area.ts b/src/api/system/area.ts new file mode 100644 index 0000000..96691c1 --- /dev/null +++ b/src/api/system/area.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/Area', +} + +// 获取行政区划列表 +export function getAreaList(data) { + return defHttp.get({ url: Api.Prefix + `/${data.nodeId}`, data }); +} +// 获取行政区划下拉框列表 +export function getAreaSelector(id, currId = '0') { + return defHttp.get({ url: Api.Prefix + `/${id}/Selector/${currId}` }); +} +// 获取行政区划数据详情 +export function getAreaByIds(idsList) { + return defHttp.post({ url: Api.Prefix + `/GetAreaByIds`, data: { idsList } }); +} +// 新建行政区划 +export function createArea(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改行政区划 +export function updateArea(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取行政区划 +export function getAreaInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Info` }); +} +// 删除行政区划 +export function delArea(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/system/authorize.ts b/src/api/system/authorize.ts new file mode 100644 index 0000000..572a9ff --- /dev/null +++ b/src/api/system/authorize.ts @@ -0,0 +1,22 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/ModuleDataAuthorizeLink', +} + +//获取表名 +export function getVisualTables(menuId, type) { + return defHttp.get({ url: Api.Prefix + '/getVisualTables/' + menuId + '/' + type }); +} +//据表名获取数据表字段 +export function getTableInfoByTableName(data) { + return defHttp.get({ url: Api.Prefix + `/${data.linkId}/Tables/${data.tableName}/Fields/${data.menuType}/${data.dataType}`, data }); +} +//保存编辑数据连接 +export function update(data) { + return defHttp.post({ url: Api.Prefix + '/saveLinkData', data }); +} +//数据连接信息 +export function getInfo(menuId, type) { + return defHttp.get({ url: Api.Prefix + '/getInfo/' + menuId + '/' + type }); +} diff --git a/src/api/system/baseLang.ts b/src/api/system/baseLang.ts new file mode 100644 index 0000000..7d7f157 --- /dev/null +++ b/src/api/system/baseLang.ts @@ -0,0 +1,38 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/BaseLang', +} + +// 获取语言列表 +export function getBaseLangList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建语言 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改语言 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取语言 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除语言 +export function delBaseLang(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 获取语言内容 +export function getLangJson() { + return defHttp.get({ url: Api.Prefix + '/LangJson' }); +} +// 导入模板下载 +export function templateDownload() { + return defHttp.get({ url: Api.Prefix + `/TemplateDownload` }); +} +// 导入数据 +export function importData(data) { + return defHttp.post({ url: Api.Prefix + `/ImportData`, data }); +} diff --git a/src/api/system/billRule.ts b/src/api/system/billRule.ts new file mode 100644 index 0000000..fe68083 --- /dev/null +++ b/src/api/system/billRule.ts @@ -0,0 +1,38 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/BillRule', +} + +// 获取单据规则列表(带分页) +export function getBillRuleList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取单据规则下拉框列表 +export function getBillRuleSelector(data) { + return defHttp.get({ url: Api.Prefix + `/Selector`, data }); +} +// 新建单据规则 +export function createBillRule(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改单据规则 +export function updateBillRule(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取单据规则 +export function getBillRuleInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除单据规则 +export function delBillRule(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 生成单据单号 +export function getBillNumber(enCode) { + return defHttp.get({ url: Api.Prefix + `/BillNumber/${enCode}` }); +} +// 导出 +export function exportTpl(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} diff --git a/src/api/system/buttonAuthorize.ts b/src/api/system/buttonAuthorize.ts new file mode 100644 index 0000000..3a7c057 --- /dev/null +++ b/src/api/system/buttonAuthorize.ts @@ -0,0 +1,30 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/ModuleButton', +} + +// 获取按钮权限列表 +export function getButtonAuthorizeList(data) { + return defHttp.get({ url: Api.Prefix + '/' + data.id + '/List', data }); +} +// 获取按钮权限下拉列表 +export function getButtonAuthorizeSelector(id) { + return defHttp.get({ url: Api.Prefix + '/' + id + '/Selector' }); +} +// 添加按钮 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 更新按钮 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取按钮信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除按钮 +export function del(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/system/cache.ts b/src/api/system/cache.ts new file mode 100644 index 0000000..d05fdeb --- /dev/null +++ b/src/api/system/cache.ts @@ -0,0 +1,22 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/CacheManage', +} + +// 获取缓存列表 +export function getCacheList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取缓存详情 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除缓存 +export function delCache(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 删除全部缓存 +export function delAllCache() { + return defHttp.post({ url: Api.Prefix + '/Actions/ClearAll' }); +} diff --git a/src/api/system/columnAuthorize.ts b/src/api/system/columnAuthorize.ts new file mode 100644 index 0000000..434e725 --- /dev/null +++ b/src/api/system/columnAuthorize.ts @@ -0,0 +1,30 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/ModuleColumn', +} + +// 获取列表权限列表 +export function getColumnAuthorizeList(data) { + return defHttp.get({ url: Api.Prefix + '/' + data.id + '/Fields', data }); +} +// 添加字段 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 批量添加字段 +export function batchCreate(data) { + return defHttp.post({ url: Api.Prefix + '/Actions/Batch', data }); +} +// 更新字段 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取字段信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除字段 +export function del(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/system/commonMenu.ts b/src/api/system/commonMenu.ts new file mode 100644 index 0000000..e7c2f84 --- /dev/null +++ b/src/api/system/commonMenu.ts @@ -0,0 +1,18 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/MenuData', +} + +// 获取常用菜单列表 +export function getCommonMenuList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 设为常用菜单 +export function create(id) { + return defHttp.post({ url: Api.Prefix + '/' + id }); +} +// 删除常用菜单 +export function delCommonMenu(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/system/commonWords.ts b/src/api/system/commonWords.ts new file mode 100644 index 0000000..f64a6b3 --- /dev/null +++ b/src/api/system/commonWords.ts @@ -0,0 +1,30 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/CommonWords', +} + +// 获取审批常用语列表(带分页) +export function getCommonWordsList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取审批常用语下拉框列表 +export function getCommonWordsSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 新建审批常用语 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改审批常用语 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取审批常用语 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除审批常用语 +export function delCommonWords(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/system/dataAuthorize.ts b/src/api/system/dataAuthorize.ts new file mode 100644 index 0000000..5a68fd9 --- /dev/null +++ b/src/api/system/dataAuthorize.ts @@ -0,0 +1,47 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/ModuleDataAuthorizeScheme', + FieldPrefix = '/api/system/ModuleDataAuthorize', +} + +// 获取方案管理列表 +export function getDataAuthorizeSchemeList(data) { + return defHttp.get({ url: Api.Prefix + `/${data.moduleId}/List` }); +} +// 新建方案 +export function createScheme(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 更新方案 +export function updateScheme(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}`, data }); +} +// 获取方案 +export function getSchemeInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 删除方案 +export function delScheme(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} +// 获取字段列表 +export function getDataAuthorizeList(data) { + return defHttp.get({ url: Api.FieldPrefix + `/${data.moduleId}/List` }); +} +// 新建字段 +export function createField(data) { + return defHttp.post({ url: Api.FieldPrefix, data }); +} +// 更新字段 +export function updateField(data) { + return defHttp.put({ url: Api.FieldPrefix + `/${data.id}`, data }); +} +// 获取字段 +export function getFieldInfo(id) { + return defHttp.get({ url: Api.FieldPrefix + `/${id}` }); +} +// 删除字段 +export function delField(id) { + return defHttp.delete({ url: Api.FieldPrefix + `/${id}` }); +} diff --git a/src/api/system/dataSet.ts b/src/api/system/dataSet.ts new file mode 100644 index 0000000..9b474ae --- /dev/null +++ b/src/api/system/dataSet.ts @@ -0,0 +1,14 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/DataSet', +} + +// 根据数据集配置获取字段列表 +export function getFields(data) { + return defHttp.post({ url: Api.Prefix + '/fields', data }); +} +// 根据数据集配置获取预览数据 +export function getPreviewData(data) { + return defHttp.post({ url: Api.Prefix + '/getPreviewData', data }); +} diff --git a/src/api/system/formAuthorize.ts b/src/api/system/formAuthorize.ts new file mode 100644 index 0000000..dcb218a --- /dev/null +++ b/src/api/system/formAuthorize.ts @@ -0,0 +1,30 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/ModuleForm', +} + +// 获取列表权限列表 +export function getFormAuthorizeList(data) { + return defHttp.get({ url: Api.Prefix + '/' + data.id + '/Fields', data }); +} +// 添加字段 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 批量添加字段 +export function batchCreate(data) { + return defHttp.post({ url: Api.Prefix + '/Actions/Batch', data }); +} +// 更新字段 +export function update(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}`, data }); +} +// 获取字段信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 删除字段 +export function del(id) { + return defHttp.delete({ url: Api.Prefix + `/${id}` }); +} diff --git a/src/api/system/kit.ts b/src/api/system/kit.ts new file mode 100644 index 0000000..a6e6081 --- /dev/null +++ b/src/api/system/kit.ts @@ -0,0 +1,38 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/Kit', +} + +// 获取模板列表(带分页) +export function getKitList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取模板下拉框列表 +export function getKitSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 新建模板 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改模板 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取模板 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除模板 +export function delKit(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制模板 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 导出 +export function exportTpl(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} diff --git a/src/api/system/log.ts b/src/api/system/log.ts new file mode 100644 index 0000000..55da701 --- /dev/null +++ b/src/api/system/log.ts @@ -0,0 +1,26 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/Log', +} + +// 获取系统日志信息 +export function getLogList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 删除或批量删除日志 +export function delLog(data) { + return defHttp.delete({ url: Api.Prefix, data }); +} +// 一键清空 +export function batchDelLog(type) { + return defHttp.delete({ url: Api.Prefix + '/' + type }); +} +// 获取详情 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 个人信息日志一键清空 +export function batchDelLoginLog() { + return defHttp.delete({ url: Api.Prefix + '/deleteLoginLog' }); +} diff --git a/src/api/system/menu.ts b/src/api/system/menu.ts new file mode 100644 index 0000000..4a9ce7c --- /dev/null +++ b/src/api/system/menu.ts @@ -0,0 +1,58 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/Menu', +} + +// 获取菜单列表 +export function getMenuList(data) { + return defHttp.get({ url: Api.Prefix + `/ModuleBySystem/${data.systemId}`, data }); +} +// 获取上级菜单下拉框 +export function getMenuSelector(data, id, systemId = '0') { + return defHttp.get({ url: Api.Prefix + `/Selector/${(!!id ? id : '0') + '/' + systemId}`, data }); +} +// 获取菜单列表(下拉框) +export function getSelectorAll(data) { + return defHttp.get({ url: Api.Prefix + `/Selector/All`, data }); +} +// 新建菜单 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改菜单 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取菜单详情 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除菜单 +export function delMenu(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 导出系统菜单数据 +export function exportMenu(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 查看权限组 +export function getMenuPermissionGroup(data) { + return defHttp.get({ url: Api.Prefix + `/getPermissionGroup/${data.id}` }); +} +// 通过权限组id获取相关权限 +export function getMenuPermissionInfo(data) { + return defHttp.get({ url: Api.Prefix + `/getPermission/${data.id}/${data.permissionId}` }); +} +// 获取上级菜单下拉框(发布过滤) +export function getMenuSelectorFilter(data, id) { + return defHttp.get({ url: Api.Prefix + `/SelectorFilter/${!!id ? id : '0'}`, data }); +} +// 获取菜单表单 +export function getMenuSelectorForm(data) { + return defHttp.get({ url: Api.Prefix + `/Selector/Form`, data }); +} +// 获取菜单表单 +export function getMenuSelectorFormTree() { + return defHttp.get({ url: Api.Prefix + `/getSystemMenu` }); +} diff --git a/src/api/system/message.ts b/src/api/system/message.ts new file mode 100644 index 0000000..63c31c1 --- /dev/null +++ b/src/api/system/message.ts @@ -0,0 +1,61 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/message', + NoticePrefix = '/api/message/Notice', +} + +// 获取系统公告列表 +export function getNoticeList(data) { + return defHttp.post({ url: Api.NoticePrefix + '/List', data }); +} +// 新建公告 +export function create(data) { + return defHttp.post({ url: Api.NoticePrefix, data }); +} +// 修改公告 +export function update(data) { + return defHttp.put({ url: Api.NoticePrefix + '/' + data.id, data }); +} +// 获取公告详情 +export function getInfo(id) { + return defHttp.get({ url: Api.NoticePrefix + '/' + id }); +} +// 删除公告 +export function delNotice(id) { + return defHttp.delete({ url: Api.NoticePrefix + '/' + id }); +} +// 发布公告 +export function release(id) { + return defHttp.put({ url: Api.NoticePrefix + `/${id}/Actions/Release` }); +} + +// 获取消息中心列表 +export function getMessageList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 全部已读 +export function readAllMsg(data) { + return defHttp.post({ url: Api.Prefix + `/Actions/ReadAll`, data }); +} +// 查看消息内容 +export function readInfo(id) { + return defHttp.get({ url: Api.Prefix + `/ReadInfo/${id}` }); +} +// 删除消息 +export function delMsgRecord(data) { + return defHttp.delete({ url: Api.Prefix + '/Record', data }); +} + +// 获取IM对话列表 +export function getIMReply() { + return defHttp.get({ url: Api.Prefix + '/imreply' }); +} +// 删除聊天记录 +export function deleteChatRecord(id) { + return defHttp.delete({ url: Api.Prefix + `/imreply/deleteChatRecord/${id}` }); +} +// 移除聊天记录 +export function removeChatRecord(id) { + return defHttp.delete({ url: Api.Prefix + `/imreply/relocation/${id}` }); +} diff --git a/src/api/system/monitor.ts b/src/api/system/monitor.ts new file mode 100644 index 0000000..d3ec1b9 --- /dev/null +++ b/src/api/system/monitor.ts @@ -0,0 +1,10 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/Monitor', +} + +// 获取系统监控 +export function getSysMonitor() { + return defHttp.get({ url: Api.Prefix }); +} diff --git a/src/api/system/printDev.ts b/src/api/system/printDev.ts new file mode 100644 index 0000000..7b2052d --- /dev/null +++ b/src/api/system/printDev.ts @@ -0,0 +1,74 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/printDev', +} + +// 获取打印模板列表(分页) +export function getPrintDevList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取打印模板列表下拉框 +export function getPrintDevSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 获取打印模板业务列表 +export function getPrintWorkSelector(data) { + return defHttp.get({ url: Api.Prefix + `/WorkSelector`, data }); +} +// 获取打印模板列表下拉框 +export function getPrintDevByIds(data) { + return defHttp.post({ url: Api.Prefix + `/getListOptions`, data }); +} +// 新建打印模板 +export function createPrintDev(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改打印模板 +export function updatePrintDev(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取打印模板 +export function getPrintDevInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除打印模板 +export function delPrintDev(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制打印模板 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 导出数据打印模板数据 +export function exportData(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 获取打印预览 +export function getPreviewInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Preview` }); +} +// 批量打印获取数据和打印模板 +export function getBatchData(data) { + return defHttp.post({ url: Api.Prefix + `/BatchData`, data }); +} +// 修改打印设计 +export function saveVersion(data) { + return defHttp.post({ url: Api.Prefix + '/Save', data }); +} +// 获取打印设计详情 +export function getVersionInfo(id) { + return defHttp.get({ url: Api.Prefix + '/Info/' + id }); +} +// 获取打印版本 +export function getVersionList(id) { + return defHttp.get({ url: Api.Prefix + '/Version/' + id }); +} +// 删除打印版本 +export function delVersion(id) { + return defHttp.delete({ url: Api.Prefix + '/Info/' + id }); +} +// 新增打印版本 +export function copyVersion(id) { + return defHttp.post({ url: Api.Prefix + `/Info/${id}` }); +} diff --git a/src/api/system/signature.ts b/src/api/system/signature.ts new file mode 100644 index 0000000..7476109 --- /dev/null +++ b/src/api/system/signature.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/Signature', +} + +// 获取签章列表(带分页) +export function getSignatureList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取签章下拉框列表 +export function getSignatureSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 新建签章 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改签章 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取签章 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除签章 +export function delSignature(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 通过id获取签章下拉框列表 +export function getListByIds(ids) { + return defHttp.post({ url: Api.Prefix + `/ListByIds`, data: { ids } }); +} diff --git a/src/api/system/sysConfig.ts b/src/api/system/sysConfig.ts new file mode 100644 index 0000000..7bdeda2 --- /dev/null +++ b/src/api/system/sysConfig.ts @@ -0,0 +1,52 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/SysConfig', + SynPrefix = '/api/system/SynThirdInfo', +} + +// 获取系统配置 +export function getSysConfig() { + return defHttp.get({ url: Api.Prefix }); +} +// 更新系统配置 +export function update(data) { + return defHttp.put({ url: Api.Prefix, data }); +} +// 测试企业微信配置的连接 +export function testQy(data, type) { + return defHttp.post({ url: Api.Prefix + '/' + type + '/testQyWebChatConnect', data }); +} +// 测试企业微信配置的连接 +export function testDing(data) { + return defHttp.post({ url: Api.Prefix + '/testDingTalkConnect', data }); +} +// 获取系统管理员 +export function getAdminList() { + return defHttp.get({ url: Api.Prefix + '/getAdminList' }); +} +// 设置系统管理员 +export function setAdminList(data) { + return defHttp.put({ url: Api.Prefix + '/setAdminList', data }); +} +//本地所有组织信息(包含公司和部门)同步到钉钉 +export function synAllOrganizeSysToDing(type) { + return defHttp.get({ url: Api.SynPrefix + '/synAllOrganizeSysToDing?type=' + type }); +} +// 本地所有用户信息同步到钉钉 +export function synAllUserSysToDing(type) { + return defHttp.get({ url: Api.SynPrefix + '/synAllUserSysToDing?type=' + type }); +} +// 本地所有组织信息(包含公司和部门)同步到企业微信 +export function synAllOrganizeSysToQy(type) { + return defHttp.get({ url: Api.SynPrefix + '/synAllOrganizeSysToQy?type=' + type }); +} +// 本地所有用户信息同步到企业微信 +export function synAllUserSysToQy(type) { + return defHttp.get({ url: Api.SynPrefix + '/synAllUserSysToQy?type=' + type }); +} +// 获取第三方(如:企业微信、钉钉)的组织与用户同步统计信息 +// thirdType: 1-企业微信; 2-钉钉 +export function getSynData(type) { + return defHttp.get({ url: Api.SynPrefix + '/getSynThirdTotal/' + type }); +} diff --git a/src/api/system/system.ts b/src/api/system/system.ts new file mode 100644 index 0000000..231fa9b --- /dev/null +++ b/src/api/system/system.ts @@ -0,0 +1,26 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/System', +} + +// 获取应用列表 +export function getSystemList(data?) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建应用 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改应用 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取应用 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除应用 +export function delSystem(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/system/task.ts b/src/api/system/task.ts new file mode 100644 index 0000000..bd1fb82 --- /dev/null +++ b/src/api/system/task.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/scheduletask', +} + +// 获取任务调度列表 +export function getTaskList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建任务调度 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改任务调度 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取任务调度信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/Info/' + id }); +} +// 删除任务调度 +export function delTask(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 获取任务调度日志列表 +export function getTaskLogList(data) { + return defHttp.get({ url: Api.Prefix + '/' + data.id + '/TaskLog', data }); +} +// 获取本地任务下拉列表 +export function getTaskMethodsList() { + return defHttp.get({ url: Api.Prefix + '/TaskMethods' }); +} diff --git a/src/api/systemData/commonFields.ts b/src/api/systemData/commonFields.ts new file mode 100644 index 0000000..928f52f --- /dev/null +++ b/src/api/systemData/commonFields.ts @@ -0,0 +1,26 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/CommonFields', +} + +// 获取字段列表 +export function getCommonFieldsList(data = {}) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建字段 +export function createCommonFields(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改字段 +export function updateCommonFields(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取字段 +export function getCommonFieldsInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除字段 +export function delCommonFields(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} diff --git a/src/api/systemData/dataInterface.ts b/src/api/systemData/dataInterface.ts new file mode 100644 index 0000000..2ab39d9 --- /dev/null +++ b/src/api/systemData/dataInterface.ts @@ -0,0 +1,66 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/DataInterface', +} + +// 获取接口列表(分页) +export function getDataInterfaceList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取接口列表下拉框 +export function getDataInterfaceSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} +// 新建接口 +export function createDataInterface(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改接口 +export function updateDataInterface(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取接口 +export function getDataInterfaceInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除接口 +export function delDataInterface(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 获取接口数据 +export function getDataInterfaceRes(id, data = {}) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Preview`, data }); +} +// 获取数据接口参数 +export function getDataInterfaceParam(id) { + return defHttp.get({ url: Api.Prefix + `/GetParam/${id}` }); +} +// 导出数据接口数据 +export function exportData(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 获取数据接口调用日志列表 +export function getDataInterfaceLog(id, data) { + return defHttp.get({ url: Api.Prefix + `Log/${id}`, data }); +} +// 获取接口列表数据 +export function getDataInterfaceDataSelect(data) { + return defHttp.post({ url: Api.Prefix + `/${data.interfaceId}/Actions/List`, data }); +} +// 获取多条接口详情数据 +export function getDataInterfaceDataInfoByIds(id, data) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/InfoByIds`, data }); +} +// 获取接口列表(工作流选择时调用,带分页) +export function getDataInterfaceSelectorList(data) { + return defHttp.get({ url: Api.Prefix + `/getList`, data }); +} +// 获取接口字段 +export function getDataInterfaceFields(id, data) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/GetFields`, data }); +} +// 复制接口数据 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} diff --git a/src/api/systemData/dataModel.ts b/src/api/systemData/dataModel.ts new file mode 100644 index 0000000..3db850a --- /dev/null +++ b/src/api/systemData/dataModel.ts @@ -0,0 +1,47 @@ +import { defHttp } from '@/utils/http/axios'; +import { omit } from 'lodash-es'; + +enum Api { + Prefix = '/api/system/DataModel', +} + +// 获取数据库表列表 +export function getDataModelList(data) { + return defHttp.get({ url: Api.Prefix + `/${data.linkId}/Tables`, data: omit(data, ['linkId']) }); +} +// 获取数据库表列表+视图 +export function getDataModelListAll(data) { + return defHttp.get({ url: Api.Prefix + `/${data.linkId}/TableAll`, data: omit(data, ['linkId']) }); +} +// 预览数据库表 +export function previewDataModel(data) { + return defHttp.get({ url: Api.Prefix + `/${data.linkId}/Table/${data.table}/Preview`, data: omit(data, ['linkId', 'table']) }); +} +// 新建数据库表 +export function createDataModel(linkId, data) { + return defHttp.post({ url: Api.Prefix + `/${linkId}/Table`, data }); +} +// 修改数据库表 +export function updateDataModel(linkId, data) { + return defHttp.put({ url: Api.Prefix + `/${linkId}/Table`, data }); +} +// 获取数据库表 +export function getDataModelInfo(linkId, table) { + return defHttp.get({ url: Api.Prefix + `/${linkId}/Table/${table}` }); +} +// 删除数据库表 +export function delDataModel(linkId, table) { + return defHttp.delete({ url: Api.Prefix + `/${linkId}/Table/${table}` }); +} +// 获取数据库表 +export function getDataModelFieldList(linkId, table, type = '0') { + return defHttp.get({ url: Api.Prefix + `/${linkId}/Tables/${table}/Fields?type=${type}` }); +} +// 新增字段 +export function addTableFields(linkId, data) { + return defHttp.put({ url: Api.Prefix + `/${linkId}/addFields`, data }); +} +// 导出数据库表 +export function exportTable(linkId, table) { + return defHttp.get({ url: Api.Prefix + `/${linkId}/Table/${table}/Actions/Export` }); +} diff --git a/src/api/systemData/dataSource.ts b/src/api/systemData/dataSource.ts new file mode 100644 index 0000000..129323f --- /dev/null +++ b/src/api/systemData/dataSource.ts @@ -0,0 +1,52 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/DataSource', + SyncPrefix = '/api/system/DataSync', +} + +// 获取数据连接列表 +export function getDataSourceList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取数据连接下拉框列表 +export function getDataSourceSelector(type = '') { + const data = type ? { type } : {}; + return defHttp.get({ url: Api.Prefix + `/Selector`, data }); +} +// 新建数据连接 +export function createDataSource(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改数据连接 +export function updateDataSource(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取数据连接 +export function getDataSourceInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除数据连接 +export function delDataSource(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 测试数据连接 +export function testDbConnection(data) { + return defHttp.post({ url: Api.Prefix + '/Actions/Test', data }); +} +// 同步校验 +export function dataSync(data) { + return defHttp.post({ url: Api.SyncPrefix, data }); +} +// 同步数据 +export function execute(data) { + return defHttp.post({ url: Api.SyncPrefix + '/Actions/Execute', data }); +} +// 批量同步数据 +export function batchExecute(data) { + return defHttp.post({ url: Api.SyncPrefix + '/Actions/batchExecute', data }); +} +// 校验数据库连接 +export function checkDbLink(data) { + return defHttp.post({ url: Api.SyncPrefix + '/Actions/checkDbLink', data }); +} diff --git a/src/api/systemData/dictionary.ts b/src/api/systemData/dictionary.ts new file mode 100644 index 0000000..5d36b21 --- /dev/null +++ b/src/api/systemData/dictionary.ts @@ -0,0 +1,68 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/DictionaryData', + TypePrefix = '/api/system/DictionaryType', +} + +// 获取数据字典分类 +export function getDictionaryType() { + return defHttp.get({ url: Api.TypePrefix }); +} +// 获取字典分类下拉框列表 +export function getDictionaryTypeSelector(id = '0') { + return defHttp.get({ url: Api.TypePrefix + `/Selector/${id || '0'}` }); +} +// 添加数据字典分类 +export function createDictionaryType(data) { + return defHttp.post({ url: Api.TypePrefix, data }); +} +// 修改数据字典分类 +export function updateDictionaryType(data) { + return defHttp.put({ url: Api.TypePrefix + '/' + data.id, data }); +} +// 获取数据字典分类信息 +export function getDictionaryTypeInfo(id) { + return defHttp.get({ url: Api.TypePrefix + '/' + id }); +} +// 删除数据字典分类 +export function delDictionaryType(id) { + return defHttp.delete({ url: Api.TypePrefix + '/' + id }); +} + +// 获取数据字典分类 +export function getDictionaryDataList(params) { + return defHttp.get({ url: Api.Prefix + '/' + params.typeId, params }); +} +// 获取数据字典列表(分类+内容) +export function getDictionaryAll() { + return defHttp.get({ url: Api.Prefix + '/All' }); +} +// 获取字典分类下拉框(项目上级) +export function getDictionaryDataTypeSelector(typeId, isTree, id = '0') { + return defHttp.get({ url: Api.Prefix + `/${typeId}/Selector/${id || '0'}`, params: { isTree } }); +} +// 获取字典数据下拉框列表 +export function getDictionaryDataSelector(typeId) { + return defHttp.get({ url: Api.Prefix + `/${typeId}/Data/Selector` }); +} +// 添加数据字典 +export function createDictionaryData(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改数据字典 +export function updateDictionaryData(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取数据字典信息 +export function getDictionaryDataInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Info` }); +} +// 删除数据字典信息 +export function delDictionaryData(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 导出数据字典数据 +export function exportData(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} diff --git a/src/api/systemData/interfaceOauth.ts b/src/api/systemData/interfaceOauth.ts new file mode 100644 index 0000000..2a5b83d --- /dev/null +++ b/src/api/systemData/interfaceOauth.ts @@ -0,0 +1,46 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/InterfaceOauth', +} + +// 获取接口认证列表(分页) +export function getInterfaceOauthList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 创建接口认证 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改接口认证 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 删除接口认证数据 +export function delInterfaceOauth(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 获取详情 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 获取秘钥 +export function getAppSecret() { + return defHttp.get({ url: Api.Prefix + '/getAppSecret' }); +} +// 保存认证接口列表 +export function saveInterfaceList(data) { + return defHttp.post({ url: Api.Prefix + '/saveInterfaceList', data }); +} +// 获取认证接口列表 +export function getInterfaceList(id) { + return defHttp.get({ url: Api.Prefix + '/getInterfaceList/' + id }); +} +// 获取接口日志列表 +export function getLogList(data) { + return defHttp.get({ url: Api.Prefix + '/dataInterfaceLog/' + data.id, data }); +} +//保存授权用户 +export function saveUserList(data) { + return defHttp.post({ url: Api.Prefix + '/SaveUserList', data }); +} diff --git a/src/api/systemData/variate.ts b/src/api/systemData/variate.ts new file mode 100644 index 0000000..5e9ed04 --- /dev/null +++ b/src/api/systemData/variate.ts @@ -0,0 +1,37 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/DataInterfaceVariate', +} +// 获取变量列表 +export function getList(data) { + return defHttp.get({ url: Api.Prefix + `/${data.id}`, data }); +} +// 新增变量 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改变量 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取变量 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Info` }); +} +// 删除变量 +export function del(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制变量 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 导出变量 +export function exportData(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 获取变量 +export function getVariateSelector() { + return defHttp.get({ url: Api.Prefix + `/Selector` }); +} diff --git a/src/api/workFlow/document.ts b/src/api/workFlow/document.ts new file mode 100644 index 0000000..44bd79d --- /dev/null +++ b/src/api/workFlow/document.ts @@ -0,0 +1,83 @@ +import { defHttp } from '@/utils/http/axios'; +import { ContentTypeEnum } from '@/enums/httpEnum'; + +enum Api { + Prefix = '/api/extend/Document', +} + +// 获取知识管理列表(全部文档) +export function getAllList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 添加文件夹 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改文件名/文件夹名 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 批量删除文件/文件夹 +export function batchDeleteDocument(ids) { + return defHttp.post({ url: Api.Prefix + `/BatchDelete`, data: { ids } }); +} +// 获取知识管理列表(文件夹树) +export function getFolderTree(ids?) { + return defHttp.post({ url: Api.Prefix + `/FolderTree`, data: { ids } }); +} +// 获取文件/文件夹信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 批量移动文件/文件夹 +export function moveTo(toId, ids) { + return defHttp.put({ url: Api.Prefix + `/Actions/MoveTo/${toId}`, data: { ids } }); +} +// 批量取消分享文件/文件夹 +export function shareCancel(ids) { + return defHttp.post({ url: Api.Prefix + `/Actions/CancelShare`, data: { ids } }); +} +// 批量分享文件/文件夹 +export function createShare(ids, userIds) { + return defHttp.post({ url: Api.Prefix + `/Actions/Share`, data: { ids, userIds } }); +} +// 单个分享文件/文件夹 +export function createSingleShare(id, userIds) { + return defHttp.post({ url: Api.Prefix + `/Actions/ShareAdjustment/${id}`, data: { userIds } }); +} +// 知识管理(我的共享列表) +export function getShareOutList(data) { + return defHttp.get({ url: Api.Prefix + '/Share', data }); +} +// 获取知识管理列表(共享给我) +export function getShareTomeList(data) { + return defHttp.get({ url: Api.Prefix + '/ShareTome', data }); +} +// 获取知识管理列表(共享人员) +export function getShareUserList(documentId) { + return defHttp.get({ url: Api.Prefix + `/ShareUser/${documentId}` }); +} +// 获取知识管理列表(回收站) +export function getTrashList(data) { + return defHttp.get({ url: Api.Prefix + '/Trash', data }); +} +// 回收站(批量彻底删除) +export function trashDelete(ids) { + return defHttp.post({ url: Api.Prefix + `/Trash`, data: { ids } }); +} +// 回收站(批量还原文件) +export function trashRecovery(ids) { + return defHttp.post({ url: Api.Prefix + `/Trash/Actions/Recovery`, data: { ids } }); +} +// 批量下载文件 +export function download(ids) { + return defHttp.post({ url: Api.Prefix + `/PackDownload`, data: { ids } }); +} +// 分片组装 +export function documentMerge(data) { + return defHttp.post({ url: Api.Prefix + `/merge`, data, headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED } }); +} +// 上传Blob(流程归档) +export function uploadBlob(data) { + return defHttp.post({ url: Api.Prefix + `/UploadBlob`, data, headers: { 'Content-Type': ContentTypeEnum.FORM_DATA } }, { errorMessageMode: 'none' }); +} diff --git a/src/api/workFlow/flowDelegate.ts b/src/api/workFlow/flowDelegate.ts new file mode 100644 index 0000000..0fbac22 --- /dev/null +++ b/src/api/workFlow/flowDelegate.ts @@ -0,0 +1,46 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/workflow/delegate', +} + +// 获取流程委托列表 +export function getFlowDelegateList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建流程委托 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改流程委托 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取流程委托信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除流程委托 +export function del(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 获取我的委托发起流程 +export function getDelegateFlow(data) { + return defHttp.get({ url: Api.Prefix + '/GetFlow', data }); +} +// 获取流程的所有委托人 +export function getDelegateUser(id) { + return defHttp.get({ url: Api.Prefix + `/UserList?templateId=${id}` }); +} +// 结束流程委托 +export function stop(id) { + return defHttp.put({ url: Api.Prefix + `/Stop/${id}` }); +} +// 获取流程委托信息 +export function getFlowDelegateInfo(id) { + return defHttp.get({ url: Api.Prefix + `/Info/${id}` }); +} +// 委托同意拒绝操作 +export function notarize(id, type) { + return defHttp.post({ url: Api.Prefix + `/Notarize/${id}?type=${type}` }); +} diff --git a/src/api/workFlow/flowMonitor.ts b/src/api/workFlow/flowMonitor.ts new file mode 100644 index 0000000..9c58581 --- /dev/null +++ b/src/api/workFlow/flowMonitor.ts @@ -0,0 +1,42 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/workflow/monitor', +} + +// 获取列表 +export function getFlowMonitorList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 批量删除流程监控 +export function delMonitorList(data) { + return defHttp.delete({ url: Api.Prefix, data }); +} +// 事件日志 +export function getLogList(data) { + return defHttp.get({ url: Api.Prefix + `/${data.id}/EventLog` }); +} +// 终止审核 +export function cancel(id, data) { + return defHttp.post({ url: Api.Prefix + `/Cancel/${id}`, data }); +} +// 流程监控指派 +export function assign(id, data) { + return defHttp.post({ url: Api.Prefix + `/Assign/${id}`, data }); +} +// 流程复活和变更提交 +export function resurgence(id, data) { + return defHttp.post({ url: Api.Prefix + `/Activate/${id}`, data }); +} +// 获取暂停类型 +export function getPauseType(id) { + return defHttp.get({ url: Api.Prefix + `/AnySubFlow/${id}` }); +} +// 暂停流程 +export function pause(id, data) { + return defHttp.post({ url: Api.Prefix + `/Pause/${id}`, data }); +} +// 恢复流程 +export function reboot(id) { + return defHttp.post({ url: Api.Prefix + `/Reboot/${id}` }); +} diff --git a/src/api/workFlow/formDesign.ts b/src/api/workFlow/formDesign.ts new file mode 100644 index 0000000..aa47ceb --- /dev/null +++ b/src/api/workFlow/formDesign.ts @@ -0,0 +1,50 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/flowForm/Form', +} + +// 获取表单列表(分页) +export function getFormList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建表单 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改表单 +export function update(data) { + return defHttp.put({ url: Api.Prefix, data }); +} +// 获取表单 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除表单 +export function delForm(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 发布/回滚 +export function release(id, isRelease = 1) { + return defHttp.post({ url: Api.Prefix + `/Release/${id}?isRelease=${isRelease}` }); +} +// 复制表单 +export function copy(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 导出 +export function exportData(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 根据表单id获取表单字段 +export function getFormField(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/getField` }); +} +// 表单下拉列表 +export function getFormSelect(data) { + return defHttp.get({ url: Api.Prefix + `/select`, data }); +} +// 通过表单id获取流程id +export function getFlowByFormId(id) { + return defHttp.get({ url: Api.Prefix + `/getFormById/${id}` }); +} diff --git a/src/api/workFlow/schedule.ts b/src/api/workFlow/schedule.ts new file mode 100644 index 0000000..2d482e1 --- /dev/null +++ b/src/api/workFlow/schedule.ts @@ -0,0 +1,30 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/system/Schedule', +} + +// 获取日程安排列表 +export function getScheduleList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 新建日程安排 +export function createSchedule(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 更新日程安排 +export function updateSchedule(data, type) { + return defHttp.put({ url: Api.Prefix + `/${data.id}/${type}`, data }); +} +// 删除日程安排 +export function delSchedule(id, type) { + return defHttp.delete({ url: Api.Prefix + `/${id}/${type}` }); +} +// 获取日程安排信息 +export function getScheduleInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}` }); +} +// 查看日程详情 +export function getScheduleDetail(groupId, id) { + return defHttp.get({ url: Api.Prefix + `/detail?groupId=${groupId}&id=${id}` }); +} diff --git a/src/api/workFlow/task.ts b/src/api/workFlow/task.ts new file mode 100644 index 0000000..1bf3a08 --- /dev/null +++ b/src/api/workFlow/task.ts @@ -0,0 +1,164 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/workflow/task', + operatorPrefix = '/api/workflow/operator', +} + +// 获取流程发起列表 +export function getFlowLaunchList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 获取待我审批详情 +export function getFlowTaskInfo(id, data) { + return defHttp.get({ url: Api.Prefix + `/${id}`, data }); +} +// 新建表单 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 更新表单 +export function update(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}`, data }); +} +// 删除流程发起 +export function delFlowLaunch(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 流程发起撤回 +export function launchRecall(id, data) { + return defHttp.put({ url: Api.Prefix + `/Recall/${id}`, data }); +} +// 流程发起撤销 +export function revoke(id, data) { + return defHttp.put({ url: Api.Prefix + `/Revoke/${id}`, data }); +} +// 流程发起催办 +export function press(id) { + return defHttp.post({ url: Api.Prefix + `/Press/${id}` }); +} +//事件日志 +export function getLogList(data) { + return defHttp.get({ url: Api.Prefix + `/${data.id}/EventLog` }); +} +// 获取流程实例相关人员(分页) +export function getTaskUserList(taskId, data) { + return defHttp.get({ url: Api.Prefix + `/TaskUserList/${taskId}`, data }); +} +// 查看子流程 +export function getSubFlowInfo(nodeCode, flowId) { + return defHttp.get({ url: Api.Prefix + `/SubFlowInfo?taskId=${flowId}&nodeCode=${nodeCode}` }); +} +// 经办 +// 获取候选人列表(分页) +export function getCandidateUser(data) { + return defHttp.post({ url: Api.operatorPrefix + `/CandidateUser/${data.operatorId || 0}`, data }); +} +// 判断是否有候选人 +export function getCandidates(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/CandidateNode/${id}`, data }); +} +// 获取待我审核 +export function getFlowBeforeList(data) { + return defHttp.get({ url: Api.operatorPrefix + `/List/${data.category}`, data }); +} +// 待签收批量签收 +export function batchSign(data) { + return defHttp.post({ url: Api.operatorPrefix + `/Sign`, data }); +} +// 待签收签收 type 0 - 签收 1 - 退签 +export function sign(id) { + return batchSign({ ids: [id], type: 0 }); +} +// 待签收退签 +export function cancelSign(id) { + return batchSign({ ids: [id], type: 1 }); +} +// 待办理批量办理 +export function batchHandle(data) { + return defHttp.post({ url: Api.operatorPrefix + `/Transact`, data }); +} +// 待办理开始办理 +export function handle(id) { + return batchHandle({ ids: [id] }); +} +// 待我审核审核(同意、拒绝) +export function audit(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/Audit/${id}`, data }); +} +// 获取加签人员列表 +export function getFreeApproverUserList(data) { + return defHttp.post({ url: Api.operatorPrefix + `/AddSignUserIdList/${data.id}`, data }); +} +// 减签 +export function reduceApprover(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/ReduceApprover/${id}`, data }); +} +// 暂存 +export function saveAudit(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/SaveAudit/${id}`, data }); +} +// 协办保存 +export function saveAssist(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/AssistSave/${id}`, data }); +} +// 撤回审核 +export function auditRecall(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/Recall/${id}`, data }); +} +// 待我审核转审 +export function transfer(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/Transfer/${id}`, data }); +} +// 待我审核转审 +export function assist(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/Assist/${id}`, data }); +} +// 批量通过、退回、转审 batchType 0-通过 1-退回 2-转审 +export function batchOperation(data) { + return defHttp.post({ url: Api.operatorPrefix + `/BatchOperation`, data }); +} +// 获取批量审批候选人 +export function getBatchCandidate(data) { + return defHttp.get({ url: Api.operatorPrefix + `/BatchCandidate`, data }); +} +// 获取批量审批流程 +export function getBatchFlowSelector() { + return defHttp.get({ url: Api.operatorPrefix + `/BatchFlowSelector` }); +} +// 获取批量审批流程版本 +export function getBatchVersionSelector(id) { + return defHttp.get({ url: Api.operatorPrefix + `/BatchVersionSelector/${id}` }); +} +// 获取批量审批流程节点 +export function getBatchNodeSelector(id) { + return defHttp.get({ url: Api.operatorPrefix + `/BatchNodeSelector/${id}` }); +} +// 获取批量审批流程节点属性 +export function getBatchNode(flowId, nodeCode) { + return defHttp.get({ url: Api.operatorPrefix + `/BatchNode?flowId=${flowId}&nodeCode=${nodeCode}` }); +} +// 判断是否有查看权限(消息通知用) +export function checkInfo(taskOperatorId, opType) { + return defHttp.get({ url: Api.operatorPrefix + `/${taskOperatorId}/Info?opType=${opType}` }); +} +// 退回审核 +export function back(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/SendBack/${id}`, data }); +} +// 获取退回下拉接口 +export function getBackNodeCodeList(id) { + return defHttp.get({ url: Api.operatorPrefix + `/SendBackNodeList/${id}` }); +} +// 加签 +export function freeApprover(id, data) { + return defHttp.post({ url: Api.operatorPrefix + `/AddSign/${id}`, data }); +} +// 进度节点经办列表 +export function getRecordList(taskId, nodeId) { + return defHttp.get({ url: Api.operatorPrefix + `/RecordList?taskId=${taskId}&nodeId=${nodeId}` }); +} +// 查看发起节点表单 +export function getStartFormInfo(taskId) { + return defHttp.get({ url: Api.Prefix + `/ViewStartForm/${taskId}` }); +} diff --git a/src/api/workFlow/template.ts b/src/api/workFlow/template.ts new file mode 100644 index 0000000..7e8f336 --- /dev/null +++ b/src/api/workFlow/template.ts @@ -0,0 +1,125 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/workflow/template', + CommentPrefix = '/api/workflow/comment', + WebhookPrefix = '/api/workflow/Hooks', +} + +// 获取流程列表(分页) +export function getList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 通过表单id获取流程列表 +export function getFlowList(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/FlowList` }); +} +// 新建流程基本信息 +export function create(data) { + return defHttp.post({ url: Api.Prefix, data }); +} +// 修改流程基本信息 +export function update(data) { + return defHttp.put({ url: Api.Prefix + '/' + data.id, data }); +} +// 获取流程基本信息 +export function getInfo(id) { + return defHttp.get({ url: Api.Prefix + '/' + id }); +} +// 删除流程引擎 +export function delFlow(id) { + return defHttp.delete({ url: Api.Prefix + '/' + id }); +} +// 复制流程引擎 +export function copy(id) { + return defHttp.post({ url: Api.Prefix + `/${id}/Actions/Copy` }); +} +// 导出 +export function exportData(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/Actions/Export` }); +} +// 简单流程切换为标准流程 +export function changeType(id) { + return defHttp.put({ url: Api.Prefix + `/${id}/UpdateType` }); +} +// 修改流程 +export function saveFlow(data) { + return defHttp.post({ url: Api.Prefix + '/Save', data }); +} +// 获取流程引擎 +export function getFlowInfo(id) { + return defHttp.get({ url: Api.Prefix + '/Info/' + id }); +} +// 获取流程引擎版本 +export function getVersionList(id) { + return defHttp.get({ url: Api.Prefix + '/Version/' + id }); +} +// 删除流程版本 +export function delVersion(id) { + return defHttp.delete({ url: Api.Prefix + '/Info/' + id }); +} +// 新增流程版本 +export function copyVersion(id) { + return defHttp.post({ url: Api.Prefix + `/Info/${id}` }); +} +// 列表流程列表(分页) +export function getFlowSelector(data) { + return defHttp.get({ url: Api.Prefix + `/Selector`, data }); +} +// 获取流程发起节点表单信息(小流程id) +export function getFlowFormInfo(id) { + return defHttp.get({ url: Api.Prefix + `/${id}/FormInfo` }); +} +// 获取流程发起节点表单信息(大流程id) +export function getFlowStartFormInfo(id) { + return defHttp.get({ url: Api.Prefix + `/StartForm/${id}` }); +} +// 获取流程版本Id和发起节点表单id(大流程id) +export function getFlowStartFormId(id) { + return defHttp.get({ url: Api.Prefix + `/StartFormId/${id}` }); +} +// 所属流程列表(树形) formType 1-系统表单 2-自定义表单 +export function getTreeList(formType = '') { + return defHttp.get({ url: Api.Prefix + '/TreeList', data: { formType } }); +} +// 委托 通过list获取流程引擎列表 +export function getFlowEngineListByIds(data) { + return defHttp.post({ url: Api.Prefix + `/GetFlowList`, data }); +} +// 设置常用流程 +export function setCommonFlow(id) { + return defHttp.post({ url: Api.Prefix + `/SetCommonFlow/${id}` }); +} +// 子流程带权限的可选用户 +export function getSubFlowUserList(id, data) { + return defHttp.get({ url: Api.Prefix + `/${id}/SubFlowUserList`, data }); +} +// 获取流程评论列表 +export function getCommentList(data) { + return defHttp.get({ url: Api.CommentPrefix, data }); +} +// 新建流程评论 +export function createComment(data) { + return defHttp.post({ url: Api.CommentPrefix, data }); +} +// 删除流程评论 +export function delComment(id) { + return defHttp.delete({ url: Api.CommentPrefix + '/' + id }); +} +// webhookUrl +// 获取webhookUrl +export function getWebhookUrl(id) { + return defHttp.get({ url: Api.WebhookPrefix + `/getUrl`, data: { id } }); +} +// 获取webhook字段 +export function getWebhookParams(randomStr) { + return defHttp.get({ url: Api.WebhookPrefix + `/getParams/${randomStr}` }); +} +// webhook开启接收请求 +export function webhookStart(id, randomStr) { + return defHttp.get({ url: Api.WebhookPrefix + `/${id}/start/${randomStr}` }); +} +// 上架 +export function upDownSelf(data) { + return defHttp.put({ url: Api.Prefix + `/${data.id}/UpDownShelf`, data }); +} diff --git a/src/api/workFlow/trigger.ts b/src/api/workFlow/trigger.ts new file mode 100644 index 0000000..9832682 --- /dev/null +++ b/src/api/workFlow/trigger.ts @@ -0,0 +1,22 @@ +import { defHttp } from '@/utils/http/axios'; + +enum Api { + Prefix = '/api/workflow/trigger/task', +} + +// 流传记录的任务流转日志 +export function getTaskLogList(data) { + return defHttp.get({ url: Api.Prefix + '/List', data }); +} +// 获取任务流程监控列表 +export function getTaskMonitorList(data) { + return defHttp.get({ url: Api.Prefix, data }); +} +// 批量删除任务流程监控 +export function delTaskMonitor(data) { + return defHttp.delete({ url: Api.Prefix, data }); +} +// 重试日志 +export function retryTask(id) { + return defHttp.post({ url: Api.Prefix + `/Retry/${id}` }); +} diff --git a/src/assets/icons/moon.svg b/src/assets/icons/moon.svg new file mode 100644 index 0000000..e6667f0 --- /dev/null +++ b/src/assets/icons/moon.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/src/assets/icons/sun.svg b/src/assets/icons/sun.svg new file mode 100644 index 0000000..a3997cb --- /dev/null +++ b/src/assets/icons/sun.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/404.png b/src/assets/images/404.png new file mode 100644 index 0000000..2fa73a0 Binary files /dev/null and b/src/assets/images/404.png differ diff --git a/src/assets/images/bg-dot.png b/src/assets/images/bg-dot.png new file mode 100644 index 0000000..cc1f87c Binary files /dev/null and b/src/assets/images/bg-dot.png differ diff --git a/src/assets/images/bg/blueBg.png b/src/assets/images/bg/blueBg.png new file mode 100644 index 0000000..8ef834e Binary files /dev/null and b/src/assets/images/bg/blueBg.png differ diff --git a/src/assets/images/bg/greenBg.png b/src/assets/images/bg/greenBg.png new file mode 100644 index 0000000..b1f57ec Binary files /dev/null and b/src/assets/images/bg/greenBg.png differ diff --git a/src/assets/images/bg/purpleBg.png b/src/assets/images/bg/purpleBg.png new file mode 100644 index 0000000..7782354 Binary files /dev/null and b/src/assets/images/bg/purpleBg.png differ diff --git a/src/assets/images/chatImg/noData.png b/src/assets/images/chatImg/noData.png new file mode 100644 index 0000000..6857554 Binary files /dev/null and b/src/assets/images/chatImg/noData.png differ diff --git a/src/assets/images/chatImg/robot.png b/src/assets/images/chatImg/robot.png new file mode 100644 index 0000000..a607819 Binary files /dev/null and b/src/assets/images/chatImg/robot.png differ diff --git a/src/assets/images/dashboard-nodata.png b/src/assets/images/dashboard-nodata.png new file mode 100644 index 0000000..8ea29fe Binary files /dev/null and b/src/assets/images/dashboard-nodata.png differ diff --git a/src/assets/images/document/audio.png b/src/assets/images/document/audio.png new file mode 100644 index 0000000..1262602 Binary files /dev/null and b/src/assets/images/document/audio.png differ diff --git a/src/assets/images/document/blank.png b/src/assets/images/document/blank.png new file mode 100644 index 0000000..b36caf0 Binary files /dev/null and b/src/assets/images/document/blank.png differ diff --git a/src/assets/images/document/code.png b/src/assets/images/document/code.png new file mode 100644 index 0000000..2e2301b Binary files /dev/null and b/src/assets/images/document/code.png differ diff --git a/src/assets/images/document/excel.png b/src/assets/images/document/excel.png new file mode 100644 index 0000000..c04510d Binary files /dev/null and b/src/assets/images/document/excel.png differ diff --git a/src/assets/images/document/folder.png b/src/assets/images/document/folder.png new file mode 100644 index 0000000..9503008 Binary files /dev/null and b/src/assets/images/document/folder.png differ diff --git a/src/assets/images/document/image.png b/src/assets/images/document/image.png new file mode 100644 index 0000000..8889ff7 Binary files /dev/null and b/src/assets/images/document/image.png differ diff --git a/src/assets/images/document/pdf.png b/src/assets/images/document/pdf.png new file mode 100644 index 0000000..c1adbee Binary files /dev/null and b/src/assets/images/document/pdf.png differ diff --git a/src/assets/images/document/ppt.png b/src/assets/images/document/ppt.png new file mode 100644 index 0000000..0b4766f Binary files /dev/null and b/src/assets/images/document/ppt.png differ diff --git a/src/assets/images/document/rar.png b/src/assets/images/document/rar.png new file mode 100644 index 0000000..e5ff105 Binary files /dev/null and b/src/assets/images/document/rar.png differ diff --git a/src/assets/images/document/txt.png b/src/assets/images/document/txt.png new file mode 100644 index 0000000..9b438b7 Binary files /dev/null and b/src/assets/images/document/txt.png differ diff --git a/src/assets/images/document/word.png b/src/assets/images/document/word.png new file mode 100644 index 0000000..98e2d43 Binary files /dev/null and b/src/assets/images/document/word.png differ diff --git a/src/assets/images/emptyElement.png b/src/assets/images/emptyElement.png new file mode 100644 index 0000000..040472c Binary files /dev/null and b/src/assets/images/emptyElement.png differ diff --git a/src/assets/images/emptyPortal.png b/src/assets/images/emptyPortal.png new file mode 100644 index 0000000..1f81796 Binary files /dev/null and b/src/assets/images/emptyPortal.png differ diff --git a/src/assets/images/flowStatus/adopt.png b/src/assets/images/flowStatus/adopt.png new file mode 100644 index 0000000..08691f1 Binary files /dev/null and b/src/assets/images/flowStatus/adopt.png differ diff --git a/src/assets/images/flowStatus/back.png b/src/assets/images/flowStatus/back.png new file mode 100644 index 0000000..532b6a4 Binary files /dev/null and b/src/assets/images/flowStatus/back.png differ diff --git a/src/assets/images/flowStatus/cancel.png b/src/assets/images/flowStatus/cancel.png new file mode 100644 index 0000000..76ab6db Binary files /dev/null and b/src/assets/images/flowStatus/cancel.png differ diff --git a/src/assets/images/flowStatus/doing.png b/src/assets/images/flowStatus/doing.png new file mode 100644 index 0000000..fe3eda3 Binary files /dev/null and b/src/assets/images/flowStatus/doing.png differ diff --git a/src/assets/images/flowStatus/draft.png b/src/assets/images/flowStatus/draft.png new file mode 100644 index 0000000..2fa2248 Binary files /dev/null and b/src/assets/images/flowStatus/draft.png differ diff --git a/src/assets/images/flowStatus/pause.png b/src/assets/images/flowStatus/pause.png new file mode 100644 index 0000000..e04f35a Binary files /dev/null and b/src/assets/images/flowStatus/pause.png differ diff --git a/src/assets/images/flowStatus/recall.png b/src/assets/images/flowStatus/recall.png new file mode 100644 index 0000000..992f37d Binary files /dev/null and b/src/assets/images/flowStatus/recall.png differ diff --git a/src/assets/images/flowStatus/reject.png b/src/assets/images/flowStatus/reject.png new file mode 100644 index 0000000..eb922d0 Binary files /dev/null and b/src/assets/images/flowStatus/reject.png differ diff --git a/src/assets/images/flowStatus/revoke.png b/src/assets/images/flowStatus/revoke.png new file mode 100644 index 0000000..7bb5b4c Binary files /dev/null and b/src/assets/images/flowStatus/revoke.png differ diff --git a/src/assets/images/flowStatus/revoking.png b/src/assets/images/flowStatus/revoking.png new file mode 100644 index 0000000..8514bab Binary files /dev/null and b/src/assets/images/flowStatus/revoking.png differ diff --git a/src/assets/images/generator/columnType1-dark.png b/src/assets/images/generator/columnType1-dark.png new file mode 100644 index 0000000..64727ac Binary files /dev/null and b/src/assets/images/generator/columnType1-dark.png differ diff --git a/src/assets/images/generator/columnType1.png b/src/assets/images/generator/columnType1.png new file mode 100644 index 0000000..aa95123 Binary files /dev/null and b/src/assets/images/generator/columnType1.png differ diff --git a/src/assets/images/generator/columnType2-dark.png b/src/assets/images/generator/columnType2-dark.png new file mode 100644 index 0000000..2df9653 Binary files /dev/null and b/src/assets/images/generator/columnType2-dark.png differ diff --git a/src/assets/images/generator/columnType2.png b/src/assets/images/generator/columnType2.png new file mode 100644 index 0000000..382b4ef Binary files /dev/null and b/src/assets/images/generator/columnType2.png differ diff --git a/src/assets/images/generator/columnType3-dark.png b/src/assets/images/generator/columnType3-dark.png new file mode 100644 index 0000000..7fdd5ba Binary files /dev/null and b/src/assets/images/generator/columnType3-dark.png differ diff --git a/src/assets/images/generator/columnType3.png b/src/assets/images/generator/columnType3.png new file mode 100644 index 0000000..e60c61c Binary files /dev/null and b/src/assets/images/generator/columnType3.png differ diff --git a/src/assets/images/generator/columnType4-dark.png b/src/assets/images/generator/columnType4-dark.png new file mode 100644 index 0000000..d633d04 Binary files /dev/null and b/src/assets/images/generator/columnType4-dark.png differ diff --git a/src/assets/images/generator/columnType4.png b/src/assets/images/generator/columnType4.png new file mode 100644 index 0000000..98d6518 Binary files /dev/null and b/src/assets/images/generator/columnType4.png differ diff --git a/src/assets/images/generator/columnType5-dark.png b/src/assets/images/generator/columnType5-dark.png new file mode 100644 index 0000000..08364b8 Binary files /dev/null and b/src/assets/images/generator/columnType5-dark.png differ diff --git a/src/assets/images/generator/columnType5.png b/src/assets/images/generator/columnType5.png new file mode 100644 index 0000000..02285fb Binary files /dev/null and b/src/assets/images/generator/columnType5.png differ diff --git a/src/assets/images/gg.png b/src/assets/images/gg.png new file mode 100644 index 0000000..b0ca739 Binary files /dev/null and b/src/assets/images/gg.png differ diff --git a/src/assets/images/home/grow-icon1.png b/src/assets/images/home/grow-icon1.png new file mode 100644 index 0000000..ce29fe1 Binary files /dev/null and b/src/assets/images/home/grow-icon1.png differ diff --git a/src/assets/images/home/grow-icon2.png b/src/assets/images/home/grow-icon2.png new file mode 100644 index 0000000..cbf8f36 Binary files /dev/null and b/src/assets/images/home/grow-icon2.png differ diff --git a/src/assets/images/home/grow-icon3.png b/src/assets/images/home/grow-icon3.png new file mode 100644 index 0000000..a3416e4 Binary files /dev/null and b/src/assets/images/home/grow-icon3.png differ diff --git a/src/assets/images/home/grow-icon4.png b/src/assets/images/home/grow-icon4.png new file mode 100644 index 0000000..ec66b1d Binary files /dev/null and b/src/assets/images/home/grow-icon4.png differ diff --git a/src/assets/images/home/grow-img1.png b/src/assets/images/home/grow-img1.png new file mode 100644 index 0000000..0e9119f Binary files /dev/null and b/src/assets/images/home/grow-img1.png differ diff --git a/src/assets/images/home/grow-img2.png b/src/assets/images/home/grow-img2.png new file mode 100644 index 0000000..e13dee9 Binary files /dev/null and b/src/assets/images/home/grow-img2.png differ diff --git a/src/assets/images/home/grow-img3.png b/src/assets/images/home/grow-img3.png new file mode 100644 index 0000000..aa43c58 Binary files /dev/null and b/src/assets/images/home/grow-img3.png differ diff --git a/src/assets/images/home/grow-img4.png b/src/assets/images/home/grow-img4.png new file mode 100644 index 0000000..38dbe92 Binary files /dev/null and b/src/assets/images/home/grow-img4.png differ diff --git a/src/assets/images/import.png b/src/assets/images/import.png new file mode 100644 index 0000000..76fbc79 Binary files /dev/null and b/src/assets/images/import.png differ diff --git a/src/assets/images/iphoneBg-dark.png b/src/assets/images/iphoneBg-dark.png new file mode 100644 index 0000000..da815fd Binary files /dev/null and b/src/assets/images/iphoneBg-dark.png differ diff --git a/src/assets/images/iphoneBg.png b/src/assets/images/iphoneBg.png new file mode 100644 index 0000000..c792559 Binary files /dev/null and b/src/assets/images/iphoneBg.png differ diff --git a/src/assets/images/loading-iframe.gif b/src/assets/images/loading-iframe.gif new file mode 100644 index 0000000..40fcffe Binary files /dev/null and b/src/assets/images/loading-iframe.gif differ diff --git a/src/assets/images/login-banner.png b/src/assets/images/login-banner.png new file mode 100644 index 0000000..0e53fb6 Binary files /dev/null and b/src/assets/images/login-banner.png differ diff --git a/src/assets/images/login-bg-dark.png b/src/assets/images/login-bg-dark.png new file mode 100644 index 0000000..bee70ad Binary files /dev/null and b/src/assets/images/login-bg-dark.png differ diff --git a/src/assets/images/login-bg.png b/src/assets/images/login-bg.png new file mode 100644 index 0000000..e08b3f1 Binary files /dev/null and b/src/assets/images/login-bg.png differ diff --git a/src/assets/images/login-company-logo.png b/src/assets/images/login-company-logo.png new file mode 100644 index 0000000..3bd7acb Binary files /dev/null and b/src/assets/images/login-company-logo.png differ diff --git a/src/assets/images/login_logo.png b/src/assets/images/login_logo.png new file mode 100644 index 0000000..f1d6f00 Binary files /dev/null and b/src/assets/images/login_logo.png differ diff --git a/src/assets/images/login_version.png b/src/assets/images/login_version.png new file mode 100644 index 0000000..fdc9d61 Binary files /dev/null and b/src/assets/images/login_version.png differ diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 0000000..6a7f929 Binary files /dev/null and b/src/assets/images/logo.png differ diff --git a/src/assets/images/mark.png b/src/assets/images/mark.png new file mode 100644 index 0000000..4f68e9a Binary files /dev/null and b/src/assets/images/mark.png differ diff --git a/src/assets/images/other-login-bg-dark.png b/src/assets/images/other-login-bg-dark.png new file mode 100644 index 0000000..ab048fe Binary files /dev/null and b/src/assets/images/other-login-bg-dark.png differ diff --git a/src/assets/images/other-login-bg.png b/src/assets/images/other-login-bg.png new file mode 100644 index 0000000..ce715b3 Binary files /dev/null and b/src/assets/images/other-login-bg.png differ diff --git a/src/assets/images/portal-nodata.png b/src/assets/images/portal-nodata.png new file mode 100644 index 0000000..aa31321 Binary files /dev/null and b/src/assets/images/portal-nodata.png differ diff --git a/src/assets/images/qrcode-bg.png b/src/assets/images/qrcode-bg.png new file mode 100644 index 0000000..33e55bb Binary files /dev/null and b/src/assets/images/qrcode-bg.png differ diff --git a/src/assets/images/query-noData.png b/src/assets/images/query-noData.png new file mode 100644 index 0000000..4a7cdfa Binary files /dev/null and b/src/assets/images/query-noData.png differ diff --git a/src/assets/images/rankList/badge1.png b/src/assets/images/rankList/badge1.png new file mode 100644 index 0000000..7e60684 Binary files /dev/null and b/src/assets/images/rankList/badge1.png differ diff --git a/src/assets/images/rankList/badge2.png b/src/assets/images/rankList/badge2.png new file mode 100644 index 0000000..8fad16f Binary files /dev/null and b/src/assets/images/rankList/badge2.png differ diff --git a/src/assets/images/rankList/badge3.png b/src/assets/images/rankList/badge3.png new file mode 100644 index 0000000..3a65beb Binary files /dev/null and b/src/assets/images/rankList/badge3.png differ diff --git a/src/assets/images/rankList/cup1.png b/src/assets/images/rankList/cup1.png new file mode 100644 index 0000000..686e831 Binary files /dev/null and b/src/assets/images/rankList/cup1.png differ diff --git a/src/assets/images/rankList/cup2.png b/src/assets/images/rankList/cup2.png new file mode 100644 index 0000000..1a4d366 Binary files /dev/null and b/src/assets/images/rankList/cup2.png differ diff --git a/src/assets/images/rankList/cup3.png b/src/assets/images/rankList/cup3.png new file mode 100644 index 0000000..9071009 Binary files /dev/null and b/src/assets/images/rankList/cup3.png differ diff --git a/src/assets/images/rankList/medal1.png b/src/assets/images/rankList/medal1.png new file mode 100644 index 0000000..4a3d9c3 Binary files /dev/null and b/src/assets/images/rankList/medal1.png differ diff --git a/src/assets/images/rankList/medal2.png b/src/assets/images/rankList/medal2.png new file mode 100644 index 0000000..e3109a9 Binary files /dev/null and b/src/assets/images/rankList/medal2.png differ diff --git a/src/assets/images/rankList/medal3.png b/src/assets/images/rankList/medal3.png new file mode 100644 index 0000000..79da1ef Binary files /dev/null and b/src/assets/images/rankList/medal3.png differ diff --git a/src/assets/images/rankList/rank1.png b/src/assets/images/rankList/rank1.png new file mode 100644 index 0000000..9479712 Binary files /dev/null and b/src/assets/images/rankList/rank1.png differ diff --git a/src/assets/images/rankList/rank2.png b/src/assets/images/rankList/rank2.png new file mode 100644 index 0000000..aedd110 Binary files /dev/null and b/src/assets/images/rankList/rank2.png differ diff --git a/src/assets/images/rankList/rank3.png b/src/assets/images/rankList/rank3.png new file mode 100644 index 0000000..549a8ee Binary files /dev/null and b/src/assets/images/rankList/rank3.png differ diff --git a/src/assets/images/settings/blueBg.png b/src/assets/images/settings/blueBg.png new file mode 100644 index 0000000..2d3573f Binary files /dev/null and b/src/assets/images/settings/blueBg.png differ diff --git a/src/assets/images/settings/customColor.png b/src/assets/images/settings/customColor.png new file mode 100644 index 0000000..1800763 Binary files /dev/null and b/src/assets/images/settings/customColor.png differ diff --git a/src/assets/images/settings/defaultBg.png b/src/assets/images/settings/defaultBg.png new file mode 100644 index 0000000..6fd7320 Binary files /dev/null and b/src/assets/images/settings/defaultBg.png differ diff --git a/src/assets/images/settings/greenBg.png b/src/assets/images/settings/greenBg.png new file mode 100644 index 0000000..07bc4b5 Binary files /dev/null and b/src/assets/images/settings/greenBg.png differ diff --git a/src/assets/images/settings/mixSidebar.png b/src/assets/images/settings/mixSidebar.png new file mode 100644 index 0000000..e52b651 Binary files /dev/null and b/src/assets/images/settings/mixSidebar.png differ diff --git a/src/assets/images/settings/mixSidebarHL.png b/src/assets/images/settings/mixSidebarHL.png new file mode 100644 index 0000000..793569c Binary files /dev/null and b/src/assets/images/settings/mixSidebarHL.png differ diff --git a/src/assets/images/settings/purpleBg.png b/src/assets/images/settings/purpleBg.png new file mode 100644 index 0000000..f0b5d55 Binary files /dev/null and b/src/assets/images/settings/purpleBg.png differ diff --git a/src/assets/images/settings/sidebar.png b/src/assets/images/settings/sidebar.png new file mode 100644 index 0000000..d34356c Binary files /dev/null and b/src/assets/images/settings/sidebar.png differ diff --git a/src/assets/images/settings/sidebarHL.png b/src/assets/images/settings/sidebarHL.png new file mode 100644 index 0000000..6c00e8e Binary files /dev/null and b/src/assets/images/settings/sidebarHL.png differ diff --git a/src/assets/images/settings/topMenu.png b/src/assets/images/settings/topMenu.png new file mode 100644 index 0000000..22ede5f Binary files /dev/null and b/src/assets/images/settings/topMenu.png differ diff --git a/src/assets/images/settings/topMenuHL.png b/src/assets/images/settings/topMenuHL.png new file mode 100644 index 0000000..bb1fc6f Binary files /dev/null and b/src/assets/images/settings/topMenuHL.png differ diff --git a/src/assets/images/sign.gif b/src/assets/images/sign.gif new file mode 100644 index 0000000..cc7f13a Binary files /dev/null and b/src/assets/images/sign.gif differ diff --git a/src/assets/images/success.png b/src/assets/images/success.png new file mode 100644 index 0000000..f27e5e1 Binary files /dev/null and b/src/assets/images/success.png differ diff --git a/src/assets/images/tip.png b/src/assets/images/tip.png new file mode 100644 index 0000000..4f363ea Binary files /dev/null and b/src/assets/images/tip.png differ diff --git a/src/assets/images/tz.png b/src/assets/images/tz.png new file mode 100644 index 0000000..8011c62 Binary files /dev/null and b/src/assets/images/tz.png differ diff --git a/src/assets/images/upload.png b/src/assets/images/upload.png new file mode 100644 index 0000000..a8d42da Binary files /dev/null and b/src/assets/images/upload.png differ diff --git a/src/assets/images/xsl.png b/src/assets/images/xsl.png new file mode 100644 index 0000000..db3edea Binary files /dev/null and b/src/assets/images/xsl.png differ diff --git a/src/assets/images/xsl1.png b/src/assets/images/xsl1.png new file mode 100644 index 0000000..c7e2bb1 Binary files /dev/null and b/src/assets/images/xsl1.png differ diff --git a/src/assets/images/yunzhu.png b/src/assets/images/yunzhu.png new file mode 100644 index 0000000..d7012b6 Binary files /dev/null and b/src/assets/images/yunzhu.png differ diff --git a/src/assets/images/yunzhupaas.png b/src/assets/images/yunzhupaas.png new file mode 100644 index 0000000..5287bbc Binary files /dev/null and b/src/assets/images/yunzhupaas.png differ diff --git a/src/assets/images/yunzhupaas2.png b/src/assets/images/yunzhupaas2.png new file mode 100644 index 0000000..b46f746 Binary files /dev/null and b/src/assets/images/yunzhupaas2.png differ diff --git a/src/assets/svg/preview/p-rotate.svg b/src/assets/svg/preview/p-rotate.svg new file mode 100644 index 0000000..5153a81 --- /dev/null +++ b/src/assets/svg/preview/p-rotate.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg/preview/pageIndex.svg b/src/assets/svg/preview/pageIndex.svg new file mode 100644 index 0000000..e287656 --- /dev/null +++ b/src/assets/svg/preview/pageIndex.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svg/preview/pageLast.svg b/src/assets/svg/preview/pageLast.svg new file mode 100644 index 0000000..a61b955 --- /dev/null +++ b/src/assets/svg/preview/pageLast.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svg/preview/pageNext.svg b/src/assets/svg/preview/pageNext.svg new file mode 100644 index 0000000..5bcca0d --- /dev/null +++ b/src/assets/svg/preview/pageNext.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/svg/preview/pagePre.svg b/src/assets/svg/preview/pagePre.svg new file mode 100644 index 0000000..47ba7ca --- /dev/null +++ b/src/assets/svg/preview/pagePre.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/svg/preview/resume.svg b/src/assets/svg/preview/resume.svg new file mode 100644 index 0000000..0e86c5f --- /dev/null +++ b/src/assets/svg/preview/resume.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg/preview/scale.svg b/src/assets/svg/preview/scale.svg new file mode 100644 index 0000000..1f7adae --- /dev/null +++ b/src/assets/svg/preview/scale.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg/preview/unrotate.svg b/src/assets/svg/preview/unrotate.svg new file mode 100644 index 0000000..e4708be --- /dev/null +++ b/src/assets/svg/preview/unrotate.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svg/preview/unscale.svg b/src/assets/svg/preview/unscale.svg new file mode 100644 index 0000000..1359b34 --- /dev/null +++ b/src/assets/svg/preview/unscale.svg @@ -0,0 +1 @@ + diff --git a/src/components/Application/index.ts b/src/components/Application/index.ts new file mode 100644 index 0000000..e97d33e --- /dev/null +++ b/src/components/Application/index.ts @@ -0,0 +1,15 @@ +import { withInstall } from '@/utils'; + +import appLogo from './src/AppLogo.vue'; +import appProvider from './src/AppProvider.vue'; +import appSearch from './src/search/AppSearch.vue'; +import appLocalePicker from './src/AppLocalePicker.vue'; +import appDarkModeToggle from './src/AppDarkModeToggle.vue'; + +export { useAppProviderContext } from './src/useAppContext'; + +export const AppLogo = withInstall(appLogo); +export const AppProvider = withInstall(appProvider); +export const AppSearch = withInstall(appSearch); +export const AppLocalePicker = withInstall(appLocalePicker); +export const AppDarkModeToggle = withInstall(appDarkModeToggle); diff --git a/src/components/Application/src/AppDarkModeToggle.vue b/src/components/Application/src/AppDarkModeToggle.vue new file mode 100644 index 0000000..0977836 --- /dev/null +++ b/src/components/Application/src/AppDarkModeToggle.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/components/Application/src/AppLocalePicker.vue b/src/components/Application/src/AppLocalePicker.vue new file mode 100644 index 0000000..afb8f3c --- /dev/null +++ b/src/components/Application/src/AppLocalePicker.vue @@ -0,0 +1,81 @@ + + diff --git a/src/components/Application/src/AppLogo.vue b/src/components/Application/src/AppLogo.vue new file mode 100644 index 0000000..59220a3 --- /dev/null +++ b/src/components/Application/src/AppLogo.vue @@ -0,0 +1,101 @@ + + + diff --git a/src/components/Application/src/AppProvider.vue b/src/components/Application/src/AppProvider.vue new file mode 100644 index 0000000..c101ccf --- /dev/null +++ b/src/components/Application/src/AppProvider.vue @@ -0,0 +1,77 @@ + diff --git a/src/components/Application/src/search/AppSearch.vue b/src/components/Application/src/search/AppSearch.vue new file mode 100644 index 0000000..446be5c --- /dev/null +++ b/src/components/Application/src/search/AppSearch.vue @@ -0,0 +1,22 @@ + + diff --git a/src/components/Application/src/search/AppSearchFooter.vue b/src/components/Application/src/search/AppSearchFooter.vue new file mode 100644 index 0000000..56a43f5 --- /dev/null +++ b/src/components/Application/src/search/AppSearchFooter.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/components/Application/src/search/AppSearchKeyItem.vue b/src/components/Application/src/search/AppSearchKeyItem.vue new file mode 100644 index 0000000..4daa948 --- /dev/null +++ b/src/components/Application/src/search/AppSearchKeyItem.vue @@ -0,0 +1,11 @@ + + diff --git a/src/components/Application/src/search/AppSearchModal.vue b/src/components/Application/src/search/AppSearchModal.vue new file mode 100644 index 0000000..2c9af94 --- /dev/null +++ b/src/components/Application/src/search/AppSearchModal.vue @@ -0,0 +1,269 @@ + + + + + diff --git a/src/components/Application/src/search/useMenuSearch.ts b/src/components/Application/src/search/useMenuSearch.ts new file mode 100644 index 0000000..db40a78 --- /dev/null +++ b/src/components/Application/src/search/useMenuSearch.ts @@ -0,0 +1,183 @@ +import type { Menu } from '@/router/types'; +import { ref, onBeforeMount, unref, Ref, nextTick } from 'vue'; +import { getMenus } from '@/router/menus'; +import { cloneDeep } from 'lodash-es'; +import { filter, forEach } from '@/utils/helper/treeHelper'; +import { useGo } from '@/hooks/web/usePage'; +import { useScrollTo } from '@/hooks/event/useScrollTo'; +import { onKeyStroke, useDebounceFn } from '@vueuse/core'; +import { useI18n } from '@/hooks/web/useI18n'; + +export interface SearchResult { + name: string; + path: string; + icon?: string; +} + +// Translate special characters +function transform(c: string) { + const code: string[] = ['$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|']; + return code.includes(c) ? `\\${c}` : c; +} + +function createSearchReg(key: string) { + const keys = [...key].map(item => transform(item)); + const str = ['', ...keys, ''].join('.*'); + return new RegExp(str); +} + +export function useMenuSearch(refs: Ref, scrollWrap: Ref, emit: EmitType) { + const searchResult = ref([]); + const keyword = ref(''); + const activeIndex = ref(-1); + + let menuList: Menu[] = []; + + const { t } = useI18n(); + const go = useGo(); + const handleSearch = useDebounceFn(search, 200); + + onBeforeMount(async () => { + const list = await getMenus(); + menuList = cloneDeep(list); + forEach(menuList, item => { + item.fullName = t('routes.' + item.enCode.replace(/\./g, '-'), item.fullName); + }); + }); + + function search(e: ChangeEvent) { + e?.stopPropagation(); + const key = e.target.value; + keyword.value = key.trim(); + if (!key) { + searchResult.value = []; + return; + } + const reg = createSearchReg(unref(keyword).toLocaleLowerCase()); + const filterMenu = filter(menuList, item => { + const name = t('routes.' + item.enCode.replace(/\./g, '-'), item.fullName).toLocaleLowerCase(); + return reg.test(name); + }); + searchResult.value = handlerSearchResult(filterMenu, reg); + + activeIndex.value = 0; + } + + function handlerSearchResult(filterMenu: Menu[], reg: RegExp, parent?: Menu) { + const ret: SearchResult[] = []; + filterMenu.forEach(item => { + const { fullName, enCode, path, icon, children, type } = item; + const name = t('routes.' + enCode.replace(/\./g, '-'), fullName); + + if (reg.test(name.toLocaleLowerCase()) && !children?.length && type != 1) { + ret.push({ + name: parent?.fullName ? `${parent.fullName} > ${name}` : name, + path, + icon, + }); + } + if (Array.isArray(children) && children.length) { + ret.push(...handlerSearchResult(children, reg, item)); + } + }); + return ret; + } + + // Activate when the mouse moves to a certain line + function handleMouseenter(e: any) { + const index = e.target.dataset.index; + activeIndex.value = Number(index); + } + + // Arrow key up + function handleUp() { + if (!searchResult.value.length) return; + activeIndex.value--; + if (activeIndex.value < 0) { + activeIndex.value = searchResult.value.length - 1; + } + handleScroll(); + } + + // Arrow key down + function handleDown() { + if (!searchResult.value.length) return; + activeIndex.value++; + if (activeIndex.value > searchResult.value.length - 1) { + activeIndex.value = 0; + } + handleScroll(); + } + + // When the keyboard up and down keys move to an invisible place + // the scroll bar needs to scroll automatically + function handleScroll() { + const refList = unref(refs); + if (!refList || !Array.isArray(refList) || refList.length === 0 || !unref(scrollWrap)) { + return; + } + + const index = unref(activeIndex); + const currentRef = refList[index]; + if (!currentRef) { + return; + } + const wrapEl = unref(scrollWrap); + if (!wrapEl) { + return; + } + const scrollHeight = currentRef.offsetTop + currentRef.offsetHeight; + const wrapHeight = wrapEl.offsetHeight; + const { start } = useScrollTo({ + el: wrapEl, + duration: 100, + to: scrollHeight - wrapHeight, + }); + start(); + } + + function isHttpUrl(url?: string): boolean { + if (!url) { + return false; + } + // 使用正则表达式测试URL是否以http:// 或 https:// 开头 + const httpRegex = /^https?:\/\/.*$/; + return httpRegex.test(url); + } + + // enter keyboard event + async function handleEnter() { + if (!searchResult.value.length) { + return; + } + const result = unref(searchResult); + const index = unref(activeIndex); + if (result.length === 0 || index < 0) { + return; + } + const to = result[index]; + handleClose(); + await nextTick(); + if (isHttpUrl(to.path)) { + window.open(to.path, '_blank'); + } else { + go(to.path); + } + } + + // close search modal + function handleClose() { + searchResult.value = []; + emit('close'); + } + + // enter search + onKeyStroke('Enter', handleEnter); + // Monitor keyboard arrow keys + onKeyStroke('ArrowUp', handleUp); + onKeyStroke('ArrowDown', handleDown); + // esc close + onKeyStroke('Escape', handleClose); + + return { handleSearch, searchResult, keyword, activeIndex, handleMouseenter, handleEnter }; +} diff --git a/src/components/Application/src/useAppContext.ts b/src/components/Application/src/useAppContext.ts new file mode 100644 index 0000000..5356cdb --- /dev/null +++ b/src/components/Application/src/useAppContext.ts @@ -0,0 +1,17 @@ +import { InjectionKey, Ref } from 'vue'; +import { createContext, useContext } from '@/hooks/core/useContext'; + +export interface AppProviderContextProps { + prefixCls: Ref; + isMobile: Ref; +} + +const key: InjectionKey = Symbol(); + +export function createAppProviderContext(context: AppProviderContextProps) { + return createContext(context, key); +} + +export function useAppProviderContext() { + return useContext(key); +} diff --git a/src/components/Authority/index.ts b/src/components/Authority/index.ts new file mode 100644 index 0000000..7a86235 --- /dev/null +++ b/src/components/Authority/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import authority from './src/Authority.vue'; + +export const Authority = withInstall(authority); diff --git a/src/components/Authority/src/Authority.vue b/src/components/Authority/src/Authority.vue new file mode 100644 index 0000000..9f001fd --- /dev/null +++ b/src/components/Authority/src/Authority.vue @@ -0,0 +1,44 @@ + + diff --git a/src/components/Basic/index.ts b/src/components/Basic/index.ts new file mode 100644 index 0000000..c1d9b86 --- /dev/null +++ b/src/components/Basic/index.ts @@ -0,0 +1,10 @@ +import { withInstall } from '@/utils'; +import basicArrow from './src/BasicArrow.vue'; +import basicTitle from './src/BasicTitle.vue'; +import basicCaption from './src/BasicCaption.vue'; +import basicHelp from './src/BasicHelp.vue'; + +export const BasicArrow = withInstall(basicArrow); +export const BasicTitle = withInstall(basicTitle); +export const BasicCaption = withInstall(basicCaption); +export const BasicHelp = withInstall(basicHelp); diff --git a/src/components/Basic/src/BasicArrow.vue b/src/components/Basic/src/BasicArrow.vue new file mode 100644 index 0000000..5c5ab05 --- /dev/null +++ b/src/components/Basic/src/BasicArrow.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/components/Basic/src/BasicCaption.vue b/src/components/Basic/src/BasicCaption.vue new file mode 100644 index 0000000..e05a577 --- /dev/null +++ b/src/components/Basic/src/BasicCaption.vue @@ -0,0 +1,71 @@ + + + + diff --git a/src/components/Basic/src/BasicHelp.vue b/src/components/Basic/src/BasicHelp.vue new file mode 100644 index 0000000..c711ba2 --- /dev/null +++ b/src/components/Basic/src/BasicHelp.vue @@ -0,0 +1,111 @@ + + diff --git a/src/components/Basic/src/BasicTitle.vue b/src/components/Basic/src/BasicTitle.vue new file mode 100644 index 0000000..67871ca --- /dev/null +++ b/src/components/Basic/src/BasicTitle.vue @@ -0,0 +1,75 @@ + + + diff --git a/src/components/Button/index.ts b/src/components/Button/index.ts new file mode 100644 index 0000000..1c59120 --- /dev/null +++ b/src/components/Button/index.ts @@ -0,0 +1,11 @@ +import { withInstall } from '@/utils'; +import type { ExtractPropTypes } from 'vue'; +import button from './src/BasicButton.vue'; +import popConfirmButton from './src/PopConfirmButton.vue'; +import modelConfirmButton from './src/ModelConfirmButton.vue'; +import { buttonProps } from './src/props'; + +export const Button = withInstall(button); +export const PopConfirmButton = withInstall(popConfirmButton); +export const ModelConfirmButton = withInstall(modelConfirmButton); +export declare type ButtonProps = Partial>; diff --git a/src/components/Button/src/BasicButton.vue b/src/components/Button/src/BasicButton.vue new file mode 100644 index 0000000..5a60059 --- /dev/null +++ b/src/components/Button/src/BasicButton.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/components/Button/src/ModelConfirmButton.vue b/src/components/Button/src/ModelConfirmButton.vue new file mode 100644 index 0000000..43dfc67 --- /dev/null +++ b/src/components/Button/src/ModelConfirmButton.vue @@ -0,0 +1,38 @@ + + + + diff --git a/src/components/Button/src/PopConfirmButton.vue b/src/components/Button/src/PopConfirmButton.vue new file mode 100644 index 0000000..a50ca29 --- /dev/null +++ b/src/components/Button/src/PopConfirmButton.vue @@ -0,0 +1,54 @@ + diff --git a/src/components/Button/src/props.ts b/src/components/Button/src/props.ts new file mode 100644 index 0000000..7618a82 --- /dev/null +++ b/src/components/Button/src/props.ts @@ -0,0 +1,26 @@ +const validColors = ['primary', 'error', 'warning', 'success', 'info', ''] as const; +type ButtonColorType = (typeof validColors)[number]; + +export const buttonProps = { + color: { + type: String as PropType, + validator: v => validColors.includes(v), + default: '', + }, + loading: { type: Boolean }, + disabled: { type: Boolean }, + /** + * Text before icon. + */ + preIcon: { type: String }, + /** + * Text after icon. + */ + postIcon: { type: String }, + /** + * preIcon and postIcon icon size. + * @default: 14 + */ + // iconSize: { type: Number, default: 14 }, + onClick: { type: Function as PropType<(...args) => any>, default: null }, +}; diff --git a/src/components/CardList/index.ts b/src/components/CardList/index.ts new file mode 100644 index 0000000..e4c6a21 --- /dev/null +++ b/src/components/CardList/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import cardList from './src/CardList.vue'; + +export const CardList = withInstall(cardList); diff --git a/src/components/CardList/src/CardList.vue b/src/components/CardList/src/CardList.vue new file mode 100644 index 0000000..bb9c04f --- /dev/null +++ b/src/components/CardList/src/CardList.vue @@ -0,0 +1,162 @@ + + diff --git a/src/components/CardList/src/data.ts b/src/components/CardList/src/data.ts new file mode 100644 index 0000000..b7c4be7 --- /dev/null +++ b/src/components/CardList/src/data.ts @@ -0,0 +1,25 @@ +import { ref } from 'vue'; +// 每行个数 +export const grid = ref(12); +// slider属性 +export const useSlider = (min = 6, max = 12) => { + // 每行显示个数滑动条 + const getMarks = () => { + const l = {}; + for (let i = min; i < max + 1; i++) { + l[i] = { + style: { + color: '#fff', + }, + label: i, + }; + } + return l; + }; + return { + min, + max, + marks: getMarks(), + step: 1, + }; +}; diff --git a/src/components/Chart/index.ts b/src/components/Chart/index.ts new file mode 100644 index 0000000..cfb1912 --- /dev/null +++ b/src/components/Chart/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import chart from './src/Chart.vue'; + +export const Chart = withInstall(chart); diff --git a/src/components/Chart/src/Chart.vue b/src/components/Chart/src/Chart.vue new file mode 100644 index 0000000..eb216ba --- /dev/null +++ b/src/components/Chart/src/Chart.vue @@ -0,0 +1,38 @@ + + diff --git a/src/components/ClickOutSide/index.ts b/src/components/ClickOutSide/index.ts new file mode 100644 index 0000000..19c9033 --- /dev/null +++ b/src/components/ClickOutSide/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import clickOutSide from './src/ClickOutSide.vue'; + +export const ClickOutSide = withInstall(clickOutSide); diff --git a/src/components/ClickOutSide/src/ClickOutSide.vue b/src/components/ClickOutSide/src/ClickOutSide.vue new file mode 100644 index 0000000..c043cc1 --- /dev/null +++ b/src/components/ClickOutSide/src/ClickOutSide.vue @@ -0,0 +1,19 @@ + + diff --git a/src/components/CodeEditor/index.ts b/src/components/CodeEditor/index.ts new file mode 100644 index 0000000..d954913 --- /dev/null +++ b/src/components/CodeEditor/index.ts @@ -0,0 +1,10 @@ +import { withInstall } from '@/utils'; +import codeEditor from './src/CodeEditor.vue'; +import monacoEditor from './src/monacoEditor/MonacoEditor.vue'; +import jsonPreview from './src/json-preview/JsonPreview.vue'; + +export const CodeEditor = withInstall(codeEditor); +export const MonacoEditor = withInstall(monacoEditor); +export const JsonPreview = withInstall(jsonPreview); + +export * from './src/typing'; diff --git a/src/components/CodeEditor/src/CodeEditor.vue b/src/components/CodeEditor/src/CodeEditor.vue new file mode 100644 index 0000000..9c4bdac --- /dev/null +++ b/src/components/CodeEditor/src/CodeEditor.vue @@ -0,0 +1,53 @@ + + diff --git a/src/components/CodeEditor/src/codemirror/CodeMirror.vue b/src/components/CodeEditor/src/codemirror/CodeMirror.vue new file mode 100644 index 0000000..cc1a7d6 --- /dev/null +++ b/src/components/CodeEditor/src/codemirror/CodeMirror.vue @@ -0,0 +1,121 @@ + + + diff --git a/src/components/CodeEditor/src/codemirror/codeMirror.ts b/src/components/CodeEditor/src/codemirror/codeMirror.ts new file mode 100644 index 0000000..e04f51b --- /dev/null +++ b/src/components/CodeEditor/src/codemirror/codeMirror.ts @@ -0,0 +1,21 @@ +import CodeMirror from 'codemirror'; +import './codemirror.css'; +import 'codemirror/theme/idea.css'; +import 'codemirror/theme/material-palenight.css'; +// import 'codemirror/addon/lint/lint.css'; + +// modes +import 'codemirror/mode/javascript/javascript'; +import 'codemirror/mode/css/css'; +import 'codemirror/mode/htmlmixed/htmlmixed'; +// addons +// import 'codemirror/addon/edit/closebrackets'; +// import 'codemirror/addon/edit/closetag'; +// import 'codemirror/addon/comment/comment'; +// import 'codemirror/addon/fold/foldcode'; +// import 'codemirror/addon/fold/foldgutter'; +// import 'codemirror/addon/fold/brace-fold'; +// import 'codemirror/addon/fold/indent-fold'; +// import 'codemirror/addon/lint/json-lint'; +// import 'codemirror/addon/fold/comment-fold'; +export { CodeMirror }; diff --git a/src/components/CodeEditor/src/codemirror/codemirror.css b/src/components/CodeEditor/src/codemirror/codemirror.css new file mode 100644 index 0000000..c87ff66 --- /dev/null +++ b/src/components/CodeEditor/src/codemirror/codemirror.css @@ -0,0 +1,525 @@ +/* BASICS */ + +.CodeMirror { + --base: #545281; + --comment: hsl(210deg 25% 60%); + --keyword: #af4ab1; + --variable: #0055d1; + --function: #c25205; + --string: #2ba46d; + --number: #c25205; + --tags: #d00; + --qualifier: #ff6032; + --important: var(--string); + + position: relative; + height: auto; + height: 100%; + overflow: hidden; + font-family: var(--font-code); + background: white; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + min-height: 1px; /* prevents collapsing before first draw */ + padding: 4px 0; /* Vertical padding around content */ + cursor: text; +} + +.CodeMirror-scrollbar-filler, +.CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + position: absolute; + top: 0; + left: 0; + z-index: 3; + min-height: 100%; + white-space: nowrap; + background-color: transparent; + border-right: 1px solid #ddd; +} + +.CodeMirror-linenumber { + min-width: 20px; + padding: 0 3px 0 5px; + color: var(--comment); + text-align: right; + white-space: nowrap; + opacity: 0.6; +} + +.CodeMirror-guttermarker { + color: black; +} + +.CodeMirror-guttermarker-subtle { + color: #999; +} + +/* FOLD GUTTER */ + +.CodeMirror-foldmarker { + font-family: arial; + line-height: 0.3; + color: #414141; + text-shadow: #f96 1px 1px 2px, #f96 -1px -1px 2px, #f96 1px -1px 2px, #f96 -1px 1px 2px; + cursor: pointer; +} + +.CodeMirror-foldgutter { + width: 0.7em; +} + +.CodeMirror-foldgutter-open, +.CodeMirror-foldgutter-folded { + cursor: pointer; +} + +.CodeMirror-foldgutter-open::after, +.CodeMirror-foldgutter-folded::after { + position: relative; + top: -0.1em; + display: inline-block; + font-size: 0.8em; + content: '>'; + opacity: 0.8; + transform: rotate(90deg); + transition: transform 0.2s; +} + +.CodeMirror-foldgutter-folded::after { + transform: none; +} + +/* CURSOR */ + +.CodeMirror-cursor { + position: absolute; + width: 0; + pointer-events: none; + border-right: none; + border-left: 1px solid black; +} + +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} + +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + background: #7e7; + border: 0 !important; +} + +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-fat-cursor-mark { + background-color: rgb(20 255 20 / 50%); + animation: blink 1.06s steps(1) infinite; +} + +.cm-animate-fat-cursor { + width: auto; + background-color: #7e7; + border: 0; + animation: blink 1.06s steps(1) infinite; +} +@keyframes blink { + 50% { + background-color: transparent; + } +} +@keyframes blink { + 50% { + background-color: transparent; + } +} +@keyframes blink { + 50% { + background-color: transparent; + } +} + +.cm-tab { + display: inline-block; + text-decoration: inherit; +} + +.CodeMirror-rulers { + position: absolute; + top: -50px; + right: 0; + bottom: -20px; + left: 0; + overflow: hidden; +} + +.CodeMirror-ruler { + position: absolute; + top: 0; + bottom: 0; + border-left: 1px solid #ccc; +} + +/* DEFAULT THEME */ +.cm-s-default.CodeMirror { + background-color: transparent; +} + +.cm-s-default .cm-header { + color: blue; +} + +.cm-s-default .cm-quote { + color: #090; +} + +.cm-negative { + color: #d44; +} + +.cm-positive { + color: #292; +} + +.cm-header, +.cm-strong { + font-weight: bold; +} + +.cm-em { + font-style: italic; +} + +.cm-link { + text-decoration: underline; +} + +.cm-strikethrough { + text-decoration: line-through; +} + +.cm-s-default .cm-atom, +.cm-s-default .cm-def, +.cm-s-default .cm-property, +.cm-s-default .cm-variable-2, +.cm-s-default .cm-variable-3, +.cm-s-default .cm-punctuation { + color: var(--base); +} + +.cm-s-default .cm-hr, +.cm-s-default .cm-comment { + color: var(--comment); +} + +.cm-s-default .cm-attribute, +.cm-s-default .cm-keyword { + color: var(--keyword); +} + +.cm-s-default .cm-variable { + color: var(--variable); +} + +.cm-s-default .cm-bracket, +.cm-s-default .cm-tag { + color: var(--tags); +} + +.cm-s-default .cm-number { + color: var(--number); +} + +.cm-s-default .cm-string, +.cm-s-default .cm-string-2 { + color: var(--string); +} + +.cm-s-default .cm-type { + color: #085; +} + +.cm-s-default .cm-meta { + color: #555; +} + +.cm-s-default .cm-qualifier { + color: var(--qualifier); +} + +.cm-s-default .cm-builtin { + color: #7539ff; +} + +.cm-s-default .cm-link { + color: var(--flash); +} + +.cm-s-default .cm-error { + color: #ff008c; +} + +.cm-invalidchar { + color: #ff008c; +} + +.CodeMirror-composing { + border-bottom: 2px solid; +} + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket { + color: #0b0; +} + +div.CodeMirror span.CodeMirror-nonmatchingbracket { + color: #a22; +} + +.CodeMirror-matchingtag { + background: rgb(255 150 0 / 30%); +} + +.CodeMirror-activeline-background { + background: #e8f2ff; +} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror-scroll { + position: relative; + height: 100%; + padding-bottom: 30px; + margin-right: -30px; + + /* 30px is the magic margin used to hide the element's real scrollbars */ + + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; + overflow: scroll !important; /* Things will break if this is overridden */ + outline: none; /* Prevent dragging from highlighting the element */ +} + +.CodeMirror-sizer { + position: relative; + margin-bottom: 20px !important; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, +.CodeMirror-hscrollbar, +.CodeMirror-scrollbar-filler, +.CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} + +.CodeMirror-vscrollbar { + top: 0; + right: 0; + overflow-x: hidden; + overflow-y: scroll; +} + +.CodeMirror-hscrollbar { + bottom: 0; + left: 0; + overflow-x: scroll; + overflow-y: hidden; +} + +.CodeMirror-scrollbar-filler { + right: 0; + bottom: 0; +} + +.CodeMirror-gutter-filler { + bottom: 0; + left: 0; +} + +.CodeMirror-gutter { + display: inline-block; + height: 100%; + margin-bottom: -30px; + white-space: normal; + vertical-align: top; +} + +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} + +.CodeMirror-gutter-background { + position: absolute; + top: 0; + bottom: 0; + z-index: 4; +} + +.CodeMirror-gutter-elt { + position: absolute; + z-index: 4; + cursor: default; +} + +.CodeMirror-gutter-wrapper ::selection { + background-color: transparent; +} + +.CodeMirrorwrapper ::selection { + background-color: transparent; +} + +.CodeMirror pre { + position: relative; + z-index: 2; + padding: 0 4px; /* Horizontal padding of content */ + margin: 0; + overflow: visible; + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; + word-wrap: normal; + white-space: pre; + background: transparent; + border-width: 0; + + /* Reset some styles that the rest of the page might have set */ + border-radius: 0; + -webkit-tap-highlight-color: transparent; + font-variant-ligatures: contextual; +} + +.CodeMirror-wrap pre { + word-break: normal; + word-wrap: break-word; + white-space: pre-wrap; +} + +.CodeMirror-linebackground { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: 0.1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-rtl pre { + direction: rtl; +} + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-measure pre { + position: static; +} + +div.CodeMirror-cursors { + position: relative; + z-index: 3; + visibility: hidden; +} + +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { + background: #d9d9d9; +} + +.CodeMirror-focused .CodeMirror-selected { + background: #d7d4f0; +} + +.CodeMirror-crosshair { + cursor: crosshair; +} + +.CodeMirror-line::selection, +.CodeMirror-line > span::selection, +.CodeMirror-line > span > span::selection { + background: #d7d4f0; +} + +.cm-searching { + background-color: #ffa; + background-color: rgb(255 255 0 / 40%); +} + +/* Used to force a border model for a node */ +.cm-force-border { + padding-right: 0.1px; +} + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack::after { + content: ''; +} + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { + background: none; +} diff --git a/src/components/CodeEditor/src/json-preview/JsonPreview.vue b/src/components/CodeEditor/src/json-preview/JsonPreview.vue new file mode 100644 index 0000000..75890c3 --- /dev/null +++ b/src/components/CodeEditor/src/json-preview/JsonPreview.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/CodeEditor/src/monacoEditor/MonacoEditor.vue b/src/components/CodeEditor/src/monacoEditor/MonacoEditor.vue new file mode 100644 index 0000000..e3d3229 --- /dev/null +++ b/src/components/CodeEditor/src/monacoEditor/MonacoEditor.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/components/CodeEditor/src/monacoEditor/monacoEditorType.ts b/src/components/CodeEditor/src/monacoEditor/monacoEditorType.ts new file mode 100644 index 0000000..1ae6184 --- /dev/null +++ b/src/components/CodeEditor/src/monacoEditor/monacoEditorType.ts @@ -0,0 +1,69 @@ +import { PropType } from 'vue'; + +export type Theme = 'vs' | 'hc-black' | 'vs-dark'; +export type FoldingStrategy = 'auto' | 'indentation'; +export type RenderLineHighlight = 'all' | 'line' | 'none' | 'gutter'; +export type LineNumbersType = 'on' | 'off' | 'relative' | 'interval' | ((lineNumber: number) => string); +export type WordWrapType = 'off' | 'on' | 'wordWrapColumn' | 'bounded'; +export interface Options { + automaticLayout: boolean; // 自适应布局 + foldingStrategy: FoldingStrategy; // 折叠方式 auto | indentation + renderLineHighlight: RenderLineHighlight; // 行亮 + lineNumbers: LineNumbersType; // 显示行号 + wordWrap: WordWrapType; + selectOnLineNumbers: boolean; + minimap: { + // 关闭小地图 + enabled: boolean; + }; + readOnly: boolean; // 只读 + fontSize: number; // 字体大小 + scrollBeyondLastLine: boolean; // 取消代码后面一大段空白 + overviewRulerBorder: boolean; // 不要滚动条的边框 +} + +export const defaultOptions: Options = { + automaticLayout: true, + foldingStrategy: 'indentation', + renderLineHighlight: 'all', + lineNumbers: 'on', + wordWrap: 'on', + selectOnLineNumbers: true, + minimap: { + enabled: false, + }, + readOnly: false, + fontSize: 14, + scrollBeyondLastLine: false, + overviewRulerBorder: false, +}; + +export const editorProps = { + modelValue: { + type: String as PropType, + default: null, + }, + width: { + type: [String, Number] as PropType, + default: '100%', + }, + height: { + type: [String, Number] as PropType, + default: '100%', + }, + language: { + type: String as PropType, + default: 'javascript', + }, + theme: { + type: String as PropType, + validator(value: string): boolean { + return ['vs', 'hc-black', 'vs-dark'].includes(value); + }, + default: 'vs', + }, + options: { + type: Object as PropType, + default: () => defaultOptions, + }, +}; diff --git a/src/components/CodeEditor/src/typing.ts b/src/components/CodeEditor/src/typing.ts new file mode 100644 index 0000000..34b5ed1 --- /dev/null +++ b/src/components/CodeEditor/src/typing.ts @@ -0,0 +1,5 @@ +export enum MODE { + JSON = 'application/json', + HTML = 'htmlmixed', + JS = 'javascript', +} diff --git a/src/components/ColumnDesign/index.ts b/src/components/ColumnDesign/index.ts new file mode 100644 index 0000000..e250970 --- /dev/null +++ b/src/components/ColumnDesign/index.ts @@ -0,0 +1,3 @@ +import BasicColumnDesign from './src/BasicColumnDesign.vue'; + +export { BasicColumnDesign }; diff --git a/src/components/ColumnDesign/src/BasicColumnDesign.vue b/src/components/ColumnDesign/src/BasicColumnDesign.vue new file mode 100644 index 0000000..8c9429b --- /dev/null +++ b/src/components/ColumnDesign/src/BasicColumnDesign.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/components/ColumnDesign/src/components/BtnEvent.vue b/src/components/ColumnDesign/src/components/BtnEvent.vue new file mode 100644 index 0000000..cb5f0ef --- /dev/null +++ b/src/components/ColumnDesign/src/components/BtnEvent.vue @@ -0,0 +1,431 @@ + + diff --git a/src/components/ColumnDesign/src/components/ComplexHeaderModal.vue b/src/components/ColumnDesign/src/components/ComplexHeaderModal.vue new file mode 100644 index 0000000..5ff6101 --- /dev/null +++ b/src/components/ColumnDesign/src/components/ComplexHeaderModal.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/components/ColumnDesign/src/components/ConditionMain.vue b/src/components/ColumnDesign/src/components/ConditionMain.vue new file mode 100644 index 0000000..c1f4e1f --- /dev/null +++ b/src/components/ColumnDesign/src/components/ConditionMain.vue @@ -0,0 +1,576 @@ + + + diff --git a/src/components/ColumnDesign/src/components/ConditionModal.vue b/src/components/ColumnDesign/src/components/ConditionModal.vue new file mode 100644 index 0000000..96c6d0e --- /dev/null +++ b/src/components/ColumnDesign/src/components/ConditionModal.vue @@ -0,0 +1,28 @@ + + diff --git a/src/components/ColumnDesign/src/components/DefaultSortConfigModal.vue b/src/components/ColumnDesign/src/components/DefaultSortConfigModal.vue new file mode 100644 index 0000000..ff4d2cb --- /dev/null +++ b/src/components/ColumnDesign/src/components/DefaultSortConfigModal.vue @@ -0,0 +1,109 @@ + + diff --git a/src/components/ColumnDesign/src/components/ExtraConfigModal.vue b/src/components/ColumnDesign/src/components/ExtraConfigModal.vue new file mode 100644 index 0000000..d2bd183 --- /dev/null +++ b/src/components/ColumnDesign/src/components/ExtraConfigModal.vue @@ -0,0 +1,281 @@ + + + diff --git a/src/components/ColumnDesign/src/components/FormScript.vue b/src/components/ColumnDesign/src/components/FormScript.vue new file mode 100644 index 0000000..a8a7026 --- /dev/null +++ b/src/components/ColumnDesign/src/components/FormScript.vue @@ -0,0 +1,65 @@ + + diff --git a/src/components/ColumnDesign/src/components/Main.vue b/src/components/ColumnDesign/src/components/Main.vue new file mode 100644 index 0000000..a43080b --- /dev/null +++ b/src/components/ColumnDesign/src/components/Main.vue @@ -0,0 +1,1325 @@ + + diff --git a/src/components/ColumnDesign/src/components/MainApp.vue b/src/components/ColumnDesign/src/components/MainApp.vue new file mode 100644 index 0000000..b88b375 --- /dev/null +++ b/src/components/ColumnDesign/src/components/MainApp.vue @@ -0,0 +1,839 @@ + + diff --git a/src/components/ColumnDesign/src/components/UpLoadTpl.vue b/src/components/ColumnDesign/src/components/UpLoadTpl.vue new file mode 100644 index 0000000..9fb59c6 --- /dev/null +++ b/src/components/ColumnDesign/src/components/UpLoadTpl.vue @@ -0,0 +1,79 @@ + + diff --git a/src/components/ColumnDesign/src/helper/config.ts b/src/components/ColumnDesign/src/helper/config.ts new file mode 100644 index 0000000..a66b713 --- /dev/null +++ b/src/components/ColumnDesign/src/helper/config.ts @@ -0,0 +1,180 @@ +import { + useInputList, + useDateList, + noVModelList, + noColumnShowList, + noSearchList, + systemComponentsList, + noGroupList, +} from '@/components/FormGenerator/src/helper/config'; + +const noUploadList = [ + ...noVModelList, + 'uploadFile', + 'uploadImg', + 'colorPicker', + 'popupTableSelect', + 'relationForm', + 'popupSelect', + 'calculate', + 'sign', + 'signature', + 'location', +]; + +const getSearchType = item => { + const yunzhupaasKey = item.__config__.yunzhupaasKey; + // 等于-1 模糊-2 范围-3 + const fuzzyList = [...useInputList]; + const RangeList = [...useDateList, 'timePicker', 'datePicker', 'inputNumber', 'calculate', 'rate', 'slider']; + if (RangeList.includes(yunzhupaasKey)) return 3; + if (fuzzyList.includes(yunzhupaasKey)) return 2; + return 1; +}; +const getSearchMultiple = yunzhupaasKey => { + const searchMultipleList = ['select', 'depSelect', 'roleSelect', 'userSelect', 'usersSelect', 'organizeSelect', 'posSelect', 'groupSelect']; + return searchMultipleList.includes(yunzhupaasKey); +}; +const getDefaultValue = item => { + if (item.__config__.isFromParam) return undefined; + const yunzhupaasKey = item.__config__.yunzhupaasKey; + const list = ['areaSelect', 'timePicker', 'datePicker', 'inputNumber', 'organizeSelect', 'calculate']; + return list.includes(yunzhupaasKey) || item.multiple ? [] : undefined; +}; +const defaultBtnEnableFunc = '({ row, rowIndex, onlineUtils }) => {\r\n\r\n return true \r\n}'; +const defaultFuncsData = { + afterOnload: '({ data, tableRef, onlineUtils }) => {\r\n \r\n}', + rowStyle: '({ row, rowIndex }) => {\r\n \r\n}', + cellStyle: '({ row, column, rowIndex, columnIndex }) => {\r\n \r\n}', +}; +const defaultBtnsList = [ + { show: true, value: 'add', icon: 'icon-ym icon-ym-btn-add', label: '新增', labelI18nCode: 'common.add2Text' }, + { show: false, value: 'download', icon: 'icon-ym icon-ym-btn-download', label: '导出', labelI18nCode: 'common.exportText' }, + { show: false, value: 'upload', icon: 'icon-ym icon-ym-btn-upload', label: '导入', labelI18nCode: 'common.importText' }, + { show: false, value: 'batchRemove', icon: 'icon-ym icon-ym-btn-clearn', label: '批量删除', labelI18nCode: 'common.batchDelText' }, + { show: false, value: 'batchPrint', icon: 'icon-ym icon-ym-report-icon-preview-printPreview', label: '批量打印', labelI18nCode: 'common.batchPrintText' }, +]; +const defaultAppBtnsList = defaultBtnsList.filter(o => ['add', 'batchRemove'].includes(o.value)); +const defaultColumnBtnsList = [ + { + show: true, + value: 'edit', + icon: 'icon-ym icon-ym-btn-edit', + label: '编辑', + labelI18nCode: 'common.editText', + event: { enableFunc: defaultBtnEnableFunc }, + }, + { + show: true, + value: 'remove', + icon: 'icon-ym icon-ym-btn-clearn', + label: '删除', + labelI18nCode: 'common.delText', + event: { enableFunc: defaultBtnEnableFunc }, + }, + { + show: true, + value: 'detail', + icon: 'icon-ym icon-ym-generator-menu', + label: '详情', + labelI18nCode: 'common.detailText', + event: { enableFunc: defaultBtnEnableFunc }, + }, +]; + +const defaultColumnData = { + ruleList: { matchLogic: 'and', conditionList: [] }, // 过滤规则 + searchList: [], // 查询字段 + hasSuperQuery: true, // 高级查询 + showOverflow: true, // 溢出省略 + childTableStyle: 1, // 子表样式 + showSummary: false, // 合计配置 + summaryField: [], // 合计字段 + columnList: [], // 字段列表 + columnOptions: [], // 字段列表 + defaultColumnList: [], // 所有可选择字段列表 + type: 1, //列表类型 + defaultSortConfig: [], // 默认排序配置 + viewKey: '', //视图主键 + hasPage: true, // 列表分页 + pageSize: 20, // 分页条数 + hasTreeQuery: false, //左侧树查询 + treeTitle: '左侧标题', // 树形标题 + treeTitleI18nCode: '', // 树形标题多语言标识 + treeDataSource: 'dictionary', // 树形数据来源 + treeDictionary: '', //数据字典 + treeRelation: '', // 关联字段 + treeRelationFieldSelectType: 'all', // 关联字段选择类型 + treeRelationFieldAbleIds: [], // 关联字段范围 + treeSyncType: 0, //数据加载 同步、异步 + treeSyncInterfaceId: '', + treeSyncInterfaceName: '', + treeSyncTemplateJson: [], + treePropsUrl: '', // 数据选择id + treePropsName: '', // 数据选择名称 + treeTemplateJson: [], + treePropsValue: 'id', // 主键字段 + treePropsChildren: 'children', // 子级字段 + treePropsLabel: 'fullName', // 回显字段 + groupField: '', // 分组字段 + parentField: '', // 父级字段 + printIds: [], + useColumnPermission: false, + useFormPermission: false, + useBtnPermission: false, + useDataPermission: false, + customBtnsList: [], + btnsList: defaultBtnsList, // 按钮 + columnBtnsList: defaultColumnBtnsList, // 列按钮 + funcs: { + afterOnload: '({ data, tableRef, onlineUtils }) => {\r\n \r\n}', + rowStyle: '({ row, rowIndex }) => {\r\n \r\n}', + cellStyle: '({ row, column, rowIndex, columnIndex }) => {\r\n \r\n}', + }, + uploaderTemplateJson: {}, + complexHeaderList: [], + tabConfig: { on: false, relationField: '', hasAllTab: true }, //标签面板 +}; +const defaultAppColumnData = { + ruleListApp: { matchLogic: 'and', conditionList: [] }, // 过滤规则 + searchList: [], // 查询字段 + hasSuperQuery: false, // 高级查询 + showOverflow: true, // 溢出省略 + columnList: [], // 字段列表 + columnOptions: [], + defaultColumnList: [], // 所有可选择字段列表 + type: 1, //列表类型 + defaultSortConfig: [], // 默认排序配置 + viewKey: '', //视图主键 + hasPage: true, // 列表分页 + pageSize: 20, // 分页条数 + useColumnPermission: false, + useFormPermission: false, + useBtnPermission: false, + useDataPermission: false, + customBtnsList: [], + btnsList: defaultAppBtnsList, // 按钮 + columnBtnsList: defaultColumnBtnsList, // 列按钮 + funcs: { + afterOnload: '({ data, tableRef, onlineUtils }) => {\r\n \r\n}', + }, + tabConfig: { on: false, relationField: '', hasAllTab: true }, //标签面板 +}; + +export { + noColumnShowList, + noSearchList, + systemComponentsList, + noGroupList, + noUploadList, + getSearchType, + getSearchMultiple, + getDefaultValue, + defaultBtnEnableFunc, + defaultFuncsData, + defaultColumnData, + defaultAppColumnData, + defaultBtnsList, + defaultAppBtnsList, + defaultColumnBtnsList, +}; diff --git a/src/components/ColumnDesign/style/index.less b/src/components/ColumnDesign/style/index.less new file mode 100644 index 0000000..374a87b --- /dev/null +++ b/src/components/ColumnDesign/style/index.less @@ -0,0 +1,238 @@ +@prefix-cls: ~'@{namespace}-basic-column-design'; + +.@{prefix-cls} { + position: relative; + width: 100%; + height: 100%; + .head-tabs { + position: absolute; + left: 0; + top: 0; + width: calc(100% - 350px); + height: 42px; + border-bottom: 1px solid @border-color-base1; + background: @component-background; + display: flex; + align-items: center; + justify-content: flex-end; + padding: 0 10px; + z-index: 100; + border-radius: 8px 8px 0 0; + .ant-btn { + padding: 0; + margin-left: 15px; + } + .unActive-btn { + color: @text-color !important; + &:hover { + color: @primary-color !important; + } + } + } + .column-empty-box { + width: 100%; + height: 100%; + background-color: @component-background; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + .empty-img { + width: 180px; + height: 120px; + } + p { + padding: 15px 0; + } + } + .column-design-container { + height: 100%; + width: 100%; + position: relative; + padding-top: 42px; + .main-board { + height: 100%; + width: auto; + margin: 0 350px 0 0; + padding: 10px; + overflow: auto; + overflow-x: hidden; + background-color: @component-background; + border-radius: 0 0 8px 8px; + } + .right-board { + width: 340px; + position: absolute; + right: 0; + top: 0; + height: 100%; + margin-left: 10px; + background-color: @component-background; + border-radius: 8px; + overflow: hidden; + .right-main { + position: relative; + height: calc(100% - 42px); + overflow: hidden; + box-sizing: border-box; + .scrollbar__view { + padding: 10px; + } + .right-board-form { + .ant-form-item { + margin-bottom: 18px; + } + .typeList { + display: flex; + flex-wrap: wrap; + .item:nth-child(3n + 3) { + margin-right: 0; + } + .item { + width: 100px; + margin-bottom: 15px; + margin-right: 10px; + border-bottom: unset !important; + &.view-item { + width: 150px; + .item-img { + height: 100px; + } + } + + .item-img { + width: 100%; + height: 70px; + border-radius: 4px; + overflow: hidden; + cursor: pointer; + position: relative; + border: 1px solid transparent; + img { + width: 100%; + height: 100%; + z-index: -1; + } + &.checked { + border: 1px solid @primary-color; + } + .icon-checked { + display: block; + width: 12px; + height: 12px; + border: 12px solid @primary-color; + border-left: 12px solid transparent !important; + border-top: 12px solid transparent !important; + border-bottom-right-radius: 4px; + position: absolute; + right: -1px; + bottom: -1px; + .anticon-check { + position: absolute; + top: -1px; + left: -1px; + font-size: 12px; + color: #fff; + } + } + } + .item-name { + font-size: 12px; + color: @text-color-secondary; + margin-top: 10px; + text-align: center; + } + } + } + .right-radio { + .ant-radio-button-wrapper { + padding: 0 11px; + } + } + .btnsList { + width: 100%; + .btnsList-cell { + display: flex; + align-items: flex-start; + margin-bottom: 10px; + width: 100%; + } + .ant-checkbox-wrapper { + width: 90px; + flex-shrink: 0; + line-height: 32px; + } + .btn-upload { + width: 100%; + margin-top: 10px; + } + } + .btn-cap { + margin-bottom: 10px; + color: @text-color-secondary; + } + .custom-btns-list { + .custom-item { + display: flex; + align-items: center; + border: 1px dashed @component-background; + box-sizing: border-box; + & + .custom-item { + margin-top: 4px; + } + &.sortable-chosen { + border: 1px dashed @primary-color; + } + .ant-input + .ant-input { + margin-left: 4px; + } + .ant-input-group-addon { + cursor: pointer; + padding: 0; + span { + display: inline-block; + line-height: 30px; + padding: 0 11px; + } + } + .custom-line-icon { + line-height: 32px; + font-size: 22px; + padding: 0 4px; + color: #606266; + .icon-ym-btn-clearn { + font-size: 18px; + } + .icon-ym-darg { + font-size: 20px; + line-height: 31px; + display: inline-block; + cursor: move; + } + &.option-drag { + padding-left: 0; + } + &.close-btn { + padding-right: 0; + } + } + .custom-line-value { + width: 90px; + flex-shrink: 0; + line-height: 32px; + font-size: 14px; + } + .close-btn { + cursor: pointer; + color: @error-color; + } + } + .add-btn .ant-btn { + padding: 0; + } + } + } + } + } + } +} diff --git a/src/components/CommonModal/index.ts b/src/components/CommonModal/index.ts new file mode 100644 index 0000000..b59d812 --- /dev/null +++ b/src/components/CommonModal/index.ts @@ -0,0 +1,24 @@ +import { withInstall } from '@/utils'; +import interfaceModal from './src/InterfaceModal.vue'; +import billRuleModal from './src/BillRuleModal.vue'; +import selectModal from './src/SelectModal.vue'; +import previewModal from './src/PreviewModal.vue'; +import exportModal from './src/ExportModal.vue'; +import importModal from './src/ImportModal.vue'; +import superQueryModal from './src/SuperQueryModal.vue'; +import selectFlowModal from './src/SelectFlowModal.vue'; +import dataSetModal from './src/DataSetModal/index.vue'; +import userSelect from './src/UserSelect.vue'; +import validatePopover from './src/ValidatePopover.vue'; + +export const InterfaceModal = withInstall(interfaceModal); +export const BillRuleModal = withInstall(billRuleModal); +export const SelectModal = withInstall(selectModal); +export const PreviewModal = withInstall(previewModal); +export const ExportModal = withInstall(exportModal); +export const ImportModal = withInstall(importModal); +export const SuperQueryModal = withInstall(superQueryModal); +export const SelectFlowModal = withInstall(selectFlowModal); +export const DataSetModal = withInstall(dataSetModal); +export const UserSelect = withInstall(userSelect); +export const ValidatePopover = withInstall(validatePopover); diff --git a/src/components/CommonModal/src/BillRuleModal.vue b/src/components/CommonModal/src/BillRuleModal.vue new file mode 100644 index 0000000..59170f0 --- /dev/null +++ b/src/components/CommonModal/src/BillRuleModal.vue @@ -0,0 +1,160 @@ + + + diff --git a/src/components/CommonModal/src/DataSetModal/FilterConfigDrawer.vue b/src/components/CommonModal/src/DataSetModal/FilterConfigDrawer.vue new file mode 100644 index 0000000..d15d4c7 --- /dev/null +++ b/src/components/CommonModal/src/DataSetModal/FilterConfigDrawer.vue @@ -0,0 +1,270 @@ + + + diff --git a/src/components/CommonModal/src/DataSetModal/RelationConfigDrawer.vue b/src/components/CommonModal/src/DataSetModal/RelationConfigDrawer.vue new file mode 100644 index 0000000..8510c8f --- /dev/null +++ b/src/components/CommonModal/src/DataSetModal/RelationConfigDrawer.vue @@ -0,0 +1,345 @@ + + + diff --git a/src/components/CommonModal/src/DataSetModal/TableConfigDrawer.vue b/src/components/CommonModal/src/DataSetModal/TableConfigDrawer.vue new file mode 100644 index 0000000..35d3586 --- /dev/null +++ b/src/components/CommonModal/src/DataSetModal/TableConfigDrawer.vue @@ -0,0 +1,420 @@ + + + diff --git a/src/components/CommonModal/src/DataSetModal/TableSelect.vue b/src/components/CommonModal/src/DataSetModal/TableSelect.vue new file mode 100644 index 0000000..aba2059 --- /dev/null +++ b/src/components/CommonModal/src/DataSetModal/TableSelect.vue @@ -0,0 +1,141 @@ + + + diff --git a/src/components/CommonModal/src/DataSetModal/index.vue b/src/components/CommonModal/src/DataSetModal/index.vue new file mode 100644 index 0000000..9e75bc9 --- /dev/null +++ b/src/components/CommonModal/src/DataSetModal/index.vue @@ -0,0 +1,870 @@ + + + diff --git a/src/components/CommonModal/src/ExportModal.vue b/src/components/CommonModal/src/ExportModal.vue new file mode 100644 index 0000000..e4efc21 --- /dev/null +++ b/src/components/CommonModal/src/ExportModal.vue @@ -0,0 +1,78 @@ + + diff --git a/src/components/CommonModal/src/ImportModal.vue b/src/components/CommonModal/src/ImportModal.vue new file mode 100644 index 0000000..00ebf6d --- /dev/null +++ b/src/components/CommonModal/src/ImportModal.vue @@ -0,0 +1,384 @@ + + diff --git a/src/components/CommonModal/src/InterfaceModal.vue b/src/components/CommonModal/src/InterfaceModal.vue new file mode 100644 index 0000000..32ebe3d --- /dev/null +++ b/src/components/CommonModal/src/InterfaceModal.vue @@ -0,0 +1,235 @@ + + + diff --git a/src/components/CommonModal/src/PreviewModal.vue b/src/components/CommonModal/src/PreviewModal.vue new file mode 100644 index 0000000..69c84ac --- /dev/null +++ b/src/components/CommonModal/src/PreviewModal.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/components/CommonModal/src/SelectFlowModal.vue b/src/components/CommonModal/src/SelectFlowModal.vue new file mode 100644 index 0000000..0f4dc1f --- /dev/null +++ b/src/components/CommonModal/src/SelectFlowModal.vue @@ -0,0 +1,45 @@ + + diff --git a/src/components/CommonModal/src/SelectModal.vue b/src/components/CommonModal/src/SelectModal.vue new file mode 100644 index 0000000..9c04d21 --- /dev/null +++ b/src/components/CommonModal/src/SelectModal.vue @@ -0,0 +1,302 @@ + + + diff --git a/src/components/CommonModal/src/SuperQueryModal.vue b/src/components/CommonModal/src/SuperQueryModal.vue new file mode 100644 index 0000000..c62e265 --- /dev/null +++ b/src/components/CommonModal/src/SuperQueryModal.vue @@ -0,0 +1,177 @@ + + diff --git a/src/components/CommonModal/src/UserSelect.vue b/src/components/CommonModal/src/UserSelect.vue new file mode 100644 index 0000000..17bf362 --- /dev/null +++ b/src/components/CommonModal/src/UserSelect.vue @@ -0,0 +1,228 @@ + + + diff --git a/src/components/CommonModal/src/ValidatePopover.vue b/src/components/CommonModal/src/ValidatePopover.vue new file mode 100644 index 0000000..51d1a84 --- /dev/null +++ b/src/components/CommonModal/src/ValidatePopover.vue @@ -0,0 +1,150 @@ + + + diff --git a/src/components/CommonPopover/index.ts b/src/components/CommonPopover/index.ts new file mode 100644 index 0000000..1066c59 --- /dev/null +++ b/src/components/CommonPopover/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import History from './src/History.vue'; + +export const HistoryPopover = withInstall(History); diff --git a/src/components/CommonPopover/src/History.vue b/src/components/CommonPopover/src/History.vue new file mode 100644 index 0000000..c222d84 --- /dev/null +++ b/src/components/CommonPopover/src/History.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/Container/index.ts b/src/components/Container/index.ts new file mode 100644 index 0000000..62979dd --- /dev/null +++ b/src/components/Container/index.ts @@ -0,0 +1,10 @@ +import { withInstall } from '@/utils'; +import collapseContainer from './src/collapse/CollapseContainer.vue'; +import scrollContainer from './src/ScrollContainer.vue'; +import lazyContainer from './src/LazyContainer.vue'; + +export const CollapseContainer = withInstall(collapseContainer); +export const ScrollContainer = withInstall(scrollContainer); +export const LazyContainer = withInstall(lazyContainer); + +export * from './src/typing'; diff --git a/src/components/Container/src/LazyContainer.vue b/src/components/Container/src/LazyContainer.vue new file mode 100644 index 0000000..7295a73 --- /dev/null +++ b/src/components/Container/src/LazyContainer.vue @@ -0,0 +1,138 @@ + + diff --git a/src/components/Container/src/ScrollContainer.vue b/src/components/Container/src/ScrollContainer.vue new file mode 100644 index 0000000..79a5f96 --- /dev/null +++ b/src/components/Container/src/ScrollContainer.vue @@ -0,0 +1,93 @@ + + + + diff --git a/src/components/Container/src/collapse/CollapseContainer.vue b/src/components/Container/src/collapse/CollapseContainer.vue new file mode 100644 index 0000000..680d976 --- /dev/null +++ b/src/components/Container/src/collapse/CollapseContainer.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/components/Container/src/collapse/CollapseHeader.vue b/src/components/Container/src/collapse/CollapseHeader.vue new file mode 100644 index 0000000..60247a9 --- /dev/null +++ b/src/components/Container/src/collapse/CollapseHeader.vue @@ -0,0 +1,41 @@ + diff --git a/src/components/Container/src/typing.ts b/src/components/Container/src/typing.ts new file mode 100644 index 0000000..86c03be --- /dev/null +++ b/src/components/Container/src/typing.ts @@ -0,0 +1,17 @@ +export type ScrollType = 'default' | 'main'; + +export interface CollapseContainerOptions { + canExpand?: boolean; + title?: string; + helpMessage?: Array | string; +} +export interface ScrollContainerOptions { + enableScroll?: boolean; + type?: ScrollType; +} + +export type ScrollActionType = RefType<{ + scrollBottom: () => void; + getScrollWrap: () => Nullable; + scrollTo: (top: number) => void; +}>; diff --git a/src/components/ContextMenu/index.ts b/src/components/ContextMenu/index.ts new file mode 100644 index 0000000..ed294d7 --- /dev/null +++ b/src/components/ContextMenu/index.ts @@ -0,0 +1,3 @@ +export { createContextMenu, destroyContextMenu } from './src/createContextMenu'; + +export * from './src/typing'; diff --git a/src/components/ContextMenu/src/ContextMenu.vue b/src/components/ContextMenu/src/ContextMenu.vue new file mode 100644 index 0000000..8fde646 --- /dev/null +++ b/src/components/ContextMenu/src/ContextMenu.vue @@ -0,0 +1,208 @@ + + diff --git a/src/components/ContextMenu/src/createContextMenu.ts b/src/components/ContextMenu/src/createContextMenu.ts new file mode 100644 index 0000000..394d4cb --- /dev/null +++ b/src/components/ContextMenu/src/createContextMenu.ts @@ -0,0 +1,75 @@ +import contextMenuVue from './ContextMenu.vue'; +import { isClient } from '@/utils/is'; +import { CreateContextOptions, ContextMenuProps } from './typing'; +import { createVNode, render } from 'vue'; + +const menuManager: { + domList: Element[]; + resolve: Fn; +} = { + domList: [], + resolve: () => {}, +}; + +export const createContextMenu = function (options: CreateContextOptions) { + const { event } = options || {}; + + event && event?.preventDefault(); + + if (!isClient) { + return; + } + return new Promise(resolve => { + const body = document.body; + + const container = document.createElement('div'); + const propsData: Partial = {}; + if (options.styles) { + propsData.styles = options.styles; + } + + if (options.items) { + propsData.items = options.items; + } + + if (options.event) { + propsData.customEvent = event; + propsData.axis = { x: event.clientX, y: event.clientY }; + } + + const vm = createVNode(contextMenuVue, propsData); + render(vm, container); + + const handleClick = function () { + menuManager.resolve(''); + }; + + menuManager.domList.push(container); + + const remove = function () { + menuManager.domList.forEach((dom: Element) => { + try { + dom && body.removeChild(dom); + } catch (error) {} + }); + body.removeEventListener('click', handleClick); + body.removeEventListener('scroll', handleClick); + }; + + menuManager.resolve = function (arg) { + remove(); + resolve(arg); + }; + remove(); + body.appendChild(container); + body.addEventListener('click', handleClick); + body.addEventListener('scroll', handleClick); + }); +}; + +export const destroyContextMenu = function () { + if (menuManager) { + menuManager.resolve(''); + menuManager.domList = []; + } +}; diff --git a/src/components/ContextMenu/src/typing.ts b/src/components/ContextMenu/src/typing.ts new file mode 100644 index 0000000..63d3d37 --- /dev/null +++ b/src/components/ContextMenu/src/typing.ts @@ -0,0 +1,36 @@ +export interface Axis { + x: number; + y: number; +} + +export interface ContextMenuItem { + label: string; + icon?: string; + hidden?: boolean; + disabled?: boolean; + handler?: Fn; + divider?: boolean; + children?: ContextMenuItem[]; +} +export interface CreateContextOptions { + event: MouseEvent; + icon?: string; + styles?: any; + items?: ContextMenuItem[]; +} + +export interface ContextMenuProps { + event?: MouseEvent; + styles?: any; + items: ContextMenuItem[]; + customEvent?: MouseEvent; + axis?: Axis; + width?: number; + showIcon?: boolean; +} + +export interface ItemContentProps { + showIcon: boolean | undefined; + item: ContextMenuItem; + handler: Fn; +} diff --git a/src/components/CountDown/index.ts b/src/components/CountDown/index.ts new file mode 100644 index 0000000..0da9d31 --- /dev/null +++ b/src/components/CountDown/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '@/utils'; +import countButton from './src/CountButton.vue'; +import countdownInput from './src/CountdownInput.vue'; + +export const CountdownInput = withInstall(countdownInput); +export const CountButton = withInstall(countButton); diff --git a/src/components/CountDown/src/CountButton.vue b/src/components/CountDown/src/CountButton.vue new file mode 100644 index 0000000..7e53c0a --- /dev/null +++ b/src/components/CountDown/src/CountButton.vue @@ -0,0 +1,60 @@ + + diff --git a/src/components/CountDown/src/CountdownInput.vue b/src/components/CountDown/src/CountdownInput.vue new file mode 100644 index 0000000..b23ff06 --- /dev/null +++ b/src/components/CountDown/src/CountdownInput.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/components/CountDown/src/useCountdown.ts b/src/components/CountDown/src/useCountdown.ts new file mode 100644 index 0000000..316d69a --- /dev/null +++ b/src/components/CountDown/src/useCountdown.ts @@ -0,0 +1,51 @@ +import { ref, unref } from 'vue'; +import { tryOnUnmounted } from '@vueuse/core'; + +export function useCountdown(count: number) { + const currentCount = ref(count); + + const isStart = ref(false); + + let timerId: ReturnType | null; + + function clear() { + timerId && window.clearInterval(timerId); + } + + function stop() { + isStart.value = false; + clear(); + timerId = null; + } + + function start() { + if (unref(isStart) || !!timerId) { + return; + } + isStart.value = true; + timerId = setInterval(() => { + if (unref(currentCount) === 1) { + stop(); + currentCount.value = count; + } else { + currentCount.value -= 1; + } + }, 1000); + } + + function reset() { + currentCount.value = count; + stop(); + } + + function restart() { + reset(); + start(); + } + + tryOnUnmounted(() => { + reset(); + }); + + return { start, reset, restart, clear, stop, currentCount, isStart }; +} diff --git a/src/components/CountTo/index.ts b/src/components/CountTo/index.ts new file mode 100644 index 0000000..0c41941 --- /dev/null +++ b/src/components/CountTo/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import countTo from './src/CountTo.vue'; + +export const CountTo = withInstall(countTo); diff --git a/src/components/CountTo/src/CountTo.vue b/src/components/CountTo/src/CountTo.vue new file mode 100644 index 0000000..e98d094 --- /dev/null +++ b/src/components/CountTo/src/CountTo.vue @@ -0,0 +1,110 @@ + + diff --git a/src/components/Cropper/index.ts b/src/components/Cropper/index.ts new file mode 100644 index 0000000..df20be0 --- /dev/null +++ b/src/components/Cropper/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '@/utils'; +import cropperImage from './src/Cropper.vue'; +import avatarCropper from './src/CropperAvatar.vue'; + +export * from './src/typing'; +export const CropperImage = withInstall(cropperImage); +export const CropperAvatar = withInstall(avatarCropper); diff --git a/src/components/Cropper/src/CopperModal.vue b/src/components/Cropper/src/CopperModal.vue new file mode 100644 index 0000000..f4e9a88 --- /dev/null +++ b/src/components/Cropper/src/CopperModal.vue @@ -0,0 +1,221 @@ + + + + diff --git a/src/components/Cropper/src/Cropper.vue b/src/components/Cropper/src/Cropper.vue new file mode 100644 index 0000000..a755ef3 --- /dev/null +++ b/src/components/Cropper/src/Cropper.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/components/Cropper/src/CropperAvatar.vue b/src/components/Cropper/src/CropperAvatar.vue new file mode 100644 index 0000000..28cc817 --- /dev/null +++ b/src/components/Cropper/src/CropperAvatar.vue @@ -0,0 +1,135 @@ + + + + diff --git a/src/components/Cropper/src/typing.ts b/src/components/Cropper/src/typing.ts new file mode 100644 index 0000000..e76cc6f --- /dev/null +++ b/src/components/Cropper/src/typing.ts @@ -0,0 +1,8 @@ +import type Cropper from 'cropperjs'; + +export interface CropendResult { + imgBase64: string; + imgInfo: Cropper.Data; +} + +export type { Cropper }; diff --git a/src/components/Description/index.ts b/src/components/Description/index.ts new file mode 100644 index 0000000..c75c4db --- /dev/null +++ b/src/components/Description/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '@/utils'; +import description from './src/Description.vue'; + +export * from './src/typing'; +export { useDescription } from './src/useDescription'; +export const Description = withInstall(description); diff --git a/src/components/Description/src/Description.vue b/src/components/Description/src/Description.vue new file mode 100644 index 0000000..d686486 --- /dev/null +++ b/src/components/Description/src/Description.vue @@ -0,0 +1,184 @@ + diff --git a/src/components/Description/src/typing.ts b/src/components/Description/src/typing.ts new file mode 100644 index 0000000..a2f96e2 --- /dev/null +++ b/src/components/Description/src/typing.ts @@ -0,0 +1,47 @@ +import type { VNode, CSSProperties } from 'vue'; +import type { CollapseContainerOptions } from '@/components/Container/index'; +import type { DescriptionsProps } from 'ant-design-vue/es/descriptions/index'; + +export interface DescItem { + labelMinWidth?: number; + contentMinWidth?: number; + labelStyle?: CSSProperties; + field: string; + label: string | VNode | JSX.Element; + // Merge column + span?: number; + show?: (...arg: any) => boolean; + // render + render?: (val: any, data: Recordable) => VNode | undefined | JSX.Element | Element | string | number; +} + +export interface DescriptionProps extends DescriptionsProps { + // Whether to include the collapse component + useCollapse?: boolean; + /** + * item configuration + * @type DescItem + */ + schema: DescItem[]; + /** + * 数据 + * @type object + */ + data: Recordable; + /** + * Built-in CollapseContainer component configuration + * @type CollapseContainerOptions + */ + collapseOptions?: CollapseContainerOptions; +} + +export interface DescInstance { + setDescProps(descProps: Partial): void; +} + +export type Register = (descInstance: DescInstance) => void; + +/** + * @description: + */ +export type UseDescReturnType = [Register, DescInstance]; diff --git a/src/components/Description/src/useDescription.ts b/src/components/Description/src/useDescription.ts new file mode 100644 index 0000000..062f53c --- /dev/null +++ b/src/components/Description/src/useDescription.ts @@ -0,0 +1,28 @@ +import type { DescriptionProps, DescInstance, UseDescReturnType } from './typing'; +import { ref, getCurrentInstance, unref } from 'vue'; +import { isProdMode } from '@/utils/env'; + +export function useDescription(props?: Partial): UseDescReturnType { + if (!getCurrentInstance()) { + throw new Error('useDescription() can only be used inside setup() or functional components!'); + } + const desc = ref>(null); + const loaded = ref(false); + + function register(instance: DescInstance) { + if (unref(loaded) && isProdMode()) { + return; + } + desc.value = instance; + props && instance.setDescProps(props); + loaded.value = true; + } + + const methods: DescInstance = { + setDescProps: (descProps: Partial): void => { + unref(desc)?.setDescProps(descProps); + }, + }; + + return [register, methods]; +} diff --git a/src/components/Drawer/index.ts b/src/components/Drawer/index.ts new file mode 100644 index 0000000..0eb1a16 --- /dev/null +++ b/src/components/Drawer/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '@/utils'; +import basicDrawer from './src/BasicDrawer.vue'; + +export const BasicDrawer = withInstall(basicDrawer); +export * from './src/typing'; +export { useDrawer, useDrawerInner } from './src/useDrawer'; diff --git a/src/components/Drawer/src/BasicDrawer.vue b/src/components/Drawer/src/BasicDrawer.vue new file mode 100644 index 0000000..e4905f3 --- /dev/null +++ b/src/components/Drawer/src/BasicDrawer.vue @@ -0,0 +1,259 @@ + + + diff --git a/src/components/Drawer/src/components/DrawerFooter.vue b/src/components/Drawer/src/components/DrawerFooter.vue new file mode 100644 index 0000000..2536bd6 --- /dev/null +++ b/src/components/Drawer/src/components/DrawerFooter.vue @@ -0,0 +1,93 @@ + + + + diff --git a/src/components/Drawer/src/components/DrawerHeader.vue b/src/components/Drawer/src/components/DrawerHeader.vue new file mode 100644 index 0000000..669828e --- /dev/null +++ b/src/components/Drawer/src/components/DrawerHeader.vue @@ -0,0 +1,74 @@ + + + + diff --git a/src/components/Drawer/src/props.ts b/src/components/Drawer/src/props.ts new file mode 100644 index 0000000..ae8445e --- /dev/null +++ b/src/components/Drawer/src/props.ts @@ -0,0 +1,50 @@ +import type { PropType } from 'vue'; + +import { useI18n } from '@/hooks/web/useI18n'; +const { t } = useI18n(); + +export const footerProps = { + confirmLoading: { type: Boolean }, + /** + * @description: Show close button + */ + showCancelBtn: { type: Boolean, default: true }, + cancelButtonProps: Object as PropType, + cancelText: { type: String, default: t('common.cancelText') }, + /** + * @description: Show confirmation button + */ + showOkBtn: { type: Boolean, default: true }, + okButtonProps: Object as PropType, + okText: { type: String, default: t('common.okText') }, + okType: { type: String, default: 'primary' }, + continueText: { type: String, default: t('common.continueText') }, + continueType: { type: String, default: 'default' }, + showContinueBtn: { type: Boolean, default: false }, + continueButtonProps: Object as PropType, + continueLoading: { type: Boolean }, + showFooter: { type: Boolean }, + footerHeight: { + type: [String, Number] as PropType, + default: 60, + }, +}; +export const basicProps = { + isDetail: { type: Boolean }, + title: { type: String, default: '' }, + loadingText: { type: String }, + showDetailBack: { type: Boolean, default: true }, + open: { type: Boolean }, + loading: { type: Boolean }, + maskClosable: { type: Boolean, default: true }, + keyboard: { type: Boolean, default: false }, + getContainer: { + type: [Object, String] as PropType, + }, + closeFunc: { + type: [Function, Object] as PropType, + default: null, + }, + destroyOnClose: { type: Boolean }, + ...footerProps, +}; diff --git a/src/components/Drawer/src/typing.ts b/src/components/Drawer/src/typing.ts new file mode 100644 index 0000000..59741a0 --- /dev/null +++ b/src/components/Drawer/src/typing.ts @@ -0,0 +1,204 @@ +import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes'; +import type { CSSProperties, VNodeChild, ComputedRef } from 'vue'; +import type { ScrollContainerOptions } from '@/components/Container/index'; + +export interface DrawerInstance { + setDrawerProps: (props: Partial) => void; + emitOpen?: (open: boolean, uid: number) => void; +} + +export interface ReturnMethods extends DrawerInstance { + openDrawer: (open?: boolean, data?: T, openOnSet?: boolean) => void; + closeDrawer: () => void; + getOpen?: ComputedRef; +} + +export type RegisterFn = (drawerInstance: DrawerInstance, uuid?: string) => void; + +export interface ReturnInnerMethods extends DrawerInstance { + closeDrawer: () => void; + changeLoading: (loading: boolean) => void; + changeOkLoading: (loading: boolean) => void; + changeContinueLoading: (loading: boolean) => void; + getOpen?: ComputedRef; +} + +export type UseDrawerReturnType = [RegisterFn, ReturnMethods]; + +export type UseDrawerInnerReturnType = [RegisterFn, ReturnInnerMethods]; + +export interface DrawerFooterProps { + showOkBtn: boolean; + showContinueBtn: boolean; + showCancelBtn: boolean; + /** + * Text of the Cancel button + * @default 'cancel' + * @type string + */ + cancelText: string; + /** + * Text of the OK button + * @default 'OK' + * @type string + */ + okText: string; + + continueText?: string; + + /** + * Button type of the OK button + * @default 'primary' + * @type string + */ + okType: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; + + continueType?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; + /** + * The ok button props, follow jsx rules + * @type object + */ + okButtonProps: { props: ButtonProps; on: {} }; + + continueButtonProps: { props: ButtonProps; on: {} }; + + /** + * The cancel button props, follow jsx rules + * @type object + */ + cancelButtonProps: { props: ButtonProps; on: {} }; + /** + * Whether to apply loading visual effect for OK button or not + * @default false + * @type boolean + */ + confirmLoading: boolean; + + continueLoading?: boolean; + + showFooter: boolean; + footerHeight: string | number; +} +export interface DrawerProps extends DrawerFooterProps { + isDetail?: boolean; + loading?: boolean; + showDetailBack?: boolean; + open?: boolean; + /** + * Built-in ScrollContainer component configuration + * @type ScrollContainerOptions + */ + scrollOptions?: ScrollContainerOptions; + closeFunc?: () => Promise; + triggerWindowResize?: boolean; + /** + * Whether a close (x) button is open on top right of the Drawer dialog or not. + * @default true + * @type boolean + */ + closable?: boolean; + + /** + * Whether to unmount child components on closing drawer or not. + * @default false + * @type boolean + */ + destroyOnClose?: boolean; + + /** + * Return the mounted node for Drawer. + * @default 'body' + * @type any ( HTMLElement| () => HTMLElement | string) + */ + getContainer?: () => HTMLElement | string; + + /** + * Whether to show mask or not. + * @default true + * @type boolean + */ + mask?: boolean; + + /** + * Clicking on the mask (area outside the Drawer) to close the Drawer or not. + * @default true + * @type boolean + */ + maskClosable?: boolean; + + /** + * Style for Drawer's mask element. + * @default {} + * @type object + */ + maskStyle?: CSSProperties; + + /** + * The title for Drawer. + * @type any (string | slot) + */ + title?: VNodeChild | JSX.Element; + /** + * The class name of the container of the Drawer dialog. + * @type string + */ + wrapClassName?: string; + rootClassName?: string; + class?: string; + /** + * Style of wrapper element which **contains mask** compare to `drawerStyle` + * @type object + */ + wrapStyle?: CSSProperties; + + /** + * Style of the popup layer element + * @type object + */ + drawerStyle?: CSSProperties; + + /** + * Style of floating layer, typically used for adjusting its position. + * @type object + */ + bodyStyle?: CSSProperties; + headerStyle?: CSSProperties; + + /** + * Width of the Drawer dialog. + * @default 256 + * @type string | number + */ + width?: string | number; + + /** + * placement is top or bottom, height of the Drawer dialog. + * @type string | number + */ + height?: string | number; + + /** + * The z-index of the Drawer. + * @default 1000 + * @type number + */ + zIndex?: number; + + /** + * The placement of the Drawer. + * @default 'right' + * @type string + */ + placement?: 'top' | 'right' | 'bottom' | 'left'; + afterOpenChange?: (open?: boolean) => void; + keyboard?: boolean; + /** + * Specify a callback that will be called when a user clicks mask, close button or Cancel button. + */ + onClose?: (e?: Event) => void; +} +export interface DrawerActionType { + scrollBottom: () => void; + scrollTo: (to: number) => void; + getScrollWrap: () => Element | null; +} diff --git a/src/components/Drawer/src/useDrawer.ts b/src/components/Drawer/src/useDrawer.ts new file mode 100644 index 0000000..cf1df90 --- /dev/null +++ b/src/components/Drawer/src/useDrawer.ts @@ -0,0 +1,151 @@ +import type { UseDrawerReturnType, DrawerInstance, ReturnMethods, DrawerProps, UseDrawerInnerReturnType } from './typing'; +import { ref, getCurrentInstance, unref, reactive, watchEffect, nextTick, toRaw, computed } from 'vue'; +import { isProdMode } from '@/utils/env'; +import { isFunction } from '@/utils/is'; +import { tryOnUnmounted } from '@vueuse/core'; +import { isEqual } from 'lodash-es'; +import { error } from '@/utils/log'; + +const dataTransferRef = reactive({}); + +const openData = reactive<{ [key: number]: boolean }>({}); + +/** + * @description: Applicable to separate drawer and call outside + */ +export function useDrawer(): UseDrawerReturnType { + if (!getCurrentInstance()) { + throw new Error('useDrawer() can only be used inside setup() or functional components!'); + } + const drawer = ref(null); + const loaded = ref>(false); + const uid = ref(''); + + function register(drawerInstance: DrawerInstance, uuid: string) { + isProdMode() && + tryOnUnmounted(() => { + drawer.value = null; + loaded.value = null; + dataTransferRef[unref(uid)] = null; + }); + + if (unref(loaded) && isProdMode() && drawerInstance === unref(drawer)) { + return; + } + uid.value = uuid; + drawer.value = drawerInstance; + loaded.value = true; + + drawerInstance.emitOpen = (open: boolean, uid: number) => { + openData[uid] = open; + }; + } + + const getInstance = () => { + const instance = unref(drawer); + if (!instance) { + error('useDrawer instance is undefined!'); + } + return instance; + }; + + const methods: ReturnMethods = { + setDrawerProps: (props: Partial): void => { + getInstance()?.setDrawerProps(props); + }, + + getOpen: computed((): boolean => { + return openData[~~unref(uid)]; + }), + + openDrawer: (open = true, data?: T, openOnSet = true): void => { + getInstance()?.setDrawerProps({ + open, + }); + if (!data) return; + + if (openOnSet) { + dataTransferRef[unref(uid)] = null; + dataTransferRef[unref(uid)] = toRaw(data); + return; + } + const equal = isEqual(toRaw(dataTransferRef[unref(uid)]), toRaw(data)); + if (!equal) { + dataTransferRef[unref(uid)] = toRaw(data); + } + }, + closeDrawer: () => { + getInstance()?.setDrawerProps({ open: false }); + }, + }; + + return [register, methods]; +} + +export const useDrawerInner = (callbackFn?: Fn): UseDrawerInnerReturnType => { + const drawerInstanceRef = ref>(null); + const currentInstance = getCurrentInstance(); + const uidRef = ref(''); + + if (!getCurrentInstance()) { + throw new Error('useDrawerInner() can only be used inside setup() or functional components!'); + } + + const getInstance = () => { + const instance = unref(drawerInstanceRef); + if (!instance) { + error('useDrawerInner instance is undefined!'); + return; + } + return instance; + }; + + const register = (drawerInstance: DrawerInstance, uuid: string) => { + isProdMode() && + tryOnUnmounted(() => { + drawerInstanceRef.value = null; + }); + + uidRef.value = uuid; + drawerInstanceRef.value = drawerInstance; + currentInstance?.emit('register', drawerInstance, uuid); + }; + + watchEffect(() => { + const data = dataTransferRef[unref(uidRef)]; + if (!data) return; + if (!callbackFn || !isFunction(callbackFn)) return; + nextTick(() => { + callbackFn(data); + }); + }); + + return [ + register, + { + changeLoading: (loading = true) => { + getInstance()?.setDrawerProps({ loading }); + }, + + changeOkLoading: (loading = true) => { + getInstance()?.setDrawerProps({ confirmLoading: loading }); + }, + + changeContinueLoading: (loading = true) => { + getInstance()?.setDrawerProps({ continueLoading: loading }); + }, + + getOpen: computed((): boolean => { + return openData[~~unref(uidRef)]; + }), + + closeDrawer: () => { + getInstance()?.setDrawerProps({ open: false }); + }, + + setDrawerProps: (props: Partial) => { + getInstance()?.setDrawerProps(props); + }, + }, + ]; +}; diff --git a/src/components/Dropdown/index.ts b/src/components/Dropdown/index.ts new file mode 100644 index 0000000..98b3041 --- /dev/null +++ b/src/components/Dropdown/index.ts @@ -0,0 +1,5 @@ +import { withInstall } from '@/utils'; +import dropdown from './src/Dropdown.vue'; + +export * from './src/typing'; +export const Dropdown = withInstall(dropdown); diff --git a/src/components/Dropdown/src/Dropdown.vue b/src/components/Dropdown/src/Dropdown.vue new file mode 100644 index 0000000..b0749e4 --- /dev/null +++ b/src/components/Dropdown/src/Dropdown.vue @@ -0,0 +1,99 @@ + + + diff --git a/src/components/Dropdown/src/typing.ts b/src/components/Dropdown/src/typing.ts new file mode 100644 index 0000000..29de8cb --- /dev/null +++ b/src/components/Dropdown/src/typing.ts @@ -0,0 +1,9 @@ +export interface DropMenu { + onClick?: Fn; + to?: string; + icon?: string; + event: string | number; + text: string; + disabled?: boolean; + divider?: boolean; +} diff --git a/src/components/Excel/index.ts b/src/components/Excel/index.ts new file mode 100644 index 0000000..73228ba --- /dev/null +++ b/src/components/Excel/index.ts @@ -0,0 +1,8 @@ +import { withInstall } from '@/utils'; +import impExcel from './src/ImportExcel.vue'; +import expExcelModal from './src/ExportExcelModal.vue'; + +export const ImpExcel = withInstall(impExcel); +export const ExpExcelModal = withInstall(expExcelModal); +export * from './src/typing'; +export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel'; diff --git a/src/components/Excel/src/Export2Excel.ts b/src/components/Excel/src/Export2Excel.ts new file mode 100644 index 0000000..7b87244 --- /dev/null +++ b/src/components/Excel/src/Export2Excel.ts @@ -0,0 +1,135 @@ +import * as xlsx from 'xlsx'; +import type { WorkBook } from 'xlsx'; +import type { JsonToSheet, AoAToSheet } from './typing'; +import { AoaToMultipleSheet, JsonToMultipleSheet } from './typing'; + +const { utils, writeFile } = xlsx; + +const DEF_FILE_NAME = 'excel-list.xlsx'; +const DEF_SHEET_NAME = 'sheet'; + +/** + * @param data source data + * @param worksheet worksheet object + * @param min min width + */ +function setColumnWidth(data, worksheet, min = 3) { + const obj = {}; + worksheet['!cols'] = []; + data.forEach(item => { + Object.keys(item).forEach(key => { + const cur = item[key]; + const length = cur?.length ?? min; + obj[key] = Math.max(length, obj[key] ?? min); + }); + }); + Object.keys(obj).forEach(key => { + worksheet['!cols'].push({ + wch: obj[key], + }); + }); +} + +export function jsonToSheetXlsx({ + data, + header, + filename = DEF_FILE_NAME, + sheetName = DEF_SHEET_NAME, + json2sheetOpts = {}, + write2excelOpts = { bookType: 'xlsx' }, +}: JsonToSheet) { + const arrData = [...data]; + if (header) { + arrData.unshift(header); + json2sheetOpts.skipHeader = true; + } + + const worksheet = utils.json_to_sheet(arrData, json2sheetOpts); + setColumnWidth(arrData, worksheet); + /* add worksheet to workbook */ + const workbook: WorkBook = { + SheetNames: [sheetName], + Sheets: { + [sheetName]: worksheet, + }, + }; + /* output format determined by filename */ + writeFile(workbook, filename, write2excelOpts); + /* at this point, out.xlsb will have been downloaded */ +} + +export function aoaToSheetXlsx({ data, header, filename = DEF_FILE_NAME, write2excelOpts = { bookType: 'xlsx' } }: AoAToSheet) { + const arrData = [...data]; + if (header) { + arrData.unshift(header); + } + + const worksheet = utils.aoa_to_sheet(arrData); + + /* add worksheet to workbook */ + const workbook: WorkBook = { + SheetNames: [filename], + Sheets: { + [filename]: worksheet, + }, + }; + /* output format determined by filename */ + writeFile(workbook, filename, write2excelOpts); + /* at this point, out.xlsb will have been downloaded */ +} + +/** + * json导出多Sheet的Xlsx + * @param sheetList 多sheet配置 + * @param filename 文件名(包含后缀) + * @param write2excelOpts 文件配置 + */ +export function jsonToMultipleSheetXlsx({ sheetList, filename = DEF_FILE_NAME, write2excelOpts = { bookType: 'xlsx' } }: JsonToMultipleSheet) { + const workbook: WorkBook = { + SheetNames: [], + Sheets: {}, + }; + sheetList.forEach((p, index) => { + const arrData = [...p.data]; + if (p.header) { + arrData.unshift(p.header); + p.json2sheetOpts = p.json2sheetOpts || {}; + p.json2sheetOpts.skipHeader = true; + } + + const worksheet = utils.json_to_sheet(arrData, p.json2sheetOpts); + setColumnWidth(arrData, worksheet); + + p.sheetName = p.sheetName || `${DEF_SHEET_NAME}${index}`; + workbook.SheetNames.push(p.sheetName); + workbook.Sheets[p.sheetName] = worksheet; + }); + writeFile(workbook, filename, write2excelOpts); +} + +/** + * aoa导出多Sheet的Xlsx + * @param sheetList 多sheet配置 + * @param filename 文件名(包含后缀) + * @param write2excelOpts 文件配置 + */ +export function aoaToMultipleSheetXlsx({ sheetList, filename = DEF_FILE_NAME, write2excelOpts = { bookType: 'xlsx' } }: AoaToMultipleSheet) { + const workbook: WorkBook = { + SheetNames: [], + Sheets: {}, + }; + sheetList.forEach((p, index) => { + const arrData = [...p.data]; + if (p.header) { + arrData.unshift(p.header); + } + const worksheet = utils.aoa_to_sheet(arrData); + + p.sheetName = p.sheetName || `${DEF_SHEET_NAME}${index}`; + workbook.SheetNames.push(p.sheetName); + workbook.Sheets[p.sheetName] = worksheet; + }); + /* output format determined by filename */ + writeFile(workbook, filename, write2excelOpts); + /* at this point, out.xlsb will have been downloaded */ +} diff --git a/src/components/Excel/src/ExportExcelModal.vue b/src/components/Excel/src/ExportExcelModal.vue new file mode 100644 index 0000000..6c45876 --- /dev/null +++ b/src/components/Excel/src/ExportExcelModal.vue @@ -0,0 +1,81 @@ + + diff --git a/src/components/Excel/src/ImportExcel.vue b/src/components/Excel/src/ImportExcel.vue new file mode 100644 index 0000000..127ac4f --- /dev/null +++ b/src/components/Excel/src/ImportExcel.vue @@ -0,0 +1,217 @@ + + diff --git a/src/components/Excel/src/typing.ts b/src/components/Excel/src/typing.ts new file mode 100644 index 0000000..b5808f7 --- /dev/null +++ b/src/components/Excel/src/typing.ts @@ -0,0 +1,41 @@ +import type { JSON2SheetOpts, WritingOptions, BookType } from 'xlsx'; + +export interface ExcelData { + header: string[]; + results: T[]; + meta: { sheetName: string }; +} + +export interface JsonToSheet { + data: T[]; + header?: T; + filename?: string; + sheetName?: string; + json2sheetOpts?: JSON2SheetOpts; + write2excelOpts?: WritingOptions; +} + +export interface AoAToSheet { + data: T[][]; + header?: T[]; + filename?: string; + sheetName?: string; + write2excelOpts?: WritingOptions; +} + +export interface ExportModalResult { + filename: string; + bookType: BookType; +} + +export interface JsonToMultipleSheet { + sheetList: JsonToSheet[]; + filename?: string; + write2excelOpts?: WritingOptions; +} + +export interface AoaToMultipleSheet { + sheetList: AoAToSheet[]; + filename?: string; + write2excelOpts?: WritingOptions; +} diff --git a/src/components/FlowChart/index.ts b/src/components/FlowChart/index.ts new file mode 100644 index 0000000..bad85db --- /dev/null +++ b/src/components/FlowChart/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import flowChart from './src/FlowChart.vue'; + +export const FlowChart = withInstall(flowChart); diff --git a/src/components/FlowChart/src/FlowChart.vue b/src/components/FlowChart/src/FlowChart.vue new file mode 100644 index 0000000..df409b1 --- /dev/null +++ b/src/components/FlowChart/src/FlowChart.vue @@ -0,0 +1,158 @@ + + diff --git a/src/components/FlowChart/src/FlowChartToolbar.vue b/src/components/FlowChart/src/FlowChartToolbar.vue new file mode 100644 index 0000000..b0955d0 --- /dev/null +++ b/src/components/FlowChart/src/FlowChartToolbar.vue @@ -0,0 +1,159 @@ + + + diff --git a/src/components/FlowChart/src/adpterForTurbo.ts b/src/components/FlowChart/src/adpterForTurbo.ts new file mode 100644 index 0000000..b68b276 --- /dev/null +++ b/src/components/FlowChart/src/adpterForTurbo.ts @@ -0,0 +1,75 @@ +const TurboType = { + SEQUENCE_FLOW: 1, + START_EVENT: 2, + END_EVENT: 3, + USER_TASK: 4, + SERVICE_TASK: 5, + EXCLUSIVE_GATEWAY: 6, +}; + +function convertFlowElementToEdge(element) { + const { incoming, outgoing, properties, key } = element; + const { text, startPoint, endPoint, pointsList, logicFlowType } = properties; + const edge = { + id: key, + type: logicFlowType, + sourceNodeId: incoming[0], + targetNodeId: outgoing[0], + text, + startPoint, + endPoint, + pointsList, + properties: {}, + }; + const excludeProperties = ['startPoint', 'endPoint', 'pointsList', 'text', 'logicFlowType']; + Object.keys(element.properties).forEach((property) => { + if (excludeProperties.indexOf(property) === -1) { + edge.properties[property] = element.properties[property]; + } + }); + return edge; +} + +function convertFlowElementToNode(element) { + const { properties, key } = element; + const { x, y, text, logicFlowType } = properties; + const node = { + id: key, + type: logicFlowType, + x, + y, + text, + properties: {}, + }; + const excludeProperties = ['x', 'y', 'text', 'logicFlowType']; + Object.keys(element.properties).forEach((property) => { + if (excludeProperties.indexOf(property) === -1) { + node.properties[property] = element.properties[property]; + } + }); + return node; +} + +export function toLogicFlowData(data) { + const lfData: { + // TODO type + nodes: any[]; + edges: any[]; + } = { + nodes: [], + edges: [], + }; + const list = data.flowElementList; + list && + list.length > 0 && + list.forEach((element) => { + if (element.type === TurboType.SEQUENCE_FLOW) { + const edge = convertFlowElementToEdge(element); + lfData.edges.push(edge); + } else { + const node = convertFlowElementToNode(element); + lfData.nodes.push(node); + } + }); + return lfData; +} diff --git a/src/components/FlowChart/src/config.ts b/src/components/FlowChart/src/config.ts new file mode 100644 index 0000000..4f10d2c --- /dev/null +++ b/src/components/FlowChart/src/config.ts @@ -0,0 +1,96 @@ +export const nodeList = [ + { + text: '开始', + type: 'start', + class: 'node-start', + }, + { + text: '矩形', + type: 'rect', + class: 'node-rect', + }, + { + type: 'user', + text: '用户', + class: 'node-user', + }, + { + type: 'push', + text: '推送', + class: 'node-push', + }, + { + type: 'download', + text: '位置', + class: 'node-download', + }, + { + type: 'end', + text: '结束', + class: 'node-end', + }, +]; + +export const BpmnNode = [ + { + type: 'bpmn:startEvent', + text: '开始', + class: 'bpmn-start', + }, + { + type: 'bpmn:endEvent', + text: '结束', + class: 'bpmn-end', + }, + { + type: 'bpmn:exclusiveGateway', + text: '网关', + class: 'bpmn-exclusiveGateway', + }, + { + type: 'bpmn:userTask', + text: '用户', + class: 'bpmn-user', + }, +]; + +export function configDefaultDndPanel(lf) { + return [ + { + text: '选区', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAOVJREFUOBGtVMENwzAIjKP++2026ETdpv10iy7WFbqFyyW6GBywLCv5gI+Dw2Bluj1znuSjhb99Gkn6QILDY2imo60p8nsnc9bEo3+QJ+AKHfMdZHnl78wyTnyHZD53Zzx73MRSgYvnqgCUHj6gwdck7Zsp1VOrz0Uz8NbKunzAW+Gu4fYW28bUYutYlzSa7B84Fh7d1kjLwhcSdYAYrdkMQVpsBr5XgDGuXwQfQr0y9zwLda+DUYXLaGKdd2ZTtvbolaO87pdo24hP7ov16N0zArH1ur3iwJpXxm+v7oAJNR4JEP8DoAuSFEkYH7cAAAAASUVORK5CYII=', + callback: () => { + lf.updateEditConfig({ + stopMoveGraph: true, + }); + }, + }, + { + type: 'circle', + text: '开始', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg==', + }, + { + type: 'rect', + text: '用户任务', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==', + cls: 'important-node', + }, + { + type: 'rect', + text: '系统任务', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==', + cls: 'import_icon', + }, + { + type: 'diamond', + text: '条件判断', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAAHeEJUAAAAABGdBTUEAALGPC/xhBQAAAvVJREFUOBGNVEFrE0EU/mY3bQoiFlOkaUJrQUQoWMGePLX24EH0IIoHKQiCV0G8iE1covgLiqA/QTzVm1JPogc9tIJYFaQtlhQxqYjSpunu+L7JvmUTU3AgmTfvffPNN++9WSA1DO182f6xwILzD5btfAoQmwL5KJEwiQyVbSVZ0IgRyV6PTpIJ81E5ZvqfHQR0HUOBHW4L5Et2kQ6Zf7iAOhTFAA8s0pEP7AXO1uAA52SbqGk6h/6J45LaLhO64ByfcUzM39V7ZiAdS2yCePPEIQYvTUHqM/n7dgQNfBKWPjpF4ISk8q3J4nB11qw6X8l+FsF3EhlkEMfrjIer3wJTLwS2aCNcj4DbGxXTw00JmAuO+Ni6bBxVUCvS5d9aa04+so4pHW5jLTywuXAL7jJ+D06sl82Sgl2JuVBQn498zkc2bGKxULHjCnSMadBKYDYYHAtsby1EQ5lNGrQd4Y3v4Zo0XdGEmDno46yCM9Tk+RiJmUYHS/aXHPNTcjxcbTFna000PFJHIVZ5lFRqRpJWk9/+QtlOUYJj9HG5pVFEU7zqIYDVsw2s+AJaD8wTd2umgSCCyUxgGsS1Y6TBwXQQTFuZaHcd8gAGioE90hlsY+wMcs30RduYtxanjMGal8H5dMW67dmT1JFtYUEe8LiQLRsPZ6IIc7A4J5tqco3T0pnv/4u0kyzrYUq7gASuEyI8VXKvB9Odytv6jS/PNaZBln0nioJG/AVQRZvApOdhjj3Jt8QC8Im09SafwdBdvIpztpxWxpeKCC+EsFdS8DCyuCn2munFpL7ctHKp+Xc5cMybeIyMAN33SPL3ZR9QV1XVwLyzHm6Iv0/yeUuUb7PPlZC4D4HZkeu6dpF4v9j9MreGtMbxMMRLIcjJic9yHi7WQ3yVKzZVWUr5UrViJvn1FfUlwe/KYVfYyWRLSGNu16hR01U9IacajXPei0wx/5BqgInvJN+MMNtNme7ReU9SBbgntovn0kKHpFg7UogZvaZiOue/q1SBo9ktHzQAAAAASUVORK5CYII=', + }, + { + type: 'circle', + text: '结束', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAA1BJREFUOBFtVE1IVUEYPXOf+tq40Y3vPcmFIdSjIorWoRG0ERWUgnb5FwVhYQSl72oUoZAboxKNFtWiwKRN0M+jpfSzqJAQclHo001tKkjl3emc8V69igP3znzfnO/M9zcDcKT67azmjYWTwl9Vn7Vumeqzj1DVb6cleQY4oAVnIOPb+mKAGxQmKI5CWNJ2aLPatxWa3aB9K7/fB+/Z0jUF6TmMlFLQqrkECWQzOZxYGjTlOl8eeKaIY5yHnFn486xBustDjWT6dG7pmjHOJd+33t0iitTPkK6tEvjxq4h2MozQ6WFSX/LkDUGfFwfhEZj1Auz/U4pyAi5Sznd7uKzznXeVHlI/Aywmk6j7fsUsEuCGADrWARXXwjxWQsUbIupDHJI7kF5dRktg0eN81IbiZXiTESic50iwS+t1oJgL83jAiBupLDCQqwziaWSoAFSeIR3P5Xv5az00wyIn35QRYTwdSYbz8pH8fxUUAtxnFvYmEmgI0wYXUXcCCSpeEVpXlsRhBnCEATxWylL9+EKCAYhe1NGstUa6356kS9NVvt3DU2fd+Wtbm/+lSbylJqsqkSm9CRhvoJVlvKPvF1RKY/FcPn5j4UfIMLn8D4UYb54BNsilTDXKnF4CfTobA0FpoW/LSp306wkXM+XaOJhZaFkcNM82ASNAWMrhrUbRfmyeI1FvRBTpN06WKxa9BK0o2E4Pd3zfBBEwPsv9sQBnmLVbLEIZ/Xe9LYwJu/Er17W6HYVBc7vmuk0xUQ+pqxdom5Fnp55SiytXLPYoMXNM4u4SNSCFWnrVIzKG3EGyMXo6n/BQOe+bX3FClY4PwydVhthOZ9NnS+ntiLh0fxtlUJHAuGaFoVmttpVMeum0p3WEXbcll94l1wM/gZ0Ccczop77VvN2I7TlsZCsuXf1WHvWEhjO8DPtyOVg2/mvK9QqboEth+7pD6NUQC1HN/TwvydGBARi9MZSzLE4b8Ru3XhX2PBxf8E1er2A6516o0w4sIA+lwURhAON82Kwe2iDAC1Watq4XHaGQ7skLcFOtI5lDxuM2gZe6WFIotPAhbaeYlU4to5cuarF1QrcZ/lwrLaCJl66JBocYZnrNlvm2+MBCTmUymPrYZVbjdlr/BxlMjmNmNI3SAAAAAElFTkSuQmCC', + }, + ]; +} diff --git a/src/components/FlowChart/src/enum.ts b/src/components/FlowChart/src/enum.ts new file mode 100644 index 0000000..8ea134c --- /dev/null +++ b/src/components/FlowChart/src/enum.ts @@ -0,0 +1,11 @@ +export enum ToolbarTypeEnum { + ZOOM_IN = 'zoomIn', + ZOOM_OUT = 'zoomOut', + RESET_ZOOM = 'resetZoom', + + UNDO = 'undo', + REDO = 'redo', + + SNAPSHOT = 'snapshot', + VIEW_DATA = 'viewData', +} diff --git a/src/components/FlowChart/src/types.ts b/src/components/FlowChart/src/types.ts new file mode 100644 index 0000000..94992ba --- /dev/null +++ b/src/components/FlowChart/src/types.ts @@ -0,0 +1,14 @@ +import { NodeConfig } from '@logicflow/core'; +import { ToolbarTypeEnum } from './enum'; + +export interface NodeItem extends NodeConfig { + icon: string; +} + +export interface ToolbarConfig { + type?: string | ToolbarTypeEnum; + tooltip?: string | boolean; + icon?: string; + disabled?: boolean; + separate?: boolean; +} diff --git a/src/components/FlowChart/src/useFlowContext.ts b/src/components/FlowChart/src/useFlowContext.ts new file mode 100644 index 0000000..7d15f3b --- /dev/null +++ b/src/components/FlowChart/src/useFlowContext.ts @@ -0,0 +1,17 @@ +import type LogicFlow from '@logicflow/core'; + +import { provide, inject } from 'vue'; + +const key = Symbol('flow-chart'); + +type Instance = { + logicFlow: LogicFlow; +}; + +export function createFlowChartContext(instance: Instance) { + provide(key, instance); +} + +export function useFlowChartContext(): Instance { + return inject(key) as Instance; +} diff --git a/src/components/FlowProcess/index.ts b/src/components/FlowProcess/index.ts new file mode 100644 index 0000000..264b0b9 --- /dev/null +++ b/src/components/FlowProcess/index.ts @@ -0,0 +1,5 @@ +import './style/index.less'; +import './style/propPanel.less'; +import FlowProcess from './src/index.vue'; + +export { FlowProcess }; diff --git a/src/components/FlowProcess/src/Main.vue b/src/components/FlowProcess/src/Main.vue new file mode 100644 index 0000000..60836d5 --- /dev/null +++ b/src/components/FlowProcess/src/Main.vue @@ -0,0 +1,90 @@ +@ -1,183 +0,0 @@ + + + diff --git a/src/components/FlowProcess/src/helper/componentMap.ts b/src/components/FlowProcess/src/helper/componentMap.ts new file mode 100644 index 0000000..b70536d --- /dev/null +++ b/src/components/FlowProcess/src/helper/componentMap.ts @@ -0,0 +1,62 @@ +import { + bpmnTask, + bpmnEnd, + bpmnSubFlow, + typeSubFlow, + typeTask, + typeEnd, + typeTrigger, + bpmnTrigger, + typeProcessing, + bpmnProcessing, +} from 'yunzhupaas-bpmn/lib/config/variableName'; +// 流程节点 +const flowNodeList = [ + { + fullName: '审批节点', + icon: 'icon-ym icon-ym-flow-node-approve', + type: bpmnTask, + option: { + wnType: typeTask, + wnName: '审批节点', + }, + }, + { + fullName: '办理节点', + icon: 'icon-ym icon-ym-generator-todo', + type: bpmnProcessing, + option: { + wnType: typeProcessing, + wnName: '办理节点', + }, + }, + { + fullName: '子流程', + icon: 'icon-ym icon-ym-flow-node-subFlow', + type: bpmnSubFlow, + option: { + wnType: typeSubFlow, + wnName: '子流程', + }, + }, + { + fullName: '触发节点', + icon: 'icon-ym icon-ym-flow-trigger-event', + type: bpmnTrigger, + option: { + wnType: typeTrigger, + wnName: '触发节点', + }, + }, + { + fullName: '流程结束', + icon: 'icon-ym icon-ym-flow-node-end', + type: bpmnEnd, + option: { + wnType: typeEnd, + wnName: '流程结束', + }, + }, +]; + +export { flowNodeList }; diff --git a/src/components/FlowProcess/src/helper/config.ts b/src/components/FlowProcess/src/helper/config.ts new file mode 100644 index 0000000..59f4e90 --- /dev/null +++ b/src/components/FlowProcess/src/helper/config.ts @@ -0,0 +1,804 @@ +const defaultGlobalForm = { + type: 'global', + nodeId: 'global', + allFormMap: {}, //所有节点表单字段 + formId: '', // 将发起节点的表单id存在全局属性中 + titleType: 0, //标题类型 0:默认 1:自定义 + defaultContent: '{发起用户名}的{流程名称}', //默认名称 + titleContent: '', //自定义名称 + hasSign: false, //启用签名 + hasRevoke: false, //允许撤销 + hasComment: true, //允许评论 + hasCommentDeletedTips: true, //显示评论已被删除提示 + hasSignFor: false, //审批任务是否签收 + hasAloneConfigureForms: false, //允许审批节点独立配置表单 + hasContinueAfterReject: false, //拒绝后允许流程继续流转审批 + hasInitiatorPressOverdueNode: true, //允许发起人对当前逾期节点进行催办 + //自动提交规则 + autoSubmitConfig: { + adjacentNodeApproverRepeated: false, //相邻节点审批人重复 + ApproverHasApproval: false, //审批人审批过该流程 + initiatorApproverRepeated: false, //发起人与审批人重复 + }, + recallRule: 1, //流程撤回规则 1: 不允许撤回 2: 发起节点允许撤回 3:所有节点允许撤回 + errorRule: 1, // 异常处理规则 1:超级管理员 2:指定人员 3:上一节点审批人指定 4:默认审批通过 5:无法提交 + errorRuleUser: [], // 异常处理指定人员 + //流程归档配置 + fileConfig: { + on: false, //开启归档 + permissionType: 1, //查看权限 1:当前流程所有人 2:流程发起人 3:最后节点审批人 + path: '', //归档路径 + templateId: '', //归档模板 + }, + globalParameterList: [], //全局参数 + approvalFieldList: [], //审批字段 + isShowConditions: true, // 显示线条条件 + showNameType: 0, // 0:显示名称 1:显示条件内容 +}; +const defaultTaskGlobalForm = { + type: 'global', + nodeId: 'global', + allFormMap: {}, //所有节点表单字段 + msgUserType: [1], // 通知人类型 + msgUserIds: [], // 通知人 + // 执行失败通知 + failMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 开始执行通知 + startMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, +}; +const defaultStartForm = { + type: 'start', + nodeId: undefined, + nodeName: '流程发起', + formId: '', //流程表单id + formName: '', //流程表单名称 + formOperates: [], //流程表单权限 + divideRule: 'inclusion', //分流规则 + //打印配置 + printConfig: { + on: false, //开启打印 + printIds: [], //模板 + conditionType: 1, //打印条件 1:不限制 2:节点结束 3:流程结束 4:条件设置 + conditions: [], //条件设置 + matchLogic: 'and', + }, + //限时设置配置 + timeLimitConfig: { + on: 0, // 开启 0:关闭 1:自定义 + nodeLimit: 0, // 节点处理截止时间类型 1:接收时间 2:发起时间 3:表单变量 + duringDeal: 24, // 节点处理限定时长(时) + }, + //提醒配置 + noticeConfig: { + on: 0, // 开启 0:关闭 1:自定义 + firstOver: 1, // 第一次提醒时间(时) + overTimeDuring: 2, // 提醒间隔(时) + overNotice: true, // 提醒事务-提醒通知 + overEvent: false, // 提醒事件 + overEventTime: 5, // 提醒次数(次) + }, + //超时设置 + overTimeConfig: { + on: 0, // 开启 0:关闭 1:自定义 + firstOver: 0, // 第一次超时时间(时) + overTimeDuring: 2, // 超时间隔(时) + overNotice: true, // 超时事务-超时通知 + overAutoApprove: false, // 超时事务-超时自动审批 + overAutoApproveTime: 5, // 自动审批超时次数(次) + overEvent: false, // 超时事件 + overEventTime: 5, // 超时事件超时次数(次) + }, + // 流程待办通知 + waitMsgConfig: { + on: 3, // 0:关闭 1:自定义 3:默认 + msgId: '', + msgName: '', + templateJson: [], + }, + // 流程结束通知 + endMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 流程评论通知 + commentMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点同意通知 + approveMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点拒绝通知 + rejectMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点退回通知 + backMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // copyMsgConfig通知 + copyMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点超时通知 + overTimeMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点提醒通知 + noticeMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + //发起事件配置 + initFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, + //结束事件配置 + endFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, + //测回事件配置 + flowRecallFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, +}; +const defaultApproverForm = { + type: 'approver', + nodeId: undefined, + nodeName: '审批节点', + formId: '', //流程表单id + formName: '', //流程表单名称 + formOperates: [], //流程表单权限 + assignList: [], //数据传递 + assigneeType: 6, // 指定审批人 + approverType: 1, //直属主管审批人类型 1:发起人 2:上节点审批人 + managerApproverType: 1, //部门主管审批人类型 1:发起人 2:上节点审批人 + managerLevel: 1, //主管 1:直属 2:第2级主管 .... 10:第10级主管 + formFieldType: 1, // 表单字段审核方式的类型 1:用户 2:部门 3:岗位 4:角色 5:分组 + formField: '', //表单字段 + approverNodeId: '', //审批节点id + prevNodeList: [], + approvers: [], // 审批人集合 + approversSortList: [], // 审批人依次审批顺序 + extraRule: 1, // 审批人范围 1:无审批人范围 2:同一部门 3:同一岗位 4:发起人上级 5:发起人下属 6:同一公司 + counterSign: 0, //会签规则 0:或签 1:会签 2:依次审批 + // 会签流转配置 + counterSignConfig: { + auditType: 1, // 1:按百分比 2:按人数 + auditRatio: 100, + auditNum: 1, + rejectType: 0, + rejectRatio: 10, + rejectNum: 1, + calculateType: 1, //会签计算规则 1:实时计算 2:延后计算 + }, + circulateUser: [], // 抄送人集合 + extraCopyRule: 1, //抄送人范围 + isCustomCopy: false, //允许自选抄送人 + isInitiatorCopy: false, //抄送给流程发起人 + isFormFieldCopy: false, //抄送给表单变量 + copyFormFieldType: 1, //表单字段类型 1:用户 2:部门 3:岗位 4:角色 5:分组 + copyFormField: '', //表单字段 + hasSign: false, //手写签名 + hasFile: false, //启用签名 + hasApprovalField: false, //启用审批字段 + approvalField: [], //审批字段 + hasAuditBtn: true, + auditBtnText: '同意', + hasRejectBtn: true, + rejectBtnText: '拒绝', + hasBackBtn: false, + backBtnText: '退回', + hasFreeApproverBtn: false, + freeApproverBtnText: '加签', + hasReduceApproverBtn: false, + reduceApproverBtnText: '减签', + hasTransferBtn: false, + transferBtnText: '转审', + hasAssistBtn: false, + assistBtnText: '协办', + hasSaveAuditBtn: false, + saveAuditBtnText: '暂存', + backType: 1, + backNodeCode: 0, + customBtns: [], // 自定义按钮集合 + auxiliaryInfo: [], // 辅助信息 + //打印配置 + printConfig: { + on: false, //开启打印 + printIds: [], //模板 + conditionType: 1, //打印条件 1:不限制 2:节点结束 3:流程结束 4:条件设置 + conditions: [], //条件设置 + matchLogic: 'and', + }, + parameterList: [], //节点参数 + hasAutoApprover: false, // 自动同意规则,默认不启用 + autoAuditRule: { + conditions: [], //条件设置 + matchLogic: 'and', + }, + autoRejectRule: { + conditions: [], //条件设置 + matchLogic: 'and', + }, + divideRule: 'inclusion', //分流规则 inclusion: 根据条件多分支流转(包容网关) exclusive:根据条件单分支流转(排它网关) parallel:所有分支都流转(并行网关) + // 数据接口 + interfaceConfig: { + interfaceId: '', // 接口id + interfaceName: '', // 接口名称 + templateJson: [], // 模块json + }, + // 节点同意通知 + approveMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点拒绝通知 + rejectMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点退回通知 + backMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + // copyMsgConfig通知 + copyMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点超时通知 + overTimeMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点提醒通知 + noticeMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + content: '', //内容 + //限时设置配置 + timeLimitConfig: { + on: 2, // 开启 0:关闭 1:自定义 2:同步发起节点配置 + nodeLimit: 0, // 节点处理截止时间类型 + duringDeal: 24, // 节点处理限定时长(时) + formField: '', // 请选择字段 + }, + //超时设置 + overTimeConfig: { + on: 2, // 开启 0:关闭 1:自定义 2:同步发起节点配置 + firstOver: 0, // 第一次超时时间(时) + overTimeDuring: 2, // 超时间隔(时) + overNotice: true, // 超时事务-超时通知 + overAutoApprove: false, // 超时事务-超时自动审批 + overAutoApproveTime: 5, // 自动审批超时次数(次) + overEvent: false, // 超时事件 + overEventTime: 5, // 超时事件超时次数(次) + overAutoTransfer: false, // 超时事务-超时自动转审 + overAutoTransferTime: 2, // 自动转审超时次数(次) + overTimeType: 6, // 转审人类型 + interfaceId: '', // 接口id + interfaceName: '', // 接口名称 + templateJson: [], // 模块json + reApprovers: '', // 转审人 + overTimeExtraRule: 2, + }, + //提醒配置 + noticeConfig: { + on: 2, // 开启 0:关闭 1:自定义 2:同步发起节点配置 + firstOver: 1, // 第一次提醒时间(时) + overTimeDuring: 2, // 提醒间隔(时) + overNotice: true, // 提醒事务-提醒通知 + overEvent: false, // 提醒事件 + overEventTime: 5, // 提醒次数(次) + }, + // 同意事件配置 + approveFuncConfig: { + on: false, // 开启 + interfaceId: '', // 接口id + interfaceName: '', // 接口名称 + templateJson: [], // 接口参数 + }, + // 拒绝事件配置 + rejectFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, + // 退回事件配置 + backFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, + // 撤回事件配置 + recallFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, + // 超时事件配置 + overTimeFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, + // 提醒事件配置 + noticeFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, +}; +const defaultProcessingForm = { + type: 'processing', + nodeId: undefined, + nodeName: '办理节点', + formId: '', //流程表单id + formName: '', //流程表单名称 + formOperates: [], //流程表单权限 + assignList: [], //数据传递 + assigneeType: 6, // 指定审批人 + approverType: 1, //直属主管审批人类型 1:发起人 2:上节点审批人 + managerApproverType: 1, //部门主管审批人类型 1:发起人 2:上节点审批人 + managerLevel: 1, //主管 1:直属 2:第2级主管 .... 10:第10级主管 + formFieldType: 1, // 表单字段审核方式的类型 1:用户 2:部门 3:岗位 4:角色 5:分组 + formField: '', //表单字段 + approverNodeId: '', //审批节点id + approvers: [], // 审批人集合 + approversSortList: [], // 审批人依次审批顺序 + extraRule: 1, // 审批人范围 1:无审批人范围 2:同一部门 3:同一岗位 4:发起人上级 5:发起人下属 6:同一公司 + counterSign: 0, //会签规则 0:或签 1:会签 2:依次审批 + // 会签流转配置 + counterSignConfig: { + auditType: 1, // 1:按百分比 2:按人数 + auditRatio: 100, + auditNum: 1, + rejectType: 0, + rejectRatio: 10, + rejectNum: 1, + calculateType: 1, //会签计算规则 1:实时计算 2:延后计算 + }, + circulateUser: [], // 抄送人集合 + extraCopyRule: 1, //抄送人范围 + isCustomCopy: false, //允许自选抄送人 + isInitiatorCopy: false, //抄送给流程发起人 + isFormFieldCopy: false, //抄送给表单变量 + copyFormFieldType: 1, //表单字段类型 1:用户 2:部门 3:岗位 4:角色 5:分组 + copyFormField: '', //表单字段 + hasSign: false, //手写签名 + hasFile: false, //启用签名 + hasApprovalField: false, //启用审批字段 + approvalField: [], //审批字段 + hasAuditBtn: true, + auditBtnText: '确认办理', + hasBackBtn: false, + backBtnText: '退回', + hasTransferBtn: false, + transferBtnText: '转办', + hasSaveAuditBtn: false, + saveAuditBtnText: '暂存', + backType: 1, + backNodeCode: 0, + customBtns: [], // 自定义按钮集合 + //打印配置 + printConfig: { + on: false, //开启打印 + printIds: [], //模板 + conditionType: 1, //打印条件 1:不限制 2:节点结束 3:流程结束 4:条件设置 + conditions: [], //条件设置 + matchLogic: 'and', + }, + parameterList: [], //节点参数 + hasAutoApprover: false, // 自动同意规则,默认不启用 + autoAuditRule: { + conditions: [], //条件设置 + matchLogic: 'and', + }, + autoRejectRule: { + conditions: [], //条件设置 + matchLogic: 'and', + }, + divideRule: 'inclusion', //分流规则 inclusion: 根据条件多分支流转(包容网关) exclusive:根据条件单分支流转(排它网关) parallel:所有分支都流转(并行网关) + // 数据接口 + interfaceConfig: { + interfaceId: '', // 接口id + interfaceName: '', // 接口名称 + templateJson: [], // 模块json + }, + // 节点退回通知 + backMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + // copyMsgConfig通知 + copyMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点超时通知 + overTimeMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + // 节点提醒通知 + noticeMsgConfig: { + on: 2, + msgId: '', + msgName: '', + templateJson: [], + }, + content: '', //内容 + //限时设置配置 + timeLimitConfig: { + on: 2, // 开启 0:关闭 1:自定义 2:同步发起节点配置 + nodeLimit: 0, // 节点处理截止时间类型 + duringDeal: 24, // 节点处理限定时长(时) + formField: '', // 请选择字段 + }, + //超时设置 + overTimeConfig: { + on: 2, // 开启 0:关闭 1:自定义 2:同步发起节点配置 + firstOver: 0, // 第一次超时时间(时) + overTimeDuring: 2, // 超时间隔(时) + overNotice: true, // 超时事务-超时通知 + overAutoApprove: false, // 超时事务-超时自动审批 + overAutoApproveTime: 5, // 自动审批超时次数(次) + overEvent: false, // 超时事件 + overEventTime: 5, // 超时事件超时次数(次) + overAutoTransfer: false, // 超时事务-超时自动转审 + overAutoTransferTime: 2, // 自动转审超时次数(次) + overTimeType: 6, // 转审人类型 + interfaceId: '', // 接口id + interfaceName: '', // 接口名称 + templateJson: [], // 模块json + reApprovers: '', // 转审人 + overTimeExtraRule: 2, + }, + //提醒配置 + noticeConfig: { + on: 2, // 开启 0:关闭 1:自定义 2:同步发起节点配置 + firstOver: 1, // 第一次提醒时间(时) + overTimeDuring: 2, // 提醒间隔(时) + overNotice: true, // 提醒事务-提醒通知 + overEvent: false, // 提醒事件 + overEventTime: 5, // 提醒次数(次) + }, + + // 超时事件配置 + overTimeFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, + // 提醒事件配置 + noticeFuncConfig: { + on: false, + interfaceId: '', + interfaceName: '', + templateJson: [], + }, +}; +const defaultSubFlowForm = { + type: 'subFlow', + nodeId: undefined, + nodeName: '子流程', + isAsync: 0, //子流程同步 0:异步 1:同步 + flowId: '', + flowName: '', + assignList: [], //数据传递 + assigneeType: 6, // 指定审批人 + approverType: 1, //直属主管审批人类型 1:发起人 2:上节点审批人 + managerApproverType: 1, //部门主管审批人类型 1:发起人 2:上节点审批人 + managerLevel: 1, //主管 1:直属 2:第2级主管 .... 10:第10级主管 + formFieldType: 1, // 表单字段审核方式的类型 1:用户 2:部门 3:岗位 4:角色 5:分组 + formField: '', //表单字段 + approverNodeId: '', //审批节点id + approvers: [], // 审批人集合 + approversSortList: [], // 审批人依次审批顺序 + extraRule: 1, // 审批人范围 1:无审批人范围 2:同一部门 3:同一岗位 4:发起人上级 5:发起人下属 6:同一公司 + content: '', + subFlowLaunchPermission: 1, //子流程发起权限 + errorRule: 1, // 异常处理规则 1:超级管理员 2:指定人员 3:上一节点审批人指定 4:默认审批通过 5:无法提交 + errorRuleUser: [], // 指定人员处理异常 + autoSubmit: 0, //自动提交 0:否 1:是 + divideRule: 'inclusion', //分流规则 + // 数据接口 + interfaceConfig: { + interfaceId: '', // 接口id + interfaceName: '', // 接口名称 + templateJson: [], // 参数 + }, + //子流程发起通知 + launchMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + createRule: 0, //创建规则 0:同时创建 1:依次创建 +}; +const defaultConnectForm = { + type: 'connect', + nodeId: undefined, + nodeName: '连接线', + conditions: [], + matchLogic: 'and', +}; +//触发节点 +const defaultTriggerForm = { + type: 'trigger', + nodeId: undefined, + nodeName: '触发事件', + content: '', + isAsync: 1, //子流程同步 0:异步 1:同步 + formId: '', // 触发表单 + formName: '', // 触发表单名称 + triggerEvent: 1, // 触发事件 1-表单事件 2-审批事件 3-空白事件 + triggerFormEvent: 1, // 触发表单事件 1-新增 2-修改 3-删除 + actionList: [], //1-同意 2-拒绝 3-退回 4-加签 5-减签 6-转办 7-协办 + updateFieldList: [], //表单事件-修改数据-修改字段 + ruleList: [], //触发条件 + ruleMatchLogic: 'and', //条件规则匹配逻辑 +}; +//事件触发 +const defaultEventTriggerForm = { + type: 'eventTrigger', + nodeId: undefined, + nodeName: '事件触发', + content: '', + formId: '', // 触发表单 + formName: '', // 触发表单名称 + triggerEvent: 1, // 触发事件 1-表单事件 2-审批事件 3-空白事件 + triggerFormEvent: 1, // 触发表单事件 1-新增 2-修改 3-删除 + actionList: [], //1-同意 2-拒绝 3-退回 4-加签 5-减签 6-转办 7-协办 + updateFieldList: [], //表单事件-修改数据-修改字段 + ruleList: [], //触发条件 + ruleMatchLogic: 'and', //条件规则匹配逻辑 +}; +// 定时触发 +const defaultTimeTriggerForm = { + type: 'timeTrigger', + nodeId: undefined, + nodeName: '定时触发', + content: '', + startTime: null, // 触发开始时间 + cron: '', // cron表达式 + endTimeType: 1, // 触发结束时间类型 + endLimit: 1, // 触发次数 + endTime: null, // 触发指定时间 +}; +// 通知触发 +const defaultNoticeTriggerForm = { + type: 'noticeTrigger', + nodeId: undefined, + nodeName: '通知触发', + content: '', + noticeId: '', + noticeName: null, +}; +// Webhook通知触发 +const defaultWebhookTriggerForm = { + type: 'webhookTrigger', + nodeId: undefined, + nodeName: 'webhook触发', + content: '', + webhookUrl: '', // webhookUrl + webhookGetFieldsUrl: '', // webhook获取接口字段Url + webhookRandomStr: '', // webhook获取接口字段识别码 + formFieldList: [], // 表单/接口字段 +}; +//获取数据节点 +const defaultGetDataForm = { + type: 'getData', + nodeId: undefined, + nodeName: '获取数据', + formType: 1, // 表单类型 1-从表单中获取 2-从流程中获取 3-从数据接口中获取 4-从子表 + formId: '', // 触发表单/接口id + formName: '', // 触发表单/接口名称 + interfaceTemplateJson: [], // 接口参数 + ruleList: [], // 获取条件规则 + ruleMatchLogic: 'and', // 获取条件规则匹配逻辑 + formFieldLis: [], //表单字段 + cacheFormFieldList: [], //缓存表单字段 + sortList: [], //排序 +}; +//新增数据节点 +const defaultAddDataForm = { + type: 'addData', + nodeId: undefined, + nodeName: '新增数据', + formId: '', // 表单id + formName: '', // 表单名称 + transferList: [], // 字段设置 + dataSourceForm: '', //数据源 + ruleList: [], // 条件规则 + ruleMatchLogic: 'and', // 条件规则匹配逻辑 +}; +//更新数据节点 +const defaultUpdateDataForm = { + type: 'updateData', + nodeId: undefined, + nodeName: '更新数据', + content: '', //内容 + formId: '', // 表单id + formName: '', // 表单名称 + dataSourceForm: '', //数据源 + transferList: [], // 更新字段 + ruleList: [], // 更新条件规则 + ruleMatchLogic: 'and', // 更新条件规则 + unFoundRule: false, // 未找到数据时更新 +}; +//删除数据节点 +const defaultDeleteDataForm = { + type: 'deleteData', + nodeId: undefined, + nodeName: '删除数据', + content: '', //内容 + deleteType: 0, //删除类型 + tableType: 0, //表类型 0-主表 1-子表 + formId: '', //表单 + formName: '', //表单名称 + subTable: '', //子表 + deleteCondition: 1, //删除条件 1-存在 2-不存在 + dataSourceForm: '', //数据源 + dataSourceFormName: '', //数据源名称 + ruleList: [], // 更新条件规则 + ruleMatchLogic: 'and', // 更新条件规则 +}; +//数据接口节点 +const defaultDataInterfaceForm = { + type: 'dataInterface', + nodeId: undefined, + nodeName: '数据接口', + content: '', //内容 + dataSourceForm: '', //数据源 + formId: '', // 接口id + formName: '', // 接口名称 + templateJson: [], // 接口参数 +}; +//消息通知节点 +const defaultMessageForm = { + type: 'message', + nodeId: undefined, + nodeName: '消息通知', + content: '', //内容 + msgId: '', + msgName: '', + msgTemplateJson: [], + msgUserIds: [], //接收人 + msgUserIdsSourceType: 2, +}; +//发起审批节点 +const defaultLaunchFlowForm = { + type: 'launchFlow', + nodeId: undefined, + nodeName: '发起审批', + content: '', //内容 + flowId: '', // 流程id + flowName: '', // 流程名称 + transferList: [], // 字段设置 + initiator: [], //发起人 + dataSourceForm: '', //数据源 + formFieldList: [], +}; +//创建日程节点 +const defaultScheduleForm = { + type: 'schedule', + nodeId: undefined, + nodeName: '创建日程', + content: '', //内容 + title: '', //日程标题 + contents: '', //日程内容 + files: [], //日程附件 + allDay: 0, //日程全天 + startDay: '', //日程开始日期 + startTime: '', //日程开始时间 + duration: 0, //日程时长 + endDay: '', //日程结束日期 + endTime: '', //日程结束时间 + creatorUserId: '', //日程创建人 + toUserIds: [], //日程参与人 + color: '#188ae2', //日程标签颜色 + reminderTime: -2, //日程提醒时间 + reminderType: 1, //日程提醒方式 + send: '', + repetition: 1, + repeatTime: '', + startDaySourceType: 1, + endDaySourceType: 1, + titleSourceType: 1, + contentsSourceType: 1, + creatorUserIdSourceType: 1, + toUserIdsSourceType: 1, +}; + +export default { + defaultGlobalForm, + defaultTaskGlobalForm, + defaultStartForm, + defaultApproverForm, + defaultProcessingForm, + defaultSubFlowForm, + defaultConnectForm, + defaultTriggerForm, + defaultEventTriggerForm, + defaultTimeTriggerForm, + defaultNoticeTriggerForm, + defaultWebhookTriggerForm, + defaultGetDataForm, + defaultAddDataForm, + defaultUpdateDataForm, + defaultDeleteDataForm, + defaultDataInterfaceForm, + defaultMessageForm, + defaultLaunchFlowForm, + defaultScheduleForm, +}; diff --git a/src/components/FlowProcess/src/helper/define.ts b/src/components/FlowProcess/src/helper/define.ts new file mode 100644 index 0000000..19bddd0 --- /dev/null +++ b/src/components/FlowProcess/src/helper/define.ts @@ -0,0 +1,238 @@ +const defaultStep = [ + { id: 0, fullName: '流程发起' }, + { id: 1, fullName: '上级审批节点' }, + { id: 2, fullName: '自选审批节点' }, +]; +const typeOptions = [ + { fullName: '指定成员', id: 6 }, + { fullName: '发起者本人', id: 3 }, + { fullName: '直属主管', id: 1 }, + { fullName: '部门主管', id: 2 }, + { fullName: '表单变量', id: 4 }, + { fullName: '流程环节', id: 5 }, + { fullName: '数据接口', id: 9 }, + { fullName: '候选人员', id: 7 }, +]; +const overTimeOptions = [ + { id: 0, fullName: '接收时间' }, + { id: 1, fullName: '发起时间' }, + { id: 2, fullName: '表单变量' }, +]; +const overTimeMsgOptions = [ + { id: 1, fullName: '自定义' }, + { id: 0, fullName: '关闭' }, +]; +const nodeOverTimeMsgOptions = [{ id: 2, fullName: '同步发起配置' }, ...overTimeMsgOptions]; +const noticeOptions = [{ id: 3, fullName: '默认' }, ...overTimeMsgOptions]; +const nodeNoticeOptions = [{ id: 2, fullName: '同步发起配置' }, ...noticeOptions]; +const systemFieldOptions = [ + { id: '@flowId', fullName: '流程ID' }, + { id: '@taskId', fullName: '任务ID' }, + { id: '@taskNodeId', fullName: '节点ID' }, + { id: '@flowFullName', fullName: '流程名称' }, + { id: '@taskFullName', fullName: '任务标题' }, + { id: '@launchUserId', fullName: '发起用户ID' }, + { id: '@launchUserName', fullName: '发起用户名' }, + { id: '@flowOperatorUserId', fullName: '当前操作用户ID' }, + { id: '@flowOperatorUserName', fullName: '当前操作用户名' }, +]; +const sourceTypeOptions = [ + { id: 1, fullName: '字段' }, + { id: 2, fullName: '自定义' }, + { id: 4, fullName: '系统变量' }, + { id: 3, fullName: '为空' }, +]; +const simpleSourceTypeOptions = [ + { id: 1, fullName: '字段' }, + { id: 2, fullName: '自定义' }, +]; +const interfaceSystemOptions = [ + { id: '@formId', fullName: '@表单ID' }, + { id: '@userId', fullName: '@当前用户' }, + { id: '@userAndSubordinates', fullName: '@当前用户及下属' }, + { id: '@organizeId', fullName: '@当前组织' }, + { id: '@organizationAndSuborganization', fullName: '@当前组织及子组织' }, + { id: '@branchManageOrganize', fullName: '@当前分管组织' }, +]; +const templateJsonColumns = [ + { width: 50, title: '序号', align: 'center', customRender: ({ index }) => index + 1 }, + { title: '参数名称', dataIndex: 'field', key: 'field' }, + { title: '参数来源', dataIndex: 'sourceType', key: 'sourceType', width: 100 }, + { title: '参数值', dataIndex: 'relationField', key: 'relationField', width: 220 }, +]; +const printConditionTypeOptions = [ + { fullName: '不限制', id: 1 }, + { fullName: '节点结束', id: 2 }, + { fullName: '流程结束', id: 3 }, + { fullName: '条件设置', id: 4 }, +]; +const errorRuleOptions = [ + { fullName: '超级管理员', id: 1 }, + { fullName: '指定人员', id: 2 }, + { fullName: '上一节点审批人指定', id: 3 }, + { fullName: '默认审批通过', id: 4 }, + { fullName: '无法提交', id: 5 }, +]; +const subFlowErrorRuleOptions = [ + { id: 1, fullName: '超级管理员' }, + { id: 2, fullName: '指定人员' }, + { id: 6, fullName: '发起者本人' }, +]; +const formFieldTypeOptions = [ + { fullName: '用户', id: 1 }, + { fullName: '部门', id: 2 }, + { fullName: '岗位', id: 3 }, + { fullName: '角色', id: 4 }, + { fullName: '分组', id: 5 }, +]; +const conditionTypeOptions = [ + { id: 1, fullName: '字段' }, + { id: 3, fullName: '公式' }, +]; +const conditionTypeOptions1 = [ + { id: 1, fullName: '字段' }, + { id: 2, fullName: '自定义' }, + { id: 3, fullName: '系统参数' }, + { id: 4, fullName: '全局变量' }, +]; +const symbolOptions = [ + { id: '>=', fullName: '大于等于' }, + { id: '>', fullName: '大于' }, + { id: '==', fullName: '等于' }, + { id: '<=', fullName: '小于等于' }, + { id: '<', fullName: '小于' }, + { id: '<>', fullName: '不等于' }, + { id: 'like', fullName: '包含' }, + { id: 'notLike', fullName: '不包含' }, +]; +const logicOptions = [ + { id: 'and', fullName: '且' }, + { id: 'or', fullName: '或' }, +]; +const divideRuleOptions = [ + { fullName: '根据条件多分支流转(包容网关)', id: 'inclusion' }, + { fullName: '根据条件单分支流转(排它网关)', id: 'exclusive' }, + { fullName: '所有分支都流转(并行网关)', id: 'parallel' }, + { fullName: '由用户选择一条分支流转(选择分支)', id: 'choose' }, +]; +const keyMap = { + approveFuncConfig: 'approveFuncConfig', + rejectFuncConfig: 'rejectFuncConfig', + backFuncConfig: 'backFuncConfig', + recallFuncConfig: 'recallFuncConfig', + overTimeFuncConfig: 'overTimeFuncConfig', + noticeFuncConfig: 'noticeFuncConfig', + initFuncConfig: 'initFuncConfig', + endFuncConfig: 'endFuncConfig', + flowRecallFuncConfig: 'flowRecallFuncConfig', +}; +const durationList = [ + { id: 30, fullName: '30分钟' }, + { id: 60, fullName: '1小时' }, + { id: 90, fullName: '1小时30分钟' }, + { id: 120, fullName: '2小时' }, + { id: 180, fullName: '3小时' }, + { id: -1, fullName: '自定义' }, +]; +const urgentList = [ + { id: '1', fullName: '普通' }, + { id: '2', fullName: '重要' }, + { id: '3', fullName: '紧急' }, +]; +const tableList = [ + { id: 1, fullName: '此日程' }, + { id: 2, fullName: '此日程及后续' }, +]; +const deleteList = [ + { id: 1, fullName: '此日程' }, + { id: 2, fullName: '此日程及后续' }, + { id: 3, fullName: '所有日程' }, +]; +const reminderTimeList = [ + { id: -2, fullName: '不提醒' }, + { id: -1, fullName: '开始时' }, + { id: 5, fullName: '提前5分钟' }, + { id: 10, fullName: '提前10分钟' }, + { id: 15, fullName: '提前15分钟' }, + { id: 30, fullName: '提前30分钟' }, + { id: 60, fullName: '提前1小时' }, + { id: 120, fullName: '提前2小时' }, + { id: 1440, fullName: '1天前' }, + { id: 2880, fullName: '2天前' }, + { id: 10080, fullName: '1周前' }, +]; +const reminderTimeList_ = [ + { id: -2, fullName: '不提醒' }, + { id: 1, fullName: '当天8:00' }, + { id: 2, fullName: '当天9:00' }, + { id: 3, fullName: '当天10:00' }, + { id: 4, fullName: '1天前8:00' }, + { id: 5, fullName: '1天前9:00' }, + { id: 6, fullName: '1天前10:00' }, + { id: 7, fullName: '2天前8:00' }, + { id: 8, fullName: '2天前9:00' }, + { id: 9, fullName: '2天前10:00' }, + { id: 10, fullName: '1周前8:00' }, + { id: 11, fullName: '1周前9:00' }, + { id: 12, fullName: '1周前10:00' }, +]; +const remindList = [ + { id: 1, fullName: '默认' }, + { id: 2, fullName: '自定义' }, +]; +const repeatReminderList = [ + { id: 1, fullName: '不重复' }, + { id: 2, fullName: '每天重复' }, + { id: 3, fullName: '每周重复' }, + { id: 4, fullName: '每月重复' }, + { id: 5, fullName: '每年重复' }, +]; +const notSupportList = [ + 'relationFormAttr', + 'popupAttr', + 'uploadFile', + 'uploadImg', + 'colorPicker', + 'editor', + 'link', + 'button', + 'text', + 'alert', + 'table', + 'sign', + 'signature', +]; + +export { + defaultStep, + typeOptions, + overTimeOptions, + overTimeMsgOptions, + nodeOverTimeMsgOptions, + noticeOptions, + nodeNoticeOptions, + systemFieldOptions, + sourceTypeOptions, + simpleSourceTypeOptions, + interfaceSystemOptions, + templateJsonColumns, + printConditionTypeOptions, + errorRuleOptions, + subFlowErrorRuleOptions, + formFieldTypeOptions, + conditionTypeOptions, + conditionTypeOptions1, + symbolOptions, + logicOptions, + divideRuleOptions, + keyMap, + durationList, + urgentList, + tableList, + deleteList, + reminderTimeList, + reminderTimeList_, + remindList, + repeatReminderList, + notSupportList, +}; diff --git a/src/components/FlowProcess/src/helper/formulaData.ts b/src/components/FlowProcess/src/helper/formulaData.ts new file mode 100644 index 0000000..65d6817 --- /dev/null +++ b/src/components/FlowProcess/src/helper/formulaData.ts @@ -0,0 +1,56 @@ +const formulaData = [ + { + id: 'maths', + fullName: '数学函数', + desc: '', + children: [ + { + id: 'SUM', + fullName: 'SUM', + desc: `
    +
  • SUM函数可以获取一组数值的总和
  • +
  • 用法:SUM(数值1,数值2,...)
  • +
  • 示例:SUM(语文成绩,数学成绩)返回两门课程总分
  • +
`, + }, + { + id: 'SUBTRACT', + fullName: 'SUBTRACT', + desc: `
    +
  • SUBTRACT函数可以返回数值相减
  • +
  • 用法:SUBTRACT(被减数,减数)
  • +
  • 示例:SUBTRACT(总收入,总支出)返回收支总利润
  • +
`, + }, + { + id: 'PRODUCT', + fullName: 'PRODUCT', + desc: `
    +
  • PRODUCT函数可以获取一组数值的乘积
  • +
  • 用法:PRODUCT(数值1,数值2,...)
  • +
  • 示例:PRODUCT(单价,数量)获取总价,即单价和数量的乘积
  • +
`, + }, + { + id: 'DIVIDE', + fullName: 'DIVIDE', + desc: `
    +
  • DIVIDE函数可以返回数值相除
  • +
  • 用法:DIVIDE(被除数,除数)
  • +
  • 示例:DIVIDE(总价,单价)获取数量,即总价除单价
  • +
`, + }, + { + id: 'COUNT', + fullName: 'COUNT', + desc: `
    +
  • COUNT函数可以获取参数的数量
  • +
  • 用法:COUNT(值,值,...)
  • +
  • 示例:COUNT(小王,小李)返回2,即人员数量
  • +
`, + }, + ], + }, +]; + +export default formulaData; diff --git a/src/components/FlowProcess/src/index.vue b/src/components/FlowProcess/src/index.vue new file mode 100644 index 0000000..e156488 --- /dev/null +++ b/src/components/FlowProcess/src/index.vue @@ -0,0 +1,337 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/AddDataNode.vue b/src/components/FlowProcess/src/propPanel/AddDataNode.vue new file mode 100644 index 0000000..6c13b80 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/AddDataNode.vue @@ -0,0 +1,143 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/ApproverNode.vue b/src/components/FlowProcess/src/propPanel/ApproverNode.vue new file mode 100644 index 0000000..91b2b37 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/ApproverNode.vue @@ -0,0 +1,1287 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/ConnectNode.vue b/src/components/FlowProcess/src/propPanel/ConnectNode.vue new file mode 100644 index 0000000..a000971 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/ConnectNode.vue @@ -0,0 +1,351 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/DataInterfaceNode.vue b/src/components/FlowProcess/src/propPanel/DataInterfaceNode.vue new file mode 100644 index 0000000..976fbd6 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/DataInterfaceNode.vue @@ -0,0 +1,67 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/DeleteDataNode.vue b/src/components/FlowProcess/src/propPanel/DeleteDataNode.vue new file mode 100644 index 0000000..27a4ac8 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/DeleteDataNode.vue @@ -0,0 +1,165 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/EndNode.vue b/src/components/FlowProcess/src/propPanel/EndNode.vue new file mode 100644 index 0000000..0526664 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/EndNode.vue @@ -0,0 +1,14 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/GetDataNode.vue b/src/components/FlowProcess/src/propPanel/GetDataNode.vue new file mode 100644 index 0000000..d6e30a1 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/GetDataNode.vue @@ -0,0 +1,189 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/GlobalProperties.vue b/src/components/FlowProcess/src/propPanel/GlobalProperties.vue new file mode 100644 index 0000000..adc5e51 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/GlobalProperties.vue @@ -0,0 +1,249 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/LaunchFlowNode.vue b/src/components/FlowProcess/src/propPanel/LaunchFlowNode.vue new file mode 100644 index 0000000..747a1da --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/LaunchFlowNode.vue @@ -0,0 +1,160 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/MessageNode.vue b/src/components/FlowProcess/src/propPanel/MessageNode.vue new file mode 100644 index 0000000..68a3464 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/MessageNode.vue @@ -0,0 +1,136 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/NoticeTriggerNode.vue b/src/components/FlowProcess/src/propPanel/NoticeTriggerNode.vue new file mode 100644 index 0000000..7452410 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/NoticeTriggerNode.vue @@ -0,0 +1,30 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/ProcessingNode.vue b/src/components/FlowProcess/src/propPanel/ProcessingNode.vue new file mode 100644 index 0000000..4c205ef --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/ProcessingNode.vue @@ -0,0 +1,1084 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/ScheduleNode.vue b/src/components/FlowProcess/src/propPanel/ScheduleNode.vue new file mode 100644 index 0000000..0e3dd15 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/ScheduleNode.vue @@ -0,0 +1,210 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/StartNode.vue b/src/components/FlowProcess/src/propPanel/StartNode.vue new file mode 100644 index 0000000..03d612d --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/StartNode.vue @@ -0,0 +1,465 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/SubFlowNode.vue b/src/components/FlowProcess/src/propPanel/SubFlowNode.vue new file mode 100644 index 0000000..200cabd --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/SubFlowNode.vue @@ -0,0 +1,383 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/TimeTriggerNode.vue b/src/components/FlowProcess/src/propPanel/TimeTriggerNode.vue new file mode 100644 index 0000000..ea00dd4 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/TimeTriggerNode.vue @@ -0,0 +1,51 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/TriggerNode.vue b/src/components/FlowProcess/src/propPanel/TriggerNode.vue new file mode 100644 index 0000000..3368e25 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/TriggerNode.vue @@ -0,0 +1,164 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/UpdateDataNode.vue b/src/components/FlowProcess/src/propPanel/UpdateDataNode.vue new file mode 100644 index 0000000..269d1e3 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/UpdateDataNode.vue @@ -0,0 +1,135 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/WebhookTriggerNode.vue b/src/components/FlowProcess/src/propPanel/WebhookTriggerNode.vue new file mode 100644 index 0000000..09762ed --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/WebhookTriggerNode.vue @@ -0,0 +1,111 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/components/ApproversSortModal.vue b/src/components/FlowProcess/src/propPanel/components/ApproversSortModal.vue new file mode 100644 index 0000000..09c8543 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/ApproversSortModal.vue @@ -0,0 +1,135 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/AssignRuleModal.vue b/src/components/FlowProcess/src/propPanel/components/AssignRuleModal.vue new file mode 100644 index 0000000..2177def --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/AssignRuleModal.vue @@ -0,0 +1,128 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/AuxiliaryMessage.vue b/src/components/FlowProcess/src/propPanel/components/AuxiliaryMessage.vue new file mode 100644 index 0000000..96232f0 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/AuxiliaryMessage.vue @@ -0,0 +1,256 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/AuxiliaryModal.vue b/src/components/FlowProcess/src/propPanel/components/AuxiliaryModal.vue new file mode 100644 index 0000000..294b697 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/AuxiliaryModal.vue @@ -0,0 +1,199 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/components/ConditionModal.vue b/src/components/FlowProcess/src/propPanel/components/ConditionModal.vue new file mode 100644 index 0000000..c5fd7c4 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/ConditionModal.vue @@ -0,0 +1,319 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/components/FileModal.vue b/src/components/FlowProcess/src/propPanel/components/FileModal.vue new file mode 100644 index 0000000..c418899 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/FileModal.vue @@ -0,0 +1,68 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/components/FlowButton.vue b/src/components/FlowProcess/src/propPanel/components/FlowButton.vue new file mode 100644 index 0000000..fbae613 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/FlowButton.vue @@ -0,0 +1,682 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/components/FlowFormModal.vue b/src/components/FlowProcess/src/propPanel/components/FlowFormModal.vue new file mode 100644 index 0000000..1732ed4 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/FlowFormModal.vue @@ -0,0 +1,157 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/FlowModal.vue b/src/components/FlowProcess/src/propPanel/components/FlowModal.vue new file mode 100644 index 0000000..70b1c56 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/FlowModal.vue @@ -0,0 +1,208 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/FormulaModal.vue b/src/components/FlowProcess/src/propPanel/components/FormulaModal.vue new file mode 100644 index 0000000..dddae12 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/FormulaModal.vue @@ -0,0 +1,71 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/components/GlobalSettingModal.vue b/src/components/FlowProcess/src/propPanel/components/GlobalSettingModal.vue new file mode 100644 index 0000000..ce749b8 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/GlobalSettingModal.vue @@ -0,0 +1,152 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/HeaderContainer.vue b/src/components/FlowProcess/src/propPanel/components/HeaderContainer.vue new file mode 100644 index 0000000..da41062 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/HeaderContainer.vue @@ -0,0 +1,37 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/components/InitiatorUserSelect.vue b/src/components/FlowProcess/src/propPanel/components/InitiatorUserSelect.vue new file mode 100644 index 0000000..9b83166 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/InitiatorUserSelect.vue @@ -0,0 +1,230 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/MsgModal.vue b/src/components/FlowProcess/src/propPanel/components/MsgModal.vue new file mode 100644 index 0000000..98d4f8b --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/MsgModal.vue @@ -0,0 +1,143 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/MsgTemplateDetail.vue b/src/components/FlowProcess/src/propPanel/components/MsgTemplateDetail.vue new file mode 100644 index 0000000..1cd02dd --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/MsgTemplateDetail.vue @@ -0,0 +1,294 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/components/NoticeConfig.vue b/src/components/FlowProcess/src/propPanel/components/NoticeConfig.vue new file mode 100644 index 0000000..15e5a2c --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/NoticeConfig.vue @@ -0,0 +1,124 @@ + + diff --git a/src/components/FlowProcess/src/propPanel/components/StyleScript.vue b/src/components/FlowProcess/src/propPanel/components/StyleScript.vue new file mode 100644 index 0000000..868ba54 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/components/StyleScript.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/components/FlowProcess/src/propPanel/index.vue b/src/components/FlowProcess/src/propPanel/index.vue new file mode 100644 index 0000000..f442217 --- /dev/null +++ b/src/components/FlowProcess/src/propPanel/index.vue @@ -0,0 +1,864 @@ + + diff --git a/src/components/FlowProcess/style/index.less b/src/components/FlowProcess/style/index.less new file mode 100644 index 0000000..3914f53 --- /dev/null +++ b/src/components/FlowProcess/style/index.less @@ -0,0 +1,182 @@ +@prefix-cls: ~'@{namespace}-basic-process'; +@line-color: #a9b4cd; + +.flex-center() { + display: flex; + flex-wrap: nowrap; + justify-content: center; + align-items: center; +} + +.center-container { + flex: 1; + height: 100%; + overflow: hidden; + display: flex; + flex-direction: column; + .center-container-top { + flex: 40px 0 0; + display: flex; + justify-content: space-between; + .button-utils { + height: 100%; + display: flex; + align-items: center; + padding: 0 8px; + background-color: @app-content-background; + border-radius: 20px; + margin-left: 10px; + box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.1); + button { + padding: 0 8px; + } + i { + font-size: 20px; + } + .primary-color { + color: @primary-color; + } + } + .right-button-utils { + margin: 0 20px 0 10px; + } + } + .center-container-center { + flex: 1; + } + .scale-slider { + position: absolute; + right: 0px; + z-index: 199; + display: flex; + align-items: center; + .num { + display: inline-block; + width: 40px; + text-align: center; + font-size: 14px; + } + .btn { + display: inline-block; + padding: 4px; + color: @text-color-secondary; + border: 1px solid @border-color-base; + border-radius: 3px; + background: @component-background; + margin-left: 10px; + margin-right: 10px; + cursor: pointer; + } + } +} +.card-title { + height: 43px; + line-height: 43px; + padding: 0 12px; + font-weight: 600; + overflow: hidden; + border-bottom: 1px solid @border-color-base1; +} +.@{prefix-cls} { + display: flex; + height: 100%; +} + +.tips { + position: absolute; + left: 20px; + z-index: 199; + text-align: left; + .tips-item { + line-height: 20px; + font-size: 14px; + display: inline-block; + margin-right: 30px; + .icon { + font-size: 20px; + margin-right: 5px; + color: #c6c9ce; + &.past { + color: #4ed587; + } + &.curr { + color: #a6def8 !important; + } + &.error { + color: #ed6f6f !important; + } + } + } +} +.yunzhupaas-shortcut-key-popover { + display: flex; + padding: 20px; + .left, + .right { + width: 180px; + .item-contain { + &:nth-child(n + 2) { + margin-top: 18px; + } + .title { + font-size: 12px; + color: @text-color-secondary; + margin-bottom: 6px; + } + .items { + display: flex; + margin-top: 4px; + .items-title { + flex: 1; + font-size: 13px; + } + .items-keys { + div { + border: 1px solid #ebecee; + border-radius: 3px; + display: inline-block; + font-size: 12px; + min-width: 22px; + padding: 2px 4px; + text-align: center; + margin-left: 4px; + } + } + } + } + } +} +.formType-radio { + margin-bottom: 10px; + .ant-radio-wrapper { + width: 100%; + line-height: 32px; + margin-right: 0; + } +} +.yunzhupaas-flow-common-popover { + .ant-popover-inner { + border-radius: 8px; + overflow: hidden; + .ant-popover-inner-content { + padding: unset !important; + } + } +} +.candidate-selected:not(:last-child) { + padding-bottom: 20px; + border-bottom: 1px solid @border-color-base1; +} +.transfer-tip { + color: @text-color-base; + font-size: 14px; + line-height: 30px; + font-weight: bolder; +} +.transfer-radio { + width: 100%; +} +.approver-text { + font-size: 14px; + color: #7f7f7f; +} diff --git a/src/components/FlowProcess/style/propPanel.less b/src/components/FlowProcess/style/propPanel.less new file mode 100644 index 0000000..249a94a --- /dev/null +++ b/src/components/FlowProcess/style/propPanel.less @@ -0,0 +1,307 @@ +.right-container.open { + width: 500px !important; +} +.right-container { + width: 0px; + flex-shrink: 0; + background-color: @component-background; + transition: all 0.3s; + display: flex; + flex-direction: column; + border-radius: 8px; + position: relative; + box-shadow: 0px 20px 20px rgba(0, 0, 0, 0.1); + + .toggle-btn { + width: 40px; + height: 40px; + position: absolute; + z-index: 10; + left: -40px; + top: calc(50% - 20px); + cursor: pointer; + border-radius: 8px 0 0 8px; + background: rgba(252, 252, 252, 0.39); + border-radius: 20px 0px 0px 20px; + box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.1); + display: flex; + align-items: center; + justify-content: center; + } + + .header-container { + flex: 50px 0 0; + border-bottom: 1px solid @border-color-base1; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 16px; + font-weight: 600; + background-color: @app-content-background; + border-radius: 8px 8px 0 0; + .header-container-left { + width: 58%; + display: flex; + .node-name { + width: 100%; + height: 100%; + display: flex; + align-items: center; + cursor: pointer; + span { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + min-width: 0; + } + } + i { + padding-left: 5px; + color: @text-color-secondary; + } + } + .header-container-right { + color: @text-color-secondary; + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: right; + } + } + .common-pane { + display: flex; + flex-direction: column; + overflow: hidden; + height: 100%; + width: 500px; + .pane-tabs { + flex-shrink: 0; + .ant-tabs-nav { + margin-bottom: 0; + padding-left: 20px; + .ant-tabs-tab + .ant-tabs-tab { + margin-left: 35px; + } + } + } + .approver-pane-tabs { + .ant-tabs-tab + .ant-tabs-tab { + margin-left: 20px !important; + } + } + .config-content { + flex: 1; + overflow: auto; + padding: 15px; + .form-item-reload { + .ant-form-item-control-input-content { + display: flex; + .common-container { + flex: 1; + margin-inline-end: -1px; + .ant-select-arrow:hover { + z-index: 2 !important; + } + .ant-select { + .ant-select-selector { + border-inline-end-width: 1px; + border-radius: 0; + border-start-start-radius: 4px; + border-end-start-radius: 4px; + } + &:hover { + z-index: 1; + } + } + } + .ant-btn { + padding: 4px 10px; + border-radius: 0; + border-inline-end-width: 1px; + border-start-end-radius: 4px; + border-end-end-radius: 4px; + .anticon-reload { + font-size: 15px; + } + } + & > :last-child { + .ant-select-selector { + border-radius: 4px !important; + } + } + } + } + .ant-form-item { + margin-bottom: 12px; + } + & > .ant-form-item { + & > .ant-form-item-row > .ant-form-item-label { + font-weight: 600; + } + & > .ant-form-item-row > .ant-form-item-control { + padding: 0 10px; + } + } + .file-info { + margin-top: 10px; + display: flex; + align-items: center; + span { + flex: 1; + padding: 3px 5px; + border-radius: 2px; + background-color: @component-background; + } + i { + padding-left: 5px; + font-size: 18px; + cursor: pointer; + } + } + .notice-config { + .link-text { + width: 145px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .parameter-box { + display: block; + min-width: 0; + width: 112px; + height: 30px; + line-height: 30px; + margin-bottom: 8px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + &:last-child { + margin-bottom: 0; + } + } + } + .btn-cell { + display: flex; + align-items: center; + margin-bottom: 10px; + .ant-checkbox-wrapper { + width: 80px; + margin-right: 10px; + flex-shrink: 0; + } + &:last-child { + margin-bottom: unset; + } + } + .conditions-content { + margin-top: 10px; + padding: 6px 0; + min-height: 36px; + display: flex; + align-items: center; + background-color: @app-content-background; + border-radius: 4px; + cursor: pointer; + span { + padding-left: 10px; + flex: 1; + } + i { + padding: 0 10px; + } + } + .parameter-content { + padding: 6px 0; + display: flex; + align-items: center; + background-color: @app-content-background; + border-radius: 4px; + span { + padding-left: 10px; + flex: 1; + } + i { + cursor: pointer; + padding: 0 10px; + } + } + .approver-rule-content { + margin-top: 10px; + display: flex; + flex-direction: column; + border-radius: 4px; + overflow: hidden; + border: 1px solid @border-color-base; + .approver-content { + background-color: @app-content-background; + height: 30px; + display: flex; + align-items: center; + justify-content: space-between; + padding-left: 10px; + i { + padding: 0 8px; + cursor: pointer; + font-size: 14px; + } + } + .approver-text { + padding: 10px 8px; + } + } + } + } + + .type-radio { + .ant-radio-wrapper { + width: calc(33% - 8px); + line-height: 32px; + } + } + .counterSign-radio { + .ant-radio-wrapper { + width: 100%; + line-height: 32px; + margin-right: 0; + } + } + .countersign-cell { + display: flex; + align-items: center; + } +} +.ant-modal.rule-modal { + .ant-modal-body > .scrollbar { + padding: 0 !important; + } + .node-tabs { + .ant-tabs-nav { + margin-bottom: 10px; + } + .ant-tabs-nav-wrap { + padding: 0 20px; + } + .ant-tabs-tabpane { + min-height: 300px !important; + max-height: 500px !important; + padding: 0 10px 10px; + overflow: auto; + } + .rule-cell { + line-height: 32px; + &.mid { + text-align: center; + color: @primary-color; + } + } + .icon-ym-nav-close { + font-size: 12px; + } + .common-tip { + color: @text-color-secondary; + font-size: 14px; + line-height: 30px; + } + } +} diff --git a/src/components/Form/index.ts b/src/components/Form/index.ts new file mode 100644 index 0000000..86e27d8 --- /dev/null +++ b/src/components/Form/index.ts @@ -0,0 +1,9 @@ +import BasicForm from './src/BasicForm.vue'; + +export * from './src/types/form'; +export * from './src/types/formItem'; + +export { useComponentRegister } from './src/hooks/useComponentRegister'; +export { useForm } from './src/hooks/useForm'; + +export { BasicForm }; diff --git a/src/components/Form/src/BasicForm.vue b/src/components/Form/src/BasicForm.vue new file mode 100644 index 0000000..389d4b8 --- /dev/null +++ b/src/components/Form/src/BasicForm.vue @@ -0,0 +1,358 @@ + + + diff --git a/src/components/Form/src/componentMap.ts b/src/components/Form/src/componentMap.ts new file mode 100644 index 0000000..fb29a81 --- /dev/null +++ b/src/components/Form/src/componentMap.ts @@ -0,0 +1,150 @@ +import type { Component } from 'vue'; +import type { ComponentType } from './types/index'; + +/** + * Component list, register here to setting it in the form + */ +import { StrengthMeter } from '@/components/StrengthMeter'; +import { CountdownInput } from '@/components/CountDown'; +// yunzhupaas 组件 +import { + YunzhupaasAlert, + YunzhupaasAreaSelect, + YunzhupaasAutoComplete, + YunzhupaasButton, + YunzhupaasCron, + YunzhupaasCascader, + YunzhupaasColorPicker, + YunzhupaasCheckbox, + YunzhupaasCheckboxSingle, + YunzhupaasDatePicker, + YunzhupaasDateRange, + YunzhupaasTimePicker, + YunzhupaasTimeRange, + YunzhupaasMonthPicker, + YunzhupaasWeekPicker, + YunzhupaasDivider, + YunzhupaasEditor, + YunzhupaasGroupTitle, + YunzhupaasIconPicker, + YunzhupaasInput, + YunzhupaasInputPassword, + YunzhupaasInputGroup, + YunzhupaasInputSearch, + YunzhupaasTextarea, + YunzhupaasInputNumber, + YunzhupaasLink, + YunzhupaasOpenData, + YunzhupaasOrganizeSelect, + YunzhupaasDepSelect, + YunzhupaasPosSelect, + YunzhupaasGroupSelect, + YunzhupaasRoleSelect, + YunzhupaasUserSelect, + YunzhupaasUsersSelect, + YunzhupaasQrcode, + YunzhupaasBarcode, + YunzhupaasRadio, + YunzhupaasRate, + YunzhupaasSelect, + YunzhupaasSlider, + YunzhupaasSign, + YunzhupaasSignature, + YunzhupaasSwitch, + YunzhupaasText, + YunzhupaasTreeSelect, + YunzhupaasUploadFile, + YunzhupaasUploadImg, + YunzhupaasUploadImgSingle, + YunzhupaasRelationForm, + YunzhupaasRelationFormAttr, + YunzhupaasPopupSelect, + YunzhupaasPopupTableSelect, + YunzhupaasPopupAttr, + YunzhupaasNumberRange, + YunzhupaasCalculate, + YunzhupaasInputTable, + YunzhupaasLocation, + YunzhupaasIframe, +} from '@/components/Yunzhupaas'; + +const componentMap = new Map(); + +componentMap.set('StrengthMeter', StrengthMeter); +componentMap.set('InputCountDown', CountdownInput); + +componentMap.set('InputGroup', YunzhupaasInputGroup); +componentMap.set('InputSearch', YunzhupaasInputSearch); +componentMap.set('MonthPicker', YunzhupaasMonthPicker); +componentMap.set('WeekPicker', YunzhupaasWeekPicker); + +componentMap.set('Alert', YunzhupaasAlert); +componentMap.set('AreaSelect', YunzhupaasAreaSelect); +componentMap.set('AutoComplete', YunzhupaasAutoComplete); +componentMap.set('Button', YunzhupaasButton); +componentMap.set('Cron', YunzhupaasCron); +componentMap.set('Cascader', YunzhupaasCascader); +componentMap.set('ColorPicker', YunzhupaasColorPicker); +componentMap.set('Checkbox', YunzhupaasCheckbox); +componentMap.set('YunzhupaasCheckboxSingle', YunzhupaasCheckboxSingle); +componentMap.set('DatePicker', YunzhupaasDatePicker); +componentMap.set('DateRange', YunzhupaasDateRange); +componentMap.set('TimePicker', YunzhupaasTimePicker); +componentMap.set('TimeRange', YunzhupaasTimeRange); +componentMap.set('Divider', YunzhupaasDivider); +componentMap.set('Editor', YunzhupaasEditor); +componentMap.set('GroupTitle', YunzhupaasGroupTitle); +componentMap.set('Input', YunzhupaasInput); +componentMap.set('InputPassword', YunzhupaasInputPassword); +componentMap.set('Textarea', YunzhupaasTextarea); +componentMap.set('InputNumber', YunzhupaasInputNumber); +componentMap.set('IconPicker', YunzhupaasIconPicker); +componentMap.set('Link', YunzhupaasLink); +componentMap.set('OrganizeSelect', YunzhupaasOrganizeSelect); +componentMap.set('DepSelect', YunzhupaasDepSelect); +componentMap.set('PosSelect', YunzhupaasPosSelect); +componentMap.set('GroupSelect', YunzhupaasGroupSelect); +componentMap.set('RoleSelect', YunzhupaasRoleSelect); +componentMap.set('UserSelect', YunzhupaasUserSelect); +componentMap.set('UsersSelect', YunzhupaasUsersSelect); +componentMap.set('Qrcode', YunzhupaasQrcode); +componentMap.set('Barcode', YunzhupaasBarcode); +componentMap.set('Radio', YunzhupaasRadio); +componentMap.set('Rate', YunzhupaasRate); +componentMap.set('Select', YunzhupaasSelect); +componentMap.set('Slider', YunzhupaasSlider); +componentMap.set('Sign', YunzhupaasSign); +componentMap.set('Signature', YunzhupaasSignature); +componentMap.set('Switch', YunzhupaasSwitch); +componentMap.set('Text', YunzhupaasText); +componentMap.set('TreeSelect', YunzhupaasTreeSelect); +componentMap.set('UploadFile', YunzhupaasUploadFile); +componentMap.set('UploadImg', YunzhupaasUploadImg); +componentMap.set('UploadImgSingle', YunzhupaasUploadImgSingle); +componentMap.set('BillRule', YunzhupaasInput); +componentMap.set('ModifyUser', YunzhupaasInput); +componentMap.set('ModifyTime', YunzhupaasInput); +componentMap.set('CreateUser', YunzhupaasOpenData); +componentMap.set('CreateTime', YunzhupaasOpenData); +componentMap.set('CurrOrganize', YunzhupaasOpenData); +componentMap.set('CurrPosition', YunzhupaasOpenData); +componentMap.set('RelationForm', YunzhupaasRelationForm); +componentMap.set('RelationFormAttr', YunzhupaasRelationFormAttr); +componentMap.set('PopupSelect', YunzhupaasPopupSelect); +componentMap.set('PopupTableSelect', YunzhupaasPopupTableSelect); +componentMap.set('PopupAttr', YunzhupaasPopupAttr); +componentMap.set('NumberRange', YunzhupaasNumberRange); +componentMap.set('Calculate', YunzhupaasCalculate); +componentMap.set('InputTable', YunzhupaasInputTable); +componentMap.set('Location', YunzhupaasLocation); +componentMap.set('Iframe', YunzhupaasIframe); + +export function add(compName: ComponentType, component: Component) { + componentMap.set(compName, component); +} + +export function del(compName: ComponentType) { + componentMap.delete(compName); +} + +export { componentMap }; diff --git a/src/components/Form/src/components/FormAction.vue b/src/components/Form/src/components/FormAction.vue new file mode 100644 index 0000000..4bfef06 --- /dev/null +++ b/src/components/Form/src/components/FormAction.vue @@ -0,0 +1,114 @@ + + diff --git a/src/components/Form/src/components/FormItem.vue b/src/components/Form/src/components/FormItem.vue new file mode 100644 index 0000000..c379c0c --- /dev/null +++ b/src/components/Form/src/components/FormItem.vue @@ -0,0 +1,383 @@ + diff --git a/src/components/Form/src/helper.ts b/src/components/Form/src/helper.ts new file mode 100644 index 0000000..e30b664 --- /dev/null +++ b/src/components/Form/src/helper.ts @@ -0,0 +1,73 @@ +import type { Rule } from 'ant-design-vue/es/Form'; +import type { ComponentType } from './types/index'; +import { useI18n } from '@/hooks/web/useI18n'; +import { dateUtil, FormatDate } from '@/utils/dateUtil'; +import { isNumber, isObject } from '@/utils/is'; + +const { t } = useI18n(); + +/** + * @description: 生成placeholder + */ +export function createPlaceholderMessage(component: ComponentType) { + if (component.includes('Input') || component.includes('Complete')) { + return t('common.inputText'); + } + if (component.includes('Picker')) { + return t('common.chooseText'); + } + if ( + component.includes('Select') || + component.includes('Cascader') || + component.includes('Checkbox') || + component.includes('Radio') || + component.includes('Switch') + ) { + // return `请选择${label}`; + return t('common.chooseText'); + } + return ''; +} + +const DATE_TYPE = ['DatePicker', 'MonthPicker', 'WeekPicker']; + +function genType() { + return [...DATE_TYPE, 'DateRange']; +} + +export function setComponentRuleType(rule: Rule, component: ComponentType, valueFormat: string) { + if (['MonthPicker', 'WeekPicker'].includes(component)) { + rule.type = valueFormat ? 'string' : 'object'; + } else if (['DateRange', 'TimeRange', 'Upload', 'CheckboxGroup'].includes(component)) { + rule.type = 'array'; + } else if (['InputNumber', 'Switch', 'DatePicker'].includes(component)) { + rule.type = 'number'; + } +} + +export function processDateValue(attr: Recordable, component: string) { + const { valueFormat, value } = attr; + if (valueFormat) { + attr.value = isObject(value) ? dateUtil(value as FormatDate).format(valueFormat) : value; + } else if (DATE_TYPE.includes(component) && value) { + attr.value = dateUtil(attr.value); + } +} + +export function handleInputNumberValue(component?: ComponentType, val?: any) { + if (!component) return val; + if (['Input', 'InputPassword', 'InputSearch', 'TextArea'].includes(component)) { + return val && isNumber(val) ? `${val}` : val; + } + return val; +} + +/** + * 时间字段 + */ +export const dateItemType = genType(); + +export const defaultValueComponents = ['Input', 'InputPassword', 'InputSearch', 'TextArea']; +export const noFieldComponents = ['Button', 'Divider', 'GroupTitle', 'Link', 'Text', 'Alert', 'Qrcode', 'Barcode']; +export const numberItemType = ['Slider', 'Switch']; +export const useInputComponents = ['BillRule', 'ModifyUser', 'ModifyTime']; diff --git a/src/components/Form/src/hooks/useAdvanced.ts b/src/components/Form/src/hooks/useAdvanced.ts new file mode 100644 index 0000000..61b8a06 --- /dev/null +++ b/src/components/Form/src/hooks/useAdvanced.ts @@ -0,0 +1,158 @@ +import type { ColEx } from '../types'; +import type { AdvanceState } from '../types/hooks'; +import { ComputedRef, getCurrentInstance, Ref, shallowReactive } from 'vue'; +import type { FormProps, FormSchema } from '../types/form'; +import { computed, unref, watch } from 'vue'; +import { isBoolean, isFunction, isNumber, isObject } from '@/utils/is'; +import { useBreakpoint } from '@/hooks/event/useBreakpoint'; +import { useDebounceFn } from '@vueuse/core'; + +const BASIC_COL_LEN = 24; + +interface UseAdvancedContext { + advanceState: AdvanceState; + emit: EmitType; + getProps: ComputedRef; + getSchema: ComputedRef; + formModel: Recordable; + defaultValueRef: Ref; +} + +export default function ({ advanceState, emit, getProps, getSchema, formModel, defaultValueRef }: UseAdvancedContext) { + const vm = getCurrentInstance(); + + const fieldsIsAdvancedMap = shallowReactive({}); + + const { realWidthRef, screenEnum, screenRef } = useBreakpoint(); + + const getEmptySpan = computed((): number => { + if (!advanceState.isAdvanced) { + return 0; + } + // For some special cases, you need to manually specify additional blank lines + const emptySpan = unref(getProps).emptySpan || 0; + + if (isNumber(emptySpan)) { + return emptySpan; + } + if (isObject(emptySpan)) { + const { span = 0 } = emptySpan; + const screen = unref(screenRef) as string; + + const screenSpan = (emptySpan as any)[screen.toLowerCase()]; + return screenSpan || span || 0; + } + return 0; + }); + + const debounceUpdateAdvanced = useDebounceFn(updateAdvanced, 0); + + watch( + [() => unref(getSchema), () => advanceState.isAdvanced, () => unref(realWidthRef)], + () => { + const { showAdvancedButton } = unref(getProps); + if (showAdvancedButton) { + debounceUpdateAdvanced(); + } + }, + { immediate: true }, + ); + + function getAdvanced(itemCol: Partial, itemColSum = 0, isLastAction = false) { + const width = unref(realWidthRef); + + const mdWidth = + parseInt(itemCol.md as string) || parseInt(itemCol.xs as string) || parseInt(itemCol.sm as string) || (itemCol.span as number) || BASIC_COL_LEN; + + const lgWidth = parseInt(itemCol.lg as string) || mdWidth; + const xlWidth = parseInt(itemCol.xl as string) || lgWidth; + const xxlWidth = parseInt(itemCol.xxl as string) || xlWidth; + if (width <= screenEnum.LG) { + itemColSum += mdWidth; + } else if (width < screenEnum.XL) { + itemColSum += lgWidth; + } else if (width < screenEnum.XXL) { + itemColSum += xlWidth; + } else { + itemColSum += xxlWidth; + } + + if (isLastAction) { + advanceState.hideAdvanceBtn = false; + if (itemColSum <= BASIC_COL_LEN * 2 - 6) { + // When less than or equal to 2 lines, the collapse and expand buttons are not displayed + advanceState.hideAdvanceBtn = true; + // 表单组件默认展开问题修复 + // advanceState.isAdvanced = true; + } else if (itemColSum > BASIC_COL_LEN * 2 - 6 && itemColSum <= BASIC_COL_LEN * (unref(getProps).autoAdvancedLine || 30)) { + advanceState.hideAdvanceBtn = false; + + // More than 3 lines collapsed by default + } else if (!advanceState.isLoad) { + advanceState.isLoad = true; + advanceState.isAdvanced = !advanceState.isAdvanced; + } + return { isAdvanced: advanceState.isAdvanced, itemColSum }; + } + if (itemColSum > BASIC_COL_LEN * (unref(getProps).alwaysShowLines || 1) - 6) { + return { isAdvanced: advanceState.isAdvanced, itemColSum }; + } else { + // The first line is always displayed + return { isAdvanced: true, itemColSum }; + } + } + + function updateAdvanced() { + let itemColSum = 0; + let realItemColSum = 0; + const { baseColProps = {} } = unref(getProps); + + for (const schema of unref(getSchema)) { + const { show, colProps } = schema; + let isShow = true; + + if (isBoolean(show)) { + isShow = show; + } + + if (isFunction(show)) { + isShow = show({ + schema: schema, + model: formModel, + field: schema.field, + values: { + ...unref(defaultValueRef), + ...formModel, + }, + }); + } + + if (isShow && (colProps || baseColProps)) { + const { itemColSum: sum, isAdvanced } = getAdvanced({ ...baseColProps, ...colProps }, itemColSum); + + itemColSum = sum || 0; + if (isAdvanced) { + realItemColSum = itemColSum; + } + fieldsIsAdvancedMap[schema.field] = isAdvanced; + } + } + + // 确保页面发送更新(第一次不需要更新、第一次更新会报错) + try { + vm?.proxy?.$forceUpdate(); + } catch (error) {} + + advanceState.actionSpan = (realItemColSum % BASIC_COL_LEN) + unref(getEmptySpan); + + getAdvanced(unref(getProps).actionColOptions || { span: BASIC_COL_LEN }, itemColSum, true); + + emit('advanced-change'); + } + + function handleToggleAdvanced() { + advanceState.isAdvanced = !advanceState.isAdvanced; + } + + return { handleToggleAdvanced, fieldsIsAdvancedMap }; +} diff --git a/src/components/Form/src/hooks/useAutoFocus.ts b/src/components/Form/src/hooks/useAutoFocus.ts new file mode 100644 index 0000000..e24dd6b --- /dev/null +++ b/src/components/Form/src/hooks/useAutoFocus.ts @@ -0,0 +1,40 @@ +import type { ComputedRef, Ref } from 'vue'; +import type { FormSchema, FormActionType, FormProps } from '../types/form'; + +import { unref, nextTick, watchEffect } from 'vue'; + +interface UseAutoFocusContext { + getSchema: ComputedRef; + getProps: ComputedRef; + isInitedDefault: Ref; + formElRef: Ref; +} +export async function useAutoFocus({ + getSchema, + getProps, + formElRef, + isInitedDefault, +}: UseAutoFocusContext) { + watchEffect(async () => { + if (unref(isInitedDefault) || !unref(getProps).autoFocusFirstItem) { + return; + } + await nextTick(); + const schemas = unref(getSchema); + const formEl = unref(formElRef); + const el = (formEl as any)?.$el as HTMLElement; + if (!formEl || !el || !schemas || schemas.length === 0) { + return; + } + + const firstItem = schemas[0]; + // Only open when the first form item is input type + if (!firstItem.component.includes('Input')) { + return; + } + + const inputEl = el.querySelector('.ant-row:first-child input') as Nullable; + if (!inputEl) return; + inputEl?.focus(); + }); +} diff --git a/src/components/Form/src/hooks/useComponentRegister.ts b/src/components/Form/src/hooks/useComponentRegister.ts new file mode 100644 index 0000000..218aaa9 --- /dev/null +++ b/src/components/Form/src/hooks/useComponentRegister.ts @@ -0,0 +1,11 @@ +import type { ComponentType } from '../types/index'; +import { tryOnUnmounted } from '@vueuse/core'; +import { add, del } from '../componentMap'; +import type { Component } from 'vue'; + +export function useComponentRegister(compName: ComponentType, comp: Component) { + add(compName, comp); + tryOnUnmounted(() => { + del(compName); + }); +} diff --git a/src/components/Form/src/hooks/useForm.ts b/src/components/Form/src/hooks/useForm.ts new file mode 100644 index 0000000..64a951f --- /dev/null +++ b/src/components/Form/src/hooks/useForm.ts @@ -0,0 +1,116 @@ +import type { FormProps, FormActionType, UseFormReturnType, FormSchema } from '../types/form'; +import type { NamePath } from 'ant-design-vue/lib/form/interface'; +import type { DynamicProps } from '#/utils'; +import { ref, onUnmounted, unref, nextTick, watch } from 'vue'; +import { isProdMode } from '@/utils/env'; +import { error } from '@/utils/log'; +import { getDynamicProps } from '@/utils'; + +export declare type ValidateFields = (nameList?: NamePath[]) => Promise; + +type Props = Partial>; + +export function useForm(props?: Props): UseFormReturnType { + const formRef = ref>(null); + const loadedRef = ref>(false); + + async function getForm() { + const form = unref(formRef); + if (!form) { + error('The form instance has not been obtained, please make sure that the form has been rendered when performing the form operation!'); + } + await nextTick(); + return form as FormActionType; + } + + function register(instance: FormActionType) { + isProdMode() && + onUnmounted(() => { + formRef.value = null; + loadedRef.value = null; + }); + if (unref(loadedRef) && isProdMode() && instance === unref(formRef)) return; + + formRef.value = instance; + loadedRef.value = true; + + watch( + () => props, + () => { + props && instance.setProps(getDynamicProps(props)); + }, + { + immediate: true, + deep: true, + }, + ); + } + + const methods: FormActionType = { + scrollToField: async (name: NamePath, options?: ScrollOptions | undefined) => { + const form = await getForm(); + form.scrollToField(name, options); + }, + setProps: async (formProps: Partial) => { + const form = await getForm(); + form.setProps(formProps); + }, + + updateSchema: async (data: Partial | Partial[]) => { + const form = await getForm(); + form.updateSchema(data); + }, + + resetSchema: async (data: Partial | Partial[]) => { + const form = await getForm(); + form.resetSchema(data); + }, + + clearValidate: async (name?: string | string[]) => { + const form = await getForm(); + form.clearValidate(name); + }, + + resetFields: async () => { + getForm().then(async form => { + await form.resetFields(); + }); + }, + + removeSchemaByField: async (field: string | string[]) => { + unref(formRef)?.removeSchemaByField(field); + }, + + // TODO promisify + getFieldsValue: () => { + return unref(formRef)?.getFieldsValue() as T; + }, + + setFieldsValue: async >(values: T) => { + const form = await getForm(); + form.setFieldsValue(values); + }, + + appendSchemaByField: async (schema: FormSchema | FormSchema[], prefixField: string | undefined, first: boolean) => { + const form = await getForm(); + form.appendSchemaByField(schema, prefixField, first); + }, + + submit: async (): Promise => { + const form = await getForm(); + return form.submit(); + }, + + validate: async (nameList?: NamePath[]): Promise => { + const form = await getForm(); + return form.validate(nameList); + }, + + validateFields: async (nameList?: NamePath[]): Promise => { + const form = await getForm(); + return form.validateFields(nameList); + }, + }; + + return [register, methods]; +} diff --git a/src/components/Form/src/hooks/useFormContext.ts b/src/components/Form/src/hooks/useFormContext.ts new file mode 100644 index 0000000..0996132 --- /dev/null +++ b/src/components/Form/src/hooks/useFormContext.ts @@ -0,0 +1,17 @@ +import type { InjectionKey } from 'vue'; +import { createContext, useContext } from '@/hooks/core/useContext'; + +export interface FormContextProps { + resetAction: () => Promise; + submitAction: () => Promise; +} + +const key: InjectionKey = Symbol(); + +export function createFormContext(context: FormContextProps) { + return createContext(context, key); +} + +export function useFormContext() { + return useContext(key); +} diff --git a/src/components/Form/src/hooks/useFormEvents.ts b/src/components/Form/src/hooks/useFormEvents.ts new file mode 100644 index 0000000..c18a0ba --- /dev/null +++ b/src/components/Form/src/hooks/useFormEvents.ts @@ -0,0 +1,318 @@ +import type { ComputedRef, Ref } from 'vue'; +import type { FormProps, FormSchema, FormActionType } from '../types/form'; +import type { NamePath } from 'ant-design-vue/lib/form/interface'; +import { unref, toRaw, nextTick } from 'vue'; +import { isArray, isFunction, isObject, isString, isDef, isNullOrUnDef, isEmpty } from '@/utils/is'; +import { deepMerge } from '@/utils'; +import { dateItemType, handleInputNumberValue, defaultValueComponents, noFieldComponents } from '../helper'; +import { cloneDeep, uniqBy } from 'lodash-es'; +import { error } from '@/utils/log'; + +interface UseFormActionContext { + emit: EmitType; + getProps: ComputedRef; + getSchema: ComputedRef; + formModel: Recordable; + defaultValueRef: Ref; + fullValueRef: Ref; + formElRef: Ref; + schemaRef: Ref; + handleFormValues: Fn; + isInitedDefaultRef: Ref; +} +export function useFormEvents({ + emit, + getProps, + formModel, + getSchema, + defaultValueRef, + fullValueRef, + formElRef, + schemaRef, + handleFormValues, + isInitedDefaultRef, +}: UseFormActionContext) { + async function resetFields(): Promise { + fullValueRef.value = {}; + const { resetFunc, submitOnReset } = unref(getProps); + resetFunc && isFunction(resetFunc) && (await resetFunc()); + + const formEl = unref(formElRef); + if (!formEl) return; + + Object.keys(formModel).forEach(key => { + const schema = unref(getSchema).find(item => item.field === key); + const isInput = schema?.component && defaultValueComponents.includes(schema.component); + const defaultValue = cloneDeep(defaultValueRef.value[key]); + formModel[key] = isInput ? defaultValue || '' : defaultValue; + }); + nextTick(() => clearValidate()); + + emit('reset', toRaw(formModel)); + submitOnReset && handleSubmit(); + } + + /** + * @description: Set form value + */ + async function setFieldsValue(values: Recordable): Promise { + fullValueRef.value = { ...fullValueRef.value, ...values }; + const fields = unref(getSchema) + .map(item => item.field) + .filter(Boolean); + + // key 支持 a.b.c 的嵌套写法 + const delimiter = '.'; + const nestKeyArray = fields.filter(item => item.indexOf(delimiter) >= 0); + + const validKeys: string[] = []; + Object.keys(values).forEach(key => { + const schema = unref(getSchema).find(item => item.field === key); + let value = values[key]; + + const hasKey = Reflect.has(values, key); + + value = handleInputNumberValue(schema?.component, value); + // 0| '' is allow + if (hasKey && fields.includes(key)) { + formModel[key] = value; + validKeys.push(key); + } else { + nestKeyArray.forEach((nestKey: string) => { + try { + const value = nestKey.split('.').reduce((out, item) => out[item], values); + if (isDef(value)) { + formModel[nestKey] = value; + validKeys.push(nestKey); + } + } catch (e) { + // key not exist + if (isDef(defaultValueRef.value[nestKey])) { + formModel[nestKey] = cloneDeep(defaultValueRef.value[nestKey]); + } + } + }); + } + }); + validateFields(validKeys).catch(_ => {}); + } + /** + * @description: Delete based on field name + */ + async function removeSchemaByField(fields: string | string[]): Promise { + const schemaList: FormSchema[] = cloneDeep(unref(getSchema)); + if (!fields) { + return; + } + + let fieldList: string[] = isString(fields) ? [fields] : fields; + if (isString(fields)) { + fieldList = [fields]; + } + for (const field of fieldList) { + _removeSchemaByField(field, schemaList); + } + schemaRef.value = schemaList; + } + + /** + * @description: Delete based on field name + */ + function _removeSchemaByField(field: string, schemaList: FormSchema[]): void { + if (isString(field)) { + const index = schemaList.findIndex(schema => schema.field === field); + if (index !== -1) { + delete formModel[field]; + schemaList.splice(index, 1); + } + } + } + + /** + * @description: Insert after a certain field, if not insert the last + */ + async function appendSchemaByField(schema: FormSchema | FormSchema[], prefixField?: string, first = false) { + const schemaList: FormSchema[] = cloneDeep(unref(getSchema)); + const addSchemaIds: string[] = Array.isArray(schema) ? schema.map(item => item.field) : [schema.field]; + if (schemaList.find(item => addSchemaIds.includes(item.field))) { + error('There are schemas that have already been added'); + return; + } + const index = schemaList.findIndex(schema => schema.field === prefixField); + const _schemaList = isObject(schema) ? [schema as FormSchema] : (schema as FormSchema[]); + if (!prefixField || index === -1 || first) { + first ? schemaList.unshift(..._schemaList) : schemaList.push(..._schemaList); + schemaRef.value = schemaList; + _setDefaultValue(schema); + return; + } + if (index !== -1) { + schemaList.splice(index + 1, 0, ..._schemaList); + } + _setDefaultValue(schema); + + schemaRef.value = schemaList; + } + + async function resetSchema(data: Partial | Partial[]) { + let updateData: Partial[] = []; + if (isObject(data)) { + updateData.push(data as FormSchema); + } + if (isArray(data)) { + updateData = [...data]; + } + + const hasField = updateData.every(item => noFieldComponents.includes(item.component as string) || (Reflect.has(item, 'field') && item.field)); + + if (!hasField) { + error('All children of the form Schema array that need to be updated must contain the `field` field'); + return; + } + schemaRef.value = updateData as FormSchema[]; + } + + async function updateSchema(data: Partial | Partial[]) { + let updateData: Partial[] = []; + if (isObject(data)) { + updateData.push(data as FormSchema); + } + if (isArray(data)) { + updateData = [...data]; + } + + const hasField = updateData.every(item => noFieldComponents.includes(item.component as string) || (Reflect.has(item, 'field') && item.field)); + + if (!hasField) { + error('All children of the form Schema array that need to be updated must contain the `field` field'); + return; + } + const schema: FormSchema[] = []; + unref(getSchema).forEach(val => { + let _val; + updateData.forEach(item => { + if (val.field === item.field) { + _val = item; + } + }); + if (_val !== undefined && val.field === _val.field) { + const newSchema = deepMerge(val, _val); + if (Reflect.has(_val, 'componentProps') && Reflect.has(_val.componentProps, 'options')) { + newSchema.componentProps.options = _val.componentProps.options; + } + schema.push(newSchema as FormSchema); + } else { + schema.push(val); + } + }); + _setDefaultValue(schema); + + schemaRef.value = uniqBy(schema, 'field'); + isInitedDefaultRef.value = false; + } + + function _setDefaultValue(data: FormSchema | FormSchema[]) { + let schemas: FormSchema[] = []; + if (isObject(data)) { + schemas.push(data as FormSchema); + } + if (isArray(data)) { + schemas = [...data]; + } + + const obj: Recordable = {}; + const currentFieldsValue = getFieldsValue(); + schemas.forEach(item => { + if ( + !noFieldComponents.includes(item.component) && + Reflect.has(item, 'field') && + item.field && + !isNullOrUnDef(item.defaultValue) && + (!(item.field in currentFieldsValue) || isNullOrUnDef(currentFieldsValue[item.field]) || isEmpty(currentFieldsValue[item.field])) + ) { + obj[item.field] = item.defaultValue; + } + }); + setFieldsValue(obj); + } + + function getFieldsValue(): Recordable { + const formEl = unref(formElRef); + if (!formEl) return {}; + return handleFormValues(toRaw(unref(formModel))); + } + + /** + * @description: Is it time + */ + function itemIsDateType(key: string) { + return unref(getSchema).some(item => { + return item.field === key ? dateItemType.includes(item.component) : false; + }); + } + + async function validateFields(nameList?: NamePath[] | undefined) { + return unref(formElRef)?.validateFields(nameList); + } + + async function validate(nameList?: NamePath[] | undefined) { + try { + const values = await unref(formElRef)?.validate(nameList); + return { ...fullValueRef.value, ...values }; + } catch (error: any) { + if (!error.errorFields.length) { + return { ...fullValueRef.value, ...error.values }; + } else { + return false; + } + } + } + + async function clearValidate(name?: string | string[]) { + await unref(formElRef)?.clearValidate(name); + } + + async function scrollToField(name: NamePath, options?: ScrollOptions | undefined) { + await unref(formElRef)?.scrollToField(name, options); + } + + /** + * @description: Form submission + */ + async function handleSubmit(e?: Event): Promise { + e && e.preventDefault(); + const { submitFunc } = unref(getProps); + if (submitFunc && isFunction(submitFunc)) { + await submitFunc(); + return; + } + const formEl = unref(formElRef); + if (!formEl) return; + try { + const values = await validate(); + const res = handleFormValues(values); + emit('submit', res); + } catch (error: any) { + if (error?.outOfDate === false && error?.errorFields) { + return; + } + throw new Error(error); + } + } + + return { + handleSubmit, + clearValidate, + validate, + validateFields, + getFieldsValue, + updateSchema, + resetSchema, + appendSchemaByField, + removeSchemaByField, + resetFields, + setFieldsValue, + scrollToField, + itemIsDateType, + }; +} diff --git a/src/components/Form/src/hooks/useFormValues.ts b/src/components/Form/src/hooks/useFormValues.ts new file mode 100644 index 0000000..2b1f07a --- /dev/null +++ b/src/components/Form/src/hooks/useFormValues.ts @@ -0,0 +1,141 @@ +import { isArray, isFunction, isObject, isString, isNullOrUnDef } from '@/utils/is'; +import { dateUtil } from '@/utils/dateUtil'; +import { unref } from 'vue'; +import type { Ref, ComputedRef } from 'vue'; +import type { FormProps, FormSchema } from '../types/form'; +import { cloneDeep, set } from 'lodash-es'; + +interface UseFormValuesContext { + defaultValueRef: Ref; + getSchema: ComputedRef; + getProps: ComputedRef; + formModel: Recordable; +} + +/** + * @desription deconstruct array-link key. This method will mutate the target. + */ +function tryDeconstructArray(key: string, value: any, target: Recordable) { + const pattern = /^\[(.+)\]$/; + if (pattern.test(key)) { + const match = key.match(pattern); + if (match && match[1]) { + const keys = match[1].split(','); + value = Array.isArray(value) ? value : [value]; + keys.forEach((k, index) => { + set(target, k.trim(), value[index]); + }); + return true; + } + } +} + +/** + * @desription deconstruct object-link key. This method will mutate the target. + */ +function tryDeconstructObject(key: string, value: any, target: Recordable) { + const pattern = /^\{(.+)\}$/; + if (pattern.test(key)) { + const match = key.match(pattern); + if (match && match[1]) { + const keys = match[1].split(','); + value = isObject(value) ? value : {}; + keys.forEach(k => { + set(target, k.trim(), value[k.trim()]); + }); + return true; + } + } +} + +export function useFormValues({ defaultValueRef, getSchema, formModel, getProps }: UseFormValuesContext) { + // Processing form values + function handleFormValues(values: Recordable) { + if (!isObject(values)) { + return {}; + } + const res: Recordable = {}; + for (const item of Object.entries(values)) { + let [, value] = item; + const [key] = item; + if (!key || (isArray(value) && value.length === 0) || isFunction(value)) { + continue; + } + const transformDateFunc = unref(getProps).transformDateFunc; + if (isObject(value)) { + value = transformDateFunc?.(value); + } + + if (isArray(value) && value[0]?.format && value[1]?.format) { + value = value.map(item => transformDateFunc?.(item)); + } + // Remove spaces + if (isString(value)) { + // remove params from URL + if (value === '') { + value = undefined; + } else { + value = value.trim(); + } + } + if (!tryDeconstructArray(key, value, res) && !tryDeconstructObject(key, value, res)) { + // 没有解构成功的,按原样赋值 + set(res, key, value); + } + } + return handleRangeTimeValue(res); + } + + /** + * @description: Processing time interval parameters + */ + function handleRangeTimeValue(values: Recordable) { + const fieldMapToTime = unref(getProps).fieldMapToTime; + + if (!fieldMapToTime || !Array.isArray(fieldMapToTime)) { + return values; + } + + for (const [field, [startTimeKey, endTimeKey], format = ''] of fieldMapToTime) { + if (!field || !startTimeKey || !endTimeKey) { + continue; + } + // If the value to be converted is empty, remove the field + if (!values[field]) { + Reflect.deleteProperty(values, field); + continue; + } + + const [startTime, endTime]: string[] = values[field]; + if (format) { + const [startTimeFormat, endTimeFormat] = Array.isArray(format) ? format : [format, format]; + values[startTimeKey] = dateUtil(startTime).format(startTimeFormat); + values[endTimeKey] = dateUtil(endTime).format(endTimeFormat); + } else { + values[startTimeKey] = startTime; + values[endTimeKey] = endTime; + } + + Reflect.deleteProperty(values, field); + } + return values; + } + + function initDefault() { + const schemas = unref(getSchema); + const obj: Recordable = {}; + schemas.forEach(item => { + const { defaultValue } = item; + if (!isNullOrUnDef(defaultValue)) { + obj[item.field] = defaultValue; + + if (formModel[item.field] === undefined) { + formModel[item.field] = defaultValue; + } + } + }); + defaultValueRef.value = cloneDeep(obj); + } + + return { handleFormValues, initDefault }; +} diff --git a/src/components/Form/src/hooks/useLabelWidth.ts b/src/components/Form/src/hooks/useLabelWidth.ts new file mode 100644 index 0000000..3eb96ad --- /dev/null +++ b/src/components/Form/src/hooks/useLabelWidth.ts @@ -0,0 +1,37 @@ +import type { Ref } from 'vue'; +import { computed, unref } from 'vue'; +import type { FormProps, FormSchema } from '../types/form'; +import { isNumber } from '@/utils/is'; + +export function useItemLabelWidth(schemaItemRef: Ref, propsRef: Ref) { + return computed(() => { + const schemaItem = unref(schemaItemRef); + const { labelCol = {}, wrapperCol = {} } = schemaItem.itemProps || {}; + const { labelWidth, disabledLabelWidth } = schemaItem; + + const { labelWidth: globalLabelWidth, labelCol: globalLabelCol, wrapperCol: globWrapperCol, layout } = unref(propsRef); + + // If labelWidth is set globally, all items setting + if ((!globalLabelWidth && !labelWidth && !globalLabelCol) || disabledLabelWidth) { + labelCol.style = { + textAlign: 'left', + }; + return { labelCol, wrapperCol }; + } + let width = labelWidth || globalLabelWidth; + const col = { ...globalLabelCol, ...labelCol }; + const wrapCol = { ...globWrapperCol, ...wrapperCol }; + + if (width) { + width = isNumber(width) ? `${width}px` : width; + } + + return { + labelCol: { style: { width }, ...col }, + wrapperCol: { + style: { width: layout === 'vertical' ? '100%' : `calc(100% - ${width})` }, + ...wrapCol, + }, + }; + }); +} diff --git a/src/components/Form/src/props.ts b/src/components/Form/src/props.ts new file mode 100644 index 0000000..be0e663 --- /dev/null +++ b/src/components/Form/src/props.ts @@ -0,0 +1,104 @@ +import type { FieldMapToTime, FormSchema } from './types/form'; +import type { CSSProperties, PropType } from 'vue'; +import type { ColEx } from './types'; +import type { TableActionType } from '@/components/Table'; +import type { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; +import type { RowProps } from 'ant-design-vue/lib/grid/Row'; +import { propTypes } from '@/utils/propTypes'; + +export const basicProps = { + model: { + type: Object as PropType, + default: () => ({}), + }, + // 标签宽度 固定宽度 + labelWidth: { + type: [Number, String] as PropType, + default: 80, + }, + fieldMapToTime: { + type: Array as PropType, + default: () => [], + }, + compact: propTypes.bool, + // 表单配置规则 + schemas: { + type: Array as PropType, + default: () => [], + }, + mergeDynamicData: { + type: Object as PropType, + default: null, + }, + baseRowStyle: { + type: Object as PropType, + }, + baseColProps: { + type: Object as PropType>, + default: () => ({ span: 24 }), + }, + autoSetPlaceHolder: propTypes.bool.def(true), + // 在INPUT组件上单击回车时,是否自动提交 + autoSubmitOnEnter: propTypes.bool.def(false), + submitOnReset: propTypes.bool, + submitOnChange: propTypes.bool, + size: propTypes.oneOf(['default', 'small', 'large']).def('default'), + // 禁用表单 + disabled: propTypes.bool, + emptySpan: { + type: [Number, Object] as PropType, + default: 0, + }, + // 是否显示收起展开按钮 + showAdvancedButton: propTypes.bool, + // 转化时间 + transformDateFunc: { + type: Function as PropType, + default: (date: any) => { + return date?.format?.('YYYY-MM-DD HH:mm:ss') ?? date; + }, + }, + rulesMessageJoinLabel: propTypes.bool.def(true), + // 超过3行自动折叠 + autoAdvancedLine: propTypes.number.def(30), + // 不受折叠影响的行数 + alwaysShowLines: propTypes.number.def(1), + + // 是否显示操作按钮 + showActionButtonGroup: propTypes.bool.def(false), + // 操作列Col配置 + actionColOptions: Object as PropType>, + // 显示重置按钮 + showResetButton: propTypes.bool.def(true), + // 是否聚焦第一个输入框,只在第一个表单项为input的时候作用 + autoFocusFirstItem: propTypes.bool, + // 重置按钮配置 + resetButtonOptions: Object as PropType>, + + // 显示确认按钮 + showSubmitButton: propTypes.bool.def(true), + // 确认按钮配置 + submitButtonOptions: Object as PropType>, + + // 自定义重置函数 + resetFunc: Function as PropType<() => Promise>, + submitFunc: Function as PropType<() => Promise>, + + // 以下为默认props + hideRequiredMark: propTypes.bool, + + labelCol: Object as PropType>, + + layout: propTypes.oneOf(['horizontal', 'vertical', 'inline']).def('horizontal'), + tableAction: { + type: Object as PropType, + }, + + wrapperCol: Object as PropType>, + + colon: propTypes.bool, + + labelAlign: propTypes.string, + + rowProps: Object as PropType, +}; diff --git a/src/components/Form/src/types/form.ts b/src/components/Form/src/types/form.ts new file mode 100644 index 0000000..293b987 --- /dev/null +++ b/src/components/Form/src/types/form.ts @@ -0,0 +1,209 @@ +import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface'; +import type { VNode } from 'vue'; +import type { ButtonProps as AntdButtonProps } from '@/components/Button'; +import type { FormItem } from './formItem'; +import type { ColEx, ComponentType } from './index'; +import type { TableActionType } from '@/components/Table/src/types/table'; +import type { CSSProperties } from 'vue'; +import type { RowProps } from 'ant-design-vue/lib/grid/Row'; + +export type FieldMapToTime = [string, [string, string], (string | [string, string])?][]; + +export type Rule = RuleObject & { + trigger?: 'blur' | 'change' | ['change', 'blur']; +}; + +export interface RenderCallbackParams { + schema: FormSchema; + values: Recordable; + model: Recordable; + field: string; +} + +export interface ButtonProps extends AntdButtonProps { + text?: string; +} + +export interface FormActionType { + submit: () => Promise; + setFieldsValue: >(values: T) => Promise; + resetFields: () => Promise; + getFieldsValue: () => Recordable; + clearValidate: (name?: string | string[]) => Promise; + updateSchema: (data: Partial | Partial[]) => Promise; + resetSchema: (data: Partial | Partial[]) => Promise; + setProps: (formProps: Partial) => Promise; + removeSchemaByField: (field: string | string[]) => Promise; + appendSchemaByField: (schema: FormSchema | FormSchema[], prefixField: string | undefined, first?: boolean | undefined) => Promise; + validateFields: (nameList?: NamePath[]) => Promise; + validate: (nameList?: NamePath[]) => Promise; + scrollToField: (name: NamePath, options?: ScrollOptions) => Promise; +} + +export type RegisterFn = (formInstance: FormActionType) => void; + +export type UseFormReturnType = [RegisterFn, FormActionType]; + +export interface FormProps { + name?: string; + layout?: 'vertical' | 'inline' | 'horizontal'; + // Form value + model?: Recordable; + // The width of all items in the entire form + labelWidth?: number | string; + // alignment + labelAlign?: 'left' | 'right'; + // Row configuration for the entire form + rowProps?: RowProps; + // Submit form on reset + submitOnReset?: boolean; + // Submit form on form changing + submitOnChange?: boolean; + // Col configuration for the entire form + labelCol?: Partial; + // Col configuration for the entire form + wrapperCol?: Partial; + + // General row style + baseRowStyle?: CSSProperties; + + // General col configuration + baseColProps?: Partial; + + // Form configuration rules + schemas?: FormSchema[]; + // Function values used to merge into dynamic control form items + mergeDynamicData?: Recordable; + // Compact mode for search forms + compact?: boolean; + // Blank line span + emptySpan?: number | Partial; + // Internal component size of the form + size?: 'default' | 'small' | 'large'; + // Whether to disable + disabled?: boolean; + // Time interval fields are mapped into multiple + fieldMapToTime?: FieldMapToTime; + // Placeholder is set automatically + autoSetPlaceHolder?: boolean; + // Auto submit on press enter on input + autoSubmitOnEnter?: boolean; + // Check whether the information is added to the label + rulesMessageJoinLabel?: boolean; + // Whether to show collapse and expand buttons + showAdvancedButton?: boolean; + // Whether to focus on the first input box, only works when the first form item is input + autoFocusFirstItem?: boolean; + // Automatically collapse over the specified number of rows + autoAdvancedLine?: number; + // Always show lines + alwaysShowLines?: number; + // Whether to show the operation button + showActionButtonGroup?: boolean; + + // Reset button configuration + resetButtonOptions?: Partial; + + // Confirm button configuration + submitButtonOptions?: Partial; + + // Operation column configuration + actionColOptions?: Partial; + + // Show reset button + showResetButton?: boolean; + // Show confirmation button + showSubmitButton?: boolean; + + resetFunc?: () => Promise; + submitFunc?: () => Promise; + transformDateFunc?: (date: any) => string; + colon?: boolean; +} +export interface FormSchema { + // Field name + field: string; + // Event name triggered by internal value change, default change + changeEvent?: string; + // Variable name bound to v-model Default value + valueField?: string; + className?: string | string[]; + // Label name + label: string | VNode; + extra?: string; + // 权限编码控制是否显示 + auth?: string; + // Auxiliary text + subLabel?: string; + // Help text on the right side of the text + helpMessage?: string | string[] | ((renderCallbackParams: RenderCallbackParams) => string | string[]); + // BaseHelp component props + helpComponentProps?: Partial; + // Label width, if it is passed, the labelCol and WrapperCol configured by itemProps will be invalid + labelWidth?: string | number; + // Disable the adjustment of labelWidth with global settings of formModel, and manually set labelCol and wrapperCol by yourself + disabledLabelWidth?: boolean; + // render component + component: ComponentType; + // Component parameters + componentProps?: ((opt: { schema: FormSchema; tableAction: TableActionType; formActionType: FormActionType; formModel: Recordable }) => Recordable) | object; + // Required + required?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); + + suffix?: string | number | ((values: RenderCallbackParams) => string | number); + + // Validation rules + rules?: Rule[]; + // Check whether the information is added to the label + rulesMessageJoinLabel?: boolean; + + // Reference formModelItem + itemProps?: Partial; + + // col configuration outside formModelItem + colProps?: Partial; + + // 默认值 + defaultValue?: any; + isAdvanced?: boolean; + + // Matching details components + span?: number; + + ifShow?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); + + show?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); + + // Render the content in the form-item tag + render?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string; + + // Rendering col content requires outer wrapper form-item + renderColContent?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string; + + renderComponentContent?: ((renderCallbackParams: RenderCallbackParams) => any) | VNode | VNode[] | string; + + // Custom slot, in from-item + slot?: string; + + // Custom slot, similar to renderColContent + colSlot?: string; + + dynamicDisabled?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean); + + dynamicRules?: (renderCallbackParams: RenderCallbackParams) => Rule[]; +} +export interface HelpComponentProps { + maxWidth: string; + // Whether to display the serial number + showIndex: boolean; + // Text list + text: any; + // colour + color: string; + // font size + fontSize: string; + icon: string; + absolute: boolean; + // Positioning + position: any; +} diff --git a/src/components/Form/src/types/formItem.ts b/src/components/Form/src/types/formItem.ts new file mode 100644 index 0000000..77b238a --- /dev/null +++ b/src/components/Form/src/types/formItem.ts @@ -0,0 +1,91 @@ +import type { NamePath } from 'ant-design-vue/lib/form/interface'; +import type { ColProps } from 'ant-design-vue/lib/grid/Col'; +import type { HTMLAttributes, VNodeChild } from 'vue'; + +export interface FormItem { + /** + * Used with label, whether to display : after label text. + * @default true + * @type boolean + */ + colon?: boolean; + + /** + * The extra prompt message. It is similar to help. Usage example: to display error message and prompt message at the same time. + * @type any (string | slot) + */ + extra?: string | VNodeChild | JSX.Element; + + /** + * Used with validateStatus, this option specifies the validation status icon. Recommended to be used only with Input. + * @default false + * @type boolean + */ + hasFeedback?: boolean; + + /** + * The prompt message. If not provided, the prompt message will be generated by the validation rule. + * @type any (string | slot) + */ + help?: string | VNodeChild | JSX.Element; + + /** + * Label test + * @type any (string | slot) + */ + label?: string | VNodeChild | JSX.Element; + + /** + * The layout of label. You can set span offset to something like {span: 3, offset: 12} or sm: {span: 3, offset: 12} same as with + * @type Col + */ + labelCol?: ColProps & HTMLAttributes; + + /** + * Whether provided or not, it will be generated by the validation rule. + * @default false + * @type boolean + */ + required?: boolean; + + /** + * The validation status. If not provided, it will be generated by validation rule. options: 'success' 'warning' 'error' 'validating' + * @type string + */ + validateStatus?: '' | 'success' | 'warning' | 'error' | 'validating'; + + /** + * The layout for input controls, same as labelCol + * @type Col + */ + wrapperCol?: ColProps; + /** + * Set sub label htmlFor. + */ + htmlFor?: string; + /** + * text align of label + */ + labelAlign?: 'left' | 'right'; + /** + * a key of model. In the setting of validate and resetFields method, the attribute is required + */ + name?: NamePath; + /** + * validation rules of form + */ + rules?: object | object[]; + /** + * Whether to automatically associate form fields. In most cases, you can setting automatic association. + * If the conditions for automatic association are not met, you can manually associate them. See the notes below. + */ + autoLink?: boolean; + /** + * Whether stop validate on first rule of error for this field. + */ + validateFirst?: boolean; + /** + * When to validate the value of children node + */ + validateTrigger?: string | string[] | false; +} diff --git a/src/components/Form/src/types/hooks.ts b/src/components/Form/src/types/hooks.ts new file mode 100644 index 0000000..0308e73 --- /dev/null +++ b/src/components/Form/src/types/hooks.ts @@ -0,0 +1,6 @@ +export interface AdvanceState { + isAdvanced: boolean; + hideAdvanceBtn: boolean; + isLoad: boolean; + actionSpan: number; +} diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts new file mode 100644 index 0000000..feef090 --- /dev/null +++ b/src/components/Form/src/types/index.ts @@ -0,0 +1,150 @@ +type ColSpanType = number | string; +export interface ColEx { + style?: any; + /** + * raster number of cells to occupy, 0 corresponds to display: none + * @default none (0) + * @type ColSpanType + */ + span?: ColSpanType; + + /** + * raster order, used in flex layout mode + * @default 0 + * @type ColSpanType + */ + order?: ColSpanType; + + /** + * the layout fill of flex + * @default none + * @type ColSpanType + */ + flex?: ColSpanType; + + /** + * the number of cells to offset Col from the left + * @default 0 + * @type ColSpanType + */ + offset?: ColSpanType; + + /** + * the number of cells that raster is moved to the right + * @default 0 + * @type ColSpanType + */ + push?: ColSpanType; + + /** + * the number of cells that raster is moved to the left + * @default 0 + * @type ColSpanType + */ + pull?: ColSpanType; + + /** + * <576px and also default setting, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + xs?: { span: ColSpanType; offset: ColSpanType } | ColSpanType; + + /** + * ≥576px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + sm?: { span: ColSpanType; offset: ColSpanType } | ColSpanType; + + /** + * ≥768px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + md?: { span: ColSpanType; offset: ColSpanType } | ColSpanType; + + /** + * ≥992px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + lg?: { span: ColSpanType; offset: ColSpanType } | ColSpanType; + + /** + * ≥1200px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + xl?: { span: ColSpanType; offset: ColSpanType } | ColSpanType; + + /** + * ≥1600px, could be a span value or an object containing above props + * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType + */ + xxl?: { span: ColSpanType; offset: ColSpanType } | ColSpanType; +} + +export type ComponentType = + | 'InputGroup' + | 'InputSearch' + | 'InputCountDown' + | 'AutoComplete' + | 'MonthPicker' + | 'WeekPicker' + | 'StrengthMeter' + | 'IconPicker' + | 'Render' + | 'Alert' + | 'AreaSelect' + | 'Button' + | 'Cron' + | 'Cascader' + | 'ColorPicker' + | 'Checkbox' + | 'YunzhupaasCheckboxSingle' + | 'DatePicker' + | 'DateRange' + | 'TimePicker' + | 'TimeRange' + | 'Divider' + | 'Editor' + | 'GroupTitle' + | 'Input' + | 'InputPassword' + | 'Textarea' + | 'InputNumber' + | 'Link' + | 'OrganizeSelect' + | 'DepSelect' + | 'PosSelect' + | 'GroupSelect' + | 'RoleSelect' + | 'UserSelect' + | 'UsersSelect' + | 'Qrcode' + | 'Barcode' + | 'Radio' + | 'Rate' + | 'Select' + | 'Slider' + | 'Sign' + | 'Signature' + | 'Switch' + | 'Text' + | 'TreeSelect' + | 'UploadFile' + | 'UploadImg' + | 'UploadImgSingle' + | 'RelationForm' + | 'RelationFormAttr' + | 'PopupSelect' + | 'PopupTableSelect' + | 'PopupAttr' + | 'NumberRange' + | 'Calculate' + | 'InputTable' + | 'BillRule' + | 'ModifyUser' + | 'ModifyTime' + | 'CreateUser' + | 'CreateTime' + | 'CurrOrganize' + | 'CurrPosition' + | 'Location' + | 'Iframe'; diff --git a/src/components/FormExtraPanel/CommentInput.vue b/src/components/FormExtraPanel/CommentInput.vue new file mode 100644 index 0000000..c4eca57 --- /dev/null +++ b/src/components/FormExtraPanel/CommentInput.vue @@ -0,0 +1,270 @@ + + + diff --git a/src/components/FormExtraPanel/CommentList.vue b/src/components/FormExtraPanel/CommentList.vue new file mode 100644 index 0000000..5c4a1ce --- /dev/null +++ b/src/components/FormExtraPanel/CommentList.vue @@ -0,0 +1,154 @@ + + diff --git a/src/components/FormExtraPanel/DataLogList.vue b/src/components/FormExtraPanel/DataLogList.vue new file mode 100644 index 0000000..11f0820 --- /dev/null +++ b/src/components/FormExtraPanel/DataLogList.vue @@ -0,0 +1,153 @@ + + diff --git a/src/components/FormExtraPanel/index.vue b/src/components/FormExtraPanel/index.vue new file mode 100644 index 0000000..1d29805 --- /dev/null +++ b/src/components/FormExtraPanel/index.vue @@ -0,0 +1,53 @@ + + diff --git a/src/components/FormExtraPanel/modal/ChildLogModal.vue b/src/components/FormExtraPanel/modal/ChildLogModal.vue new file mode 100644 index 0000000..b9bc3e3 --- /dev/null +++ b/src/components/FormExtraPanel/modal/ChildLogModal.vue @@ -0,0 +1,154 @@ + + + diff --git a/src/components/FormExtraPanel/modal/FlowUserModal.vue b/src/components/FormExtraPanel/modal/FlowUserModal.vue new file mode 100644 index 0000000..f96eaa2 --- /dev/null +++ b/src/components/FormExtraPanel/modal/FlowUserModal.vue @@ -0,0 +1,143 @@ + + diff --git a/src/components/FormExtraPanel/modal/UserSelectModal.vue b/src/components/FormExtraPanel/modal/UserSelectModal.vue new file mode 100644 index 0000000..a7dba4a --- /dev/null +++ b/src/components/FormExtraPanel/modal/UserSelectModal.vue @@ -0,0 +1,245 @@ + + diff --git a/src/components/FormGenerator/index.ts b/src/components/FormGenerator/index.ts new file mode 100644 index 0000000..2b36b0b --- /dev/null +++ b/src/components/FormGenerator/index.ts @@ -0,0 +1,5 @@ +import './style/index.less'; +import './style/rightPanel.less'; +import FormGenerator from './src/FormGenerator.vue'; + +export { FormGenerator }; diff --git a/src/components/FormGenerator/src/DraggableItem.vue b/src/components/FormGenerator/src/DraggableItem.vue new file mode 100644 index 0000000..0308d47 --- /dev/null +++ b/src/components/FormGenerator/src/DraggableItem.vue @@ -0,0 +1,623 @@ + diff --git a/src/components/FormGenerator/src/FormGenerator.vue b/src/components/FormGenerator/src/FormGenerator.vue new file mode 100644 index 0000000..feda15d --- /dev/null +++ b/src/components/FormGenerator/src/FormGenerator.vue @@ -0,0 +1,1109 @@ + + diff --git a/src/components/FormGenerator/src/RightPanel.vue b/src/components/FormGenerator/src/RightPanel.vue new file mode 100644 index 0000000..a299cc9 --- /dev/null +++ b/src/components/FormGenerator/src/RightPanel.vue @@ -0,0 +1,633 @@ + + diff --git a/src/components/FormGenerator/src/components/AddDetailExtraModal.vue b/src/components/FormGenerator/src/components/AddDetailExtraModal.vue new file mode 100644 index 0000000..5f8748f --- /dev/null +++ b/src/components/FormGenerator/src/components/AddDetailExtraModal.vue @@ -0,0 +1,240 @@ + + diff --git a/src/components/FormGenerator/src/components/AiChatPopover.vue b/src/components/FormGenerator/src/components/AiChatPopover.vue new file mode 100644 index 0000000..db8abed --- /dev/null +++ b/src/components/FormGenerator/src/components/AiChatPopover.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/components/FormGenerator/src/components/AiFieldModal.vue b/src/components/FormGenerator/src/components/AiFieldModal.vue new file mode 100644 index 0000000..93536e5 --- /dev/null +++ b/src/components/FormGenerator/src/components/AiFieldModal.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/components/FormGenerator/src/components/BusinessKeyCfgModal.vue b/src/components/FormGenerator/src/components/BusinessKeyCfgModal.vue new file mode 100644 index 0000000..0bf3333 --- /dev/null +++ b/src/components/FormGenerator/src/components/BusinessKeyCfgModal.vue @@ -0,0 +1,104 @@ + + + diff --git a/src/components/FormGenerator/src/components/CustomBtnCfg.vue b/src/components/FormGenerator/src/components/CustomBtnCfg.vue new file mode 100644 index 0000000..7100655 --- /dev/null +++ b/src/components/FormGenerator/src/components/CustomBtnCfg.vue @@ -0,0 +1,452 @@ + + diff --git a/src/components/FormGenerator/src/components/DetailExtraModal.vue b/src/components/FormGenerator/src/components/DetailExtraModal.vue new file mode 100644 index 0000000..96d771c --- /dev/null +++ b/src/components/FormGenerator/src/components/DetailExtraModal.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/components/FormGenerator/src/components/FieldModal.vue b/src/components/FormGenerator/src/components/FieldModal.vue new file mode 100644 index 0000000..4f4e7fb --- /dev/null +++ b/src/components/FormGenerator/src/components/FieldModal.vue @@ -0,0 +1,184 @@ + + + diff --git a/src/components/FormGenerator/src/components/FormAttrPane.vue b/src/components/FormGenerator/src/components/FormAttrPane.vue new file mode 100644 index 0000000..7446abd --- /dev/null +++ b/src/components/FormGenerator/src/components/FormAttrPane.vue @@ -0,0 +1,286 @@ + + diff --git a/src/components/FormGenerator/src/components/FormScript.vue b/src/components/FormGenerator/src/components/FormScript.vue new file mode 100644 index 0000000..d2f18f3 --- /dev/null +++ b/src/components/FormGenerator/src/components/FormScript.vue @@ -0,0 +1,97 @@ + + diff --git a/src/components/FormGenerator/src/components/KitForm.vue b/src/components/FormGenerator/src/components/KitForm.vue new file mode 100644 index 0000000..b55afca --- /dev/null +++ b/src/components/FormGenerator/src/components/KitForm.vue @@ -0,0 +1,106 @@ + + diff --git a/src/components/FormGenerator/src/components/LaunchFlowCfg.vue b/src/components/FormGenerator/src/components/LaunchFlowCfg.vue new file mode 100644 index 0000000..7cbc089 --- /dev/null +++ b/src/components/FormGenerator/src/components/LaunchFlowCfg.vue @@ -0,0 +1,190 @@ + + diff --git a/src/components/FormGenerator/src/components/Parser.vue b/src/components/FormGenerator/src/components/Parser.vue new file mode 100644 index 0000000..0fdc250 --- /dev/null +++ b/src/components/FormGenerator/src/components/Parser.vue @@ -0,0 +1,917 @@ + diff --git a/src/components/FormGenerator/src/components/PreviewModal.vue b/src/components/FormGenerator/src/components/PreviewModal.vue new file mode 100644 index 0000000..cfb9356 --- /dev/null +++ b/src/components/FormGenerator/src/components/PreviewModal.vue @@ -0,0 +1,65 @@ + + diff --git a/src/components/FormGenerator/src/components/ScriptDemo.vue b/src/components/FormGenerator/src/components/ScriptDemo.vue new file mode 100644 index 0000000..36cc34e --- /dev/null +++ b/src/components/FormGenerator/src/components/ScriptDemo.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components/FormGenerator/src/components/StylePane.vue b/src/components/FormGenerator/src/components/StylePane.vue new file mode 100644 index 0000000..6177b78 --- /dev/null +++ b/src/components/FormGenerator/src/components/StylePane.vue @@ -0,0 +1,67 @@ + + diff --git a/src/components/FormGenerator/src/components/StyleScript.vue b/src/components/FormGenerator/src/components/StyleScript.vue new file mode 100644 index 0000000..4d9469d --- /dev/null +++ b/src/components/FormGenerator/src/components/StyleScript.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/components/FormGenerator/src/helper/aiUtils.ts b/src/components/FormGenerator/src/helper/aiUtils.ts new file mode 100644 index 0000000..cac145e --- /dev/null +++ b/src/components/FormGenerator/src/helper/aiUtils.ts @@ -0,0 +1,70 @@ +import { inputComponents, selectComponents, systemComponents, formConf as defaultFormConf } from '@/components/FormGenerator/src/helper/componentMap'; +import { buildBitUUID } from '@/utils/uuid'; +import { cloneDeep } from 'lodash-es'; +import { dyOptionsList } from '@/components/FormGenerator/src/helper/config'; + +export function buildAiFields(aiModelList) { + // 可支持组件 + const componentList = cloneDeep([...inputComponents, ...selectComponents, ...systemComponents]); + // 处理组件字段 + const processField = (child, tableName?, isSubTable = false) => { + const component = componentList.find(o => o.__config__.yunzhupaasKey === child.fieldComponent) || componentList[0]; + let field: any = { + ...component, + __config__: { + ...component.__config__, + label: child.fieldTitle, + formId: `formItem${buildBitUUID()}`, + renderKey: +new Date(), + isSubTable, + }, + __vModel__: child.fieldName, + }; + if (isSubTable) field.__config__.parentVModel = tableName; + if (dyOptionsList.includes(component.__config__.yunzhupaasKey)) field.options = child.fieldOptions || []; + return field; + }; + // 处理组件 + const handleItemModel = item => { + if (item.isMain) { + return item.fields.map(child => processField(child)); + } else { + const tableComponent: any = componentList.find(o => o.__config__.yunzhupaasKey === 'table'); + const children = item.fields.map(child => processField(child, item.tableName, true)); + return { + ...tableComponent, + __config__: { + ...tableComponent.__config__, + label: item.tableTitle, + children, + }, + __vModel__: `tableField${buildBitUUID()}`, + }; + } + }; + return aiModelList.map(handleItemModel).flat() || []; +} +export function buildAiFormData(aiModelList) { + // 表单默认数据 + const defaultDataForm = { + id: '', + fullName: '', + enCode: '', + type: 1, + webType: 2, + dbLinkId: '0', + sortCode: 0, + state: 1, + category: '', + description: '', + interfaceId: '', + interfaceName: '', + interfaceParam: '', + columnData: null, + appColumnData: null, + tables: '[]', + }; + const formData = cloneDeep(defaultFormConf); + formData.fields = buildAiFields(aiModelList) || []; + return { ...defaultDataForm, formData: JSON.stringify(formData) }; +} diff --git a/src/components/FormGenerator/src/helper/componentMap.ts b/src/components/FormGenerator/src/helper/componentMap.ts new file mode 100644 index 0000000..dae8028 --- /dev/null +++ b/src/components/FormGenerator/src/helper/componentMap.ts @@ -0,0 +1,2083 @@ +import type { GenItem } from '../types/genItem'; +// 表单属性【右面板】 +export const formConf = { + formRef: 'formRef', + formModel: 'dataForm', + size: 'middle', //large,middle,small + labelPosition: 'right', + labelWidth: 100, + labelSuffix: '', // 标题后缀 + formRules: 'rules', + popupType: 'general', + generalWidth: '600px', + fullScreenWidth: '100%', + drawerWidth: '600px', + gutter: 15, + disabled: false, + span: 24, + colon: false, + hasCancelBtn: true, + cancelButtonText: '取消', + cancelButtonTextI18nCode: 'common.cancelText', + hasConfirmBtn: true, + confirmButtonText: '确定', + confirmButtonTextI18nCode: 'common.okText', + hasConfirmAndAddBtn: true, + hasPrintBtn: false, + printButtonText: '打印', + printButtonTextI18nCode: 'common.printText', + customBtns: [], + primaryKeyPolicy: 1, + concurrencyLock: false, + logicalDelete: false, + dataLog: false, + useBusinessKey: false, + businessKeyList: [], + businessKeyTip: '数据已存在,请勿重复提交!', + printId: '', + formStyle: '', + classNames: [], + className: [], + classJson: '', + detailExtraList: [], //详情页tab信息 + funcs: { + onLoad: '({ formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + beforeSubmit: + '({ formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n return new Promise((resolve, reject) => {\n // 在此编写代码\n \n // 继续执行\n resolve()\n })\n}', + afterSubmit: '({ formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + fields: [], +}; + +// 基础控件 【左面板】 +export const inputComponents: GenItem[] = [ + { + __config__: { + yunzhupaasKey: 'input', + label: '单行输入', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasInput', + tagIcon: 'icon-ym icon-ym-generator-input', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'blur', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + blur: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请输入', + useScan: false, + useMask: false, + maskConfig: { + filler: '*', + maskType: 1, + prefixType: 1, + prefixLimit: 0, + prefixSpecifyChar: '', + suffixType: 1, + suffixLimit: 0, + suffixSpecifyChar: '', + ignoreChar: '', + useUnrealMask: false, + unrealMaskLength: 1, + }, + clearable: true, + addonBefore: '', + addonAfter: '', + prefixIcon: '', + suffixIcon: '', + maxlength: null, + showCount: false, + showPassword: false, + readonly: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'textarea', + label: '多行输入', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasTextarea', + tagIcon: 'icon-ym icon-ym-generator-textarea', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'blur', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + blur: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请输入', + autoSize: { + minRows: 4, + maxRows: 4, + }, + clearable: true, + maxlength: null, + showCount: false, + readonly: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'inputNumber', + label: '数字输入', + tipLabel: '', + showLabel: true, + labelWidth: undefined, + tag: 'YunzhupaasInputNumber', + tagIcon: 'icon-ym icon-ym-generator-number', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: ['blur', 'change'], + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + blur: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请输入', + min: undefined, + max: undefined, + controls: false, + addonBefore: '', + addonAfter: '', + thousands: false, + isAmountChinese: false, + step: 1, + precision: undefined, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'switch', + label: '开关', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasSwitch', + tagIcon: 'icon-ym icon-ym-generator-switch', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: 0, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + disabled: false, + activeTxt: '开', + inactiveTxt: '关', + activeValue: 1, + inactiveValue: 0, + }, + { + __config__: { + yunzhupaasKey: 'radio', + label: '单选框组', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasRadio', + tagIcon: 'icon-ym icon-ym-generator-radio', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + dataType: 'static', + dictionaryType: '', + propsUrl: '', + propsName: '', + useCache: true, + templateJson: [], + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + options: [ + { + fullName: '选项一', + id: '1', + }, + { + fullName: '选项二', + id: '2', + }, + ], + props: { + label: 'fullName', + value: 'id', + }, + direction: 'horizontal', + optionType: 'default', + buttonStyle: 'solid', + size: 'default', + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'checkbox', + label: '多选框组', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasCheckbox', + tagIcon: 'icon-ym icon-ym-generator-checkbox', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: [], + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + dataType: 'static', + dictionaryType: '', + propsUrl: '', + propsName: '', + useCache: true, + templateJson: [], + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + options: [ + { + fullName: '选项一', + id: '1', + }, + { + fullName: '选项二', + id: '2', + }, + ], + props: { + label: 'fullName', + value: 'id', + }, + direction: 'horizontal', + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'select', + label: '下拉选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasSelect', + tagIcon: 'icon-ym icon-ym-generator-select', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + dataType: 'static', + dictionaryType: '', + propsUrl: '', + propsName: '', + useCache: true, + templateJson: [], + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + options: [ + { + fullName: '选项一', + id: '1', + }, + { + fullName: '选项二', + id: '2', + }, + ], + props: { + label: 'fullName', + value: 'id', + }, + placeholder: '请选择', + clearable: true, + disabled: false, + filterable: false, + multiple: false, + }, + { + __config__: { + yunzhupaasKey: 'cascader', + label: '级联选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasCascader', + tagIcon: 'icon-ym icon-ym-generator-cascader', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: [], + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + dataType: 'static', + propsUrl: '', + propsName: '', + useCache: true, + templateJson: [], + dictionaryType: '', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + blur: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + options: [ + { + id: '1', + fullName: '选项1', + children: [ + { + id: '2', + fullName: '选项1-1', + }, + ], + }, + ], + props: { + value: 'id', + label: 'fullName', + children: 'children', + }, + placeholder: '请选择', + disabled: false, + clearable: true, + filterable: false, + multiple: false, + }, + { + __config__: { + yunzhupaasKey: 'datePicker', + label: '日期选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasDatePicker', + tagIcon: 'icon-ym icon-ym-generator-date', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + startTimeRule: false, + startTimeType: 1, + startTimeTarget: 1, + startTimeValue: null, + startRelationField: '', + endTimeRule: false, + endTimeType: 1, + endTimeTarget: 1, + endTimeValue: null, + endRelationField: '', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + blur: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + format: 'yyyy-MM-dd', + startTime: null, + endTime: null, + disabled: false, + clearable: true, + }, + { + __config__: { + yunzhupaasKey: 'timePicker', + label: '时间选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasTimePicker', + tagIcon: 'icon-ym icon-ym-generator-time', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + startTimeRule: false, + startTimeType: 1, + startTimeTarget: 1, + startTimeValue: null, + startRelationField: '', + endTimeRule: false, + endTimeType: 1, + endTimeTarget: 1, + endTimeValue: null, + endRelationField: '', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + blur: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + format: 'HH:mm:ss', + startTime: null, + endTime: null, + disabled: false, + clearable: true, + }, + { + __config__: { + yunzhupaasKey: 'uploadFile', + label: '文件上传', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasUploadFile', + tagIcon: 'icon-ym icon-ym-generator-upload', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: [], + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + disabled: false, + accept: '', + fileSize: 10, + sizeUnit: 'MB', + buttonText: '点击上传', + limit: 9, + pathType: 'defaultPath', + sortRule: [], + timeFormat: 'YYYY', + folder: '', + tipText: '', + }, + { + __config__: { + yunzhupaasKey: 'uploadImg', + label: '图片上传', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasUploadImg', + tagIcon: 'icon-ym icon-ym-generator-upload', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: [], + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + disabled: false, + fileSize: 10, + sizeUnit: 'MB', + buttonText: '点击上传', + limit: 9, + pathType: 'defaultPath', + sortRule: [], + timeFormat: 'YYYY', + folder: '', + tipText: '', + showType: 'card', + }, + { + __config__: { + yunzhupaasKey: 'colorPicker', + label: '颜色选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasColorPicker', + tagIcon: 'icon-ym icon-ym-generator-color', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + showAlpha: false, + colorFormat: '', + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'rate', + label: '评分', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasRate', + tagIcon: 'icon-ym icon-ym-generator-rate', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: 0, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + count: 5, + allowHalf: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'slider', + label: '滑块', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasSlider', + tagIcon: 'icon-ym icon-ym-generator-slider', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: 0, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + disabled: false, + min: 0, + max: 100, + step: 1, + }, + { + __config__: { + yunzhupaasKey: 'editor', + label: '富文本', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasEditor', + tagIcon: 'icon-ym icon-ym-generator-rich-text', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'blur', + }, + style: { width: '100%' }, + placeholder: '请输入', + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'link', + label: '链接', + labelWidth: undefined, + showLabel: false, + tag: 'YunzhupaasLink', + tagIcon: 'icon-ym icon-ym-generator-link', + tableAlign: 'left', + tableFixed: 'none', + className: [], + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + }, + on: { + click: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + content: '文本链接', + href: '', + target: '_self', + textStyle: { + 'text-align': 'left', + }, + }, + { + __config__: { + yunzhupaasKey: 'button', + label: '按钮', + labelWidth: undefined, + showLabel: false, + tag: 'YunzhupaasButton', + tagIcon: 'icon-ym icon-ym-generator-button', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + regList: [], + trigger: 'click', + }, + on: { + click: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + align: 'left', + buttonText: '按钮', + type: '', + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'text', + label: '文本', + labelWidth: undefined, + showLabel: false, + tag: 'YunzhupaasText', + tagIcon: 'icon-ym icon-ym-generator-textarea', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: undefined, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + }, + textStyle: { + color: '#000000', + 'text-align': 'left', + 'font-weight': 'normal', + 'font-style': 'normal', + 'text-decoration': 'none', + 'line-height': 32, + 'font-size': 12, + }, + content: '这是一段文字', + }, + { + __config__: { + yunzhupaasKey: 'alert', + label: '提示', + labelWidth: undefined, + showLabel: false, + tag: 'YunzhupaasAlert', + tagIcon: 'icon-ym icon-ym-generator-alert', + tableAlign: 'left', + tableFixed: 'none', + className: [], + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + }, + title: '这是一个提示', + type: 'success', + showIcon: false, + closable: true, + description: '', + closeText: '', + }, + { + __config__: { + yunzhupaasKey: 'qrcode', + label: '二维码', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasQrcode', + tagIcon: 'icon-ym icon-ym-generator-qrcode', + className: [], + defaultValue: '', + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + }, + colorDark: '#000', + colorLight: '#fff', + width: 100, + dataType: 'static', + staticText: '二维码', + relationField: '', + }, + { + __config__: { + yunzhupaasKey: 'barcode', + label: '条形码', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasBarcode', + tagIcon: 'icon-ym icon-ym-generator-barcode', + className: [], + defaultValue: '', + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + }, + format: 'code128', + lineColor: '#000', + background: '#fff', + width: 4, + height: 40, + dataType: 'static', + staticText: '10241024', + relationField: '', + }, +]; + +// 高级控件 【左面板】 +export const selectComponents: GenItem[] = [ + { + __config__: { + yunzhupaasKey: 'organizeSelect', + label: '组织选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasOrganizeSelect', + tagIcon: 'icon-ym icon-ym-generator-company', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: [], + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + selectType: 'all', + ableIds: [], + multiple: false, + clearable: true, + filterable: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'depSelect', + label: '部门选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasDepSelect', + tagIcon: 'icon-ym icon-ym-tree-department1', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + selectType: 'all', + ableIds: [], + multiple: false, + clearable: true, + filterable: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'posSelect', + label: '岗位选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasPosSelect', + tagIcon: 'icon-ym icon-ym-generator-jobs', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + selectType: 'all', + ableIds: [], + multiple: false, + clearable: true, + filterable: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'userSelect', + label: '用户选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasUserSelect', + tagIcon: 'icon-ym icon-ym-generator-user', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + selectType: 'all', + ableIds: [], + ableRelationIds: [], + relationField: '', + multiple: false, + clearable: true, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'roleSelect', + label: '角色选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasRoleSelect', + tagIcon: 'icon-ym icon-ym-generator-role', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + selectType: 'all', + ableIds: [], + multiple: false, + clearable: true, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'groupSelect', + label: '分组选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasGroupSelect', + tagIcon: 'icon-ym icon-ym-generator-group1', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + selectType: 'all', + ableIds: [], + multiple: false, + clearable: true, + filterable: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'usersSelect', + label: '用户组件', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasUsersSelect', + tagIcon: 'icon-ym icon-ym-generator-founder', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + selectType: 'all', + ableIds: [], + multiple: false, + clearable: true, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'table', + label: '设计子表', + tipLabel: '', + labelWidth: undefined, + showLabel: false, + tagIcon: 'icon-ym icon-ym-generator-table', + tableAlign: 'left', + tableFixed: 'none', + className: [], + tag: 'YunzhupaasInputTable', + defaultValue: [], + layout: 'rowFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + showTitle: true, + children: [], + tableName: '', + complexHeaderList: [], + }, + disabled: false, + showSummary: false, + summaryField: [], + defaultValue: [], + columnBtnsList: [ + { value: 'copy', label: '复制', labelI18nCode: 'common.copyText', show: true, btnType: 'primary', btnIcon: 'icon-ym icon-ym-btn-edit' }, + { + value: 'remove', + label: '删除', + labelI18nCode: 'common.delText', + show: true, + btnType: 'danger', + btnIcon: 'icon-ym icon-ym-btn-clearn', + showConfirm: true, + }, + ], + footerBtnsList: [ + { value: 'add', label: '添加', labelI18nCode: 'common.add1Text', show: true, btnType: 'primary', btnIcon: 'icon-ym icon-ym-btn-add' }, + { + value: 'batchRemove', + label: '批量删除', + labelI18nCode: 'common.batchDelText', + show: true, + btnType: 'danger', + btnIcon: 'icon-ym icon-ym-btn-clearn', + showConfirm: true, + }, + ], + layoutType: 'table', + defaultExpandAll: true, + }, + { + __config__: { + yunzhupaasKey: 'treeSelect', + label: '下拉树形', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasTreeSelect', + tagIcon: 'icon-ym icon-ym-generator-tree', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + dataType: 'static', + dictionaryType: '', + propsUrl: '', + propsName: '', + useCache: true, + templateJson: [], + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + options: [ + { + id: '1', + fullName: '选项1', + children: [ + { + id: '2', + fullName: '选项1-1', + }, + ], + }, + ], + props: { + value: 'id', + label: 'fullName', + children: 'children', + }, + placeholder: '请选择', + multiple: false, + clearable: true, + filterable: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'popupTableSelect', + label: '下拉表格', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + required: false, + tag: 'YunzhupaasPopupTableSelect', + tagIcon: 'icon-ym icon-ym-generator-popupTableSelect', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + useCache: true, + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + interfaceId: '', + interfaceName: '', + templateJson: [], + hasPage: false, + pageSize: 20, + extraOptions: [], + columnOptions: [], + propsValue: 'id', + relationField: 'fullName', + popupType: 'popover', + popupTitle: '选择数据', + popupWidth: '800px', + disabled: false, + clearable: true, + multiple: false, + filterable: true, + }, + { + __config__: { + yunzhupaasKey: 'autoComplete', + label: '下拉补全', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + required: false, + tag: 'YunzhupaasAutoComplete', + tagIcon: 'icon-ym icon-ym-generator-autoComplete', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + blur: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请输入', + interfaceId: '', + interfaceName: '', + templateJson: [], + total: 10, + relationField: 'fullName', + disabled: false, + clearable: true, + }, + { + __config__: { + yunzhupaasKey: 'areaSelect', + label: '省市区域', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasAreaSelect', + tagIcon: 'icon-ym icon-ym-generator-Provinces', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: [], + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + disabled: false, + clearable: true, + filterable: false, + multiple: false, + level: 2, + }, + { + __config__: { + yunzhupaasKey: 'relationForm', + label: '关联表单', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasRelationForm', + tagIcon: 'icon-ym icon-ym-generator-menu', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + transferList: [], + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + modelId: '', + relationField: '', + hasPage: false, + pageSize: 20, + queryType: 0, + propsValue: undefined, + extraOptions: [], + columnOptions: [], + clearable: true, + popupType: 'dialog', + popupTitle: '选择数据', + popupWidth: '800px', + filterable: false, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'relationFormAttr', + label: '关联表单属性', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasRelationFormAttr', + tagIcon: 'icon-ym icon-ym-generator-nature', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + }, + style: { width: '100%' }, + showField: '', + relationField: '', + isStorage: 0, + }, + { + __config__: { + yunzhupaasKey: 'popupSelect', + label: '弹窗选择', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + required: false, + tag: 'YunzhupaasPopupSelect', + tagIcon: 'icon-ym icon-ym-generator-popup', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + transferList: [], + useCache: true, + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + style: { width: '100%' }, + placeholder: '请选择', + interfaceId: '', + interfaceName: '', + templateJson: [], + hasPage: false, + pageSize: 20, + extraOptions: [], + columnOptions: [], + propsValue: 'id', + relationField: 'fullName', + popupType: 'dialog', + popupTitle: '选择数据', + popupWidth: '800px', + disabled: false, + clearable: true, + }, + { + __config__: { + yunzhupaasKey: 'popupAttr', + label: '弹窗选择属性', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasPopupAttr', + tagIcon: 'icon-ym icon-ym-generator-popup-attr', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + }, + style: { width: '100%' }, + showField: '', + relationField: '', + isStorage: 0, + }, + { + __config__: { + yunzhupaasKey: 'signature', + label: '电子签章', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasSignature', + tagIcon: 'icon-ym icon-ym-signature1', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + ableIds: [], + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'sign', + label: '手写签名', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasSign', + tagIcon: 'icon-ym icon-ym-signature', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + defaultCurrent: false, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + isInvoke: true, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'location', + label: '定位', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasLocation', + tagIcon: 'icon-ym icon-ym-generator-location', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + trigger: 'change', + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + autoLocation: false, + enableLocationScope: false, + adjustmentScope: 500, + enableDesktopLocation: false, + locationScope: [], + clearable: true, + disabled: false, + }, + { + __config__: { + yunzhupaasKey: 'iframe', + label: 'Iframe', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasIframe', + tagIcon: 'icon-ym icon-ym-generator-iframe', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc'], + noShow: false, + }, + href: '', + height: 300, + borderType: 'solid', + borderColor: '#E2E0E0', + borderWidth: 1, + }, + { + __config__: { + yunzhupaasKey: 'calculate', + label: '计算公式', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + required: false, + tag: 'YunzhupaasCalculate', + tagIcon: 'icon-ym icon-ym-generator-count', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + regList: [], + }, + style: { width: '100%' }, + expression: [], + isStorage: 0, + thousands: false, + isAmountChinese: false, + precision: 2, + roundType: 1, + }, +]; + +// 系统控件 【左面板】 +export const systemComponents: GenItem[] = [ + { + __config__: { + yunzhupaasKey: 'createUser', + label: '创建人员', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasOpenData', + tagIcon: 'icon-ym icon-ym-generator-founder', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + }, + style: { width: '100%' }, + type: 'currUser', + readonly: true, + placeholder: '', + }, + { + __config__: { + yunzhupaasKey: 'createTime', + label: '创建时间', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasOpenData', + tagIcon: 'icon-ym icon-ym-generator-createtime', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + layout: 'colFormItem', + required: false, + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + }, + style: { width: '100%' }, + type: 'currTime', + readonly: true, + placeholder: '', + }, + { + __config__: { + yunzhupaasKey: 'modifyUser', + label: '修改人员', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasInput', + tagIcon: 'icon-ym icon-ym-generator-modifier', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + }, + style: { width: '100%' }, + readonly: true, + placeholder: '系统自动生成', + }, + { + __config__: { + yunzhupaasKey: 'modifyTime', + label: '修改时间', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasInput', + tagIcon: 'icon-ym icon-ym-generator-modifytime', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + }, + style: { width: '100%' }, + readonly: true, + placeholder: '系统自动生成', + }, + { + __config__: { + yunzhupaasKey: 'currOrganize', + label: '所属组织', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasOpenData', + tagIcon: 'icon-ym icon-ym-generator-company', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + }, + style: { width: '100%' }, + type: 'currOrganize', + readonly: true, + showLevel: 'last', + placeholder: '', + }, + { + __config__: { + yunzhupaasKey: 'currPosition', + label: '所属岗位', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasOpenData', + tagIcon: 'icon-ym icon-ym-generator-station', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: '', + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + }, + style: { width: '100%' }, + type: 'currPosition', + readonly: true, + placeholder: '', + }, + { + __config__: { + yunzhupaasKey: 'billRule', + label: '单据组件', + tipLabel: '', + labelWidth: undefined, + showLabel: true, + tag: 'YunzhupaasInput', + tagIcon: 'icon-ym icon-ym-generator-documents', + tableAlign: 'left', + tableFixed: 'none', + className: [], + defaultValue: null, + layout: 'colFormItem', + required: false, + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + tableName: '', + noShow: false, + trigger: 'change', + rule: '', + ruleName: '', + ruleType: 1, + ruleConfig: {}, + }, + style: { width: '100%' }, + readonly: true, + placeholder: '系统自动生成', + }, +]; + +// 布局控件 【左面板】 +export const layoutComponents: GenItem[] = [ + { + __config__: { + yunzhupaasKey: 'groupTitle', + label: '分组标题', + labelWidth: undefined, + showLabel: false, + tag: 'YunzhupaasGroupTitle', + tagIcon: 'icon-ym icon-ym-generator-group', + className: [], + defaultValue: null, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + }, + helpMessage: '', + content: '分组标题', + contentPosition: 'left', + }, + { + __config__: { + yunzhupaasKey: 'divider', + label: '分割线', + labelWidth: undefined, + showLabel: false, + tag: 'YunzhupaasDivider', + tagIcon: 'icon-ym icon-ym-generator-divider', + className: [], + defaultValue: null, + required: false, + layout: 'colFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + }, + content: '我是分割线', + contentPosition: 'center', + }, + { + __config__: { + yunzhupaasKey: 'collapse', + label: '折叠面板', + labelWidth: undefined, + showLabel: false, + tag: 'ACollapse', + tagIcon: 'icon-ym icon-ym-generator-fold', + className: [], + layout: 'rowFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + children: [ + { + title: '面板1', + name: '1', + __config__: { + yunzhupaasKey: 'collapseItem', + children: [], + }, + }, + { + title: '面板2', + name: '2', + __config__: { + yunzhupaasKey: 'collapseItem', + children: [], + }, + }, + ], + active: ['1'], + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + accordion: false, + ghost: true, + expandIconPosition: 'end', + }, + { + __config__: { + yunzhupaasKey: 'tab', + label: '标签面板', + labelWidth: undefined, + showLabel: false, + tag: 'ATab', + tagIcon: 'icon-ym icon-ym-generator-label', + className: [], + layout: 'rowFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + children: [ + { + title: 'Tab 1', + name: '1', + __config__: { + yunzhupaasKey: 'tabItem', + children: [], + }, + }, + { + title: 'Tab 2', + name: '2', + __config__: { + yunzhupaasKey: 'tabItem', + children: [], + }, + }, + ], + active: '1', + }, + on: { + tabClick: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + type: '', + tabPosition: 'top', + }, + { + __config__: { + yunzhupaasKey: 'steps', + label: '步骤条', + labelWidth: undefined, + showLabel: false, + tag: 'ASteps', + tagIcon: 'icon-ym icon-ym-generator-steps', + className: [], + layout: 'rowFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + children: [ + { + title: '步骤1', + name: '1', + icon: '', + __config__: { + yunzhupaasKey: 'stepItem', + children: [], + }, + }, + { + title: '步骤2', + name: '2', + icon: '', + __config__: { + yunzhupaasKey: 'stepItem', + children: [], + }, + }, + ], + active: 0, + }, + on: { + change: '({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}', + }, + simple: false, + processStatus: 'process', + }, + { + __config__: { + yunzhupaasKey: 'row', + label: '栅格容器', + labelWidth: undefined, + showLabel: false, + tag: 'ARow', + tagIcon: 'icon-ym icon-ym-generator-layout', + className: [], + layout: 'rowFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + }, + type: 'default', + justify: 'start', + align: 'top', + }, + { + __config__: { + yunzhupaasKey: 'card', + label: '卡片容器', + tipLabel: '', + labelWidth: undefined, + showLabel: false, + tag: 'ACard', + tagIcon: 'icon-ym icon-ym-generator-card', + className: [], + defaultValue: [], + layout: 'rowFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + children: [], + }, + header: '卡片容器', + shadow: 'never', + }, + { + __config__: { + yunzhupaasKey: 'tableGrid', + label: '表格容器', + labelWidth: undefined, + showLabel: false, + tag: 'Table', + tagIcon: 'icon-ym icon-ym-generator-tableGrid', + className: [], + defaultValue: [], + layout: 'rowFormItem', + span: 24, + dragDisabled: false, + visibility: ['pc', 'app'], + noShow: false, + borderType: 'solid', + borderColor: '#E2E0E0', + borderWidth: 1, + children: [ + { + __config__: { + yunzhupaasKey: 'tableGridTr', + children: [ + { + __config__: { + yunzhupaasKey: 'tableGridTd', + merged: false, + colspan: 1, + rowspan: 1, + children: [], + backgroundColor: '', + }, + }, + ], + }, + }, + ], + }, + }, +]; diff --git a/src/components/FormGenerator/src/helper/config.ts b/src/components/FormGenerator/src/helper/config.ts new file mode 100644 index 0000000..42aa672 --- /dev/null +++ b/src/components/FormGenerator/src/helper/config.ts @@ -0,0 +1,56 @@ +// 动态options +const dyOptionsList = ['radio', 'checkbox', 'select', 'cascader', 'treeSelect']; +// 展示组件 +const vModelIgnoreList = ['divider', 'text', 'link', 'alert', 'groupTitle', 'button', 'barcode', 'qrcode', 'iframe']; +// 动态存储 +const dyStorageList = ['relationFormAttr', 'popupAttr', 'calculate']; +// 不添加vModel +const noVModelList = [...vModelIgnoreList, ...dyStorageList]; +// 不可以添加到子表组件 +const noTableAllowList = [...vModelIgnoreList, 'editor', 'radio', 'checkbox', 'colorPicker', 'table']; +// 不可以添加到列表展示 +const noColumnShowList = [...vModelIgnoreList, 'colorPicker', 'editor', 'relationFormAttr', 'popupAttr']; +// 不可以添加到搜索 +const noSearchList = [ + ...noColumnShowList, + 'switch', + 'timeRange', + 'dateRange', + 'relationForm', + 'popupSelect', + 'popupTableSelect', + 'uploadImg', + 'uploadFile', + 'sign', + 'signature', +]; +// 搜索时控件为input +const useInputList = ['input', 'textarea', 'billRule', 'location']; +// 搜索时控件为日期选择器 +const useDateList = ['createTime', 'modifyTime']; +// 搜索时控件为下拉选择器 +const useSelectList = ['radio', 'checkbox', 'select']; +// 系统控件 +const systemComponentsList = ['createUser', 'createTime', 'modifyUser', 'modifyTime', 'currOrganize', 'currPosition', 'billRule']; +// 不允许关联到联动里面的控件 +const noAllowRelationList = ['table', 'uploadImg', 'uploadFile', 'modifyUser', 'modifyTime']; +// 不允许关联表单选择的控件 +const noAllowSelectList = [...noAllowRelationList, ...systemComponentsList, 'relationForm', 'popupSelect']; +// 不允许分组和排序 +const noGroupList = ['sign', 'signature', 'location', 'uploadImg', 'uploadFile', 'editor']; + +export { + dyOptionsList, + vModelIgnoreList, + noVModelList, + noTableAllowList, + noColumnShowList, + noSearchList, + useInputList, + useDateList, + useSelectList, + systemComponentsList, + noAllowRelationList, + noAllowSelectList, + noGroupList, +}; diff --git a/src/components/FormGenerator/src/helper/render.ts b/src/components/FormGenerator/src/helper/render.ts new file mode 100644 index 0000000..553be32 --- /dev/null +++ b/src/components/FormGenerator/src/helper/render.ts @@ -0,0 +1,108 @@ +import { defineComponent, h, ref, unref, onMounted, getCurrentInstance } from 'vue'; +import { cloneDeep, upperFirst } from 'lodash-es'; +import { componentMap } from '@/components/Form/src/componentMap'; +import type { ComponentType } from '@/components/Form/src/types/index'; +import { getRealProps } from './transform'; + +export default defineComponent({ + props: { + conf: { + type: Object, + required: true, + }, + formData: { + type: Object, + default: () => {}, + }, + size: { + type: String, + default: 'default', + }, + relations: Object, + }, + setup(props, { emit, expose }) { + const tableRef = ref(null); + + expose({ tableRef }); + function buildVModel(dataObject, defaultValue) { + dataObject.value = defaultValue; + let obj = dataObject.on ?? {}; + obj['update:value'] = val => { + emit('update:value', val); + }; + dataObject.on = obj; + } + + function emitEvents(confClone) { + ['on', 'nativeOn'].forEach(attr => { + const eventKeyList = Object.keys(confClone[attr] || {}); + eventKeyList.forEach(key => { + if (typeof key === 'string') { + confClone[attr][key] = (...arg) => emit(key, arg); + } + }); + }); + } + + function buildDataObject(confClone, dataObject, formData) { + const yunzhupaasKey = confClone.__config__.yunzhupaasKey; + Object.keys(confClone).forEach(key => { + const val = confClone[key]; + if (key === '__vModel__') { + buildVModel(dataObject, confClone.__config__.defaultValue); + } else if (dataObject[key] !== undefined) { + if (dataObject[key] === null || dataObject[key] instanceof RegExp || ['boolean', 'string', 'number', 'function'].includes(typeof dataObject[key])) { + dataObject[key] = val; + } else if (Array.isArray(dataObject[key])) { + dataObject[key] = [...dataObject[key], ...val]; + } else { + dataObject[key] = { ...dataObject[key], ...val }; + } + } else { + dataObject[key] = val; + } + }); + if (['calculate', 'table', 'barcode', 'qrcode', 'popupSelect', 'popupTableSelect', 'autoComplete'].includes(yunzhupaasKey)) { + dataObject['formData'] = formData; + } + if (['table'].includes(yunzhupaasKey)) { + dataObject['relations'] = props.relations; + dataObject['vModel'] = confClone.__vModel__; + dataObject['ref'] = 'tableRef'; + } + if (['relationForm', 'popupSelect'].includes(yunzhupaasKey)) { + dataObject['field'] = confClone.__config__.tableName + ? confClone.__vModel__ + '_yunzhupaasTable_' + confClone.__config__.tableName + (confClone.__config__.isSubTable ? '0' : '1') + : confClone.__vModel__; + if (confClone.__config__.isSubTable) delete dataObject.extraOptions; + } + // 清理属性 + clearAttrs(dataObject); + } + + function clearAttrs(dataObject) { + delete dataObject.__config__; + delete dataObject.__slot__; + delete dataObject.__methods__; + delete dataObject.on; + } + onMounted(() => { + const instance = getCurrentInstance(); + tableRef.value = unref(instance?.refs?.tableRef); + }); + + return () => { + const dataObject = {}; + const confClone = cloneDeep(props.conf); + // 将字符串类型的事件,发送为消息 + emitEvents(confClone); + // 将json表单配置转化为vue render可以识别的数据对象(dataObject) + buildDataObject(confClone, dataObject, props.formData); + const yunzhupaasKey = upperFirst(props.conf.__config__.yunzhupaasKey) === 'Table' ? 'InputTable' : upperFirst(props.conf.__config__.yunzhupaasKey); + const Comp = componentMap.get(yunzhupaasKey as ComponentType) as ReturnType; + if (!Comp) return null; + const realDataObject = getRealProps(dataObject, props.conf.__config__.yunzhupaasKey); + return h(Comp, realDataObject as any); + }; + }, +}); diff --git a/src/components/FormGenerator/src/helper/rightPanel.ts b/src/components/FormGenerator/src/helper/rightPanel.ts new file mode 100644 index 0000000..43f80d9 --- /dev/null +++ b/src/components/FormGenerator/src/helper/rightPanel.ts @@ -0,0 +1,28 @@ +export const orgList = ['organizeSelect', 'depSelect', 'posSelect', 'userSelect', 'usersSelect', 'groupSelect', 'roleSelect']; + +export const systemList = ['createUser', 'createTime', 'modifyUser', 'modifyTime', 'currOrganize', 'currPosition', 'billRule']; + +export const layoutList = [ + 'groupTitle', + 'divider', + 'collapse', + 'tab', + 'row', + 'card', + 'table', + 'link', + 'button', + 'text', + 'alert', + 'tableGrid', + 'tableGridTr', + 'tableGridTd', + 'steps', +]; + +//不设置宽度 +export const noWithList = [...layoutList, 'switch', 'radio', 'checkbox', 'uploadFile', 'uploadImg', 'colorPicker', 'rate', 'qrcode', 'barcode', 'editor']; + +export const generalWidthOptions = ['600px', '800px', '1000px', '40%', '50%', '60%', '70%', '80%']; + +export const fullScreenWidthOptions = ['800px', '1000px', '1200px', '1400px', '50%', '60%', '70%', '80%', '90%', '100%']; diff --git a/src/components/FormGenerator/src/helper/transform.ts b/src/components/FormGenerator/src/helper/transform.ts new file mode 100644 index 0000000..3d15284 --- /dev/null +++ b/src/components/FormGenerator/src/helper/transform.ts @@ -0,0 +1,217 @@ +import { cloneDeep, upperFirst, lowerFirst } from 'lodash-es'; +import { useInputList, useDateList, useSelectList } from '@/components/FormGenerator/src/helper/config'; +import { useI18n } from '@/hooks/web/useI18n'; + +const { t } = useI18n(); + +export const getRealProps = (data, yunzhupaasKey) => { + if (Reflect.has(data, 'clearable')) { + data.allowClear = data.clearable; + delete data.clearable; + } + if (Reflect.has(data, 'filterable')) { + data.showSearch = data.filterable; + delete data.filterable; + } + if (Reflect.has(data, 'props')) { + data.fieldNames = data.props; + delete data.props; + } + if (yunzhupaasKey === 'switch') { + data.checkedValue = data.activeValue; + data.unCheckedValue = data.inactiveValue; + delete data.activeValue; + delete data.inactiveValue; + } + if (yunzhupaasKey === 'card') { + data.title = data.header; + delete data.title; + data.hoverable = data.shadow === 'hover'; + delete data.shadow; + } + return data; +}; +export const getFormSchemaItem = data => { + const item = getRealProps(data, data.__config__.yunzhupaasKey); + const componentProps = cloneDeep(item); + // delete componentProps.__config__; + delete componentProps.on; + delete componentProps.__vModel__; + // if (Reflect.has(item.__config__, 'children')) { + // componentProps.children = item.__config__.children; + // } + + let rules: any[] = []; + const regList = item.__config__.regList; + if (regList) { + for (let i = 0; i < regList.length; i++) { + rules.push({ + pattern: eval(regList[i].pattern), + message: regList[i].messageI18nCode ? t(regList[i].messageI18nCode, regList[i].message) : regList[i].message, + trigger: item.__config__.trigger, + }); + } + } + + const schema = { + field: item.prop, + label: item.labelI18nCode ? t(item.labelI18nCode, item.label) : item.label, + defaultValue: item.__config__.defaultValue, + component: upperFirst(item.__config__.yunzhupaasKey), + componentProps, + labelWidth: item.__config__.labelWidth || null, + required: item.__config__.required || false, + colProps: { span: item.__config__.span || 24 }, + className: item.__config__.className, + value: item.value, + rules, + show: !item.noShow, + __config__: item.__config__, + }; + return schema; +}; +export const getFormSchemas = (list: any[]) => { + const schemas: any[] = []; + const list1: any[] = []; + const loop = list => { + for (let i = 0; i < list.length; i++) { + if (!list[i]?.noShow) { + const schema = getFormSchemaItem(list[i]); + list1.push({ ...list[i], schema }); + schemas.push(schema); + } + } + }; + loop(list); + return schemas; +}; +export const getFormConfig = formConf => { + return { + labelWidth: formConf.labelWidth, + schemas: getFormSchemas(formConf.fields), + layout: formConf.labelPosition === 'top' ? 'vertical' : 'horizontal', + labelAlign: formConf.labelPosition === 'right' ? 'right' : 'left', + disabled: formConf.disabled, + }; +}; +export const getSearchFormSchemas = (list: any[]) => { + const schemas: any[] = getFormSchemas(list); + for (let i = 0; i < schemas.length; i++) { + const e = schemas[i]; + let delList = ['className', 'colProps', 'labelWidth', 'required', 'rules', 'defaultValue']; + for (let i = 0; i < delList.length; i++) { + delete e[delList[i]]; + } + if (useInputList.includes(lowerFirst(e.component))) { + e.component = 'Input'; + e.componentProps = { placeholder: t('common.inputTextPrefix') + e.label, allowClear: true }; + } + if (useDateList.includes(lowerFirst(e.component))) { + e.component = 'DateRange'; + e.componentProps = { format: 'YYYY-MM-DD HH:mm:ss' }; + } + if (e.component === 'Switch') { + e.componentProps = { + checkedValue: e.componentProps.checkedValue, + unCheckedValue: e.componentProps.unCheckedValue, + }; + } + if (useSelectList.includes(lowerFirst(e.component))) { + e.component = 'Select'; + e.componentProps = { + options: e.componentProps.options, + showSearch: true, + multiple: e.componentProps.searchMultiple || false, + fieldNames: e.componentProps.fieldNames, + placeholder: t('common.chooseTextPrefix') + e.label, + }; + } + if (['InputNumber', 'Calculate', 'Rate', 'Slider'].includes(e.component)) { + let precision = e.componentProps.precision; + if ((!e.componentProps.precision && e.component === 'Calculate') || e.component === 'Slider') precision = 0; + if (e.component === 'Rate') precision = e.componentProps.allowHalf ? 1 : 0; + if (!e.__config__.isFromParam) e.component = 'NumberRange'; + e.componentProps = { precision }; + } + if (e.component === 'Cascader') { + e.componentProps = { + options: e.componentProps.options, + showSearch: true, + multiple: e.componentProps.searchMultiple || false, + fieldNames: e.componentProps.fieldNames, + showAllLevels: e.componentProps.showAllLevels, + placeholder: t('common.chooseTextPrefix') + e.label, + }; + } + if (e.component === 'TimePicker') { + e.component = 'TimeRange'; + e.componentProps = { format: e.componentProps.format }; + } + if (e.component === 'DatePicker') { + if (!e.__config__.isFromParam) e.component = 'DateRange'; + e.componentProps = { format: e.componentProps.format || 'yyyy-MM-dd HH:mm:ss' }; + } + if (e.component === 'AreaSelect') { + e.componentProps = { placeholder: t('common.chooseTextPrefix') + e.label, level: e.componentProps.level }; + } + if (e.component === 'TreeSelect') { + e.componentProps = { + options: e.componentProps.options, + showSearch: true, + multiple: e.componentProps.searchMultiple || false, + fieldNames: e.componentProps.fieldNames, + placeholder: t('common.chooseTextPrefix') + e.label, + }; + } + if (['CreateUser', 'ModifyUser'].includes(e.component)) { + e.component = 'UserSelect'; + e.componentProps = { placeholder: t('common.chooseTextPrefix') + e.label }; + } + if (e.component === 'CurrOrganize') { + e.component = 'OrganizeSelect'; + e.componentProps = { multiple: e.componentProps.searchMultiple || false, placeholder: t('common.chooseTextPrefix') + e.label }; + } + if (e.component === 'CurrPosition') { + e.component = 'PosSelect'; + e.componentProps = { multiple: e.componentProps.searchMultiple || false, placeholder: t('common.chooseTextPrefix') + e.label }; + } + if (['OrganizeSelect', 'DepSelect', 'PosSelect', 'RoleSelect', 'GroupSelect', 'UsersSelect'].includes(e.component)) { + e.componentProps = { + selectType: e.componentProps.selectType, + ableIds: e.componentProps.ableIds, + multiple: e.componentProps.searchMultiple || false, + placeholder: t('common.chooseTextPrefix') + e.label, + }; + } + if (e.component === 'UserSelect') { + e.componentProps = { + selectType: e.componentProps.selectType != 'all' && e.componentProps.selectType != 'custom' ? 'all' : e.componentProps.selectType, + ableIds: e.componentProps.ableIds, + multiple: e.componentProps.searchMultiple || false, + placeholder: t('common.chooseTextPrefix') + e.label, + }; + } + if (e.component === 'AutoComplete') { + e.componentProps = { + total: e.componentProps.total, + interfaceId: e.componentProps.interfaceId, + relationField: e.componentProps.relationField, + templateJson: e.componentProps.templateJson, + placeholder: t('common.inputTextPrefix') + e.label, + }; + } + } + if (list.some(o => o.isKeyword)) { + const keywordItem = { + field: 'yunzhupaasKeyword', + label: t('common.keyword'), + component: 'Input', + componentProps: { placeholder: t('common.leftTreeSearchText'), allowClear: true }, + value: undefined, + show: true, + __config__: { yunzhupaasKey: 'input' }, + }; + schemas.unshift(keywordItem); + } + return schemas; +}; diff --git a/src/components/FormGenerator/src/helper/utils.ts b/src/components/FormGenerator/src/helper/utils.ts new file mode 100644 index 0000000..43c49c9 --- /dev/null +++ b/src/components/FormGenerator/src/helper/utils.ts @@ -0,0 +1,109 @@ +/** + * 将用户输入的连续单个数字合并为一个数 + * @param {Array} expressions - 记录计算表达式的数组 + * @returns {Array} 新的数组 + */ +export const mergeNumberOfExps = expressions => { + const res: any = []; + const isNumChar = n => /^[\d|\.]$/.test(n); + for (let i = 0; i < expressions.length; i++) { + if (i > 0 && isNumChar(expressions[i - 1]) && isNumChar(expressions[i])) { + res[res.length - 1] += expressions[i]; + continue; + } + res.push(expressions[i]); + } + return res; +}; +/** + * 校验表达式是否符合计算法则 + * @param {Array} expressions - 合并数字后的表达式数组 + * @returns {Boolean} + */ +export const validExp = (expressions, mergeNum = true) => { + const temp = mergeNum ? mergeNumberOfExps(expressions) : expressions; + const arr = temp.filter(t => !'()'.includes(t)); + // 去括号后 length应该为奇数 并且第一个字符和最后一个字符应该为数字而非计算符号 + if (temp.length % 2 === 0 || arr.length % 2 === 0 || Number.isNaN(+arr[0]) || Number.isNaN(+arr[arr.length - 1])) { + return false; + } + for (let i = 0; i < arr.length - 1; i += 2) { + if (typeof +arr[i] !== 'number' || !Number.isNaN(+arr[i + 1])) return false; + } + return true; +}; +/** + * 中缀转后缀(逆波兰 Reverse Polish Notation) + * @param {Array} exps - 中缀表达式数组 + */ +export const toRPN = exps => { + const s1: any[] = []; // 符号栈 + const s2: any[] = []; // 输出栈 + const getTopVal = stack => (stack.length > 0 ? stack[stack.length - 1] : null); + const levelCompare = (c1, c2) => { + const getIndex = c => ['+-', '×÷', '()'].findIndex(t => t.includes(c)); + return getIndex(c1) - getIndex(c2); + }; + exps.forEach(t => { + if (typeof t === 'string' && Number.isNaN(Number(t))) { + // 是符号 + if (t === '(') { + s1.push(t); + } else if (t === ')') { + let popVal; + do { + popVal = s1.pop(); + popVal !== '(' && s2.push(popVal); + } while (s1.length && popVal !== '('); + } else { + let topVal = getTopVal(s1); + if (!topVal) { + // s1 为空 直接push + s1.push(t); + } else { + while (topVal && topVal !== '(' && levelCompare(topVal, t) >= 0) { + // 优先级 >= t 弹出到s2 + s2.push(s1.pop()); + topVal = getTopVal(s1); + } + s1.push(t); + } + } + return; + } + s2.push(t); // 数字直接入栈 + }); + while (s1.length) { + s2.push(s1.pop()); + } + return s2; +}; +/** + * 计算后缀表达式的值 + * @param {Array} rpnExps - 后缀表达式 + */ +export const calcRPN = rpnExps => { + rpnExps = rpnExps.concat(); + const calc = (x, y, type) => { + let a1 = Number(x), + a2 = Number(y); + switch (type) { + case '+': + return a1 + a2; + case '-': + return a1 - a2; + case '×': + return a1 * a2; + case '÷': + return a1 / a2; + } + }; + for (let i = 2; i < rpnExps.length; i++) { + if ('+-×÷'.includes(rpnExps[i])) { + let val = calc(rpnExps[i - 2], rpnExps[i - 1], rpnExps[i]); + rpnExps.splice(i - 2, 3, val); + i = i - 2; + } + } + return rpnExps[0]; +}; diff --git a/src/components/FormGenerator/src/hooks/useDynamic.ts b/src/components/FormGenerator/src/hooks/useDynamic.ts new file mode 100644 index 0000000..fd655c5 --- /dev/null +++ b/src/components/FormGenerator/src/hooks/useDynamic.ts @@ -0,0 +1,173 @@ +import { inject, computed, unref } from 'vue'; +import { buildBitUUID } from '@/utils/uuid'; +import { getDictionaryDataSelector } from '@/api/systemData/dictionary'; +import { getDataInterfaceRes } from '@/api/systemData/dataInterface'; +import { noAllowRelationList, noAllowSelectList } from '@/components/FormGenerator/src/helper/config'; +import { getParamList } from '@/utils/yunzhupaas'; + +export function useDynamic(activeData, initFieldData?) { + const dataTypeOptions = [ + { id: 'static', fullName: '静态数据' }, + { id: 'dictionary', fullName: '数据字典' }, + { id: 'dynamic', fullName: '数据接口' }, + ]; + const valueOptions = [ + { id: 'id', fullName: 'id' }, + { id: 'enCode', fullName: 'enCode' }, + ]; + const sizeOptions = [ + { id: 'large', fullName: '较大' }, + { id: 'default', fullName: '中等' }, + { id: 'small', fullName: '较小' }, + ]; + const optionTypeOptions = [ + { id: 'default', fullName: '默认' }, + { id: 'button', fullName: '按钮' }, + ]; + const getShowType: (() => string | undefined) | undefined = inject('getShowType'); + const showType = computed(() => (getShowType as () => string | undefined)()); + const getDrawingList: (() => any[]) | undefined = inject('getDrawingList'); + const drawingList = computed(() => (getDrawingList as () => any[])()); + const defaultValue = computed(() => { + if (activeData.__config__.yunzhupaasKey === 'checkbox' || activeData.__config__.yunzhupaasKey === 'cascader' || activeData.multiple) return []; + return ''; + }); + const formFieldsOptions = computed(() => { + let list: any[] = []; + const loop = (data, parent?) => { + if (!data) return; + if (data.__config__ && isIncludesTable(data) && data.__config__.children && Array.isArray(data.__config__.children)) { + loop(data.__config__.children, data); + } + if (Array.isArray(data)) data.forEach(d => loop(d, parent)); + if (data.__vModel__ && !noAllowRelationList.includes(data.__config__.yunzhupaasKey) && data.__vModel__ !== activeData.__vModel__) { + const isTableChild = parent && parent.__config__ && parent.__config__.yunzhupaasKey === 'table'; + list.push({ + id: isTableChild ? parent.__vModel__ + '-' + data.__vModel__ : data.__vModel__, + fullName: isTableChild ? parent.__config__.label + '-' + data.__config__.label : data.__config__.label, + ...data, + disabled: false, + }); + } + }; + loop(unref(drawingList)); + return list; + }); + + const formFieldsSelectOptions = computed(() => { + let list: any[] = []; + const loop = (data, parent?) => { + if (!data) return; + if (data.__config__ && isIncludesTable(data) && data.__config__.children && Array.isArray(data.__config__.children)) { + loop(data.__config__.children, data); + } + if (Array.isArray(data)) data.forEach(d => loop(d, parent)); + if (data.__vModel__ && !noAllowSelectList.includes(data.__config__.yunzhupaasKey) && data.__vModel__ !== activeData.__vModel__) { + const isTableChild = parent && parent.__config__ && parent.__config__.yunzhupaasKey === 'table'; + list.push({ + id: isTableChild ? parent.__vModel__ + '-' + data.__vModel__ : data.__vModel__, + fullName: isTableChild ? parent.__config__.label + '-' + data.__config__.label : data.__config__.label, + ...data, + disabled: false, + }); + } + }; + loop(unref(drawingList)); + return list; + }); + + const isIncludesTable = data => { + if ((!data.__config__.layout || data.__config__.layout === 'rowFormItem') && data.__config__.yunzhupaasKey !== 'table') return true; + if (activeData.__config__.isSubTable) return activeData.__config__.parentVModel === data.__vModel__; + return data.__config__.yunzhupaasKey !== 'table'; + }; + + const onDataTypeChange = () => { + activeData.__config__.defaultValue = unref(defaultValue); + activeData.options = []; + activeData.props.value = 'id'; + activeData.props.label = 'fullName'; + if (Reflect.has(activeData.props, 'children')) activeData.props.children = 'children'; + activeData.__config__.dictionaryType = ''; + activeData.__config__.propsUrl = ''; + activeData.__config__.propsName = ''; + activeData.__config__.templateJson = []; + }; + const onDictionaryTypeChange = val => { + activeData.__config__.defaultValue = unref(defaultValue); + if (!val) return (activeData.options = []); + getDictionaryDataSelector(val) + .then(res => { + activeData.options = res.data.list; + }) + .catch(() => { + activeData.options = []; + }); + }; + const onPropsUrlChange = (val, row) => { + activeData.__config__.defaultValue = unref(defaultValue); + if (!val) { + activeData.__config__.propsUrl = ''; + activeData.__config__.propsName = ''; + activeData.__config__.templateJson = []; + activeData.options = []; + initFieldData && initFieldData(); + return; + } + if (activeData.__config__.propsUrl === val) return; + const list = row.parameterJson ? JSON.parse(row.parameterJson) : []; + activeData.__config__.propsUrl = val; + activeData.__config__.propsName = row.fullName; + activeData.__config__.templateJson = list.map(o => ({ ...o, relationField: '', sourceType: 1 })); + const query = { paramList: getParamList(activeData.__config__.templateJson) }; + getDataInterfaceRes(val, query) + .then(res => { + activeData.options = Array.isArray(res.data) ? res.data : []; + initFieldData && initFieldData(); + }) + .catch(() => { + activeData.__config__.propsUrl = ''; + activeData.__config__.propsName = ''; + activeData.__config__.templateJson = []; + activeData.options = []; + initFieldData && initFieldData(); + }); + }; + const onRelationFieldChange = (val, row) => { + if (!val) return (row.yunzhupaasKey = ''); + let list = unref(formFieldsOptions).filter(o => o.id === val); + if (!list.length) return (row.yunzhupaasKey = ''); + let item = list[0]; + row.yunzhupaasKey = item.__config__.yunzhupaasKey; + }; + const onMultipleChange = val => { + activeData.__config__.defaultValue = val ? [] : ''; + }; + const addSelectItem = () => { + const uuid = buildBitUUID(); + activeData.options.push({ + fullName: '选项' + uuid, + id: uuid, + }); + }; + const onBatchOperateConfirm = options => { + activeData.options = options; + }; + + return { + showType, + onDataTypeChange, + onDictionaryTypeChange, + onPropsUrlChange, + formFieldsOptions, + formFieldsSelectOptions, + onRelationFieldChange, + sizeOptions, + optionTypeOptions, + dataTypeOptions, + valueOptions, + addSelectItem, + onMultipleChange, + onBatchOperateConfirm, + }; +} diff --git a/src/components/FormGenerator/src/hooks/useField.ts b/src/components/FormGenerator/src/hooks/useField.ts new file mode 100644 index 0000000..22973e5 --- /dev/null +++ b/src/components/FormGenerator/src/hooks/useField.ts @@ -0,0 +1,47 @@ +import { useDebounceFn } from '@vueuse/core'; +import { getDataInterfaceInfo } from '@/api/systemData/dataInterface'; +import { reactive, toRefs } from 'vue'; + +export function useField(activeData) { + interface State { + options: any[]; + allOptions: any[]; + } + + const state = reactive({ + options: [], + allOptions: [], + }); + const { options, allOptions } = toRefs(state); + const debounceOnSearch = useDebounceFn(onSearch, 300); + + function onSearch(searchText: string) { + state.options = state.allOptions.filter(o => o.value.toLowerCase().indexOf(searchText.toLowerCase()) !== -1); + } + function onFocus(searchText) { + onSearch(searchText); + } + function initFieldData() { + const yunzhupaasKey = activeData.__config__.yunzhupaasKey; + const list = ['popupTableSelect', 'popupSelect', 'autoComplete']; + if (list.includes(yunzhupaasKey)) { + if (!activeData.interfaceId) return (state.allOptions = []); + } else { + if (activeData.__config__.dataType !== 'dynamic' || !activeData.__config__.propsUrl) return (state.allOptions = []); + } + const url = list.includes(yunzhupaasKey) ? activeData.interfaceId : activeData.__config__.propsUrl; + getDataInterfaceInfo(url).then(res => { + const data = res.data; + let list = data.fieldJson ? JSON.parse(data.fieldJson) : []; + state.allOptions = list.map(o => ({ ...o, value: o.defaultValue })); + }); + } + + return { + options, + allOptions, + debounceOnSearch, + onFocus, + initFieldData, + }; +} diff --git a/src/components/FormGenerator/src/hooks/useRedo.ts b/src/components/FormGenerator/src/hooks/useRedo.ts new file mode 100644 index 0000000..4fb855d --- /dev/null +++ b/src/components/FormGenerator/src/hooks/useRedo.ts @@ -0,0 +1,69 @@ +import { ref, computed, unref } from 'vue'; +import { cloneDeep } from 'lodash-es'; +import { isString, isFunction } from '@/utils/is'; + +export function useRedo() { + const recordList = ref([]); + const currentRecordIndex = ref(-1); + const recordLimit = ref(500); + + const getCanUndo = computed(() => currentRecordIndex.value > 0); + const getCanRedo = computed(() => recordList.value.length > currentRecordIndex.value + 1); + + const initRedo = (limit = 500) => { + recordList.value = []; + currentRecordIndex.value = -1; + recordLimit.value = limit; + }; + // 新增一条历史纪录 + const addRecord = (json, fullName = '修改') => { + if (currentRecordIndex.value + 1 < recordList.value.length) { + recordList.value.splice(currentRecordIndex.value + 1); + } + const item = { + json: isString(json) ? json : cloneDeep(json), + fullName, + id: currentRecordIndex.value + 1, + }; + recordList.value.push(item); + currentRecordIndex.value++; + // 限制undo纪录步数 + if (recordList.value.length > recordLimit.value) { + recordList.value.shift(); + currentRecordIndex.value--; + } + }; + // 撤销 + const handleUndo = (callback?) => { + if (!unref(getCanUndo)) return; + currentRecordIndex.value--; + const currRecord = recordList.value[currentRecordIndex.value]; + callback && isFunction(callback) && callback(currRecord.json); + }; + // 重做 + const handleRedo = (callback?) => { + if (!unref(getCanRedo)) return; + currentRecordIndex.value++; + const currRecord = recordList.value[currentRecordIndex.value]; + callback && isFunction(callback) && callback(currRecord.json); + }; + // 跳转到指定历史纪录 + const jumpToRecord = (index, callback?) => { + if (index < 0 || index >= recordList.value.length) return; + currentRecordIndex.value = index; + const currRecord = recordList.value[currentRecordIndex.value]; + callback && isFunction(callback) && callback(currRecord.json); + }; + + return { + initRedo, + addRecord, + handleUndo, + handleRedo, + getCanUndo, + getCanRedo, + recordList, + currentRecordIndex, + jumpToRecord, + }; +} diff --git a/src/components/FormGenerator/src/rightComponents/RAlert.vue b/src/components/FormGenerator/src/rightComponents/RAlert.vue new file mode 100644 index 0000000..e7fcc59 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RAlert.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/RAreaSelect.vue b/src/components/FormGenerator/src/rightComponents/RAreaSelect.vue new file mode 100644 index 0000000..3716c82 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RAreaSelect.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/RAutoComplete.vue b/src/components/FormGenerator/src/rightComponents/RAutoComplete.vue new file mode 100644 index 0000000..0f2f1a4 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RAutoComplete.vue @@ -0,0 +1,58 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RBarcode.vue b/src/components/FormGenerator/src/rightComponents/RBarcode.vue new file mode 100644 index 0000000..3ad2193 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RBarcode.vue @@ -0,0 +1,55 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RBillRule.vue b/src/components/FormGenerator/src/rightComponents/RBillRule.vue new file mode 100644 index 0000000..55e8ca3 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RBillRule.vue @@ -0,0 +1,291 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RButton.vue b/src/components/FormGenerator/src/rightComponents/RButton.vue new file mode 100644 index 0000000..827d745 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RButton.vue @@ -0,0 +1,27 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RCalculate.vue b/src/components/FormGenerator/src/rightComponents/RCalculate.vue new file mode 100644 index 0000000..54db9a7 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RCalculate.vue @@ -0,0 +1,260 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/RCard.vue b/src/components/FormGenerator/src/rightComponents/RCard.vue new file mode 100644 index 0000000..ec52b7e --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RCard.vue @@ -0,0 +1,18 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RCascader.vue b/src/components/FormGenerator/src/rightComponents/RCascader.vue new file mode 100644 index 0000000..706e8f7 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RCascader.vue @@ -0,0 +1,36 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RCheckbox.vue b/src/components/FormGenerator/src/rightComponents/RCheckbox.vue new file mode 100644 index 0000000..1d6a7ef --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RCheckbox.vue @@ -0,0 +1,19 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RCollapse.vue b/src/components/FormGenerator/src/rightComponents/RCollapse.vue new file mode 100644 index 0000000..a38e410 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RCollapse.vue @@ -0,0 +1,64 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RColorPicker.vue b/src/components/FormGenerator/src/rightComponents/RColorPicker.vue new file mode 100644 index 0000000..967035e --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RColorPicker.vue @@ -0,0 +1,32 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RDatePicker.vue b/src/components/FormGenerator/src/rightComponents/RDatePicker.vue new file mode 100644 index 0000000..a16e2dd --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RDatePicker.vue @@ -0,0 +1,188 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RDivider.vue b/src/components/FormGenerator/src/rightComponents/RDivider.vue new file mode 100644 index 0000000..ec9a0a4 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RDivider.vue @@ -0,0 +1,18 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/REditor.vue b/src/components/FormGenerator/src/rightComponents/REditor.vue new file mode 100644 index 0000000..c5a9e17 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/REditor.vue @@ -0,0 +1,9 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RGroupTitle.vue b/src/components/FormGenerator/src/rightComponents/RGroupTitle.vue new file mode 100644 index 0000000..2aadf77 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RGroupTitle.vue @@ -0,0 +1,21 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RIframe.vue b/src/components/FormGenerator/src/rightComponents/RIframe.vue new file mode 100644 index 0000000..89698c7 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RIframe.vue @@ -0,0 +1,35 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RInput.vue b/src/components/FormGenerator/src/rightComponents/RInput.vue new file mode 100644 index 0000000..b63d6a9 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RInput.vue @@ -0,0 +1,168 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RInputNumber.vue b/src/components/FormGenerator/src/rightComponents/RInputNumber.vue new file mode 100644 index 0000000..411cc97 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RInputNumber.vue @@ -0,0 +1,55 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RLink.vue b/src/components/FormGenerator/src/rightComponents/RLink.vue new file mode 100644 index 0000000..05901d5 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RLink.vue @@ -0,0 +1,28 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RLocation/MapModal.vue b/src/components/FormGenerator/src/rightComponents/RLocation/MapModal.vue new file mode 100644 index 0000000..6cf0847 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RLocation/MapModal.vue @@ -0,0 +1,182 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/RLocation/index.vue b/src/components/FormGenerator/src/rightComponents/RLocation/index.vue new file mode 100644 index 0000000..3d38c13 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RLocation/index.vue @@ -0,0 +1,89 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/ROrgRight.vue b/src/components/FormGenerator/src/rightComponents/ROrgRight.vue new file mode 100644 index 0000000..0ce954b --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/ROrgRight.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/RPopupAttr.vue b/src/components/FormGenerator/src/rightComponents/RPopupAttr.vue new file mode 100644 index 0000000..d3e3322 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RPopupAttr.vue @@ -0,0 +1,46 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RPopupSelect.vue b/src/components/FormGenerator/src/rightComponents/RPopupSelect.vue new file mode 100644 index 0000000..a2d6443 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RPopupSelect.vue @@ -0,0 +1,195 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RQrcode.vue b/src/components/FormGenerator/src/rightComponents/RQrcode.vue new file mode 100644 index 0000000..76cf34f --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RQrcode.vue @@ -0,0 +1,31 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RRadio.vue b/src/components/FormGenerator/src/rightComponents/RRadio.vue new file mode 100644 index 0000000..47bfcb8 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RRadio.vue @@ -0,0 +1,34 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RRate.vue b/src/components/FormGenerator/src/rightComponents/RRate.vue new file mode 100644 index 0000000..e6761b4 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RRate.vue @@ -0,0 +1,15 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RRelationForm/RuleModal.vue b/src/components/FormGenerator/src/rightComponents/RRelationForm/RuleModal.vue new file mode 100644 index 0000000..9d0fb43 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RRelationForm/RuleModal.vue @@ -0,0 +1,128 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RRelationForm/index.vue b/src/components/FormGenerator/src/rightComponents/RRelationForm/index.vue new file mode 100644 index 0000000..07afa7e --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RRelationForm/index.vue @@ -0,0 +1,240 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RRelationFormAttr.vue b/src/components/FormGenerator/src/rightComponents/RRelationFormAttr.vue new file mode 100644 index 0000000..83807bf --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RRelationFormAttr.vue @@ -0,0 +1,89 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RRow.vue b/src/components/FormGenerator/src/rightComponents/RRow.vue new file mode 100644 index 0000000..c44d02e --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RRow.vue @@ -0,0 +1,9 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RSelect.vue b/src/components/FormGenerator/src/rightComponents/RSelect.vue new file mode 100644 index 0000000..eb8794c --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RSelect.vue @@ -0,0 +1,30 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RSign.vue b/src/components/FormGenerator/src/rightComponents/RSign.vue new file mode 100644 index 0000000..4da7878 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RSign.vue @@ -0,0 +1,12 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RSignature.vue b/src/components/FormGenerator/src/rightComponents/RSignature.vue new file mode 100644 index 0000000..879daa7 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RSignature.vue @@ -0,0 +1,22 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RSlider.vue b/src/components/FormGenerator/src/rightComponents/RSlider.vue new file mode 100644 index 0000000..80da64b --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RSlider.vue @@ -0,0 +1,23 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RSteps.vue b/src/components/FormGenerator/src/rightComponents/RSteps.vue new file mode 100644 index 0000000..fcfa2d4 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RSteps.vue @@ -0,0 +1,73 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RSwitch.vue b/src/components/FormGenerator/src/rightComponents/RSwitch.vue new file mode 100644 index 0000000..60f32c8 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RSwitch.vue @@ -0,0 +1,15 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RTab.vue b/src/components/FormGenerator/src/rightComponents/RTab.vue new file mode 100644 index 0000000..8ceb749 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RTab.vue @@ -0,0 +1,82 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RTable/BtnConfigModal.vue b/src/components/FormGenerator/src/rightComponents/RTable/BtnConfigModal.vue new file mode 100644 index 0000000..baee707 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RTable/BtnConfigModal.vue @@ -0,0 +1,519 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RTable/index.vue b/src/components/FormGenerator/src/rightComponents/RTable/index.vue new file mode 100644 index 0000000..64e49ab --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RTable/index.vue @@ -0,0 +1,236 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RTableGrid.vue b/src/components/FormGenerator/src/rightComponents/RTableGrid.vue new file mode 100644 index 0000000..2e1d9e2 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RTableGrid.vue @@ -0,0 +1,28 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RTableGridTd.vue b/src/components/FormGenerator/src/rightComponents/RTableGridTd.vue new file mode 100644 index 0000000..a635b09 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RTableGridTd.vue @@ -0,0 +1,9 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RText.vue b/src/components/FormGenerator/src/rightComponents/RText.vue new file mode 100644 index 0000000..5921a89 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RText.vue @@ -0,0 +1,45 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RTextarea.vue b/src/components/FormGenerator/src/rightComponents/RTextarea.vue new file mode 100644 index 0000000..755e290 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RTextarea.vue @@ -0,0 +1,32 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RTimePicker.vue b/src/components/FormGenerator/src/rightComponents/RTimePicker.vue new file mode 100644 index 0000000..a62fda5 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RTimePicker.vue @@ -0,0 +1,185 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RTreeSelect.vue b/src/components/FormGenerator/src/rightComponents/RTreeSelect.vue new file mode 100644 index 0000000..33ed210 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RTreeSelect.vue @@ -0,0 +1,32 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RUploadFile.vue b/src/components/FormGenerator/src/rightComponents/RUploadFile.vue new file mode 100644 index 0000000..825c4d9 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RUploadFile.vue @@ -0,0 +1,93 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/RUploadImg.vue b/src/components/FormGenerator/src/rightComponents/RUploadImg.vue new file mode 100644 index 0000000..5501fd1 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/RUploadImg.vue @@ -0,0 +1,74 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/components/BatchOperate.vue b/src/components/FormGenerator/src/rightComponents/components/BatchOperate.vue new file mode 100644 index 0000000..005eaf2 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/components/BatchOperate.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/components/DataProperties.vue b/src/components/FormGenerator/src/rightComponents/components/DataProperties.vue new file mode 100644 index 0000000..d17bacb --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/components/DataProperties.vue @@ -0,0 +1,189 @@ + + diff --git a/src/components/FormGenerator/src/rightComponents/components/MaskConfigModal.vue b/src/components/FormGenerator/src/rightComponents/components/MaskConfigModal.vue new file mode 100644 index 0000000..a28a442 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/components/MaskConfigModal.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/components/TreeBatchOperate.vue b/src/components/FormGenerator/src/rightComponents/components/TreeBatchOperate.vue new file mode 100644 index 0000000..e66cb1d --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/components/TreeBatchOperate.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/components/TreeNodeModal.vue b/src/components/FormGenerator/src/rightComponents/components/TreeNodeModal.vue new file mode 100644 index 0000000..ef94c21 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/components/TreeNodeModal.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/FormGenerator/src/rightComponents/index.ts b/src/components/FormGenerator/src/rightComponents/index.ts new file mode 100644 index 0000000..fdd0900 --- /dev/null +++ b/src/components/FormGenerator/src/rightComponents/index.ts @@ -0,0 +1,46 @@ +export { default as RInput } from './RInput.vue'; +export { default as RTextarea } from './RTextarea.vue'; +export { default as RInputNumber } from './RInputNumber.vue'; +export { default as RSwitch } from './RSwitch.vue'; +export { default as RRadio } from './RRadio.vue'; +export { default as RCheckbox } from './RCheckbox.vue'; +export { default as RSelect } from './RSelect.vue'; +export { default as RCascader } from './RCascader.vue'; +export { default as RTreeSelect } from './RTreeSelect.vue'; +export { default as RDatePicker } from './RDatePicker.vue'; +export { default as RTimePicker } from './RTimePicker.vue'; +export { default as RUploadFile } from './RUploadFile.vue'; +export { default as RUploadImg } from './RUploadImg.vue'; +export { default as RColorPicker } from './RColorPicker.vue'; +export { default as RRate } from './RRate.vue'; +export { default as RSlider } from './RSlider.vue'; +export { default as REditor } from './REditor.vue'; +export { default as RLink } from './RLink.vue'; +export { default as RButton } from './RButton.vue'; +export { default as RText } from './RText.vue'; +export { default as RAlert } from './RAlert.vue'; +export { default as RQrcode } from './RQrcode.vue'; +export { default as RBarcode } from './RBarcode.vue'; +export { default as ROrgRight } from './ROrgRight.vue'; +export { default as RTable } from './RTable/index.vue'; +export { default as RPopupSelect } from './RPopupSelect.vue'; +export { default as RAreaSelect } from './RAreaSelect.vue'; +export { default as RRelationForm } from './RRelationForm/index.vue'; +export { default as RRelationFormAttr } from './RRelationFormAttr.vue'; +export { default as RPopupAttr } from './RPopupAttr.vue'; +export { default as RCalculate } from './RCalculate.vue'; +export { default as RGroupTitle } from './RGroupTitle.vue'; +export { default as RDivider } from './RDivider.vue'; +export { default as RCollapse } from './RCollapse.vue'; +export { default as RTab } from './RTab.vue'; +export { default as RRow } from './RRow.vue'; +export { default as RCard } from './RCard.vue'; +export { default as RTableGrid } from './RTableGrid.vue'; +export { default as RTableGridTd } from './RTableGridTd.vue'; +export { default as RAutoComplete } from './RAutoComplete.vue'; +export { default as RLocation } from './RLocation/index.vue'; +export { default as RSign } from './RSign.vue'; +export { default as RSignature } from './RSignature.vue'; +export { default as RIframe } from './RIframe.vue'; +export { default as RSteps } from './RSteps.vue'; +export { default as RBillRule } from './RBillRule.vue'; diff --git a/src/components/FormGenerator/src/types/basic.ts b/src/components/FormGenerator/src/types/basic.ts new file mode 100644 index 0000000..6d4a2d0 --- /dev/null +++ b/src/components/FormGenerator/src/types/basic.ts @@ -0,0 +1,38 @@ +export interface RegItem { + pattern: string; + message: string; +} +export interface MaskConfig { + filler: string; + maskType: number; + prefixType: number; + prefixLimit: number; + prefixSpecifyChar: string; + suffixType: number; + suffixLimit: number; + suffixSpecifyChar: string; + ignoreChar: string; + useUnrealMask: boolean; + unrealMaskLength: number; +} +export interface SelectProps { + label: string; + value: string; +} +export interface TreeProps extends SelectProps { + children: string; +} +export type DateFormatType = + | 'yyyy' + | 'yyyy-MM' + | 'yyyy-MM-dd' + | 'yyyy-MM-dd HH:mm' + | 'yyyy-MM-dd HH:mm:ss' + | 'YYYY' + | 'YYYY-MM' + | 'YYYY-MM-DD' + | 'YYYY-MM-DD HH:mm' + | 'YYYY-MM-DD HH:mm:ss'; +export type TimeFormatType = 'HH:mm' | 'HH:mm:ss'; +export type SizeUnitType = 'KB' | 'MB' | 'GB'; +export type AlignType = 'left' | 'center' | 'right'; diff --git a/src/components/FormGenerator/src/types/genItem.ts b/src/components/FormGenerator/src/types/genItem.ts new file mode 100644 index 0000000..dd3cc99 --- /dev/null +++ b/src/components/FormGenerator/src/types/genItem.ts @@ -0,0 +1,492 @@ +import type { RegItem, MaskConfig, SelectProps, TreeProps, DateFormatType, TimeFormatType, SizeUnitType, AlignType } from './basic'; +export interface ItemCfg { + yunzhupaasKey: string; + label: string; + tipLabel?: string; + labelWidth: undefined | number; + showLabel: boolean; + tag: string; + tagIcon: string; + tableAlign?: string; + tableFixed?: string; + className: string[]; + defaultValue?: any; + defaultCurrent?: boolean; + required?: false; + layout: string; + span: number; + dragDisabled: boolean; + visibility: string[]; + tableName?: Nullable; + noShow: boolean; + regList?: RegItem[]; + trigger?: string | string[]; + isStorage?: number; + dataType?: string; + dictionaryType?: string; + propsUrl?: string; + propsName?: string; + useCache?: boolean; + templateJson?: any[]; + formId?: string; + isSubTable?: boolean; + parentVModel?: Nullable; + relationTable?: Nullable; + // 关联表单/弹窗选择 + transferList?: any[]; + // 折叠面板/tab + children?: any[]; + active?: any; + // 设计子表 + showTitle?: boolean; + complexHeaderList?: any[]; + // 表格容器、iframe + borderType?: string; + borderColor?: string; + borderWidth?: number; + // 单据规则 + rule?: string; + ruleName?: string; + ruleType?: number; + ruleConfig?: any; + // 日期选择/时间选择 + startTimeRule?: false; + startTimeType?: number; + startTimeTarget?: number; + startTimeValue?: Nullable; + startRelationField?: string; + endTimeRule?: false; + endTimeType?: number; + endTimeTarget?: number; + endTimeValue?: Nullable; + endRelationField?: string; +} + +export interface ItemOn { + change?: string; + blur?: string; + click?: string; + tabClick?: string; +} + +export interface BasicGenItem { + __config__: ItemCfg; + on?: ItemOn; + style?: { + width: string; + }; + __vModel__?: string; +} +// 单行输入 +export interface InputGenItem extends BasicGenItem { + placeholder: string; + useScan: boolean; + useMask: boolean; + maskConfig: MaskConfig; + clearable: boolean; + addonBefore: string; + addonAfter: string; + prefixIcon: string; + suffixIcon: string; + maxlength: Nullable; + showCount: boolean; + showPassword: boolean; + readonly: boolean; + disabled: boolean; +} +// 多行输入 +export interface TextareaGenItem extends BasicGenItem { + placeholder: string; + autoSize: any; + clearable: boolean; + maxlength: Nullable; + showCount: boolean; + readonly: boolean; + disabled: boolean; +} +// 数字输入 +export interface InputNumberGenItem extends BasicGenItem { + placeholder: string; + min?: number; + max?: number; + controls: boolean; + addonBefore: string; + addonAfter: string; + thousands: boolean; + isAmountChinese: boolean; + step: number; + precision?: number; + disabled: boolean; +} +// 开关 +export interface SwitchGenItem extends BasicGenItem { + disabled: boolean; + activeTxt: string; + inactiveTxt: string; + activeValue: number; + inactiveValue: number; +} +// 单选框组 +export interface RadioGenItem extends BasicGenItem { + options: any[]; + props: SelectProps; + direction: string; + optionType: string; + buttonStyle: string; + size: string; + disabled: boolean; +} +// 多选框组 +export interface CheckboxGenItem extends BasicGenItem { + options: any[]; + props: SelectProps; + direction: string; + disabled: boolean; +} +// 下拉框 +export interface SelectGenItem extends BasicGenItem { + options: any[]; + props: SelectProps; + placeholder: string; + clearable: boolean; + disabled: boolean; + filterable: boolean; + multiple: boolean; +} +// 下拉树形 +export interface TreeSelectGenItem extends SelectGenItem { + props: TreeProps; +} +// 级联选择 +export interface CascaderGenItem extends TreeSelectGenItem {} +// 日期选择 +export interface DatePickerGenItem extends BasicGenItem { + placeholder: string; + format: DateFormatType; + startTime: Nullable; + endTime: Nullable; + clearable: boolean; + disabled: boolean; +} +// 时间选择 +export interface TimePickerGenItem extends BasicGenItem { + placeholder: string; + format: TimeFormatType; + startTime: Nullable; + endTime: Nullable; + clearable: boolean; + disabled: boolean; +} +// 图片上传 +export interface UploadImgGenItem extends BasicGenItem { + disabled: boolean; + fileSize: Nullable; + sizeUnit: SizeUnitType; + buttonText: string; + limit: Nullable; + pathType: string; + sortRule: string[]; + timeFormat: string; + folder: string; + tipText: string; + showType: string; +} +// 文件上传 +export interface UploadFileGenItem extends UploadImgGenItem { + accept: string; +} +// 颜色选择 +export interface ColorPickerGenItem extends BasicGenItem { + showAlpha: boolean; + colorFormat: string; + disabled: boolean; +} +// 评分 +export interface RateGenItem extends BasicGenItem { + count: number; + allowHalf: boolean; + disabled: boolean; +} +// 滑块 +export interface SliderGenItem extends BasicGenItem { + min: number; + max: number; + step: number; + disabled: boolean; +} +// 富文本 +export interface EditorGenItem extends BasicGenItem { + placeholder: string; + disabled: boolean; +} +// 链接 +export interface LinkGenItem extends BasicGenItem { + content: string; + href: string; + target: string; + textStyle: any; +} +// 按钮 +export interface ButtonGenItem extends BasicGenItem { + align: AlignType; + buttonText: string; + type: string; + disabled: boolean; +} +// 文本 +export interface TextGenItem extends BasicGenItem { + content: string; + textStyle: any; +} +// 提示 +export interface AlertGenItem extends BasicGenItem { + content: string; + textStyle: any; + title: string; + type: string; + showIcon: boolean; + closable: boolean; + description: string; + closeText: string; +} +// 二维码 +export interface QrcodeGenItem extends BasicGenItem { + colorDark: string; + colorLight: string; + width: number; + dataType: string; + staticText: string; + relationField: string; +} +// 条形码 +export interface BarcodeGenItem extends BasicGenItem { + format: string; + lineColor: string; + background: string; + width: number; + height: number; + dataType: string; + staticText: string; + relationField: string; +} +// 计算公式 +export interface CalculateGenItem extends BasicGenItem { + expression: any[]; + isStorage: number; + thousands: boolean; + isAmountChinese: boolean; + precision: Nullable; + roundType: number; +} + +// 组织选择、部门选择、岗位选择、角色选择、分组选择 +export interface OrgGenItem extends BasicGenItem { + placeholder: string; + selectType: string; + ableIds: string[]; + multiple: boolean; + clearable: boolean; + filterable: boolean; + disabled: boolean; +} +export interface UserSelectGenItem extends OrgGenItem { + ableRelationIds: string[]; + relationField: string; +} +// 表格容器 +export interface TableGenItem extends BasicGenItem { + disabled: boolean; + showSummary: boolean; + summaryField: string[]; + defaultValue: any[]; + columnBtnsList: any[]; + footerBtnsList: any[]; + layoutType: string; + defaultExpandAll: boolean; +} +// 弹窗选择 +export interface PopupSelectGenItem extends BasicGenItem { + placeholder: string; + interfaceId: string; + interfaceName: string; + templateJson: any[]; + hasPage: boolean; + pageSize: number; + extraOptions: any[]; + columnOptions: any[]; + propsValue: string; + relationField: string; + popupType: string; + popupTitle: string; + popupWidth: string; + disabled: boolean; + clearable: boolean; + multiple: boolean; + filterable: boolean; +} +// 关联表单 +export interface RelationFormGenItem extends BasicGenItem { + placeholder: string; + modelId: string; + templateJson: any[]; + hasPage: boolean; + pageSize: number; + extraOptions: any[]; + columnOptions: any[]; + propsValue: string; + relationField: string; + popupType: string; + popupTitle: string; + popupWidth: string; + disabled: boolean; + clearable: boolean; + multiple: boolean; + filterable: boolean; + queryType: number; +} +// 弹窗选择属性、关联表单属性 +export interface AttrGenItem extends BasicGenItem { + showField: string; + relationField: string; + isStorage: number; +} +// 下拉补全 +export interface AutoCompleteGenItem extends BasicGenItem { + interfaceId: string; + interfaceName: string; + templateJson: any[]; + total: number; + relationField: string; + disabled: boolean; + clearable: boolean; +} +// 省市区域 +export interface AreaSelectGenItem extends BasicGenItem { + placeholder: string; + disabled: boolean; + clearable: boolean; + filterable: boolean; + multiple: boolean; + level: number; +} +// 个人签名 +export interface SignGenItem extends BasicGenItem { + isInvoke: boolean; + disabled: boolean; +} +// 定位 +export interface LocationGenItem extends BasicGenItem { + autoLocation: boolean; + enableLocationScope: boolean; + adjustmentScope: number; + enableDesktopLocation: boolean; + locationScope: any[]; + disabled: boolean; + clearable: boolean; + buttonText: string; +} +// Iframe +export interface IframeGenItem extends BasicGenItem { + href: string; + height: Nullable; + borderType: string; + borderColor: string; + borderWidth: number; +} +// 所属组织 +export interface CurrOrganizeGenItem extends BasicGenItem { + type: string; + readonly: boolean; + showLevel: string; + placeholder: string; +} +// 分割线 +export interface DividerGenItem extends BasicGenItem { + content: string; + contentPosition: AlignType; +} +// 分组标题 +export interface GroupTitleGenItem extends DividerGenItem { + helpMessage: string; +} +// 折叠面板 +export interface CollapseGenItem extends BasicGenItem { + accordion: boolean; + ghost: boolean; + expandIconPosition: 'start' | 'end'; +} +// 标签面板 +export interface TabGenItem extends BasicGenItem { + type: string; + tabPosition: string; +} +// 步骤条 +export interface StepsGenItem extends BasicGenItem { + simple: boolean; + processStatus: string; +} +// 栅格容器 +export interface RowGenItem extends BasicGenItem { + type: string; + justify: string; + align: string; +} +// 卡片容器 +export interface CardGenItem extends BasicGenItem { + header: string; + shadow: string; +} +// 表格容器 +export interface TableGridGenItem extends BasicGenItem {} + +// export interface GenItem { +// __config__: ItemCfg; +// on?: ItemOn; +// [prop: string]: any; +// } + +export type GenItem = + | InputGenItem + | TextareaGenItem + | InputNumberGenItem + | SwitchGenItem + | RadioGenItem + | CheckboxGenItem + | SelectGenItem + | TreeSelectGenItem + | CascaderGenItem + | DatePickerGenItem + | TimePickerGenItem + | UploadImgGenItem + | UploadFileGenItem + | ColorPickerGenItem + | RateGenItem + | SliderGenItem + | EditorGenItem + | LinkGenItem + | ButtonGenItem + | TextGenItem + | AlertGenItem + | QrcodeGenItem + | BarcodeGenItem + | CalculateGenItem + | OrgGenItem + | UserSelectGenItem + | TableGenItem + | PopupSelectGenItem + | RelationFormGenItem + | AttrGenItem + | AutoCompleteGenItem + | AreaSelectGenItem + | SignGenItem + | LocationGenItem + | IframeGenItem + | CurrOrganizeGenItem + | DividerGenItem + | GroupTitleGenItem + | CollapseGenItem + | TabGenItem + | StepsGenItem + | RowGenItem + | CardGenItem + | TableGridGenItem; diff --git a/src/components/FormGenerator/style/index.less b/src/components/FormGenerator/style/index.less new file mode 100644 index 0000000..c1c496c --- /dev/null +++ b/src/components/FormGenerator/style/index.less @@ -0,0 +1,455 @@ +@prefix-cls: ~'@{namespace}-basic-generator'; + +.@{prefix-cls} { + position: relative; + width: 100%; + height: 100%; + display: flex; + .common-board { + height: 100%; + border-radius: 8px; + overflow: hidden; + } + .left-board { + width: 250px; + flex-shrink: 0; + background-color: @component-background; + display: flex; + flex-direction: column; + .ant-collapse-header { + .ant-collapse-header-text { + font-weight: 600; + } + } + .components-list { + .ant-collapse-content-box { + padding: 0 10px; + } + .components-part { + background-color: @component-background; + border-radius: 4px; + padding: 10px 10px 0; + margin-bottom: 10px; + + &:last-child { + margin-bottom: 0; + } + } + .components-title { + font-size: 14px; + line-height: 30px; + margin-bottom: 10px; + font-weight: bold; + } + + .components-draggable { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + } + + .components-item { + width: 110px; + margin-bottom: 10px; + transition: transform 0ms !important; + + &.disabled { + .components-body { + cursor: not-allowed; + color: @text-color-secondary; + &:hover { + color: @text-color-secondary; + border-color: @border-color-base; + } + } + } + .components-body { + padding-left: 8px; + font-size: 12px; + height: 36px; + cursor: move; + border: 1px solid @border-color-base; + border-radius: var(--border-radius); + line-height: 34px; + display: flex; + align-items: center; + color: @text-color; + span { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + i { + flex-shrink: 0; + line-height: 16px; + height: 16px; + margin-right: 4px; + } + &:hover { + border: 1px solid @primary-color; + color: @primary-color; + } + } + } + } + } + .center-board { + flex: 1; + margin: 0 10px; + background-color: @component-background; + box-sizing: border-box; + } + .center-board-main { + height: calc(100% - 42px); + overflow: hidden; + box-sizing: border-box; + .scrollbar__view { + padding: 10px; + } + .center-board-row { + & > .ant-form { + height: calc(100vh - 150px); + width: 100%; + } + } + .empty-info { + position: absolute; + top: 20%; + left: calc(50% - 250px); + pointer-events: none; + &.app-empty-info { + top: calc(50% - 150px); + left: calc(50% - 150px); + .empty-img { + width: 300px; + height: 300px; + } + } + .empty-img { + width: 500px; + height: 500px; + } + } + .drawing-board { + height: 100%; + position: relative; + display: flex; + flex-wrap: wrap; + align-content: flex-start; + .components-body { + padding: 0; + margin: 0; + font-size: 0; + } + .sortable-ghost { + position: relative; + display: block; + overflow: hidden; + i { + display: none; + } + &::before { + content: ' '; + position: absolute; + left: 0; + right: 0; + top: 0; + height: 3px; + background: @primary-color; + z-index: 2; + } + .drawing-item-action { + display: none !important; + } + } + .components-item.sortable-ghost { + width: 100%; + height: 60px; + background-color: @primary-1; + } + .drawing-item { + position: relative; + cursor: move; + .ant-form-item { + border: 1px dashed @border-color-base; + padding: 10px; + margin-bottom: 10px !important; + border-radius: 8px; + .common-container { + .ant-form-item { + border: unset; + padding: 0; + margin-bottom: 0 !important; + border-radius: 0; + } + } + } + } + .drawing-row-item { + position: relative; + cursor: move; + box-sizing: border-box; + border: 1px dashed @border-color-base; + padding: 0 2px; + margin-bottom: 10px; + border-radius: 8px; + &.drawing-row-item-table-grid { + padding-top: 10px; + padding-bottom: 10px; + } + .ant-card { + width: 100%; + .ant-card-body { + & > .ant-row { + width: 100%; + } + } + } + .ant-tabs { + width: 100%; + .ant-tabs-nav { + margin-bottom: 0; + } + } + .ant-collapse { + width: 100%; + } + .child-drawing-row { + position: relative; + } + &.drawing-row-item-row { + position: relative; + & > .ant-col { + width: 100%; + } + .row-tip { + top: 50px; + } + .drag-wrapper { + min-height: 100px; + } + } + &.drawing-row-item-table { + .row-tip { + top: 50px; + } + .ant-form { + width: 100%; + } + .drag-wrapper { + min-height: 100px; + padding-top: 30px; + } + .table-wrapper-web { + overflow: auto hidden; + display: flex; + width: 100%; + flex-wrap: nowrap; + padding-bottom: 10px; + + & > .ant-col { + width: 200px !important; + flex: none; + flex-shrink: 0; + height: auto; + .ant-row { + display: block; + } + .ant-form-item { + margin-bottom: 0 !important; + .ant-form-item-label { + width: auto !important; + } + } + } + } + } + .drawing-row-item { + margin-bottom: 2px; + } + .drag-wrapper { + width: 100%; + min-height: 80px; + display: flex; + flex-wrap: wrap; + align-content: flex-start; + &.tableGrid-app-wrapper { + .row-tip { + margin-top: 20px; + } + } + } + &.active-from-item { + border: 1px solid @primary-color; + } + .component-name { + position: absolute; + top: 0; + left: 0; + font-size: 18px; + color: @text-color-secondary; + display: inline-block; + padding: 0 6px; + } + } + .drawing-item, + .drawing-row-item { + &:hover { + & > .ant-form-item { + background: @primary-1; + } + + & > .drawing-item-action { + display: flex; + } + & > .drawing-item-cell { + display: block; + } + } + & > .drawing-item-action { + position: absolute; + top: -10px; + height: 24px; + line-height: 22px; + border-radius: 24px; + font-size: 12px; + border: 1px solid @primary-color; + background: @component-background; + cursor: pointer; + z-index: 1; + right: var(--rightDistance); + display: none; + overflow: hidden; + .drawing-item-action-item { + display: block; + width: 30px; + height: 22px; + height: 100%; + text-align: center; + position: relative; + align-items: center; + justify-content: flex-start; + color: @text-color-label; + &.drawing-item-delete { + color: @text-color-label; + &:hover { + background: #ffe5e5; + color: @error-color; + } + } + &:hover { + background: @primary-1; + color: @primary-color; + } + &:first-child { + &::after { + display: none; + } + } + &::after { + display: block; + content: ''; + position: absolute; + top: 3px; + left: 0; + height: 16px; + width: 1px; + background-color: @border-color-base1; + } + } + } + + & > .drawing-item-cell { + display: none; + position: absolute; + bottom: 0; + right: 0; + width: 22px; + height: 22px; + line-height: 22px; + text-align: center; + font-size: 12px; + cursor: pointer; + z-index: 1; + color: @component-background; + background-color: @primary-color; + i { + color: #fff; + } + .anticon { + vertical-align: top !important; + margin-top: 5px; + } + } + } + .active-from-item { + & > .ant-form-item { + background-color: @primary-1; + border: 1px solid @primary-color; + } + + & > .drawing-item-action { + display: flex; + } + & > .drawing-item-cell { + display: block; + } + & > .component-name { + color: @primary-color; + } + } + .row-tip { + width: 100%; + color: @text-color-secondary; + text-align: center; + position: absolute; + top: 30px; + font-size: 14px; + } + .table-grid { + width: 100%; + text-align: center; + border-collapse: collapse; + table-layout: fixed; + .table-cell { + min-height: 75px !important; + overflow: auto; + padding-top: 10px; + } + .drawing-row-item { + padding: 0 2px; + text-align: left; + } + } + } + .ipad { + height: calc(100% - 42px); + display: flex; + justify-content: center; + align-items: center; + min-height: 711px; + + .outerIpad { + background: url('../../../assets/images/iphoneBg.png'); + width: 389px; + height: 711px; + padding: 65px 40px; + + .ipadBody { + height: 100%; + .center-board-row > .ant-form { + height: 550px !important; + } + } + } + } + } +} +html[data-theme='dark'] { + .@{prefix-cls} { + .center-board-main .ipad .outerIpad { + background: url('../../../assets/images/iphoneBg-dark.png'); + } + } +} diff --git a/src/components/FormGenerator/style/rightPanel.less b/src/components/FormGenerator/style/rightPanel.less new file mode 100644 index 0000000..843cac5 --- /dev/null +++ b/src/components/FormGenerator/style/rightPanel.less @@ -0,0 +1,143 @@ +@prefix-cls: ~'@{namespace}-basic-generator'; + +.@{prefix-cls} { + .right-board { + width: 340px; + flex-shrink: 0; + background-color: @component-background; + .field-box { + position: relative; + height: calc(100% - 42px); + box-sizing: border-box; + overflow: hidden; + & > .scrollbar > .scrollbar__wrap > .scrollbar__view { + padding: 10px; + } + } + .right-board-form { + .ant-form-item { + margin-bottom: 18px; + } + .right-radio { + .ant-radio-button-wrapper { + padding: 0 11px; + } + } + .btn-config-list { + .btn-cell { + display: flex; + align-items: center; + margin-bottom: 18px; + .ant-checkbox-wrapper { + width: 100px; + flex-shrink: 0; + } + } + } + .reg-item { + padding: 12px 6px; + background-color: @app-content-background; + position: relative; + border-radius: 4px; + + .close-btn { + position: absolute; + right: -6px; + top: -6px; + display: block; + width: 16px; + height: 16px; + line-height: 16px; + background: rgba(0, 0, 0, 0.2); + border-radius: 50%; + color: #fff; + text-align: center; + z-index: 1; + cursor: pointer; + font-size: 12px; + i { + font-size: 12px; + } + + &:hover { + background: @error-color; + } + } + + & + .reg-item { + margin-top: 18px; + } + } + .options-list { + margin-bottom: -10px; + .scrollbar__wrap { + margin-bottom: 0 !important; + } + .select-item { + display: flex; + border: 1px dashed @component-background; + box-sizing: border-box; + & .ant-input + .ant-input { + margin-left: 4px; + } + .ant-select { + width: 100%; + } + & + .select-item { + margin-top: 4px; + } + &.sortable-chosen { + border: 1px dashed @primary-color; + } + .select-line-icon { + line-height: 31px; + font-size: 22px; + padding: 0 4px; + color: #606266; + .icon-ym-darg { + font-size: 20px; + line-height: 31px; + display: inline-block; + } + .icon-ym-btn-clearn { + font-size: 18px; + } + } + .close-btn { + cursor: pointer; + color: @error-color; + height: 32px; + display: flex; + align-items: center; + } + .option-drag { + cursor: move; + } + } + .add-btn { + padding-left: 27px; + } + .yunzhupaas-tree__name { + width: calc(100% - 60px); + } + } + } + } +} +.select-item-add { + text-align: center; + .ant-btn { + padding: 4px 12px !important; + } +} +.ant-select-item-option-content { + .custom-option-left { + float: left; + } + .custom-option-right { + float: right; + color: @text-color-secondary; + font-size: 13px; + margin-left: 20px; + } +} diff --git a/src/components/Icon/data/icons.data.ts b/src/components/Icon/data/icons.data.ts new file mode 100644 index 0000000..e5fe3e2 --- /dev/null +++ b/src/components/Icon/data/icons.data.ts @@ -0,0 +1,793 @@ +export default { + prefix: 'ant-design', + icons: [ + 'account-book-filled', + 'account-book-outlined', + 'account-book-twotone', + 'aim-outlined', + 'alert-filled', + 'alert-outlined', + 'alert-twotone', + 'alibaba-outlined', + 'align-center-outlined', + 'align-left-outlined', + 'align-right-outlined', + 'alipay-circle-filled', + 'alipay-circle-outlined', + 'alipay-outlined', + 'alipay-square-filled', + 'aliwangwang-filled', + 'aliwangwang-outlined', + 'aliyun-outlined', + 'amazon-circle-filled', + 'amazon-outlined', + 'amazon-square-filled', + 'android-filled', + 'android-outlined', + 'ant-cloud-outlined', + 'ant-design-outlined', + 'apartment-outlined', + 'api-filled', + 'api-outlined', + 'api-twotone', + 'apple-filled', + 'apple-outlined', + 'appstore-add-outlined', + 'appstore-filled', + 'appstore-outlined', + 'appstore-twotone', + 'area-chart-outlined', + 'arrow-down-outlined', + 'arrow-left-outlined', + 'arrow-right-outlined', + 'arrow-up-outlined', + 'arrows-alt-outlined', + 'audio-filled', + 'audio-muted-outlined', + 'audio-outlined', + 'audio-twotone', + 'audit-outlined', + 'backward-filled', + 'backward-outlined', + 'bank-filled', + 'bank-outlined', + 'bank-twotone', + 'bar-chart-outlined', + 'barcode-outlined', + 'bars-outlined', + 'behance-circle-filled', + 'behance-outlined', + 'behance-square-filled', + 'behance-square-outlined', + 'bell-filled', + 'bell-outlined', + 'bell-twotone', + 'bg-colors-outlined', + 'block-outlined', + 'bold-outlined', + 'book-filled', + 'book-outlined', + 'book-twotone', + 'border-bottom-outlined', + 'border-horizontal-outlined', + 'border-inner-outlined', + 'border-left-outlined', + 'border-outer-outlined', + 'border-outlined', + 'border-right-outlined', + 'border-top-outlined', + 'border-verticle-outlined', + 'borderless-table-outlined', + 'box-plot-filled', + 'box-plot-outlined', + 'box-plot-twotone', + 'branches-outlined', + 'bug-filled', + 'bug-outlined', + 'bug-twotone', + 'build-filled', + 'build-outlined', + 'build-twotone', + 'bulb-filled', + 'bulb-outlined', + 'bulb-twotone', + 'calculator-filled', + 'calculator-outlined', + 'calculator-twotone', + 'calendar-filled', + 'calendar-outlined', + 'calendar-twotone', + 'camera-filled', + 'camera-outlined', + 'camera-twotone', + 'car-filled', + 'car-outlined', + 'car-twotone', + 'caret-down-filled', + 'caret-down-outlined', + 'caret-left-filled', + 'caret-left-outlined', + 'caret-right-filled', + 'caret-right-outlined', + 'caret-up-filled', + 'caret-up-outlined', + 'carry-out-filled', + 'carry-out-outlined', + 'carry-out-twotone', + 'check-circle-filled', + 'check-circle-outlined', + 'check-circle-twotone', + 'check-outlined', + 'check-square-filled', + 'check-square-outlined', + 'check-square-twotone', + 'chrome-filled', + 'chrome-outlined', + 'ci-circle-filled', + 'ci-circle-outlined', + 'ci-circle-twotone', + 'ci-outlined', + 'ci-twotone', + 'clear-outlined', + 'clock-circle-filled', + 'clock-circle-outlined', + 'clock-circle-twotone', + 'close-circle-filled', + 'close-circle-outlined', + 'close-circle-twotone', + 'close-outlined', + 'close-square-filled', + 'close-square-outlined', + 'close-square-twotone', + 'cloud-download-outlined', + 'cloud-filled', + 'cloud-outlined', + 'cloud-server-outlined', + 'cloud-sync-outlined', + 'cloud-twotone', + 'cloud-upload-outlined', + 'cluster-outlined', + 'code-filled', + 'code-outlined', + 'code-sandbox-circle-filled', + 'code-sandbox-outlined', + 'code-sandbox-square-filled', + 'code-twotone', + 'codepen-circle-filled', + 'codepen-circle-outlined', + 'codepen-outlined', + 'codepen-square-filled', + 'coffee-outlined', + 'column-height-outlined', + 'column-width-outlined', + 'comment-outlined', + 'compass-filled', + 'compass-outlined', + 'compass-twotone', + 'compress-outlined', + 'console-sql-outlined', + 'contacts-filled', + 'contacts-outlined', + 'contacts-twotone', + 'container-filled', + 'container-outlined', + 'container-twotone', + 'control-filled', + 'control-outlined', + 'control-twotone', + 'copy-filled', + 'copy-outlined', + 'copy-twotone', + 'copyright-circle-filled', + 'copyright-circle-outlined', + 'copyright-circle-twotone', + 'copyright-outlined', + 'copyright-twotone', + 'credit-card-filled', + 'credit-card-outlined', + 'credit-card-twotone', + 'crown-filled', + 'crown-outlined', + 'crown-twotone', + 'customer-service-filled', + 'customer-service-outlined', + 'customer-service-twotone', + 'dash-outlined', + 'dashboard-filled', + 'dashboard-outlined', + 'dashboard-twotone', + 'database-filled', + 'database-outlined', + 'database-twotone', + 'delete-column-outlined', + 'delete-filled', + 'delete-outlined', + 'delete-row-outlined', + 'delete-twotone', + 'delivered-procedure-outlined', + 'deployment-unit-outlined', + 'desktop-outlined', + 'diff-filled', + 'diff-outlined', + 'diff-twotone', + 'dingding-outlined', + 'dingtalk-circle-filled', + 'dingtalk-outlined', + 'dingtalk-square-filled', + 'disconnect-outlined', + 'dislike-filled', + 'dislike-outlined', + 'dislike-twotone', + 'dollar-circle-filled', + 'dollar-circle-outlined', + 'dollar-circle-twotone', + 'dollar-outlined', + 'dollar-twotone', + 'dot-chart-outlined', + 'double-left-outlined', + 'double-right-outlined', + 'down-circle-filled', + 'down-circle-outlined', + 'down-circle-twotone', + 'down-outlined', + 'down-square-filled', + 'down-square-outlined', + 'down-square-twotone', + 'download-outlined', + 'drag-outlined', + 'dribbble-circle-filled', + 'dribbble-outlined', + 'dribbble-square-filled', + 'dribbble-square-outlined', + 'dropbox-circle-filled', + 'dropbox-outlined', + 'dropbox-square-filled', + 'edit-filled', + 'edit-outlined', + 'edit-twotone', + 'ellipsis-outlined', + 'enter-outlined', + 'environment-filled', + 'environment-outlined', + 'environment-twotone', + 'euro-circle-filled', + 'euro-circle-outlined', + 'euro-circle-twotone', + 'euro-outlined', + 'euro-twotone', + 'exception-outlined', + 'exclamation-circle-filled', + 'exclamation-circle-outlined', + 'exclamation-circle-twotone', + 'exclamation-outlined', + 'expand-alt-outlined', + 'expand-outlined', + 'experiment-filled', + 'experiment-outlined', + 'experiment-twotone', + 'export-outlined', + 'eye-filled', + 'eye-invisible-filled', + 'eye-invisible-outlined', + 'eye-invisible-twotone', + 'eye-outlined', + 'eye-twotone', + 'facebook-filled', + 'facebook-outlined', + 'fall-outlined', + 'fast-backward-filled', + 'fast-backward-outlined', + 'fast-forward-filled', + 'fast-forward-outlined', + 'field-binary-outlined', + 'field-number-outlined', + 'field-string-outlined', + 'field-time-outlined', + 'file-add-filled', + 'file-add-outlined', + 'file-add-twotone', + 'file-done-outlined', + 'file-excel-filled', + 'file-excel-outlined', + 'file-excel-twotone', + 'file-exclamation-filled', + 'file-exclamation-outlined', + 'file-exclamation-twotone', + 'file-filled', + 'file-gif-outlined', + 'file-image-filled', + 'file-image-outlined', + 'file-image-twotone', + 'file-jpg-outlined', + 'file-markdown-filled', + 'file-markdown-outlined', + 'file-markdown-twotone', + 'file-outlined', + 'file-pdf-filled', + 'file-pdf-outlined', + 'file-pdf-twotone', + 'file-ppt-filled', + 'file-ppt-outlined', + 'file-ppt-twotone', + 'file-protect-outlined', + 'file-search-outlined', + 'file-sync-outlined', + 'file-text-filled', + 'file-text-outlined', + 'file-text-twotone', + 'file-twotone', + 'file-unknown-filled', + 'file-unknown-outlined', + 'file-unknown-twotone', + 'file-word-filled', + 'file-word-outlined', + 'file-word-twotone', + 'file-zip-filled', + 'file-zip-outlined', + 'file-zip-twotone', + 'filter-filled', + 'filter-outlined', + 'filter-twotone', + 'fire-filled', + 'fire-outlined', + 'fire-twotone', + 'flag-filled', + 'flag-outlined', + 'flag-twotone', + 'folder-add-filled', + 'folder-add-outlined', + 'folder-add-twotone', + 'folder-filled', + 'folder-open-filled', + 'folder-open-outlined', + 'folder-open-twotone', + 'folder-outlined', + 'folder-twotone', + 'folder-view-outlined', + 'font-colors-outlined', + 'font-size-outlined', + 'fork-outlined', + 'form-outlined', + 'format-painter-filled', + 'format-painter-outlined', + 'forward-filled', + 'forward-outlined', + 'frown-filled', + 'frown-outlined', + 'frown-twotone', + 'fullscreen-exit-outlined', + 'fullscreen-outlined', + 'function-outlined', + 'fund-filled', + 'fund-outlined', + 'fund-projection-screen-outlined', + 'fund-twotone', + 'fund-view-outlined', + 'funnel-plot-filled', + 'funnel-plot-outlined', + 'funnel-plot-twotone', + 'gateway-outlined', + 'gif-outlined', + 'gift-filled', + 'gift-outlined', + 'gift-twotone', + 'github-filled', + 'github-outlined', + 'gitlab-filled', + 'gitlab-outlined', + 'global-outlined', + 'gold-filled', + 'gold-outlined', + 'gold-twotone', + 'golden-filled', + 'google-circle-filled', + 'google-outlined', + 'google-plus-circle-filled', + 'google-plus-outlined', + 'google-plus-square-filled', + 'google-square-filled', + 'group-outlined', + 'hdd-filled', + 'hdd-outlined', + 'hdd-twotone', + 'heart-filled', + 'heart-outlined', + 'heart-twotone', + 'heat-map-outlined', + 'highlight-filled', + 'highlight-outlined', + 'highlight-twotone', + 'history-outlined', + 'home-filled', + 'home-outlined', + 'home-twotone', + 'hourglass-filled', + 'hourglass-outlined', + 'hourglass-twotone', + 'html5-filled', + 'html5-outlined', + 'html5-twotone', + 'idcard-filled', + 'idcard-outlined', + 'idcard-twotone', + 'ie-circle-filled', + 'ie-outlined', + 'ie-square-filled', + 'import-outlined', + 'inbox-outlined', + 'info-circle-filled', + 'info-circle-outlined', + 'info-circle-twotone', + 'info-outlined', + 'insert-row-above-outlined', + 'insert-row-below-outlined', + 'insert-row-left-outlined', + 'insert-row-right-outlined', + 'instagram-filled', + 'instagram-outlined', + 'insurance-filled', + 'insurance-outlined', + 'insurance-twotone', + 'interaction-filled', + 'interaction-outlined', + 'interaction-twotone', + 'issues-close-outlined', + 'italic-outlined', + 'key-outlined', + 'laptop-outlined', + 'layout-filled', + 'layout-outlined', + 'layout-twotone', + 'left-circle-filled', + 'left-circle-outlined', + 'left-circle-twotone', + 'left-outlined', + 'left-square-filled', + 'left-square-outlined', + 'left-square-twotone', + 'like-filled', + 'like-outlined', + 'like-twotone', + 'line-chart-outlined', + 'line-height-outlined', + 'line-outlined', + 'link-outlined', + 'linkedin-filled', + 'linkedin-outlined', + 'loading-3-quarters-outlined', + 'loading-outlined', + 'lock-filled', + 'lock-outlined', + 'lock-twotone', + 'login-outlined', + 'logout-outlined', + 'mac-command-filled', + 'mac-command-outlined', + 'mail-filled', + 'mail-outlined', + 'mail-twotone', + 'man-outlined', + 'medicine-box-filled', + 'medicine-box-outlined', + 'medicine-box-twotone', + 'medium-circle-filled', + 'medium-outlined', + 'medium-square-filled', + 'medium-workmark-outlined', + 'meh-filled', + 'meh-outlined', + 'meh-twotone', + 'menu-fold-outlined', + 'menu-outlined', + 'menu-unfold-outlined', + 'merge-cells-outlined', + 'message-filled', + 'message-outlined', + 'message-twotone', + 'minus-circle-filled', + 'minus-circle-outlined', + 'minus-circle-twotone', + 'minus-outlined', + 'minus-square-filled', + 'minus-square-outlined', + 'minus-square-twotone', + 'mobile-filled', + 'mobile-outlined', + 'mobile-twotone', + 'money-collect-filled', + 'money-collect-outlined', + 'money-collect-twotone', + 'monitor-outlined', + 'more-outlined', + 'node-collapse-outlined', + 'node-expand-outlined', + 'node-index-outlined', + 'notification-filled', + 'notification-outlined', + 'notification-twotone', + 'number-outlined', + 'one-to-one-outlined', + 'ordered-list-outlined', + 'paper-clip-outlined', + 'partition-outlined', + 'pause-circle-filled', + 'pause-circle-outlined', + 'pause-circle-twotone', + 'pause-outlined', + 'pay-circle-filled', + 'pay-circle-outlined', + 'percentage-outlined', + 'phone-filled', + 'phone-outlined', + 'phone-twotone', + 'pic-center-outlined', + 'pic-left-outlined', + 'pic-right-outlined', + 'picture-filled', + 'picture-outlined', + 'picture-twotone', + 'pie-chart-filled', + 'pie-chart-outlined', + 'pie-chart-twotone', + 'play-circle-filled', + 'play-circle-outlined', + 'play-circle-twotone', + 'play-square-filled', + 'play-square-outlined', + 'play-square-twotone', + 'plus-circle-filled', + 'plus-circle-outlined', + 'plus-circle-twotone', + 'plus-outlined', + 'plus-square-filled', + 'plus-square-outlined', + 'plus-square-twotone', + 'pound-circle-filled', + 'pound-circle-outlined', + 'pound-circle-twotone', + 'pound-outlined', + 'poweroff-outlined', + 'printer-filled', + 'printer-outlined', + 'printer-twotone', + 'profile-filled', + 'profile-outlined', + 'profile-twotone', + 'project-filled', + 'project-outlined', + 'project-twotone', + 'property-safety-filled', + 'property-safety-outlined', + 'property-safety-twotone', + 'pull-request-outlined', + 'pushpin-filled', + 'pushpin-outlined', + 'pushpin-twotone', + 'qq-circle-filled', + 'qq-outlined', + 'qq-square-filled', + 'qrcode-outlined', + 'question-circle-filled', + 'question-circle-outlined', + 'question-circle-twotone', + 'question-outlined', + 'radar-chart-outlined', + 'radius-bottomleft-outlined', + 'radius-bottomright-outlined', + 'radius-setting-outlined', + 'radius-upleft-outlined', + 'radius-upright-outlined', + 'read-filled', + 'read-outlined', + 'reconciliation-filled', + 'reconciliation-outlined', + 'reconciliation-twotone', + 'red-envelope-filled', + 'red-envelope-outlined', + 'red-envelope-twotone', + 'reddit-circle-filled', + 'reddit-outlined', + 'reddit-square-filled', + 'redo-outlined', + 'reload-outlined', + 'rest-filled', + 'rest-outlined', + 'rest-twotone', + 'retweet-outlined', + 'right-circle-filled', + 'right-circle-outlined', + 'right-circle-twotone', + 'right-outlined', + 'right-square-filled', + 'right-square-outlined', + 'right-square-twotone', + 'rise-outlined', + 'robot-filled', + 'robot-outlined', + 'rocket-filled', + 'rocket-outlined', + 'rocket-twotone', + 'rollback-outlined', + 'rotate-left-outlined', + 'rotate-right-outlined', + 'safety-certificate-filled', + 'safety-certificate-outlined', + 'safety-certificate-twotone', + 'safety-outlined', + 'save-filled', + 'save-outlined', + 'save-twotone', + 'scan-outlined', + 'schedule-filled', + 'schedule-outlined', + 'schedule-twotone', + 'scissor-outlined', + 'search-outlined', + 'security-scan-filled', + 'security-scan-outlined', + 'security-scan-twotone', + 'select-outlined', + 'send-outlined', + 'setting-filled', + 'setting-outlined', + 'setting-twotone', + 'shake-outlined', + 'share-alt-outlined', + 'shop-filled', + 'shop-outlined', + 'shop-twotone', + 'shopping-cart-outlined', + 'shopping-filled', + 'shopping-outlined', + 'shopping-twotone', + 'shrink-outlined', + 'signal-filled', + 'sisternode-outlined', + 'sketch-circle-filled', + 'sketch-outlined', + 'sketch-square-filled', + 'skin-filled', + 'skin-outlined', + 'skin-twotone', + 'skype-filled', + 'skype-outlined', + 'slack-circle-filled', + 'slack-outlined', + 'slack-square-filled', + 'slack-square-outlined', + 'sliders-filled', + 'sliders-outlined', + 'sliders-twotone', + 'small-dash-outlined', + 'smile-filled', + 'smile-outlined', + 'smile-twotone', + 'snippets-filled', + 'snippets-outlined', + 'snippets-twotone', + 'solution-outlined', + 'sort-ascending-outlined', + 'sort-descending-outlined', + 'sound-filled', + 'sound-outlined', + 'sound-twotone', + 'split-cells-outlined', + 'star-filled', + 'star-outlined', + 'star-twotone', + 'step-backward-filled', + 'step-backward-outlined', + 'step-forward-filled', + 'step-forward-outlined', + 'stock-outlined', + 'stop-filled', + 'stop-outlined', + 'stop-twotone', + 'strikethrough-outlined', + 'subnode-outlined', + 'swap-left-outlined', + 'swap-outlined', + 'swap-right-outlined', + 'switcher-filled', + 'switcher-outlined', + 'switcher-twotone', + 'sync-outlined', + 'table-outlined', + 'tablet-filled', + 'tablet-outlined', + 'tablet-twotone', + 'tag-filled', + 'tag-outlined', + 'tag-twotone', + 'tags-filled', + 'tags-outlined', + 'tags-twotone', + 'taobao-circle-filled', + 'taobao-circle-outlined', + 'taobao-outlined', + 'taobao-square-filled', + 'team-outlined', + 'thunderbolt-filled', + 'thunderbolt-outlined', + 'thunderbolt-twotone', + 'to-top-outlined', + 'tool-filled', + 'tool-outlined', + 'tool-twotone', + 'trademark-circle-filled', + 'trademark-circle-outlined', + 'trademark-circle-twotone', + 'trademark-outlined', + 'transaction-outlined', + 'translation-outlined', + 'trophy-filled', + 'trophy-outlined', + 'trophy-twotone', + 'twitter-circle-filled', + 'twitter-outlined', + 'twitter-square-filled', + 'underline-outlined', + 'undo-outlined', + 'ungroup-outlined', + 'unlock-filled', + 'unlock-outlined', + 'unlock-twotone', + 'unordered-list-outlined', + 'up-circle-filled', + 'up-circle-outlined', + 'up-circle-twotone', + 'up-outlined', + 'up-square-filled', + 'up-square-outlined', + 'up-square-twotone', + 'upload-outlined', + 'usb-filled', + 'usb-outlined', + 'usb-twotone', + 'user-add-outlined', + 'user-delete-outlined', + 'user-outlined', + 'user-switch-outlined', + 'usergroup-add-outlined', + 'usergroup-delete-outlined', + 'verified-outlined', + 'vertical-align-bottom-outlined', + 'vertical-align-middle-outlined', + 'vertical-align-top-outlined', + 'vertical-left-outlined', + 'vertical-right-outlined', + 'video-camera-add-outlined', + 'video-camera-filled', + 'video-camera-outlined', + 'video-camera-twotone', + 'wallet-filled', + 'wallet-outlined', + 'wallet-twotone', + 'warning-filled', + 'warning-outlined', + 'warning-twotone', + 'wechat-filled', + 'wechat-outlined', + 'weibo-circle-filled', + 'weibo-circle-outlined', + 'weibo-outlined', + 'weibo-square-filled', + 'weibo-square-outlined', + 'whats-app-outlined', + 'wifi-outlined', + 'windows-filled', + 'windows-outlined', + 'woman-outlined', + 'yahoo-filled', + 'yahoo-outlined', + 'youtube-filled', + 'youtube-outlined', + 'yuque-filled', + 'yuque-outlined', + 'zhihu-circle-filled', + 'zhihu-outlined', + 'zhihu-square-filled', + 'zoom-in-outlined', + 'zoom-out-outlined', + ], +}; diff --git a/src/components/Icon/index.ts b/src/components/Icon/index.ts new file mode 100644 index 0000000..01e7d23 --- /dev/null +++ b/src/components/Icon/index.ts @@ -0,0 +1,7 @@ +import Icon from './src/Icon.vue'; +import SvgIcon from './src/SvgIcon.vue'; +import IconPicker from './src/IconPicker.vue'; + +export { Icon, IconPicker, SvgIcon }; + +export default Icon; diff --git a/src/components/Icon/src/Icon.vue b/src/components/Icon/src/Icon.vue new file mode 100644 index 0000000..227ca20 --- /dev/null +++ b/src/components/Icon/src/Icon.vue @@ -0,0 +1,101 @@ + + + diff --git a/src/components/Icon/src/IconPicker.vue b/src/components/Icon/src/IconPicker.vue new file mode 100644 index 0000000..0b8341a --- /dev/null +++ b/src/components/Icon/src/IconPicker.vue @@ -0,0 +1,175 @@ + + + diff --git a/src/components/Icon/src/SvgIcon.vue b/src/components/Icon/src/SvgIcon.vue new file mode 100644 index 0000000..048ddc3 --- /dev/null +++ b/src/components/Icon/src/SvgIcon.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/components/IntegrateProcess/index.ts b/src/components/IntegrateProcess/index.ts new file mode 100644 index 0000000..6b38bca --- /dev/null +++ b/src/components/IntegrateProcess/index.ts @@ -0,0 +1,5 @@ +import './style/index.less'; +import './style/propPanel.less'; +import IntegrateProcess from './src/index.vue'; + +export { IntegrateProcess }; diff --git a/src/components/IntegrateProcess/src/Main.vue b/src/components/IntegrateProcess/src/Main.vue new file mode 100644 index 0000000..e0cacf4 --- /dev/null +++ b/src/components/IntegrateProcess/src/Main.vue @@ -0,0 +1,105 @@ + + diff --git a/src/components/IntegrateProcess/src/flowCard/index.vue b/src/components/IntegrateProcess/src/flowCard/index.vue new file mode 100644 index 0000000..9f6cc41 --- /dev/null +++ b/src/components/IntegrateProcess/src/flowCard/index.vue @@ -0,0 +1,244 @@ + diff --git a/src/components/IntegrateProcess/src/helper/config.ts b/src/components/IntegrateProcess/src/helper/config.ts new file mode 100644 index 0000000..bbf2701 --- /dev/null +++ b/src/components/IntegrateProcess/src/helper/config.ts @@ -0,0 +1,149 @@ +const defaultStartForm = { + title: '触发动作设置', // 标题 + formType: 1, // 表单类型 1-在线开发普通表单 2-在线开发流程表单 3-数据接口 + formId: '', // 触发表单/接口id + formName: '', // 触发表单/接口名称 + formFieldList: [], // 表单/接口字段 + interfaceTemplateJson: [], // 接口参数 + triggerEvent: 1, // 触发事件 1-新增 2-修改 3-删除 + ruleList: [], // 触发条件规则 + ruleMatchLogic: 'and', // 触发条件规则匹配逻辑 + msgUserType: [1], // 通知人类型 + msgUserIds: [], // 通知人 + // 执行失败通知 + failMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 开始执行通知 + startMsgConfig: { + on: 3, + msgId: '', + msgName: '', + templateJson: [], + }, + // 定时触发 + startTime: null, // 触发开始时间 + cron: '', // cron表达式 + endTimeType: 1, // 触发结束时间类型 + endLimit: 1, // 触发次数 + endTime: null, // 触发指定事件 + webhookUrl: '', // webhookUrl + webhookGetFieldsUrl: '', // webhook获取接口字段Url + webhookRandomStr: '', // webhook获取接口字段识别码 +}; +export default { + defaultStartForm, + // 开始节点 + start: { + type: 'start', + content: '请设置触发事件', + properties: defaultStartForm, + }, + // 获取数据节点 + getData: { + type: 'getData', + content: '请设置想要获取的数据', + properties: { + title: '获取数据', + formType: 1, // 表单类型 1-在线开发普通表单 2-在线开发流程表单 3-数据接口 + formId: '', // 触发表单/接口id + formName: '', // 触发表单/接口名称 + formFieldList: [], // 表单/接口字段 + interfaceTemplateJson: [], // 接口参数 + ruleList: [], // 获取条件规则 + ruleMatchLogic: 'and', // 获取条件规则匹配逻辑 + }, + }, + // 新增数据节点 + addData: { + type: 'addData', + content: '请设置新增数据', + properties: { + title: '新增数据', + enableFlow: 0, + flowId: '', // 流程id + formId: '', // 表单id + formName: '', // 表单名称 + formFieldList: [], // 表单字段 + transferList: [], // 字段设置 + ruleList: [], // 新增条件规则/唯一性验证 + ruleMatchLogic: 'and', // 新增条件规则/唯一性验证匹配逻辑 + addRule: 0, // 数据存在时 0-不新增数据 1-不新增数据 + }, + }, + // 更新数据节点 + updateData: { + type: 'updateData', + content: '请设置更新数据', + properties: { + title: '更新数据', + enableFlow: 0, + flowId: '', // 流程id + formId: '', // 表单id + formName: '', // 表单名称 + formFieldList: [], // 表单字段 + transferList: [], // 更新字段 + ruleList: [], // 更新条件规则/唯一性验证 + ruleMatchLogic: 'and', // 更新条件规则/唯一性验证匹配逻辑 + unFoundRule: 0, // 未找到数据时 0-不更新 1-新增 + }, + }, + // 删除数据节点 + deleteData: { + type: 'deleteData', + content: '请设置删除数据', + properties: { + title: '删除数据', + formId: '', // 表单id + formName: '', // 表单名称 + formFieldList: [], // 表单字段 + ruleList: [], // 删除条件规则/唯一性验证 + ruleMatchLogic: 'and', // 删除条件规则/唯一性验证匹配逻辑 + deleteRule: 0, // 数据存在时 0-删除未找到的数据 1-删除未找到的数据 + }, + }, + // 数据接口节点 + dataInterface: { + type: 'dataInterface', + content: '请设置数据接口', + properties: { + title: '数据接口', + formId: '', // 接口id + formName: '', // 接口名称 + templateJson: [], // 接口参数 + }, + }, + // 消息通知节点 + message: { + type: 'message', + content: '请设置消息通知', + properties: { + title: '消息通知', + msgUserIds: [], // 通知人 + msgId: '', + msgName: '', + templateJson: [], + }, + }, + // 发起审批节点 + launchFlow: { + type: 'launchFlow', + content: '请设置发起审批', + properties: { + title: '发起审批', + flowId: '', // 流程id + flowName: '', // 流程名称 + formFieldList: [], // 表单字段 + transferList: [], // 字段设置 + initiator: [], + }, + }, + empty: { + type: 'empty', + content: '', + properties: {}, + }, +}; diff --git a/src/components/IntegrateProcess/src/helper/define.ts b/src/components/IntegrateProcess/src/helper/define.ts new file mode 100644 index 0000000..ea72a07 --- /dev/null +++ b/src/components/IntegrateProcess/src/helper/define.ts @@ -0,0 +1,37 @@ +const sourceTypeOptions = [ + { id: 1, fullName: '字段' }, + { id: 2, fullName: '自定义' }, +]; +const interfaceSourceTypeOptions = [...sourceTypeOptions, { id: 3, fullName: '为空' }]; +const triggerRuleTypeOptions = [ + { id: 0, fullName: '无条件' }, + { id: 1, fullName: '按条件' }, +]; +const msgUserOptions = [ + { id: 1, fullName: '创建人' }, + { id: 2, fullName: '超级管理员' }, + { id: 3, fullName: '自定义' }, +]; +const noticeOptions = [ + { id: 3, fullName: '默认' }, + { id: 1, fullName: '自定义' }, + { id: 0, fullName: '关闭' }, +]; +const logicOptions = [ + { id: 'and', fullName: '且' }, + { id: 'or', fullName: '或' }, +]; +const symbolOptions = [ + { id: '>=', fullName: '大于等于' }, + { id: '>', fullName: '大于' }, + { id: '==', fullName: '等于' }, + { id: '<=', fullName: '小于等于' }, + { id: '<', fullName: '小于' }, + { id: '<>', fullName: '不等于' }, + { id: 'like', fullName: '包含' }, + { id: 'notLike', fullName: '不包含' }, + { id: 'null', fullName: '为空' }, + { id: 'notNull', fullName: '不为空' }, +]; +const notSupportList = ['relationFormAttr', 'popupAttr', 'uploadFile', 'uploadImg', 'colorPicker', 'editor', 'link', 'button', 'text', 'alert', 'table']; +export { sourceTypeOptions, interfaceSourceTypeOptions, triggerRuleTypeOptions, msgUserOptions, noticeOptions, logicOptions, symbolOptions, notSupportList }; diff --git a/src/components/IntegrateProcess/src/helper/util.ts b/src/components/IntegrateProcess/src/helper/util.ts new file mode 100644 index 0000000..0d9ea9a --- /dev/null +++ b/src/components/IntegrateProcess/src/helper/util.ts @@ -0,0 +1,468 @@ +import nodeConfig from './config.js'; +import { buildBitUUID } from '@/utils/uuid.js'; + +// const isEmpty = data => data === null || data === undefined || data === ''; +const isEmptyArray = data => (Array.isArray(data) ? data.length === 0 : true); + +export class NodeUtils { + /** + * 判断节点类型 + * @param {Node} node - 节点数据 + * @returns Boolean + */ + static isConditionNode(node) { + return node && node.type === 'condition'; + } + static isInterflowNode(node) { + return node && node.type === 'approver' && node.isInterflow; + } + static isBranchFlowNode(node) { + return node && node.type === 'approver' && node.isBranchFlow; + } + static isStartNode(node) { + return node && node.type === 'start'; + } + static isGetDataNode(node) { + return node && node.type === 'getData'; + } + static isAddDataNode(node) { + return node && node.type === 'addData'; + } + static isUpdateDataNode(node) { + return node && node.type === 'updateData'; + } + static isDeleteDataNode(node) { + return node && node.type === 'deleteData'; + } + static isDataInterfaceNode(node) { + return node && node.type === 'dataInterface'; + } + static isMessageNode(node) { + return node && node.type === 'message'; + } + static isLaunchFlowNode(node) { + return node && node.type === 'launchFlow'; + } + /** + * 创建指定节点 + * @param { String } type - 节点类型 + * @param { Object } previousNodeId - 父节点id + * @returns { Object } 节点数据 + */ + static createNode(type, previousNodeId?) { + let res = JSON.parse(JSON.stringify(nodeConfig[type])); + res.nodeId = buildBitUUID(); + // if (type !== 'start' && type !== 'timer') res.properties.title += res.nodeId; + res.prevId = previousNodeId; + return res; + } + /** + * 获取指定节点的父节点(前一个节点) + * @param { String } prevId - 父节点id + * @param { Object } processData - 流程图全部数据 + * @returns { Object } 父节点 + */ + static getPreviousNode(prevId, processData) { + if (processData.nodeId === prevId) return processData; + if (processData.childNode) { + let r1 = this.getPreviousNode(prevId, processData.childNode); + if (r1) { + return r1; + } + } + if (processData.conditionNodes) { + for (let c of processData.conditionNodes) { + let r2 = this.getPreviousNode(prevId, c); + if (r2) { + return r2; + } + } + } + } + + /** + * 删除节点 + * @param { Object } nodeData - 被删除节点的数据 + * @param { Object } processData - 流程图的所有节点数据 + */ + static deleteNode(nodeData, processData, checkEmpty = true) { + let prevNode = this.getPreviousNode(nodeData.prevId, processData); + if (checkEmpty && prevNode.type === 'empty') { + if (this.isConditionNode(nodeData) || this.isInterflowNode(nodeData) || this.isBranchFlowNode(nodeData)) { + const willDelBranch = prevNode.conditionNodes.length === 2; + const target = willDelBranch ? prevNode : nodeData; + this.deleteNode(target, processData, willDelBranch); + } else { + if (isEmptyArray(prevNode.conditionNodes)) { + this.deleteNode(prevNode, processData); + } + this.deleteNode(nodeData, processData, false); + } + // this.deleteNode( prevNode, processData ) + // !this.isConditionNode(nodeData) && this.deleteNode(nodeData, processData) + return; + } + let concatChild = (prev, delNode) => { + prev.childNode = delNode.childNode; + isEmptyArray(prev.conditionNodes) && (prev.conditionNodes = delNode.conditionNodes); + prev.childNode && (prev.childNode.prevId = prev.nodeId); + prev.conditionNodes && prev.conditionNodes.forEach(c => (c.prevId = prev.nodeId)); + }; + if (this.isConditionNode(nodeData) || this.isInterflowNode(nodeData) || this.isBranchFlowNode(nodeData)) { + let cons = prevNode.conditionNodes; + let index = cons.findIndex(c => c.nodeId === nodeData.nodeId); + if (cons.length > 2) { + cons.splice(index, 1); + } else { + let anotherCon = cons[+!index]; + delete prevNode.conditionNodes; + delete prevNode.conditionType; + if (prevNode.childNode) { + let endNode = anotherCon; + while (endNode.childNode) { + endNode = endNode.childNode; + } + endNode.childNode = prevNode.childNode; + endNode.childNode.prevId = endNode.nodeId; + } + concatChild(prevNode, anotherCon); + if (prevNode.childNode && prevNode.childNode.type === 'empty') { + this.deleteNode(prevNode.childNode, prevNode); + } + } + // 重新编排优先级 + cons.forEach((c, i) => (c.properties.priority = i)); + return; + } + concatChild(prevNode, nodeData); + } + // TODO: + // static copyNode ( nodeData, processData ) { + // let prevNode = this.getPreviousNode( nodeData.prevId, processData ) + // let index = prevNode.conditionNodes.findIndex( c => c.nodeId === nodeData.nodeId ) + + // } + /** + * 添加审计节点(普通节点 approver) + * @param { Object } data - 目标节点数据,在该数据节点之后添加审计节点 + * @param { Object } isBranchAction - 目标节点数据,是否是条件分支 + * @param { Object } newChildNode - 传入的新的节点 用户操作均为空 删除操作/添加抄送人 会传入该参数 以模拟添加节点 + */ + static addApprovalNode(data, isBranchAction, newChildNode: any = undefined) { + let oldChildNode = data.childNode; + newChildNode = newChildNode || this.createNode('addData', data.nodeId); + data.childNode = newChildNode; + if (oldChildNode) { + newChildNode.childNode = oldChildNode; + oldChildNode.prevId = newChildNode.nodeId; + } + let conditionNodes = data.conditionNodes; + if (Array.isArray(conditionNodes) && !isBranchAction && conditionNodes.length) { + newChildNode.conditionNodes = conditionNodes.map(c => { + c.prevId = newChildNode.nodeId; + return c; + }); + delete data.conditionNodes; + } + if (oldChildNode && oldChildNode.type === 'empty' && newChildNode.type !== 'empty' && oldChildNode.conditionNodes.length === 0) { + this.deleteNode(oldChildNode, data); + } + } + /** + * 添加空节点 + * @param { Object } data - 空节点的父级节点 + * @return { Object } emptyNode - 空节点数据 + */ + static addEmptyNode(data, _isNew) { + let emptyNode = this.createNode('empty', data.nodeId); + this.addApprovalNode(data, true, emptyNode); + return emptyNode; + } + + static addAddDataNode(data, isBranchAction) { + this.addApprovalNode(data, isBranchAction, this.createNode('addData', data.nodeId)); + } + static addUpdateDataNode(data, isBranchAction) { + this.addApprovalNode(data, isBranchAction, this.createNode('updateData', data.nodeId)); + } + static addDeleteDataNode(data, isBranchAction) { + this.addApprovalNode(data, isBranchAction, this.createNode('deleteData', data.nodeId)); + } + static addDataInterfaceNode(data, isBranchAction) { + this.addApprovalNode(data, isBranchAction, this.createNode('dataInterface', data.nodeId)); + } + static addMessageNode(data, isBranchAction) { + this.addApprovalNode(data, isBranchAction, this.createNode('message', data.nodeId)); + } + static addLaunchFlowNode(data, isBranchAction) { + this.addApprovalNode(data, isBranchAction, this.createNode('launchFlow', data.nodeId)); + } + /** + * 添加条件节点 condition 通过点击添加条件进入该操作 + * @param { Object } data - 目标节点所在分支数据,在该分支最后添加条件节点 + */ + static appendConditionNode(data) { + const conditions = data.conditionNodes; + let node = this.createNode('condition', data.nodeId); + let defaultNodeIndex = conditions.findIndex(node => node.properties.isDefault); + node.properties.priority = conditions.length; + if (defaultNodeIndex > -1) { + conditions.splice(-1, 0, node); // 插在倒数第二个 + //更新优先级 + node.properties.priority = conditions.length - 2; + conditions[conditions.length - 1].properties.priority = conditions.length - 1; + } else { + conditions.push(node); + } + this.setDefaultCondition(node, data); + } + // 添加分流/合流 branch + static appendInterflowNode(data) { + const conditions = data.conditionNodes; + let node = this.createNode('interflow', data.nodeId); + let defaultNodeIndex = conditions.findIndex(node => node.properties.isDefault); + node.properties.priority = conditions.length; + if (defaultNodeIndex > -1) { + conditions.splice(-1, 0, node); // 插在倒数第二个 + //更新优先级 + node.properties.priority = conditions.length - 2; + conditions[conditions.length - 1].properties.priority = conditions.length - 1; + } else { + conditions.push(node); + } + } + // 添加选择分支 branch + static appendBranchFlowNode(data) { + const conditions = data.conditionNodes; + let node = this.createNode('branchFlow', data.nodeId); + let defaultNodeIndex = conditions.findIndex(node => node.properties.isDefault); + node.properties.priority = conditions.length; + if (defaultNodeIndex > -1) { + conditions.splice(-1, 0, node); // 插在倒数第二个 + //更新优先级 + node.properties.priority = conditions.length - 2; + conditions[conditions.length - 1].properties.priority = conditions.length - 1; + } else { + conditions.push(node); + } + } + /** + * 添加条件分支 branch + * @param { Object } data - 目标节点所在节点数据,在该节点最后添加分支节点 + */ + static appendBranch(data, isBottomBtnOfBranch) { + // isBottomBtnOfBranch 用户点击的是分支树下面的按钮 + let nodeData = data; + // 由于conditionNodes是数组 不能添加下级分支 故在两个分支树之间添加一个不会显示的正常节点 兼容此种情况 + if (Array.isArray(data.conditionNodes) && data.conditionNodes.length) { + if (isBottomBtnOfBranch) { + // 添加一个模拟用的空白节点并返回这个节点,作为新分支的父节点 + nodeData = this.addEmptyNode(nodeData, true); + } else { + let emptyNode = this.addEmptyNode(nodeData, true); + emptyNode.conditionNodes = nodeData.conditionNodes; + emptyNode.conditionType = 'condition'; + emptyNode.conditionNodes.forEach(n => { + n.prevId = emptyNode.nodeId; + }); + } + } + let conditionNodes = [this.createNode('condition', nodeData.nodeId), this.createNode('condition', nodeData.nodeId)].map((c, i) => { + c.properties.priority = i; + return c; + }); + nodeData.conditionNodes = conditionNodes; + nodeData.conditionType = 'condition'; + } + static appendInterflowBranch(data, isBottomBtnOfBranch) { + // isBottomBtnOfBranch 用户点击的是分支树下面的按钮 + let nodeData = data; + // 由于conditionNodes是数组 不能添加下级分支 故在两个分支树之间添加一个不会显示的正常节点 兼容此种情况 + if (Array.isArray(data.conditionNodes) && data.conditionNodes.length) { + if (isBottomBtnOfBranch) { + // 添加一个模拟用的空白节点并返回这个节点,作为新分支的父节点 + nodeData = this.addEmptyNode(nodeData, true); + } else { + let emptyNode = this.addEmptyNode(nodeData, true); + emptyNode.conditionNodes = nodeData.conditionNodes; + emptyNode.conditionType = 'interflow'; + emptyNode.conditionNodes.forEach(n => { + n.prevId = emptyNode.nodeId; + }); + } + } + let conditionNodes = [this.createNode('interflow', nodeData.nodeId), this.createNode('interflow', nodeData.nodeId)]; + nodeData.conditionNodes = conditionNodes; + nodeData.conditionType = 'interflow'; + } + // 新增选择分支节点 + static appendBranchFlowBranch(data, isBottomBtnOfBranch) { + // isBottomBtnOfBranch 用户点击的是分支树下面的按钮 + let nodeData = data; + // 由于conditionNodes是数组 不能添加下级分支 故在两个分支树之间添加一个不会显示的正常节点 兼容此种情况 + if (Array.isArray(data.conditionNodes) && data.conditionNodes.length) { + if (isBottomBtnOfBranch) { + // 添加一个模拟用的空白节点并返回这个节点,作为新分支的父节点 + nodeData = this.addEmptyNode(nodeData, true); + } else { + let emptyNode = this.addEmptyNode(nodeData, true); + emptyNode.conditionNodes = nodeData.conditionNodes; + emptyNode.conditionType = 'branchFlow'; + emptyNode.conditionNodes.forEach(n => { + n.prevId = emptyNode.nodeId; + }); + } + } + let conditionNodes = [this.createNode('branchFlow', nodeData.nodeId), this.createNode('branchFlow', nodeData.nodeId)]; + nodeData.conditionNodes = conditionNodes; + nodeData.conditionType = 'branchFlow'; + } + /** + * 重设节点优先级(条件节点) + * @param {Node} cNode - 当前节点 + * @param {Number} oldPriority - 替换前的优先级(在数组中的顺序) + * @param {Node} processData - 整个流程图节点数据 + */ + static resortPriorityByCNode(cNode, oldPriority, processData) { + // 当前节点为默认节点 取消修改优先级 + if (cNode.properties.isDefault) { + cNode.properties.priority = oldPriority; + return; + } + let prevNode = this.getPreviousNode(cNode.prevId, processData); + let newPriority = cNode.properties.priority; + // 替换节点为默认节点 取消修改优先级 + if (prevNode.conditionNodes[newPriority].properties.isDefault) { + cNode.properties.priority = oldPriority; + return; + } + let delNode = prevNode.conditionNodes.splice(newPriority, 1, cNode)[0]; + delNode.properties.priority = oldPriority; + prevNode.conditionNodes[oldPriority] = delNode; + } + + /** + * 提升条件节点优先级——排序在前 + * @param { Object } data - 目标节点数据 + * @param { Object } processData - 流程图的所有节点数据 + */ + static increasePriority(data, processData) { + if (data.properties.isDefault) { + // 默认节点不能修改优先级 + return; + } + // 分支节点数据 包含该分支所有的条件节点 + let prevNode = this.getPreviousNode(data.prevId, processData); + let branchData = prevNode.conditionNodes; + let index = branchData.findIndex(c => c === data); + if (index) { + // 和前一个数组项交换位置 Array.prototype.splice会返回包含被删除的项的集合(数组) + branchData[index - 1].properties.priority = index; + branchData[index].properties.priority = index - 1; + branchData[index - 1] = branchData.splice(index, 1, branchData[index - 1])[0]; + } + } + /** + * 降低条件节点优先级——排序在后 + * @param { Object } data - 目标节点数据 + * @param { Object } processData - 流程图的所有节点数据 + */ + static decreasePriority(data, processData) { + // 分支节点数据 包含该分支所有的条件节点 + let prevNode = this.getPreviousNode(data.prevId, processData); + let branchData = prevNode.conditionNodes; + let index = branchData.findIndex(c => c.nodeId === data.nodeId); + if (index < branchData.length - 1) { + let lastNode = branchData[index + 1]; + if (lastNode.properties.isDefault) { + // 默认节点不能修改优先级 + return; + } + // 和后一个数组项交换位置 Array.prototype.splice会返回包含被删除的项的集合(数组) + lastNode.properties.priority = index; + branchData[index].properties.priority = index + 1; + branchData[index + 1] = branchData.splice(index, 1, branchData[index + 1])[0]; + } + } + /** + * 当有其他条件节点设置条件后 检查并设置最后一个节点为默认节点 + * @param {Node} cNode - 当前节点 + * @param {Node} processData - 整个流程图节点数据或父级节点数据 + */ + static setDefaultCondition(cNode, processData) { + const DEFAULT_TEXT = '其他情况进入此流程'; + const conditions = this.getPreviousNode(cNode.prevId, processData).conditionNodes; + const hasCondition = node => node.properties && (node.properties.initiator || !isEmptyArray(node.properties.conditions)); + const clearDefault = node => { + node.properties.isDefault = false; + node.content === DEFAULT_TEXT && (node.content = '请设置条件'); + }; + const setDefault = node => { + node.properties.isDefault = true; + node.content = DEFAULT_TEXT; + }; + let count = 0; + conditions.slice(0, -1).forEach(node => { + hasCondition(node) && count++; + clearDefault(node); + }); + const lastNode = conditions[conditions.length - 1]; + count > 0 && !hasCondition(lastNode) ? setDefault(lastNode) : clearDefault(lastNode); + } + /** + * 校验单个节点必填项完整性 + * @param {Node} node - 节点数据 + */ + static checkNode(node, _parent?) { + let valid = true; + const props = node.properties; + this.isStartNode(node) && + ((props.integrateType == 1 && !props.formId) || + (props.integrateType == 2 && (!props.cron || !props.startTime)) || + (props.integrateType == 3 && !props.formFieldList.length)) && + (valid = false); + this.isGetDataNode(node) && !props.formId && (valid = false); + this.isAddDataNode(node) && !props.formId && (valid = false); + this.isUpdateDataNode(node) && !props.formId && (valid = false); + this.isDeleteDataNode(node) && !props.formId && (valid = false); + this.isDataInterfaceNode(node) && !props.formId && (valid = false); + this.isLaunchFlowNode(node) && !props.flowId && (valid = false); + this.isMessageNode(node) && (!props.msgId || !props.msgUserIds.length) && (valid = false); + return valid; + } + /** + * 判断所有节点是否信息完整 + * @param {Node} processData - 整个流程图数据 + * @returns {Boolean} + */ + static checkAllNode(processData) { + let valid = true; + const loop = (node, callback, parent?) => { + !this.checkNode(node, parent) && callback(); + if (node.childNode) loop(node.childNode, callback, parent); + if (!isEmptyArray(node.conditionNodes)) { + node.conditionNodes.forEach(n => loop(n, callback, node)); + } + }; + loop(processData, () => (valid = false)); + return valid; + } +} + +/** + * 添模拟数据 + */ +export function getMockData(type = 1) { + let startNode = NodeUtils.createNode('start'); + startNode.properties.integrateType = type; + if (type == 2) { + startNode.content = '请设置定时触发器'; + startNode.properties.title = '定时触发设置'; + startNode.childNode = NodeUtils.createNode('getData', startNode.nodeId); + } + if (type == 3) { + startNode.content = '请设置触发方式'; + startNode.properties.title = 'webhook触发设置'; + } + return startNode; +} diff --git a/src/components/IntegrateProcess/src/index.vue b/src/components/IntegrateProcess/src/index.vue new file mode 100644 index 0000000..cf221ae --- /dev/null +++ b/src/components/IntegrateProcess/src/index.vue @@ -0,0 +1,104 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/AddDataNode.vue b/src/components/IntegrateProcess/src/propPanel/AddDataNode.vue new file mode 100644 index 0000000..72f7670 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/AddDataNode.vue @@ -0,0 +1,195 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/DataInterfaceNode.vue b/src/components/IntegrateProcess/src/propPanel/DataInterfaceNode.vue new file mode 100644 index 0000000..66bde41 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/DataInterfaceNode.vue @@ -0,0 +1,47 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/DeleteDataNode.vue b/src/components/IntegrateProcess/src/propPanel/DeleteDataNode.vue new file mode 100644 index 0000000..61c55e1 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/DeleteDataNode.vue @@ -0,0 +1,160 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/GetDataNode.vue b/src/components/IntegrateProcess/src/propPanel/GetDataNode.vue new file mode 100644 index 0000000..42a449d --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/GetDataNode.vue @@ -0,0 +1,99 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/LaunchFlowNode.vue b/src/components/IntegrateProcess/src/propPanel/LaunchFlowNode.vue new file mode 100644 index 0000000..896bbd8 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/LaunchFlowNode.vue @@ -0,0 +1,101 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/MessageNode.vue b/src/components/IntegrateProcess/src/propPanel/MessageNode.vue new file mode 100644 index 0000000..391b254 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/MessageNode.vue @@ -0,0 +1,86 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/StartNode.vue b/src/components/IntegrateProcess/src/propPanel/StartNode.vue new file mode 100644 index 0000000..09a0c82 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/StartNode.vue @@ -0,0 +1,245 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/UpdateDataNode.vue b/src/components/IntegrateProcess/src/propPanel/UpdateDataNode.vue new file mode 100644 index 0000000..e1e38eb --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/UpdateDataNode.vue @@ -0,0 +1,220 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/index.vue b/src/components/IntegrateProcess/src/propPanel/index.vue new file mode 100644 index 0000000..db74c3e --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/index.vue @@ -0,0 +1,468 @@ + + diff --git a/src/components/IntegrateProcess/src/propPanel/modal/BatchModal.vue b/src/components/IntegrateProcess/src/propPanel/modal/BatchModal.vue new file mode 100644 index 0000000..53237e0 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/modal/BatchModal.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/IntegrateProcess/src/propPanel/modal/FormListModal.vue b/src/components/IntegrateProcess/src/propPanel/modal/FormListModal.vue new file mode 100644 index 0000000..677efb5 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/modal/FormListModal.vue @@ -0,0 +1,142 @@ + + + diff --git a/src/components/IntegrateProcess/src/propPanel/modal/MenuListModal.vue b/src/components/IntegrateProcess/src/propPanel/modal/MenuListModal.vue new file mode 100644 index 0000000..13a4897 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/modal/MenuListModal.vue @@ -0,0 +1,149 @@ + + + diff --git a/src/components/IntegrateProcess/src/propPanel/modal/WebhookRequestModal.vue b/src/components/IntegrateProcess/src/propPanel/modal/WebhookRequestModal.vue new file mode 100644 index 0000000..c4508b6 --- /dev/null +++ b/src/components/IntegrateProcess/src/propPanel/modal/WebhookRequestModal.vue @@ -0,0 +1,128 @@ + + + diff --git a/src/components/IntegrateProcess/style/index.less b/src/components/IntegrateProcess/style/index.less new file mode 100644 index 0000000..b888e77 --- /dev/null +++ b/src/components/IntegrateProcess/style/index.less @@ -0,0 +1,572 @@ +.yunzhupaas-basic-integrate-process { + .flow-path-card { + &:hover { + .title-text { + border-bottom: unset !important; + } + } + } +} +.formType-radio { + margin-bottom: 10px; + .ant-radio-wrapper { + width: 100%; + line-height: 32px; + margin-right: 0; + } +} +@prefix-cls: ~'@{namespace}-basic-process'; +@line-color: #a9b4cd; + +// Mixin flex 垂直居中布局 +.flex-center() { + display: flex; + flex-wrap: nowrap; + justify-content: center; + align-items: center; +} +.node-class(@color1,@color2) { + &:hover { + box-shadow: 0 0 0 2px @color2, 0 0 5px 2px rgba(0, 0, 0, 0.2); + } + .header { + background: linear-gradient(90deg, @color1 0%, @color2 100%); + } +} + +.@{prefix-cls} { + display: flex; + height: 100%; +} +.process-flow-container { + display: inline-block; + background: @app-main-background; + width: 100%; + height: 100%; + box-sizing: border-box; + text-align: center; + overflow: auto; + position: relative; + padding-top: 1px; + .scale-slider { + position: fixed; + right: 20px; + z-index: 199; + display: flex; + align-items: center; + background: rgba(255, 255, 255, 0.4); + height: 32px; + line-height: 32px; + border-radius: 16px; + overflow: hidden; + .num { + display: inline-block; + width: 60px; + text-align: center; + font-size: 14px; + } + .btn { + height: 32px; + display: inline-block; + text-align: center; + width: 44px; + background: @component-background; + cursor: pointer; + } + } + .tips { + position: absolute; + left: 20px; + top: 0px; + z-index: 199; + text-align: left; + .tips-item { + line-height: 20px; + font-size: 16px; + display: inline-block; + margin-right: 15px; + .icon { + font-size: 20px; + margin-right: 5px; + color: #b6b6b6; + &.success { + color: @success-color; + } + &.current { + color: #1890ff; + } + } + } + } + .node-wrap-box { + position: relative; + .flex-center(); + flex-direction: column; + &.empty { + overflow: hidden; + } + &.approver::before { + content: ''; + position: absolute; + top: -10px; + left: 50%; + transform: translateX(-50%); + width: 0; + height: 4px; + border-style: solid; + border-width: 8px 6px 4px; + border-color: @line-color transparent transparent; + background: @app-main-background; + } + &.approver.branchFlow::before, + &.approver.interflow::before { + top: 20px; + } + &.error { + &.condition .error-tip, + &.branchFlow .error-tip, + &.interflow .error-tip { + right: 0; + } + .error-tip { + right: -40px; + } + .flow-path-card { + border: 1px solid @error-color; + &:hover { + border-width: 0; + } + } + } + .error-tip { + position: absolute; + right: 1px; + top: 15%; + width: 30px; + height: 30px; + color: @error-color; + cursor: pointer; + border-radius: 50%; + border: 1px solid; + line-height: 30px; + transition: right 0.5s; + } + &.condition .error-tip, + &.branchFlow .error-tip, + &.interflow .error-tip { + right: 60px; + } + } + .end-node { + font-size: 12px; + width: 58px; + height: 32px; + border-radius: 50; + background-color: #e6f4ff; + border-radius: 16px; + line-height: 32px; + color: #000; + } + .flow-path-card { + width: 220px; + min-height: 86px; + font-size: 12px; + border-radius: 4px; + text-align: left; + cursor: pointer; + overflow: hidden; + position: relative; + box-sizing: border-box; + box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.1); + background: #ffffff; + border-radius: 8px; + font-size: 12px; + color: #666666; + &:hover { + box-shadow: 0 0 0 2px #1890ff, 0 0 5px 4px rgba(0, 0, 0, 0.2); + } + &.start-node { + .node-class(#c0f8e2,#a8f0d4); + } + &.launchFlow-node { + .node-class(#C0EDF8,#B4DEF2); + } + &.updateData-node { + .node-class(#CDFAF3,#55e2cc); + } + &.deleteData-node { + .node-class(#FFCDC1,#FF8E92); + } + &.dataInterface-node { + .node-class(#D0DCFF,#90a5ff); + } + &.addData-node { + .node-class(#D6FABF,#68c62c); + } + &.message-node { + .node-class(#FFDFC1,#FFC78E); + } + &.getData-node { + .node-class(#C1C8FF,#A481F2); + } + .header { + padding-left: 10px; + padding-right: 30px; + width: 100%; + height: 32px; + line-height: 32px; + position: relative; + box-sizing: border-box; + color: #000; + .title-box { + position: relative; + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + height: 30px; + } + .title-input { + position: absolute; + left: 0; + border: none; + background: inherit; + color: inherit; + opacity: 0; + margin-top: 7px; + transition: none; + &:focus { + border-radius: 2px; + font-size: 12px; + padding-left: 4px; + width: 97%; + height: 18px; + box-sizing: border-box; + box-shadow: unset; + background-color: @app-main-background; + color: @text-color-base; + opacity: 1; + } + } + > .actions { + position: absolute; + right: 0; + top: 0; + visibility: hidden; + height: 30px; + } + > .async-state { + position: absolute; + right: 20px; + top: 4px; + } + } + &.timer:hover { + .actions { + visibility: visible; + margin-right: 4px; + } + } + &.subFlow { + .header { + .title-box { + width: 140px !important; + } + } + } + &:not(.start-node):not(.timer):hover { + .actions { + visibility: visible; + margin-right: 4px; + } + .title-text { + border-bottom: 1px dashed currentColor; + } + } + &.start-node:hover { + .title-text { + border-bottom: 1px dashed currentColor; + } + } + .body { + position: relative; + padding: 10px; + box-sizing: border-box; + .text { + word-break: break-all; + margin: 0; + overflow: auto; + display: inline-block; + max-height: 150px; + } + } + .icon-wrapper { + position: absolute; + top: 0; + height: 100%; + width: 14px; + box-sizing: border-box; + &.left { + left: 0; + } + &.right { + right: 0; + } + > .right-arrow, + > .left-arrow { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + } + } + .flow-path-card.condition { + .header { + line-height: 30px; + color: inherit; + border-bottom: 1px solid @border-color-base1; + .title-box { + height: auto !important; + } + .title-text { + color: #15bc83; + } + } + .body { + padding: 10px; + color: #606266; + } + .icon-wrapper { + &:hover { + background-color: #f1f1f1; + } + } + .right-arrow, + .left-arrow { + visibility: hidden; + } + &:hover { + .right-arrow, + .left-arrow { + visibility: visible; + } + .priority { + display: none; + } + } + } + .col-box:first-of-type > .node-wrap .left { + display: none; + } + .col-box:last-of-type > .node-wrap .right { + display: none; + } + .add-node-btn-box { + width: 220px; + height: 100px; + position: relative; + padding-top: 30px; + margin: auto; + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; + margin: auto; + width: 1px; + height: 100%; + background-color: @line-color; + } + .add-node-btn { + display: flex; + justify-content: center; + .btn { + width: 28px; + height: 28px; + line-height: 26px; + border-radius: 16px; + cursor: pointer; + outline: none; + background: @component-background; + border-color: transparent; + transition: transform 0.5s; + border: 1px solid rgba(24, 131, 255, 0.302); + &:hover { + transform: scale(1.2); + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.1); + } + &.disabled-btn { + cursor: auto; + background-color: @error-color; + &:hover { + transform: none; + box-shadow: none; + } + } + .icon { + color: #1890ff; + font-size: 16px; + } + } + } + } + .branch-wrap { + .branch-box-wrap { + display: inline-flex; + flex-direction: column; + align-items: center; + } + .branch-box { + align-items: stretch; + border-bottom: 1px solid @line-color; + border-top: 1px solid @line-color; + box-sizing: border-box; + background: @app-main-background; + > .col-box { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + &:first-of-type { + &::before, + &::after { + content: ''; + position: absolute; + left: 0; + height: 3px; + width: calc(50% - 1px); + background: @app-main-background; + } + &::before { + top: -2px; + } + &::after { + bottom: -2px; + } + } + &:last-of-type { + &::before, + &::after { + content: ''; + position: absolute; + right: 0; + height: 3px; + width: calc(50% - 1px); + background: @app-main-background; + } + &::before { + top: -2px; + } + &::after { + bottom: -2px; + } + } + .center-line { + height: 100%; + width: 1px; + background: @line-color; + position: absolute; + } + } + > .btn { + font-size: 14px; + z-index: 99; + cursor: pointer; + position: absolute; + top: 0; + left: 50%; + outline: none; + transform: translate(-50%, -50%); + padding: 9px 16px; + border: none; + border-radius: 20px; + background: @component-background; + box-shadow: 0 0 10px 0px rgba(0, 0, 0, 0.2); + transition: transform 0.3s; + color: #1890ff; + &:hover { + transform: scale(1.1) translate(-46%, -50%); + } + } + } + } +} +.add-popover-main { + &.add-condition-popover-main { + .condition-box { + width: 180px; + } + } + .condition-box { + display: flex; + justify-content: space-around; + align-items: center; + text-align: center; + width: 440px; + .condition-item { + width: 73px; + padding: 5px; + .flex-center(); + flex-direction: column; + border-radius: 8px; + cursor: pointer; + &:hover { + background: rgba(1, 119, 255, 0.04); + } + } + .condition-icon { + width: 48px; + height: 48px; + line-height: 48px; + background: #f5f5f5; + border-radius: 30px; + box-sizing: border-box; + font-size: 12px; + margin-bottom: 4px; + &.addData { + color: #439815; + } + &.updateData { + color: #24bec4; + } + &.deleteData { + color: #dd363c; + } + &.dataInterface { + color: #3c5eef; + } + &.message { + color: #3c5eef; + } + &.launchFlow { + color: #1daceb; + } + .icon-ym, + .ym-custom { + font-size: 28px; + } + } + } +} +html[data-theme='dark'] { + .process-flow-container { + .node-wrap-box.approver::before { + border-color: @line-color transparent transparent; + } + .flow-path-card { + box-shadow: 0 0 4px 0 rgb(255 255 255 / 30%); + } + .scale-slider { + background: rgba(0, 0, 0, 0.1) !important; + } + } + .condition-box { + .condition-icon { + background: #151515 !important; + } + } +} diff --git a/src/components/IntegrateProcess/style/propPanel.less b/src/components/IntegrateProcess/style/propPanel.less new file mode 100644 index 0000000..0739fe0 --- /dev/null +++ b/src/components/IntegrateProcess/style/propPanel.less @@ -0,0 +1,145 @@ +.propPanel-drawer { + .config-form { + .ant-form-item { + margin-bottom: 12px; + } + & > .ant-form-item { + &.normal-item-content { + & > .ant-form-item-row > .ant-form-item-control { + padding: 0; + } + } + & > .ant-form-item-row > .ant-form-item-label { + font-weight: 600; + } + & > .ant-form-item-row > .ant-form-item-control { + padding: 0 10px; + } + } + } + .common-pane { + display: flex; + flex-direction: column; + overflow: hidden; + height: 100%; + &.condition-pane { + .config-content { + padding: 10px; + &.condition-content { + padding: 0; + .condition-main { + padding: 10px; + } + } + } + } + .pane-tabs { + flex-shrink: 0; + .ant-tabs-nav { + margin-bottom: 0; + padding-left: 20px; + .ant-tabs-tab + .ant-tabs-tab { + margin-left: 40px; + } + } + } + .config-content { + flex: 1; + padding: 10px 20px; + } + } + .btn-cell { + display: flex; + align-items: center; + margin-bottom: 10px; + .ant-checkbox-wrapper { + width: 80px; + margin-right: 10px; + flex-shrink: 0; + } + &:last-child { + margin-bottom: unset; + } + } + .parameter-box { + display: block; + min-width: 0; + width: 154px; + height: 30px; + line-height: 30px; + margin-bottom: 8px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + &:last-child { + margin-bottom: 0; + } + } + .type-radio { + .ant-radio-wrapper { + width: calc(25% - 8px); + line-height: 32px; + } + } + .counterSign-radio { + .ant-radio-wrapper { + width: 100%; + line-height: 32px; + margin-right: 0; + } + } + .common-radio { + .ant-radio-wrapper { + line-height: 32px; + } + } + .common-tip { + color: @text-color-secondary; + font-size: 14px; + line-height: 1; + } + .ant-input-group.ant-input-group-compact > *:not(:last-child) { + border-right-width: 0; + } + .hand input { + cursor: pointer; + } + .countersign-cell { + display: flex; + align-items: center; + } +} +.ant-modal.rule-modal { + .ant-modal-body > .scrollbar { + padding: 0 !important; + } + .node-tabs { + .ant-tabs-nav { + margin-bottom: 10px; + } + .ant-tabs-nav-wrap { + padding: 0 20px; + } + .ant-tabs-tabpane { + min-height: 300px !important; + max-height: 500px !important; + padding: 0 10px 10px; + overflow: auto; + } + .rule-cell { + line-height: 32px; + &.mid { + text-align: center; + color: @primary-color; + } + } + .icon-ym-nav-close { + font-size: 12px; + } + .common-tip { + color: @text-color-secondary; + font-size: 14px; + line-height: 30px; + } + } +} diff --git a/src/components/Interface/index.ts b/src/components/Interface/index.ts new file mode 100644 index 0000000..7cf8778 --- /dev/null +++ b/src/components/Interface/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '@/utils'; +import selectInterface from './src/SelectInterface.vue'; +import selectInterfaceBtn from './src/SelectInterfaceBtn.vue'; + +export const SelectInterface = withInstall(selectInterface); +export const SelectInterfaceBtn = withInstall(selectInterfaceBtn); diff --git a/src/components/Interface/src/SelectInterface.vue b/src/components/Interface/src/SelectInterface.vue new file mode 100644 index 0000000..2096315 --- /dev/null +++ b/src/components/Interface/src/SelectInterface.vue @@ -0,0 +1,125 @@ + + + diff --git a/src/components/Interface/src/SelectInterfaceBtn.vue b/src/components/Interface/src/SelectInterfaceBtn.vue new file mode 100644 index 0000000..00aac82 --- /dev/null +++ b/src/components/Interface/src/SelectInterfaceBtn.vue @@ -0,0 +1,126 @@ + + + diff --git a/src/components/Loading/index.ts b/src/components/Loading/index.ts new file mode 100644 index 0000000..3673a44 --- /dev/null +++ b/src/components/Loading/index.ts @@ -0,0 +1,5 @@ +import Loading from './src/Loading.vue'; + +export { Loading }; +export { useLoading } from './src/useLoading'; +export { createLoading } from './src/createLoading'; diff --git a/src/components/Loading/src/Loading.vue b/src/components/Loading/src/Loading.vue new file mode 100644 index 0000000..4b29324 --- /dev/null +++ b/src/components/Loading/src/Loading.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/components/Loading/src/createLoading.ts b/src/components/Loading/src/createLoading.ts new file mode 100644 index 0000000..966ca53 --- /dev/null +++ b/src/components/Loading/src/createLoading.ts @@ -0,0 +1,65 @@ +import { VNode, defineComponent } from 'vue'; +import type { LoadingProps } from './typing'; + +import { createVNode, render, reactive, h } from 'vue'; +import Loading from './Loading.vue'; + +export function createLoading(props?: Partial, target?: HTMLElement, wait = false) { + let vm: Nullable = null; + const data = reactive({ + tip: '', + loading: true, + ...props, + }); + + const LoadingWrap = defineComponent({ + render() { + return h(Loading, { ...data }); + }, + }); + + vm = createVNode(LoadingWrap); + + if (wait) { + // TODO fix https://github.com/anncwb/vue-vben-admin/issues/438 + setTimeout(() => { + render(vm, document.createElement('div')); + }, 0); + } else { + render(vm, document.createElement('div')); + } + + function close() { + if (vm?.el && vm.el.parentNode) { + vm.el.parentNode.removeChild(vm.el); + } + } + + function open(target: HTMLElement = document.body) { + if (!vm || !vm.el) { + return; + } + target.appendChild(vm.el as HTMLElement); + } + + if (target) { + open(target); + } + return { + vm, + close, + open, + setTip: (tip: string) => { + data.tip = tip; + }, + setLoading: (loading: boolean) => { + data.loading = loading; + }, + get loading() { + return data.loading; + }, + get $el() { + return vm?.el as HTMLElement; + }, + }; +} diff --git a/src/components/Loading/src/typing.ts b/src/components/Loading/src/typing.ts new file mode 100644 index 0000000..6196452 --- /dev/null +++ b/src/components/Loading/src/typing.ts @@ -0,0 +1,10 @@ +import { SizeEnum } from '@/enums/sizeEnum'; + +export interface LoadingProps { + tip: string; + size: SizeEnum; + absolute: boolean; + loading: boolean; + background: string; + theme: 'dark' | 'light'; +} diff --git a/src/components/Loading/src/useLoading.ts b/src/components/Loading/src/useLoading.ts new file mode 100644 index 0000000..356df7d --- /dev/null +++ b/src/components/Loading/src/useLoading.ts @@ -0,0 +1,49 @@ +import { unref } from 'vue'; +import { createLoading } from './createLoading'; +import type { LoadingProps } from './typing'; +import type { Ref } from 'vue'; + +export interface UseLoadingOptions { + target?: any; + props?: Partial; +} + +interface Fn { + (): void; +} + +export function useLoading(props: Partial): [Fn, Fn, (string) => void]; +export function useLoading(opt: Partial): [Fn, Fn, (string) => void]; + +export function useLoading( + opt: Partial | Partial, +): [Fn, Fn, (string) => void] { + let props: Partial; + let target: HTMLElement | Ref = document.body; + + if (Reflect.has(opt, 'target') || Reflect.has(opt, 'props')) { + const options = opt as Partial; + props = options.props || {}; + target = options.target || document.body; + } else { + props = opt as Partial; + } + + const instance = createLoading(props, undefined, true); + + const open = (): void => { + const t = unref(target as Ref); + if (!t) return; + instance.open(t); + }; + + const close = (): void => { + instance.close(); + }; + + const setTip = (tip: string) => { + instance.setTip(tip); + }; + + return [open, close, setTip]; +} diff --git a/src/components/Markdown/index.ts b/src/components/Markdown/index.ts new file mode 100644 index 0000000..4dd7d18 --- /dev/null +++ b/src/components/Markdown/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '@/utils'; +import markDown from './src/Markdown.vue'; +import markDownViewer from './src/MarkdownViewer.vue'; + +export const MarkDown = withInstall(markDown); +export const MarkdownViewer = withInstall(markDownViewer); +export * from './src/typing'; diff --git a/src/components/Markdown/src/Markdown.vue b/src/components/Markdown/src/Markdown.vue new file mode 100644 index 0000000..db03a20 --- /dev/null +++ b/src/components/Markdown/src/Markdown.vue @@ -0,0 +1,147 @@ + + diff --git a/src/components/Markdown/src/MarkdownViewer.vue b/src/components/Markdown/src/MarkdownViewer.vue new file mode 100644 index 0000000..4321746 --- /dev/null +++ b/src/components/Markdown/src/MarkdownViewer.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/components/Markdown/src/getTheme.ts b/src/components/Markdown/src/getTheme.ts new file mode 100644 index 0000000..fcfe9d3 --- /dev/null +++ b/src/components/Markdown/src/getTheme.ts @@ -0,0 +1,19 @@ +/** + * 获取主题类型 深色浅色模式 对应的值 + * @param darkModeVal 深色模式值 + * @param themeMode 主题类型——外观(默认), 内容, 代码块 + */ +export const getTheme = ( + darkModeVal: 'light' | 'dark' | string, + themeMode: 'default' | 'content' | 'code' = 'default', +) => { + const isDark = darkModeVal === 'dark'; + switch (themeMode) { + case 'default': + return isDark ? 'dark' : 'classic'; + case 'content': + return isDark ? 'dark' : 'light'; + case 'code': + return isDark ? 'dracula' : 'github'; + } +}; diff --git a/src/components/Markdown/src/typing.ts b/src/components/Markdown/src/typing.ts new file mode 100644 index 0000000..b4bb465 --- /dev/null +++ b/src/components/Markdown/src/typing.ts @@ -0,0 +1,4 @@ +import Vditor from 'vditor'; +export interface MarkDownActionType { + getVditor: () => Vditor; +} diff --git a/src/components/Menu/index.ts b/src/components/Menu/index.ts new file mode 100644 index 0000000..4a59225 --- /dev/null +++ b/src/components/Menu/index.ts @@ -0,0 +1,3 @@ +import BasicMenu from './src/BasicMenu.vue'; + +export { BasicMenu }; diff --git a/src/components/Menu/src/BasicMenu.vue b/src/components/Menu/src/BasicMenu.vue new file mode 100644 index 0000000..8ec2931 --- /dev/null +++ b/src/components/Menu/src/BasicMenu.vue @@ -0,0 +1,169 @@ + + + diff --git a/src/components/Menu/src/components/BasicMenuItem.vue b/src/components/Menu/src/components/BasicMenuItem.vue new file mode 100644 index 0000000..2a56562 --- /dev/null +++ b/src/components/Menu/src/components/BasicMenuItem.vue @@ -0,0 +1,20 @@ + + diff --git a/src/components/Menu/src/components/BasicSubMenuItem.vue b/src/components/Menu/src/components/BasicSubMenuItem.vue new file mode 100644 index 0000000..e22f5cd --- /dev/null +++ b/src/components/Menu/src/components/BasicSubMenuItem.vue @@ -0,0 +1,45 @@ + + diff --git a/src/components/Menu/src/components/MenuItemContent.vue b/src/components/Menu/src/components/MenuItemContent.vue new file mode 100644 index 0000000..3aa8dd9 --- /dev/null +++ b/src/components/Menu/src/components/MenuItemContent.vue @@ -0,0 +1,34 @@ + + diff --git a/src/components/Menu/src/index.less b/src/components/Menu/src/index.less new file mode 100644 index 0000000..da80236 --- /dev/null +++ b/src/components/Menu/src/index.less @@ -0,0 +1,79 @@ +@basic-menu-prefix-cls: ~'@{namespace}-basic-menu'; + +.app-top-menu-popup { + min-width: 150px; +} + +.@{basic-menu-prefix-cls} { + width: 100%; + + &.ant-menu-light { + background-color: transparent !important; + } + + .ant-menu-item { + transition: unset; + } + + &__sidebar-hor { + &.ant-menu-horizontal { + display: flex; + align-items: center; + border-bottom: unset; + + &.ant-menu-dark { + background-color: transparent; + + .ant-menu-submenu:hover, + .ant-menu-item-open, + .ant-menu-submenu-open, + .ant-menu-item-selected, + .ant-menu-submenu-selected, + .ant-menu-item:hover, + .ant-menu-item-active, + .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open, + .ant-menu-submenu-active, + .ant-menu-submenu-title:hover { + color: #fff; + background-color: @top-menu-active-bg-color !important; + } + + .ant-menu-item:hover, + .ant-menu-item-active, + .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open, + .ant-menu-submenu-active, + .ant-menu-submenu-title:hover { + background-color: @top-menu-active-bg-color; + } + + .@{basic-menu-prefix-cls}-item__level1 { + background-color: transparent; + + &.ant-menu-item-selected, + &.ant-menu-submenu-selected { + background-color: @top-menu-active-bg-color !important; + } + } + + .ant-menu-item, + .ant-menu-submenu { + &.@{basic-menu-prefix-cls}-item__level1, + .ant-menu-submenu-title { + height: @header-height; + line-height: @header-height; + } + } + } + } + } + + .ant-menu-submenu, + .ant-menu-submenu-inline { + transition: unset; + } + + .ant-menu-inline.ant-menu-sub { + box-shadow: unset !important; + transition: unset; + } +} diff --git a/src/components/Menu/src/props.ts b/src/components/Menu/src/props.ts new file mode 100644 index 0000000..eb5d401 --- /dev/null +++ b/src/components/Menu/src/props.ts @@ -0,0 +1,60 @@ +import type { Menu } from '@/router/types'; +import type { PropType } from 'vue'; + +import { MenuModeEnum, MenuTypeEnum } from '@/enums/menuEnum'; +import { ThemeEnum } from '@/enums/appEnum'; +import { propTypes } from '@/utils/propTypes'; +import type { MenuTheme } from 'ant-design-vue'; +import type { MenuMode } from 'ant-design-vue/lib/menu/src/interface'; +export const basicProps = { + items: { + type: Array as PropType, + default: () => [], + }, + collapsedShowTitle: propTypes.bool, + // 最好是4 倍数 + inlineIndent: propTypes.number.def(20), + // 菜单组件的mode属性 + mode: { + type: String as PropType, + default: MenuModeEnum.INLINE, + }, + + type: { + type: String as PropType, + default: MenuTypeEnum.MIX, + }, + theme: { + type: String as PropType, + default: ThemeEnum.DARK, + }, + inlineCollapsed: propTypes.bool, + mixSider: propTypes.bool, + + isHorizontal: propTypes.bool, + accordion: propTypes.bool.def(true), + beforeClickFn: { + type: Function as PropType<(key: string) => Promise>, + }, +}; + +export const itemProps = { + item: { + type: Object as PropType, + default: () => ({}), + }, + level: propTypes.number, + theme: propTypes.oneOf(['dark', 'light']), + showTitle: propTypes.bool, + isHorizontal: propTypes.bool, +}; + +export const contentProps = { + item: { + type: Object as PropType, + default: null, + }, + showTitle: propTypes.bool.def(true), + level: propTypes.number.def(0), + isHorizontal: propTypes.bool.def(true), +}; diff --git a/src/components/Menu/src/types.ts b/src/components/Menu/src/types.ts new file mode 100644 index 0000000..245441f --- /dev/null +++ b/src/components/Menu/src/types.ts @@ -0,0 +1,25 @@ +// import { ComputedRef } from 'vue'; +// import { ThemeEnum } from '@/enums/appEnum'; +// import { MenuModeEnum } from '@/enums/menuEnum'; +export interface MenuState { + // 默认选中的列表 + defaultSelectedKeys: string[]; + + // 模式 + // mode: MenuModeEnum; + + // // 主题 + // theme: ComputedRef | ThemeEnum; + + // 缩进 + inlineIndent?: number; + + // 展开数组 + openKeys: string[]; + + // 当前选中的菜单项 key 数组 + selectedKeys: string[]; + + // 收缩状态下展开的数组 + collapsedOpenKeys: string[]; +} diff --git a/src/components/Menu/src/useOpenKeys.ts b/src/components/Menu/src/useOpenKeys.ts new file mode 100644 index 0000000..1456ff4 --- /dev/null +++ b/src/components/Menu/src/useOpenKeys.ts @@ -0,0 +1,77 @@ +import { MenuModeEnum } from '@/enums/menuEnum'; +import type { Menu as MenuType } from '@/router/types'; +import type { MenuState } from './types'; + +import { computed, Ref, toRaw } from 'vue'; + +import { unref } from 'vue'; +import { uniq } from 'lodash-es'; +import { useMenuSetting } from '@/hooks/setting/useMenuSetting'; +import { getAllParentPath } from '@/router/helper/menuHelper'; +import { useTimeoutFn } from '@/hooks/core/useTimeout'; + +export function useOpenKeys(menuState: MenuState, menus: Ref, mode: Ref, accordion: Ref) { + const { getCollapsed, getIsMixSidebar } = useMenuSetting(); + + async function setOpenKeys(path: string) { + if (mode.value === MenuModeEnum.HORIZONTAL) { + return; + } + const native = unref(getIsMixSidebar); + useTimeoutFn( + () => { + const menuList = toRaw(menus.value); + if (menuList?.length === 0) { + menuState.openKeys = []; + return; + } + if (!unref(accordion)) { + menuState.openKeys = uniq([...menuState.openKeys, ...getAllParentPath(menuList, path)]); + } else { + menuState.openKeys = getAllParentPath(menuList, path); + } + }, + 16, + !native, + ); + } + + const getOpenKeys = computed(() => { + const collapse = unref(getIsMixSidebar) ? false : unref(getCollapsed); + return collapse ? menuState.collapsedOpenKeys : menuState.openKeys; + }); + + /** + * @description: 重置值 + */ + function resetKeys() { + menuState.selectedKeys = []; + menuState.openKeys = []; + } + + function handleOpenChange(openKeys: string[]) { + if (unref(mode) === MenuModeEnum.HORIZONTAL || !unref(accordion) || unref(getIsMixSidebar)) { + menuState.openKeys = openKeys; + } else { + // const menuList = toRaw(menus.value); + // getAllParentPath(menuList, path); + const rootSubMenuKeys: string[] = []; + for (const { children, path } of unref(menus)) { + if (children && children.length > 0) { + rootSubMenuKeys.push(path); + } + } + if (!unref(getCollapsed)) { + const latestOpenKey = openKeys.find(key => menuState.openKeys.indexOf(key) === -1); + if (rootSubMenuKeys.indexOf(latestOpenKey as string) === -1) { + menuState.openKeys = openKeys; + } else { + menuState.openKeys = latestOpenKey ? [latestOpenKey] : []; + } + } else { + menuState.collapsedOpenKeys = openKeys; + } + } + } + return { setOpenKeys, resetKeys, getOpenKeys, handleOpenChange }; +} diff --git a/src/components/Modal/index.ts b/src/components/Modal/index.ts new file mode 100644 index 0000000..ff3862a --- /dev/null +++ b/src/components/Modal/index.ts @@ -0,0 +1,8 @@ +import { withInstall } from '@/utils'; +import './src/index.less'; +import basicModal from './src/BasicModal.vue'; + +export const BasicModal = withInstall(basicModal); +export { useModalContext } from './src/hooks/useModalContext'; +export { useModal, useModalInner } from './src/hooks/useModal'; +export * from './src/typing'; diff --git a/src/components/Modal/src/BasicModal.vue b/src/components/Modal/src/BasicModal.vue new file mode 100644 index 0000000..d039369 --- /dev/null +++ b/src/components/Modal/src/BasicModal.vue @@ -0,0 +1,232 @@ + + diff --git a/src/components/Modal/src/components/Modal.tsx b/src/components/Modal/src/components/Modal.tsx new file mode 100644 index 0000000..d7e6dfb --- /dev/null +++ b/src/components/Modal/src/components/Modal.tsx @@ -0,0 +1,31 @@ +import { Modal } from 'ant-design-vue'; +import { defineComponent, toRefs, unref } from 'vue'; +import { basicProps } from '../props'; +import { useModalDragMove } from '../hooks/useModalDrag'; +import { useAttrs } from '@/hooks/core/useAttrs'; +import { extendSlots } from '@/utils/helper/tsxHelper'; + +export default defineComponent({ + name: 'Modal', + inheritAttrs: false, + props: basicProps, + emits: ['cancel'], + setup(props, { slots, emit }) { + const { open, draggable, destroyOnClose } = toRefs(props); + const attrs = useAttrs({ excludeDefaultKeys: false }); + useModalDragMove({ + open, + destroyOnClose, + draggable, + }); + + const onCancel = (e: Event) => { + emit('cancel', e); + }; + + return () => { + const propsData = { ...unref(attrs), ...props, onCancel } as Recordable; + return {extendSlots(slots)}; + }; + }, +}); diff --git a/src/components/Modal/src/components/ModalClose.vue b/src/components/Modal/src/components/ModalClose.vue new file mode 100644 index 0000000..b5b910e --- /dev/null +++ b/src/components/Modal/src/components/ModalClose.vue @@ -0,0 +1,106 @@ + + + diff --git a/src/components/Modal/src/components/ModalFooter.vue b/src/components/Modal/src/components/ModalFooter.vue new file mode 100644 index 0000000..6fa81cf --- /dev/null +++ b/src/components/Modal/src/components/ModalFooter.vue @@ -0,0 +1,51 @@ + + diff --git a/src/components/Modal/src/components/ModalHeader.vue b/src/components/Modal/src/components/ModalHeader.vue new file mode 100644 index 0000000..d908388 --- /dev/null +++ b/src/components/Modal/src/components/ModalHeader.vue @@ -0,0 +1,22 @@ + + diff --git a/src/components/Modal/src/components/ModalWrapper.vue b/src/components/Modal/src/components/ModalWrapper.vue new file mode 100644 index 0000000..573adb2 --- /dev/null +++ b/src/components/Modal/src/components/ModalWrapper.vue @@ -0,0 +1,150 @@ + + diff --git a/src/components/Modal/src/hooks/useModal.ts b/src/components/Modal/src/hooks/useModal.ts new file mode 100644 index 0000000..b3ed38f --- /dev/null +++ b/src/components/Modal/src/hooks/useModal.ts @@ -0,0 +1,153 @@ +import type { UseModalReturnType, ModalMethods, ModalProps, ReturnMethods, UseModalInnerReturnType } from '../typing'; +import { ref, onUnmounted, unref, getCurrentInstance, reactive, watchEffect, nextTick, toRaw } from 'vue'; +import { isProdMode } from '@/utils/env'; +import { isFunction } from '@/utils/is'; +import { isEqual } from 'lodash-es'; +import { tryOnUnmounted } from '@vueuse/core'; +import { error } from '@/utils/log'; +import { computed } from 'vue'; + +const dataTransfer = reactive({}); + +const openData = reactive<{ [key: number]: boolean }>({}); + +/** + * @description: Applicable to independent modal and call outside + */ +export function useModal(): UseModalReturnType { + const modal = ref>(null); + const loaded = ref>(false); + const uid = ref(''); + + function register(modalMethod: ModalMethods, uuid: string) { + if (!getCurrentInstance()) { + throw new Error('useModal() can only be used inside setup() or functional components!'); + } + uid.value = uuid; + isProdMode() && + onUnmounted(() => { + modal.value = null; + loaded.value = false; + dataTransfer[unref(uid)] = null; + }); + if (unref(loaded) && isProdMode() && modalMethod === unref(modal)) return; + + modal.value = modalMethod; + loaded.value = true; + modalMethod.emitOpen = (open: boolean, uid: number) => { + openData[uid] = open; + }; + } + + const getInstance = () => { + const instance = unref(modal); + if (!instance) { + error('useModal instance is undefined!'); + } + return instance; + }; + + const methods: ReturnMethods = { + setModalProps: (props: Partial): void => { + getInstance()?.setModalProps(props); + }, + + getOpen: computed((): boolean => { + return openData[~~unref(uid)]; + }), + + redoModalHeight: () => { + getInstance()?.redoModalHeight?.(); + }, + + openModal: (open = true, data?: T, openOnSet = true): void => { + getInstance()?.setModalProps({ + open, + confirmLoading: false, + }); + + if (!data) return; + const id = unref(uid); + if (openOnSet) { + dataTransfer[id] = null; + dataTransfer[id] = toRaw(data); + return; + } + const equal = isEqual(toRaw(dataTransfer[id]), toRaw(data)); + if (!equal) { + dataTransfer[id] = toRaw(data); + } + }, + + closeModal: () => { + getInstance()?.setModalProps({ open: false }); + }, + }; + return [register, methods]; +} + +export const useModalInner = (callbackFn?: Fn): UseModalInnerReturnType => { + const modalInstanceRef = ref>(null); + const currentInstance = getCurrentInstance(); + const uidRef = ref(''); + + const getInstance = () => { + const instance = unref(modalInstanceRef); + if (!instance) { + error('useModalInner instance is undefined!'); + } + return instance; + }; + + const register = (modalInstance: ModalMethods, uuid: string) => { + isProdMode() && + tryOnUnmounted(() => { + modalInstanceRef.value = null; + }); + uidRef.value = uuid; + modalInstanceRef.value = modalInstance; + currentInstance?.emit('register', modalInstance, uuid); + }; + + watchEffect(() => { + const data = dataTransfer[unref(uidRef)]; + if (!data) return; + if (!callbackFn || !isFunction(callbackFn)) return; + nextTick(() => { + callbackFn(data); + }); + }); + + return [ + register, + { + changeLoading: (loading = true) => { + getInstance()?.setModalProps({ loading }); + }, + getOpen: computed((): boolean => { + return openData[~~unref(uidRef)]; + }), + + changeOkLoading: (loading = true) => { + getInstance()?.setModalProps({ confirmLoading: loading }); + }, + + changeContinueLoading: (loading = true) => { + getInstance()?.setModalProps({ continueLoading: loading }); + }, + + closeModal: () => { + getInstance()?.setModalProps({ open: false }); + }, + + setModalProps: (props: Partial) => { + getInstance()?.setModalProps(props); + }, + + redoModalHeight: () => { + const callRedo = getInstance()?.redoModalHeight; + callRedo && callRedo(); + }, + }, + ]; +}; diff --git a/src/components/Modal/src/hooks/useModalContext.ts b/src/components/Modal/src/hooks/useModalContext.ts new file mode 100644 index 0000000..9f3f84b --- /dev/null +++ b/src/components/Modal/src/hooks/useModalContext.ts @@ -0,0 +1,16 @@ +import { InjectionKey } from 'vue'; +import { createContext, useContext } from '@/hooks/core/useContext'; + +export interface ModalContextProps { + redoModalHeight: () => void; +} + +const key: InjectionKey = Symbol(); + +export function createModalContext(context: ModalContextProps) { + return createContext(context, key); +} + +export function useModalContext() { + return useContext(key); +} diff --git a/src/components/Modal/src/hooks/useModalDrag.ts b/src/components/Modal/src/hooks/useModalDrag.ts new file mode 100644 index 0000000..9363fab --- /dev/null +++ b/src/components/Modal/src/hooks/useModalDrag.ts @@ -0,0 +1,110 @@ +import { Ref, unref, watchEffect } from 'vue'; +import { useTimeoutFn } from '@/hooks/core/useTimeout'; + +export interface UseModalDragMoveContext { + draggable: Ref; + destroyOnClose: Ref | undefined; + open: Ref; +} + +export function useModalDragMove(context: UseModalDragMoveContext) { + const getStyle = (dom: any, attr: any) => { + return getComputedStyle(dom)[attr]; + }; + const drag = (wrap: any) => { + if (!wrap) return; + wrap.setAttribute('data-drag', unref(context.draggable)); + const dialogHeaderEl = wrap.querySelector('.ant-modal-header'); + const dragDom = wrap.querySelector('.ant-modal'); + + if (!dialogHeaderEl || !dragDom || !unref(context.draggable)) return; + + dialogHeaderEl.style.cursor = 'move'; + + dialogHeaderEl.onmousedown = (e: any) => { + if (!e) return; + // 鼠标按下,计算当前元素距离可视区的距离 + const disX = e.clientX; + const disY = e.clientY; + const screenWidth = document.body.clientWidth; // body当前宽度 + const screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度,可某些环境下无法获取) + + const dragDomWidth = dragDom.offsetWidth; // 对话框宽度 + const dragDomheight = dragDom.offsetHeight; // 对话框高度 + + const minDragDomLeft = dragDom.offsetLeft; + + const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth; + const minDragDomTop = dragDom.offsetTop; + let maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight; + //弹出页面出现自动吸顶,无法移动和显示头部--- + if (maxDragDomTop < 0) maxDragDomTop = screenHeight - dragDom.offsetTop; + //弹出页面出现自动吸顶,无法移动和显示头部--- + // 获取到的值带px 正则匹配替换 + const domLeft = getStyle(dragDom, 'left'); + const domTop = getStyle(dragDom, 'top'); + let styL = +domLeft; + let styT = +domTop; + + // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px + if (domLeft.includes('%')) { + styL = +document.body.clientWidth * (+domLeft.replace(/%/g, '') / 100); + styT = +document.body.clientHeight * (+domTop.replace(/%/g, '') / 100); + } else { + styL = +domLeft.replace(/px/g, ''); + styT = +domTop.replace(/px/g, ''); + } + + document.onmousemove = function (e) { + // 通过事件委托,计算移动的距离 + let left = e.clientX - disX; + let top = e.clientY - disY; + + // 边界处理 + if (-left > minDragDomLeft) { + left = -minDragDomLeft; + } else if (left > maxDragDomLeft) { + left = maxDragDomLeft; + } + + if (-top > minDragDomTop) { + top = -minDragDomTop; + } else if (top > maxDragDomTop) { + top = maxDragDomTop; + } + + // 移动当前元素 + dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`; + }; + + document.onmouseup = () => { + document.onmousemove = null; + document.onmouseup = null; + }; + }; + }; + + const handleDrag = () => { + const dragWraps = document.querySelectorAll('.ant-modal-wrap'); + for (const wrap of Array.from(dragWraps)) { + if (!wrap) continue; + const display = getStyle(wrap, 'display'); + const draggable = wrap.getAttribute('data-drag'); + if (display !== 'none') { + // 拖拽位置 + if (draggable === null || unref(context.destroyOnClose)) { + drag(wrap); + } + } + } + }; + + watchEffect(() => { + if (!unref(context.open) || !unref(context.draggable)) { + return; + } + useTimeoutFn(() => { + handleDrag(); + }, 30); + }); +} diff --git a/src/components/Modal/src/hooks/useModalFullScreen.ts b/src/components/Modal/src/hooks/useModalFullScreen.ts new file mode 100644 index 0000000..3a0ce29 --- /dev/null +++ b/src/components/Modal/src/hooks/useModalFullScreen.ts @@ -0,0 +1,47 @@ +import { computed, Ref, ref, unref } from 'vue'; + +export interface UseFullScreenContext { + wrapClassName: Ref; + modalWrapperRef: Ref; + extHeightRef: Ref; +} + +export function useFullScreen(context?: UseFullScreenContext) { + // const formerHeightRef = ref(0); + const fullScreenRef = ref(false); + + const getWrapClassName = computed(() => { + const clsName = unref(context?.wrapClassName) || ''; + return unref(fullScreenRef) ? `fullscreen-modal ${clsName} ` : unref(clsName); + }); + + function handleFullScreen(e: Event) { + e && e.stopPropagation(); + fullScreenRef.value = !unref(fullScreenRef); + + // const modalWrapper = unref(context.modalWrapperRef); + + // if (!modalWrapper) return; + + // const wrapperEl = modalWrapper.$el as HTMLElement; + // if (!wrapperEl) return; + // const modalWrapSpinEl = wrapperEl.querySelector('.ant-spin-nested-loading') as HTMLElement; + + // if (!modalWrapSpinEl) return; + + // if (!unref(formerHeightRef) && unref(fullScreenRef)) { + // formerHeightRef.value = modalWrapSpinEl.offsetHeight; + // } + + // if (unref(fullScreenRef)) { + // modalWrapSpinEl.style.height = `${window.innerHeight - unref(context.extHeightRef)}px`; + // } else { + // modalWrapSpinEl.style.height = `${unref(formerHeightRef)}px`; + // } + } + // 重置全屏状态 + function resetFullScreen() { + fullScreenRef.value = false; + } + return { getWrapClassName, handleFullScreen, fullScreenRef, resetFullScreen }; +} diff --git a/src/components/Modal/src/index.less b/src/components/Modal/src/index.less new file mode 100644 index 0000000..977dd67 --- /dev/null +++ b/src/components/Modal/src/index.less @@ -0,0 +1,154 @@ +.fullscreen-modal { + overflow: hidden; + + .ant-modal { + top: 0 !important; + right: 0 !important; + bottom: 0 !important; + left: 0 !important; + width: 100% !important; + height: 100%; + max-width: 100%; + + &-content { + height: 100vh; + border-radius: 0; + display: flex; + flex-direction: column; + .ant-modal-body { + flex: 1; + } + .ant-modal-header, + .ant-modal-footer { + flex-shrink: 0; + } + } + } +} + +.ant-modal { + width: 600px; + padding-bottom: 0; + + .ant-modal-body > .scrollbar { + padding: 20px 50px 0; + & > .scrollbar__wrap { + margin-bottom: 0 !important; + .ant-form:not(.yunzhupaas-basic-form) { + padding-bottom: 0.1px; + } + } + } + + &-title { + font-size: 16px; + // font-weight: bold; + + .base-title { + cursor: move !important; + } + } + + .ant-modal-body { + padding: 0; + + > .scrollbar > .scrollbar__bar.is-horizontal { + display: none; + } + } + + &-large { + top: 60px; + + &--mini { + top: 16px; + } + } + + &-header { + height: 60px; + padding: 0 16px; + display: flex; + align-items: center; + .ant-modal-title { + width: 100%; + } + } + + &-content { + box-shadow: 0 4px 8px 0 rgb(0 0 0 / 20%), 0 6px 20px 0 rgb(0 0 0 / 19%); + } + + & &-footer { + button + button { + margin-left: 10px; + } + } + + & &-close { + font-weight: normal; + outline: none; + top: 0; + right: 0; + width: auto; + height: auto; + } + + &-close-x { + display: inline-block; + width: 96px !important; + height: 60px !important; + line-height: 60px !important; + } + + &-confirm-body { + .ant-modal-confirm-content { + // color: #fff; + + > * { + color: @text-color-help-dark; + } + } + } + + &-confirm-confirm.error .ant-modal-confirm-body > .anticon { + color: @error-color; + } + + &-confirm-btns { + .ant-btn:last-child { + margin-right: 0; + } + } + + &-confirm-info { + .ant-modal-confirm-body > .anticon { + color: @warning-color; + } + } + + &-confirm-confirm.success { + .ant-modal-confirm-body > .anticon { + color: @success-color; + } + } +} + +.ant-modal-confirm .ant-modal-body { + padding: 24px !important; +} +@media screen and (max-height: 600px) { + .ant-modal { + top: 60px; + } +} +@media screen and (max-height: 540px) { + .ant-modal { + top: 30px; + } +} +@media screen and (max-height: 480px) { + .ant-modal { + top: 10px; + } +} diff --git a/src/components/Modal/src/props.ts b/src/components/Modal/src/props.ts new file mode 100644 index 0000000..57b3961 --- /dev/null +++ b/src/components/Modal/src/props.ts @@ -0,0 +1,96 @@ +import type { PropType, CSSProperties } from 'vue'; +import type { ModalWrapperProps } from './typing'; +import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; +import { useI18n } from '@/hooks/web/useI18n'; + +const { t } = useI18n(); + +export const modalProps = { + open: { type: Boolean }, + scrollTop: { type: Boolean, default: true }, + height: { type: Number }, + minHeight: { type: Number }, + // open drag + draggable: { type: Boolean, default: false }, + centered: { type: Boolean, default: true }, + cancelText: { type: String, default: t('common.cancelText') }, + okText: { type: String, default: t('common.okText') }, + continueText: { type: String, default: t('common.continueText') }, + + closeFunc: Function as PropType<() => Promise>, +}; + +export const basicProps = Object.assign({}, modalProps, { + defaultFullscreen: { type: Boolean }, + // Can it be full screen + canFullscreen: { type: Boolean, default: false }, + // After enabling the wrapper, the bottom can be increased in height + wrapperFooterOffset: { type: Number, default: -160 }, + // Warm reminder message + helpMessage: [String, Array] as PropType, + // Whether to setting wrapper + useWrapper: { type: Boolean, default: true }, + loading: { type: Boolean }, + loadingTip: { type: String }, + /** + * @description: Show close button + */ + showCancelBtn: { type: Boolean, default: true }, + /** + * @description: Show confirmation button + */ + showOkBtn: { type: Boolean, default: true }, + + showContinueBtn: { type: Boolean, default: false }, + + wrapperProps: Object as PropType>, + + afterClose: Function as PropType<() => Promise>, + + bodyStyle: Object as PropType, + + closable: { type: Boolean, default: true }, + + closeIcon: Object as PropType, + + confirmLoading: { type: Boolean }, + + continueLoading: { type: Boolean }, + + destroyOnClose: { type: Boolean }, + + footer: Object as PropType, + + getContainer: Function as PropType<() => any>, + + mask: { type: Boolean, default: true }, + + maskClosable: { type: Boolean, default: false }, + + keyboard: { type: Boolean, default: false }, + + maskStyle: Object as PropType, + + okType: { type: String, default: 'primary' }, + + continueType: { type: String, default: 'default' }, + + okButtonProps: Object as PropType, + + cancelButtonProps: Object as PropType, + + continueButtonProps: Object as PropType, + + title: { type: String }, + + open: { type: Boolean }, + + width: { + type: [String, Number] as PropType, + default: 600, + }, + + wrapClassName: { type: String }, + + zIndex: { type: Number }, +}); diff --git a/src/components/Modal/src/typing.ts b/src/components/Modal/src/typing.ts new file mode 100644 index 0000000..3105a7b --- /dev/null +++ b/src/components/Modal/src/typing.ts @@ -0,0 +1,219 @@ +import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes'; +import type { CSSProperties, VNodeChild, ComputedRef } from 'vue'; +/** + * @description: 弹窗对外暴露的方法 + */ +export interface ModalMethods { + setModalProps: (props: Partial) => void; + emitOpen?: (open: boolean, uid: number) => void; + redoModalHeight?: () => void; +} + +export type RegisterFn = (modalMethods: ModalMethods, uuid?: string) => void; + +export interface ReturnMethods extends ModalMethods { + openModal: (props?: boolean, data?: T, openOnSet?: boolean) => void; + closeModal: () => void; + getOpen?: ComputedRef; +} + +export type UseModalReturnType = [RegisterFn, ReturnMethods]; + +export interface ReturnInnerMethods extends ModalMethods { + closeModal: () => void; + changeLoading: (loading: boolean) => void; + changeOkLoading: (loading: boolean) => void; + changeContinueLoading: (loading: boolean) => void; + getOpen?: ComputedRef; + redoModalHeight: () => void; +} + +export type UseModalInnerReturnType = [RegisterFn, ReturnInnerMethods]; + +export interface ModalProps { + minHeight?: number; + height?: number; + // 启用wrapper后 底部可以适当增加高度 + wrapperFooterOffset?: number; + draggable?: boolean; + scrollTop?: boolean; + + // 是否可以进行全屏 + canFullscreen?: boolean; + defaultFullscreen?: boolean; + open?: boolean; + // 温馨提醒信息 + helpMessage: string | string[]; + + // 是否使用modalWrapper + useWrapper: boolean; + + loading: boolean; + loadingTip?: string; + + wrapperProps: Omit; + + showOkBtn: boolean; + showContinueBtn: boolean; + showCancelBtn: boolean; + closeFunc: () => Promise; + + /** + * Specify a function that will be called when modal is closed completely. + * @type Function + */ + afterClose?: () => any; + + /** + * Body style for modal body element. Such as height, padding etc. + * @default {} + * @type object + */ + bodyStyle?: CSSProperties; + + /** + * Text of the Cancel button + * @default 'cancel' + * @type string + */ + cancelText?: string; + + /** + * Centered Modal + * @default false + * @type boolean + */ + centered?: boolean; + + /** + * Whether a close (x) button is open on top right of the modal dialog or not + * @default true + * @type boolean + */ + closable?: boolean; + /** + * Whether a close (x) button is open on top right of the modal dialog or not + */ + closeIcon?: VNodeChild | JSX.Element; + + /** + * Whether to apply loading visual effect for OK button or not + * @default false + * @type boolean + */ + confirmLoading?: boolean; + + continueLoading?: boolean; + + /** + * Whether to unmount child components on onClose + * @default false + * @type boolean + */ + destroyOnClose?: boolean; + + /** + * Footer content, set as :footer="null" when you don't need default buttons + * @default OK and Cancel buttons + * @type any (string | slot) + */ + footer?: VNodeChild | JSX.Element; + + /** + * Return the mount node for Modal + * @default () => document.body + * @type Function + */ + getContainer?: (instance: any) => HTMLElement; + + /** + * Whether show mask or not. + * @default true + * @type boolean + */ + mask?: boolean; + + /** + * Whether to close the modal dialog when the mask (area outside the modal) is clicked + * @default true + * @type boolean + */ + maskClosable?: boolean; + + /** + * Style for modal's mask element. + * @default {} + * @type object + */ + maskStyle?: CSSProperties; + + /** + * Text of the OK button + * @default 'OK' + * @type string + */ + okText?: string; + + continueText?: string; + + /** + * Button type of the OK button + * @default 'primary' + * @type string + */ + okType?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; + + continueType?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; + + /** + * The ok button props, follow jsx rules + * @type object + */ + okButtonProps?: ButtonProps; + + continueButtonProps?: ButtonProps; + + /** + * The cancel button props, follow jsx rules + * @type object + */ + cancelButtonProps?: ButtonProps; + + /** + * The modal dialog's title + * @type any (string | slot) + */ + title?: VNodeChild | JSX.Element; + + /** + * Width of the modal dialog + * @default 520 + * @type string | number + */ + width?: string | number; + + /** + * The class name of the container of the modal dialog + * @type string + */ + wrapClassName?: string; + + /** + * The z-index of the Modal + * @default 1000 + * @type number + */ + zIndex?: number; +} + +export interface ModalWrapperProps { + footerOffset?: number; + loading: boolean; + modalHeaderHeight: number; + modalFooterHeight: number; + minHeight: number; + height: number; + open: boolean; + fullScreen: boolean; + useWrapper: boolean; +} diff --git a/src/components/Page/index.ts b/src/components/Page/index.ts new file mode 100644 index 0000000..aa5f85d --- /dev/null +++ b/src/components/Page/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '@/utils'; + +import pageFooter from './src/PageFooter.vue'; +import pageWrapper from './src/PageWrapper.vue'; + +export const PageFooter = withInstall(pageFooter); +export const PageWrapper = withInstall(pageWrapper); diff --git a/src/components/Page/src/PageFooter.vue b/src/components/Page/src/PageFooter.vue new file mode 100644 index 0000000..ab45d5b --- /dev/null +++ b/src/components/Page/src/PageFooter.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/components/Page/src/PageWrapper.vue b/src/components/Page/src/PageWrapper.vue new file mode 100644 index 0000000..31d392c --- /dev/null +++ b/src/components/Page/src/PageWrapper.vue @@ -0,0 +1,184 @@ + + + diff --git a/src/components/Popup/index.ts b/src/components/Popup/index.ts new file mode 100644 index 0000000..a5a6814 --- /dev/null +++ b/src/components/Popup/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '@/utils'; +import basicPopup from './src/BasicPopup.vue'; + +export const BasicPopup = withInstall(basicPopup); +export * from './src/typing'; +export { usePopup, usePopupInner } from './src/usePopup'; diff --git a/src/components/Popup/src/BasicPopup.vue b/src/components/Popup/src/BasicPopup.vue new file mode 100644 index 0000000..a216573 --- /dev/null +++ b/src/components/Popup/src/BasicPopup.vue @@ -0,0 +1,226 @@ + + + diff --git a/src/components/Popup/src/components/PopupHeader.vue b/src/components/Popup/src/components/PopupHeader.vue new file mode 100644 index 0000000..e72faee --- /dev/null +++ b/src/components/Popup/src/components/PopupHeader.vue @@ -0,0 +1,105 @@ + + + + diff --git a/src/components/Popup/src/props.ts b/src/components/Popup/src/props.ts new file mode 100644 index 0000000..42e3c3f --- /dev/null +++ b/src/components/Popup/src/props.ts @@ -0,0 +1,49 @@ +import type { PropType } from 'vue'; +import { propTypes } from '@/utils/propTypes'; + +import { useI18n } from '@/hooks/web/useI18n'; +const { t } = useI18n(); + +export const headerProps = { + title: { type: String, default: '' }, + helpMessage: [String, Array] as PropType, + showBackIcon: { type: Boolean, default: true }, + confirmLoading: { type: Boolean }, + /** + * @description: Show close button + */ + showCancelBtn: { type: Boolean, default: true }, + cancelButtonProps: Object as PropType, + cancelText: { type: String, default: t('common.cancelText') }, + /** + * @description: Show confirmation button + */ + showOkBtn: { type: Boolean, default: false }, + okButtonProps: Object as PropType, + okText: { type: String, default: t('common.okText') }, + okType: { type: String, default: 'primary' }, + continueText: { type: String, default: t('common.continueText') }, + continueType: { type: String, default: 'default' }, + showContinueBtn: { type: Boolean, default: false }, + continueButtonProps: Object as PropType, + continueLoading: { type: Boolean }, +}; +export const basicProps = { + defaultFullscreen: { type: Boolean, default: false }, + loadingText: { type: String }, + open: { type: Boolean }, + loading: { type: Boolean }, + getContainer: { + type: [Object, String] as PropType, + }, + closeFunc: { + type: [Function, Object] as PropType, + default: null, + }, + destroyOnClose: { type: Boolean }, + closable: { type: Boolean, default: true }, + closeIcon: propTypes.any, + width: propTypes.oneOfType([propTypes.string, propTypes.number]), + zIndex: Number, + ...headerProps, +}; diff --git a/src/components/Popup/src/typing.ts b/src/components/Popup/src/typing.ts new file mode 100644 index 0000000..72e783f --- /dev/null +++ b/src/components/Popup/src/typing.ts @@ -0,0 +1,143 @@ +import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes'; +import type { VNodeChild, ComputedRef } from 'vue'; +import type { ScrollContainerOptions } from '@/components/Container/index'; + +export interface PopupInstance { + setPopupProps: (props: Partial | boolean) => void; + emitOpen?: (open: boolean, uid: number) => void; +} + +export interface ReturnMethods extends PopupInstance { + openPopup: (open?: boolean, data?: T, openOnSet?: boolean) => void; + closePopup: () => void; + getOpen?: ComputedRef; +} + +export type RegisterFn = (popupInstance: PopupInstance, uuid?: string) => void; + +export interface ReturnInnerMethods extends PopupInstance { + closePopup: () => void; + changeLoading: (loading: boolean) => void; + changeOkLoading: (loading: boolean) => void; + changeContinueLoading: (loading: boolean) => void; + getOpen?: ComputedRef; +} + +export type UsePopupReturnType = [RegisterFn, ReturnMethods]; + +export type UsePopupInnerReturnType = [RegisterFn, ReturnInnerMethods]; + +export interface PopupHeaderProps { + /** + * The title for Popup. + * @type any (string | slot) + */ + title?: VNodeChild | JSX.Element; + helpMessage?: Array | string; + showBackIcon: boolean; + showOkBtn: boolean; + showContinueBtn: boolean; + showCancelBtn: boolean; + /** + * Text of the Cancel button + * @default 'cancel' + * @type string + */ + cancelText: string; + /** + * Text of the OK button + * @default 'OK' + * @type string + */ + okText: string; + + continueText?: string; + + /** + * Button type of the OK button + * @default 'primary' + * @type string + */ + okType: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; + + continueType?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default'; + /** + * The ok button props, follow jsx rules + * @type object + */ + okButtonProps: { props: ButtonProps; on: {} }; + + continueButtonProps: { props: ButtonProps; on: {} }; + + /** + * The cancel button props, follow jsx rules + * @type object + */ + cancelButtonProps: { props: ButtonProps; on: {} }; + /** + * Whether to apply loading visual effect for OK button or not + * @default false + * @type boolean + */ + confirmLoading: boolean; + + continueLoading?: boolean; +} +export interface PopupProps extends PopupHeaderProps { + defaultFullscreen?: boolean; + loading?: boolean; + open?: boolean; + /** + * Built-in ScrollContainer component configuration + * @type ScrollContainerOptions + */ + scrollOptions?: ScrollContainerOptions; + closeFunc?: () => Promise; + triggerWindowResize?: boolean; + /** + * Whether a close (x) button is open on top right of the Popup dialog or not. + * @default true + * @type boolean + */ + closable?: boolean; + + /** + * Whether to unmount child components on closing popup or not. + * @default false + * @type boolean + */ + destroyOnClose?: boolean; + + /** + * Return the mounted node for Popup. + * @default 'body' + * @type any ( HTMLElement| () => HTMLElement | string) + */ + getContainer?: () => HTMLElement | string; + + class?: string; + + /** + * Width of the Popup dialog. + * @default 100% + * @type string | number + */ + width?: string | number; + + /** + * The z-index of the Popup. + * @default 1000 + * @type number + */ + zIndex?: number; + + /** + * Specify a callback that will be called when a user clicks mask, close button or Cancel button. + */ + onClose?: (e?: Event) => void; +} +export interface PopupActionType { + scrollBottom: () => void; + scrollTo: (to: number) => void; + getScrollWrap: () => Element | null; +} diff --git a/src/components/Popup/src/usePopup.ts b/src/components/Popup/src/usePopup.ts new file mode 100644 index 0000000..cac0ef4 --- /dev/null +++ b/src/components/Popup/src/usePopup.ts @@ -0,0 +1,152 @@ +import type { UsePopupReturnType, PopupInstance, ReturnMethods, PopupProps, UsePopupInnerReturnType } from './typing'; +import { ref, getCurrentInstance, unref, reactive, watchEffect, nextTick, toRaw, computed } from 'vue'; +import { isProdMode } from '@/utils/env'; +import { isFunction } from '@/utils/is'; +import { tryOnUnmounted } from '@vueuse/core'; +import { isEqual } from 'lodash-es'; +import { error } from '@/utils/log'; + +const dataTransferRef = reactive({}); + +const openData = reactive<{ [key: number]: boolean }>({}); + +/** + * @description: Applicable to separate popup and call outside + */ +export function usePopup(): UsePopupReturnType { + if (!getCurrentInstance()) { + throw new Error('usePopup() can only be used inside setup() or functional components!'); + } + const popup = ref(null); + const loaded = ref>(false); + const uid = ref(''); + + function register(popupInstance: PopupInstance, uuid: string) { + isProdMode() && + tryOnUnmounted(() => { + popup.value = null; + loaded.value = null; + dataTransferRef[unref(uid)] = null; + }); + + if (unref(loaded) && isProdMode() && popupInstance === unref(popup)) { + return; + } + uid.value = uuid; + popup.value = popupInstance; + loaded.value = true; + + popupInstance.emitOpen = (open: boolean, uid: number) => { + openData[uid] = open; + }; + } + + const getInstance = () => { + const instance = unref(popup); + if (!instance) { + error('usePopup instance is undefined!'); + } + return instance; + }; + + const methods: ReturnMethods = { + setPopupProps: (props: Partial): void => { + getInstance()?.setPopupProps(props); + }, + + getOpen: computed((): boolean => { + return openData[~~unref(uid)]; + }), + + openPopup: (open = true, data?: T, openOnSet = true): void => { + getInstance()?.setPopupProps({ + open, + confirmLoading: false, + }); + if (!data) return; + + if (openOnSet) { + dataTransferRef[unref(uid)] = null; + dataTransferRef[unref(uid)] = toRaw(data); + return; + } + const equal = isEqual(toRaw(dataTransferRef[unref(uid)]), toRaw(data)); + if (!equal) { + dataTransferRef[unref(uid)] = toRaw(data); + } + }, + closePopup: () => { + getInstance()?.setPopupProps({ open: false }); + }, + }; + + return [register, methods]; +} + +export const usePopupInner = (callbackFn?: Fn): UsePopupInnerReturnType => { + const popupInstanceRef = ref>(null); + const currentInstance = getCurrentInstance(); + const uidRef = ref(''); + + if (!getCurrentInstance()) { + throw new Error('usePopupInner() can only be used inside setup() or functional components!'); + } + + const getInstance = () => { + const instance = unref(popupInstanceRef); + if (!instance) { + error('usePopupInner instance is undefined!'); + return; + } + return instance; + }; + + const register = (popupInstance: PopupInstance, uuid: string) => { + isProdMode() && + tryOnUnmounted(() => { + popupInstanceRef.value = null; + }); + + uidRef.value = uuid; + popupInstanceRef.value = popupInstance; + currentInstance?.emit('register', popupInstance, uuid); + }; + + watchEffect(() => { + const data = dataTransferRef[unref(uidRef)]; + if (!data) return; + if (!callbackFn || !isFunction(callbackFn)) return; + nextTick(() => { + callbackFn(data); + }); + }); + + return [ + register, + { + changeLoading: (loading = true) => { + getInstance()?.setPopupProps({ loading }); + }, + + changeOkLoading: (loading = true) => { + getInstance()?.setPopupProps({ confirmLoading: loading }); + }, + + changeContinueLoading: (loading = true) => { + getInstance()?.setPopupProps({ continueLoading: loading }); + }, + + getOpen: computed((): boolean => { + return openData[~~unref(uidRef)]; + }), + + closePopup: () => { + getInstance()?.setPopupProps({ open: false }); + }, + + setPopupProps: (props: Partial) => { + getInstance()?.setPopupProps(props); + }, + }, + ]; +}; diff --git a/src/components/Preview/index.ts b/src/components/Preview/index.ts new file mode 100644 index 0000000..c0b4685 --- /dev/null +++ b/src/components/Preview/index.ts @@ -0,0 +1,2 @@ +export { default as ImagePreview } from './src/Preview.vue'; +export { createImgPreview } from './src/functional'; diff --git a/src/components/Preview/src/Functional.vue b/src/components/Preview/src/Functional.vue new file mode 100644 index 0000000..2750631 --- /dev/null +++ b/src/components/Preview/src/Functional.vue @@ -0,0 +1,529 @@ + + diff --git a/src/components/Preview/src/Preview.vue b/src/components/Preview/src/Preview.vue new file mode 100644 index 0000000..1126175 --- /dev/null +++ b/src/components/Preview/src/Preview.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/components/Preview/src/functional.ts b/src/components/Preview/src/functional.ts new file mode 100644 index 0000000..b317942 --- /dev/null +++ b/src/components/Preview/src/functional.ts @@ -0,0 +1,17 @@ +import type { Options, Props } from './typing'; +import ImgPreview from './Functional.vue'; +import { isClient } from '@/utils/is'; +import { createVNode, render } from 'vue'; + +let instance: ReturnType | null = null; +export function createImgPreview(options: Options) { + if (!isClient) return; + const propsData: Partial = {}; + const container = document.createElement('div'); + Object.assign(propsData, { show: true, index: options.index || 0, scaleStep: 20 }, options); + + instance = createVNode(ImgPreview, propsData); + render(instance, container); + document.body.appendChild(container); + return instance.component?.exposed; +} diff --git a/src/components/Preview/src/typing.ts b/src/components/Preview/src/typing.ts new file mode 100644 index 0000000..bbb8a83 --- /dev/null +++ b/src/components/Preview/src/typing.ts @@ -0,0 +1,49 @@ +export interface Options { + show?: boolean; + imageList: string[]; + index?: number; + scaleStep?: number; + defaultWidth?: number; + maskClosable?: boolean; + rememberState?: boolean; + onImgLoad?: ({ index: number, url: string, dom: HTMLImageElement }) => void; + onImgError?: ({ index: number, url: string, dom: HTMLImageElement }) => void; +} + +export interface Props { + show: boolean; + instance: Props; + imageList: string[]; + index: number; + scaleStep: number; + defaultWidth: number; + maskClosable: boolean; + rememberState: boolean; +} + +export interface PreviewActions { + resume: () => void; + close: () => void; + prev: () => void; + next: () => void; + setScale: (scale: number) => void; + setRotate: (rotate: number) => void; +} + +export interface ImageProps { + alt?: string; + fallback?: string; + src: string; + width: string | number; + height?: string | number; + placeholder?: string | boolean; + preview?: + | boolean + | { + visible?: boolean; + onVisibleChange?: (visible: boolean, prevVisible: boolean) => void; + getContainer: string | HTMLElement | (() => HTMLElement); + }; +} + +export type ImageItem = string | ImageProps; diff --git a/src/components/PrintDesign/Preview.vue b/src/components/PrintDesign/Preview.vue new file mode 100644 index 0000000..4db106a --- /dev/null +++ b/src/components/PrintDesign/Preview.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/components/PrintDesign/PrintDesign/ConvertModal.vue b/src/components/PrintDesign/PrintDesign/ConvertModal.vue new file mode 100644 index 0000000..43fa35c --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/ConvertModal.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/components/PrintDesign/PrintDesign/ExtraConfigModal.vue b/src/components/PrintDesign/PrintDesign/ExtraConfigModal.vue new file mode 100644 index 0000000..2010269 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/ExtraConfigModal.vue @@ -0,0 +1,215 @@ + + + diff --git a/src/components/PrintDesign/PrintDesign/index.vue b/src/components/PrintDesign/PrintDesign/index.vue new file mode 100644 index 0000000..9fc1a9c --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/index.vue @@ -0,0 +1,846 @@ + + + + + diff --git a/src/components/PrintDesign/PrintDesign/properties/formatter.ts b/src/components/PrintDesign/PrintDesign/properties/formatter.ts new file mode 100644 index 0000000..904fc41 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/formatter.ts @@ -0,0 +1,26 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'formatter'; + } + + return ( + (t.prototype.createTarget = function (_t, i) { + const hidden = i.cType === 'images' ? 'hidden' : ''; + var t = `
\n
格式化函数
\n
\n \n
\n
`; + this.target = $(t); + return this.target; + }), + (t.prototype.getValue = function () { + var t = this.target.find('textarea').val(); + if (t) return t; + }), + (t.prototype.setValue = function (t) { + this.target.find('textarea').val(t ? t.toString() : null); + }), + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/imageHeight.ts b/src/components/PrintDesign/PrintDesign/properties/imageHeight.ts new file mode 100644 index 0000000..30322f4 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/imageHeight.ts @@ -0,0 +1,31 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'imageHeight'; + } + + return ( + (t.prototype.createTarget = function (_t, i) { + const hidden = i.cType !== 'images' ? 'hidden' : ''; + this.target = $( + `
\n
\n 图片高度\n
\n
\n \n
\n
`, + ); + return this.target; + }), + // 获取值 + (t.prototype.getValue = function () { + var t = this.target.find('input').val(); + if (t) return parseFloat(t.toString()); + }), + // 设置值 + (t.prototype.setValue = function (t) { + // t: options 对应键的值 + this.target.find('input').val(t); + }), + // 销毁 DOM + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/imageWidth.ts b/src/components/PrintDesign/PrintDesign/properties/imageWidth.ts new file mode 100644 index 0000000..a3976ca --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/imageWidth.ts @@ -0,0 +1,31 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'imageWidth'; + } + + return ( + (t.prototype.createTarget = function (_t, i) { + const hidden = i.cType !== 'images' ? 'hidden' : ''; + this.target = $( + `
\n
\n 图片宽度\n
\n
\n \n
\n
`, + ); + return this.target; + }), + // 获取值 + (t.prototype.getValue = function () { + var t = this.target.find('input').val(); + if (t) return parseFloat(t.toString()); + }), + // 设置值 + (t.prototype.setValue = function (t) { + // t: options 对应键的值 + this.target.find('input').val(t); + }), + // 销毁 DOM + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/index.ts b/src/components/PrintDesign/PrintDesign/properties/index.ts new file mode 100644 index 0000000..b0329dc --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/index.ts @@ -0,0 +1,10 @@ +export { default as paperNumberDisabled } from './paperNumberDisabled'; +export { default as paperNumberContinue } from './paperNumberContinue'; +export { default as paperNumberFormat } from './paperNumberFormat'; +export { default as tableTextType } from './tableTextType'; +export { default as tableBarcodeMode } from './tableBarcodeMode'; +export { default as tableQRCodeLevel } from './tableQRCodeLevel'; +export { default as tableColumnH } from './tableColumnH'; +export { default as imageWidth } from './imageWidth'; +export { default as imageHeight } from './imageHeight'; +export { default as formatter } from './formatter'; diff --git a/src/components/PrintDesign/PrintDesign/properties/paperNumberContinue.ts b/src/components/PrintDesign/PrintDesign/properties/paperNumberContinue.ts new file mode 100644 index 0000000..c650d97 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/paperNumberContinue.ts @@ -0,0 +1,28 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'paperNumberContinue'; + } + + return ( + (t.prototype.createTarget = function (_t, i) { + if (i.paperNumberDisabled) return null; + return ( + (this.target = $( + `
\n
\n 页码续排\n
\n
\n \n
\n
`, + )), + this.target + ); + }), + (t.prototype.getValue = function () { + return 'true' == this.target.find('select').val(); + }), + (t.prototype.setValue = function (t) { + this.target.find('select').val((t == void 0 || t ? 'true' : 'reset').toString()); + }), + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/paperNumberDisabled.ts b/src/components/PrintDesign/PrintDesign/properties/paperNumberDisabled.ts new file mode 100644 index 0000000..b138de7 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/paperNumberDisabled.ts @@ -0,0 +1,28 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'paperNumberDisabled'; + } + + return ( + (t.prototype.createTarget = function () { + this.target = $( + `
\n
\n 显示页码\n
\n
\n \n
\n
`, + ); + this.target.on('change', '.auto-submit', function () { + $('.hiprint-printPaper').click(); + }); + return this.target; + }), + (t.prototype.getValue = function () { + if ('true' == this.target.find('select').val()) return !0; + }), + (t.prototype.setValue = function (t) { + this.target.find('select').val((null == t ? '' : t).toString()); + }), + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/paperNumberFormat.ts b/src/components/PrintDesign/PrintDesign/properties/paperNumberFormat.ts new file mode 100644 index 0000000..a10cc90 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/paperNumberFormat.ts @@ -0,0 +1,29 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'paperNumberFormat'; + } + + return ( + (t.prototype.createTarget = function (_t, i) { + if (i.paperNumberDisabled) return null; + return ( + (this.target = $( + `
\n
\n 页码格式\n
\n
\n \n
\n
`, + )), + this.target + ); + }), + (t.prototype.getValue = function () { + var t = this.target.find('input').val(); + if (t) return t.toString(); + }), + (t.prototype.setValue = function (t) { + this.target.find('input').val(t); + }), + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/tableBarcodeMode.ts b/src/components/PrintDesign/PrintDesign/properties/tableBarcodeMode.ts new file mode 100644 index 0000000..316e18c --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/tableBarcodeMode.ts @@ -0,0 +1,29 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'tableBarcodeMode'; + } + + return ( + (t.prototype.createTarget = function (_t, i) { + const hidden = i.tableTextType !== 'barcode' ? 'hidden' : ''; + return ( + (this.target = $( + `
\n
\n 条形码格式\n
\n
\n \n
\n
`, + )), + this.target + ); + }), + (t.prototype.getValue = function () { + var t = this.target.find('select').val(); + return t || void 0; + }), + (t.prototype.setValue = function (t) { + this.target?.find('select').val(t); + }), + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/tableColumnH.ts b/src/components/PrintDesign/PrintDesign/properties/tableColumnH.ts new file mode 100644 index 0000000..7a86919 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/tableColumnH.ts @@ -0,0 +1,29 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'tableColumnHeight'; + } + + return ( + (t.prototype.createTarget = function (_t, i) { + const hidden = !['barcode', 'qrcode', 'image'].includes(i.tableTextType) ? 'hidden' : ''; + return ( + (this.target = $( + `
\n
\n 单元格高度\n
\n
\n \n
\n
`, + )), + this.target + ); + }), + (t.prototype.getValue = function () { + var t = this.target.find('input').val(); + if (t) return t.toString(); + }), + (t.prototype.setValue = function (t) { + this.target.find('input').val(t); + }), + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/tableQRCodeLevel.ts b/src/components/PrintDesign/PrintDesign/properties/tableQRCodeLevel.ts new file mode 100644 index 0000000..cf5108b --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/tableQRCodeLevel.ts @@ -0,0 +1,29 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'tableQRCodeLevel'; + } + + return ( + (t.prototype.createTarget = function (_t, i) { + const hidden = i.tableTextType !== 'qrcode' ? 'hidden' : ''; + return ( + (this.target = $( + `
\n
\n 二维码容错率\n
\n
\n \n
\n
`, + )), + this.target + ); + }), + (t.prototype.getValue = function () { + var t = this.target.find('select').val(); + return parseInt(t || 0); + }), + (t.prototype.setValue = function (t) { + this.target.find('select').val(t); + }), + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/properties/tableTextType.ts b/src/components/PrintDesign/PrintDesign/properties/tableTextType.ts new file mode 100644 index 0000000..f505158 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/properties/tableTextType.ts @@ -0,0 +1,46 @@ +// @ts-nocheck +export default (function () { + function t() { + this.name = 'tableTextType'; + } + + return ( + (t.prototype.createTarget = function () { + this.target = $( + `
\n
\n 字段类型\n
\n
\n \n
\n
`, + ); + this.target.on('change', '.auto-submit', function () { + const val = $(this).val(); + if (val === 'barcode') { + $('.qrcode-config').addClass('hidden'); + $('.barcode-config').removeClass('hidden'); + } else { + $('.barcode-config').addClass('hidden'); + } + if (val === 'qrcode') { + $('.qrcode-config').addClass('hidden'); + $('.qrcode-config').removeClass('hidden'); + } else { + $('.qrcode-config').addClass('hidden'); + } + if (['barcode', 'qrcode', 'image'].includes(val)) { + $('.image-config').removeClass('hidden'); + } else { + $('.image-config').addClass('hidden'); + } + }); + return this.target; + }), + (t.prototype.getValue = function () { + var t = this.target.find('select').val(); + if (t) return t; + }), + (t.prototype.setValue = function (t) { + this.target.find('select').val(t); + }), + (t.prototype.destroy = function () { + this.target.remove(); + }), + t + ); +})(); diff --git a/src/components/PrintDesign/PrintDesign/provider.ts b/src/components/PrintDesign/PrintDesign/provider.ts new file mode 100644 index 0000000..50dfb4a --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/provider.ts @@ -0,0 +1,191 @@ +import { hiprint } from 'vue-plugin-hiprint'; +const defaultImg = + 'data:image/png;base64,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'; +(window as any).defaultImg = defaultImg; + +const provider = () => { + var addElementTypes = (context: any) => { + context.removePrintElementTypes('providerModule'); + + context.addPrintElementTypes('providerModule', [ + new hiprint.PrintElementTypeGroup('', [ + { + tid: 'providerModule.text', + title: '文本', + type: 'text', + options: {}, + }, + { + tid: 'providerModule.longText', + title: '长文本', + type: 'longText', + options: {}, + }, + { + tid: 'providerModule.image', + title: '图片', + type: 'image', + options: { + width: 100, + height: 100, + src: defaultImg, + }, + }, + { + tid: 'providerModule.table', + title: '空白表格', + type: 'table', + options: {}, + columns: [[{ align: 'center' }, { align: 'center' }]], + }, + { + tid: 'providerModule.qrcode', + title: '二维码', + type: 'qrcode', + options: { + width: 48, + height: 48, + testData: '', + textContentVerticalAlign: 'middle', + }, + }, + { + tid: 'providerModule.barcode', + title: '条形码', + type: 'barcode', + options: { + height: 32, + fontSize: 12, + lineHeight: 18, + textType: 'barcode', + }, + }, + { + tid: 'providerModule.images', + title: '图片组', + type: 'html', + options: { + cType: 'images', + imageField: '', + width: 210, + height: 210, + imageWidth: 100, + imageHeight: 100, + imageSpace: 5, + formatter: `function (t, e, printData) { + if (!printData || JSON.stringify(printData) === '{}') { + return '
'; + } + if (!e.field) return ''; + let fieldList = e.field.split('.'); + if (!printData[fieldList[0]] || !printData[fieldList[0]][fieldList[1]] || !printData[fieldList[0]][fieldList[1]][fieldList[2]]) return ''; + try { + let list = JSON.parse(printData[fieldList[0]][fieldList[1]][fieldList[2]]); + if (!Array.isArray(list) || !list.length) return ''; + let imgsArr = list.map(o => (window.hinnn.apiUrl || '') + o.url); + var space = '0 ' + e.imageSpace + 'pt ' + e.imageSpace + 'pt' + ' 0'; + var imgsStr = '
'; + for (var index = 0; index < imgsArr.length; index++) { + imgsStr += ''; + } + return imgsStr + '
'; + } catch (e) { + return ''; + } +}`, + }, + }, + { + tid: 'providerModule.hline', + title: '横线', + type: 'hline', + }, + { + tid: 'providerModule.vline', + title: '竖线', + type: 'vline', + }, + { + tid: 'providerModule.rect', + title: '矩形', + type: 'rect', + }, + { + tid: 'providerModule.oval', + title: '椭圆', + type: 'oval', + }, + { + tid: 'providerModule.cell', + title: '', + type: 'text', + options: { + width: 70, + height: 24, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + }, + }, + { + tid: 'providerModule.printTime', + title: '打印时间', + type: 'text', + options: { + field: 'systemInfo.printTime', + testData: '2024-05-20 12:00:00', + height: 16, + width: 140, + textContentVerticalAlign: 'middle', + }, + }, + { + tid: 'providerModule.printer', + title: '打印人员', + type: 'text', + options: { + field: 'systemInfo.printer', + testData: '管理员', + height: 16, + width: 140, + textContentVerticalAlign: 'middle', + }, + }, + { + tid: 'providerModule.flowRecord', + title: '审批信息', + type: 'table', + options: { + field: 'operatorRecordList', + fields: [ + { text: '节点名称', field: 'nodeName' }, + { text: '操作人员', field: 'userName' }, + { text: '操作时间', field: 'handleTime' }, + { text: '执行动作', field: 'handleStatus' }, + { text: '备注', field: 'handleOpinion' }, + { text: '签名', field: 'signImg' }, + ], + }, + columns: [ + [ + { title: '节点名称', field: 'nodeName', width: 100 }, + { title: '操作人员', field: 'userName', width: 100 }, + { title: '操作时间', field: 'handleTime', width: 100 }, + { title: '执行动作', field: 'handleStatus', width: 100 }, + { title: '备注', field: 'handleOpinion', width: 100 }, + { title: '签名', field: 'signImg', width: 100, tableTextType: 'image' }, + ], + ], + }, + ]), + ]); + }; + return { + addElementTypes, + }; +}; + +export default provider; diff --git a/src/components/PrintDesign/PrintDesign/style/index.less b/src/components/PrintDesign/PrintDesign/style/index.less new file mode 100644 index 0000000..b99c40f --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/style/index.less @@ -0,0 +1,420 @@ +@prefix-cls: ~'@{namespace}-print-designer'; + +html[data-theme='dark'] { + .@{prefix-cls} { + .flex-row { + .center-side { + #hiprintPrintTemplate { + background-color: #fff; + color: #333; + } + // 滚动条右下角的三角形颜色 + ::-webkit-scrollbar-corner { + background-color: #fff; + } + } + .right-side { + #PrintElementOptionSetting { + .prop-tabs .prop-tab-items .prop-tab-item span { + color: rgba(255, 255, 255, 0.85); + } + .hiprint-option-items .hiprint-option-item .hiprint-option-item-label { + color: #fff; + } + } + } + } + } +} + +.@{prefix-cls} { + height: 100%; + display: flex; + + &__body { + flex: 1; + position: relative; + display: flex; + overflow: hidden; + } + .design-wrap { + width: 100%; + height: calc(100%); + } + + .flex-row { + height: calc(100%); + display: flex; + overflow: hidden; + + .left-side { + max-width: 250px; + min-width: 250px; + height: calc(100%); + background: @component-background; + border-radius: 8px; + + .tabs-content { + height: calc(100% - 42px); + user-select: none; + .components-list { + .components-list-title { + font-weight: 600; + .title-tip { + font-size: 12px; + color: #999; + margin-left: 4px; + font-weight: normal; + } + } + .ant-collapse-content-box { + padding: 0 10px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + } + .components-draggable { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + } + .components-item { + width: 110px; + margin-bottom: 10px; + transition: transform 0ms !important; + &.disabled { + .components-body { + cursor: not-allowed; + color: @text-color-secondary; + &:hover { + color: @text-color-secondary; + border-color: @border-color-base; + } + } + } + &.ep-click-item .components-body { + cursor: pointer; + } + .components-body { + padding-left: 8px; + font-size: 12px; + height: 36px; + cursor: move; + border: 1px solid @border-color-base; + border-radius: var(--border-radius); + line-height: 34px; + display: flex; + align-items: center; + color: @text-color; + i { + line-height: 16px; + height: 16px; + margin-right: 4px; + } + &:hover { + border: 1px solid @primary-color; + color: @primary-color; + } + } + } + } + .dataSet-content { + height: 100%; + .dataSet-content-header { + height: 50px; + padding: 10px; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid @border-color-base1; + font-size: 16px; + } + .dataSet-content-main { + height: calc(100% - 50px); + } + } + } + } + + .center-side { + background: @component-background; + flex: 1; + min-width: 800px; + overflow: hidden; + margin: 0 10px; + border-radius: 8px; + box-sizing: border-box; + position: relative; + + .center-side-tool-wrap { + display: flex; + justify-content: space-between; + padding: 10px; + border-bottom: 1px solid @border-color-base1; + + .left-handle-tool-wrap { + display: flex; + } + + .right-handle-tool-wrap { + display: flex; + align-items: center; + margin-left: 10px; + .action-bar-divider { + height: 16px; + margin: 0 6px; + top: 1px; + & + .action-bar-btn { + margin-left: 0; + } + } + + .action-bar-btn { + margin-left: 10px; + padding: 0 4px !important; + i { + font-size: 18px; + &.icon-ym-redo, + &.icon-ym-undo { + font-size: 14px; + } + } + } + } + } + + .size-tool-wrap { + margin: 0 10px; + button { + padding: 0; + width: 32px; + } + .custom-size-button { + width: auto !important; + padding: 0 8px; + } + } + + .scale-tool-wrap { + .scale-value-input { + width: 60px !important; + input { + text-align: center; + } + } + } + + #hiprintPrintTemplate { + height: calc(100% - 53px); + padding: 15px 10px 10px 15px; + box-sizing: border-box; + overflow: auto; + } + .draggable-box { + position: absolute; + width: 100%; + height: calc(100% - 53px); + top: 53px; + left: 0; + z-index: 100; + } + } + + .right-side { + max-width: 300px; + min-width: 300px; + background: @component-background; + height: calc(100%); + overflow-x: hidden; + overflow-y: auto; + border-radius: 8px; + + .prop-tabs { + background: @component-background !important; + .prop-tab-items { + padding: 0; + height: 42px; + border-bottom: 1px solid @border-color-base1; + display: flex; + .prop-tab-item { + background: @component-background !important; + flex: 1; + height: 42px; + line-height: 42px; + text-align: center; + span { + font-size: 14px; + font-weight: normal; + } + &.active { + border-bottom: 2px solid @primary-color; + span { + color: @primary-color; + font-weight: bold; + } + } + } + } + .hiprint-option-items { + background: @component-background !important; + padding: 10px 5px; + .minicolors { + width: 100% !important; + } + } + } + + .hiprint-option-items { + .hiprint-option-item { + width: 100%; + box-sizing: border-box; + margin-bottom: 18px; + + .hiprint-option-item-label { + margin: 0 0 2px 0; + padding: 0; + font-size: 14px; + } + + .hiprint-option-item-field { + & > select, + & > input[type='text'], + & > input[type='number'], + & > textarea { + background: @component-background !important; + padding: 0 16px 0 6px; + border: 1px solid @border-color-base; + height: 32px; + border-radius: 2px; + outline: none; + font-size: 14px; + box-sizing: border-box; + + &:hover { + border-color: @primary-color; + } + } + + & > textarea { + display: block; + } + + & > input[type='range'] { + &:hover { + box-shadow: none; + } + } + + & > input[type='checkbox'] { + border: 1px solid @border-color-base; + + &:hover { + border-color: @primary-color; + } + } + + .minicolors { + width: 75%; + + .minicolors-input { + width: 100% !important; + padding: 0 16px 0 30px; + border: 1px solid @border-color-base; + height: 32px; + border-radius: 2px; + outline: none; + font-size: 14px; + box-sizing: border-box; + + &:hover { + border-color: @primary-color; + } + } + .minicolors-swatch { + top: 8px; + left: 8px; + } + } + } + + .hiprint-option-table-selected-item { + .hi-pretty { + transform: translateY(-1px); + } + } + } + + .hiprint-option-item-settingBtn { + border-color: @primary-color; + background: @primary-color; + width: 77px; + height: 32px; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); + font-size: 14px; + border-radius: 2px; + transform: translateY(-1px); + } + + .hiprint-option-item-submitBtn { + margin: 0 5px; + width: 100%; + height: 32px; + color: #fff; + border-color: @primary-color; + background: @primary-color; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); + font-size: 14px; + border-radius: 2px; + transform: translateY(0); + } + } + + .hiprint-option-item-submitBtn, + .hiprint-option-item-deleteBtn { + width: 134px; + height: 32px; + margin: 0 5px 10px; + color: #fff; + + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045); + font-size: 14px; + border-radius: 2px; + + &.hiprint-option-item-submitBtn { + border-color: @primary-color; + background: @primary-color; + margin-left: 10px; + } + + &.hiprint-option-item-deleteBtn { + border-color: @error-color; + background: @error-color; + } + } + } + } +} +.custom-print-size-popover { + .custom-size-input-group { + display: flex; + margin: 0 0 10px; + } + + .custom-size-input { + width: 100px !important; + text-align: center !important; + } + + .custom-size-input-range { + width: 30px; + text-align: center; + margin: 0 2px !important; + padding: 0; + border: none; + background: @component-background; + } +} diff --git a/src/components/PrintDesign/PrintDesign/template/index.ts b/src/components/PrintDesign/PrintDesign/template/index.ts new file mode 100644 index 0000000..a441f1a --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/index.ts @@ -0,0 +1,8 @@ +export { default as templateJson1 } from './template1'; +export { default as templateJson2 } from './template2'; +export { default as templateJson3 } from './template3'; +export { default as templateJson4 } from './template4'; +export { default as templateJson5 } from './template5'; +export { default as templateJson6 } from './template6'; +export { default as templateJson7 } from './template7'; +export { default as templateJson8 } from './template8'; diff --git a/src/components/PrintDesign/PrintDesign/template/template1.ts b/src/components/PrintDesign/PrintDesign/template/template1.ts new file mode 100644 index 0000000..eec8d70 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/template1.ts @@ -0,0 +1,1675 @@ +export default [ + { + options: { + left: 237, + top: 21, + height: 34.5, + width: 120, + title: '入职申请表', + coordinateSync: false, + widthHeightSync: false, + fontSize: 21, + fontWeight: 'bold', + textAlign: 'center', + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 372, + top: 88.5, + height: 13.5, + width: 177, + title: '填表时间:', + right: 491.25, + bottom: 84, + vCenter: 431.25, + hCenter: 77.25, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'Microsoft YaHei', + fontSize: 12, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 88.5, + height: 13.5, + width: 177, + title: '编号:', + right: 219.24609375, + bottom: 83.49609375, + vCenter: 130.74609375, + hCenter: 76.74609375, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'Microsoft YaHei', + fontSize: 12, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 211.5, + top: 108, + height: 32, + width: 49.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 275.2499771118164, + bottom: 85.24147415161133, + vCenter: 238.4999771118164, + hCenter: 69.24147415161133, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 309, + top: 108, + height: 32, + width: 49.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 275.2499771118164, + bottom: 85.24147415161133, + vCenter: 238.4999771118164, + hCenter: 69.24147415161133, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 261, + top: 108, + height: 32, + width: 49.5, + title: '年龄', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + qrCodeLevel: 0, + right: 310.5, + bottom: 122, + vCenter: 285.75, + hCenter: 106, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 358.5, + top: 108, + height: 32, + width: 49.5, + title: '民族', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + qrCodeLevel: 0, + right: 408, + bottom: 122, + vCenter: 383.25, + hCenter: 106, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 108, + height: 32, + width: 49.5, + title: '性别', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + qrCodeLevel: 0, + right: 201.75, + bottom: 85.99147415161133, + vCenter: 177, + hCenter: 69.99147415161133, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 406.5, + top: 108, + height: 32, + width: 49.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 275.2499771118164, + bottom: 85.24147415161133, + vCenter: 238.4999771118164, + hCenter: 69.24147415161133, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 90, + top: 108, + height: 32, + width: 73.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 129.99288940429688, + bottom: 84.74502944946289, + vCenter: 105.24288940429688, + hCenter: 68.74502944946289, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 456, + top: 108, + height: 126, + width: 95.5, + title: '照片', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 216.75, + vCenter: 503.75, + hCenter: 153.75, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 108, + height: 32, + width: 51, + title: '姓名', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 79.5, + bottom: 85.99361419677734, + vCenter: 54.75, + hCenter: 69.99361419677734, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 139.5, + height: 32, + width: 97.5, + title: '申请职位', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 261, + bottom: 153.5, + vCenter: 212.25, + hCenter: 137.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 90, + top: 139.5, + height: 32, + width: 73.5, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129.99288940429688, + bottom: 84.74502944946289, + vCenter: 105.24288940429688, + hCenter: 68.74502944946289, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 261, + top: 139.5, + height: 32, + width: 195, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 494.2478713989258, + bottom: 116.74360275268555, + vCenter: 371.9978713989258, + hCenter: 100.74360275268555, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 139.5, + height: 32, + width: 51, + title: '学历', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 91.5, + bottom: 153.5, + vCenter: 66, + hCenter: 137.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 171, + height: 32, + width: 292.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 227.24571990966797, + bottom: 149.74573135375977, + vCenter: 190.49571990966797, + hCenter: 133.74573135375977, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 171, + height: 32, + width: 123, + title: '身份证号码', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 163.5, + bottom: 185, + vCenter: 102, + hCenter: 169, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 202.5, + height: 32, + width: 292.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 227.24571990966797, + bottom: 149.74573135375977, + vCenter: 190.49571990966797, + hCenter: 133.74573135375977, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 202.5, + height: 32, + width: 123, + title: '现居地址', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 163.5, + bottom: 216.5, + vCenter: 102, + hCenter: 200.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 234, + height: 32, + width: 388, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 227.24571990966797, + bottom: 149.74573135375977, + vCenter: 190.49571990966797, + hCenter: 133.74573135375977, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 234, + height: 32, + width: 123, + title: '婚姻状况', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 163.5, + bottom: 248, + vCenter: 102, + hCenter: 232, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 180, + top: 241.5, + height: 17, + width: 17, + coordinateSync: false, + widthHeightSync: true, + right: 196.25, + bottom: 242, + vCenter: 187.75, + hCenter: 233.5, + }, + printElementType: { title: '矩形', type: 'rect' }, + }, + { + options: { + left: 282, + top: 241.5, + height: 17, + width: 17, + coordinateSync: false, + widthHeightSync: true, + right: 196.25, + bottom: 242, + vCenter: 187.75, + hCenter: 233.5, + }, + printElementType: { title: '矩形', type: 'rect' }, + }, + { + options: { left: 210, top: 246, height: 13.5, width: 34.5, title: '未婚', coordinateSync: false, widthHeightSync: false, fontSize: 11.25 }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { left: 312, top: 246, height: 13.5, width: 34.5, title: '已婚', coordinateSync: false, widthHeightSync: false, fontSize: 11.25 }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 265.5, + height: 32, + width: 130, + title: '联系方式', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 279.5, + vCenter: 357.5, + hCenter: 263.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 162, + top: 265.5, + height: 32, + width: 132, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 292, + bottom: 279.5, + vCenter: 227, + hCenter: 263.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 265.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 279.5, + vCenter: 486.5, + hCenter: 263.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 265.5, + height: 32, + width: 123, + title: '健康状况', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 163.5, + bottom: 279.5, + vCenter: 102, + hCenter: 263.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 297, + height: 32, + width: 130, + title: '院校名称', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 311, + vCenter: 357.5, + hCenter: 295, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 297, + height: 32, + width: 130, + title: '起止日期', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 293.5, + bottom: 311, + vCenter: 228.5, + hCenter: 295, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 297, + height: 32, + width: 130, + title: '专业', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 311, + vCenter: 486.5, + hCenter: 295, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 297, + height: 126, + width: 123, + title: '教育经历', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 164.24146270751953, + bottom: 392.24573135375977, + vCenter: 102.74146270751953, + hCenter: 329.24573135375977, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 328.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 342.5, + vCenter: 357.5, + hCenter: 326.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 328.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 342.5, + vCenter: 486.5, + hCenter: 326.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 328.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 293.4978485107422, + bottom: 330.5000114440918, + vCenter: 228.4978485107422, + hCenter: 314.5000114440918, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 360, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 374, + vCenter: 357.5, + hCenter: 358, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 360, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 374, + vCenter: 486.5, + hCenter: 358, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 360, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 293.5, + bottom: 374, + vCenter: 228.5, + hCenter: 358, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 391.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 405.5, + vCenter: 357.5, + hCenter: 389.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 391.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 405.5, + vCenter: 486.5, + hCenter: 389.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 391.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 294.25, + bottom: 406.25, + vCenter: 229.25, + hCenter: 390.25, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 423, + height: 32, + width: 130, + title: '工作单位', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 437, + vCenter: 357.5, + hCenter: 421, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 423, + height: 32, + width: 130, + title: '起止日期', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 293.7471466064453, + bottom: 422.99500370025635, + vCenter: 228.7471466064453, + hCenter: 406.99500370025635, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 423, + height: 32, + width: 130, + title: '职位', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 437, + vCenter: 486.5, + hCenter: 421, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 423, + height: 126, + width: 123, + title: '工作经历', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 152.49288940429688, + bottom: 275.9950294494629, + vCenter: 90.99288940429688, + hCenter: 259.9950294494629, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 454.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 468.5, + vCenter: 357.5, + hCenter: 452.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 454.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 468.5, + vCenter: 486.5, + hCenter: 452.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 454.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 293.5, + bottom: 468.5, + vCenter: 228.5, + hCenter: 452.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 486, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 500, + vCenter: 357.5, + hCenter: 484, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 486, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 500, + vCenter: 486.5, + hCenter: 484, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 486, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 293.5, + bottom: 500, + vCenter: 228.5, + hCenter: 484, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 292.5, + top: 517.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 422.5, + bottom: 531.5, + vCenter: 357.5, + hCenter: 515.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 517.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 531.5, + vCenter: 486.5, + hCenter: 515.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 517.5, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 293.5, + bottom: 531.5, + vCenter: 228.5, + hCenter: 515.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 163.5, + top: 549, + height: 32, + width: 388, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 563, + vCenter: 357.5, + hCenter: 547, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 549, + height: 32, + width: 123, + title: '奖励或专业证书', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 163.5, + bottom: 563, + vCenter: 102, + hCenter: 547, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 210, + top: 580.5, + height: 32, + width: 85, + title: '能否出差', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 295, + bottom: 594.5, + vCenter: 252.5, + hCenter: 578.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 294, + top: 580.5, + height: 32, + width: 85, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 379, + bottom: 594.5, + vCenter: 336.5, + hCenter: 578.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 378, + top: 580.5, + height: 32, + width: 85, + title: '能否接受调动', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 463, + bottom: 594.5, + vCenter: 420.5, + hCenter: 578.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 126, + top: 580.5, + height: 32, + width: 85, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 211, + bottom: 594.5, + vCenter: 168.5, + hCenter: 578.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 462, + top: 580.5, + height: 32, + width: 89, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 551, + bottom: 594.5, + vCenter: 506.5, + hCenter: 578.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 580.5, + height: 32, + width: 86, + title: '能否加班', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 126.5, + bottom: 594.5, + vCenter: 83.5, + hCenter: 578.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 294, + top: 612, + height: 32, + width: 127.5, + title: '联系方式', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 424, + bottom: 626, + vCenter: 359, + hCenter: 610, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + zIndex: 99, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 162, + top: 612, + height: 32, + width: 132, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + qrCodeLevel: 0, + right: 292, + bottom: 279.5, + vCenter: 227, + hCenter: 263.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 421.5, + top: 612, + height: 32, + width: 130, + title: '', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 551.5, + bottom: 279.5, + vCenter: 486.5, + hCenter: 263.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 612, + height: 32, + width: 123, + title: '健康状况', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 163.5, + bottom: 279.5, + vCenter: 102, + hCenter: 263.5, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 643.5, + height: 127.5, + width: 511, + right: 129, + bottom: 739.5, + vCenter: 84, + hCenter: 694.5, + coordinateSync: false, + widthHeightSync: false, + }, + printElementType: { title: '矩形', type: 'rect' }, + }, + { + options: { + left: 52.5, + top: 660, + height: 66, + width: 486, + title: + ' 本人承诺:以上所填信息全部属实,并已经与前用人单位解除劳动合同,如与事实不符,个人愿无条件接受公司处罚甚至辞退,并愿负全部责任。入职后服从公司工作安排,遵守公司各项规章制度。', + coordinateSync: false, + widthHeightSync: false, + fontSize: 11.25, + lineHeight: 21, + longTextIndent: 24, + right: 538.5, + bottom: 709.5, + vCenter: 295.5, + hCenter: 685.5, + }, + printElementType: { title: '长文本', type: 'longText' }, + }, + { + options: { + left: 301.5, + top: 750, + height: 13.5, + width: 63, + title: '签名确认:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 366, + bottom: 763.5, + vCenter: 334.5, + hCenter: 756.75, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 438, + top: 750, + height: 13.5, + width: 63, + title: '日期:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 486, + bottom: 762.75, + vCenter: 454.5, + hCenter: 756, + }, + printElementType: { title: '文本', type: 'text' }, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/template/template2.ts b/src/components/PrintDesign/PrintDesign/template/template2.ts new file mode 100644 index 0000000..5f86075 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/template2.ts @@ -0,0 +1,542 @@ +export default [ + { + options: { + left: 235.5, + top: 31.5, + height: 28.5, + width: 120, + title: '培训记录', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 21.75, + fontWeight: 'bold', + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 352.5000228881836, + bottom: 54, + vCenter: 292.5000228881836, + hCenter: 39.75, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 444, + top: 81, + height: 12, + width: 120, + title: '编号:', + coordinateSync: false, + widthHeightSync: false, + fontSize: 11.25, + right: 563.2500228881836, + bottom: 92.25, + vCenter: 503.2500228881836, + hCenter: 86.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 129, + top: 100.5, + height: 32, + width: 435, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 296.25, + bottom: 111.5, + vCenter: 212.25, + hCenter: 95.5, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 100.5, + height: 32, + width: 99, + title: '培训主题', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 121.5, + bottom: 105, + vCenter: 75.75, + hCenter: 93, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 129, + top: 132, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 565.74609375, + bottom: 177.74609375, + vCenter: 348.24609375, + hCenter: 161.74609375, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 297, + top: 132, + height: 32, + width: 99, + title: '主讲师', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 395.99219512939453, + bottom: 163.99219512939453, + vCenter: 346.49219512939453, + hCenter: 147.99219512939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 396, + top: 132, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 566.49609375, + bottom: 173.99609375, + vCenter: 482.49609375, + hCenter: 157.99609375, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 132, + height: 32, + width: 99, + title: '培训时间', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129, + bottom: 163.99219512939453, + vCenter: 79.5, + hCenter: 147.99219512939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 129, + top: 162, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 296.9974136352539, + bottom: 195.48958587646484, + vCenter: 212.9974136352539, + hCenter: 179.48958587646484, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 162, + height: 32, + width: 99, + title: '培训地点', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129, + bottom: 195.48958587646484, + vCenter: 79.5, + hCenter: 179.48958587646484, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 127.5, + top: 223.5, + height: 81, + width: 436.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 560.9921951293945, + bottom: 319.48959732055664, + vCenter: 343.49219512939453, + hCenter: 278.98959732055664, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 225, + height: 79.5, + width: 99, + title: '培训目的', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 127.48958587646484, + bottom: 319.5000114440918, + vCenter: 77.98958587646484, + hCenter: 279.7500114440918, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 127.5, + top: 304.5, + height: 289.5, + width: 436.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 562.5000228881836, + bottom: 608.9922180175781, + vCenter: 345.0000228881836, + hCenter: 464.2422180175781, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 304.5, + height: 289.5, + width: 99, + title: '培训内容摘要', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129, + bottom: 563.9921951293945, + vCenter: 79.5, + hCenter: 419.24219512939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 127.5, + top: 592.5, + height: 111, + width: 435, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 562.5000228881836, + bottom: 718.5000457763672, + vCenter: 345.0000228881836, + hCenter: 663.0000457763672, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 594, + height: 109.5, + width: 99, + title: '考评情况', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 127.48958587646484, + bottom: 718.4974365234375, + vCenter: 77.98958587646484, + hCenter: 663.7474365234375, + fontSize: 11.25, + zIndex: 99, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 127.5, + top: 703.5, + height: 80, + width: 435, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 563.9974136352539, + bottom: 753.0000457763672, + vCenter: 346.4974136352539, + hCenter: 714.0000457763672, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 703.5, + height: 80, + width: 99, + title: '备注', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 127.48958587646484, + bottom: 798.4896087646484, + vCenter: 77.98958587646484, + hCenter: 758.4896087646484, + fontSize: 11.25, + zIndex: 99, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 297, + top: 162, + height: 32, + width: 99, + title: '记录人', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 394.49219512939453, + bottom: 192.49219512939453, + vCenter: 344.99219512939453, + hCenter: 176.49219512939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 396, + top: 162, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 566.49609375, + bottom: 173.99609375, + vCenter: 482.49609375, + hCenter: 157.99609375, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 129, + top: 193.5, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 563.9974136352539, + bottom: 195.48958587646484, + vCenter: 346.4974136352539, + hCenter: 179.48958587646484, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 193.5, + height: 32, + width: 99, + title: '参加人数', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 127.4974136352539, + bottom: 225.48958587646484, + vCenter: 77.9974136352539, + hCenter: 209.48958587646484, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 297, + top: 193.5, + height: 32, + width: 99, + title: '实到人数', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 395.99219512939453, + bottom: 225.48958587646484, + vCenter: 346.49219512939453, + hCenter: 209.48958587646484, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 396, + top: 193.5, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 566.49609375, + bottom: 173.99609375, + vCenter: 482.49609375, + hCenter: 157.99609375, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 442.5, + top: 790.5, + height: 12, + width: 120, + title: '记录人签字:', + coordinateSync: false, + widthHeightSync: false, + fontSize: 11.25, + right: 563.9974136352539, + bottom: 802.4922180175781, + vCenter: 503.9974136352539, + hCenter: 796.4922180175781, + }, + printElementType: { title: '文本', type: 'text' }, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/template/template3.ts b/src/components/PrintDesign/PrintDesign/template/template3.ts new file mode 100644 index 0000000..217c26a --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/template3.ts @@ -0,0 +1,396 @@ +export default [ + { + options: { + left: 235.5, + top: 18, + height: 33, + width: 120, + title: '劳动合同', + coordinateSync: false, + widthHeightSync: false, + fontSize: 21, + fontWeight: 'bold', + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 353.99571990966797, + bottom: 42.743614196777344, + vCenter: 293.99571990966797, + hCenter: 26.243614196777344, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 73.5, + height: 16.5, + width: 213, + title: '甲方(用人单位):', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 257.99146270751953, + bottom: 65.24574279785156, + vCenter: 151.49146270751953, + hCenter: 56.99574279785156, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 321, + top: 73.5, + height: 16.5, + width: 213, + title: '法定代表人:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 257.99146270751953, + bottom: 65.24574279785156, + vCenter: 151.49146270751953, + hCenter: 56.99574279785156, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 321, + top: 105, + height: 16.5, + width: 213, + title: '身份证号码:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 258.2428894042969, + bottom: 85.74715805053711, + vCenter: 151.74288940429688, + hCenter: 77.49715805053711, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 105, + height: 16.5, + width: 213, + title: '乙方(职工):', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 258.2428894042969, + bottom: 85.74715805053711, + vCenter: 151.74288940429688, + hCenter: 77.49715805053711, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 130.5, + height: 64.5, + width: 496.5, + title: ' 根据(中华人民共和国劳动法》和相关法律、法规的规定,甲乙双方按照平等自愿、协商一致的原则订立本合同。\n一、合同期限\n', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + lineHeight: 18, + longTextIndent: 22.5, + right: 542.25, + bottom: 192.7473907470703, + vCenter: 294, + hCenter: 167.9973907470703, + }, + printElementType: { title: '长文本', type: 'longText' }, + }, + { + options: { + left: 208.5, + top: 180, + height: 24, + width: 93, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 298.74481201171875, + bottom: 201.98959350585938, + vCenter: 252.24481201171875, + hCenter: 189.98959350585938, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 87, + top: 180, + height: 24, + width: 93, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 180.23961639404297, + bottom: 202.75000762939453, + vCenter: 133.73961639404297, + hCenter: 190.75000762939453, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 181.5, + top: 187.5, + height: 15, + width: 27, + title: '起至', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textContentVerticalAlign: 'middle', + right: 205.4999771118164, + bottom: 170.24785995483398, + vCenter: 191.9999771118164, + hCenter: 162.74785995483398, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 69, + top: 187.5, + height: 15, + width: 16.5, + title: '至', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 304.5, + top: 187.5, + height: 15, + width: 27, + title: '止。', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textContentVerticalAlign: 'middle', + right: 330.2428665161133, + bottom: 171.24077224731445, + vCenter: 316.7428665161133, + hCenter: 163.74077224731445, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 45, + top: 208.5, + height: 478.5, + width: 496.5, + title: + '二、工作内容\n1.乙方的工作岗位为\n2.乙方的工作职责\n三、工作时间\n早九晚六,周末双休。\n四、工资待遇\n乙方正常工作时间的工资为\n五、劳动保护和劳动条件\n甲方按国家和省有关劳动保护规定提供符合国家劳动卫生标准的劳动作业场所,切实保护乙方在生产工作中的安全和健康。\n六、福利待遇\n甲方按规定给予乙方享受节日假、年休假、婚假、丧假、探亲假、产假、看护假等带薪假期,并按本合同约定的工资标准支付工资。\n七、合同的变更\n甲乙双方经协商一致,可以变更本合同,并办理变更本合同的手续。\n八、合同的解除\n经甲乙双方协商一致或有符合法律规定的情形可以解除本合同。\n九、合同的终止\n本合同期满或甲乙双方约定的本合同终止条件出现,本合同即行终止。\n十、劳动争议处理和违反劳动合同的法律责任\n本合同依法经双方签字或盖章订立后具有法律约束力,双方必须严格履行。如果发生劳动争议,双方可以协商解决,也可以依法申请调解、仲载、提起诉讼。任何一方违反本合同约定,应当承担相应的法律责任。\n十一、其他\n1、本合同一式两份,具有同等法律效力,甲乙双方各执一份,双方应妥善保管。\n2、本劳动合同自甲乙双方签字、盖章之日起生效。\n', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + lineHeight: 18, + longTextIndent: 22.5, + right: 539.98828125, + bottom: 811.48828125, + vCenter: 291.73828125, + hCenter: 515.23828125, + }, + printElementType: { title: '长文本', type: 'longText' }, + }, + { + options: { + left: 175.5, + top: 219, + height: 24, + width: 147, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 322.4948043823242, + bottom: 242.9973907470703, + vCenter: 248.99480438232422, + hCenter: 230.9973907470703, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 165, + top: 235.5, + height: 24, + width: 330, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 311.49478912353516, + bottom: 259.74739837646484, + vCenter: 237.99478912353516, + hCenter: 247.74739837646484, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 210, + top: 309, + height: 24, + width: 87, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 539.5000076293945, + bottom: 333.24478912353516, + vCenter: 374.50000762939453, + hCenter: 321.24478912353516, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 298.5, + top: 318, + height: 15, + width: 198, + title: '元/月,加班工资视情况另行协商。', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textContentVerticalAlign: 'middle', + right: 329.9999771118164, + bottom: 267.74573135375977, + vCenter: 316.4999771118164, + hCenter: 260.24573135375977, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 345, + top: 703.5, + height: 16.5, + width: 193.5, + title: '乙方:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 257.99146270751953, + bottom: 65.24574279785156, + vCenter: 151.49146270751953, + hCenter: 56.99574279785156, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 63, + top: 703.5, + height: 16.5, + width: 213, + title: '甲方:(盖章)', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 257.99146270751953, + bottom: 65.24574279785156, + vCenter: 151.49146270751953, + hCenter: 56.99574279785156, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 63, + top: 744, + height: 16.5, + width: 213, + title: '日期:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 260.99146270751953, + bottom: 639.7435684204102, + vCenter: 154.49146270751953, + hCenter: 631.4935684204102, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 345, + top: 744, + height: 16.5, + width: 193.5, + title: '日期:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 260.99146270751953, + bottom: 639.7435684204102, + vCenter: 154.49146270751953, + hCenter: 631.4935684204102, + }, + printElementType: { title: '文本', type: 'text' }, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/template/template4.ts b/src/components/PrintDesign/PrintDesign/template/template4.ts new file mode 100644 index 0000000..62ae355 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/template4.ts @@ -0,0 +1,440 @@ +export default [ + { + options: { + left: 232.5, + top: 31.5, + height: 28.5, + width: 120, + title: '工作证明', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 21, + fontWeight: 'bold', + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 355.5, + bottom: 48.75, + vCenter: 295.5, + hCenter: 34.5, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 411, + top: 108, + height: 24, + width: 42, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 453.24609375, + bottom: 130.74609375, + vCenter: 432.24609375, + hCenter: 118.74609375, + hideTitle: true, + fontSize: 15, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 312, + top: 108, + height: 24, + width: 42, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 446.99219512939453, + bottom: 132.74219512939453, + vCenter: 391.49219512939453, + hCenter: 120.74219512939453, + hideTitle: true, + fontSize: 15, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 177, + top: 108, + height: 24, + width: 85.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 288, + bottom: 131.25, + vCenter: 232.5, + hCenter: 119.25, + hideTitle: true, + fontSize: 15, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 451.5, + top: 112.5, + height: 16.5, + width: 93, + title: ',有效身份证', + right: 503.49609375, + bottom: 129.24609375, + vCenter: 477.24609375, + hCenter: 120.99609375, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 264, + top: 114, + height: 16.5, + width: 46.5, + title: ',性别', + right: 308.25, + bottom: 130.5, + vCenter: 290.25, + hCenter: 122.25, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + zIndex: 55, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 358.5, + top: 114, + height: 16.5, + width: 52.5, + title: ',年龄', + right: 373.5, + bottom: 127.5, + vCenter: 366, + hCenter: 119.25, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 70.5, + top: 115.5, + height: 16.5, + width: 106.5, + title: '兹有我单位员工', + right: 99, + bottom: 93, + vCenter: 73.5, + hCenter: 84.75, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 79.5, + top: 142.5, + height: 24, + width: 192, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 208.5, + bottom: 165, + vCenter: 144, + hCenter: 153, + hideTitle: true, + fontSize: 15, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 40.5, + top: 148.5, + height: 16.5, + width: 40.5, + title: '号码', + right: 86.25, + bottom: 141.75, + vCenter: 60.75, + hCenter: 133.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 439.5, + top: 172.5, + height: 24, + width: 106.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 526.74609375, + bottom: 193.74609375, + vCenter: 468.24609375, + hCenter: 181.74609375, + hideTitle: true, + fontSize: 15, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 286.5, + top: 172.5, + height: 24, + width: 117, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 450, + bottom: 154.5, + vCenter: 391.5, + hCenter: 142.5, + hideTitle: true, + fontSize: 15, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 90, + top: 174, + height: 24, + width: 100.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 205.5, + bottom: 189, + vCenter: 157.5, + hCenter: 177, + hideTitle: true, + fontSize: 15, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 405, + top: 180, + height: 16.5, + width: 33, + title: '部门', + right: 436.5, + bottom: 195.75, + vCenter: 420, + hCenter: 187.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 192, + top: 180, + height: 16.5, + width: 94.5, + title: '起,在本单位', + right: 402.75, + bottom: 195, + vCenter: 296.25, + hCenter: 186.75, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 70.5, + top: 180, + height: 16.5, + width: 19.5, + title: '自', + right: 89.25, + bottom: 194.25, + vCenter: 79.5, + hCenter: 186, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 42, + top: 219, + height: 16.5, + width: 114, + title: '岗位任职至今。', + right: 107.25, + bottom: 234.75, + vCenter: 74.25, + hCenter: 226.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 70.5, + top: 255, + height: 16.5, + width: 94.5, + title: '特此证明!', + right: 168, + bottom: 369.75, + vCenter: 120.75, + hCenter: 361.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 42, + top: 282, + height: 61.5, + width: 504, + title: '声明:此证明仅用于证明该员工是我公司员工,不作为我公司对该员工任何形势的担保文件。\n\n\n', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textAlign: 'left', + lineHeight: 32.25, + right: 545.25, + bottom: 348.75, + vCenter: 293.25, + hCenter: 318, + longTextIndent: 27, + }, + printElementType: { title: '长文本', type: 'longText' }, + }, + { + options: { + left: 408, + top: 429, + height: 16.5, + width: 135, + title: '公司名称(盖章)', + right: 538.4978713989258, + bottom: 414.7499713897705, + vCenter: 470.9978713989258, + hCenter: 406.4999713897705, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 408, + top: 465, + height: 16.5, + width: 135, + title: '年 月 日', + right: 540.9907608032227, + bottom: 449.49290657043457, + vCenter: 473.49076080322266, + hCenter: 441.24290657043457, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + textAlign: 'right', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 271.5, + top: 148.5, + height: 16.5, + width: 40.5, + title: '。', + right: 312, + bottom: 165, + vCenter: 291.75, + hCenter: 156.75, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 15, + textContentVerticalAlign: 'middle', + }, + printElementType: { title: '文本', type: 'text' }, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/template/template5.ts b/src/components/PrintDesign/PrintDesign/template/template5.ts new file mode 100644 index 0000000..bb9f6a5 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/template5.ts @@ -0,0 +1,499 @@ +export default [ + { + options: { + left: 205.5, + top: 39, + height: 33, + width: 190.5, + title: '解除劳动合同协议', + coordinateSync: false, + widthHeightSync: false, + fontSize: 21, + fontWeight: 'bold', + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 396, + bottom: 51, + vCenter: 300.75, + hCenter: 34.5, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 94.5, + height: 16.5, + width: 213, + title: '甲方(用人单位):', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 257.99146270751953, + bottom: 65.24574279785156, + vCenter: 151.49146270751953, + hCenter: 56.99574279785156, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 321, + top: 94.5, + height: 16.5, + width: 213, + title: '法定代表人:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 257.99146270751953, + bottom: 65.24574279785156, + vCenter: 151.49146270751953, + hCenter: 56.99574279785156, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 321, + top: 126, + height: 16.5, + width: 213, + title: '身份证号码:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 258.2428894042969, + bottom: 85.74715805053711, + vCenter: 151.74288940429688, + hCenter: 77.49715805053711, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 126, + height: 16.5, + width: 213, + title: '乙方(职工):', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 258.2428894042969, + bottom: 85.74715805053711, + vCenter: 151.74288940429688, + hCenter: 77.49715805053711, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 157.5, + height: 384, + width: 487.5, + title: + '依据《劳动合同法》第三十六条的相关规定,在平等自愿的基础上,经甲乙双方协商一致解除劳动合同关系,达成如下协议:\n一、双方一致同意于\n二、乙方应按照公司离职规定办理工作交接及离职手续。\n三、乙方薪资结算至\n四、甲方为乙方缴纳的社会保险及公积金至\n五、 甲方同意向乙方支付经济补偿金共计人民币\n\n\n六、乙方承诺:\n1、已确认与甲方就结算数据达成一致,自收到上述款项后,在甲方劳动关系存续之间的全部工资待遇(包括但不限于工资、奖金、福利、津贴、补贴、加班费、社保公积金、经济补偿金)等全部权利义务均已结清,双方再无任何争议。\n2、乙方承诺不再对本协议内容及与甲方的劳动关系事项提出任何仲裁、诉讼请求或者其它要求。乙方放弃以任何形式向甲方主张任何权利。\n3、乙方离开甲方后,不得向任何第三方泄漏甲方的商业秘密(包括甲方客户的商业秘密、信息),不从事任何损害甲方利益和名誉的活动。如乙方违反上述承诺,将承担相应的法律责任及赔偿给甲方所造成的全部损失。\n七、任何一方均不得向第三方泄露本协议书的内容。否则对方有权追究泄秘方的法律和经济赔偿责任。\n八、本协议一式二份,甲、乙双方各执一份,自甲、乙双方签字、盖章生效。\n', + right: 534, + bottom: 553.5, + vCenter: 290.25, + hCenter: 345, + coordinateSync: false, + widthHeightSync: false, + fontSize: 11.25, + lineHeight: 18, + longTextIndent: 22.5, + fontFamily: 'SimSun', + }, + printElementType: { title: '长文本', type: 'longText' }, + }, + { + options: { + left: 300, + top: 198, + height: 13.5, + width: 231, + title: '解除劳动合同,双方的劳动权利义务终止。', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 530.25, + bottom: 180.75, + vCenter: 414.75, + hCenter: 174, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 174, + top: 198, + height: 12, + width: 120, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + fontSize: 12, + borderBottom: 'solid', + right: 295.5, + bottom: 179.25, + vCenter: 235.5, + hCenter: 174.375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 336, + top: 232.5, + height: 12, + width: 120, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + fontSize: 12, + borderBottom: 'solid', + right: 454.74609375, + bottom: 224.49609375, + vCenter: 394.74609375, + hCenter: 218.49609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 298.5, + top: 232.5, + height: 13.5, + width: 37.5, + title: ',将于', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 530.25, + bottom: 180.75, + vCenter: 414.75, + hCenter: 174, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 460.5, + top: 232.5, + height: 13.5, + width: 37.5, + title: '发放。', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 497.49609375, + bottom: 225.99609375, + vCenter: 478.74609375, + hCenter: 219.24609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 174, + top: 232.5, + height: 12, + width: 120, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + fontSize: 12, + borderBottom: 'solid', + right: 293.25, + bottom: 222.75, + vCenter: 233.25, + hCenter: 216.75, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 411, + top: 252, + height: 13.5, + width: 37.5, + title: '。', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 448.74609375, + bottom: 244.74609375, + vCenter: 429.99609375, + hCenter: 237.99609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 288, + top: 252, + height: 12, + width: 120, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + fontSize: 12, + borderBottom: 'solid', + right: 407.49609375, + bottom: 243.24609375, + vCenter: 347.49609375, + hCenter: 237.24609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 441, + top: 268.5, + height: 12, + width: 60, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + fontSize: 12, + borderBottom: 'solid', + right: 499.5, + bottom: 261, + vCenter: 469.5, + hCenter: 255, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 319.5, + top: 270, + height: 12, + width: 50, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + fontSize: 12, + borderBottom: 'solid', + right: 435.24609375, + bottom: 261.24609375, + vCenter: 375.24609375, + hCenter: 255.24609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 369, + top: 270, + height: 13.5, + width: 72, + title: '元,(大写:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 441.99609375, + bottom: 260.49609375, + vCenter: 423.24609375, + hCenter: 253.74609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 501, + top: 270, + height: 13.5, + width: 37.5, + title: '整),', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 539.25, + bottom: 261.75, + vCenter: 521.25, + hCenter: 255, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 285, + top: 286.5, + height: 12, + width: 112, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + fontSize: 12, + borderBottom: 'solid', + right: 429.24609375, + bottom: 279.99609375, + vCenter: 369.24609375, + hCenter: 273.99609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 399, + top: 286.5, + height: 13.5, + width: 135, + title: '一次性支付给乙方,乙方', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 502.5, + bottom: 282, + vCenter: 467.25, + hCenter: 275.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 286.5, + height: 13.5, + width: 240, + title: '在乙方完成工作交接并办理完离职手续后,于', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 309, + bottom: 279, + vCenter: 177.75, + hCenter: 272.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 304.5, + height: 13.5, + width: 99, + title: '予以接受。', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + right: 150.99609375, + bottom: 302.49609375, + vCenter: 99.24609375, + hCenter: 295.74609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 330, + top: 583.5, + height: 16.5, + width: 204, + title: '乙方:(签名)', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 543, + bottom: 585.75, + vCenter: 436.5, + hCenter: 577.5, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 48, + top: 583.5, + height: 16.5, + width: 213, + title: '甲方:(盖章)', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 257.99146270751953, + bottom: 65.24574279785156, + vCenter: 151.49146270751953, + hCenter: 56.99574279785156, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 48, + top: 624, + height: 16.5, + width: 213, + title: '日期:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 420.75, + bottom: 615, + vCenter: 324, + hCenter: 606.75, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 330, + top: 624, + height: 16.5, + width: 202.5, + title: '日期:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 260.99146270751953, + bottom: 639.7435684204102, + vCenter: 154.49146270751953, + hCenter: 631.4935684204102, + }, + printElementType: { title: '文本', type: 'text' }, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/template/template6.ts b/src/components/PrintDesign/PrintDesign/template/template6.ts new file mode 100644 index 0000000..c657ff5 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/template6.ts @@ -0,0 +1,1590 @@ +export default [ + { + options: { + left: 235.5, + top: 18, + height: 33, + width: 120, + title: '采购合同', + coordinateSync: false, + widthHeightSync: false, + fontSize: 21, + fontWeight: 'bold', + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 353.99571990966797, + bottom: 42.743614196777344, + vCenter: 293.99571990966797, + hCenter: 26.243614196777344, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 72, + height: 16.5, + width: 493.5, + title: '甲方(需方):', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 257.99146270751953, + bottom: 65.24574279785156, + vCenter: 151.49146270751953, + hCenter: 56.99574279785156, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 105, + height: 16.5, + width: 495, + title: '乙方(供方):', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 258.2428894042969, + bottom: 85.74715805053711, + vCenter: 151.74288940429688, + hCenter: 77.49715805053711, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 130.5, + height: 54, + width: 495, + title: + ' 根据(中华人民共和国合同法》、《中华人民共和国政府采购法》等相关法律法规的规定,甲乙双方协商一致,签订本合同。\n一、设备名称、规格质量、数量及金额(含运输、装卸等相关费用)\n', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + lineHeight: 18, + longTextIndent: 22.5, + right: 543, + bottom: 195, + vCenter: 294.75, + hCenter: 162.75, + }, + printElementType: { title: '长文本', type: 'longText' }, + }, + { + options: { + left: 178.5, + top: 184.5, + height: 32, + width: 102, + title: '规格及质量要求', + right: 114.75, + bottom: 224, + vCenter: 81.75, + hCenter: 208, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 279, + top: 184.5, + height: 32, + width: 66, + title: '单位', + right: 344.25, + bottom: 224, + vCenter: 311.25, + hCenter: 208, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 184.5, + height: 32, + width: 66, + title: '数量', + right: 177.24609375, + bottom: 222.74609375, + vCenter: 144.24609375, + hCenter: 206.74609375, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 409.5, + top: 184.5, + height: 32, + width: 66, + title: '单价/元', + right: 477, + bottom: 223.25, + vCenter: 444, + hCenter: 207.25, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 184.5, + height: 32, + width: 66, + title: '名称', + right: 175.5000228881836, + bottom: 216.49219512939453, + vCenter: 142.5000228881836, + hCenter: 200.49219512939453, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 475.5, + top: 184.5, + height: 32, + width: 66, + title: '小计(元)', + right: 541.5, + bottom: 224, + vCenter: 508.5, + hCenter: 208, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 184.5, + height: 32, + width: 67.5, + title: '序号', + right: 113.9974136352539, + bottom: 216.49219512939453, + vCenter: 80.2474136352539, + hCenter: 200.49219512939453, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 216, + height: 32, + width: 66, + title: ' ', + right: 411, + bottom: 248, + vCenter: 378, + hCenter: 232, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 279, + top: 216, + height: 32, + width: 66, + title: ' ', + right: 344.25, + bottom: 224, + vCenter: 311.25, + hCenter: 208, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 178.5, + top: 216, + height: 32, + width: 102, + title: ' ', + right: 280.5, + bottom: 248, + vCenter: 229.5, + hCenter: 232, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 409.5, + top: 216, + height: 32, + width: 66, + title: ' ', + right: 477, + bottom: 223.25, + vCenter: 444, + hCenter: 207.25, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 216, + height: 32, + width: 66, + title: ' ', + right: 178.5, + bottom: 248, + vCenter: 145.5, + hCenter: 232, + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 475.5, + top: 216, + height: 32, + width: 66, + title: ' ', + right: 543, + bottom: 248, + vCenter: 510, + hCenter: 232, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 216, + height: 32, + width: 67.5, + title: '1', + right: 114.75, + bottom: 224, + vCenter: 81.75, + hCenter: 208, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 279, + top: 247.5, + height: 32, + width: 66, + title: ' ', + right: 345, + bottom: 279.5, + vCenter: 312, + hCenter: 263.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 247.5, + height: 32, + width: 66, + title: ' ', + right: 411, + bottom: 279.5, + vCenter: 378, + hCenter: 263.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 178.5, + top: 247.5, + height: 32, + width: 102, + title: ' ', + right: 280.5, + bottom: 279.5, + vCenter: 229.5, + hCenter: 263.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 409.5, + top: 247.5, + height: 32, + width: 66, + title: ' ', + right: 477, + bottom: 279.5, + vCenter: 444, + hCenter: 263.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 247.5, + height: 32, + width: 66, + title: ' ', + right: 177.24609375, + bottom: 222.74609375, + vCenter: 144.24609375, + hCenter: 206.74609375, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 475.5, + top: 247.5, + height: 32, + width: 66, + title: ' ', + right: 543, + bottom: 279.5, + vCenter: 510, + hCenter: 263.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 247.5, + height: 32, + width: 67.5, + title: '2', + right: 114.75, + bottom: 224, + vCenter: 81.75, + hCenter: 208, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 279, + top: 279, + height: 32, + width: 66, + title: ' ', + right: 345, + bottom: 311, + vCenter: 312, + hCenter: 295, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 279, + height: 32, + width: 66, + title: ' ', + right: 411, + bottom: 311, + vCenter: 378, + hCenter: 295, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 178.5, + top: 279, + height: 32, + width: 102, + title: ' ', + right: 280.5, + bottom: 311, + vCenter: 229.5, + hCenter: 295, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 409.5, + top: 279, + height: 32, + width: 66, + title: ' ', + right: 477, + bottom: 311, + vCenter: 444, + hCenter: 295, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 279, + height: 32, + width: 66, + title: ' ', + right: 178.5, + bottom: 311, + vCenter: 145.5, + hCenter: 295, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 475.5, + top: 279, + height: 32, + width: 66, + title: ' ', + right: 543, + bottom: 311, + vCenter: 510, + hCenter: 295, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 279, + height: 32, + width: 67.5, + title: '3', + right: 114.75, + bottom: 224, + vCenter: 81.75, + hCenter: 208, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 279, + top: 310.5, + height: 32, + width: 66, + title: ' ', + right: 345, + bottom: 342.5, + vCenter: 312, + hCenter: 326.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 310.5, + height: 32, + width: 66, + title: ' ', + right: 411, + bottom: 342.5, + vCenter: 378, + hCenter: 326.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 178.5, + top: 310.5, + height: 32, + width: 102, + title: ' ', + right: 280.5, + bottom: 342.5, + vCenter: 229.5, + hCenter: 326.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 409.5, + top: 310.5, + height: 32, + width: 66, + title: ' ', + right: 477, + bottom: 342.5, + vCenter: 444, + hCenter: 326.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 310.5, + height: 32, + width: 66, + title: ' ', + right: 178.5, + bottom: 342.5, + vCenter: 145.5, + hCenter: 326.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 475.5, + top: 310.5, + height: 32, + width: 66, + title: ' ', + right: 543, + bottom: 342.5, + vCenter: 510, + hCenter: 326.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 310.5, + height: 32, + width: 67.5, + title: '4', + right: 112.5, + bottom: 342.5, + vCenter: 79.5, + hCenter: 326.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 279, + top: 342, + height: 32, + width: 66, + title: ' ', + right: 345, + bottom: 374, + vCenter: 312, + hCenter: 358, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 342, + height: 32, + width: 66, + title: ' ', + right: 411, + bottom: 374, + vCenter: 378, + hCenter: 358, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 178.5, + top: 342, + height: 32, + width: 102, + title: ' ', + right: 280.5, + bottom: 374, + vCenter: 229.5, + hCenter: 358, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 409.5, + top: 342, + height: 32, + width: 66, + title: ' ', + right: 477, + bottom: 374, + vCenter: 444, + hCenter: 358, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 342, + height: 32, + width: 66, + title: ' ', + right: 178.5, + bottom: 374, + vCenter: 145.5, + hCenter: 358, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 475.5, + top: 342, + height: 32, + width: 66, + title: ' ', + right: 543, + bottom: 374, + vCenter: 510, + hCenter: 358, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 342, + height: 32, + width: 67.5, + title: '5', + right: 112.5, + bottom: 374, + vCenter: 79.5, + hCenter: 358, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 279, + top: 373.5, + height: 32, + width: 66, + title: ' ', + right: 345, + bottom: 405.5, + vCenter: 312, + hCenter: 389.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 373.5, + height: 32, + width: 66, + title: ' ', + right: 411, + bottom: 405.5, + vCenter: 378, + hCenter: 389.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 178.5, + top: 373.5, + height: 32, + width: 102, + title: ' ', + right: 280.5, + bottom: 405.5, + vCenter: 229.5, + hCenter: 389.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 409.5, + top: 373.5, + height: 32, + width: 66, + title: ' ', + right: 477, + bottom: 405.5, + vCenter: 444, + hCenter: 389.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 373.5, + height: 32, + width: 66, + title: ' ', + right: 178.5, + bottom: 405.5, + vCenter: 145.5, + hCenter: 389.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 475.5, + top: 373.5, + height: 32, + width: 66, + title: ' ', + right: 543, + bottom: 405.5, + vCenter: 510, + hCenter: 389.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 373.5, + height: 32, + width: 67.5, + title: '6', + right: 112.5, + bottom: 405.5, + vCenter: 79.5, + hCenter: 389.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 178.5, + top: 405, + height: 32, + width: 102, + title: ' ', + right: 280.5, + bottom: 437, + vCenter: 229.5, + hCenter: 421, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 279, + top: 405, + height: 32, + width: 66, + title: ' ', + right: 345, + bottom: 437, + vCenter: 312, + hCenter: 421, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 405, + height: 32, + width: 66, + title: ' ', + right: 411, + bottom: 437, + vCenter: 378, + hCenter: 421, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 409.5, + top: 405, + height: 32, + width: 66, + title: ' ', + right: 477, + bottom: 437, + vCenter: 444, + hCenter: 421, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 405, + height: 32, + width: 66, + title: ' ', + right: 178.5, + bottom: 437, + vCenter: 145.5, + hCenter: 421, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 475.5, + top: 405, + height: 32, + width: 66, + title: ' ', + right: 541.4974136352539, + bottom: 437, + vCenter: 508.4974136352539, + hCenter: 421, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 405, + height: 32, + width: 67.5, + title: '7', + right: 112.5, + bottom: 437, + vCenter: 79.5, + hCenter: 421, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 112.5, + top: 436.5, + height: 32, + width: 231, + title: '(小写)', + right: 180.75, + bottom: 468.5, + vCenter: 147.75, + hCenter: 452.5, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 343.5, + top: 436.5, + height: 32, + width: 198, + title: '(大写)', + right: 539.5000228881836, + bottom: 467.7473907470703, + vCenter: 441.5000228881836, + hCenter: 451.7473907470703, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 436.5, + height: 32, + width: 67.5, + title: '合计', + right: 113.9974136352539, + bottom: 468.4973907470703, + vCenter: 80.2474136352539, + hCenter: 452.4973907470703, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 481.5, + height: 135, + width: 495, + title: + '二、交货。时间、地点、方式:\n三、验收。交货时由需方验收,验收标准:\n四、付款。验收合格后,一次性付清款项。\n五、违规责任:\n六、因合同执行而产生问题的解决方式。1、当事人双方协商解决;2、向政府采购监督部门投诉;3、提请仲裁;4、向人民法院起诉。\n本合同一式三份,供方、需方、政府采购监督部门各执一份,具有同等法律效力。\n', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + lineHeight: 18, + longTextIndent: 22.5, + right: 543.24609375, + bottom: 524.49609375, + vCenter: 294.99609375, + hCenter: 497.49609375, + }, + printElementType: { title: '长文本', type: 'longText' }, + }, + { + options: { + left: 225, + top: 486, + height: 11.25, + width: 315, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + borderBottom: 'solid', + right: 345.75, + bottom: 496.5, + vCenter: 285.75, + hCenter: 490.875, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 280.5, + top: 502.5, + height: 11.25, + width: 261, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + borderBottom: 'solid', + right: 402.24609375, + bottom: 513.99609375, + vCenter: 342.24609375, + hCenter: 508.37109375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 147, + top: 538.5, + height: 11.25, + width: 394.5, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + hideTitle: true, + borderBottom: 'solid', + right: 405.24609375, + bottom: 549.99609375, + vCenter: 276.24609375, + hCenter: 544.37109375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 327, + top: 649.5, + height: 16.5, + width: 213, + title: '需方:(盖章)', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 540.24609375, + bottom: 702.99609375, + vCenter: 433.74609375, + hCenter: 694.74609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 649.5, + height: 16.5, + width: 213, + title: '供方:(盖章)', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 258.75, + bottom: 702, + vCenter: 152.25, + hCenter: 693.75, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 327, + top: 682.5, + height: 16.5, + width: 211.5, + title: '法人代表:(签名)', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 539.9921951293945, + bottom: 686.9948272705078, + vCenter: 433.49219512939453, + hCenter: 678.7448272705078, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 682.5, + height: 16.5, + width: 213, + title: '法人代表:(签名)', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 260.99146270751953, + bottom: 639.7435684204102, + vCenter: 154.49146270751953, + hCenter: 631.4935684204102, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 46.5, + top: 714, + height: 16.5, + width: 213, + title: '日期:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 256.74609375, + bottom: 766.74609375, + vCenter: 150.24609375, + hCenter: 758.49609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 327, + top: 714, + height: 16.5, + width: 211.5, + title: '日期:', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'left', + textContentVerticalAlign: 'middle', + right: 540, + bottom: 767.49609375, + vCenter: 433.5, + hCenter: 759.24609375, + }, + printElementType: { title: '文本', type: 'text' }, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/template/template7.ts b/src/components/PrintDesign/PrintDesign/template/template7.ts new file mode 100644 index 0000000..6a57763 --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/template7.ts @@ -0,0 +1,1355 @@ +export default [ + { + options: { + left: 163.5, + top: 39, + height: 28.5, + width: 264, + title: '办公用品请购审批单', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 21.75, + fontWeight: 'bold', + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 426.74219512939453, + bottom: 89.99479293823242, + vCenter: 294.74219512939453, + hCenter: 75.74479293823242, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 295.5, + top: 79.5, + height: 32, + width: 99, + title: '申请部门', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 395.99219512939453, + bottom: 163.99219512939453, + vCenter: 346.49219512939453, + hCenter: 147.99219512939453, + fontSize: 11.25, + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 127.5, + top: 79.5, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 297.7474136352539, + bottom: 163.24478149414062, + vCenter: 213.7474136352539, + hCenter: 147.24478149414062, + hideTitle: true, + borderTop: 'solid', + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 394.5, + top: 79.5, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 563.239631652832, + bottom: 162.49219512939453, + vCenter: 479.23963165283203, + hCenter: 146.49219512939453, + hideTitle: true, + borderTop: 'solid', + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 79.5, + height: 32, + width: 99, + title: '申请时间', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 130.5, + bottom: 161.74219512939453, + vCenter: 81, + hCenter: 145.74219512939453, + fontSize: 11.25, + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 295.5, + top: 111, + height: 32, + width: 99, + title: '期望供货日期', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 395.99219512939453, + bottom: 193.99219512939453, + vCenter: 346.49219512939453, + hCenter: 177.99219512939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 127.5, + top: 111, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 296.9974136352539, + bottom: 195.48958587646484, + vCenter: 212.9974136352539, + hCenter: 179.48958587646484, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 394.5, + top: 111, + height: 32, + width: 168, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 566.49609375, + bottom: 173.99609375, + vCenter: 482.49609375, + hCenter: 157.99609375, + hideTitle: true, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 111, + height: 32, + width: 99, + title: '申请人', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129, + bottom: 195.48958587646484, + vCenter: 79.5, + hCenter: 179.48958587646484, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 129, + top: 142.5, + height: 64, + width: 433.5, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 294.2395935058594, + bottom: 243.73959350585938, + vCenter: 210.98959350585938, + hCenter: 227.73959350585938, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 142.5, + height: 64, + width: 99, + title: '请购原因', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 128.25, + bottom: 273.49219512939453, + vCenter: 78.75, + hCenter: 257.49219512939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 181.5, + top: 205.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 276.7500228881836, + bottom: 259.99219512939453, + vCenter: 228.7500228881836, + hCenter: 243.99219512939453, + hideTitle: true, + title: '规格型号', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 276, + top: 205.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 566.49609375, + bottom: 173.99609375, + vCenter: 482.49609375, + hCenter: 157.99609375, + hideTitle: true, + title: '请购数量', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 370.5, + top: 205.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 461.24219512939453, + bottom: 258.49219512939453, + vCenter: 413.24219512939453, + hCenter: 242.49219512939453, + hideTitle: true, + title: '预算金额(元)', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 85.5, + top: 205.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 181.48828125, + bottom: 259.98828125, + vCenter: 133.48828125, + hCenter: 243.98828125, + hideTitle: true, + title: '物品名称', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 466.5, + top: 205.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 556.4974136352539, + bottom: 259.9948043823242, + vCenter: 508.4974136352539, + hCenter: 243.99480438232422, + hideTitle: true, + title: '备注', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 205.5, + height: 32, + width: 55.5, + title: '序号', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129, + bottom: 195.48958587646484, + vCenter: 79.5, + hCenter: 179.48958587646484, + fontSize: 11.25, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 181.5, + top: 237, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 277.4974136352539, + bottom: 291.49219512939453, + vCenter: 229.4974136352539, + hCenter: 275.49219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 276, + top: 237, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 372.73958587646484, + bottom: 290.74219512939453, + vCenter: 324.73958587646484, + hCenter: 274.74219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 370.5, + top: 237, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 466.4948043823242, + bottom: 291.49219512939453, + vCenter: 418.4948043823242, + hCenter: 275.49219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 85.5, + top: 237, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 181.49480438232422, + bottom: 291.49219512939453, + vCenter: 133.49480438232422, + hCenter: 275.49219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 466.5, + top: 237, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 556.4974136352539, + bottom: 259.9948043823242, + vCenter: 508.4974136352539, + hCenter: 243.99480438232422, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 237, + height: 32, + width: 55.5, + title: '1', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 85.5, + bottom: 291.49219512939453, + vCenter: 57.75, + hCenter: 275.49219512939453, + fontSize: 11.25, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 276, + top: 268.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 372.73958587646484, + bottom: 290.74219512939453, + vCenter: 324.73958587646484, + hCenter: 274.74219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 181.5, + top: 268.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 277.4974136352539, + bottom: 291.49219512939453, + vCenter: 229.4974136352539, + hCenter: 275.49219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 370.5, + top: 268.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 467.9948043823242, + bottom: 322.98960876464844, + vCenter: 419.9948043823242, + hCenter: 306.98960876464844, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 85.5, + top: 268.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 181.49480438232422, + bottom: 325.23960876464844, + vCenter: 133.49480438232422, + hCenter: 309.23960876464844, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 466.5, + top: 268.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 563.2474136352539, + bottom: 322.98960876464844, + vCenter: 515.2474136352539, + hCenter: 306.98960876464844, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 268.5, + height: 32, + width: 55.5, + title: '2', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 85.5, + bottom: 322.98960876464844, + vCenter: 57.75, + hCenter: 306.98960876464844, + fontSize: 11.25, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 181.5, + top: 300, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 277.4974136352539, + bottom: 291.49219512939453, + vCenter: 229.4974136352539, + hCenter: 275.49219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 276, + top: 300, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 372.73958587646484, + bottom: 290.74219512939453, + vCenter: 324.73958587646484, + hCenter: 274.74219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 370.5, + top: 300, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 467.9948043823242, + bottom: 322.98960876464844, + vCenter: 419.9948043823242, + hCenter: 306.98960876464844, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 85.5, + top: 300, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 181.49480438232422, + bottom: 325.23960876464844, + vCenter: 133.49480438232422, + hCenter: 309.23960876464844, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 466.5, + top: 300, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 563.2474136352539, + bottom: 322.98960876464844, + vCenter: 515.2474136352539, + hCenter: 306.98960876464844, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 300, + height: 32, + width: 55.5, + title: '3', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 85.5, + bottom: 354.5, + vCenter: 57.75, + hCenter: 338.5, + fontSize: 11.25, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 181.5, + top: 331.5, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 280.2421875, + bottom: 363.5, + vCenter: 232.2421875, + hCenter: 347.5, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 276, + top: 332, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 372.73958587646484, + bottom: 290.74219512939453, + vCenter: 324.73958587646484, + hCenter: 274.74219512939453, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 370.5, + top: 332, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 467.9948043823242, + bottom: 322.98960876464844, + vCenter: 419.9948043823242, + hCenter: 306.98960876464844, + hideTitle: true, + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 85.5, + top: 332, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 182.24480438232422, + bottom: 388.2473907470703, + vCenter: 134.24480438232422, + hCenter: 372.2473907470703, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 466.5, + top: 332, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 563.2474136352539, + bottom: 322.98960876464844, + vCenter: 515.2474136352539, + hCenter: 306.98960876464844, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 332, + height: 32, + width: 55.5, + title: '4', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 84, + bottom: 386.7473907470703, + vCenter: 56.25, + hCenter: 370.7473907470703, + fontSize: 11.25, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 181.5, + top: 363, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 277.4974136352539, + bottom: 291.49219512939453, + vCenter: 229.4974136352539, + hCenter: 275.49219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 276, + top: 363, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 372.73958587646484, + bottom: 290.74219512939453, + vCenter: 324.73958587646484, + hCenter: 274.74219512939453, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 370.5, + top: 363, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 467.2448043823242, + bottom: 416.7422180175781, + vCenter: 419.2448043823242, + hCenter: 400.7422180175781, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 85.5, + top: 363, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 182.24480438232422, + bottom: 388.2473907470703, + vCenter: 134.24480438232422, + hCenter: 372.2473907470703, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 466.5, + top: 363, + height: 32, + width: 96, + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 563.2474136352539, + bottom: 322.98960876464844, + vCenter: 515.2474136352539, + hCenter: 306.98960876464844, + hideTitle: true, + title: '', + fontFamily: 'SimSun', + fontSize: 11.25, + }, + printElementType: { title: '', type: 'text' }, + }, + { + options: { + left: 30, + top: 363, + height: 32, + width: 55.5, + title: '5', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 84, + bottom: 386.7473907470703, + vCenter: 56.25, + hCenter: 370.7473907470703, + fontSize: 11.25, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 370.5, + top: 394.5, + height: 32, + width: 192, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 552.7448043823242, + bottom: 448.9922180175781, + vCenter: 460.4948043823242, + hCenter: 432.9922180175781, + fontSize: 11.25, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 394.5, + height: 32, + width: 342, + title: '合计', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 85.5, + bottom: 448.9922180175781, + vCenter: 57.75, + hCenter: 432.9922180175781, + fontSize: 11.25, + fontFamily: 'SimSun', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 129, + top: 426, + height: 64, + width: 433.5, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 562.4974136352539, + bottom: 464.4948272705078, + vCenter: 345.7474136352539, + hCenter: 432.4948272705078, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 426, + height: 64, + width: 99, + title: '部门主管意见', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129, + bottom: 512.4896087646484, + vCenter: 79.5, + hCenter: 480.48960876464844, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 129, + top: 489, + height: 64, + width: 433.5, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 562.4974136352539, + bottom: 464.4948272705078, + vCenter: 345.7474136352539, + hCenter: 432.4948272705078, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 489, + height: 64, + width: 99, + title: '分管领导意见', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 127.75000762939453, + bottom: 465.49742126464844, + vCenter: 78.25000762939453, + hCenter: 433.49742126464844, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 129, + top: 552, + height: 64, + width: 433.5, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 561.2395935058594, + bottom: 494.0000305175781, + vCenter: 344.4895935058594, + hCenter: 462.0000305175781, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 552, + height: 64, + width: 99, + title: '行政部意见', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129, + bottom: 510.9922180175781, + vCenter: 79.5, + hCenter: 478.9922180175781, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 616, + height: 64, + width: 99, + title: '采购部意见', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 129, + bottom: 576.9948272705078, + vCenter: 79.5, + hCenter: 544.9948272705078, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 129, + top: 616, + height: 64, + width: 433.5, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 560.2474136352539, + bottom: 702.9974213242531, + vCenter: 343.4974136352539, + hCenter: 670.9974213242531, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 687, + height: 76.5, + width: 531, + title: '注:\n1、申请单必须经过完整流程审批方有效\n2、各项物料规则型号需标明清楚\n3、重要物资的申购需另附相关技术资料', + right: 561, + bottom: 764.2448272705078, + vCenter: 295.5, + hCenter: 725.9948272705078, + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + lineHeight: 18, + }, + printElementType: { title: '长文本', type: 'longText' }, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/template/template8.ts b/src/components/PrintDesign/PrintDesign/template/template8.ts new file mode 100644 index 0000000..90ffbbd --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/template/template8.ts @@ -0,0 +1,2002 @@ +export default [ + { + options: { + left: 30, + top: 48, + height: 52.5, + width: 534, + title: '费用报销单', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 21.75, + fontWeight: 'bold', + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 565.5, + bottom: 96.74218368530273, + vCenter: 298.5, + hCenter: 82.49218368530273, + backgroundColor: '#ffffff', + letterSpacing: 12, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 184.5, + top: 88.5, + height: 9, + width: 213, + borderWidth: 0.75, + right: 320.9948043823242, + bottom: 97.48958587646484, + vCenter: 253.49480438232422, + hCenter: 92.98958587646484, + }, + printElementType: { title: '横线', type: 'hline' }, + }, + { + options: { + left: 184.5, + top: 91.5, + height: 9, + width: 213, + borderWidth: 0.75, + right: 342.7448043823242, + bottom: 102, + vCenter: 263.9948043823242, + hCenter: 97.5, + }, + printElementType: { title: '横线', type: 'hline' }, + }, + { + options: { + left: 333, + top: 109.5, + height: 13.5, + width: 21, + title: '日', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 278.49478912353516, + bottom: 543.2395935058594, + vCenter: 267.99478912353516, + hCenter: 536.4895935058594, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 426, + top: 109.5, + height: 13.5, + width: 27, + title: 'NO: ', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + color: '#ff0000', + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 449.49739837646484, + bottom: 116.48959350585938, + vCenter: 438.99739837646484, + hCenter: 109.73959350585938, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 280.5, + top: 109.5, + height: 13.5, + width: 21, + title: '月', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 218.49481201171875, + bottom: 543.9895935058594, + vCenter: 207.99481201171875, + hCenter: 537.2395935058594, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 228, + top: 109.5, + height: 13.5, + width: 21, + title: '年', + coordinateSync: false, + widthHeightSync: false, + fontFamily: 'SimSun', + fontSize: 11.25, + textAlign: 'center', + textContentVerticalAlign: 'middle', + right: 272.9948043823242, + bottom: 544.4974365234375, + vCenter: 212.99480438232422, + hCenter: 537.7474365234375, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 453, + top: 121.5, + height: 9, + width: 111, + borderWidth: 0.75, + right: 563.9921951293945, + bottom: 124.49739074707031, + vCenter: 509.24219512939453, + hCenter: 119.99739074707031, + }, + printElementType: { title: '横线', type: 'hline' }, + }, + { + options: { + left: 294, + top: 132, + height: 32, + width: 132, + title: '所属部门', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 425.2474136352539, + bottom: 163.24219512939453, + vCenter: 359.2474136352539, + hCenter: 147.24219512939453, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 132, + height: 32, + width: 133.5, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 295.4948043823242, + bottom: 162.49478149414062, + vCenter: 228.74480438232422, + hCenter: 146.49478149414062, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 426, + top: 132, + height: 32, + width: 138, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 563.989631652832, + bottom: 132.49478149414062, + vCenter: 494.98963165283203, + hCenter: 116.49478149414062, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 132, + height: 32, + width: 132, + title: '申请人', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 161.2474136352539, + bottom: 163.99219512939453, + vCenter: 95.2474136352539, + hCenter: 147.99219512939453, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 354, + top: 162.5, + height: 32, + width: 210, + title: ' 金额', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 379.74222564697266, + bottom: 194.24478912353516, + vCenter: 364.74222564697266, + hCenter: 178.24478912353516, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 162.5, + height: 64, + width: 132, + title: '报销内容', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 291.74219512939453, + bottom: 225.24219512939453, + vCenter: 225.74219512939453, + hCenter: 193.24219512939453, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 93, + top: 162.5, + height: 64, + width: 69, + title: '费用项目', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 163.49480438232422, + bottom: 227.48958587646484, + vCenter: 128.99480438232422, + hCenter: 195.48958587646484, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 162.5, + height: 64, + width: 60, + title: ' 单据张数', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 353.2474136352539, + bottom: 227.48958587646484, + vCenter: 323.2474136352539, + hCenter: 195.48958587646484, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 162.5, + height: 64, + width: 63, + title: '序号', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 93.75, + bottom: 228.99219512939453, + vCenter: 62.25, + hCenter: 196.99219512939453, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 384, + top: 193.5, + height: 33, + width: 30, + title: ' 千', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 413.9974136352539, + bottom: 227, + vCenter: 398.9974136352539, + hCenter: 211, + fontSize: 11.25, + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 474, + top: 193.5, + height: 33, + width: 30, + title: ' 元', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 510.23961639404297, + bottom: 194.99478912353516, + vCenter: 495.23961639404297, + hCenter: 178.99478912353516, + fontSize: 11.25, + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 444, + top: 193.5, + height: 33, + width: 30, + title: ' 十', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 473.9974136352539, + bottom: 227, + vCenter: 458.9974136352539, + hCenter: 211, + fontSize: 11.25, + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 504, + top: 193.5, + height: 33, + width: 30, + title: ' 角', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 533.9974136352539, + bottom: 227, + vCenter: 518.9974136352539, + hCenter: 211, + fontSize: 11.25, + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 414, + top: 193.5, + height: 33, + width: 30, + title: ' 百', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 443.9974136352539, + bottom: 227, + vCenter: 428.9974136352539, + hCenter: 211, + fontSize: 11.25, + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 534, + top: 193.5, + height: 33, + width: 30, + title: ' 分', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 563.9974136352539, + bottom: 227, + vCenter: 548.9974136352539, + hCenter: 211, + fontSize: 11.25, + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 354, + top: 193.5, + height: 33, + width: 30, + title: ' 万', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 383.994140625, + bottom: 226.9892578125, + vCenter: 368.994140625, + hCenter: 210.4892578125, + fontSize: 11.25, + borderBottom: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 354, + top: 225, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 383.994140625, + bottom: 258.494140625, + vCenter: 368.994140625, + hCenter: 242.494140625, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 384, + top: 225, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 414.23961639404297, + bottom: 258.7395935058594, + vCenter: 399.23961639404297, + hCenter: 242.73959350585938, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 414, + top: 225, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 436.5000228881836, + bottom: 269, + vCenter: 421.5000228881836, + hCenter: 253, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 444, + top: 225, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 476.99219512939453, + bottom: 258.4973907470703, + vCenter: 461.99219512939453, + hCenter: 242.4973907470703, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 225, + height: 32, + width: 60, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 353.9974136352539, + bottom: 257, + vCenter: 323.9974136352539, + hCenter: 241, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 474, + top: 225, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 510.23961639404297, + bottom: 194.99478912353516, + vCenter: 495.23961639404297, + hCenter: 178.99478912353516, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 225, + height: 32, + width: 132, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 294.74219512939453, + bottom: 257.7473907470703, + vCenter: 228.74219512939453, + hCenter: 241.7473907470703, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 504, + top: 225, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 533.489616394043, + bottom: 259.4895935058594, + vCenter: 518.489616394043, + hCenter: 243.48959350585938, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 93, + top: 225, + height: 32, + width: 69, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 191.9974136352539, + bottom: 197.73958587646484, + vCenter: 142.4974136352539, + hCenter: 181.73958587646484, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 534, + top: 225, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 563.489616394043, + bottom: 260.2395935058594, + vCenter: 548.489616394043, + hCenter: 244.23959350585938, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 225, + height: 32, + width: 64.5, + title: ' 1', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 94.5, + bottom: 257, + vCenter: 62.25, + hCenter: 241, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 384, + top: 256.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 413.9974136352539, + bottom: 289.9948043823242, + vCenter: 398.9974136352539, + hCenter: 273.9948043823242, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 414, + top: 256.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 443.48961639404297, + bottom: 289.50000762939453, + vCenter: 428.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 354, + top: 256.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 385.4948043823242, + bottom: 289.9948043823242, + vCenter: 370.4948043823242, + hCenter: 273.9948043823242, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 444, + top: 256.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 473.48961639404297, + bottom: 289.50000762939453, + vCenter: 458.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 256.5, + height: 32, + width: 60, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 353.48961639404297, + bottom: 289.50000762939453, + vCenter: 323.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 474, + top: 256.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 503.48961639404297, + bottom: 289.50000762939453, + vCenter: 488.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 256.5, + height: 32, + width: 132, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 292.4974136352539, + bottom: 385.25, + vCenter: 226.4974136352539, + hCenter: 369.25, + fontSize: 11.25, + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 504, + top: 256.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 533.9974136352539, + bottom: 290.4896011352539, + vCenter: 518.9974136352539, + hCenter: 274.4896011352539, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 93, + top: 256.5, + height: 32, + width: 69, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 164.24219512939453, + bottom: 287.75, + vCenter: 129.74219512939453, + hCenter: 271.75, + fontSize: 11.25, + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 534, + top: 256.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 563.489616394043, + bottom: 260.2395935058594, + vCenter: 548.489616394043, + hCenter: 244.23959350585938, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 256.5, + height: 32, + width: 64.5, + title: ' 2', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 94.5, + bottom: 288.494140625, + vCenter: 62.25, + hCenter: 272.494140625, + fontSize: 11.25, + borderTop: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 384, + top: 288, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 413.9974136352539, + bottom: 289.9948043823242, + vCenter: 398.9974136352539, + hCenter: 273.9948043823242, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 414, + top: 288, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 443.48961639404297, + bottom: 289.50000762939453, + vCenter: 428.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 354, + top: 288, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 385.74739837646484, + bottom: 350.99742126464844, + vCenter: 370.74739837646484, + hCenter: 334.99742126464844, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 444, + top: 288, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 473.48961639404297, + bottom: 289.50000762939453, + vCenter: 458.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 288, + height: 32, + width: 60, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 355.4974136352539, + bottom: 322.2422180175781, + vCenter: 325.4974136352539, + hCenter: 306.2422180175781, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 474, + top: 288, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 503.48961639404297, + bottom: 289.50000762939453, + vCenter: 488.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 288, + height: 32, + width: 132, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 295.49219512939453, + bottom: 290.7448043823242, + vCenter: 229.49219512939453, + hCenter: 274.7448043823242, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 504, + top: 288, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 533.489616394043, + bottom: 289.50000762939453, + vCenter: 518.489616394043, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 93, + top: 288, + height: 32, + width: 69, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 162.74219512939453, + bottom: 321.4973907470703, + vCenter: 128.24219512939453, + hCenter: 305.4973907470703, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 534, + top: 288, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 565.4974136352539, + bottom: 317.7447814941406, + vCenter: 550.4974136352539, + hCenter: 301.7447814941406, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 288, + height: 32, + width: 64.5, + title: ' 3', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 94.5, + bottom: 319.98828125, + vCenter: 62.25, + hCenter: 303.98828125, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 384, + top: 319.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 413.9974136352539, + bottom: 289.9948043823242, + vCenter: 398.9974136352539, + hCenter: 273.9948043823242, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 414, + top: 319.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 443.50000762939453, + bottom: 350.7422180175781, + vCenter: 428.50000762939453, + hCenter: 334.7422180175781, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 354, + top: 319.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 385.4948043823242, + bottom: 289.9948043823242, + vCenter: 370.4948043823242, + hCenter: 273.9948043823242, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 444, + top: 319.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 473.48961639404297, + bottom: 289.50000762939453, + vCenter: 458.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 319.5, + height: 32, + width: 60, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 353.48961639404297, + bottom: 289.50000762939453, + vCenter: 323.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 474, + top: 319.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 503.9974136352539, + bottom: 353.24481201171875, + vCenter: 488.9974136352539, + hCenter: 337.24481201171875, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 319.5, + height: 32, + width: 132, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 295.49219512939453, + bottom: 290.7448043823242, + vCenter: 229.49219512939453, + hCenter: 274.7448043823242, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 504, + top: 319.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 533.2500228881836, + bottom: 350.7422180175781, + vCenter: 518.2500228881836, + hCenter: 334.7422180175781, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 93, + top: 319.5, + height: 32, + width: 69, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 160.4974136352539, + bottom: 355.98960876464844, + vCenter: 125.9974136352539, + hCenter: 339.98960876464844, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 534, + top: 319.5, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 565.5000228881836, + bottom: 351.4922180175781, + vCenter: 550.5000228881836, + hCenter: 335.4922180175781, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 319.5, + height: 32, + width: 64.5, + title: ' 4', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 94.5, + bottom: 351.4970703125, + vCenter: 62.25, + hCenter: 335.4970703125, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 384, + top: 351, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 413.50000762939453, + bottom: 381.74481201171875, + vCenter: 398.50000762939453, + hCenter: 365.74481201171875, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 414, + top: 351, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 443.48961639404297, + bottom: 289.50000762939453, + vCenter: 428.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 354, + top: 351, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 382.75000762939453, + bottom: 381.74481201171875, + vCenter: 367.75000762939453, + hCenter: 365.74481201171875, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 444, + top: 351, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 473.48961639404297, + bottom: 289.50000762939453, + vCenter: 458.48961639404297, + hCenter: 273.50000762939453, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 351, + height: 32, + width: 60, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 353.48961639404297, + bottom: 384.74220275878906, + vCenter: 323.48961639404297, + hCenter: 368.74220275878906, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 474, + top: 351, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 504.73963165283203, + bottom: 382.98960876464844, + vCenter: 489.73963165283203, + hCenter: 366.98960876464844, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 351, + height: 32, + width: 132, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 293.98960876464844, + bottom: 382.98960876464844, + vCenter: 227.98960876464844, + hCenter: 366.98960876464844, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 504, + top: 351, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 531.7500228881836, + bottom: 357.4947814941406, + vCenter: 516.7500228881836, + hCenter: 341.4947814941406, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 93, + top: 351, + height: 32, + width: 69, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 161.24219512939453, + bottom: 382.98960876464844, + vCenter: 126.74219512939453, + hCenter: 366.98960876464844, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 534, + top: 351, + height: 32, + width: 30, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderRight: 'solid', + qrCodeLevel: 0, + right: 561.7500228881836, + bottom: 379.98960876464844, + vCenter: 546.7500228881836, + hCenter: 363.98960876464844, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 351, + height: 32, + width: 64.5, + title: ' 5', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + qrCodeLevel: 0, + right: 94.5, + bottom: 382.9912109375, + vCenter: 62.25, + hCenter: 366.9912109375, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 354, + top: 382.5, + height: 32, + width: 210, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 496.4974136352539, + bottom: 416.75, + vCenter: 425.2474136352539, + hCenter: 400.75, + fontSize: 11.25, + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 382.5, + height: 32, + width: 132, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 293.99219512939453, + bottom: 414.5, + vCenter: 227.99219512939453, + hCenter: 398.5, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 382.5, + height: 32, + width: 60, + title: '小写', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 425.23958587646484, + bottom: 413.75, + vCenter: 359.23958587646484, + hCenter: 397.75, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 382.5, + height: 32, + width: 132, + title: '合计(大写)', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 162, + bottom: 414.5, + vCenter: 96, + hCenter: 398.5, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 414, + height: 32, + width: 133.5, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 297.7448043823242, + bottom: 445.9973907470703, + vCenter: 230.99480438232422, + hCenter: 429.9973907470703, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 414, + height: 32, + width: 132, + title: '财务主管意见', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 425.9974136352539, + bottom: 445.9973907470703, + vCenter: 359.9974136352539, + hCenter: 429.9973907470703, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 426, + top: 414, + height: 32, + width: 138, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 563.989631652832, + bottom: 444.4973907470703, + vCenter: 494.98963165283203, + hCenter: 428.4973907470703, + fontSize: 11.25, + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 414, + height: 32, + width: 132, + title: '主管意见', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + qrCodeLevel: 0, + right: 164.25, + bottom: 448.2473907470703, + vCenter: 98.25, + hCenter: 432.2473907470703, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 162, + top: 445.5, + height: 32, + width: 133.5, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 293.9970703125, + bottom: 478.994140625, + vCenter: 227.2470703125, + hCenter: 462.994140625, + fontSize: 11.25, + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 294, + top: 445.5, + height: 32, + width: 132, + title: '出纳', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 425.994140625, + bottom: 475.994140625, + vCenter: 359.994140625, + hCenter: 459.994140625, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 426, + top: 445.5, + height: 32, + width: 138, + title: ' ', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 565.4912109375, + bottom: 475.994140625, + vCenter: 496.4912109375, + hCenter: 459.994140625, + fontSize: 11.25, + borderRight: 'solid', + }, + printElementType: { title: '文本', type: 'text' }, + }, + { + options: { + left: 30, + top: 445.5, + height: 32, + width: 132, + title: '财务复核', + coordinateSync: false, + widthHeightSync: false, + textAlign: 'center', + textContentVerticalAlign: 'middle', + borderLeft: 'solid', + borderTop: 'solid', + borderBottom: 'solid', + qrCodeLevel: 0, + right: 162, + bottom: 475.994140625, + vCenter: 96, + hCenter: 459.994140625, + fontSize: 11.25, + backgroundColor: '#dbdbdb', + }, + printElementType: { title: '文本', type: 'text' }, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/utils/define.ts b/src/components/PrintDesign/PrintDesign/utils/define.ts new file mode 100644 index 0000000..78f932a --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/utils/define.ts @@ -0,0 +1,208 @@ +import { templateJson1, templateJson2, templateJson3, templateJson4, templateJson5, templateJson6, templateJson7, templateJson8 } from '../template'; + +export const subComponents = [ + { + id: 'hline', + label: '横线', + icon: 'icon-ym icon-ym-hLine', + }, + { + id: 'vline', + label: '竖线', + icon: 'icon-ym icon-ym-vLine', + }, + { + id: 'rect', + label: '矩形', + icon: 'icon-ym icon-ym-rect', + }, + { + id: 'oval', + label: '圆形', + icon: 'icon-ym icon-ym-oval', + }, +]; +export const basicComponents = [ + { + id: 'text', + label: '文本', + icon: 'icon-ym icon-ym-generator-input', + }, + { + id: 'longText', + label: '长文本', + icon: 'icon-ym icon-ym-generator-textarea', + }, + { + id: 'qrcode', + label: '二维码', + icon: 'icon-ym icon-ym-generator-qrcode', + }, + { + id: 'barcode', + label: '条形码', + icon: 'icon-ym icon-ym-generator-barcode', + }, + { + id: 'image', + label: '图片', + icon: 'icon-ym icon-ym-portal-image', + }, + { + id: 'images', + label: '图片组', + icon: 'icon-ym icon-ym-portal-image', + }, + { + id: 'table', + label: '表格', + icon: 'icon-ym icon-ym-generator-tableGrid', + }, +]; +export const systemComponents = [ + { + id: 'printTime', + label: '打印时间', + icon: 'icon-ym icon-ym-combination', + }, + { + id: 'printer', + label: '打印人员', + icon: 'icon-ym icon-ym-combination', + }, + { + id: 'flowRecord', + label: '审批记录', + icon: 'icon-ym icon-ym-combination', + }, +]; +export const seniorComponents: any[] = []; +export const businessComponents: any[] = [ + { + id: 'business1', + label: '劳动合同', + icon: 'icon-ym icon-ym-combination', + templateJson: templateJson3, + }, + { + id: 'business2', + label: '解聘合同', + icon: 'icon-ym icon-ym-combination', + templateJson: templateJson5, + }, + { + id: 'business3', + label: '采购合同', + icon: 'icon-ym icon-ym-combination', + templateJson: templateJson6, + }, + { + id: 'business4', + label: '入职申请', + icon: 'icon-ym icon-ym-combination', + templateJson: templateJson1, + }, + { + id: 'business5', + label: '工作证明', + icon: 'icon-ym icon-ym-combination', + templateJson: templateJson4, + }, + { + id: 'business6', + label: '培训记录', + icon: 'icon-ym icon-ym-combination', + templateJson: templateJson2, + }, + { + id: 'business7', + label: '请购单', + icon: 'icon-ym icon-ym-combination', + templateJson: templateJson7, + }, + { + id: 'business8', + label: '报销单', + icon: 'icon-ym icon-ym-combination', + templateJson: templateJson8, + }, +]; +export const verticalAlignList = [ + { + type: 'left', + title: '左对齐', + preIcon: 'icon-ym icon-ym-flow-align-left', + }, + { + type: 'vertical', + title: '居中对齐', + preIcon: 'icon-ym icon-ym-flow-align-center', + }, + { + type: 'right', + title: '右对齐', + preIcon: 'icon-ym icon-ym-flow-align-right', + }, +]; +export const horizontalAlignList = [ + { + type: 'top', + title: '顶部对齐', + preIcon: 'icon-ym icon-ym-flow-align-top', + }, + { + type: 'horizontal', + title: '垂直居中', + preIcon: 'icon-ym icon-ym-flow-align-middle', + }, + { + type: 'bottom', + title: '底部对齐', + preIcon: 'icon-ym icon-ym-flow-align-bottom', + }, +]; +export const distributeList = [ + { + type: 'distributeHor', + title: '横向分散', + preIcon: 'icon-ym icon-ym-beautify-vertical', + }, + { + type: 'distributeVer', + title: '纵向分散', + preIcon: 'icon-ym icon-ym-beautify-horizontal', + }, +]; + +export const paperTypes = [ + { + type: 'A3', + width: 420, + height: 297, + }, + { + type: 'A4', + width: 210, + height: 297, + }, + { + type: 'A5', + width: 210, + height: 148, + }, + { + type: 'B3', + width: 500, + height: 353, + }, + { + type: 'B4', + width: 250, + height: 352, + }, + { + type: 'B5', + width: 250, + height: 176, + }, +]; diff --git a/src/components/PrintDesign/PrintDesign/utils/template-helper.ts b/src/components/PrintDesign/PrintDesign/utils/template-helper.ts new file mode 100644 index 0000000..1c2ac7f --- /dev/null +++ b/src/components/PrintDesign/PrintDesign/utils/template-helper.ts @@ -0,0 +1,21 @@ +/* + * @Description: + * @Author: CcSimple + * @Github: https://github.com/CcSimple + * @Date: 2023-02-09 23:26:18 + * @LastEditors: CcSimple + * @LastEditTime: 2023-02-09 23:35:20 + */ +import { hiprint } from 'vue-plugin-hiprint'; + +const templateMap = {}; + +export function newHiprintPrintTemplate(key, options) { + let template = new hiprint.PrintTemplate(options); + templateMap[key] = template; + return template; +} + +export function getHiprintPrintTemplate(key) { + return templateMap[key]; +} diff --git a/src/components/PrintDesign/index.vue b/src/components/PrintDesign/index.vue new file mode 100644 index 0000000..613692e --- /dev/null +++ b/src/components/PrintDesign/index.vue @@ -0,0 +1,221 @@ + + diff --git a/src/components/PrintDesign/printBrowse/index.vue b/src/components/PrintDesign/printBrowse/index.vue new file mode 100644 index 0000000..242b839 --- /dev/null +++ b/src/components/PrintDesign/printBrowse/index.vue @@ -0,0 +1,221 @@ + + + + diff --git a/src/components/PrintDesign/printSelect/index.vue b/src/components/PrintDesign/printSelect/index.vue new file mode 100644 index 0000000..5041a17 --- /dev/null +++ b/src/components/PrintDesign/printSelect/index.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/components/Qrcode/index.ts b/src/components/Qrcode/index.ts new file mode 100644 index 0000000..9f18e0f --- /dev/null +++ b/src/components/Qrcode/index.ts @@ -0,0 +1,5 @@ +import { withInstall } from '@/utils'; +import qrCode from './src/Qrcode.vue'; + +export const QrCode = withInstall(qrCode); +export * from './src/typing'; diff --git a/src/components/Qrcode/src/Qrcode.vue b/src/components/Qrcode/src/Qrcode.vue new file mode 100644 index 0000000..057ed66 --- /dev/null +++ b/src/components/Qrcode/src/Qrcode.vue @@ -0,0 +1,112 @@ + + diff --git a/src/components/Qrcode/src/drawCanvas.ts b/src/components/Qrcode/src/drawCanvas.ts new file mode 100644 index 0000000..53198e8 --- /dev/null +++ b/src/components/Qrcode/src/drawCanvas.ts @@ -0,0 +1,37 @@ +import { toCanvas } from 'qrcode'; +import type { QRCodeRenderersOptions } from 'qrcode'; +import { RenderQrCodeParams, ContentType } from './typing'; +import { cloneDeep } from 'lodash-es'; + +export const renderQrCode = ({ + canvas, + content, + width = 0, + options: params = {}, +}: RenderQrCodeParams) => { + const options = cloneDeep(params); + // 容错率,默认对内容少的二维码采用高容错率,内容多的二维码采用低容错率 + options.errorCorrectionLevel = options.errorCorrectionLevel || getErrorCorrectionLevel(content); + + return getOriginWidth(content, options).then((_width: number) => { + options.scale = width === 0 ? undefined : (width / _width) * 4; + return toCanvas(canvas, content, options); + }); +}; + +// 得到原QrCode的大小,以便缩放得到正确的QrCode大小 +function getOriginWidth(content: ContentType, options: QRCodeRenderersOptions) { + const _canvas = document.createElement('canvas'); + return toCanvas(_canvas, content, options).then(() => _canvas.width); +} + +// 对于内容少的QrCode,增大容错率 +function getErrorCorrectionLevel(content: ContentType) { + if (content.length > 36) { + return 'M'; + } else if (content.length > 16) { + return 'Q'; + } else { + return 'H'; + } +} diff --git a/src/components/Qrcode/src/drawLogo.ts b/src/components/Qrcode/src/drawLogo.ts new file mode 100644 index 0000000..9263c64 --- /dev/null +++ b/src/components/Qrcode/src/drawLogo.ts @@ -0,0 +1,81 @@ +import { isString } from '@/utils/is'; +import { RenderQrCodeParams, LogoType } from './typing'; +export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => { + if (!logo) { + return new Promise(resolve => { + resolve((canvas as HTMLCanvasElement).toDataURL()); + }); + } + const canvasWidth = (canvas as HTMLCanvasElement).width; + const { logoSize = 0.15, bgColor = '#ffffff', borderSize = 0.05, crossOrigin, borderRadius = 8, logoRadius = 0 } = logo as LogoType; + + const logoSrc: string = isString(logo) ? logo : logo.src; + const logoWidth = canvasWidth * logoSize; + const logoXY = (canvasWidth * (1 - logoSize)) / 2; + const logoBgWidth = canvasWidth * (logoSize + borderSize); + const logoBgXY = (canvasWidth * (1 - logoSize - borderSize)) / 2; + + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + // logo 底色 + canvasRoundRect(ctx)(logoBgXY, logoBgXY, logoBgWidth, logoBgWidth, borderRadius); + ctx.fillStyle = bgColor; + ctx.fill(); + + // logo + const image = new Image(); + if (crossOrigin || logoRadius) { + image.setAttribute('crossOrigin', crossOrigin || 'anonymous'); + } + image.src = logoSrc; + + // 使用image绘制可以避免某些跨域情况 + const drawLogoWithImage = (image: CanvasImageSource) => { + ctx.drawImage(image, logoXY, logoXY, logoWidth, logoWidth); + }; + + // 使用canvas绘制以获得更多的功能 + const drawLogoWithCanvas = (image: HTMLImageElement) => { + const canvasImage = document.createElement('canvas'); + canvasImage.width = logoXY + logoWidth; + canvasImage.height = logoXY + logoWidth; + const imageCanvas = canvasImage.getContext('2d'); + if (!imageCanvas || !ctx) return; + imageCanvas.drawImage(image, logoXY, logoXY, logoWidth, logoWidth); + + canvasRoundRect(ctx)(logoXY, logoXY, logoWidth, logoWidth, logoRadius); + if (!ctx) return; + const fillStyle = ctx.createPattern(canvasImage, 'no-repeat'); + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + }; + + // 将 logo绘制到 canvas上 + return new Promise(resolve => { + image.onload = () => { + logoRadius ? drawLogoWithCanvas(image) : drawLogoWithImage(image); + resolve((canvas as HTMLCanvasElement).toDataURL()); + }; + }); +}; + +// copy来的方法,用于绘制圆角 +function canvasRoundRect(ctx: CanvasRenderingContext2D) { + return (x: number, y: number, w: number, h: number, r: number) => { + const minSize = Math.min(w, h); + if (r > minSize / 2) { + r = minSize / 2; + } + ctx.beginPath(); + ctx.moveTo(x + r, y); + ctx.arcTo(x + w, y, x + w, y + h, r); + ctx.arcTo(x + w, y + h, x, y + h, r); + ctx.arcTo(x, y + h, x, y, r); + ctx.arcTo(x, y, x + w, y, r); + ctx.closePath(); + return ctx; + }; +} diff --git a/src/components/Qrcode/src/qrcodePlus.ts b/src/components/Qrcode/src/qrcodePlus.ts new file mode 100644 index 0000000..6439861 --- /dev/null +++ b/src/components/Qrcode/src/qrcodePlus.ts @@ -0,0 +1,4 @@ +// 参考 qr-code-with-logo 进行ts版本修改 +import { toCanvas } from './toCanvas'; +export * from './typing'; +export { toCanvas }; diff --git a/src/components/Qrcode/src/toCanvas.ts b/src/components/Qrcode/src/toCanvas.ts new file mode 100644 index 0000000..f74d596 --- /dev/null +++ b/src/components/Qrcode/src/toCanvas.ts @@ -0,0 +1,10 @@ +import { renderQrCode } from './drawCanvas'; +import { drawLogo } from './drawLogo'; +import { RenderQrCodeParams } from './typing'; +export const toCanvas = (options: RenderQrCodeParams) => { + return renderQrCode(options) + .then(() => { + return options; + }) + .then(drawLogo) as Promise; +}; diff --git a/src/components/Qrcode/src/typing.ts b/src/components/Qrcode/src/typing.ts new file mode 100644 index 0000000..3a037e9 --- /dev/null +++ b/src/components/Qrcode/src/typing.ts @@ -0,0 +1,38 @@ +import type { QRCodeSegment, QRCodeRenderersOptions } from 'qrcode'; + +export type ContentType = string | QRCodeSegment[]; + +export type { QRCodeRenderersOptions }; + +export type LogoType = { + src: string; + logoSize: number; + borderColor: string; + bgColor: string; + borderSize: number; + crossOrigin: string; + borderRadius: number; + logoRadius: number; +}; + +export interface RenderQrCodeParams { + canvas: any; + content: ContentType; + width?: number; + options?: QRCodeRenderersOptions; + logo?: LogoType | string; + image?: HTMLImageElement; + downloadName?: string; + download?: boolean | Fn; +} + +export type ToCanvasFn = (options: RenderQrCodeParams) => Promise; + +export interface QrCodeActionType { + download: (fileName?: string) => void; +} + +export interface QrcodeDoneEventParams { + url: string; + ctx?: CanvasRenderingContext2D | null; +} diff --git a/src/components/Report/index.ts b/src/components/Report/index.ts new file mode 100644 index 0000000..f4a455c --- /dev/null +++ b/src/components/Report/index.ts @@ -0,0 +1,6 @@ +import './style/index.less'; +import Report from './src/index.vue'; +import ReportPreview from './src/reportPreview/index.vue'; +import ReportPrint from './src/reportPrint/index.vue'; + +export { Report, ReportPreview, ReportPrint }; diff --git a/src/components/Report/src/components/QueryModal.vue b/src/components/Report/src/components/QueryModal.vue new file mode 100644 index 0000000..62acae4 --- /dev/null +++ b/src/components/Report/src/components/QueryModal.vue @@ -0,0 +1,309 @@ + + + diff --git a/src/components/Report/src/components/SortModal.vue b/src/components/Report/src/components/SortModal.vue new file mode 100644 index 0000000..cab8704 --- /dev/null +++ b/src/components/Report/src/components/SortModal.vue @@ -0,0 +1,177 @@ + + + diff --git a/src/components/Report/src/design/index.vue b/src/components/Report/src/design/index.vue new file mode 100644 index 0000000..b7ba497 --- /dev/null +++ b/src/components/Report/src/design/index.vue @@ -0,0 +1,707 @@ + + + + + diff --git a/src/components/Report/src/helper/index.ts b/src/components/Report/src/helper/index.ts new file mode 100644 index 0000000..4837be8 --- /dev/null +++ b/src/components/Report/src/helper/index.ts @@ -0,0 +1,100 @@ +export const defaultCellProperties = { + text: { + leftParentCellType: 'none', + leftParentCellCustomRowName: '', + leftParentCellCustomColName: '', + topParentCellType: 'none', + topParentCellCustomRowName: '', + topParentCellCustomColName: '', + }, + parameter: { + field: '', + leftParentCellType: 'none', + leftParentCellCustomRowName: '', + leftParentCellCustomColName: '', + topParentCellType: 'none', + topParentCellCustomRowName: '', + topParentCellCustomColName: '', + }, + dataSource: { + field: '', + polymerizationType: '1', + summaryType: 'sum', + fillDirection: 'portrait', + leftParentCellType: 'default', + leftParentCellCustomRowName: '', + leftParentCellCustomColName: '', + topParentCellType: 'default', + topParentCellCustomRowName: '', + topParentCellCustomColName: '', + }, +}; + +//拼接url +export function getFloatImageUrl(data, url) { + for (let key in data) { + const type = data[key].source; + let src = data[key].option.src; + if (src && type == 1) data[key].option.src = url + src; + } + return data; +} + +//拼接快照url +export function getFloatUrl(list, reportApiUrl, floatImages = {}) { + let item: any = {}; + if (!list.length) return; + for (let index = 0; index < list.length; index++) { + const element = list[index]; + if (element.name != 'SHEET_DRAWING_PLUGIN') continue; + element.data = element.data ? JSON.parse(element.data) : {}; + for (let key in element.data) { + for (let imageKey in element.data[key].data) { + let componentKey = element.data[key].data[imageKey].componentKey; + if (componentKey == 'YunzhupaasUniverFloatEchart') continue; + let source = element.data[key].data[imageKey].source; + const drawingId = element.data[key].data[imageKey].drawingId; + if (source) element.data[key].data[imageKey].source = reportApiUrl + source; + if (floatImages && floatImages[drawingId]) floatImages[drawingId].option.src = reportApiUrl + source; + } + } + element.data = JSON.stringify(element.data); + } + item.list = list; + item.floatImages = floatImages; + return item; +} + +//截取url前缀 +export function interceptUrl(data, reportApiUrl) { + for (let key in data) { + const type = data[key].source; + let src = data[key].option.src; + if (src && type == 1) { + src = src.split(reportApiUrl)[1]; + data[key].option.src = src; + } + } + return data; +} + +/** + * 根据索引值获取字母字符串。 + * @param index {number} - 输入的索引值(如 0, 1, 26, 27 等)。 + * @returns {string} - 对应的字母字符串(如 "A", "B", "AA", "AB" 等)。 + */ +export const getAlphabetFromIndexRule = (index: number): string => { + const base = 26; // 字母表的长度 + const charCodeA = 'A'.charCodeAt(0); + + let result = ''; + index += 1; // 转为从 1 开始的规则 + + while (index > 0) { + const remainder = (index - 1) % base; + result = String.fromCharCode(charCodeA + remainder) + result; + index = Math.floor((index - 1) / base); + } + + return result; +}; diff --git a/src/components/Report/src/hooks/useReport.ts b/src/components/Report/src/hooks/useReport.ts new file mode 100644 index 0000000..f7587de --- /dev/null +++ b/src/components/Report/src/hooks/useReport.ts @@ -0,0 +1,258 @@ +import { upperFirst } from 'lodash-es'; +import { getDataInterfaceRes } from '@/api/systemData/dataInterface'; +import { useBaseStore } from '@/store/modules/base'; +import { computed, reactive } from 'vue'; +import * as newEcharts from 'echarts'; +import { useI18n } from '@/hooks/web/useI18n'; + +interface State { + searchSchemas: any[]; +} + +const { t } = useI18n(); + +export const useReport = (formApi: any = {}) => { + const baseStore = useBaseStore(); + const state = reactive({ + searchSchemas: [], + }); + + const searchSchemas = computed(() => state.searchSchemas); + + // 更新图表数据 + function getRealEchart(echarts, chartData) { + if (!echarts) return null; + Object.keys(echarts).forEach(key => { + const chart = echarts[key]; + const option = chart.option; + const styleType = option.styleType; + const colorList = option.color?.list || []; + let barTypeList = []; + if (chart.echartType === 'bar') barTypeList = option.bar.barTypeList; + const dataList = chartData.filter(o => o.drawingId === key); + let data: any = {}; + if (option.title.textI18nCode) option.title.text = t(option.title.textI18nCode, option.title.text); + if (option.title.subtextI18nCode) option.title.subtext = t(option.title.subtextI18nCode, option.title.subtext); + if (dataList.length) data = dataList[0].field; + const { classifyNameField = [], seriesDataField = [], seriesNameField = [], maxField = [] } = data; + // 柱状图和线性图 + if (['bar', 'line'].includes(chart.echartType)) { + const series = seriesDataField?.map((o, index) => { + return { + name: seriesNameField[index], + data: o, + type: chart.echartType == 'bar' && styleType == 7 ? getEchartType(barTypeList, classifyNameField[index]) : chart.echartType, + itemStyle: { color: getColor(colorList, index) }, + ...(chart.echartType === 'line' + ? { + smooth: styleType == 2, + step: styleType == 3, + stack: styleType == 4 ? 'total' : '', + lineStyle: { width: chart.line?.width }, + symbolSize: chart.line?.symbolSize, + } + : {}), + ...(chart.echartType === 'line' && option.areaStyle ? { areaStyle: option.areaStyle } : {}), + ...(chart.echartType === 'bar' + ? { + showBackground: styleType == 4, + stack: styleType == 5 || styleType == 7 ? seriesNameField[index] : styleType == 2 || styleType == 6 ? 'total' : '', + } + : ''), + }; + }); + chart.option.series = series; + chart.option.legend.data = seriesNameField; + chart.option.xAxis.data = classifyNameField; + } + // 饼图 + if (chart.echartType === 'pie') { + const series = seriesDataField?.map((o, index) => { + const data = o?.map((item, sIndex) => { + return { + value: item, + name: classifyNameField?.[sIndex], + }; + }); + return { + name: seriesNameField[index], + type: 'pie', + radius: styleType == 2 ? ['30%', '60%'] : '50%', + center: [option.seriesCenter.seriesCenterLeft + '%', option.seriesCenter.seriesCenterTop + '%'], + roseType: option.pie.roseType ? 'area' : '', + label: getLabel(option), + color: getPieColor(colorList), + data: getPieData(option.pie, data), + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)', + }, + }, + }; + }); + chart.option.series = series; + } + // 雷达图 + if (chart.echartType === 'radar') { + let series: any = []; + let data: any = []; + const newMaxField: any = []; + for (let index = 0; index < seriesDataField.length; index++) { + const element = seriesDataField[index]; + if (!maxField.length) element.length && newMaxField.push(Math.max(...element)); + let item = { + value: element, + name: seriesNameField?.[index], + areaStyle: { color: getColor(colorList, index), opacity: option.seriesAreaStyleOpacity }, + }; + data.push(item); + } + series = [ + { + type: chart.echartType, + data, + }, + ]; + if (!maxField.length) maxField.push(...newMaxField); + const indicator = maxField?.map((o, sIndex) => { + return { + max: o, + name: classifyNameField?.[sIndex], + }; + }); + const radarObj = { + axisName: option.radar.axisName, + indicator: indicator, + shape: styleType == 1 ? 'polygon' : 'circle', + center: [option.seriesCenter.seriesCenterLeft + '%', option.seriesCenter.seriesCenterTop + '%'], + }; + chart.option.series = series; + chart.option.radar = radarObj; + } + }); + return echarts; + } + // 获取搜索内容 + function getSearchSchema(queryList, sheetId?) { + if (!queryList.length) return (state.searchSchemas = []); + let item: any = []; + if (sheetId) { + item = queryList.filter(o => o.sheet === sheetId)[0]; + } else { + item = queryList[0]; + } + if (!item) return (state.searchSchemas = []); + const list = item.queryList || []; + const schemas = list.map((option: any) => { + const { label, type, vModel, config, searchMultiple } = option; + const field = vModel?.replace('.', '-'); + let newType = getType(type); + if (type === 'select') { + config.fieldNames = { value: config.propsValue }; + } + if (searchMultiple) config.multiple = true; + return { + field, + label, + component: newType, + componentProps: config, + }; + }); + // 异步更新 select 类型字段的 schema + for (const cur of schemas) { + const config = cur?.componentProps || {}; + if (cur?.component === 'Select') { + if (config.dataType === 'dictionary' && config.dictionaryType) { + baseStore.getDicDataSelector(config.dictionaryType).then(res => { + formApi.updateSchema([{ field: cur.field, componentProps: { options: res } }]); + }); + } else if (config.dataType === 'dynamic' && config.propsUrl) { + const query = { paramList: config.templateJson || [] }; + getDataInterfaceRes(config.propsUrl, query).then(res => { + const data = Array.isArray(res.data) ? res.data : []; + formApi.updateSchema([{ field: cur.field, componentProps: { options: data } }]); + }); + } + } + } + state.searchSchemas = schemas; + } + function clearSearchSchema() { + state.searchSchemas = []; + } + function getType(type) { + if (type == 'date') return 'DateRange'; + if (type == 'time') return 'TimeRange'; + if (type == 'inputNumber') return 'NumberRange'; + return upperFirst(type); + } + function getColor(colorList, index) { + const barColor = colorList || []; + if (barColor[index]) { + const color1 = barColor[index].color1; + const color2 = barColor[index].color2; + if (color2 && color1) + return new newEcharts.graphic.LinearGradient(0, 0, 0, 1, [ + { offset: 0, color: color1 }, + { offset: 1, color: color2 }, + ]); + return color1; + } + } + function getLabel(option) { + let label: any = {}; + label.show = option.label.show; + label.position = option.seriesLabelPosition; + const seriesLabelShowInfo = option.seriesLabelShowInfo; + if (seriesLabelShowInfo && seriesLabelShowInfo.length) { + if (seriesLabelShowInfo.includes('count') && seriesLabelShowInfo.includes('percent')) { + label.formatter = '{b}: {c} ({d}%)'; + } else if (seriesLabelShowInfo.includes('count')) { + label.formatter = '{b}: {c} '; + } else if (seriesLabelShowInfo.includes('percent')) { + label.formatter = '{b}: ({d}%) '; + } + } + return label; + } + function getPieData(option, list) { + if (option.showYunzhupaas) list = list.filter(item => item.value != 0); + if (option.sortable) { + for (let i = 0; i < list.length - 1; i++) { + for (let j = 0; j < list.length - 1; j++) { + if (list[j].value > list[j + 1].value) { + let t = list[j]; + list[j] = list[j + 1]; + list[j + 1] = t; + } + } + } + } + return list; + } + function getPieColor(colorList) { + let colors: any = []; + if (colorList && colorList.length) { + const list: any[] = []; + colorList.map((_item, index) => { + const color = getColor(colorList, index) || '#71B6F5'; + list.push(color); + }); + colors = list; + } + return colors; + } + function getEchartType(list, title) { + const arr = list.find(ele => title == ele.id); + if (arr && arr.type) return arr.type; + } + + return { + getRealEchart, + getSearchSchema, + searchSchemas, + clearSearchSchema, + }; +}; diff --git a/src/components/Report/src/index.vue b/src/components/Report/src/index.vue new file mode 100644 index 0000000..465981f --- /dev/null +++ b/src/components/Report/src/index.vue @@ -0,0 +1,298 @@ + + + diff --git a/src/components/Report/src/properties/ReportBarcodeProperties.vue b/src/components/Report/src/properties/ReportBarcodeProperties.vue new file mode 100644 index 0000000..e05d69c --- /dev/null +++ b/src/components/Report/src/properties/ReportBarcodeProperties.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/components/Report/src/properties/ReportCharBarProperties.vue b/src/components/Report/src/properties/ReportCharBarProperties.vue new file mode 100644 index 0000000..a924f71 --- /dev/null +++ b/src/components/Report/src/properties/ReportCharBarProperties.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components/Report/src/properties/ReportCharColorProperties.vue b/src/components/Report/src/properties/ReportCharColorProperties.vue new file mode 100644 index 0000000..139248e --- /dev/null +++ b/src/components/Report/src/properties/ReportCharColorProperties.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/components/Report/src/properties/ReportCharTooltipProperties.vue b/src/components/Report/src/properties/ReportCharTooltipProperties.vue new file mode 100644 index 0000000..a14c6fe --- /dev/null +++ b/src/components/Report/src/properties/ReportCharTooltipProperties.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/Report/src/properties/ReportChartCommonProperties.vue b/src/components/Report/src/properties/ReportChartCommonProperties.vue new file mode 100644 index 0000000..972e9a4 --- /dev/null +++ b/src/components/Report/src/properties/ReportChartCommonProperties.vue @@ -0,0 +1,80 @@ + + diff --git a/src/components/Report/src/properties/ReportChartDataProperties.vue b/src/components/Report/src/properties/ReportChartDataProperties.vue new file mode 100644 index 0000000..827af5d --- /dev/null +++ b/src/components/Report/src/properties/ReportChartDataProperties.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/components/Report/src/properties/ReportChartLabelProperties.vue b/src/components/Report/src/properties/ReportChartLabelProperties.vue new file mode 100644 index 0000000..7816c13 --- /dev/null +++ b/src/components/Report/src/properties/ReportChartLabelProperties.vue @@ -0,0 +1,52 @@ + + diff --git a/src/components/Report/src/properties/ReportChartLegendProperties.vue b/src/components/Report/src/properties/ReportChartLegendProperties.vue new file mode 100644 index 0000000..21e5c0e --- /dev/null +++ b/src/components/Report/src/properties/ReportChartLegendProperties.vue @@ -0,0 +1,28 @@ + + diff --git a/src/components/Report/src/properties/ReportChartMainTitleProperties.vue b/src/components/Report/src/properties/ReportChartMainTitleProperties.vue new file mode 100644 index 0000000..c1619a5 --- /dev/null +++ b/src/components/Report/src/properties/ReportChartMainTitleProperties.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/Report/src/properties/ReportChartMarginProperties.vue b/src/components/Report/src/properties/ReportChartMarginProperties.vue new file mode 100644 index 0000000..14315cc --- /dev/null +++ b/src/components/Report/src/properties/ReportChartMarginProperties.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/components/Report/src/properties/ReportChartProperties.vue b/src/components/Report/src/properties/ReportChartProperties.vue new file mode 100644 index 0000000..4aaf9ff --- /dev/null +++ b/src/components/Report/src/properties/ReportChartProperties.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/Report/src/properties/ReportChartSubtitleProperties.vue b/src/components/Report/src/properties/ReportChartSubtitleProperties.vue new file mode 100644 index 0000000..030dd08 --- /dev/null +++ b/src/components/Report/src/properties/ReportChartSubtitleProperties.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/components/Report/src/properties/ReportChartXAxisProperties.vue b/src/components/Report/src/properties/ReportChartXAxisProperties.vue new file mode 100644 index 0000000..e8cd33e --- /dev/null +++ b/src/components/Report/src/properties/ReportChartXAxisProperties.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/components/Report/src/properties/ReportChartYAxisProperties.vue b/src/components/Report/src/properties/ReportChartYAxisProperties.vue new file mode 100644 index 0000000..4962171 --- /dev/null +++ b/src/components/Report/src/properties/ReportChartYAxisProperties.vue @@ -0,0 +1,47 @@ + + + diff --git a/src/components/Report/src/properties/ReportDataProperties.vue b/src/components/Report/src/properties/ReportDataProperties.vue new file mode 100644 index 0000000..aee47d7 --- /dev/null +++ b/src/components/Report/src/properties/ReportDataProperties.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/components/Report/src/properties/ReportImageProperties.vue b/src/components/Report/src/properties/ReportImageProperties.vue new file mode 100644 index 0000000..d1e5616 --- /dev/null +++ b/src/components/Report/src/properties/ReportImageProperties.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/components/Report/src/properties/ReportLinkProperties.vue b/src/components/Report/src/properties/ReportLinkProperties.vue new file mode 100644 index 0000000..6d4937a --- /dev/null +++ b/src/components/Report/src/properties/ReportLinkProperties.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/Report/src/properties/ReportParamProperties.vue b/src/components/Report/src/properties/ReportParamProperties.vue new file mode 100644 index 0000000..5971226 --- /dev/null +++ b/src/components/Report/src/properties/ReportParamProperties.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/components/Report/src/properties/ReportQrcodeProperties.vue b/src/components/Report/src/properties/ReportQrcodeProperties.vue new file mode 100644 index 0000000..8262342 --- /dev/null +++ b/src/components/Report/src/properties/ReportQrcodeProperties.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/components/Report/src/properties/ReportTextProperties.vue b/src/components/Report/src/properties/ReportTextProperties.vue new file mode 100644 index 0000000..33ba942 --- /dev/null +++ b/src/components/Report/src/properties/ReportTextProperties.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/components/Report/src/properties/index.vue b/src/components/Report/src/properties/index.vue new file mode 100644 index 0000000..43b2113 --- /dev/null +++ b/src/components/Report/src/properties/index.vue @@ -0,0 +1,180 @@ + + + diff --git a/src/components/Report/src/reportPreview/index.vue b/src/components/Report/src/reportPreview/index.vue new file mode 100644 index 0000000..83bf53d --- /dev/null +++ b/src/components/Report/src/reportPreview/index.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/src/components/Report/src/reportPrint/ConfigForm.vue b/src/components/Report/src/reportPrint/ConfigForm.vue new file mode 100644 index 0000000..baaae7a --- /dev/null +++ b/src/components/Report/src/reportPrint/ConfigForm.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/components/Report/src/reportPrint/index.vue b/src/components/Report/src/reportPrint/index.vue new file mode 100644 index 0000000..6b49b1f --- /dev/null +++ b/src/components/Report/src/reportPrint/index.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/components/Report/src/yunzhupaasUniver/Design/index.ts b/src/components/Report/src/yunzhupaasUniver/Design/index.ts new file mode 100644 index 0000000..2769daf --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/index.ts @@ -0,0 +1,64 @@ +import { ICellData, IWorkbookData } from '@univerjs/core'; +import * as echarts from 'echarts'; + +export interface DesignStateProps { + containerEleId: any; + + univer: any; + yunzhupaasUniverAPI: any; + + univerCreateMode: 'design' | 'preview' | 'print'; + + activeWorkbook: any; + activeWorkbookId: any; + activeWorksheet: any; + activeWorksheetId: any; + + selectionChangeMonitor: any; + beforeCommandExecuteMonitor: any; + commandExecuteMonitor: any; + + configDialogCellTarget: null; + openDialogCell: boolean; + dialogCellInstance: any; + + loading: boolean; + [prop: string]: any; +} + +export interface CreateUnitProps { + mode?: 'design' | 'preview' | 'print'; + + snapshot?: IWorkbookData; + floatEcharts?: Record; + cellEcharts?: Record; + floatImages?: Record; + + uiHeader?: boolean; + uiFooter?: boolean; + uiContextMenu?: boolean; + + readonly?: boolean; + + defaultActiveSheetId?: string; + + loading?: boolean; +} + +export interface DeliverFloatEchartOptionProps { + drawingId: string; + echartType: 'bar' | 'line' | 'pie'; + option: echarts.EChartsOption; +} + +export interface DeliverFloatImageOptionProps { + drawingId: string; + imageType: 'BASE64' | 'URL'; + option: any; +} + +export interface DeliverCellDataProps { + startColumn: number; + startRow: number; + cellData: ICellData; +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/index.vue b/src/components/Report/src/yunzhupaasUniver/Design/index.vue new file mode 100644 index 0000000..0f31ab3 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/index.vue @@ -0,0 +1,822 @@ + + + + + diff --git a/src/components/Report/src/yunzhupaasUniver/Design/store/index.ts b/src/components/Report/src/yunzhupaasUniver/Design/store/index.ts new file mode 100644 index 0000000..b87d5ce --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/store/index.ts @@ -0,0 +1,155 @@ +import { ref } from 'vue'; +import { defineStore } from 'pinia'; +import { getAlphabetFromIndexRule, isNullOrUndefined } from '../univer/utils'; + +// 初始状态的默认值 +const defaultFocusFloatDomData = { + domId: undefined, + drawingId: undefined, + option: {}, +}; + +export const useYunzhupaasUniverStore = (id: string) => { + return defineStore(id, () => { + const yunzhupaasUniverApiCache: any = ref(null); // 整个api实例 + const univerCreateModeCache: any = ref(null); // univer创建模式 + + const focusedFloatEchartDataCache = ref({ ...defaultFocusFloatDomData }); // 已聚焦的悬浮图表数据 + const floatEchartDataCaches: Record = ref({}); // 工作表中所有悬浮图表的数据 + const floatEchartToUniverImgDataCaches: Record = ref({}); // 工作表中所有悬浮图表转成univer图片后的数据 + + const focusedFloatImageDataCache = ref({ ...defaultFocusFloatDomData }); // 已聚焦的悬浮图片数据 + const floatImageDataCaches: Record = ref({}); // 工作表中所有悬浮图片的数据 + const floatImageToUniverImgDataCaches: Record = ref({}); // 工作表中所有悬浮图片转成univer图片后的数据 + + const dialogSelectCellDataCache: any = ref(null); // 弹窗选择区域的单元格信息 + const dialogSelectCellStateCache: any = ref(null); // 弹窗选择单元格状态 --- 值为时间戳,用于触发页面的状态更新 + + // 重置存储状态为初始值 + const resetStore = () => { + yunzhupaasUniverApiCache.value = null; + univerCreateModeCache.value = null; + + focusedFloatEchartDataCache.value = { ...defaultFocusFloatDomData }; + floatEchartDataCaches.value = {}; + floatEchartToUniverImgDataCaches.value = {}; + + focusedFloatImageDataCache.value = { ...defaultFocusFloatDomData }; + floatImageDataCaches.value = {}; + floatImageToUniverImgDataCaches.value = {}; + + dialogSelectCellDataCache.value = null; + dialogSelectCellStateCache.value = null; + }; + + // 存储univer创建模式 + const setUniverCreateModeCache = (type: string) => { + univerCreateModeCache.value = type; + }; + + // 存储yunzhupaasUniverApi + const setYunzhupaasUniverApiCache = (value: any) => { + yunzhupaasUniverApiCache.value = value ?? null; + }; + + // 根据drawingId获取悬浮图表信息 + const getFloatEchartDataByDrawingId = (drawingId: string) => { + return floatEchartDataCaches.value?.[drawingId] ?? null; + }; + + // 更新已聚焦的悬浮图表数据 + const updateFocusedFloatEchartDataCache = (value: any = {}) => { + focusedFloatEchartDataCache.value = value; + }; + + // 存储工作本中所有悬浮图表的数据 + const setFloatEchartDataCaches = (value: any = {}) => { + floatEchartDataCaches.value = value; + + yunzhupaasUniverApiCache.value?.getSheetsFloatDom()?.saveFloatEchartItems(value); + }; + + // 存储工作本中所有悬浮图表转成univer图片后的数据 + const setFloatEchartToUniverImgDataCaches = (value: any = {}) => { + floatEchartToUniverImgDataCaches.value = value; + }; + + // 根据drawingId获取悬浮图片信息 + const getFloatImageDataByDrawingId = (drawingId: string) => { + return floatImageDataCaches.value?.[drawingId] ?? null; + }; + + // 更新已聚焦的悬浮图片数据 + const updateFocusedFloatImageDataCache = (deliverConfig: any = {}) => { + focusedFloatImageDataCache.value = deliverConfig; + }; + + // 存储工作本中所有悬浮图片的数据 + const setFloatImageDataCaches = (value: any = {}) => { + floatImageDataCaches.value = value; + + yunzhupaasUniverApiCache.value?.getSheetsFloatDom()?.saveFloatImageItems(value); + }; + + // 存储工作本中所有悬浮图片转成univer图片后的数据 + const setFloatImageToUniverImgDataCaches = (value: any) => { + floatImageToUniverImgDataCaches.value = value; + }; + + // 存储弹窗选择单元格的值 + const setDialogSelectCellDataCache = (value: any) => { + if (!value || isNullOrUndefined(value?.startRow) || isNullOrUndefined(value?.startColumn)) { + dialogSelectCellDataCache.value = null; + return; + } + + dialogSelectCellDataCache.value = `${getAlphabetFromIndexRule(value.startColumn)}${value.startRow + 1}`; + }; + + // 取消弹窗选择单元格结果 + const cancelDialogSelectCell = () => { + setDialogSelectCellDataCache(null); + + dialogSelectCellStateCache.value = new Date().getTime(); + }; + + // 确认弹窗选择单元格结果 + const confirmDialogSelectCell = () => { + dialogSelectCellStateCache.value = new Date().getTime(); + }; + + return { + univerCreateModeCache, + + focusedFloatEchartDataCache, + floatEchartDataCaches, + floatEchartToUniverImgDataCaches, + + focusedFloatImageDataCache, + floatImageDataCaches, + floatImageToUniverImgDataCaches, + + dialogSelectCellDataCache, + dialogSelectCellStateCache, + + setUniverCreateModeCache, + setYunzhupaasUniverApiCache, + + getFloatEchartDataByDrawingId, + updateFocusedFloatEchartDataCache, + setFloatEchartDataCaches, + setFloatEchartToUniverImgDataCaches, + + getFloatImageDataByDrawingId, + updateFocusedFloatImageDataCache, + setFloatImageDataCaches, + setFloatImageToUniverImgDataCaches, + + setDialogSelectCellDataCache, + cancelDialogSelectCell, + confirmDialogSelectCell, + + resetStore, + }; + })(); +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-excel-file.operation.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-excel-file.operation.ts new file mode 100644 index 0000000..888d51b --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-excel-file.operation.ts @@ -0,0 +1,30 @@ +import { type ICommand, type IAccessor, CommandType } from '@univerjs/core'; +import { YunzhupaasSheetsExcelFileService } from '../../services/sheet-excel-file.service'; +import { YunzhupaasCommandIds } from '../../utils/define'; + +export const YunzhupaasSheetsImportExcelFileOperation: ICommand = { + id: YunzhupaasCommandIds.importExcelFile, + type: CommandType.OPERATION, + handler: async (_: IAccessor) => { + return true; + }, +}; + +export const YunzhupaasSheetsDownloadExcelFileOperation: ICommand = { + id: YunzhupaasCommandIds.downloadExcelFile, + type: CommandType.OPERATION, + handler: async (_: IAccessor) => { + return true; + }, +}; + +export const YunzhupaasSheetsImportCsvFileOperation: ICommand = { + id: YunzhupaasCommandIds.importCsvFile, + type: CommandType.OPERATION, + handler: async (accessor: IAccessor) => { + const yunzhupaasSheetsExcelFileService = accessor.get(YunzhupaasSheetsExcelFileService); + yunzhupaasSheetsExcelFileService?.handleImportCsv(); + + return true; + }, +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-float-echart.operation.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-float-echart.operation.ts new file mode 100644 index 0000000..463eb33 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-float-echart.operation.ts @@ -0,0 +1,63 @@ +import { type ICommand, type IAccessor, CommandType } from '@univerjs/core'; +import { YunzhupaasSheetsFloatEchartService } from '../../services/sheet-float-echart.service'; +import { YunzhupaasCommandIds } from '../../utils/define'; + +export const YunzhupaasSheetsInsertedFloatEchartOperation: ICommand = { + id: YunzhupaasCommandIds.insertedFloatEchart, + type: CommandType.OPERATION, + handler: async (_: IAccessor) => { + return true; + }, +}; + +export const YunzhupaasSheetsInsertFloatBarEchartOperation: ICommand = { + id: YunzhupaasCommandIds.insertFloatBarEchart, + type: CommandType.OPERATION, + handler: async (accessor: IAccessor) => { + const yunzhupaasSheetsFloatEchartService = accessor.get(YunzhupaasSheetsFloatEchartService); + yunzhupaasSheetsFloatEchartService.insertFloatEchart('YunzhupaasUniverFloatBarEchart'); + + return true; + }, +}; + +export const YunzhupaasSheetsInsertFloatLineEchartOperation: ICommand = { + id: YunzhupaasCommandIds.insertFloatLineEchart, + type: CommandType.OPERATION, + handler: async (accessor: IAccessor) => { + const yunzhupaasSheetsFloatEchartService = accessor.get(YunzhupaasSheetsFloatEchartService); + yunzhupaasSheetsFloatEchartService.insertFloatEchart('YunzhupaasUniverFloatLineEchart'); + + return true; + }, +}; + +export const YunzhupaasSheetsInsertFloatPieEchartOperation: ICommand = { + id: YunzhupaasCommandIds.insertFloatPieEchart, + type: CommandType.OPERATION, + handler: async (accessor: IAccessor) => { + const yunzhupaasSheetsFloatEchartService = accessor.get(YunzhupaasSheetsFloatEchartService); + yunzhupaasSheetsFloatEchartService.insertFloatEchart('YunzhupaasUniverFloatPieEchart'); + + return true; + }, +}; + +export const YunzhupaasSheetsInsertFloatRadarEchartOperation: ICommand = { + id: YunzhupaasCommandIds.insertFloatRadarEchart, + type: CommandType.OPERATION, + handler: async (accessor: IAccessor) => { + const yunzhupaasSheetsFloatEchartService = accessor.get(YunzhupaasSheetsFloatEchartService); + yunzhupaasSheetsFloatEchartService.insertFloatEchart('YunzhupaasUniverFloatRadarEchart'); + + return true; + }, +}; + +export const YunzhupaasSheetsFocusEchartOperation: ICommand = { + id: YunzhupaasCommandIds.focusFloatEchart, + type: CommandType.OPERATION, + handler: async (_: IAccessor) => { + return true; + }, +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-float-image.operation.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-float-image.operation.ts new file mode 100644 index 0000000..aba8914 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-float-image.operation.ts @@ -0,0 +1,30 @@ +import { type ICommand, type IAccessor, CommandType } from '@univerjs/core'; +import { YunzhupaasSheetsFloatImageService } from '../../services/sheet-float-image.service'; +import { YunzhupaasCommandIds } from '../../utils/define'; + +export const YunzhupaasSheetsInsertFloatImageOperation: ICommand = { + id: YunzhupaasCommandIds.insertFloatImage, + type: CommandType.OPERATION, + handler: async (accessor: IAccessor) => { + const yunzhupaasSheetsFloatImageService = accessor.get(YunzhupaasSheetsFloatImageService); + yunzhupaasSheetsFloatImageService.insertFloatImage(); + + return true; + }, +}; + +export const YunzhupaasSheetsInsertedFloatImageOperation: ICommand = { + id: YunzhupaasCommandIds.insertedFloatImage, + type: CommandType.OPERATION, + handler: async (_: IAccessor) => { + return true; + }, +}; + +export const YunzhupaasSheetsFocusFloatImageOperation: ICommand = { + id: YunzhupaasCommandIds.focusFloatImage, + type: CommandType.OPERATION, + handler: async (_: IAccessor) => { + return true; + }, +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-preview.operation.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-preview.operation.ts new file mode 100644 index 0000000..1559c4f --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/commands/operations/sheet-preview.operation.ts @@ -0,0 +1,10 @@ +import { type ICommand, type IAccessor, CommandType } from '@univerjs/core'; +import { YunzhupaasCommandIds } from '../../utils/define'; + +export const YunzhupaasSheetsPreviewOperation: ICommand = { + id: YunzhupaasCommandIds.preview, + type: CommandType.OPERATION, + handler: async (_: IAccessor) => { + return true; + }, +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Dialog/selectCell.vue b/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Dialog/selectCell.vue new file mode 100644 index 0000000..c307b65 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Dialog/selectCell.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Echart/cell.vue b/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Echart/cell.vue new file mode 100644 index 0000000..e61ea64 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Echart/cell.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Echart/float.vue b/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Echart/float.vue new file mode 100644 index 0000000..b9cb729 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Echart/float.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Image/float.vue b/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Image/float.vue new file mode 100644 index 0000000..334a815 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/components/Image/float.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-excel-file.menu.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-excel-file.menu.ts new file mode 100644 index 0000000..ef63f8a --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-excel-file.menu.ts @@ -0,0 +1,46 @@ +import { IMenuButtonItem, IMenuSelectorItem, MenuItemType } from '@univerjs/ui'; +import { + YunzhupaasSheetsDownloadExcelFileOperation, + YunzhupaasSheetsImportCsvFileOperation, + YunzhupaasSheetsImportExcelFileOperation, +} from '../../commands/operations/sheet-excel-file.operation'; +import { YunzhupaasCommandIds } from '../../utils/define'; + +export const YunzhupaasSheetsExcelFileMenuFactory = (): IMenuSelectorItem => { + return { + id: YunzhupaasCommandIds.excelFileOperations, + type: MenuItemType.SUBITEMS, + icon: 'DirectExportSingle', + tooltip: 'yunzhupaasSheetExcelFileMenu.tooltip', + }; +}; + +export const YunzhupaasSheetsImportExcelFileMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsImportExcelFileOperation.id, + type: MenuItemType.BUTTON, + icon: 'UploadSingle', + tooltip: 'yunzhupaasSheetImportExcelFileMenu.tooltip', + title: 'yunzhupaasSheetImportExcelFileMenu.title', + }; +}; + +export const YunzhupaasSheetsDownloadExcelFileMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsDownloadExcelFileOperation.id, + type: MenuItemType.BUTTON, + icon: 'ExportSingle', + tooltip: 'yunzhupaasSheetDownloadExcelFileMenu.tooltip', + title: 'yunzhupaasSheetDownloadExcelFileMenu.title', + }; +}; + +export const YunzhupaasSheetsImportCsvFileMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsImportCsvFileOperation.id, + type: MenuItemType.BUTTON, + icon: 'UpperFloorSingle', + tooltip: 'yunzhupaasSheetImportCsvFileMenu.tooltip', + title: 'yunzhupaasSheetImportCsvFileMenu.title', + }; +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-float-echart.menu.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-float-echart.menu.ts new file mode 100644 index 0000000..6641db3 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-float-echart.menu.ts @@ -0,0 +1,57 @@ +import { IMenuButtonItem, IMenuSelectorItem, MenuItemType } from '@univerjs/ui'; +import { + YunzhupaasSheetsInsertFloatBarEchartOperation, + YunzhupaasSheetsInsertFloatLineEchartOperation, + YunzhupaasSheetsInsertFloatPieEchartOperation, + YunzhupaasSheetsInsertFloatRadarEchartOperation, +} from '../../commands/operations/sheet-float-echart.operation'; +import { YunzhupaasCommandIds } from '../../utils/define'; + +export const YunzhupaasSheetsFloatEchartMenuFactory = (): IMenuSelectorItem => { + return { + id: YunzhupaasCommandIds.floatEchartOperations, + type: MenuItemType.SUBITEMS, + icon: 'SystemSingle', + tooltip: 'yunzhupaasSheetFloatEchartMenu.tooltip', + }; +}; + +export const YunzhupaasSheetsInsertFloatBarEchartMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsInsertFloatBarEchartOperation.id, + type: MenuItemType.BUTTON, + icon: 'ChartSingle', + tooltip: 'yunzhupaasSheetInsertFloatBarEchartMenu.tooltip', + title: 'yunzhupaasSheetInsertFloatBarEchartMenu.title', + }; +}; + +export const YunzhupaasSheetsInsertFloatLineEchartMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsInsertFloatLineEchartOperation.id, + type: MenuItemType.BUTTON, + icon: 'LineChartSingle', + tooltip: 'yunzhupaasSheetInsertFloatLineEchartMenu.tooltip', + title: 'yunzhupaasSheetInsertFloatLineEchartMenu.title', + }; +}; + +export const YunzhupaasSheetsInsertFloatPieEchartMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsInsertFloatPieEchartOperation.id, + type: MenuItemType.BUTTON, + icon: 'PieChartSingle', + tooltip: 'yunzhupaasSheetInsertFloatPieEchartMenu.tooltip', + title: 'yunzhupaasSheetInsertFloatPieEchartMenu.title', + }; +}; + +export const YunzhupaasSheetsInsertFloatRadarEchartMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsInsertFloatRadarEchartOperation.id, + type: MenuItemType.BUTTON, + icon: 'RadarChartSingle', + tooltip: 'yunzhupaasSheetInsertFloatRadarEchartMenu.tooltip', + title: 'yunzhupaasSheetInsertFloatRadarEchartMenu.title', + }; +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-float-image.menu.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-float-image.menu.ts new file mode 100644 index 0000000..0791c9c --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-float-image.menu.ts @@ -0,0 +1,11 @@ +import { IMenuButtonItem, MenuItemType } from '@univerjs/ui'; +import { YunzhupaasSheetsInsertFloatImageOperation } from '../../commands/operations/sheet-float-image.operation'; + +export const YunzhupaasSheetsInsertFloatImageMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsInsertFloatImageOperation.id, + type: MenuItemType.BUTTON, + tooltip: 'yunzhupaasSheetInsertFloatImageMenu.tooltip', + title: 'yunzhupaasSheetInsertFloatImageMenu.title', + }; +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-preview.menu.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-preview.menu.ts new file mode 100644 index 0000000..0b3a120 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/menus/sheet-preview.menu.ts @@ -0,0 +1,12 @@ +import { IMenuButtonItem, MenuItemType } from '@univerjs/ui'; +import { YunzhupaasSheetsPreviewOperation } from '../../commands/operations/sheet-preview.operation'; + +export const YunzhupaasSheetsPreviewMenuFactory = (): IMenuButtonItem => { + return { + id: YunzhupaasSheetsPreviewOperation.id, + type: MenuItemType.BUTTON, + icon: 'ViewModeSingle', + tooltip: 'yunzhupaasSheetPreviewMenu.tooltip', + title: 'yunzhupaasSheetPreviewMenu.title', + }; +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-dialog.controller.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-dialog.controller.ts new file mode 100644 index 0000000..f2f955d --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-dialog.controller.ts @@ -0,0 +1,18 @@ +import { Disposable, Inject } from '@univerjs/core'; +import { ComponentManager } from '@univerjs/ui'; + +import univerDialogSelectCellComponent from '../components/Dialog/selectCell.vue'; +import { YunzhupaasUniverDialogSelectCellKey } from '../utils/define'; + +export class YunzhupaasSheetsDialogController extends Disposable { + constructor(@Inject(ComponentManager) private readonly _componentManager: ComponentManager) { + super(); + + this._registerComponents(); + } + + private _registerComponents(): void { + // 注册选区组件进来 + this.disposeWithMe(this._componentManager.register(YunzhupaasUniverDialogSelectCellKey, univerDialogSelectCellComponent, { framework: 'vue3' })); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-excel-file.controller.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-excel-file.controller.ts new file mode 100644 index 0000000..a39fe36 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-excel-file.controller.ts @@ -0,0 +1,63 @@ +import { Disposable, ICommandService, Inject } from '@univerjs/core'; +import { ComponentManager, IMenuManagerService, RibbonStartGroup } from '@univerjs/ui'; +import { DirectExportSingle, UploadSingle, UpperFloorSingle } from '@univerjs/icons'; + +import { + YunzhupaasSheetsDownloadExcelFileOperation, + YunzhupaasSheetsImportCsvFileOperation, + YunzhupaasSheetsImportExcelFileOperation, +} from '../commands/operations/sheet-excel-file.operation'; + +import { YunzhupaasSheetsExcelFileMenuFactory, YunzhupaasSheetsImportExcelFileMenuFactory } from '../controllers/menus/sheet-excel-file.menu'; +import { YunzhupaasCommandIds } from '../utils/define'; + +export class YunzhupaasSheetsExcelFileController extends Disposable { + constructor( + @ICommandService private readonly _commandService: ICommandService, + @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, + @Inject(ComponentManager) private readonly _componentManager: ComponentManager, + ) { + super(); + + this._initCommands(); + this._registerComponents(); + this._initMenus(); + } + + private _initCommands(): void { + [YunzhupaasSheetsImportExcelFileOperation, YunzhupaasSheetsDownloadExcelFileOperation, YunzhupaasSheetsImportCsvFileOperation].forEach(command => { + this.disposeWithMe(this._commandService.registerCommand(command)); + }); + } + + private _registerComponents(): void { + // 注册按钮图标 + this.disposeWithMe(this._componentManager.register('DirectExportSingle', DirectExportSingle)); + this.disposeWithMe(this._componentManager.register('UploadSingle', UploadSingle)); + // this.disposeWithMe(this._componentManager.register('ExportSingle', ExportSingle)); + this.disposeWithMe(this._componentManager.register('UpperFloorSingle', UpperFloorSingle)); + } + + private _initMenus(): void { + this._menuManagerService.mergeMenu({ + [RibbonStartGroup.OTHERS]: { + [YunzhupaasCommandIds.excelFileOperations]: { + order: 100, + menuItemFactory: YunzhupaasSheetsExcelFileMenuFactory, + [YunzhupaasSheetsImportExcelFileOperation.id]: { + order: 0, + menuItemFactory: YunzhupaasSheetsImportExcelFileMenuFactory, + }, + // [YunzhupaasSheetsDownloadExcelFileOperation.id]: { + // order: 1, + // menuItemFactory: YunzhupaasSheetsDownloadExcelFileMenuFactory, + // }, + // [YunzhupaasSheetsImportCsvFileOperation.id]: { + // order: 2, + // menuItemFactory: YunzhupaasSheetsImportCsvFileMenuFactory, + // }, + }, + }, + }); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-float-echart.controller.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-float-echart.controller.ts new file mode 100644 index 0000000..1f4d344 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-float-echart.controller.ts @@ -0,0 +1,91 @@ +import { Disposable, ICommandService, Inject } from '@univerjs/core'; +import { ComponentManager, IMenuManagerService, RibbonStartGroup } from '@univerjs/ui'; +import { ChartSingle, LineChartSingle, PieChartSingle, RadarChartSingle, SystemSingle } from '@univerjs/icons'; + +import { + YunzhupaasSheetsInsertedFloatEchartOperation, + YunzhupaasSheetsInsertFloatBarEchartOperation, + YunzhupaasSheetsInsertFloatLineEchartOperation, + YunzhupaasSheetsInsertFloatPieEchartOperation, + YunzhupaasSheetsInsertFloatRadarEchartOperation, + YunzhupaasSheetsFocusEchartOperation, +} from '../commands/operations/sheet-float-echart.operation'; + +import { + YunzhupaasSheetsFloatEchartMenuFactory, + YunzhupaasSheetsInsertFloatBarEchartMenuFactory, + YunzhupaasSheetsInsertFloatLineEchartMenuFactory, + YunzhupaasSheetsInsertFloatPieEchartMenuFactory, + YunzhupaasSheetsInsertFloatRadarEchartMenuFactory, +} from './menus/sheet-float-echart.menu'; + +import univerFloatEchartComponent from '../components/Echart/float.vue'; + +import { YunzhupaasCommandIds, YunzhupaasUniverFloatEchartKey } from '../utils/define'; + +export class YunzhupaasSheetsFloatEchartController extends Disposable { + constructor( + @ICommandService private readonly _commandService: ICommandService, + @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, + @Inject(ComponentManager) private readonly _componentManager: ComponentManager, + ) { + super(); + + this._initCommands(); + this._registerComponents(); + this._initMenus(); + } + + private _initCommands(): void { + [ + YunzhupaasSheetsInsertFloatBarEchartOperation, + YunzhupaasSheetsInsertFloatLineEchartOperation, + YunzhupaasSheetsInsertFloatPieEchartOperation, + YunzhupaasSheetsInsertFloatRadarEchartOperation, + YunzhupaasSheetsInsertedFloatEchartOperation, + YunzhupaasSheetsFocusEchartOperation, + ].forEach(command => { + this.disposeWithMe(this._commandService.registerCommand(command)); + }); + } + + private _registerComponents(): void { + // 注册图表组件进来 + this.disposeWithMe(this._componentManager.register(YunzhupaasUniverFloatEchartKey, univerFloatEchartComponent, { framework: 'vue3' })); + + // 注册按钮图标 + this.disposeWithMe(this._componentManager.register('SystemSingle', SystemSingle)); + this.disposeWithMe(this._componentManager.register('ChartSingle', ChartSingle)); + this.disposeWithMe(this._componentManager.register('LineChartSingle', LineChartSingle)); + this.disposeWithMe(this._componentManager.register('PieChartSingle', PieChartSingle)); + this.disposeWithMe(this._componentManager.register('RadarChartSingle', RadarChartSingle)); + } + + private _initMenus(): void { + this._menuManagerService.mergeMenu({ + // 主菜单 + [RibbonStartGroup.OTHERS]: { + [YunzhupaasCommandIds.floatEchartOperations]: { + order: 10, + menuItemFactory: YunzhupaasSheetsFloatEchartMenuFactory, + [YunzhupaasSheetsInsertFloatBarEchartOperation.id]: { + order: 0, + menuItemFactory: YunzhupaasSheetsInsertFloatBarEchartMenuFactory, + }, + [YunzhupaasSheetsInsertFloatLineEchartOperation.id]: { + order: 1, + menuItemFactory: YunzhupaasSheetsInsertFloatLineEchartMenuFactory, + }, + [YunzhupaasSheetsInsertFloatPieEchartOperation.id]: { + order: 2, + menuItemFactory: YunzhupaasSheetsInsertFloatPieEchartMenuFactory, + }, + [YunzhupaasSheetsInsertFloatRadarEchartOperation.id]: { + order: 3, + menuItemFactory: YunzhupaasSheetsInsertFloatRadarEchartMenuFactory, + }, + }, + }, + }); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-float-image.controller.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-float-image.controller.ts new file mode 100644 index 0000000..d885083 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-float-image.controller.ts @@ -0,0 +1,52 @@ +import { Disposable, ICommandService, Inject } from '@univerjs/core'; +import { ComponentManager, IMenuManagerService, RibbonStartGroup } from '@univerjs/ui'; +import { SHEETS_IMAGE_MENU_ID } from '@univerjs/sheets-drawing-ui'; + +import { + YunzhupaasSheetsInsertFloatImageOperation, + YunzhupaasSheetsInsertedFloatImageOperation, + YunzhupaasSheetsFocusFloatImageOperation, +} from '../commands/operations/sheet-float-image.operation'; +import { YunzhupaasSheetsInsertFloatImageMenuFactory } from './menus/sheet-float-image.menu'; + +import univerFloatImageComponent from '../components/Image/float.vue'; + +import { YunzhupaasUniverFloatImageKey } from '../utils/define'; + +export class YunzhupaasSheetsFloatImageController extends Disposable { + constructor( + @ICommandService private readonly _commandService: ICommandService, + @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, + @Inject(ComponentManager) private readonly _componentManager: ComponentManager, + ) { + super(); + + this._initCommands(); + this._registerComponents(); + this._initMenus(); + } + + private _initCommands(): void { + [YunzhupaasSheetsInsertFloatImageOperation, YunzhupaasSheetsInsertedFloatImageOperation, YunzhupaasSheetsFocusFloatImageOperation].forEach(command => { + this.disposeWithMe(this._commandService.registerCommand(command)); + }); + } + + private _registerComponents(): void { + // 注册图片组件进来 + this.disposeWithMe(this._componentManager.register(YunzhupaasUniverFloatImageKey, univerFloatImageComponent, { framework: 'vue3' })); + } + + private _initMenus(): void { + this._menuManagerService.mergeMenu({ + [RibbonStartGroup.FORMULAS_INSERT]: { + [SHEETS_IMAGE_MENU_ID]: { + [YunzhupaasSheetsInsertFloatImageOperation.id]: { + order: 10, + menuItemFactory: YunzhupaasSheetsInsertFloatImageMenuFactory, + }, + }, + }, + }); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-preview.controller.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-preview.controller.ts new file mode 100644 index 0000000..1d631db --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/controllers/sheet-preview.controller.ts @@ -0,0 +1,52 @@ +import { Disposable, ICommandService, Inject } from '@univerjs/core'; +import { ComponentManager, IMenuManagerService, RibbonStartGroup } from '@univerjs/ui'; +import { ViewModeSingle } from '@univerjs/icons'; + +import { YunzhupaasSheetsPreviewOperation } from '../commands/operations/sheet-preview.operation'; +import { YunzhupaasSheetsPreviewMenuFactory } from '../controllers/menus/sheet-preview.menu'; + +export class YunzhupaasSheetsPreviewController extends Disposable { + constructor( + @ICommandService private readonly _commandService: ICommandService, + @IMenuManagerService private readonly _menuManagerService: IMenuManagerService, + @Inject(ComponentManager) private readonly _componentManager: ComponentManager, + ) { + super(); + + this._initCommands(); + this._registerComponents(); + this._initMenus(); + } + + private _initCommands(): void { + [YunzhupaasSheetsPreviewOperation].forEach(command => { + this.disposeWithMe(this._commandService.registerCommand(command)); + }); + } + + private _registerComponents(): void { + // 注册按钮图标 + this.disposeWithMe(this._componentManager.register('ViewModeSingle', ViewModeSingle)); + } + + private _initMenus(): void { + this._menuManagerService.mergeMenu({ + // 主菜单 + [RibbonStartGroup.OTHERS]: { + [YunzhupaasSheetsPreviewOperation.id]: { + order: 99, + menuItemFactory: YunzhupaasSheetsPreviewMenuFactory, + }, + }, + // 右键菜单 + // [ContextMenuPosition.MAIN_AREA]: { + // [ContextMenuGroup.OTHERS]: { + // [YunzhupaasSheetsPreviewOperation.id]: { + // order: 0, + // menuItemFactory: YunzhupaasSheetsPreviewMenuFactory, + // }, + // }, + // }, + }); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/extensions/sheet-main-fill-direction.extension.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/extensions/sheet-main-fill-direction.extension.ts new file mode 100644 index 0000000..e99e244 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/extensions/sheet-main-fill-direction.extension.ts @@ -0,0 +1,179 @@ +import type { IScale } from '@univerjs/core'; +import type { SpreadsheetSkeleton, UniverRenderingContext } from '@univerjs/engine-render'; +import { DEFAULT_FONTFACE_PLANE, FIX_ONE_PIXEL_BLUR_OFFSET, getColor, SheetExtension } from '@univerjs/engine-render'; + +type CellCoordinates = Array<{ row: number; col: number }>; // 单元格坐标数组 + +interface ClearSheetFillDirectionProps { + key: string; + sheetId: string; +} + +interface SetSheetFillDirectionProps extends ClearSheetFillDirectionProps { + rightArrowCells?: CellCoordinates; + downArrowCells?: CellCoordinates; +} + +interface RenderArrowsProps { + ctx: UniverRenderingContext; + cells: CellCoordinates; + arrow: string; + rowHeights: number[]; + colWidths: number[]; + startRow: number; + endRow: number; + startCol: number; + endCol: number; + offsets: { xOffset: number; yOffset: number }; +} + +// 定义主要扩展类,用于在表格中绘制自定义内容 +export class SetSheetFillDirectionExtension extends SheetExtension { + override uKey: string; + private readonly _sheetId: string; // 用于存储动态传入的 SheetId + private readonly _rightArrowCells: CellCoordinates; // 渲染 → 的条件数组 + private readonly _downArrowCells: CellCoordinates; // 渲染 ↓ 的条件数组 + + constructor(props: SetSheetFillDirectionProps) { + super(); + + const { key, sheetId, rightArrowCells, downArrowCells } = props ?? {}; + this.uKey = key; + this._sheetId = sheetId; + this._rightArrowCells = rightArrowCells ?? []; + this._downArrowCells = downArrowCells ?? []; + } + + // 设置扩展的层级(z-index),必须大于 50 + override get zIndex() { + return 50; + } + + // 重写绘制方法 + override draw(ctx: UniverRenderingContext, _parentScale: IScale, skeleton: SpreadsheetSkeleton) { + if (!this.isValidSkeleton(skeleton)) { + return; + } + + if (!this._rightArrowCells?.length && !this._downArrowCells?.length) { + return; + } + + const { rowColumnSegment, rowHeightAccumulation, columnTotalWidth, columnWidthAccumulation, rowTotalHeight } = skeleton; + const { startRow, endRow, startColumn, endColumn } = rowColumnSegment; + if (!rowHeightAccumulation || !columnWidthAccumulation || columnTotalWidth === undefined || rowTotalHeight === undefined) { + return; + } + + this.setupCanvas(ctx); + + // 绘制 → 箭头 + this.renderArrows({ + ctx, + cells: this._rightArrowCells, + arrow: '→', + rowHeights: rowHeightAccumulation, + colWidths: columnWidthAccumulation, + startRow, + endRow, + startCol: startColumn, + endCol: endColumn, + offsets: { xOffset: 2, yOffset: -2 }, + }); + + // 绘制 ↓ 箭头 + this.renderArrows({ + ctx, + cells: this._downArrowCells, + arrow: '↓', + rowHeights: rowHeightAccumulation, + colWidths: columnWidthAccumulation, + startRow, + endRow, + startCol: startColumn, + endCol: endColumn, + offsets: { xOffset: 0, yOffset: 1 }, + }); + + // 绘制分隔线 + ctx.stroke(); + } + + // 验证骨架和必要属性是否有效 + private isValidSkeleton(skeleton: SpreadsheetSkeleton): boolean { + // 如果骨架信息不存在,则退出绘制 + if (!skeleton) { + return false; + } + + // 限制扩展仅在指定的工作表上生效 + return skeleton?.worksheet?.getSheetId() === this._sheetId; + } + + // 设置 Canvas 的绘图属性 + private setupCanvas(ctx: UniverRenderingContext) { + // 设置背景色为浅灰色 + ctx.fillStyle = getColor([255, 255, 255]); + // 设置文本水平对齐方式 + ctx.textAlign = 'left'; + // 设置文本垂直对齐方式 + ctx.textBaseline = 'top'; + // 设置文本颜色为黑色 + ctx.fillStyle = getColor([0, 0, 0])!; + // 开始绘制路径 + ctx.beginPath(); + // 设置线宽为 1 + ctx.lineWidth = 1; + // 防止边界模糊的偏移值,使绘制的边界在高分辨率屏幕下更清晰 + ctx.translateWithPrecisionRatio(FIX_ONE_PIXEL_BLUR_OFFSET, FIX_ONE_PIXEL_BLUR_OFFSET); + // 设置分隔线颜色为浅灰色 + ctx.strokeStyle = getColor([217, 217, 217]); + // 设置字体样式 + ctx.font = `10px ${DEFAULT_FONTFACE_PLANE}`; + } + + // 渲染箭头 + private renderArrows(props: RenderArrowsProps) { + const { + ctx, + cells, + arrow, + rowHeights, + colWidths, + startRow, + endRow, + startCol, + endCol, + offsets = { xOffset: 0, yOffset: 0 }, // 默认偏移量 + } = props ?? {}; + + for (const { row, col } of cells) { + if (row >= startRow - 1 && row <= endRow && col >= startCol - 1 && col <= endCol) { + const rowStart = rowHeights[row - 1] || 0; + const colStart = colWidths[col - 1] || 0; + ctx.fillText(arrow, colStart + offsets.xOffset, rowStart + offsets.yOffset); + } + } + } +} + +// 定义清理扩展类,用于覆盖并清除扩展效果 +export class ClearSheetFillDirectionExtension extends SheetExtension { + override uKey: string; + private readonly _sheetId: string; // 用于存储动态传入的 SheetId + + constructor(props: ClearSheetFillDirectionProps) { + super(); + + const { key, sheetId } = props ?? {}; + this.uKey = key; + this._sheetId = sheetId; // 将传入的 SheetId 存储到类中 + } + + // 空的绘制方法,不进行任何绘制操作 + override draw(_ctx: UniverRenderingContext, _parentScale: IScale, skeleton: SpreadsheetSkeleton) { + if (skeleton?.worksheet?.getSheetId() !== this._sheetId) { + return; + } + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/extensions/sheet-main-relation-cell.extension.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/extensions/sheet-main-relation-cell.extension.ts new file mode 100644 index 0000000..86b0e32 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/extensions/sheet-main-relation-cell.extension.ts @@ -0,0 +1,178 @@ +import type { IScale } from '@univerjs/core'; +import { SpreadsheetSkeleton, UniverRenderingContext } from '@univerjs/engine-render'; +import { DEFAULT_FONTFACE_PLANE, FIX_ONE_PIXEL_BLUR_OFFSET, getColor, SheetExtension } from '@univerjs/engine-render'; + +type CellCoordinates = Array<{ row: number; col: number }>; // 单元格坐标数组 + +interface ClearSheetRelationCellProps { + key: string; + sheetId: string; +} + +interface SetSheetRelationCellProps extends ClearSheetRelationCellProps { + rightArrowCells?: CellCoordinates; + downArrowCells?: CellCoordinates; +} + +interface RenderArrowsProps { + ctx: UniverRenderingContext; + cells: CellCoordinates; + arrow: string; + rowHeights: number[]; + colWidths: number[]; + startRow: number; + endRow: number; + startCol: number; + endCol: number; + offsetsX?: number; + offsetsY?: number; +} + +// 定义主要扩展类,用于在表格中绘制自定义内容 +export class SetSheetRelationCellExtension extends SheetExtension { + override uKey: string; + private readonly _sheetId: string; // 用于存储动态传入的 SheetId + private readonly _rightArrowCells: CellCoordinates; // 渲染 → 的条件数组 + private readonly _downArrowCells: CellCoordinates; // 渲染 ↓ 的条件数组 + + constructor(props: SetSheetRelationCellProps) { + super(); + + const { key, sheetId, rightArrowCells, downArrowCells } = props ?? {}; + this.uKey = key; + this._sheetId = sheetId; + this._rightArrowCells = rightArrowCells ?? []; + this._downArrowCells = downArrowCells ?? []; + } + + // 设置扩展的层级(z-index),必须大于 50 + override get zIndex() { + return 50; + } + + // 重写绘制方法 + override draw(ctx: UniverRenderingContext, _parentScale: IScale, skeleton: SpreadsheetSkeleton) { + if (!this.isValidSkeleton(skeleton)) { + return; + } + + if (!this._rightArrowCells?.length && !this._downArrowCells?.length) { + return; + } + + const { rowColumnSegment, rowHeightAccumulation, columnTotalWidth, columnWidthAccumulation, rowTotalHeight } = skeleton; + const { startRow, endRow, startColumn, endColumn } = rowColumnSegment; + if (!rowHeightAccumulation || !columnWidthAccumulation || columnTotalWidth === undefined || rowTotalHeight === undefined) { + return; + } + + this.setupCanvas(ctx); + + // 绘制 → 箭头 + this.renderArrows({ + ctx, + cells: this._rightArrowCells, + arrow: '→', + rowHeights: rowHeightAccumulation, + colWidths: columnWidthAccumulation, + startRow, + endRow, + startCol: startColumn, + endCol: endColumn, + offsetsX: undefined, + offsetsY: -2, + }); + + // 绘制 ↓ 箭头 + this.renderArrows({ + ctx, + cells: this._downArrowCells, + arrow: '↓', + rowHeights: rowHeightAccumulation, + colWidths: columnWidthAccumulation, + startRow, + endRow, + startCol: startColumn, + endCol: endColumn, + offsetsX: 0, + offsetsY: 12, + }); + + // 绘制分隔线 + ctx.stroke(); + } + + // 验证骨架和必要属性是否有效 + private isValidSkeleton(skeleton: SpreadsheetSkeleton): boolean { + // 如果骨架信息不存在,则退出绘制 + if (!skeleton) { + return false; + } + + // 限制扩展仅在指定的工作表上生效 + return skeleton?.worksheet?.getSheetId() === this._sheetId; + } + + // 设置 Canvas 的绘图属性 + private setupCanvas(ctx: UniverRenderingContext) { + // 设置背景色为浅灰色 + ctx.fillStyle = getColor([255, 255, 255]); + // 设置文本水平对齐方式 + ctx.textAlign = 'left'; + // 设置文本垂直对齐方式 + ctx.textBaseline = 'top'; + // 设置文本颜色为黑色 + ctx.fillStyle = getColor([24, 144, 255])!; + // 开始绘制路径 + ctx.beginPath(); + // 设置线宽为 1 + ctx.lineWidth = 1; + // 防止边界模糊的偏移值,使绘制的边界在高分辨率屏幕下更清晰 + ctx.translateWithPrecisionRatio(FIX_ONE_PIXEL_BLUR_OFFSET, FIX_ONE_PIXEL_BLUR_OFFSET); + // 设置分隔线颜色为浅灰色 + ctx.strokeStyle = getColor([217, 217, 217]); + // 设置字体样式 + ctx.font = `10px ${DEFAULT_FONTFACE_PLANE}`; + } + + // 渲染箭头 + private renderArrows(props: RenderArrowsProps) { + const { ctx, cells, arrow, rowHeights, colWidths, startRow, endRow, startCol, endCol, offsetsX, offsetsY = 0 } = props ?? {}; + + for (const { row, col } of cells) { + if (row >= startRow - 1 && row <= endRow && col >= startCol - 1 && col <= endCol) { + const rowStart = rowHeights[row - 1] || 0; + const colStart = colWidths[col - 1] || 0; + + const colEnd = colWidths[col] || colWidths[col - 1] || 0; + const cellWidth = colEnd - colStart; + + const xPosition = offsetsX !== undefined ? colStart + offsetsX : colStart + cellWidth / 2 - 6; + const yPosition = rowStart + offsetsY; + + ctx.fillText(arrow, xPosition, yPosition); + } + } + } +} + +// 定义清理扩展类,用于覆盖并清除扩展效果 +export class ClearSheetRelationCellExtension extends SheetExtension { + override uKey: string; + private readonly _sheetId: string; // 用于存储动态传入的 SheetId + + constructor(props: ClearSheetRelationCellProps) { + super(); + + const { key, sheetId } = props ?? {}; + this.uKey = key; + this._sheetId = sheetId; // 将传入的 SheetId 存储到类中 + } + + // 空的绘制方法,不进行任何绘制操作 + override draw(_ctx: UniverRenderingContext, _parentScale: IScale, skeleton: SpreadsheetSkeleton) { + if (skeleton?.worksheet?.getSheetId() !== this._sheetId) { + return; + } + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-cell-echart.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-cell-echart.ts new file mode 100644 index 0000000..ac95bdb --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-cell-echart.ts @@ -0,0 +1,9 @@ +import { YunzhupaasSheetsCellEchartService } from '../services/sheet-cell-echart.service'; + +export class YunzhupaasFacadeSheetsCellEchart { + constructor(private readonly _yunzhupaasSheetsCellEchartService: YunzhupaasSheetsCellEchartService) {} + + insertCellEchart(file: File, row: number, col: number, echartConfig: any) { + return this._yunzhupaasSheetsCellEchartService.insertCellEchart(file, row, col, echartConfig); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-cell.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-cell.ts new file mode 100644 index 0000000..5a97377 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-cell.ts @@ -0,0 +1,26 @@ +import { ICellData } from '@univerjs/core'; +import { YunzhupaasSheetsCellService } from '../services/sheet-cell.service'; + +export class YunzhupaasFacadeSheetsCell { + constructor(private readonly _yunzhupaasSheetsCellService: YunzhupaasSheetsCellService) {} + + getCellData(col: number, row: number) { + return this._yunzhupaasSheetsCellService?.getCellData(col, row); + } + + setCellData(col: number, row: number, cellData: ICellData) { + this._yunzhupaasSheetsCellService?.setCellData(col, row, cellData); + } + + getTargetCellSize(col: number, row: number) { + return this._yunzhupaasSheetsCellService?.getTargetCellSize(col, row); + } + + getCurrentSheetCellsCustom() { + return this._yunzhupaasSheetsCellService?.getCurrentSheetCellsCustom(); + } + + refreshRangeCellsView(range: any) { + this._yunzhupaasSheetsCellService?.refreshRangeCellsView(range); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-dom.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-dom.ts new file mode 100644 index 0000000..8229ba0 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-dom.ts @@ -0,0 +1,17 @@ +import { YunzhupaasSheetsFloatDomService } from '../services/sheet-float-dom.service'; + +export class YunzhupaasFacadeSheetsFloatDom { + constructor(private readonly _yunzhupaasSheetsFloatDomService: YunzhupaasSheetsFloatDomService) {} + + savePiniaStoreId(value: any) { + this._yunzhupaasSheetsFloatDomService.savePiniaStoreId(value); + } + + saveFloatEchartItems(data: any) { + this._yunzhupaasSheetsFloatDomService.saveFloatEchartItems(data); + } + + saveFloatImageItems(data: any) { + this._yunzhupaasSheetsFloatDomService.saveFloatImageItems(data); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-echart.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-echart.ts new file mode 100644 index 0000000..a782cae --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-echart.ts @@ -0,0 +1,13 @@ +import { YunzhupaasSheetsFloatEchartService } from '../services/sheet-float-echart.service'; + +export class YunzhupaasFacadeSheetsFloatEchart { + constructor(private readonly _yunzhupaasSheetsFloatEchartService: YunzhupaasSheetsFloatEchartService) {} + + savePiniaStoreId(value: any) { + this._yunzhupaasSheetsFloatEchartService.savePiniaStoreId(value); + } + + clearFocusDrawingId() { + this._yunzhupaasSheetsFloatEchartService.clearFocusDrawingId(); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-image.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-image.ts new file mode 100644 index 0000000..457fb32 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-float-image.ts @@ -0,0 +1,13 @@ +import { YunzhupaasSheetsFloatImageService } from '../services/sheet-float-image.service'; + +export class YunzhupaasFacadeSheetsFloatImage { + constructor(private readonly _yunzhupaasSheetsFloatImageService: YunzhupaasSheetsFloatImageService) {} + + savePiniaStoreId(value: any) { + this._yunzhupaasSheetsFloatImageService.savePiniaStoreId(value); + } + + clearFocusDrawingId() { + this._yunzhupaasSheetsFloatImageService.clearFocusDrawingId(); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-print.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-print.ts new file mode 100644 index 0000000..3e72a8b --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-print.ts @@ -0,0 +1,9 @@ +import { YunzhupaasSheetsPrintService } from '../services/sheet-print.service'; + +export class YunzhupaasFacadeSheetsPrint { + constructor(private readonly _yunzhupaasSheetsPrintService: YunzhupaasSheetsPrintService) {} + + getLayouts(config: any) { + return this._yunzhupaasSheetsPrintService.getLayouts(config); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-range.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-range.ts new file mode 100644 index 0000000..adab76a --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/f-sheet-range.ts @@ -0,0 +1,9 @@ +import { YunzhupaasSheetsRangeService } from '../services/sheet-range.service'; + +export class YunzhupaasFacadeSheetsRange { + constructor(private readonly _yunzhupaasSheetsRangeService: YunzhupaasSheetsRangeService) {} + + recoveryRange(row: number, col: number) { + return this._yunzhupaasSheetsRangeService?.recoveryRange(row, col); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/index.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/index.ts new file mode 100644 index 0000000..dc776c4 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/facade/index.ts @@ -0,0 +1,131 @@ +import { Injector, Univer, IUniverInstanceService, ICommandService, FUniver, LifecycleService } from '@univerjs/core'; +import '@univerjs/sheets/facade'; +import '@univerjs/ui/facade'; +import '@univerjs/docs-ui/facade'; +import '@univerjs/sheets-ui/facade'; + +import '@univerjs/sheets-filter/facade'; +import '@univerjs/sheets-data-validation/facade'; +import '@univerjs/sheets-hyper-link/facade'; +import '@univerjs/sheets-hyper-link-ui/facade'; +import '@univerjs/watermark/facade'; +import '@univerjs/sheets-thread-comment/facade'; +import '@univerjs/sheets-crosshair-highlight/facade'; + +import { YunzhupaasFacadeSheetsCell } from '../facade/f-sheet-cell'; +import { YunzhupaasSheetsCellService } from '../services/sheet-cell.service'; + +import { YunzhupaasFacadeSheetsRange } from '../facade/f-sheet-range'; +import { YunzhupaasSheetsRangeService } from '../services/sheet-range.service'; + +import { YunzhupaasFacadeSheetsFloatDom } from '../facade/f-sheet-float-dom'; +import { YunzhupaasSheetsFloatDomService } from '../services/sheet-float-dom.service'; + +import { YunzhupaasFacadeSheetsFloatEchart } from './f-sheet-float-echart'; +import { YunzhupaasSheetsFloatEchartService } from '../services/sheet-float-echart.service'; + +import { YunzhupaasFacadeSheetsCellEchart } from '../facade/f-sheet-cell-echart'; +import { YunzhupaasSheetsCellEchartService } from '../services/sheet-cell-echart.service'; + +import { YunzhupaasFacadeSheetsFloatImage } from './f-sheet-float-image'; +import { YunzhupaasSheetsFloatImageService } from '../services/sheet-float-image.service'; + +import { YunzhupaasFacadeSheetsPrint } from '../facade/f-sheet-print'; +import { YunzhupaasSheetsPrintService } from '../services/sheet-print.service'; + +export class YunzhupaasFUniver extends FUniver { + static newAPI(wrapped: Univer | Injector): YunzhupaasFUniver { + const injector = wrapped instanceof Univer ? wrapped.__getInjector() : wrapped; + const commandService = injector.get(ICommandService); + const instanceService = injector.get(IUniverInstanceService); + + if (!commandService || !instanceService) { + throw new Error('注入ICommandService或IUniverInstanceService发生错误'); + } + + return new YunzhupaasFUniver(injector, commandService, instanceService); + } + + constructor(injector: Injector, commandService: ICommandService, instanceService: IUniverInstanceService) { + const lifecycleService = injector.get(LifecycleService); + if (!lifecycleService) { + throw new Error('LifecycleService 未正确注入'); + } + + super(injector, commandService, instanceService, lifecycleService); + } + + getInjector() { + return this._injector; + } + + getSheetsCell(): YunzhupaasFacadeSheetsCell | null { + const yunzhupaasSheetsCellService = this._injector.get(YunzhupaasSheetsCellService); + + if (!yunzhupaasSheetsCellService) { + return null; + } + + return this._injector.createInstance(YunzhupaasFacadeSheetsCell, yunzhupaasSheetsCellService); + } + + getSheetsRange(): YunzhupaasFacadeSheetsRange | null { + const yunzhupaasSheetsRangeService = this._injector.get(YunzhupaasSheetsRangeService); + + if (!yunzhupaasSheetsRangeService) { + return null; + } + + return this._injector.createInstance(YunzhupaasFacadeSheetsRange, yunzhupaasSheetsRangeService); + } + + getSheetsFloatDom(): YunzhupaasFacadeSheetsFloatDom | null { + const yunzhupaasSheetsFloatDomService = this._injector.get(YunzhupaasSheetsFloatDomService); + + if (!yunzhupaasSheetsFloatDomService) { + return null; + } + + return this._injector.createInstance(YunzhupaasFacadeSheetsFloatDom, yunzhupaasSheetsFloatDomService); + } + + getSheetsFloatEchart(): YunzhupaasFacadeSheetsFloatEchart | null { + const yunzhupaasSheetsFloatEchartService = this._injector.get(YunzhupaasSheetsFloatEchartService); + + if (!yunzhupaasSheetsFloatEchartService) { + return null; + } + + return this._injector.createInstance(YunzhupaasFacadeSheetsFloatEchart, yunzhupaasSheetsFloatEchartService); + } + + getSheetsCellEchart(): YunzhupaasFacadeSheetsCellEchart | null { + const yunzhupaasSheetsCellEchartService = this._injector.get(YunzhupaasSheetsCellEchartService); + + if (!yunzhupaasSheetsCellEchartService) { + return null; + } + + return this._injector.createInstance(YunzhupaasFacadeSheetsCellEchart, yunzhupaasSheetsCellEchartService); + } + + getSheetsFloatImage(): YunzhupaasFacadeSheetsFloatImage | null { + const yunzhupaasSheetsFloatImageService = this._injector.get(YunzhupaasSheetsFloatImageService); + + if (!yunzhupaasSheetsFloatImageService) { + return null; + } + + return this._injector.createInstance(YunzhupaasFacadeSheetsFloatImage, yunzhupaasSheetsFloatImageService); + } + + getSheetsPrint(): YunzhupaasFacadeSheetsPrint | null { + const yunzhupaasSheetsPrintService = this._injector.get(YunzhupaasSheetsPrintService); + + if (!yunzhupaasSheetsPrintService) { + return null; + } + + return this._injector.createInstance(YunzhupaasFacadeSheetsPrint, yunzhupaasSheetsPrintService); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/locales/zh-CN.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/locales/zh-CN.ts new file mode 100644 index 0000000..834ee36 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/locales/zh-CN.ts @@ -0,0 +1,48 @@ +export default { + yunzhupaasSheetFloatEchartMenu: { + tooltip: '图表', + }, + yunzhupaasSheetInsertFloatBarEchartMenu: { + title: '柱状图', + tooltip: '柱状图-图表', + }, + yunzhupaasSheetInsertFloatLineEchartMenu: { + title: '折线图', + tooltip: '折线图-图表', + }, + yunzhupaasSheetInsertFloatPieEchartMenu: { + title: '饼图', + tooltip: '饼图-图表', + }, + yunzhupaasSheetInsertFloatRadarEchartMenu: { + title: '雷达图', + tooltip: '雷达图-图表', + }, + yunzhupaasSheetInsertFloatImageMenu: { + title: '自定义悬浮图片', + tooltip: '自定义悬浮图片-图片', + }, + yunzhupaasSheetExcelFileMenu: { + tooltip: 'Excel文件', + }, + yunzhupaasSheetImportExcelFileMenu: { + title: '导入Excel', + tooltip: '导入Excel', + }, + yunzhupaasSheetDownloadExcelFileMenu: { + title: '导出Excel', + tooltip: '导出Excel', + }, + yunzhupaasSheetImportCsvFileMenu: { + title: '导入CSV', + tooltip: '导入CSV', + }, + yunzhupaasSheetPreviewMenu: { + title: '设计预览功能', + tooltip: '设计预览', + }, + yunzhupaasSheetPrintMenu: { + title: '打印功能', + tooltip: '打印', + }, +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-cell-echart.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-cell-echart.plugin.ts new file mode 100644 index 0000000..71c68c2 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-cell-echart.plugin.ts @@ -0,0 +1,25 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsCellEchartService } from '../services/sheet-cell-echart.service'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsCellEchartPlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_CELL_ECHART_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsCellEchartService]] as Dependency[]).forEach(d => this._injector.add(d)); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-cell.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-cell.plugin.ts new file mode 100644 index 0000000..8784a9a --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-cell.plugin.ts @@ -0,0 +1,25 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsCellService } from '../services/sheet-cell.service'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsCellPlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_CELL_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsCellService]] as Dependency[]).forEach(d => this._injector.add(d)); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-dialog.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-dialog.plugin.ts new file mode 100644 index 0000000..9ec1873 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-dialog.plugin.ts @@ -0,0 +1,27 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsDialogController } from '../controllers/sheet-dialog.controller'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsDialogPlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_DIALOG_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsDialogController]] as Dependency[]).forEach(d => this._injector.add(d)); + + this._injector.get(YunzhupaasSheetsDialogController); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-excel-file.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-excel-file.plugin.ts new file mode 100644 index 0000000..bca5e56 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-excel-file.plugin.ts @@ -0,0 +1,28 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsExcelFileController } from '../controllers/sheet-excel-file.controller'; +import { YunzhupaasSheetsExcelFileService } from '../services/sheet-excel-file.service'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsExcelFilePlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_EXCEL_FILE_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsExcelFileController], [YunzhupaasSheetsExcelFileService]] as Dependency[]).forEach(d => this._injector.add(d)); + + this._injector.get(YunzhupaasSheetsExcelFileController); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-dom.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-dom.plugin.ts new file mode 100644 index 0000000..15f9477 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-dom.plugin.ts @@ -0,0 +1,25 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsFloatDomService } from '../services/sheet-float-dom.service'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsFloatDomPlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_FLOAT_DOM_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsFloatDomService]] as Dependency[]).forEach(d => this._injector.add(d)); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-echart.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-echart.plugin.ts new file mode 100644 index 0000000..057124e --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-echart.plugin.ts @@ -0,0 +1,28 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsFloatEchartController } from '../controllers/sheet-float-echart.controller'; +import { YunzhupaasSheetsFloatEchartService } from '../services/sheet-float-echart.service'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsFloatEchartPlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_FLOAT_ECHART_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsFloatEchartController], [YunzhupaasSheetsFloatEchartService]] as Dependency[]).forEach(d => this._injector.add(d)); + + this._injector.get(YunzhupaasSheetsFloatEchartController); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-image.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-image.plugin.ts new file mode 100644 index 0000000..c80ce4d --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-float-image.plugin.ts @@ -0,0 +1,28 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsFloatImageController } from '../controllers/sheet-float-image.controller'; +import { YunzhupaasSheetsFloatImageService } from '../services/sheet-float-image.service'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsFloatImagePlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_FLOAT_IMAGE_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsFloatImageController], [YunzhupaasSheetsFloatImageService]] as Dependency[]).forEach(d => this._injector.add(d)); + + this._injector.get(YunzhupaasSheetsFloatImageController); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-preview.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-preview.plugin.ts new file mode 100644 index 0000000..43c0bb0 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-preview.plugin.ts @@ -0,0 +1,27 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsPreviewController } from '../controllers/sheet-preview.controller'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsPreviewPlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_PREVIEW_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsPreviewController]] as Dependency[]).forEach(d => this._injector.add(d)); + + this._injector.get(YunzhupaasSheetsPreviewController); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-print.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-print.plugin.ts new file mode 100644 index 0000000..f9a4313 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-print.plugin.ts @@ -0,0 +1,26 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsPrintService } from '../services/sheet-print.service'; +import { YunzhupaasSheetsPrintUiService } from '../services/sheet-print-ui.service'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsPrintPlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_PRINT_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsPrintService], [YunzhupaasSheetsPrintUiService]] as Dependency[]).forEach(d => this._injector.add(d)); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-range.plugin.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-range.plugin.ts new file mode 100644 index 0000000..a360f59 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/plugins/sheet-range.plugin.ts @@ -0,0 +1,25 @@ +import { type Dependency, UniverInstanceType, Plugin, Inject, Injector, DependentOn, LocaleService } from '@univerjs/core'; +import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'; +import { YunzhupaasSheetsRangeService } from '../services/sheet-range.service'; +import zhCN from '../locales/zh-CN'; + +@DependentOn(UniverSheetsUIPlugin) +export class YunzhupaasSheetsRangePlugin extends Plugin { + static override pluginName = 'YUNZHUPAAS_SHEET_RANGE_PLUGIN'; + static override type = UniverInstanceType.UNIVER_SHEET; + + constructor( + @Inject(Injector) protected readonly _injector: Injector, + @Inject(LocaleService) private readonly _localeService: LocaleService, + ) { + super(); + + this._localeService.load({ + zhCN, + }); + } + + override onStarting(): void { + ([[YunzhupaasSheetsRangeService]] as Dependency[]).forEach(d => this._injector.add(d)); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-cell-echart.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-cell-echart.service.ts new file mode 100644 index 0000000..0c91123 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-cell-echart.service.ts @@ -0,0 +1,207 @@ +import { + BooleanNumber, + BuildTextUtils, + createDocumentModelWithStyle, + Disposable, + DrawingTypeEnum, + IAccessor, + ICommandService, + IImageIoService, + IImageIoServiceParam, + Inject, + Injector, + IUniverInstanceService, + Nullable, + ObjectRelativeFromH, + ObjectRelativeFromV, + PositionedObjectLayoutType, + UniverInstanceType, + Workbook, + WrapTextType, +} from '@univerjs/core'; +import { ISheetLocationBase, SetRangeValuesCommand } from '@univerjs/sheets'; +import { getImageSize } from '@univerjs/drawing'; +import { IRenderManagerService } from '@univerjs/engine-render'; +import { docDrawingPositionToTransform } from '@univerjs/docs-ui'; +import { SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { rotatedBoundingBox } from '../utils'; + +export class YunzhupaasSheetsCellEchartService extends Disposable { + constructor( + @Inject(Injector) private readonly _injector: Injector, + @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, + @ICommandService private readonly _commandService: ICommandService, + @IImageIoService private readonly _imageIoService: IImageIoService, + ) { + super(); + } + + /** + * 获取单元格内图形的大小 + * @param accessor 访问器对象 + * @param location 单元格位置信息 + * @param originImageWidth 原始图像宽度 + * @param originImageHeight 原始图像高度 + * @param angle 旋转角度(0-360,单位:度) + * @returns 计算后的图像尺寸,或在获取失败时返回 `false` + */ + private _getDrawingSizeByCell(accessor: IAccessor, location: ISheetLocationBase, originImageWidth: number, originImageHeight: number, angle: number) { + const { rotatedHeight, rotatedWidth } = rotatedBoundingBox(originImageWidth, originImageHeight, angle); + const renderManagerService = accessor.get(IRenderManagerService); + const currentRender = renderManagerService.getRenderById(location.unitId); + if (!currentRender) { + return false; + } + const skeletonManagerService = currentRender.with(SheetSkeletonManagerService); + const skeleton = skeletonManagerService.getWorksheetSkeleton(location.subUnitId)?.skeleton; + if (skeleton == null) { + return false; + } + const cellInfo = skeleton.getCellWithCoordByIndex(location.row, location.col); + + const cellWidth = cellInfo.mergeInfo.endX - cellInfo.mergeInfo.startX - 2; + const cellHeight = cellInfo.mergeInfo.endY - cellInfo.mergeInfo.startY - 2; + const imageRatio = rotatedWidth / rotatedHeight; + const imageWidth = Math.ceil(Math.min(cellWidth, cellHeight * imageRatio)); + const scale = imageWidth / rotatedWidth; + const realScale = !scale || Number.isNaN(scale) ? 0.001 : scale; + + return { + width: originImageWidth * realScale, + height: originImageHeight * realScale, + }; + } + + /** + * 在当前选中的单元格插入 EChart 图片 + * @param file 要插入的图片文件 + * @param row 行 + * @param col 列 + * @param echartConfig echart配置信息 + * @returns 插入结果,成功返回执行命令的结果,失败返回 `false` 或 `null` + */ + public async insertCellEchart(file: File, row: number, col: number, echartConfig: any) { + // 获取当前的工作簿实例 + const workbook = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET); + if (!workbook) { + return false; + } + const unitId = workbook.getUnitId(); + + // 获取当前激活的工作表 + const worksheet = workbook.getActiveSheet(); + if (!worksheet) { + return false; + } + const subUnitId = worksheet.getSheetId(); + + // 将图片文件保存到 ImageIoService 并获取图片参数 + let imageParam: Nullable; + try { + imageParam = await this._imageIoService.saveImage(file); + } catch (error) { + return false; + } + if (imageParam == null) { + return false; + } + + // 获取图片相关信息 + const { imageId, imageSourceType, source, base64Cache } = imageParam; + const { width, height, image } = await getImageSize(base64Cache || ''); + // 缓存图片数据 + this._imageIoService.addImageSourceCache(source, imageSourceType, image); + + const docDataModel = createDocumentModelWithStyle('', {}); + + // 计算图片适应单元格后的尺寸 + const imageSize = this._getDrawingSizeByCell( + this._injector, + { + unitId, + subUnitId, + row, + col, + }, + width, + height, + 0, + ); + if (!imageSize) { + return false; + } + + // 定义图片的文档变换参数 + const docTransform = { + size: { + width: imageSize.width, + height: imageSize.height, + }, + positionH: { + relativeFrom: ObjectRelativeFromH.PAGE, + posOffset: 0, + }, + positionV: { + relativeFrom: ObjectRelativeFromV.PARAGRAPH, + posOffset: 0, + }, + angle: 0, + }; + + // 定义文档中的绘图参数 + const docDrawingParam = { + unitId: docDataModel.getUnitId(), + subUnitId: docDataModel.getUnitId(), + drawingId: imageId, + drawingType: DrawingTypeEnum.DRAWING_IMAGE, + imageSourceType, + source, + transform: docDrawingPositionToTransform(docTransform), + docTransform, + behindDoc: BooleanNumber.FALSE, + title: '', + description: '', + layoutType: PositionedObjectLayoutType.INLINE, // Insert inline drawing by default. + wrapText: WrapTextType.BOTH_SIDES, + distB: 0, + distL: 0, + distR: 0, + distT: 0, + }; + + // 生成插入绘图的 JSON 结构 + const jsonXActions = BuildTextUtils.drawing.add({ + documentDataModel: docDataModel, + drawings: [docDrawingParam], + selection: { + collapsed: true, + startOffset: 0, + endOffset: 0, + }, + }); + + if (!jsonXActions) { + return false; + } + + docDataModel.apply(jsonXActions); + + return this._commandService.syncExecuteCommand(SetRangeValuesCommand.id, { + value: { + [row]: { + [col]: { + p: docDataModel.getSnapshot(), + t: 1, + custom: { + type: 'cellEchart', + config: { + ...echartConfig, + drawingId: imageId, + }, + }, + }, + }, + }, + }); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-cell.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-cell.service.ts new file mode 100644 index 0000000..64c80f7 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-cell.service.ts @@ -0,0 +1,118 @@ +import { Disposable, ICellData, IUniverInstanceService, UniverInstanceType, Workbook } from '@univerjs/core'; +import { SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { IRenderManagerService } from '@univerjs/engine-render'; + +export class YunzhupaasSheetsCellService extends Disposable { + constructor( + @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, + @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, + ) { + super(); + } + + // 获取单元格数据 + public getCellData(col: number, row: number) { + const sheet = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET)!.getActiveSheet(); + const cellMatrix = sheet.getCellMatrix().getMatrix(); + + return cellMatrix?.[row]?.[col] ?? null; // 如果未找到匹配的单元格,返回 null + } + + // 设置单元格数据 + public setCellData(col: number, row: number, cellData: ICellData) { + const sheet = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET)!.getActiveSheet(); + const cellMatrix = sheet.getCellMatrix(); + + try { + cellMatrix.setValue(row, col, cellData); + } catch (e) { + console.warn(e); + } + } + + // 获取当前单元格的自定义属性 + public getCurrentSheetCellsCustom() { + const sheet = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET)!.getActiveSheet(); + const cellMatrix = sheet?.getCellMatrix()?.getMatrix() ?? {}; + + const result: { [row: string]: { [col: string]: any } } = {}; + Object.entries(cellMatrix)?.forEach(([row, colObj]) => { + if (colObj && typeof colObj === 'object') { + const rowData: { [col: string]: any } = {}; + + Object.entries(colObj)?.forEach(([col, value]: any) => { + if (value?.custom) { + rowData[col] = { ...value }; + } + }); + + if (Object.keys(rowData)?.length) { + result[row] = rowData; + } + } + }); + + return result; + } + + // 获取激活单元格的尺寸信息 + public getTargetCellSize(col: number, row: number): { cellWidth: number; cellHeight: number } | null { + // 获取当前的工作簿实例 + const workbook = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET); + if (!workbook) { + return null; + } + + const unitId = workbook.getUnitId(); + + // 获取当前激活的工作表 + const worksheet = workbook.getActiveSheet(); + if (!worksheet) { + return null; + } + + const subUnitId = worksheet.getSheetId(); + + // 获取对应的骨架渲染服务 + const skeleton = this._renderManagerService?.getRenderById(unitId)?.with(SheetSkeletonManagerService)?.getUnitSkeleton(unitId, subUnitId)?.skeleton as any; + + if (!skeleton) { + return null; + } + + // 获取指定单元格的位置信息 + const cellInfo = skeleton.getCellWithCoordByIndex(row, col); + if (!cellInfo) { + return null; + } + + // 解构单元格信息 + const { startX, startY, endX, endY, isMergedMainCell, mergeInfo } = cellInfo; + + let cellWidth: number; + let cellHeight: number; + + if (isMergedMainCell && mergeInfo) { + cellWidth = mergeInfo.endX - mergeInfo.startX; + cellHeight = mergeInfo.endY - mergeInfo.startY; + } else { + cellWidth = endX - startX; + cellHeight = endY - startY; + } + + return { + cellWidth: Math.floor(cellWidth), + cellHeight: Math.floor(cellHeight), + }; + } + + // 刷新所有单元格的视图 + public refreshRangeCellsView(range: any) { + if (!range) { + return; + } + + const originalValue = range?.getValue() ?? ''; + range?.setValue(originalValue); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-excel-file.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-excel-file.service.ts new file mode 100644 index 0000000..e64c55d --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-excel-file.service.ts @@ -0,0 +1,84 @@ +import { Disposable, ICellData, ICommandService, IUniverInstanceService, UniverInstanceType, Workbook } from '@univerjs/core'; +import { SetRangeValuesCommand } from '@univerjs/sheets'; + +export class YunzhupaasSheetsExcelFileService extends Disposable { + constructor( + @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, + @ICommandService private readonly _commandService: ICommandService, + ) { + super(); + } + + public handleImportCsv() { + // 获取当前工作表 + const sheet = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET)!.getActiveSheet(); + + // 等待用户选择 CSV 文件 + this._waitUserSelectCSVFile(({ data, rowsCount, colsCount }) => { + // 设置工作表大小 + sheet.setColumnCount(colsCount); + sheet.setRowCount(rowsCount); + + // 设置工作表数据 + this._commandService + .executeCommand(SetRangeValuesCommand.id, { + range: { + startColumn: 0, // 起始列索引 + startRow: 0, // 起始行索引 + endColumn: colsCount - 1, // 结束列索引 + endRow: rowsCount - 1, // 结束行索引 + }, + value: this._parseCSV2UniverData(data), + }) + .then(); + }); + } + + /** + * 等待用户选择 CSV 文件 + */ + private _waitUserSelectCSVFile(onSelect: (data: { data: string[][]; colsCount: number; rowsCount: number }) => void) { + const input = document.createElement('input'); + input.type = 'file'; + input.accept = '.csv'; + input.click(); + + input.onchange = () => { + const file = input.files?.[0]; + if (!file) return; + const reader = new FileReader(); + reader.onload = () => { + const text = reader.result; + if (typeof text !== 'string') return; + + // 提示:使用 npm 包来解析 CSV + const rows = text.split(/\r\n|\n/); + const data = rows.map(line => line.split(',')); + + const colsCount = data.reduce((max, row) => Math.max(max, row.length), 0); + + onSelect({ + data, + colsCount, + rowsCount: data.length, + }); + }; + reader.readAsText(file); + }; + } + + /** + * 将 CSV 解析为 Univer 数据 + * @param csv CSV 数据 + * @returns { v: string }[][] 返回解析后的数据 + */ + private _parseCSV2UniverData(csv: string[][]): ICellData[][] { + return csv.map(row => { + return row.map(cell => { + return { + v: cell || '', + }; + }); + }); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-dom.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-dom.service.ts new file mode 100644 index 0000000..616a991 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-dom.service.ts @@ -0,0 +1,53 @@ +import { Disposable, Inject } from '@univerjs/core'; +import { SheetCanvasFloatDomManagerService } from '@univerjs/sheets-drawing-ui'; + +export class YunzhupaasSheetsFloatDomService extends Disposable { + private _piniaStoreId: string | null = null; + + private _floatImageItems: Record = {}; + private _floatEchartItems: Record = {}; + + constructor(@Inject(SheetCanvasFloatDomManagerService) private readonly _sheetCanvasFloatDomManagerService: SheetCanvasFloatDomManagerService) { + super(); + + this._addFloatDomHook(); + } + + // 存入图表列表数据 + public saveFloatEchartItems(data: any) { + this._floatEchartItems = data; + } + + // 存入图片列表数据 + public saveFloatImageItems(data: any) { + this._floatImageItems = data; + } + + // 存入store的id + public savePiniaStoreId(data: any) { + this._piniaStoreId = data; + } + + // 增加Hook + private _addFloatDomHook() { + this.disposeWithMe( + this._sheetCanvasFloatDomManagerService.addHook({ + onGetFloatDomProps: (id: string) => { + if (this._floatImageItems?.hasOwnProperty(id)) { + const { domId } = this._floatImageItems[id] ?? {}; + return { id: domId, piniaStoreId: this._piniaStoreId }; + } + + if (this._floatEchartItems?.hasOwnProperty(id)) { + const { domId } = this._floatEchartItems[id] ?? {}; + return { id: domId, piniaStoreId: this._piniaStoreId }; + } + + return { + id, + }; + }, + }), + ); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-echart.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-echart.service.ts new file mode 100644 index 0000000..e3394ca --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-echart.service.ts @@ -0,0 +1,145 @@ +import { Disposable, ICommandService, Inject, IUniverInstanceService, UniverInstanceType } from '@univerjs/core'; +import { SheetsSelectionsService } from '@univerjs/sheets'; +import { attachRangeWithCoord, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { IDrawingManagerService } from '@univerjs/drawing'; +import { SheetCanvasFloatDomManagerService } from '@univerjs/sheets-drawing-ui'; +import { DeviceInputEventType, IRenderManagerService } from '@univerjs/engine-render'; +import { buildUUID } from '../utils/uuid'; +import { YunzhupaasCommandIds, YunzhupaasUniverFloatEchartKey, DefaultFloatEchartWidth, DefaultFloatEchartHeight, DefaultFloatEchartOptions } from '../utils/define'; + +const regex = /^YunzhupaasUniverFloat(.*?)Echart$/; // 正则表达式匹配 YunzhupaasUniver 和 Echart + +export class YunzhupaasSheetsFloatEchartService extends Disposable { + private _piniaStoreId: string | null = null; + private _focusDrawingId: string | null = null; + + private readonly defaultPosition = { startX: 100, endX: DefaultFloatEchartWidth, startY: 100, endY: DefaultFloatEchartHeight }; + + constructor( + @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, + @ICommandService private readonly _commandService: ICommandService, + @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, + @IDrawingManagerService private readonly _drawingManagerService: IDrawingManagerService, + @Inject(SheetCanvasFloatDomManagerService) private readonly _sheetCanvasFloatDomManagerService: SheetCanvasFloatDomManagerService, + @Inject(SheetsSelectionsService) private readonly _selectionManagerService: SheetsSelectionsService, + ) { + super(); + + this._subscribeToFocusEvents(); + } + + // 创建并插入图表DOM + public insertFloatEchart(componentKey: string) { + this._commandService + .executeCommand('sheet.operation.set-cell-edit-visible', { + visible: false, + _eventType: DeviceInputEventType.PointerUp, + }) + .then(); + + const initPosition = this._calculateInitPosition(); + const domId = `echart_${buildUUID()}`; + + const addResult = this._sheetCanvasFloatDomManagerService?.addFloatDomToPosition({ + componentKey: YunzhupaasUniverFloatEchartKey, + initPosition, + allowTransform: true, + props: { + id: domId, + piniaStoreId: this._piniaStoreId, + }, + }); + + if (!addResult) { + return; + } + + const type = componentKey?.replace(regex, '$1'); + const echartType = type ? type.charAt(0)?.toLowerCase() + type.slice(1) : undefined; + + const newParams = { + drawingId: addResult.id, + domId, + echartType: echartType, + option: JSON.parse(JSON.stringify(DefaultFloatEchartOptions?.[echartType as keyof typeof DefaultFloatEchartOptions])), + }; + + // 自定义命令出来,告知相关的信息 + this._commandService.executeCommand(YunzhupaasCommandIds?.insertedFloatEchart, newParams).then(); + } + + // 存入store的id + public savePiniaStoreId(data: string) { + this._piniaStoreId = data; + } + + // 清空焦点对象的id + public clearFocusDrawingId() { + if (!this._focusDrawingId) { + return; + } + + this._focusDrawingId = null; + } + + // 计算初始位置 + private _calculateInitPosition() { + // 获取当前单元格数据 + const unit = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET); + if (!unit) { + console.warn('警告:未找到单元。使用默认位置 (100, 100)。'); + return this.defaultPosition; + } + + const unitId = unit.getUnitId(); + const currentSelections = this._selectionManagerService.getCurrentSelections(); + const firstSelection = currentSelections?.[0]; + if (!firstSelection?.range) { + console.warn('警告:未找到选择范围。使用默认位置 (100, 100)。'); + return this.defaultPosition; + } + + // 获取当前表格骨架信息 + const sheetSkeletonService = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService); + const currentSkeleton = sheetSkeletonService?.getCurrent()?.skeleton; + if (!currentSkeleton) { + console.warn('警告:未找到骨架。使用默认位置 (100, 100)。'); + return this.defaultPosition; + } + + // 解构表格尺寸信息 + const { columnTotalWidth = 0, rowTotalHeight = 0, columnHeaderHeight = 0, rowHeaderWidth = 0 } = currentSkeleton; + const columnScreenTotalWidth = columnTotalWidth + rowHeaderWidth; + const columnScreenTotalHeight = rowTotalHeight + columnHeaderHeight; + + // 获取范围信息并计算坐标 + const rangeInfo = attachRangeWithCoord(currentSkeleton, firstSelection.range) || { startX: 0, startY: 0 }; + const { startX: rangeStartX, startY: rangeStartY } = rangeInfo; + + // 计算图表的边界坐标 + const startX = Math.min(rangeStartX + DefaultFloatEchartWidth, columnScreenTotalWidth) - DefaultFloatEchartWidth; + const endX = Math.min(rangeStartX + DefaultFloatEchartWidth, columnScreenTotalWidth); + const startY = Math.min(rangeStartY + DefaultFloatEchartHeight, columnScreenTotalHeight) - DefaultFloatEchartHeight; + const endY = Math.min(rangeStartY + DefaultFloatEchartHeight, columnScreenTotalHeight); + + return { startX, endX, startY, endY }; + } + + // 订阅图表的焦点事件 + private _subscribeToFocusEvents() { + this.disposeWithMe( + this._drawingManagerService.focus$.subscribe(params => { + if (params && params?.length) { + const firstParam = (params?.[0] ?? {}) as any; + const { drawingId, componentKey } = firstParam; + + if (drawingId !== this._focusDrawingId && componentKey === YunzhupaasUniverFloatEchartKey) { + this._focusDrawingId = drawingId; + + this._commandService?.executeCommand(YunzhupaasCommandIds.focusFloatEchart, firstParam); + } + } + }), + ); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-image.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-image.service.ts new file mode 100644 index 0000000..b2ab3dc --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-float-image.service.ts @@ -0,0 +1,139 @@ +import { Disposable, ICommandService, Inject, IUniverInstanceService, UniverInstanceType, Workbook } from '@univerjs/core'; +import { SheetsSelectionsService } from '@univerjs/sheets'; +import { attachRangeWithCoord, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { IDrawingManagerService } from '@univerjs/drawing'; +import { SheetCanvasFloatDomManagerService } from '@univerjs/sheets-drawing-ui'; +import { DeviceInputEventType, IRenderManagerService } from '@univerjs/engine-render'; +import { buildUUID } from '../utils/uuid'; +import { YunzhupaasCommandIds, YunzhupaasUniverFloatImageKey, DefaultFloatImageWidth, DefaultFloatImageHeight, DefaultFloatImageOption } from '../utils/define'; + +export class YunzhupaasSheetsFloatImageService extends Disposable { + private _piniaStoreId: string | null = null; + private _focusDrawingId: string | null = null; + + private readonly defaultPosition = { startX: 100, endX: DefaultFloatImageWidth, startY: 100, endY: DefaultFloatImageHeight }; + + constructor( + @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, + @ICommandService private readonly _commandService: ICommandService, + @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, + @IDrawingManagerService private readonly _drawingManagerService: IDrawingManagerService, + @Inject(SheetCanvasFloatDomManagerService) private readonly _sheetCanvasFloatDomManagerService: SheetCanvasFloatDomManagerService, + @Inject(SheetsSelectionsService) private readonly _selectionManagerService: SheetsSelectionsService, + ) { + super(); + + this._subscribeToFocusEvents(); + } + + // 创建并插入悬浮图片DOM + public insertFloatImage() { + this._commandService + .executeCommand('sheet.operation.set-cell-edit-visible', { + visible: false, + _eventType: DeviceInputEventType.PointerUp, + }) + .then(); + + const initPosition = this._calculateInitPosition(); + const domId = `float_image_${buildUUID()}`; + + const addResult = this._sheetCanvasFloatDomManagerService?.addFloatDomToPosition({ + componentKey: YunzhupaasUniverFloatImageKey, + initPosition, + allowTransform: true, + props: { + id: domId, + piniaStoreId: this._piniaStoreId, + }, + }); + + if (!addResult) { + return; + } + + const newParams = { + drawingId: addResult.id, + domId, + imageType: 'BASE64', + option: JSON.parse(JSON.stringify(DefaultFloatImageOption)), + }; + + this._commandService.executeCommand(YunzhupaasCommandIds?.insertedFloatImage, newParams).then(); + } + + // 存入store的id + public savePiniaStoreId(data: string) { + this._piniaStoreId = data; + } + + // 清空焦点对象的id + public clearFocusDrawingId() { + if (!this._focusDrawingId) { + return; + } + + this._focusDrawingId = null; + } + + // 计算初始位置 + private _calculateInitPosition() { + // 获取当前单元格数据 + const unit = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET); + if (!unit) { + console.warn('警告:未找到单元。使用默认位置 (100, 100)。'); + return this.defaultPosition; + } + + const unitId = unit!.getUnitId(); + const currentSelections = this._selectionManagerService.getCurrentSelections(); + const firstSelection = currentSelections?.[0] ?? {}; + if (!firstSelection?.range) { + console.warn('警告:未找到选择范围。使用默认位置 (100, 100)。'); + return this.defaultPosition; + } + + // 获取当前表格骨架信息 + const sheetSkeletonService = this._renderManagerService.getRenderById(unitId)?.with(SheetSkeletonManagerService); + const currentSkeleton = sheetSkeletonService?.getCurrent()?.skeleton; + if (!currentSkeleton) { + console.warn('警告:未找到骨架。使用默认位置 (100, 100)。'); + return this.defaultPosition; + } + + // 解构表格尺寸信息 + const { columnTotalWidth = 0, rowTotalHeight = 0, columnHeaderHeight = 0, rowHeaderWidth = 0 } = currentSkeleton; + const columnScreenTotalWidth = columnTotalWidth + rowHeaderWidth; + const columnScreenTotalHeight = rowTotalHeight + columnHeaderHeight; + + // 获取范围信息并计算坐标 + const rangeInfo = attachRangeWithCoord(currentSkeleton, firstSelection.range) || { startX: 0, startY: 0 }; + const { startX: rangeStartX, startY: rangeStartY } = rangeInfo; + + // 计算图表的边界坐标 + const startX = Math.min(rangeStartX + DefaultFloatImageWidth, columnScreenTotalWidth) - DefaultFloatImageWidth; + const endX = Math.min(rangeStartX + DefaultFloatImageWidth, columnScreenTotalWidth); + const startY = Math.min(rangeStartY + DefaultFloatImageHeight, columnScreenTotalHeight) - DefaultFloatImageHeight; + const endY = Math.min(rangeStartY + DefaultFloatImageHeight, columnScreenTotalHeight); + + return { startX, endX, startY, endY }; + } + + // 订阅图表的焦点事件 + private _subscribeToFocusEvents() { + this.disposeWithMe( + this._drawingManagerService.focus$.subscribe(params => { + if (params && params?.length) { + const firstParam = (params?.[0] ?? {}) as any; + const { drawingId, componentKey } = firstParam; + + if (drawingId !== this._focusDrawingId && componentKey === YunzhupaasUniverFloatImageKey) { + this._focusDrawingId = drawingId; + + this._commandService?.executeCommand(YunzhupaasCommandIds.focusFloatImage, firstParam); + } + } + }), + ); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-print-ui.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-print-ui.service.ts new file mode 100644 index 0000000..a2f25ba --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-print-ui.service.ts @@ -0,0 +1,573 @@ +import { Inject, Injector, Disposable, IUniverInstanceService, type Workbook } from '@univerjs/core'; +import { SheetPrintInterceptorService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { UniverType } from '@univerjs/protocol'; +import { + CanvasRenderMode, + DEFAULT_FONTFACE_PLANE, + Engine, + IRenderManagerService, + Scene, + SHEET_VIEWPORT_KEY, + Spreadsheet, + SpreadsheetSkeleton, + Viewport, +} from '@univerjs/engine-render'; +import { YunzhupaasPrintAlignEnum, YunzhupaasPrintOtherParamsEnum } from '../utils/define'; +import { buildUUID } from '../utils/uuid'; + +export class YunzhupaasSheetsPrintUiService extends Disposable { + private _univerInstanceService: IUniverInstanceService; + private _sheetPrintInterceptorService: SheetPrintInterceptorService; + private readonly _skeleton!: SpreadsheetSkeleton; + + private _containerEle = document.createElement('div'); + private readonly _sceneKey: string; + + private _layoutConfig: any; + private readonly _printConfig: any; + private readonly _previewContainerScale: number; + + private _engine!: Engine; + private _scene!: Scene; + + private _spreadsheetObject: any; + + private _mainViewport!: Viewport; + private _leftViewport!: Viewport; + private _topViewport!: Viewport; + private _leftTopViewport!: Viewport; + + private _dirty: boolean = false; + + private _totalWidth: number = 0; + private _totalHeight: number = 0; + + constructor( + @Inject(Injector) private readonly _accessor: Injector, + layoutConfig = {}, + printConfig = {}, + previewContainerScale = 1, // 打印预览容器的伸缩比 + ) { + super(); + + this._univerInstanceService = this._getUniverInstanceService(); + this._sheetPrintInterceptorService = this._getSheetPrintInterceptorService(); + + this._layoutConfig = layoutConfig as any; + this._printConfig = printConfig as any; + this._previewContainerScale = previewContainerScale; + + const { unitId, subUnitId } = this._layoutConfig; + this._sceneKey = this._getSceneKey(unitId, subUnitId); + + const skeleton = this._getSkeleton(unitId, subUnitId); + if (!skeleton) { + return; + } + this._skeleton = skeleton; + + this._initRender(); // 初始化渲染 + } + + // 获取容器元素 + get container() { + return this._containerEle; + } + + /** + * 获取到univerInstanceService + */ + private _getUniverInstanceService() { + return this._accessor.get(IUniverInstanceService); + } + + /** + * 获取到sheetPrintInterceptorService + */ + private _getSheetPrintInterceptorService() { + return this._accessor.get(SheetPrintInterceptorService); + } + + /** + * 获得场景专一key + * @param unitId + * @param subUnitId + */ + private _getSceneKey(unitId: string, subUnitId: string) { + return `${unitId}_${subUnitId}_${buildUUID()}`; + } + + /** + * 获取到skeleton + * @param unitId + * @param subUnitId + */ + private _getSkeleton(unitId: string, subUnitId: string) { + return this._accessor.get(IRenderManagerService)?.getRenderById(unitId)?.with(SheetSkeletonManagerService)?.getOrCreateSkeleton({ sheetId: subUnitId }); + } + + /** + * 获取纸张容器的尺寸 + */ + private _getPaperContainerSize() { + // 从布局配置中解构出纸张尺寸(宽度 w 和高度 h) + const { w = 0, h = 0 } = this._layoutConfig?.paperSize ?? {}; + + // 检查宽度和高度是否有效 + if (w <= 0 || h <= 0) { + console.warn('纸张尺寸配置无效,宽度或高度小于等于0。'); + } + + // 根据预览容器的缩放比例,计算实际渲染的尺寸 + const scaledWidth = w * this._previewContainerScale; // 宽度按缩放比例调整 + const scaledHeight = h * this._previewContainerScale; // 高度按缩放比例调整 + + // 返回计算后的尺寸对象 + return { + w: scaledWidth, + h: scaledHeight, + }; + } + + /** + * 获取纸张边距(Padding) + */ + private _getPaperPadding() { + const { top = 0, right = 0, bottom = 0, left = 0 } = this._layoutConfig?.paperPadding ?? {}; + const previewContainerScale = this._previewContainerScale; + + return { + top: top * previewContainerScale, + bottom: bottom * previewContainerScale, + left: left * previewContainerScale, + right: right * previewContainerScale, + }; + } + + /** + * 将电子表格对象添加到场景中 + */ + private _addSpreadsheetToScene() { + // 创建电子表格对象,传入唯一标识符、骨架对象,并设置初始化选项 + const spreadsheet = new Spreadsheet('__YunzhupaasSheetPrintRender__', this._skeleton, false); + + // 将电子表格设置为打印模式,确保以打印样式进行渲染 + spreadsheet.isPrinting = true; + + // 将电子表格对象添加到当前场景中,纳入渲染流程 + this._scene.addObject(spreadsheet); + + // 缓存电子表格对象,便于后续访问或操作 + this._spreadsheetObject = spreadsheet; + + // 从布局配置中获取单元 ID 和子单元 ID,用于拦截器逻辑 + const { unitId, subUnitId } = this._layoutConfig ?? {}; + + // 获取拦截器实例与拦截点,确保存在后再进行触发 + const interceptor = this._sheetPrintInterceptorService?.interceptor; + const interceptPoints = interceptor?.getInterceptPoints(); + const printCollectPoint = interceptPoints?.PRINTING_COMPONENT_COLLECT; + + // 如果拦截器和拦截点存在,则触发拦截逻辑 + if (interceptor && printCollectPoint) { + interceptor.fetchThroughInterceptors(printCollectPoint)( + undefined, // 没有特定请求参数,传入 undefined + { unitId, subUnitId, scene: this._scene }, // 将单元 ID、子单元 ID 和场景信息传递给拦截器 + ); + } + } + + /** + * 添加并初始化多个视口(Viewport)到场景中 + */ + private _addViewport() { + // 从视口键名常量中解构出各个视口的标识符 + const { VIEW_MAIN, VIEW_MAIN_LEFT, VIEW_MAIN_TOP, VIEW_MAIN_LEFT_TOP } = SHEET_VIEWPORT_KEY; + + // 创建主视口,负责渲染主要内容区域 + this._mainViewport = new Viewport(VIEW_MAIN, this._scene); + + // 创建左侧视口,负责渲染左侧固定区域 + this._leftViewport = new Viewport(VIEW_MAIN_LEFT, this._scene); + + // 创建顶部视口,负责渲染顶部固定区域 + this._topViewport = new Viewport(VIEW_MAIN_TOP, this._scene); + + // 创建左上角视口,负责渲染左上角交叉固定区域 + this._leftTopViewport = new Viewport(VIEW_MAIN_LEFT_TOP, this._scene); + } + + /** + * 初始化渲染引擎、场景、视口,并配置缩放比例和资源管理。 + */ + private _initRender() { + // 获取纸张容器的宽度和高度,确保渲染区域的尺寸准确 + const { w: paperContainerW, h: paperContainerH } = this._getPaperContainerSize(); + + // 设置像素比为 1,通常用于标准屏幕显示 + const pixelRatio = 1; + + // 设置渲染模式为打印模式(Printing),确保画布的内容适配打印需求 + const renderMode = CanvasRenderMode.Printing; + + // 创建渲染引擎实例 + // 参数:宽度、高度、像素比、渲染模式 + this._engine = new Engine(paperContainerW, paperContainerH, pixelRatio, renderMode); + + // 创建场景对象,并将其与渲染引擎关联 + // 参数:场景的唯一标识符、渲染引擎实例 + this._scene = new Scene(this._sceneKey, this._engine); + + // 将渲染引擎绑定到指定的 DOM 容器中 + // 参数:容器元素、是否清除现有内容(false 表示不清除) + this._engine.setContainer(this._containerEle, false); + + // 从布局配置中获取打印缩放比例,若未配置则默认为 1 + const { printScale = 1 } = this._layoutConfig; + + // 计算场景的最终缩放比例,结合打印缩放比例和预览容器的缩放比例 + const sceneScale = printScale * this._previewContainerScale; + + // 将计算得到的缩放比例应用到场景中 + // 参数:x 方向缩放比例,y 方向缩放比例 + this._scene.scale(sceneScale, sceneScale); + + // 将电子表格组件添加到场景中 + this._addSpreadsheetToScene(); + + // 创建视口并与当前场景关联,确保视口正确渲染内容 + this._addViewport(); + + // 注册资源销毁回调,确保在对象生命周期结束时释放资源,防止内存泄漏 + this.disposeWithMe({ + dispose: () => { + // 释放引擎资源,确保渲染引擎的内存被回收 + this._engine.dispose(); + + // 释放场景资源,确保场景相关的内存被回收 + this._scene.dispose(); + }, + }); + } + + /** + * 调整视口大小和滚动值 + */ + private _resizeViewport() { + // 从布局配置中解构冻结和范围设置 + const { freeze, range, printScale = 1 } = this._layoutConfig; + // 从冻结设置中解构x轴和y轴的分割点以及起始行列 + const { xSplit, ySplit, startRow, startColumn } = freeze; + // 从骨架配置中解构行头宽度和列头高度 + const { rowHeaderWidth, columnHeaderHeight } = this._skeleton; + + // 缩放场景以适应预览容器的缩放比例 + const sceneScale = printScale * this._previewContainerScale; + this._scene.scale(sceneScale, sceneScale); + + // 获取无合并单元格的位置,基于起始行列 + const cellPosition = this._skeleton?.getNoMergeCellPositionByIndexWithNoHeader(startRow, startColumn); + // 获取无合并单元格的位置,基于起始行列减去分割点 + const cellPositionSplit = this._skeleton?.getNoMergeCellPositionByIndexWithNoHeader(startRow - ySplit, startColumn - xSplit); + + // 计算起始X分割位置 + const startXSplit = xSplit > 0 ? cellPosition.startX - cellPositionSplit.startX : 0; + // 计算起始Y分割位置 + const startYSplit = ySplit > 0 ? cellPosition.startY - cellPositionSplit.startY : 0; + + // 获取场景的精度缩放比例 + const precisionScale = this._scene.getPrecisionScale(); + // 定义用于缩放X值的函数 + const getScaleX = (value: number) => Math.round(value * precisionScale.scaleX) / precisionScale.scaleX; + // 定义用于缩放Y值的函数 + const getScaleY = (value: number) => Math.round(value * precisionScale.scaleY) / precisionScale.scaleY; + + // 获取范围起始单元格的位置 + const startCellPosition = this._skeleton.getNoMergeCellPositionByIndexWithNoHeader(range.startRow, range.startColumn); + // 计算结束单元格的位置,并处理边界情况 + const endCellPosition = this._skeleton.getNoMergeCellPositionByIndexWithNoHeader(range.endRow, range.endColumn); + + // 定义范围对象,包含起始和结束的X、Y坐标 + const _range = { + startX: xSplit > 0 ? cellPositionSplit.startX : 0, + endX: xSplit > 0 ? cellPosition.startX : 0, + startY: ySplit > 0 ? cellPositionSplit.startY : 0, + endY: ySplit > 0 ? cellPosition.startY : 0, + }; + + const endX = Math.max(0, getScaleX(endCellPosition.endX) - Math.max(startCellPosition.startX, _range.endX)); + const endY = Math.max(0, getScaleY(endCellPosition.endY) - getScaleY(Math.max(startCellPosition.startY, _range.endY))); + // 计算缩放比例 + const scale = 1 / Math.max(precisionScale.scaleX, precisionScale.scaleY); + + this._totalWidth = startXSplit + endX + scale; + this._totalHeight = startYSplit + endY + scale; + + const startSplit = { x: startXSplit, y: startYSplit }; + + const scaleXY = { + x: getScaleX(endCellPosition.endX) - getScaleX(endX) - getScaleX(Math.max(startCellPosition.startX, _range.endX)), + y: getScaleY(endCellPosition.endY) - getScaleY(endY) - getScaleY(Math.max(startCellPosition.startY, _range.endY)), + }; + + // 如果x轴和y轴都有分割点,启用左上角视口并调整其大小和滚动值 + if (xSplit > 0 && ySplit > 0) { + this._leftTopViewport.enable(); + this._leftTopViewport.resizeWhenFreezeChange({ + top: 0, + left: 0, + height: getScaleY(startSplit.y), + width: getScaleX(startSplit.x), + }); + this._leftTopViewport.updateScrollVal({ + viewportScrollX: getScaleX(_range.startX) + getScaleX(rowHeaderWidth), + viewportScrollY: getScaleY(_range.startY) + getScaleY(columnHeaderHeight), + }); + } else { + // 否则禁用左上角视口 + this._leftTopViewport.disable(); + } + + // 如果x轴有分割点,启用左视口并调整其大小和滚动值 + if (xSplit > 0) { + this._leftViewport.enable(); + this._leftViewport.resizeWhenFreezeChange({ + top: getScaleY(startSplit.y), + left: 0, + height: getScaleY(endY) + scale + scaleXY.y, + width: getScaleX(startSplit.x), + }); + this._leftViewport.updateScrollVal({ + viewportScrollX: getScaleX(_range.startX) + getScaleX(rowHeaderWidth), + viewportScrollY: getScaleY(startCellPosition.startY) + getScaleY(columnHeaderHeight) - getScaleY(startSplit.y), + }); + } else { + // 否则禁用左视口 + this._leftViewport.disable(); + } + + // 如果y轴有分割点,启用顶视口并调整其大小和滚动值 + if (ySplit > 0) { + this._topViewport.enable(); + this._topViewport.resizeWhenFreezeChange({ + top: 0, + left: getScaleX(startSplit.x), + height: getScaleY(startSplit.y), + width: getScaleX(endX) + scale + scaleXY.x, + }); + this._topViewport.updateScrollVal({ + viewportScrollX: getScaleX(startCellPosition.startX) + getScaleX(rowHeaderWidth) - getScaleX(startSplit.x), + viewportScrollY: getScaleY(_range.startY) + getScaleY(columnHeaderHeight), + }); + } else { + // 否则禁用顶视口 + this._topViewport.disable(); + } + + // 调整主视口的大小和滚动值 + this._mainViewport.resizeWhenFreezeChange({ + top: getScaleY(startSplit.y), + left: getScaleX(startSplit.x), + height: getScaleY(endY) + scale + scaleXY.y, + width: getScaleX(endX) + scale + scaleXY.x, + }); + + this._mainViewport.updateScrollVal({ + viewportScrollX: getScaleX(startCellPosition.startX) + getScaleX(rowHeaderWidth) - getScaleX(startSplit.x), + viewportScrollY: getScaleY(startCellPosition.startY) + getScaleY(columnHeaderHeight) - getScaleY(startSplit.y), + }); + } + + /** + * 获取平移偏移量,用于将打印内容定位到页面上的正确位置 + * + * 根据纸张的尺寸、内边距、打印配置中的对齐方式以及总内容的宽度和高度,计算水平和垂直方向的偏移量。 + * 最终返回的偏移量用于定位打印内容的起始位置,以便它能够根据配置进行正确的对齐。 + */ + private _getTranslateOffset() { + // 获取纸张的内边距和纸张容器的尺寸 + const paperContainerSize = this._getPaperContainerSize(); + const paperPadding = this._getPaperPadding(); + + // 解构获取打印配置中的对齐方式(水平对齐和垂直对齐) + const { vAlign, hAlign } = this._printConfig; + + // 计算最大缩放比例,确保内容在X和Y方向上都能够缩放适应 + const scale = Math.max(this._scene.scaleX, this._scene.scaleY); + + // 计算水平偏移量(offsetX) + let offsetX: number; + if (hAlign === YunzhupaasPrintAlignEnum.start) { + // 水平对齐方式为左对齐,偏移量等于左边距 + offsetX = paperPadding.left; + } else if (hAlign === YunzhupaasPrintAlignEnum.end) { + // 水平对齐方式为右对齐,偏移量等于纸张宽度减去内容宽度和右边距 + offsetX = paperContainerSize.w - this._totalWidth * scale - paperPadding.right; + } else { + // 水平对齐方式为居中对齐,计算居中位置 + offsetX = paperPadding.left + (paperContainerSize.w - this._totalWidth * scale - paperPadding.left - paperPadding.right) / 2; + } + + // 计算垂直偏移量(offsetY) + let offsetY: number; + if (vAlign === YunzhupaasPrintAlignEnum.start) { + // 垂直对齐方式为上对齐,偏移量等于上边距 + offsetY = paperPadding.top; + } else if (vAlign === YunzhupaasPrintAlignEnum.end) { + // 垂直对齐方式为下对齐,偏移量等于纸张高度减去内容高度和下边距 + offsetY = paperContainerSize.h - this._totalHeight * scale - paperPadding.bottom; + } else { + // 垂直对齐方式为居中对齐,计算居中位置 + offsetY = (paperContainerSize.h - this._totalHeight * scale - paperPadding.top - paperPadding.bottom) / 2 + paperPadding.top; + } + + // 返回四舍五入后的偏移量,确保偏移值为整数 + return { offsetX: Math.round(offsetX), offsetY: Math.round(offsetY) }; + } + + /** + * 清空引擎内画布 + */ + private _clearEngineCanvas() { + this._engine?.clearCanvas(); + } + + /** + * 渲染主场景 + */ + private _renderMainScene() { + // 如果场景被标记为脏,需要重新调整视口大小 + this._dirty && this._resizeViewport(); + + // 获取Canvas的绘图上下文 + const context = this._engine.getCanvas().getContext(); + + // 获取打印配置中的网格线设置和偏移量 + const { gridlines } = this._printConfig; + const { offsetX, offsetY } = this._getTranslateOffset(); + + // 根据网格线设置禁用或启用网格线 + this._spreadsheetObject.setForceDisableGridlines(!gridlines); + + // 强制标记表格为脏,以便重新渲染 + this._spreadsheetObject.makeForceDirty(); + this._scene.makeDirty(); + + // 保存当前绘图上下文状态 + context.save(); + // 应用偏移量 + context.translateWithPrecision(offsetX, offsetY); + + // 渲染场景 + this._scene.render(); + + // 恢复绘图上下文状态 + context.restore(); + } + + /** + * 渲染页眉和页脚 + */ + private _renderHeaderFooter() { + // 从布局配置中解构获取单元ID和子单元ID + const { unitId, subUnitId } = this._layoutConfig ?? {}; + + // 获取工作簿对象 + const workbook = this._univerInstanceService?.getUnit(unitId, UniverType.UNIVER_SHEET); + if (!workbook) return; // 如果未找到工作簿,直接返回 + + // 获取工作表对象 + const worksheet = workbook?.getSheetBySheetId(subUnitId); + if (!worksheet) return; // 如果未找到工作表,直接返回 + + // 获取Canvas上下文对象 + const ctx = this._engine?.getCanvas()?.getContext(); + ctx.save(); // 保存当前绘图状态 + ctx.font = `13px ${DEFAULT_FONTFACE_PLANE}`; // 设置字体样式 + + // 获取纸张尺寸并计算绘制位置 + const { w, h } = this._getPaperContainerSize(); + const x = 20 * this._previewContainerScale; + const y = 20 * this._previewContainerScale; + + // 获取页眉页脚的参数 + const { headerFooterParams, workbookTitleText } = this._printConfig ?? {}; + + // 渲染日期和时间 + if (headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.printDate) || headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.printTime)) { + let dateStr = new Date().toLocaleString(); + if (headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.printDate) && !headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.printTime)) { + dateStr = new Date().toLocaleDateString(); + } else if (headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.printTime) && !headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.printDate)) { + dateStr = new Date().toLocaleTimeString(); + } + + ctx.fillText(dateStr, x, h - y); // 绘制时间/日期 + } + + // 渲染工作簿标题 + if (headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.workbookTitle)) { + const text = ctx.measureText(workbookTitleText); // 测量文本宽度 + const length = text.fontBoundingBoxAscent + text.fontBoundingBoxDescent; // 计算文本高度 + ctx.fillText(workbookTitleText, x, y + length); // 绘制工作簿标题 + } + + // 渲染工作表名称 + if (headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.worksheetTitle)) { + const name = worksheet?.getName() ?? ''; + const text = ctx.measureText(name); + const length = text.fontBoundingBoxAscent + text.fontBoundingBoxDescent; + ctx.fillText(name, w - (text.width + x), y + length); // 绘制工作表名称到右上角 + } + + // 渲染页码 + if (headerFooterParams?.includes(YunzhupaasPrintOtherParamsEnum?.pageNumber)) { + const name = `${this._layoutConfig?.pageNumber}`; + if (name) { + const text = ctx.measureText(name); // 测量页码文本宽度 + ctx.fillText(name, w - (text.width + x), h - y); // 绘制页码到右下角 + } + } + + ctx.restore(); // 恢复绘图状态 + } + + /** + * 标记当前状态为脏(需要重新渲染) + */ + setDirty(state: boolean) { + this._dirty = state; + } + + /** + * 渲染页面 + */ + renderPage() { + this._clearEngineCanvas(); // 清除画布 + + this._renderMainScene(); // 渲染主场景(核心内容) + this._renderHeaderFooter(); // 渲染页眉页脚 + } + + /** + * 监听变换并在准备好时渲染 + */ + renderOnReady() { + const observable = this._engine?.onTransformChange$?.subscribeEvent(() => { + this.renderPage(); + }); + + this.disposeWithMe(observable); // 订阅事件并在销毁时清理 + } + + /** + * 释放资源 + */ + dispose() { + super.dispose(); // 调用父类的dispose方法 + + if (this._containerEle.parentElement) { + this._containerEle.parentElement?.removeChild(this._containerEle); // 移除容器 + } + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-print.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-print.service.ts new file mode 100644 index 0000000..8b4b384 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-print.service.ts @@ -0,0 +1,696 @@ +import { SheetsSelectionsService } from '@univerjs/sheets'; +import { SheetPrintInterceptorService, SheetSkeletonManagerService } from '@univerjs/sheets-ui'; +import { Inject, UniverInstanceType, Disposable, type IFreeze, IUniverInstanceService, type Workbook } from '@univerjs/core'; +import { IRenderManagerService, SpreadsheetSkeleton } from '@univerjs/engine-render'; +import { isEmptyObject, isNullOrUndefined } from '../utils'; +import { buildUUID } from '../utils/uuid'; +import { + DefaultPrintConfig, + YunzhupaasPrintAreaEnum, + YunzhupaasPrintDirectionEnum, + YunzhupaasPrintScaleEnum, + YunzhupaasPrintFreezeEnum, + YunzhupaasPrintOtherParamsEnum, + YunzhupaasPrintPaperSizeForType, + YunzhupaasPaperPaddingForType, +} from '../utils/define'; + +export class YunzhupaasSheetsPrintService extends Disposable { + private _configParams: Record = {}; + private _layoutHeaderFooterParams: any[] = []; + + constructor( + @IUniverInstanceService protected readonly _univerInstanceService: IUniverInstanceService, + @IRenderManagerService private readonly _renderManagerService: IRenderManagerService, + @Inject(SheetsSelectionsService) private readonly _selectionManagerService: SheetsSelectionsService, + @Inject(SheetPrintInterceptorService) private readonly _sheetPrintInterceptorService: SheetPrintInterceptorService, + ) { + super(); + } + + /** + * 获取当前活动的工作簿实例。 + * @returns 返回当前活动的工作簿实例,如果不存在则返回 `undefined`。 + */ + private _getWorkbook() { + // 使用 `UniverInstanceService` 获取当前类型为 `UNIVER_SHEET` 的活动单元实例 + return this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET); + } + + /** + * 获取指定单元的骨架信息。 + * @param {string} unitId - 单元的唯一标识符。 + * @param {string} subUnitId - 子单元的唯一标识符。 + * @returns 返回单元骨架信息对象,如果未找到则返回空对象。 + */ + private _getUnitSkeleton(unitId: string, subUnitId: string) { + // 从 `RenderManagerService` 中获取指定单元 ID 的渲染服务 + return (this._renderManagerService + ?.getRenderById(unitId) // 根据单元 ID 获取对应的渲染服务 + ?.with(SheetSkeletonManagerService) // 使用骨架管理服务进行扩展 + ?.getUnitSkeleton(unitId, subUnitId)?.skeleton ?? {}) as any; // 获取单元对应的骨架信息 // 如果骨架信息不存在,则返回空对象 // 强制将返回值类型设置为 `any` + } + + /** + * 获取当前配置的纸张大小。 + * @returns 返回包含宽度和高度的纸张尺寸对象,或者返回 `null`。 + */ + private _getPaperSize() { + // 从配置参数中解构获取纸张类型(paperType)和方向(direction) + const { paperType, direction } = this._configParams ?? {}; + + // 根据纸张类型获取对应的尺寸数据 + const paperSize = YunzhupaasPrintPaperSizeForType[paperType as keyof typeof YunzhupaasPrintPaperSizeForType] ?? {}; + // 如果纸张尺寸为空,返回 null + if (isEmptyObject(paperSize)) { + return null; + } + + // 根据打印方向返回调整后的纸张尺寸 + return direction === YunzhupaasPrintDirectionEnum?.portrait + ? { ...paperSize } // 如果是纵向模式,直接返回原始纸张尺寸 + : { + w: paperSize?.h, // 如果是横向模式,交换宽度和高度 + h: paperSize?.w, + }; + } + + /** + * 获取当前配置的纸张边距信息。 + * @returns 返回包含边距信息的对象,或者返回 `null`。 + */ + private _getPaperPadding() { + // 从配置参数中解构获取边距类型(padding) + const { padding } = this._configParams ?? {}; + + // 根据边距类型从预定义的边距配置映射中查找对应的边距值 + const paperPadding = YunzhupaasPaperPaddingForType[padding as keyof typeof YunzhupaasPaperPaddingForType] ?? {}; + + // 如果找到有效的边距配置,返回边距配置;否则返回 null + return !isEmptyObject(paperPadding) ? paperPadding : null; + } + + /** + * 计算打印范围,根据配置的区域选择合适的打印范围。 + * @returns 返回包含一个或多个打印范围的数组。 + */ + private _computePrintRanges() { + // 初始化空数组 result,用于存储计算的打印范围 + let result: any[] = []; + + // 根据配置的打印区域 执行不同的处理 + switch (this._configParams.printArea) { + // 如果区域是整个工作簿 + case YunzhupaasPrintAreaEnum.workbook: + // 获取工作簿中的所有工作表 + const sheets = this._getWorkbook()!.getSheets(); + + // 对每个工作表计算打印范围,并过滤掉无效的范围 + result = sheets + ?.map(sheet => { + const subUnitId = sheet?.getSheetId(); + // 对每个工作表计算并返回其打印范围 + return this._computePrintSheetRange(subUnitId); + }) + .filter(Boolean); // 过滤掉无效值(如 null 或 undefined) + break; + + // 如果区域是当前工作表 + case YunzhupaasPrintAreaEnum.currentSheet: + // 获取当前活动工作表的 ID + const subUnitId = this._getWorkbook()!.getActiveSheet()?.getSheetId(); + + // 如果工作表 ID 不存在,则跳出 + if (!subUnitId) { + break; + } + + // 计算当前工作表的打印范围 + const range = this._computePrintSheetRange(subUnitId); + // 如果计算结果有效,返回一个包含该范围的数组 + result = range ? [range] : []; + break; + + // 如果区域是当前选择的区域 + case YunzhupaasPrintAreaEnum.currentSelection: + // 计算当前选择区域的打印范围,并返回该范围的数组 + result = [this._computePrintSelectionRange()]; + break; + + // 如果区域类型不匹配,返回空数组 + default: + break; + } + + // 返回计算出的打印范围数组 + return result; + } + + /** + * 计算工作表的打印范围。 + * @param {string} subUnitId - 工作表的唯一标识符。 + * @returns 返回计算出的打印范围,包含页面范围、冻结信息等。 + */ + private _computePrintSheetRange(subUnitId: string) { + // 获取工作簿实例 + const workbook = this._getWorkbook(); + + // 如果没有获取到工作簿,返回 undefined + if (!workbook) { + return; + } + + // 获取工作簿的唯一标识符 + const unitId = workbook!.getUnitId(); + + // 获取当前工作表 + const worksheet = workbook!.getSheetBySheetId(subUnitId); + + // 如果工作表不存在,返回 undefined + if (!worksheet) { + return; + } + + // 获取工作表的骨架信息,包含如行列宽度、冻结状态等数据 + const skeleton = this._getUnitSkeleton(unitId, subUnitId); + + // 如果工作表的骨架信息不存在,返回 undefined + if (!skeleton) { + return; + } + + // 获取工作表的冻结信息,包括冻结行列位置 + const freeze = worksheet?.getFreeze(); + + // 如果冻结信息不存在,返回 undefined + if (!freeze) { + return; + } + + // 获取当前工作表的单元格矩阵打印范围 + const cellMatrixPrintRange = worksheet?.getCellMatrixPrintRange(); + + // 如果没有获取到单元格矩阵打印范围,返回 undefined + if (!cellMatrixPrintRange) { + return; + } + + // 获取当前工作表骨架中的溢出缓存数据 + const { overflowCache } = skeleton; + if (overflowCache) { + // 如果有溢出缓存,遍历其值并调整打印范围 + overflowCache.forValue((_row: any, _col: any, value: any) => { + const { endColumn } = value; + + // 如果溢出的单元格列超过当前打印范围的结束列,则调整打印范围 + if (endColumn > cellMatrixPrintRange?.endColumn) { + cellMatrixPrintRange.endColumn = endColumn; + } + }); + } + + // 使用拦截器调整打印范围 + const realCellMatrixPrintRange = this._sheetPrintInterceptorService.interceptor?.fetchThroughInterceptors( + this._sheetPrintInterceptorService.interceptor?.getInterceptPoints()?.PRINTING_RANGE, + )(cellMatrixPrintRange, { unitId, subUnitId }); + + // 返回最终计算出的打印页面范围,包括冻结行列的调整 + return this._computePrintPageRange(subUnitId, { + // 调整起始行列位置,确保不小于零 + ...realCellMatrixPrintRange, + startRow: Math.max(freeze.startRow - freeze.ySplit, 0), + startColumn: Math.max(freeze.startColumn - freeze.xSplit, 0), + }); + } + + /** + * 计算并返回打印页面的范围,包括内容区域、冻结行列以及打印比例。 + * @param {string} subUnitId - 工作表的唯一标识符。 + * @param {any} sheetRange - 需要打印的工作表范围,包含起始和结束的行列。 + * @returns 返回打印页面的范围、冻结信息、内容区域和打印比例。 + */ + private _computePrintPageRange(subUnitId: string, sheetRange: any) { + // 获取工作簿实例 + const workbook = this._getWorkbook(); + + // 如果没有获取到工作簿,返回 undefined + if (!workbook) { + return; + } + + // 获取工作簿的唯一标识符 + const unitId = workbook!.getUnitId(); + + // 获取纸张大小 + const paperSize = this._getPaperSize(); + if (!paperSize) { + return; + } + + // 获取纸张的边距 + const paperPadding = this._getPaperPadding(); + if (!paperPadding) { + return; + } + + // 计算内容区域的大小,减去左右、上下的边距 + const contentSize = { + w: paperSize.w - (paperPadding.left + paperPadding.right), + h: paperSize.h - (paperPadding.top + paperPadding.bottom), + }; + + // 如果起始行列小于等于 -1,返回默认的打印范围,表示无效的打印范围 + if (sheetRange?.startRow <= -1 || sheetRange?.startColumn <= -1) { + return { + unitId, + subUnitId, + range: { startColumn: 0, endColumn: 0, startRow: 0, endRow: 0 }, + freeze: { startColumn: -1, startRow: -1, xSplit: 0, ySplit: 0 }, + contentSize, + printScale: 1, + }; + } + + // 获取工作表实例 + const worksheet = workbook!.getSheetBySheetId(subUnitId); + if (!worksheet) { + return; + } + + // 获取工作表的冻结信息 + const freeze = worksheet?.getFreeze(); + if (!freeze) { + return; + } + + // 获取工作表的骨架信息(如列宽、行高等) + const skeleton = this._getUnitSkeleton(unitId, subUnitId); + if (!skeleton) { + return; + } + + // 计算打印比例 + const printScale = this._computePrintScale(skeleton, sheetRange, freeze); + + // 初始化打印范围和冻结信息的默认值 + let startRow = -1, + startColumn = -1, + xSplit = 0, + ySplit = 0; + + // 获取骨架中的列宽和行高累积数据 + const { columnWidthAccumulation, rowHeightAccumulation } = skeleton ?? {}; + let { startRow: sheetRangeStartRow, startColumn: sheetRangeStartColumn, endRow: sheetRangeEndRow, endColumn: sheetRangeEndColumn } = sheetRange ?? {}; + const { startRow: freezeStartRow, startColumn: freezeStartColumn, xSplit: freezeXSplit, ySplit: freezeYSplit } = freeze ?? {}; + + // 处理冻结行(如果配置了冻结行) + if (freezeYSplit && this._configParams?.freeze.includes(YunzhupaasPrintFreezeEnum?.row)) { + // 如果打印范围的结束行大于等于冻结行,则计算冻结区域的高度并调整打印区域的高度 + if (sheetRangeEndRow >= freezeStartRow) { + const offsetHeight = rowHeightAccumulation[freezeStartRow] - rowHeightAccumulation[freezeStartRow - freezeYSplit]; + + if (offsetHeight < contentSize?.h) { + startRow = freezeStartRow; + ySplit = freezeYSplit; + contentSize.h -= offsetHeight; + } + } else { + // 如果打印范围的结束行小于冻结行,则计算冻结区域的高度并调整打印区域的高度 + startRow = sheetRangeEndRow + 1; + ySplit = sheetRangeEndRow + 1 - (freezeStartRow - freezeYSplit); + contentSize.h = contentSize?.h - rowHeightAccumulation[freezeStartRow] - rowHeightAccumulation[freezeStartRow - freezeYSplit]; + } + } + + // 更新起始行,确保不小于冻结区域的起始行 + sheetRangeStartRow = Math.max(startRow, sheetRangeStartRow); + + // 处理冻结列(如果配置了冻结列) + if (freezeXSplit && this._configParams?.freeze.includes(YunzhupaasPrintFreezeEnum?.column)) { + // 如果打印范围的结束列大于等于冻结列,则计算冻结区域的宽度并调整打印区域的宽度 + if (sheetRangeEndColumn >= freezeStartColumn) { + const offsetWidth = + printScale * (columnWidthAccumulation[freezeStartColumn - 1] - (columnWidthAccumulation[freezeStartColumn - freezeXSplit - 1] || 0)); + + if (offsetWidth < contentSize?.w) { + startColumn = freezeStartColumn; + xSplit = freezeXSplit; + contentSize.w -= offsetWidth; + } + } else { + // 如果打印范围的结束列小于冻结列,则计算冻结区域的宽度并调整打印区域的宽度 + const offsetWidth = + printScale * (columnWidthAccumulation[freezeStartColumn - 1] - (columnWidthAccumulation[freezeStartColumn - freezeXSplit] - 1 || 0)); + + if (offsetWidth < contentSize?.w) { + const startColumnCache = sheetRangeEndColumn + 1; + const xSplitCache = sheetRangeEndColumn + 1 - (freezeStartColumn - freezeXSplit); + + startColumn = startColumnCache; + xSplit = xSplitCache; + contentSize.w -= offsetWidth; + } + } + } + + // 更新起始列,确保不小于冻结区域的起始列 + sheetRangeStartColumn = Math.max(startColumn, sheetRangeStartColumn); + + // 返回计算出的打印页面范围,包含打印区域、冻结信息、内容大小和打印比例 + return { + unitId, + subUnitId, + range: { startRow: sheetRangeStartRow, startColumn: sheetRangeStartColumn, endRow: sheetRangeEndRow, endColumn: sheetRangeEndColumn }, + freeze: { startRow, startColumn, xSplit, ySplit }, + contentSize, + printScale, + }; + } + + /** + * 计算并返回打印选择范围的详细信息。 + * @returns 返回选区的打印范围信息。 + */ + private _computePrintSelectionRange() { + // 获取当前工作簿实例 + const workbook = this._getWorkbook(); + + // 如果没有获取到工作簿,返回 undefined + if (!workbook) { + return; + } + + // 获取工作簿的唯一标识符 + const unitId = workbook!.getUnitId(); + + // 获取当前活动工作表 + const worksheet = workbook!.getActiveSheet(); + + // 如果没有获取到工作表,返回 undefined + if (!worksheet) { + return; + } + + // 获取当前工作表的唯一标识符(subUnitId) + const subUnitId = worksheet?.getSheetId(); + + // 获取当前工作簿的最后选择区域 + const lastSelection = this._selectionManagerService?.getWorkbookSelections(unitId)?.getCurrentLastSelection(); + + // 如果没有获取到选择区域,返回 undefined + if (!lastSelection) { + return; + } + + // 根据最后选择的范围计算打印的页面范围 + return this._computePrintPageRange(subUnitId, lastSelection?.range); + } + + /** + * 计算页面布局,根据给定的打印范围和工作表的骨架信息,计算每一页的布局。 + * @param printRange {any} 打印范围,包含工作簿信息、工作表信息、打印范围、冻结信息、缩放比例及内容尺寸 + * @returns 返回计算出的页面布局信息 + */ + private _computePageLayout(printRange: any) { + // 解构打印范围信息 + const { unitId, subUnitId, range, freeze, printScale, contentSize } = printRange ?? {}; + + // 获取工作表的骨架信息 + const skeleton = this._getUnitSkeleton(unitId, subUnitId); + if (!skeleton) { + return; + } + + // 解构工作表的行高和列宽累计值 + const { rowHeightAccumulation, columnWidthAccumulation } = skeleton; + + // 解构打印范围的行列信息 + const { startRow, startColumn, endRow, endColumn } = range; + + const calcRow = (start: any) => { + let end = start; + const offset = start === 0 ? 0 : rowHeightAccumulation[start - 1]; + for (; end < endRow; end++) { + const current = (rowHeightAccumulation[end] - offset) * printScale; + const next = (rowHeightAccumulation[end + 1] - offset) * printScale; + if (current > contentSize.h || (current < contentSize.h && next > contentSize.h)) return { startRow: start, endRow: end - 1 }; + } + return { startRow: start, endRow: end }; + }; + + const calcColumn = (start: any) => { + let end = start; + const offset = start === 0 ? 0 : columnWidthAccumulation[start - 1]; + for (; end < endColumn; end++) { + const current = (columnWidthAccumulation[end] - offset) * printScale; + const next = (columnWidthAccumulation[end + 1] - offset) * printScale; + + if (current >= contentSize.w || (current < contentSize.w && next > contentSize.w)) { + return { startColumn: start, endColumn: end }; + } + } + return { startColumn: start, endColumn: end }; + }; + + // 计算所有行的分页范围 + const rows = []; + for (let start = startRow; start <= endRow; ) { + const row = calcRow(start); + rows.push(row); + start = row.endRow + 1; // 移动到下一个分页起始行 + } + + // 计算所有列的分页范围 + const columns: any[] = []; + for (let start = startColumn; start <= endColumn; ) { + const column = calcColumn(start); + columns.push(column); + start = column.endColumn + 1; // 移动到下一个分页起始列 + } + + // 将行列的分页信息组合成每一页的布局 + const pages: any[] = []; + rows.forEach(row => { + columns.forEach(column => { + pages.push({ ...row, ...column }); + }); + }); + + // 返回计算的页面布局信息,包括单位ID、子单位ID、页面信息、冻结信息和缩放比例 + return { unitId, subUnitId, pages, freeze, printScale }; + } + + /** + * 计算打印比例。 + * @param {SpreadsheetSkeleton} skeleton - 工作表的骨架信息,包括行高、列宽累积数据。 + * @param {any} sheetRange - 打印的单元格范围,包括起始行、起始列、结束行、结束列。 + * @param {IFreeze} freeze - 冻结范围信息,包括冻结的起始行列和冻结的分割范围。 + * @returns 返回适合的打印缩放比例,范围在 [0, 1] 之间。 + */ + private _computePrintScale(skeleton: SpreadsheetSkeleton, sheetRange: any, freeze: IFreeze) { + // 解构骨架中的列宽和行高累积信息 + const { columnWidthAccumulation, rowHeightAccumulation } = skeleton ?? {}; + + // 骨架信息为空时,返回默认比例 1 + if (isNullOrUndefined(columnWidthAccumulation) || isNullOrUndefined(rowHeightAccumulation)) { + return 1; + } + + // 解构打印范围的起始和结束行列 + const { startRow: sheetRangeStartRow, startColumn: sheetRangeStartColumn, endRow: sheetRangeEndRow, endColumn: sheetRangeEndColumn } = sheetRange ?? {}; + + // 打印范围信息为空时,返回默认比例 1 + if ( + isNullOrUndefined(sheetRangeStartRow) || + isNullOrUndefined(sheetRangeStartColumn) || + isNullOrUndefined(sheetRangeEndRow) || + isNullOrUndefined(sheetRangeEndColumn) + ) { + return 1; + } + + // 解构冻结范围的起始行列和分割范围 + const { startRow: freezeStartRow, startColumn: freezeStartColumn, xSplit: freezeXSplit, ySplit: freezeYSplit } = freeze ?? {}; + + // 冻结范围信息为空时,返回默认比例 1 + if (isNullOrUndefined(freezeXSplit) || isNullOrUndefined(freezeYSplit) || isNullOrUndefined(freezeStartRow) || isNullOrUndefined(freezeStartColumn)) { + return 1; + } + + // 确定打印范围的起始行:对冻结范围与打印范围取交集 + const startRow = sheetRangeEndRow < freezeStartRow ? sheetRangeStartRow : Math.max(freezeStartRow, sheetRangeStartRow); + + // 确定打印范围的起始列:对冻结范围与打印范围取交集 + const startColumn = sheetRangeEndColumn < freezeStartColumn ? sheetRangeStartColumn : Math.max(freezeStartColumn, sheetRangeStartColumn); + + // 获取纸张尺寸 + const paperSize = this._getPaperSize(); + if (!paperSize) { + return 1; + } + + // 获取纸张边距 + const paperPadding = this._getPaperPadding(); + if (!paperPadding) { + return 1; + } + + // 计算冻结区域的宽度(列)和高度(行) + const xSplit = freezeXSplit > 0 ? columnWidthAccumulation[freezeStartColumn - 1] - (columnWidthAccumulation[freezeStartColumn - freezeXSplit - 1] || 0) : 0; + const ySplit = freezeYSplit > 0 ? rowHeightAccumulation[freezeStartRow - 1] - (rowHeightAccumulation[freezeStartRow - freezeYSplit - 1] || 0) : 0; + + // 计算打印范围的高度和宽度 + const rowHeight = rowHeightAccumulation[sheetRangeEndRow] - (rowHeightAccumulation[startRow - 1] || 0); + const columnWidth = columnWidthAccumulation[sheetRangeEndColumn] - (columnWidthAccumulation[startColumn - 1] || 0); + + // 加上冻结区域的尺寸,得到总的打印高度和宽度 + const xScale = columnWidth + xSplit; + const yScale = rowHeight + ySplit; + + let result = 1; + + // 根据配置参数计算打印比例 + switch (this._configParams.printScale) { + case YunzhupaasPrintScaleEnum.fitWidth: + // 宽度适应比例 + result = Math.min(1, (paperSize.w - paperPadding.left - paperPadding.right) / xScale); + break; + case YunzhupaasPrintScaleEnum.fitHeight: + // 高度适应比例 + result = Math.min(1, (paperSize.h - paperPadding.top - paperPadding.bottom) / yScale); + break; + case YunzhupaasPrintScaleEnum.fitPage: + // 页面完全适应比例(宽度和高度都适应) + result = Math.min(1, (paperSize.w - paperPadding.left - paperPadding.right) / xScale, (paperSize.h - paperPadding.top - paperPadding.bottom) / yScale); + break; + default: + break; + } + + // 返回比例值,保留两位小数 + return Math.floor(result * 100) / 100; + } + + /** + * 解析页面布局中的页眉和页脚配置。 + * @param {any} printConfig - 页眉页脚的配置对象,包含多个布尔值属性来决定是否显示某些信息。 + * @returns 返回需要在页眉或页脚中包含的参数数组。 + */ + private _analyseLayoutHeaderFooterConfig(printConfig: any) { + // 定义一个数组,用于存储需要包含的页眉和页脚参数 + const layoutHeaderFooterParams = []; + + // 如果配置中启用了工作簿标题,则将其参数加入数组 + if (printConfig?.workbookTitle) { + layoutHeaderFooterParams.push(YunzhupaasPrintOtherParamsEnum.workbookTitle); + } + + // 如果配置中启用了工作表标题,则将其参数加入数组 + if (printConfig?.worksheetTitle) { + layoutHeaderFooterParams.push(YunzhupaasPrintOtherParamsEnum.worksheetTitle); + } + + // 如果配置中启用了当前日期,则将其参数加入数组 + if (printConfig?.printDate) { + layoutHeaderFooterParams.push(YunzhupaasPrintOtherParamsEnum.printDate); + } + + // 如果配置中启用了当前时间,则将其参数加入数组 + if (printConfig?.printTime) { + layoutHeaderFooterParams.push(YunzhupaasPrintOtherParamsEnum.printTime); + } + + // 如果配置中启用了页码显示,则将其参数加入数组 + if (printConfig?.pageNumber) { + layoutHeaderFooterParams.push(YunzhupaasPrintOtherParamsEnum.pageNumber); + } + + // 返回最终解析出来的页眉页脚参数数组 + return layoutHeaderFooterParams; + } + + /** + * 根据配置获取打印布局。 + * @param {any} printConfig - 打印配置对象,默认为 `DefaultPrintConfig`。 + */ + getLayouts(printConfig: any = DefaultPrintConfig) { + // 分析布局的页眉和页脚配置,并将结果存储在 `_layoutHeaderFooterParams` 中 + this._layoutHeaderFooterParams = this._analyseLayoutHeaderFooterConfig(printConfig); + + // 获取参数出来判断是不是存在冻结 + const subUnitId = this._getWorkbook()!.getActiveSheet()?.getSheetId(); + if (!subUnitId) { + return; + } + + const snapshot = this._getWorkbook()!.save(); + const { xSplit = 0, ySplit = 0 } = snapshot?.sheets?.[subUnitId]?.freeze ?? {}; + + // 正确的冻结状态判断 + const colHasFreeze = xSplit > 0; // 列冻结(xSplit 对应列冻结) + const rowHasFreeze = ySplit > 0; // 行冻结(ySplit 对应行冻结) + + // 判断冻结状态 + const freeze = [ + rowHasFreeze && printConfig?.yFreeze && YunzhupaasPrintFreezeEnum.row, // 行冻结 + colHasFreeze && printConfig?.xFreeze && YunzhupaasPrintFreezeEnum.column, // 列冻结 + ].filter(Boolean); // 过滤掉 false/null/undefined + + // 提取剩余配置 + const { xFreeze, yFreeze, ...restPrintConfig } = printConfig ?? {}; + + // 将配置参数存储在 `_configParams` 中 + this._configParams = { + ...restPrintConfig, + freeze, + }; + + // 获取所有需要打印的范围 + const printRanges = this._computePrintRanges(); + // 初始化空数组,用于存储计算出的布局 + const layouts: any[] = []; + + // 遍历每个打印范围,计算对应的页面布局 + printRanges?.forEach(range => { + // 如果当前范围存在,继续处理 + if (range) { + // 计算页面布局 + const pageLayout = this._computePageLayout(range); + + // 如果页面布局存在,将其添加到 layouts 数组中 + if (pageLayout) { + layouts.push(pageLayout); + } + } + }); + + // 获取纸张大小 + const paperSize = this._getPaperSize(); + // 获取纸张边距 + const paperPadding = this._getPaperPadding(); + + let pageNumber = 1; + const pagesLayout = layouts.flatMap(({ pages: pageRanges, ...info }) => + pageRanges.map((range: any) => { + return { + ...info, + pageNumber: pageNumber++, + range, + paperSize, + paperPadding, + browserPreviewScale: 1, + layoutId: `layout_${buildUUID()}`, + }; + }), + ); + + return { + pagesLayout, + printConfig: { + ...this._configParams, + headerFooterParams: this._layoutHeaderFooterParams, + }, + paperSize, + }; + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-range.service.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-range.service.ts new file mode 100644 index 0000000..7a47fcc --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/services/sheet-range.service.ts @@ -0,0 +1,38 @@ +import { SetSelectionsOperation } from '@univerjs/sheets'; +import { Disposable, ICommandService, IUniverInstanceService, UniverInstanceType, Workbook } from '@univerjs/core'; + +export class YunzhupaasSheetsRangeService extends Disposable { + constructor( + @IUniverInstanceService private readonly _univerInstanceService: IUniverInstanceService, + @ICommandService private readonly _commandService: ICommandService, + ) { + super(); + } + + // 恢复选区 + public recoveryRange(row: number, col: number) { + const unit = this._univerInstanceService.getCurrentUnitForType(UniverInstanceType.UNIVER_SHEET); + const unitId = unit!.getUnitId(); + const sheet = unit!.getActiveSheet(); + const subUnitId = sheet?.getSheetId(); + + this._commandService + .executeCommand(SetSelectionsOperation.id, { + unitId, + subUnitId, + selections: [ + { + range: { + startRow: row, + startColumn: col, + endRow: row, + endColumn: col, + rangeType: 0, + }, + }, + ], + type: 2, + }) + .then(); + } +} diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/utils/define.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/utils/define.ts new file mode 100644 index 0000000..b9833c9 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/utils/define.ts @@ -0,0 +1,751 @@ +export const YunzhupaasCommandIds = { + floatEchartOperations: 'yunzhupaas-sheets.operation.float-echart', + insertFloatBarEchart: 'yunzhupaas-sheets.operation.insert-float-bar-echart', + insertFloatLineEchart: 'yunzhupaas-sheets.operation.insert-float-line-echart', + insertFloatPieEchart: 'yunzhupaas-sheets.operation.insert-float-pie-echart', + insertFloatRadarEchart: 'yunzhupaas-sheets.operation.insert-float-radar-echart', + insertedFloatEchart: 'yunzhupaas-sheets.operation.inserted-float-echart', + focusFloatEchart: 'yunzhupaas-sheets.operation.focus-float-echart', + + insertFloatImage: 'yunzhupaas-sheets.operation.insert-float-image', + insertedFloatImage: 'yunzhupaas-sheets.operation.inserted-float-image', + focusFloatImage: 'yunzhupaas-sheets.operation.focus-float-image', + + excelFileOperations: 'yunzhupaas-sheets.operation.excel-file', + importExcelFile: 'yunzhupaas-sheets.operation.import-excel-file', + downloadExcelFile: 'yunzhupaas-sheets.operation.download-excel-file', + importCsvFile: 'yunzhupaas-sheets.operation.import-csv-file', + + preview: 'yunzhupaas-sheets.operation.preview', + print: 'yunzhupaas-sheets.operation.print', +}; + +export const DefaultFloatEchartWidth = 300; +export const DefaultFloatEchartHeight = 300; + +export const DefaultFloatImageWidth = 300; +export const DefaultFloatImageHeight = 300; + +export const YunzhupaasUniverFloatEchartKey = 'YunzhupaasUniverFloatEchart'; +export const YunzhupaasUniverFloatImageKey = 'YunzhupaasUniverFloatImage'; +export const YunzhupaasUniverDialogSelectCellKey = 'YunzhupaasUniverDialogSelectCell'; + +export const SheetMainFillDirectionExtensionKey = 'SheetMainFillDirectionExtension'; +export const SheetMainRelationCellExtensionKey = 'SheetMainRelationCellExtension'; + +export const YunzhupaasUniverRowColMutationCommands = [ + 'sheet.command.insert-row', + 'sheet.command.remove-row', + 'sheet.command.move-rows', + 'sheet.command.set-rows-hidden', + 'sheet.command.insert-col', + 'sheet.command.remove-col', + 'sheet.command.move-cols', + 'sheet.command.set-col-hidden', +]; + +export const DefaultDialogSelectCellConfig = { + draggable: true, + width: 326, + title: { title: '请选择单元格' }, + destroyOnClose: false, + preservePositionOnDestroy: true, + closable: false, + maskClosable: false, +}; + +export enum YunzhupaasPrintAreaEnum { + workbook = 'workbook', + currentSheet = 'currentSheet', + currentSelection = 'currentSelection', +} +export const yunzhupaasPrintAreaOptions = [{ id: YunzhupaasPrintAreaEnum.currentSheet, fullName: '当前工作表' }]; + +export enum YunzhupaasPaperTypeEnum { + a3 = 'a3', + a4 = 'a4', + a5 = 'a5', + b4 = 'b4', + b5 = 'b5', + executive = 'executive', + folio = 'folio', + legal = 'legal', + letter = 'letter', + statement = 'statement', + tabloid = 'tabloid', +} +export const yunzhupaasPaperTypeOptions = [ + { + id: YunzhupaasPaperTypeEnum.a3, + fullName: 'A3(29.7厘米 x 42.0厘米)', + }, + { + id: YunzhupaasPaperTypeEnum.a4, + fullName: 'A4(21.0厘米 x 29.7厘米)', + }, + { + id: YunzhupaasPaperTypeEnum.a5, + fullName: 'A5(14.8厘米 x 21.0厘米)', + }, + { + id: YunzhupaasPaperTypeEnum.b4, + fullName: 'B4(25.0厘米 x 35.3厘米)', + }, + { + id: YunzhupaasPaperTypeEnum.b5, + fullName: 'B5(17.6厘米 x 25.0厘米)', + }, + { + id: YunzhupaasPaperTypeEnum.letter, + fullName: '信纸(21.6厘米 x 27.9厘米)', + }, + { + id: YunzhupaasPaperTypeEnum.executive, + fullName: '行政公文纸(18.4厘米 x 26.7厘米)', + }, + { + id: YunzhupaasPaperTypeEnum.statement, + fullName: '报表(14.0厘米 x 21.6厘米)', + }, +]; +export const printA4PaperWidth = 794; +export const printA4PaperHeight = 1124; +export const YunzhupaasPrintPaperSizeForType = { + [YunzhupaasPaperTypeEnum.a3]: { w: 1123, h: 1587 }, + [YunzhupaasPaperTypeEnum.a4]: { w: printA4PaperWidth, h: printA4PaperHeight }, + [YunzhupaasPaperTypeEnum.a5]: { w: 559, h: 794 }, + [YunzhupaasPaperTypeEnum.b4]: { w: 944, h: 1344 }, + [YunzhupaasPaperTypeEnum.b5]: { w: 665, h: 944 }, + [YunzhupaasPaperTypeEnum.executive]: { w: 696, h: 1008 }, + [YunzhupaasPaperTypeEnum.folio]: { w: 816, h: 1248 }, + [YunzhupaasPaperTypeEnum.legal]: { w: 816, h: 1344 }, + [YunzhupaasPaperTypeEnum.letter]: { w: 816, h: 1056 }, + [YunzhupaasPaperTypeEnum.statement]: { w: 528, h: 816 }, + [YunzhupaasPaperTypeEnum.tabloid]: { w: 1056, h: 1632 }, +}; + +export enum YunzhupaasPrintDirectionEnum { + portrait = 'portrait', + landscape = 'landscape', +} +export const yunzhupaasPrintDirectionOptions = [ + { + id: YunzhupaasPrintDirectionEnum.portrait, + fullName: '纵向', + }, + { + id: YunzhupaasPrintDirectionEnum.landscape, + fullName: '横向', + }, +]; + +export enum YunzhupaasPrintScaleEnum { + origin = 'origin', + fitWidth = 'fitWidth', + fitHeight = 'fitHeight', + fitPage = 'fitPage', +} +export const yunzhupaasPrintScaleOptions = [ + { + id: YunzhupaasPrintScaleEnum.origin, + fullName: '正常(100%)', + }, + { + id: YunzhupaasPrintScaleEnum.fitWidth, + fullName: '适合宽度', + }, + { + id: YunzhupaasPrintScaleEnum.fitHeight, + fullName: '适合高度', + }, + { + id: YunzhupaasPrintScaleEnum.fitPage, + fullName: '适合页面大小', + }, +]; + +export enum YunzhupaasPrintAlignEnum { + start = 'start', + middle = 'middle', + end = 'end', +} +export const yunzhupaasPrintVAlignOptions = [ + { + id: YunzhupaasPrintAlignEnum.start, + fullName: '顶部对齐', + }, + { + id: YunzhupaasPrintAlignEnum.middle, + fullName: '垂直居中', + }, + { + id: YunzhupaasPrintAlignEnum.end, + fullName: '底部对齐', + }, +]; +export const yunzhupaasPrintHAlignOptions = [ + { + id: YunzhupaasPrintAlignEnum.start, + fullName: '左对齐', + }, + { + id: YunzhupaasPrintAlignEnum.middle, + fullName: '水平居中', + }, + { + id: YunzhupaasPrintAlignEnum.end, + fullName: '右对齐', + }, +]; + +export enum YunzhupaasPaperPaddingTypeEnum { + normal = 'normal', + narrow = 'narrow', + wide = 'wide', +} +export const yunzhupaasPaperPaddingTypeOptions = [ + { + id: YunzhupaasPaperPaddingTypeEnum.normal, + fullName: '正常', + }, + { + id: YunzhupaasPaperPaddingTypeEnum.narrow, + fullName: '窄', + }, + { + id: YunzhupaasPaperPaddingTypeEnum.wide, + fullName: '宽', + }, +]; +export const YunzhupaasPaperPaddingForType = { + [YunzhupaasPaperPaddingTypeEnum.normal]: { left: 53, right: 53, top: 56, bottom: 56 }, + [YunzhupaasPaperPaddingTypeEnum.narrow]: { left: 19, right: 19, top: 56, bottom: 56 }, + [YunzhupaasPaperPaddingTypeEnum.wide]: { left: 75, right: 75, top: 75, bottom: 75 }, +}; + +export enum YunzhupaasPrintFreezeEnum { + row = 'row', + column = 'column', +} + +export enum YunzhupaasPrintOtherParamsEnum { + workbookTitle = 'workbookTitle', + worksheetTitle = 'worksheetTitle', + printDate = 'printDate', + printTime = 'printTime', + pageNumber = 'pageNumber', +} + +// 打印默认的配置 +export const DefaultPrintConfig = { + printArea: YunzhupaasPrintAreaEnum.currentSheet, // 打印范围 + paperType: YunzhupaasPaperTypeEnum.a4, // 纸张类型 + padding: YunzhupaasPaperPaddingTypeEnum.normal, // 边距 + direction: YunzhupaasPrintDirectionEnum.portrait, // 页面方向 + printScale: YunzhupaasPrintScaleEnum.origin, // 缩放 + + hAlign: YunzhupaasPrintAlignEnum.middle, // 水平对齐方式 + vAlign: YunzhupaasPrintAlignEnum.start, // 垂直对齐方式 + + gridlines: true, // 网格线 + + workbookTitle: false, // 是否显示工作簿标题 + workbookTitleText: '报表名称', // 工作簿标题文本 + + worksheetTitle: false, // 工作本名称 + + printDate: false, // 当前日期 + printTime: false, // 当前时间 + + pageNumber: false, // 页码 + + xFreeze: true, // 重复冻结列 + yFreeze: true, // 重复冻结行 +}; + +export const DefaultFloatImageOption = { + src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXsAAAF7CAIAAAC8XLxcAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF8WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjQtMTItMTBUMTc6MDYrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI0LTEyLTI3VDEwOjI4OjE5KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTEyLTI3VDEwOjI4OjE5KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU3ZGJiNmNlLTc3ODYtNDJlNS1iZTA1LTNkNzU1NTRlMjFhNyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmM2YmE0ODdkLWVkN2UtYjk0OS1iYzBhLWUzNjQ3MzUwOWM0ZCIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmZkZDRiNTFkLTA5NGItNGYxMi1iZmNiLTRjMmNhYjJjYTQxZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZmRkNGI1MWQtMDk0Yi00ZjEyLWJmY2ItNGMyY2FiMmNhNDFkIiBzdEV2dDp3aGVuPSIyMDI0LTEyLTEwVDE3OjA2KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTdkYmI2Y2UtNzc4Ni00MmU1LWJlMDUtM2Q3NTU1NGUyMWE3IiBzdEV2dDp3aGVuPSIyMDI0LTEyLTI3VDEwOjI4OjE5KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7i1XePAAHVz0lEQVR4nJT92ddsyXUfiP12nMz8hjvUrbkKqMI8AyQIDgIokmJLLUpsaamb7JZleehlLfdyLz/Y9PIfwAd7Lb/40W9+6CVPUrdltdqyZHaLLZqgmmoOGiBRJDERQGEqoOpW3eGbM/Ocvf2wh9gR5+St0kHhfpkn48SJ2LH3bw+xI4J+91s7AEABGAAIxEApzAzoDcB+AwASoNituBnFBBDxO6WIiMR3BhUvQOkpgZXQDwQIiPymV1jrT68k7m8SAIK2vRQwx6tSF/QZ7XGxwtZN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', + alt: '', +}; + +export const DefaultFloatEchartOptions = { + bar: { + classifyNameField: undefined, + seriesNameField: undefined, + seriesDataField: undefined, + summaryType: 'none', + chartType: 'bar', + animation: false, + styleType: 1, //风格类型 + bar: { barTypeList: [] }, + legendTop: 90, + legendLeft: 40, + //标题设置 + title: { + text: '柱状图示例', + textI18nCode: '', + show: true, + left: 'center', + textStyle: { fontSize: 18, fontWeight: 'normal', color: '#333' }, + showSub: true, + subtext: '子标题', + subtextI18nCode: '', + subtextStyle: { + fontSize: 12, + fontWeight: 'normal', + color: '#aaa', + }, + }, + barWidth: 25, //宽度设置 + itemStyle: { + borderRadius: 0, //弧度设置 + }, + //坐标轴边距设置 + grid: { + left: 30, + top: 60, + right: 10, + bottom: 50, + }, + //提示语设置 + tooltip: { + show: true, + backgroundColor: '#fff', + textStyle: { + color: '#303133', + fontSize: 14, + fontWeight: '', + }, + }, + //图例设置 + legend: { + show: true, + textStyle: { + fontSize: 14, + }, + fontSize: 14, + orient: 'horizontal', + top: '90%', + left: '40%', + }, + //数值设置 + label: { + show: false, //显示数值 + fontSize: 14, //数值大小 + fontWeight: '', //数值加粗 + color: '#303133', //数值颜色 + backgroundColor: '', //数值背景色 + seriesLabelPosition: 'outside', + seriesLabelShowInfo: ['count', 'percent'], + seriesCenterLeft: 50, + seriesCenterTop: 50, + seriesLineStyleWidth: 2, + seriesSymbolRotate: 4, + }, + //自定义配色 + color: { + AxisTextStyleColor: '', //X、Y轴字体的颜色全局设置 + AxisLineStyleColor: '', //X、Y轴轴线颜色全局设置 + list: [], + }, + xAxis: { + type: 'category', //X轴类型[category,value] + show: true, //X轴是否显示 + data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'], + inverse: false, //X轴反转 + name: '', //X轴名称 + nameTextStyle: { + color: '#303133', //X轴名称字体颜色 + fontSize: 14, //X轴名称字体大小 + fontWeight: '', //X轴名称是否加粗 + }, + axisLine: { + show: true, + lineStyle: { + color: '#303133', //X轴线颜色 + }, + }, + axisLabel: { + rotate: 0, //X轴标签角度 + color: '#303133', //X轴标签字体颜色 + fontSize: 14, //X轴标签字体大小 + fontWeight: '', //X轴标签是否加粗 + }, + splitLine: { + show: false, //X轴网格线 + lineStyle: { + color: '#DFDFDF', //X轴网格线颜色 + }, + }, + axisTick: { alignWithLabel: false }, //刻度对齐 + }, + yAxis: { + show: true, //y轴是否显示 + inverse: false, //y轴反转 + name: '', //y轴名称 + nameTextStyle: { + color: '#303133', //y轴名称字体颜色 + fontSize: 14, //y轴名称字体大小 + fontWeight: '', //y轴名称是否加粗 + }, + axisLine: { + show: true, + lineStyle: { + color: '#303133', //y轴线颜色 + }, + }, + axisLabel: { + rotate: 0, //y轴标签角度 + color: '#303133', //y轴标签字体颜色 + fontSize: 14, //y轴标签字体大小 + fontWeight: '', //y轴标签是否加粗 + }, + splitLine: { + show: false, //y轴网格线 + lineStyle: { + color: '#DFDFDF', //y轴网格线颜色 + }, + }, + }, + series: [ + { + name: '销量', + type: 'bar', + data: [5, 20, 36, 10, 10, 20], + }, + { + name: '销量1', + type: 'bar', + data: [10, 30, 90, 30, 30, 80], + }, + ], + }, + line: { + classifyNameField: undefined, + seriesNameField: undefined, + seriesDataField: undefined, + summaryType: 'none', + chartType: 'line', + animation: false, + styleType: 1, //风格类型. + areaStyle: false, //面积堆积 + legendTop: 90, + legendLeft: 40, + //标题设置 + title: { + text: '折线图示例', + textI18nCode: '', + show: true, + left: 'center', + textStyle: { fontSize: 18, fontWeight: 'normal', color: '#333' }, + showSub: true, + subtext: '子标题', + subtextI18nCode: '', + subtextStyle: { + fontSize: 12, + fontWeight: 'normal', + color: '#aaa', + }, + }, + //坐标轴边距设置 + grid: { + left: 30, + top: 60, + right: 10, + bottom: 50, + }, + //提示语设置 + tooltip: { + show: true, + backgroundColor: '#fff', + textStyle: { + color: '#303133', + fontSize: 14, + fontWeight: '', + }, + }, + //图例设置 + legend: { + show: true, + textStyle: { + fontSize: 14, + }, + fontSize: 14, + orient: 'horizontal', + top: '90%', + left: '40%', + }, + label: { + show: false, //显示数值 + fontSize: 14, //数值大小 + fontWeight: '', //数值加粗 + color: '#303133', //数值颜色 + backgroundColor: '', //数值背景色 + }, + //自定义配色 + color: { + AxisTextStyleColor: '', //X、Y轴字体的颜色全局设置 + AxisLineStyleColor: '', //X、Y轴轴线颜色全局设置 + list: [], + }, + xAxis: { + type: 'category', //X轴类型[category,value] + show: true, //X轴是否显示 + data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'], + inverse: false, //X轴反转 + name: '', //X轴名称 + nameTextStyle: { + color: '#303133', //X轴名称字体颜色 + fontSize: 14, //X轴名称字体大小 + fontWeight: '', //X轴名称是否加粗 + }, + axisLine: { + show: true, + lineStyle: { + color: '#303133', //X轴线颜色 + }, + }, + axisLabel: { + rotate: 0, //X轴标签角度 + color: '#303133', //X轴标签字体颜色 + fontSize: 14, //X轴标签字体大小 + fontWeight: '', //X轴标签是否加粗 + }, + splitLine: { + show: false, //X轴网格线 + lineStyle: { + color: '#DFDFDF', //X轴网格线颜色 + }, + }, + axisTick: { alignWithLabel: false }, //刻度对齐 + }, + yAxis: { + show: true, //y轴是否显示 + inverse: false, //y轴反转 + name: '', //y轴名称 + nameTextStyle: { + color: '#303133', //y轴名称字体颜色 + fontSize: 14, //y轴名称字体大小 + fontWeight: '', //y轴名称是否加粗 + }, + axisLine: { + show: true, + lineStyle: { + color: '#303133', //y轴线颜色 + }, + }, + axisLabel: { + rotate: 0, //y轴标签角度 + color: '#303133', //y轴标签字体颜色 + fontSize: 14, //y轴标签字体大小 + fontWeight: '', //y轴标签是否加粗 + }, + splitLine: { + show: false, //y轴网格线 + lineStyle: { + color: '#DFDFDF', //y轴网格线颜色 + }, + }, + }, + series: [ + { + name: '销量', + type: 'line', + data: [5, 20, 36, 10, 10, 20], + }, + { + name: '销量1', + type: 'line', + data: [10, 30, 90, 30, 30, 80], + }, + ], + line: { + smooth: false, + symbolSize: 4, //点的大小 + }, + lineStyle: { + Width: 2, //线条宽度 + }, + }, + pie: { + classifyNameField: undefined, + seriesNameField: undefined, + seriesDataField: undefined, + summaryType: 'none', + chartType: 'pie', + seriesLabelPosition: 'outside', + seriesLabelShowInfo: ['count', 'percent'], + styleType: 1, //风格类型 + pie: { roseType: false }, + seriesCenter: { + seriesCenterLeft: 50, + seriesCenterTop: 50, + }, + animation: false, + //标题设置 + title: { + text: '饼图示例', + textI18nCode: '', + show: true, + left: 'center', + textStyle: { fontSize: 18, fontWeight: 'normal', color: '#333' }, + showSub: true, + subtext: '子标题', + subtextI18nCode: '', + subtextStyle: { + fontSize: 12, + fontWeight: 'normal', + color: '#aaa', + }, + }, + label: { + show: true, //显示数值 + fontSize: 14, //数值大小 + fontWeight: '', //数值加粗 + color: '#303133', //数值颜色 + backgroundColor: '', //数值背景色 + formatter: '{b}: {c} ({d}%)', + }, + tooltip: { + show: true, + backgroundColor: '#fff', + textStyle: { + color: '#303133', + fontSize: 14, + fontWeight: '', + }, + }, + //图例设置 + legend: { + show: true, + textStyle: { + fontSize: 14, + }, + fontSize: 14, + orient: 'horizontal', + top: 'bottom', + }, + //自定义配色 + color: { + AxisTextStyleColor: '', //X、Y轴字体的颜色全局设置 + AxisLineStyleColor: '', //X、Y轴轴线颜色全局设置 + list: [], + }, + series: [ + { + name: '衣物', + type: 'pie', + radius: '50%', + data: [ + { value: 5, name: '衬衫' }, + { value: 20, name: '羊毛衫' }, + { value: 36, name: '雪纺衫' }, + { value: 10, name: '裤子' }, + { value: 10, name: '高跟鞋' }, + { value: 20, name: '袜子' }, + ], + label: { + show: true, //显示数值 + formatter: '{b}: {c} ({d}%)', + }, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)', + }, + }, + }, + ], + }, + radar: { + classifyNameField: undefined, + seriesNameField: undefined, + seriesDataField: undefined, + maxField: undefined, + styleType: 1, //风格类型. + seriesAreaStyleOpacity: 0.3, + seriesCenter: { + seriesCenterLeft: 50, + seriesCenterTop: 50, + }, + //标题设置 + title: { + text: '雷达图示例', + textI18nCode: '', + show: true, + left: 'center', + textStyle: { fontSize: 18, fontWeight: 'normal', color: '#333' }, + showSub: true, + subtext: '子标题', + subtextI18nCode: '', + subtextStyle: { + fontSize: 12, + fontWeight: 'normal', + color: '#aaa', + }, + }, + label: { + show: false, //显示数值 + fontSize: 14, //数值大小 + fontWeight: '', //数值加粗 + color: '#303133', //数值颜色 + backgroundColor: '', //数值背景色 + }, + //提示语设置 + tooltip: { + show: true, + backgroundColor: '#fff', + textStyle: { + color: '#303133', + fontSize: 14, + fontWeight: '', + }, + }, + animation: false, + radar: { + axisName: { + fontSize: 14, + fontWeight: 'normal', + color: '#303133', + }, + indicator: [ + { name: '销售', max: 6500 }, + { name: '行政管理', max: 16000 }, + { name: '信息技术', max: 30000 }, + { name: '客户支持', max: 38000 }, + { name: '开发', max: 52000 }, + { name: '市场营销', max: 25000 }, + ], + }, + //图例设置 + legend: { + show: true, + textStyle: { + fontSize: 14, + }, + fontSize: 14, + orient: 'horizontal', + top: 'bottom', + }, + //自定义配色 + color: { + AxisTextStyleColor: '', //X、Y轴字体的颜色全局设置 + AxisLineStyleColor: '', //X、Y轴轴线颜色全局设置 + list: [], + }, + series: [ + { + name: '预算', + type: 'radar', + data: [ + { + value: [4200, 3000, 20000, 35000, 50000, 18000], + name: '分配预算', + }, + ], + areaStyle: { opacity: 0.3 }, + }, + ], + }, +}; diff --git a/src/components/Report/src/yunzhupaasUniver/Design/univer/utils/index.ts b/src/components/Report/src/yunzhupaasUniver/Design/univer/utils/index.ts new file mode 100644 index 0000000..6120396 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Design/univer/utils/index.ts @@ -0,0 +1,233 @@ +import { YunzhupaasPrintDirectionEnum, YunzhupaasPrintPaperSizeForType } from './define'; + +/** + * 检查值是否是 null 或 undefined + * @param value 要检查的值 + * @returns 如果值是 null 或 undefined,返回 true,否则返回 false + */ +export const isNullOrUndefined = (value: any) => { + return value === null || value === undefined; +}; + +/** + * 判断一个值是否为空对象 + * @param obj - 待检查的值 + * @returns 如果是空对象,返回 true;否则返回 false + */ +export const isEmptyObject = (obj: unknown): boolean => { + return obj !== null && typeof obj === 'object' && !Array.isArray(obj) && Object.keys(obj).length === 0; +}; + +/** + * 将指定值从数组中移除并将其添加到数组的末尾。 + * @param array - 要操作的数组。 + * @param value - 要移动到数组末尾的值。 + * @returns - 操作后的数组(原数组被修改)。 + */ +export const moveArrayValueToEnd = (array: any[], value: string | number) => { + const index = array?.indexOf(value); // 找到目标值的索引 + + if (index !== -1) { + // 如果值存在于数组中 + const [item] = array.splice(index, 1); // 删除目标值 + array.push(item); // 添加到数组末尾 + } + + return array; +}; + +/** + * 根据字母规则计算输入字符串的索引值。 + * @param input {string} - 输入的字母字符串(如 "A", "B", "AA", "AB" 等)。 + * @returns {number} - 对应的索引值。 + */ +export const getIndexFromAlphabetRule = (input: string): number => { + const base = 26; // 字母表的长度 + const charCodeA = 'A'.charCodeAt(0); + + let index = 0; + for (let i = 0; i < input.length; i++) { + index = index * base + (input.charCodeAt(i) - charCodeA + 1); + } + + return index - 1; // 数组索引从 0 开始 +}; + +/** + * 根据索引值获取字母字符串。 + * @param index {number} - 输入的索引值(如 0, 1, 26, 27 等)。 + * @returns {string} - 对应的字母字符串(如 "A", "B", "AA", "AB" 等)。 + */ +export const getAlphabetFromIndexRule = (index: number): string => { + const base = 26; // 字母表的长度 + const charCodeA = 'A'.charCodeAt(0); + + let result = ''; + index += 1; // 转为从 1 开始的规则 + + while (index > 0) { + const remainder = (index - 1) % base; + result = String.fromCharCode(charCodeA + remainder) + result; + index = Math.floor((index - 1) / base); + } + + return result; +}; + +/** + * 根据类型和坐标获取箭头单元格数组 + * @param parentCellType - 父单元格类型 + * @param colName - 列名 + * @param rowName - 行名 + * @returns 单元格坐标数组 + */ +export const getSheetRelationCell = (parentCellType: string, colName?: string, rowName?: string): { row: number; col: number }[] => { + if (parentCellType === 'none' || !colName || !rowName) return []; + + const col = getIndexFromAlphabetRule(colName); + const row = Number(rowName) - 1; + + return [{ row, col }]; +}; + +/** + * 修正工作表中的单元格数据。 + * 根据传入的单元格数据 (`cellData`) 和指定的行、列数量,判断是否需要修正数据。 + * 如果所有单元格数据异常(如未定义、空字符串、或无效值),则修正为默认配置; + * 如果存在正常单元格,则返回原始数据。 + * + */ +export const correctSheetCellData = (cellData: any = {}, rowCount: number, columnCount: number, isFloatDom: boolean = false) => { + // 单元格纠正配置 + const correctCellDataConfig = { + v: ' ', + t: 1, + }; + + // 如果 cellData 是空对象,直接返回默认初始化的单元格数据 + if (isEmptyObject(cellData)) { + return { + 0: { + 0: correctCellDataConfig, + }, + }; + } + + let totalCells = 0; + let abnormalCells = 0; + // 统计单元格数据中正常与异常的数量 + for (const rowKey in cellData) { + const rowValue = cellData[rowKey] ?? {}; + for (const colKey in rowValue) { + const { v, t, s } = rowValue[colKey] ?? {}; + + // 判断异常单元格条件 + if (isNullOrUndefined(s)) { + if (v === undefined || (v === '' && t === 1) || (v === 0 && (t === 2 || t === 3))) { + abnormalCells++; + } + } + + totalCells++; + } + } + + // 如果存在正常单元格,直接返回原始数据 + if (totalCells > abnormalCells) { + return cellData; + } + + // 否则需要修正数据 + for (let i = 0; i < rowCount; i++) { + for (let j = 0; j < columnCount; j++) { + const { v, t, custom } = cellData?.[i]?.[j] ?? {}; + + // 判断是否需要修正(根据 isFloatDom 区分) + const needsCorrection = isFloatDom + ? custom === undefined && (v === undefined || (v === '' && t === 1)) + : custom === undefined && (v === undefined || (v === '' && t === 1) || (v === 0 && (t === 2 || t === 3))); + + // 如果发现第一个需要修正的单元格,修正并结束所有循环 + if (needsCorrection) { + if (!cellData[i]) { + cellData[i] = {}; + } + cellData[i][j] = correctCellDataConfig; + + return cellData; // 修正完成后直接返回 + } + } + } + + // 排查不出来问题,只能返回了 + return cellData; +}; + +/** + * 将 Base64 编码的字符串转换为 File 对象 + * @param base64String Base64 字符串(必须以 `data:` 开头) + * @param fileName 生成的文件名 + * @param mimeType 文件 MIME 类型(如 "image/png", "application/pdf") + * @returns 返回一个 Promise,解析后得到 File 对象 + */ +export function base64ToFile(base64String: string, fileName: string, mimeType: string): Promise { + return fetch(base64String) + .then(res => res.blob()) // 将 Base64 转换为 Blob + .then(blob => new File([blob], fileName, { type: mimeType })); // 生成 File 对象 +} + +/** + * 计算旋转后的边界框尺寸 + * @param {number} width 原始宽度 + * @param {number} height 原始高度 + * @param {number} angleDegrees 旋转角度(0-360,单位:度) + * @returns {{ rotatedWidth: number; rotatedHeight: number }} 旋转后的宽度和高度 + */ +export function rotatedBoundingBox(width: number, height: number, angleDegrees: number): { rotatedWidth: number; rotatedHeight: number } { + const angle = (angleDegrees * Math.PI) / 180; // 角度转换为弧度 + const rotatedWidth = Math.abs(width * Math.cos(angle)) + Math.abs(height * Math.sin(angle)); + const rotatedHeight = Math.abs(width * Math.sin(angle)) + Math.abs(height * Math.cos(angle)); + return { rotatedWidth, rotatedHeight }; +} + +/** + * 获取打印页面的样式 + * @param paperType - 纸张类型,对应 `YunzhupaasPrintPaperSizeForType` 中的键值 + * @param direction - 打印方向,取值为 `YunzhupaasPrintDirectionEnum.portrait`(纵向)或 `YunzhupaasPrintDirectionEnum.landscape`(横向) + * @returns 一个包含打印样式的 ` diff --git a/src/components/Report/src/yunzhupaasUniver/Print/Render/Page/index.vue b/src/components/Report/src/yunzhupaasUniver/Print/Render/Page/index.vue new file mode 100644 index 0000000..4c07fe4 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Print/Render/Page/index.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/components/Report/src/yunzhupaasUniver/Print/Render/index.vue b/src/components/Report/src/yunzhupaasUniver/Print/Render/index.vue new file mode 100644 index 0000000..0fcad44 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Print/Render/index.vue @@ -0,0 +1,536 @@ + + + + + diff --git a/src/components/Report/src/yunzhupaasUniver/Print/index.vue b/src/components/Report/src/yunzhupaasUniver/Print/index.vue new file mode 100644 index 0000000..5e31434 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/Print/index.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/src/components/Report/src/yunzhupaasUniver/index.ts b/src/components/Report/src/yunzhupaasUniver/index.ts new file mode 100644 index 0000000..b910701 --- /dev/null +++ b/src/components/Report/src/yunzhupaasUniver/index.ts @@ -0,0 +1,15 @@ +import { App } from 'vue'; +import YunzhupaasUniver from './Design/index.vue'; +import YunzhupaasUniverPrint from './Print/Render/index.vue'; + +YunzhupaasUniver.install = (app: App) => app.component(YunzhupaasUniver.name as string, YunzhupaasUniver); +YunzhupaasUniverPrint.install = (app: App) => app.component(YunzhupaasUniverPrint.name as string, YunzhupaasUniver); + +export { YunzhupaasUniver, YunzhupaasUniverPrint }; + +export default { + install(app: App) { + app.component(YunzhupaasUniver.name as string, YunzhupaasUniver); + app.component(YunzhupaasUniverPrint.name as string, YunzhupaasUniverPrint); + }, +}; diff --git a/src/components/Report/style/index.less b/src/components/Report/style/index.less new file mode 100644 index 0000000..97df5d0 --- /dev/null +++ b/src/components/Report/style/index.less @@ -0,0 +1,144 @@ +@prefix-cls: ~'@{namespace}-report-designer'; + +html[data-theme='dark'] { + .@{prefix-cls} { + .flex-row { + .center-side { + #hiprintPrintTemplate { + background-color: #fff; + color: #333; + } + // 滚动条右下角的三角形颜色 + ::-webkit-scrollbar-corner { + background-color: #fff; + } + } + .right-side { + #PrintElementOptionSetting { + .prop-tabs .prop-tab-items .prop-tab-item span { + color: rgba(255, 255, 255, 0.85); + } + .hiprint-option-items .hiprint-option-item .hiprint-option-item-label { + color: #fff; + } + } + } + } + } +} + +.@{prefix-cls} { + height: 100%; + display: flex; + + &__body { + flex: 1; + position: relative; + display: flex; + overflow: hidden; + } + .design-wrap { + width: 100%; + height: calc(100%); + } + + .flex-row { + height: calc(100%); + display: flex; + overflow: hidden; + + .left-side { + max-width: 250px; + min-width: 250px; + height: calc(100%); + background: @component-background; + border-radius: 8px; + + .tabs-content { + height: calc(100% - 42px); + user-select: none; + .components-list { + .components-list-title { + font-weight: 600; + .title-tip { + font-size: 12px; + color: #999; + margin-left: 4px; + font-weight: normal; + } + } + .ant-collapse-content-box { + padding: 0 10px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + } + .components-item { + width: 110px; + margin-bottom: 10px; + transition: transform 0ms !important; + &.disabled { + .components-body { + cursor: not-allowed; + color: @text-color-secondary; + &:hover { + color: @text-color-secondary; + border-color: @border-color-base; + } + } + } + &.ep-click-item .components-body { + cursor: pointer; + } + .components-body { + padding-left: 8px; + font-size: 12px; + height: 36px; + cursor: move; + border: 1px solid @border-color-base; + border-radius: var(--border-radius); + line-height: 34px; + display: flex; + align-items: center; + color: @text-color; + i { + line-height: 16px; + height: 16px; + margin-right: 4px; + } + &:hover { + border: 1px solid @primary-color; + color: @primary-color; + } + } + } + } + .dataSet-content { + height: 100%; + .dataSet-content-header { + height: 50px; + padding: 10px; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid @border-color-base1; + font-size: 16px; + } + .dataSet-content-main { + height: calc(100% - 50px); + } + } + } + } + + .center-side { + background: @component-background; + flex: 1; + min-width: 800px; + overflow: hidden; + margin: 0 0 0 10px; + border-radius: 8px; + box-sizing: border-box; + } + } +} diff --git a/src/components/Scrollbar/index.ts b/src/components/Scrollbar/index.ts new file mode 100644 index 0000000..e5b2cb2 --- /dev/null +++ b/src/components/Scrollbar/index.ts @@ -0,0 +1,8 @@ +/** + * copy from element-ui + */ + +import Scrollbar from './src/Scrollbar.vue'; + +export { Scrollbar }; +export type { ScrollbarType } from './src/types'; diff --git a/src/components/Scrollbar/src/Scrollbar.vue b/src/components/Scrollbar/src/Scrollbar.vue new file mode 100644 index 0000000..e46441a --- /dev/null +++ b/src/components/Scrollbar/src/Scrollbar.vue @@ -0,0 +1,192 @@ + + + diff --git a/src/components/Scrollbar/src/bar.ts b/src/components/Scrollbar/src/bar.ts new file mode 100644 index 0000000..e6a8c0d --- /dev/null +++ b/src/components/Scrollbar/src/bar.ts @@ -0,0 +1,91 @@ +import { defineComponent, h, computed, ref, getCurrentInstance, onUnmounted, inject, Ref } from 'vue'; +import { on, off } from '@/utils/domUtils'; + +import { renderThumbStyle, BAR_MAP } from './util'; + +export default defineComponent({ + name: 'Bar', + + props: { + vertical: Boolean, + size: String, + move: Number, + }, + + setup(props) { + const instance = getCurrentInstance(); + const thumb = ref(); + const wrap = inject('scroll-bar-wrap', {} as Ref>) as any; + const bar = computed(() => { + return BAR_MAP[props.vertical ? 'vertical' : 'horizontal']; + }); + const barStore = ref({}); + const cursorDown = ref(); + const clickThumbHandler = (e: any) => { + // prevent click event of right button + if (e.ctrlKey || e.button === 2) { + return; + } + window.getSelection()?.removeAllRanges(); + startDrag(e); + barStore.value[bar.value.axis] = e.currentTarget[bar.value.offset] - (e[bar.value.client] - e.currentTarget.getBoundingClientRect()[bar.value.direction]); + }; + + const clickTrackHandler = (e: any) => { + const offset = Math.abs(e.target.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]); + const thumbHalf = thumb.value[bar.value.offset] / 2; + const thumbPositionPercentage = ((offset - thumbHalf) * 100) / instance?.vnode.el?.[bar.value.offset]; + + wrap.value[bar.value.scroll] = (thumbPositionPercentage * wrap.value[bar.value.scrollSize]) / 100; + }; + const startDrag = (e: any) => { + e.stopImmediatePropagation(); + cursorDown.value = true; + on(document, 'mousemove', mouseMoveDocumentHandler); + on(document, 'mouseup', mouseUpDocumentHandler); + document.onselectstart = () => false; + }; + + const mouseMoveDocumentHandler = (e: any) => { + if (cursorDown.value === false) return; + const prevPage = barStore.value[bar.value.axis]; + + if (!prevPage) return; + + const offset = (instance?.vnode.el?.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) * -1; + const thumbClickPosition = thumb.value[bar.value.offset] - prevPage; + const thumbPositionPercentage = ((offset - thumbClickPosition) * 100) / instance?.vnode.el?.[bar.value.offset]; + wrap.value[bar.value.scroll] = (thumbPositionPercentage * wrap.value[bar.value.scrollSize]) / 100; + }; + + function mouseUpDocumentHandler() { + cursorDown.value = false; + barStore.value[bar.value.axis] = 0; + off(document, 'mousemove', mouseMoveDocumentHandler); + document.onselectstart = null; + } + + onUnmounted(() => { + off(document, 'mouseup', mouseUpDocumentHandler); + }); + + return () => + h( + 'div', + { + class: ['scrollbar__bar', 'is-' + bar.value.key], + onMousedown: clickTrackHandler, + }, + h('div', { + ref: thumb, + class: 'scrollbar__thumb', + onMousedown: clickThumbHandler, + style: renderThumbStyle({ + size: props.size, + move: props.move, + bar: bar.value, + }), + }), + ); + }, +}); diff --git a/src/components/Scrollbar/src/types.d.ts b/src/components/Scrollbar/src/types.d.ts new file mode 100644 index 0000000..4c7eeea --- /dev/null +++ b/src/components/Scrollbar/src/types.d.ts @@ -0,0 +1,18 @@ +export interface BarMapItem { + offset: string; + scroll: string; + scrollSize: string; + size: string; + key: string; + axis: string; + client: string; + direction: string; +} +export interface BarMap { + vertical: BarMapItem; + horizontal: BarMapItem; +} + +export interface ScrollbarType { + wrap: ElRef; +} diff --git a/src/components/Scrollbar/src/util.ts b/src/components/Scrollbar/src/util.ts new file mode 100644 index 0000000..b7c4845 --- /dev/null +++ b/src/components/Scrollbar/src/util.ts @@ -0,0 +1,50 @@ +import type { BarMap } from './types'; +export const BAR_MAP: BarMap = { + vertical: { + offset: 'offsetHeight', + scroll: 'scrollTop', + scrollSize: 'scrollHeight', + size: 'height', + key: 'vertical', + axis: 'Y', + client: 'clientY', + direction: 'top', + }, + horizontal: { + offset: 'offsetWidth', + scroll: 'scrollLeft', + scrollSize: 'scrollWidth', + size: 'width', + key: 'horizontal', + axis: 'X', + client: 'clientX', + direction: 'left', + }, +}; + +// @ts-ignore +export function renderThumbStyle({ move, size, bar }) { + const style = {} as any; + const translate = `translate${bar.axis}(${move}%)`; + + style[bar.size] = size; + style.transform = translate; + style.msTransform = translate; + style.webkitTransform = translate; + + return style; +} + +function extend(to: T, _from: K): T & K { + return Object.assign(to, _from); +} + +export function toObject(arr: Array): Recordable { + const res = {}; + for (let i = 0; i < arr.length; i++) { + if (arr[i]) { + extend(res, arr[i]); + } + } + return res; +} diff --git a/src/components/SimpleMenu/index.ts b/src/components/SimpleMenu/index.ts new file mode 100644 index 0000000..0dfd248 --- /dev/null +++ b/src/components/SimpleMenu/index.ts @@ -0,0 +1,2 @@ +export { default as SimpleMenu } from './src/SimpleMenu.vue'; +export { default as SimpleMenuTag } from './src/SimpleMenuTag.vue'; diff --git a/src/components/SimpleMenu/src/SimpleMenu.vue b/src/components/SimpleMenu/src/SimpleMenu.vue new file mode 100644 index 0000000..9a11c29 --- /dev/null +++ b/src/components/SimpleMenu/src/SimpleMenu.vue @@ -0,0 +1,151 @@ + + + diff --git a/src/components/SimpleMenu/src/SimpleMenuTag.vue b/src/components/SimpleMenu/src/SimpleMenuTag.vue new file mode 100644 index 0000000..e5d1c38 --- /dev/null +++ b/src/components/SimpleMenu/src/SimpleMenuTag.vue @@ -0,0 +1,68 @@ + + diff --git a/src/components/SimpleMenu/src/SimpleSubMenu.vue b/src/components/SimpleMenu/src/SimpleSubMenu.vue new file mode 100644 index 0000000..e50108e --- /dev/null +++ b/src/components/SimpleMenu/src/SimpleSubMenu.vue @@ -0,0 +1,93 @@ + + diff --git a/src/components/SimpleMenu/src/components/Menu.vue b/src/components/SimpleMenu/src/components/Menu.vue new file mode 100644 index 0000000..a1ee290 --- /dev/null +++ b/src/components/SimpleMenu/src/components/Menu.vue @@ -0,0 +1,150 @@ + + + + diff --git a/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue b/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue new file mode 100644 index 0000000..8f03d7b --- /dev/null +++ b/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue @@ -0,0 +1,78 @@ + + diff --git a/src/components/SimpleMenu/src/components/MenuItem.vue b/src/components/SimpleMenu/src/components/MenuItem.vue new file mode 100644 index 0000000..b00199b --- /dev/null +++ b/src/components/SimpleMenu/src/components/MenuItem.vue @@ -0,0 +1,104 @@ + + + diff --git a/src/components/SimpleMenu/src/components/SubMenuItem.vue b/src/components/SimpleMenu/src/components/SubMenuItem.vue new file mode 100644 index 0000000..58147b6 --- /dev/null +++ b/src/components/SimpleMenu/src/components/SubMenuItem.vue @@ -0,0 +1,309 @@ + + + diff --git a/src/components/SimpleMenu/src/components/menu.less b/src/components/SimpleMenu/src/components/menu.less new file mode 100644 index 0000000..e541947 --- /dev/null +++ b/src/components/SimpleMenu/src/components/menu.less @@ -0,0 +1,311 @@ +@menu-prefix-cls: ~'@{namespace}-menu'; +@menu-popup-prefix-cls: ~'@{namespace}-menu-popup'; +@submenu-popup-prefix-cls: ~'@{namespace}-menu-submenu-popup'; + +@transition-time: 0.2s; +@menu-dark-subsidiary-color: rgba(255, 255, 255, 0.7); + +.light-border { + &::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + display: block; + width: 2px; + content: ''; + background-color: @primary-color; + } +} + +.@{menu-prefix-cls}-menu-popover { + .ant-popover-arrow { + display: none; + } + + .ant-popover-inner-content { + padding: 0; + } + + .@{menu-prefix-cls} { + max-height: 100vh; + overflow: hidden auto; + &-opened > * > &-submenu-title-icon { + transform: translateY(-50%) rotate(90deg) !important; + } + + &-item, + &-submenu-title { + position: relative; + z-index: 1; + padding: 12px 20px; + color: @menu-dark-subsidiary-color; + cursor: pointer; + transition: all @transition-time @ease-in-out; + + &-icon { + position: absolute; + top: 50%; + right: 18px; + transition: transform @transition-time @ease-in-out; + transform: translateY(-50%) rotate(-90deg); + } + } + + &-dark { + .@{menu-prefix-cls}-item, + .@{menu-prefix-cls}-submenu-title { + color: @menu-dark-subsidiary-color; + // background: @menu-dark-active-bg; + + &:hover { + color: #fff; + } + + &-selected { + color: #fff; + background-color: @primary-color !important; + } + } + } + + &-light { + .@{menu-prefix-cls}-item, + .@{menu-prefix-cls}-submenu-title { + color: @text-color-base; + + &:hover { + color: @primary-color; + } + + &-selected { + z-index: 2; + color: @primary-color; + background-color: fade(@primary-color, 10); + + .light-border(); + } + } + } + } +} + +.content(); +.content() { + .@{menu-prefix-cls} { + position: relative; + display: block; + width: 100%; + padding: 0; + margin: 0; + font-size: @font-size-base; + color: @text-color-base; + list-style: none; + outline: none; + + // .collapse-transition { + // transition: @transition-time height ease-in-out, @transition-time padding-top ease-in-out, + // @transition-time padding-bottom ease-in-out; + // } + + &-light { + background-color: #fff; + + .@{menu-prefix-cls}-submenu-active { + color: @primary-color !important; + + &-border { + .light-border(); + } + } + } + + &-dark { + .@{menu-prefix-cls}-submenu-active { + color: #fff !important; + } + } + + &-item { + position: relative; + z-index: 1; + display: flex; + align-items: center; + font-size: @font-size-base; + color: inherit; + list-style: none; + cursor: pointer; + outline: none; + + &:hover, + &:active { + color: inherit; + } + } + + &-item > i { + margin-right: 6px; + } + + &-submenu-title > i, + &-submenu-title span > i { + margin-right: 8px; + } + + // vertical + &-vertical &-item, + &-vertical &-submenu-title { + position: relative; + z-index: 1; + padding: 12px 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; + + &:hover { + color: @primary-color; + } + + .@{menu-prefix-cls}-tooltip { + width: calc(100% - 0px); + padding: 12px 0; + text-align: center; + } + .@{menu-prefix-cls}-submenu-popup { + padding: 12px 0; + } + } + + &-vertical &-submenu-collapse { + .@{submenu-popup-prefix-cls} { + display: flex; + align-items: center; + justify-content: center; + } + .@{menu-prefix-cls}-submenu-collapsed-show-tit { + flex-direction: column; + } + } + + &-vertical&-collapse &-item, + &-vertical&-collapse &-submenu-title { + padding: 0; + } + + &-vertical &-submenu-title-icon { + position: absolute; + top: 50%; + right: 18px; + transform: translateY(-50%); + } + + &-submenu-title-icon { + transition: transform @transition-time @ease-in-out; + } + + &-vertical &-opened > * > &-submenu-title-icon { + transform: translateY(-50%) rotate(180deg); + } + + &-vertical &-submenu { + &-nested { + padding-left: 20px; + } + .@{menu-prefix-cls}-item { + padding-left: 43px; + } + } + + &-light&-vertical &-item { + &-active:not(.@{menu-prefix-cls}-submenu) { + z-index: 2; + color: @primary-color; + background-color: fade(@primary-color, 10); + + .light-border(); + } + &-active.@{menu-prefix-cls}-submenu { + color: @primary-color; + } + } + + &-light&-vertical&-collapse { + > li.@{menu-prefix-cls}-item-active, + .@{menu-prefix-cls}-submenu-active { + position: relative; + background-color: fade(@primary-color, 5); + + &::after { + display: none; + } + + &::before { + position: absolute; + top: 0; + left: 0; + width: 3px; + height: 100%; + content: ''; + background-color: @primary-color; + } + } + } + + &-dark&-vertical &-item, + &-dark&-vertical &-submenu-title { + color: @menu-dark-subsidiary-color; + &-active:not(.@{menu-prefix-cls}-submenu) { + color: #fff !important; + background-color: @primary-color !important; + } + + &:hover { + color: #fff; + } + } + + &-dark&-vertical&-collapse { + > li.@{menu-prefix-cls}-item-active, + .@{menu-prefix-cls}-submenu-active { + position: relative; + color: #fff !important; + background-color: @sider-dark-darken-bg-color !important; + + &::before { + position: absolute; + top: 0; + left: 0; + width: 3px; + height: 100%; + content: ''; + background-color: @primary-color; + } + + .@{menu-prefix-cls}-submenu-collapse { + background-color: transparent; + } + } + } + + &-dark&-vertical &-submenu &-item { + &-active, + &-active:hover { + color: #fff; + border-right: none; + } + } + + &-dark&-vertical &-child-item-active > &-submenu-title { + color: #fff; + } + + &-dark&-vertical &-opened { + .@{menu-prefix-cls}-submenu-has-parent-submenu { + .@{menu-prefix-cls}-submenu-title { + background-color: transparent; + } + } + } + } +} diff --git a/src/components/SimpleMenu/src/components/types.ts b/src/components/SimpleMenu/src/components/types.ts new file mode 100644 index 0000000..d828e89 --- /dev/null +++ b/src/components/SimpleMenu/src/components/types.ts @@ -0,0 +1,25 @@ +import { Ref } from 'vue'; + +export interface Props { + theme: string; + activeName?: string | number | undefined; + openNames: string[]; + accordion: boolean; + width: string; + collapsedWidth: string; + indentSize: number; + collapse: boolean; + activeSubMenuNames: (string | number)[]; +} + +export interface SubMenuProvider { + addSubMenu: (name: string | number, update?: boolean) => void; + removeSubMenu: (name: string | number, update?: boolean) => void; + removeAll: () => void; + sliceIndex: (index: number) => void; + isRemoveAllPopup: Ref; + getOpenNames: () => (string | number)[]; + handleMouseleave?: Fn; + level: number; + props: Props; +} diff --git a/src/components/SimpleMenu/src/components/useMenu.ts b/src/components/SimpleMenu/src/components/useMenu.ts new file mode 100644 index 0000000..8830559 --- /dev/null +++ b/src/components/SimpleMenu/src/components/useMenu.ts @@ -0,0 +1,84 @@ +import { computed, ComponentInternalInstance, unref } from 'vue'; +import type { CSSProperties } from 'vue'; + +export function useMenuItem(instance: ComponentInternalInstance | null) { + const getParentMenu = computed(() => { + return findParentMenu(['Menu', 'SubMenu']); + }); + + const getParentRootMenu = computed(() => { + return findParentMenu(['Menu']); + }); + + const getParentSubMenu = computed(() => { + return findParentMenu(['SubMenu']); + }); + + const getItemStyle = computed((): CSSProperties => { + let parent = instance?.parent; + if (!parent) return {}; + const indentSize = (unref(getParentRootMenu)?.props.indentSize as number) ?? 20; + let padding = indentSize; + + if (unref(getParentRootMenu)?.props.collapse) { + padding = indentSize; + } else { + while (parent && parent.type.name !== 'Menu') { + if (parent.type.name === 'SubMenu') { + padding += indentSize; + } + parent = parent.parent; + } + } + return { paddingLeft: padding + 'px' }; + }); + + function findParentMenu(name: string[]) { + let parent = instance?.parent; + if (!parent) return null; + while (parent && name.indexOf(parent.type.name!) === -1) { + parent = parent.parent; + } + return parent; + } + + function getParentList() { + let parent = instance; + if (!parent) + return { + uidList: [], + list: [], + }; + const ret: any[] = []; + while (parent && parent.type.name !== 'Menu') { + if (parent.type.name === 'SubMenu') { + ret.push(parent); + } + parent = parent.parent; + } + return { + uidList: ret.map((item) => item.uid), + list: ret, + }; + } + + function getParentInstance(instance: ComponentInternalInstance, name = 'SubMenu') { + let parent = instance.parent; + while (parent) { + if (parent.type.name !== name) { + return parent; + } + parent = parent.parent; + } + return parent; + } + + return { + getParentMenu, + getParentInstance, + getParentRootMenu, + getParentList, + getParentSubMenu, + getItemStyle, + }; +} diff --git a/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts b/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts new file mode 100644 index 0000000..05631b8 --- /dev/null +++ b/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts @@ -0,0 +1,18 @@ +import type { InjectionKey, Ref } from 'vue'; +import type { Emitter } from '@/utils/mitt'; +import { createContext, useContext } from '@/hooks/core/useContext'; + +export interface SimpleRootMenuContextProps { + rootMenuEmitter: Emitter; + activeName: Ref; +} + +const key: InjectionKey = Symbol(); + +export function createSimpleRootMenuContext(context: SimpleRootMenuContextProps) { + return createContext(context, key, { readonly: false, native: true }); +} + +export function useSimpleRootMenuContext() { + return useContext(key); +} diff --git a/src/components/SimpleMenu/src/index.less b/src/components/SimpleMenu/src/index.less new file mode 100644 index 0000000..ee0eb43 --- /dev/null +++ b/src/components/SimpleMenu/src/index.less @@ -0,0 +1,91 @@ +@simple-prefix-cls: ~'@{namespace}-simple-menu'; +@prefix-cls: ~'@{namespace}-menu'; + +.@{prefix-cls} { + &-dark&-vertical .@{simple-prefix-cls}__parent { + background-color: @sider-dark-bg-color; + > .@{prefix-cls}-submenu-title { + background-color: @sider-dark-bg-color; + } + } + &-vertical .@{simple-prefix-cls}__children, + &-popup { + background-color: #fff; + .@{simple-prefix-cls}__children { + background-color: #fff; + > .@{prefix-cls}-submenu-title { + background-color: #fff; + } + } + } + + &-dark&-vertical .@{simple-prefix-cls}__children, + &-dark&-popup { + background-color: @sider-dark-lighten-bg-color; + .@{simple-prefix-cls}__children { + background-color: @sider-dark-lighten-bg-color; + > .@{prefix-cls}-submenu-title { + background-color: @sider-dark-lighten-bg-color; + } + } + } + + .collapse-title { + overflow: hidden; + font-size: 12px; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +.@{simple-prefix-cls} { + background-color: transparent; + &-sub-title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + transition: all 0.3s; + } + + &-tag { + position: absolute; + top: calc(50% - 8px); + right: 30px; + display: inline-block; + padding: 2px 3px; + margin-right: 4px; + font-size: 10px; + line-height: 14px; + color: #fff; + border-radius: 2px; + + &--collapse { + top: 6px !important; + right: 2px; + } + + &--dot { + top: calc(50% - 2px); + width: 6px; + height: 6px; + padding: 0; + border-radius: 50%; + } + + &--primary { + background-color: @primary-color; + } + + &--error { + background-color: @error-color; + } + + &--success { + background-color: @success-color; + } + + &--warn { + background-color: @warning-color; + } + } +} diff --git a/src/components/SimpleMenu/src/types.ts b/src/components/SimpleMenu/src/types.ts new file mode 100644 index 0000000..2e292d4 --- /dev/null +++ b/src/components/SimpleMenu/src/types.ts @@ -0,0 +1,5 @@ +export interface MenuState { + activeName: string; + openNames: string[]; + activeSubMenuNames: string[]; +} diff --git a/src/components/SimpleMenu/src/useOpenKeys.ts b/src/components/SimpleMenu/src/useOpenKeys.ts new file mode 100644 index 0000000..da5c8de --- /dev/null +++ b/src/components/SimpleMenu/src/useOpenKeys.ts @@ -0,0 +1,48 @@ +import type { Menu as MenuType } from '@/router/types'; +import type { MenuState } from './types'; + +import { computed, Ref, toRaw } from 'vue'; + +import { unref } from 'vue'; +import { uniq } from 'lodash-es'; +import { getAllParentPath } from '@/router/helper/menuHelper'; + +import { useTimeoutFn } from '@/hooks/core/useTimeout'; +import { useDebounceFn } from '@vueuse/core'; + +export function useOpenKeys(menuState: MenuState, menus: Ref, accordion: Ref, mixSider: Ref, collapse: Ref) { + const debounceSetOpenKeys = useDebounceFn(setOpenKeys, 50); + async function setOpenKeys(path: string) { + if (path === '/profile') return; + const native = !mixSider.value; + const menuList = toRaw(menus.value); + useTimeoutFn( + () => { + if (menuList?.length === 0) { + menuState.activeSubMenuNames = []; + menuState.openNames = []; + return; + } + const keys = getAllParentPath(menuList, path); + + if (!unref(accordion)) { + menuState.openNames = uniq([...menuState.openNames, ...keys]); + } else { + menuState.openNames = keys; + } + if ((path === '/home' || path === '/404') && menuList[0].type === 1) { + menuState.openNames = [menuList[0].path]; + } + menuState.activeSubMenuNames = menuState.openNames; + }, + 30, + native, + ); + } + + const getOpenKeys = computed(() => { + return unref(collapse) ? [] : menuState.openNames; + }); + + return { setOpenKeys: debounceSetOpenKeys, getOpenKeys }; +} diff --git a/src/components/StrengthMeter/index.ts b/src/components/StrengthMeter/index.ts new file mode 100644 index 0000000..d7049b3 --- /dev/null +++ b/src/components/StrengthMeter/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import strengthMeter from './src/StrengthMeter.vue'; + +export const StrengthMeter = withInstall(strengthMeter); diff --git a/src/components/StrengthMeter/src/StrengthMeter.vue b/src/components/StrengthMeter/src/StrengthMeter.vue new file mode 100644 index 0000000..583bccf --- /dev/null +++ b/src/components/StrengthMeter/src/StrengthMeter.vue @@ -0,0 +1,135 @@ + + + + diff --git a/src/components/Table/index.ts b/src/components/Table/index.ts new file mode 100644 index 0000000..37c9d5e --- /dev/null +++ b/src/components/Table/index.ts @@ -0,0 +1,11 @@ +export { default as BasicTable } from './src/BasicTable.vue'; +export { default as TableAction } from './src/components/TableAction.vue'; +export { default as EditTableHeaderIcon } from './src/components/EditTableHeaderIcon.vue'; +export { default as TableImg } from './src/components/TableImg.vue'; + +export * from './src/types/table'; +export * from './src/types/pagination'; +export * from './src/types/tableAction'; +export { useTable } from './src/hooks/useTable'; +export type { FormSchema, FormProps } from '@/components/Form/src/types/form'; +export type { EditRecordRow } from './src/components/editable'; diff --git a/src/components/Table/src/BasicTable.vue b/src/components/Table/src/BasicTable.vue new file mode 100644 index 0000000..49b700c --- /dev/null +++ b/src/components/Table/src/BasicTable.vue @@ -0,0 +1,422 @@ + + + diff --git a/src/components/Table/src/componentMap.ts b/src/components/Table/src/componentMap.ts new file mode 100644 index 0000000..e485c3e --- /dev/null +++ b/src/components/Table/src/componentMap.ts @@ -0,0 +1,24 @@ +import type { Component } from 'vue'; +import { Input, Select, Checkbox, InputNumber, Switch, DatePicker, TimePicker, AutoComplete } from 'ant-design-vue'; +import type { ComponentType } from './types/componentType'; + +const componentMap = new Map(); + +componentMap.set('Input', Input); +componentMap.set('InputNumber', InputNumber); +componentMap.set('Select', Select); +componentMap.set('AutoComplete', AutoComplete); +componentMap.set('Switch', Switch); +componentMap.set('Checkbox', Checkbox); +componentMap.set('DatePicker', DatePicker); +componentMap.set('TimePicker', TimePicker); + +export function add(compName: ComponentType, component: Component) { + componentMap.set(compName, component); +} + +export function del(compName: ComponentType) { + componentMap.delete(compName); +} + +export { componentMap }; diff --git a/src/components/Table/src/components/EditTableHeaderIcon.vue b/src/components/Table/src/components/EditTableHeaderIcon.vue new file mode 100644 index 0000000..369820e --- /dev/null +++ b/src/components/Table/src/components/EditTableHeaderIcon.vue @@ -0,0 +1,16 @@ + + diff --git a/src/components/Table/src/components/HeaderCell.vue b/src/components/Table/src/components/HeaderCell.vue new file mode 100644 index 0000000..a1ec106 --- /dev/null +++ b/src/components/Table/src/components/HeaderCell.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/components/Table/src/components/TableAction.vue b/src/components/Table/src/components/TableAction.vue new file mode 100644 index 0000000..7c03899 --- /dev/null +++ b/src/components/Table/src/components/TableAction.vue @@ -0,0 +1,213 @@ + + + diff --git a/src/components/Table/src/components/TableFooter.vue b/src/components/Table/src/components/TableFooter.vue new file mode 100644 index 0000000..82ec5b4 --- /dev/null +++ b/src/components/Table/src/components/TableFooter.vue @@ -0,0 +1,95 @@ + + diff --git a/src/components/Table/src/components/TableHeader.vue b/src/components/Table/src/components/TableHeader.vue new file mode 100644 index 0000000..210953f --- /dev/null +++ b/src/components/Table/src/components/TableHeader.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/components/Table/src/components/TableImg.vue b/src/components/Table/src/components/TableImg.vue new file mode 100644 index 0000000..4530ffd --- /dev/null +++ b/src/components/Table/src/components/TableImg.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/components/Table/src/components/TableTitle.vue b/src/components/Table/src/components/TableTitle.vue new file mode 100644 index 0000000..c119d20 --- /dev/null +++ b/src/components/Table/src/components/TableTitle.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/components/Table/src/components/editable/CellComponent.ts b/src/components/Table/src/components/editable/CellComponent.ts new file mode 100644 index 0000000..89dbcf6 --- /dev/null +++ b/src/components/Table/src/components/editable/CellComponent.ts @@ -0,0 +1,38 @@ +import type { FunctionalComponent, defineComponent } from 'vue'; +import type { ComponentType } from '../../types/componentType'; +import { componentMap } from '@/components/Table/src/componentMap'; + +import { Popover } from 'ant-design-vue'; +import { h } from 'vue'; + +export interface ComponentProps { + component: ComponentType; + rule: boolean; + popoverVisible: boolean; + ruleMessage: string; + getPopupContainer?: Fn; +} + +export const CellComponent: FunctionalComponent = ( + { component = 'Input', rule = true, ruleMessage, popoverVisible, getPopupContainer }: ComponentProps, + { attrs }, +) => { + const Comp = componentMap.get(component) as typeof defineComponent; + + const DefaultComp = h(Comp, attrs); + if (!rule) { + return DefaultComp; + } + return h( + Popover, + { + overlayClassName: 'edit-cell-rule-popover', + open: !!popoverVisible, + ...(getPopupContainer ? { getPopupContainer } : {}), + }, + { + default: () => DefaultComp, + content: () => ruleMessage, + }, + ); +}; diff --git a/src/components/Table/src/components/editable/EditableCell.vue b/src/components/Table/src/components/editable/EditableCell.vue new file mode 100644 index 0000000..8e8c1f4 --- /dev/null +++ b/src/components/Table/src/components/editable/EditableCell.vue @@ -0,0 +1,502 @@ + + diff --git a/src/components/Table/src/components/editable/helper.ts b/src/components/Table/src/components/editable/helper.ts new file mode 100644 index 0000000..b5d66a8 --- /dev/null +++ b/src/components/Table/src/components/editable/helper.ts @@ -0,0 +1,28 @@ +import { ComponentType } from '../../types/componentType'; +import { useI18n } from '@/hooks/web/useI18n'; + +const { t } = useI18n(); + +/** + * @description: 生成placeholder + */ +export function createPlaceholderMessage(component: ComponentType) { + if (component.includes('Input') || component.includes('AutoComplete')) { + return t('common.inputText'); + } + if (component.includes('Picker')) { + return t('common.chooseText'); + } + + if ( + component.includes('Select') || + component.includes('Checkbox') || + component.includes('Radio') || + component.includes('Switch') || + component.includes('DatePicker') || + component.includes('TimePicker') + ) { + return t('common.chooseText'); + } + return ''; +} diff --git a/src/components/Table/src/components/editable/index.ts b/src/components/Table/src/components/editable/index.ts new file mode 100644 index 0000000..cfb5a25 --- /dev/null +++ b/src/components/Table/src/components/editable/index.ts @@ -0,0 +1,68 @@ +import type { BasicColumn } from '@/components/Table/src/types/table'; + +import { h, Ref } from 'vue'; + +import EditableCell from './EditableCell.vue'; +import { isArray } from '@/utils/is'; + +interface Params { + text: string; + record: Recordable; + index: number; +} + +export function renderEditCell(column: BasicColumn) { + return ({ text: value, record, index }: Params) => { + record.onValid = async () => { + if (isArray(record?.validCbs)) { + const validFns = (record?.validCbs || []).map(fn => fn()); + const res = await Promise.all(validFns); + return res.every(item => !!item); + } else { + return false; + } + }; + + record.onEdit = async (edit: boolean, submit = false) => { + if (!submit) { + record.editable = edit; + } + + if (!edit && submit) { + if (!(await record.onValid())) return false; + const res = await record.onSubmitEdit?.(); + if (res) { + record.editable = false; + return true; + } + return false; + } + // cancel + if (!edit && !submit) { + record.onCancelEdit?.(); + } + return true; + }; + + return h(EditableCell, { + value, + record, + column, + index, + }); + }; +} + +export type EditRecordRow = Partial< + { + onEdit: (editable: boolean, submit?: boolean) => Promise; + onValid: () => Promise; + editable: boolean; + onCancel: Fn; + onSubmit: Fn; + submitCbs: Fn[]; + cancelCbs: Fn[]; + validCbs: Fn[]; + editValueRefs: Recordable; + } & T +>; diff --git a/src/components/Table/src/components/settings/ColumnSetting.vue b/src/components/Table/src/components/settings/ColumnSetting.vue new file mode 100644 index 0000000..6d53ef3 --- /dev/null +++ b/src/components/Table/src/components/settings/ColumnSetting.vue @@ -0,0 +1,578 @@ + + + diff --git a/src/components/Table/src/components/settings/ExpandSetting.vue b/src/components/Table/src/components/settings/ExpandSetting.vue new file mode 100644 index 0000000..96e3ece --- /dev/null +++ b/src/components/Table/src/components/settings/ExpandSetting.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/components/Table/src/components/settings/FullScreenSetting.vue b/src/components/Table/src/components/settings/FullScreenSetting.vue new file mode 100644 index 0000000..a6fdd3f --- /dev/null +++ b/src/components/Table/src/components/settings/FullScreenSetting.vue @@ -0,0 +1,38 @@ + + diff --git a/src/components/Table/src/components/settings/RedoSetting.vue b/src/components/Table/src/components/settings/RedoSetting.vue new file mode 100644 index 0000000..b074e54 --- /dev/null +++ b/src/components/Table/src/components/settings/RedoSetting.vue @@ -0,0 +1,34 @@ + + diff --git a/src/components/Table/src/components/settings/SizeSetting.vue b/src/components/Table/src/components/settings/SizeSetting.vue new file mode 100644 index 0000000..d8e6d11 --- /dev/null +++ b/src/components/Table/src/components/settings/SizeSetting.vue @@ -0,0 +1,97 @@ + + diff --git a/src/components/Table/src/components/settings/index.vue b/src/components/Table/src/components/settings/index.vue new file mode 100644 index 0000000..0bf861a --- /dev/null +++ b/src/components/Table/src/components/settings/index.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/components/Table/src/const.ts b/src/components/Table/src/const.ts new file mode 100644 index 0000000..395e1de --- /dev/null +++ b/src/components/Table/src/const.ts @@ -0,0 +1,31 @@ +import componentSetting from '@/settings/componentSetting'; + +const { table } = componentSetting; + +const { pageSizeOptions, defaultPageSize, fetchSetting, defaultSize, defaultSortFn, defaultFilterFn } = table; + +export const ROW_KEY = 'id'; + +// Optional display number per page; +export const PAGE_SIZE_OPTIONS = pageSizeOptions; + +// Number of items displayed per page +export const PAGE_SIZE = defaultPageSize; + +// Common interface field settings +export const FETCH_SETTING = fetchSetting; + +// Default Size +export const DEFAULT_SIZE = defaultSize; + +// Configure general sort function +export const DEFAULT_SORT_FN = defaultSortFn; + +export const DEFAULT_FILTER_FN = defaultFilterFn; + +// Default layout of table cells +export const DEFAULT_ALIGN = 'left'; + +export const INDEX_COLUMN_FLAG = 'INDEX'; + +export const ACTION_COLUMN_FLAG = 'ACTION'; diff --git a/src/components/Table/src/hooks/useColumns.ts b/src/components/Table/src/hooks/useColumns.ts new file mode 100644 index 0000000..2885aa6 --- /dev/null +++ b/src/components/Table/src/hooks/useColumns.ts @@ -0,0 +1,317 @@ +import type { BasicColumn, BasicTableProps, CellFormat, GetColumnsParams } from '../types/table'; +import type { PaginationProps } from '../types/pagination'; +import type { ComputedRef } from 'vue'; +import { computed, Ref, ref, reactive, toRaw, unref, watch } from 'vue'; +import { renderEditCell } from '../components/editable'; +import { usePermission } from '@/hooks/web/usePermission'; +import { useI18n } from '@/hooks/web/useI18n'; +import { isArray, isBoolean, isFunction, isMap, isString } from '@/utils/is'; +import { cloneDeep, isEqual } from 'lodash-es'; +import { formatToDate } from '@/utils/dateUtil'; +import { ACTION_COLUMN_FLAG, DEFAULT_ALIGN, INDEX_COLUMN_FLAG, PAGE_SIZE } from '../const'; + +function handleItem(item: BasicColumn, ellipsis: boolean) { + const { key, dataIndex, children } = item; + item.align = item.align || DEFAULT_ALIGN; + if (!key) { + item.key = dataIndex as string; + } + if (ellipsis) { + if (!isBoolean(item.ellipsis)) { + Object.assign(item, { + ellipsis, + }); + } + } + if (children && children.length) { + handleChildren(children, !!ellipsis); + } +} + +function handleChildren(children: BasicColumn[] | undefined, ellipsis: boolean) { + if (!children) return; + children.forEach(item => { + const { children } = item; + handleItem(item, ellipsis); + handleChildren(children, ellipsis); + }); +} + +function handleIndexColumn(propsRef: ComputedRef, getPaginationRef: ComputedRef, columns: BasicColumn[]) { + const { t } = useI18n(); + + const { showIndexColumn, indexColumnProps, isTreeTable } = unref(propsRef); + + let pushIndexColumns = false; + if (unref(isTreeTable)) { + return; + } + columns.forEach(() => { + const indIndex = columns.findIndex(column => column.flag === INDEX_COLUMN_FLAG); + if (showIndexColumn) { + pushIndexColumns = indIndex === -1; + } else if (!showIndexColumn && indIndex !== -1) { + columns.splice(indIndex, 1); + } + }); + if (!columns.length) pushIndexColumns = true; + + if (!pushIndexColumns) return; + + const isFixedLeft = columns.some(item => item.fixed === 'left'); + + columns.unshift({ + flag: INDEX_COLUMN_FLAG, + // update-begin--author:liaozhiyang---date:20240724---for:【TV360X-1634】密度是宽松模式时,序号列表头换行了 + width: propsRef.value.size === 'large' ? 65 : 50, + // update-end--author:liaozhiyang---date:20240724---for:【TV360X-1634】密度是宽松模式时,序号列表头换行了 + title: t('component.table.index'), + align: 'center', + customRender: ({ index }) => { + const getPagination = unref(getPaginationRef); + if (isBoolean(getPagination)) { + return `${index + 1}`; + } + const { current = 1, pageSize = PAGE_SIZE } = getPagination; + return ((current < 1 ? 1 : current) - 1) * pageSize + index + 1; + }, + ...(isFixedLeft + ? { + fixed: 'left', + } + : {}), + ...indexColumnProps, + }); +} + +function handleActionColumn(propsRef: ComputedRef, columns: BasicColumn[]) { + const { actionColumn } = unref(propsRef); + if (!actionColumn) return; + + const hasIndex = columns.findIndex(column => column.flag === ACTION_COLUMN_FLAG); + if (hasIndex === -1) { + columns.push({ + ...columns[hasIndex], + fixed: 'right', + ...actionColumn, + flag: ACTION_COLUMN_FLAG, + }); + } +} + +export function useColumns(propsRef: ComputedRef, getPaginationRef: ComputedRef) { + const columnsRef = ref(unref(propsRef).columns) as unknown as Ref; + let cacheColumns = unref(propsRef).columns; + + const getColumnsRef = computed(() => { + const columns = cloneDeep(unref(columnsRef)); + + handleIndexColumn(propsRef, getPaginationRef, columns); + handleActionColumn(propsRef, columns); + if (!columns) { + return []; + } + const { ellipsis } = unref(propsRef); + + columns.forEach(item => { + const { customRender, slots } = item; + + handleItem(item, Reflect.has(item, 'ellipsis') ? !!item.ellipsis : !!ellipsis && !customRender && !slots); + }); + return columns; + }); + + function isIfShow(column: BasicColumn): boolean { + const ifShow = column.ifShow; + + let isIfShow = true; + + if (isBoolean(ifShow)) { + isIfShow = ifShow; + } + if (isFunction(ifShow)) { + isIfShow = ifShow(column); + } + return isIfShow; + } + const { hasColumnP } = usePermission(); + + const getViewColumns = computed(() => { + const viewColumns = sortFixedColumn(unref(getColumnsRef)); + + const mapFn = column => { + const { slots, customRender, format, edit, editRow, flag } = column; + + if (!slots || !slots?.title) { + // column.slots = { title: `header-${dataIndex}`, ...(slots || {}) }; + column.customTitle = column.title; + Reflect.deleteProperty(column, 'title'); + } + const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!); + if (!customRender && format && !edit && !isDefaultAction) { + column.customRender = ({ text, record, index }) => { + return formatCell(text, format, record, index); + }; + } + + // edit table + if ((edit || editRow) && !isDefaultAction) { + column.customRender = renderEditCell(column); + } + return reactive(column); + }; + + const columns = cloneDeep(viewColumns); + return columns + .filter(column => hasColumnP(column.auth) && isIfShow(column)) + .map(column => { + // Support table multiple header editable + if (column.children?.length) { + column.children = column.children.map(mapFn); + } + + return mapFn(column); + }); + }); + + watch( + () => unref(propsRef).columns, + columns => { + columnsRef.value = columns; + cacheColumns = columns?.filter(item => !item.flag) ?? []; + }, + ); + + function setCacheColumnsByField(dataIndex: string | undefined, value: Partial) { + if (!dataIndex || !value) { + return; + } + cacheColumns.forEach(item => { + if (item.dataIndex === dataIndex) { + Object.assign(item, value); + return; + } + }); + } + /** + * set columns + * @param columnList key|column + */ + function setColumns(columnList: Partial[] | (string | string[])[]) { + const columns = cloneDeep(columnList); + if (!isArray(columns)) return; + + if (columns.length <= 0) { + columnsRef.value = []; + return; + } + + const firstColumn = columns[0]; + + const cacheKeys = cacheColumns.map(item => item.dataIndex); + + if (!isString(firstColumn) && !isArray(firstColumn)) { + columnsRef.value = columns as BasicColumn[]; + } else { + const columnKeys = (columns as (string | string[])[]).map(m => m.toString()); + const newColumns: BasicColumn[] = []; + cacheColumns.forEach(item => { + newColumns.push({ + ...item, + defaultHidden: !columnKeys.includes(item.dataIndex?.toString() || (item.key as string)), + }); + }); + // Sort according to another array + if (!isEqual(cacheKeys, columns)) { + newColumns.sort((prev, next) => { + return columnKeys.indexOf(prev.dataIndex?.toString() as string) - columnKeys.indexOf(next.dataIndex?.toString() as string); + }); + } + columnsRef.value = newColumns; + } + } + + function getColumns(opt?: GetColumnsParams) { + const { ignoreIndex, ignoreAction, sort } = opt || {}; + let columns = toRaw(unref(getColumnsRef)); + if (ignoreIndex) { + columns = columns.filter(item => item.flag !== INDEX_COLUMN_FLAG); + } + if (ignoreAction) { + columns = columns.filter(item => item.flag !== ACTION_COLUMN_FLAG); + } + + if (sort) { + columns = sortFixedColumn(columns); + } + + return columns; + } + function getCacheColumns() { + return cacheColumns; + } + function setCacheColumns(columns: BasicColumn[]) { + if (!isArray(columns)) return; + cacheColumns = columns.filter(item => !item.flag); + } + + return { + getColumnsRef, + getCacheColumns, + getColumns, + setColumns, + getViewColumns, + setCacheColumnsByField, + setCacheColumns, + }; +} + +function sortFixedColumn(columns: BasicColumn[]) { + const fixedLeftColumns: BasicColumn[] = []; + const fixedRightColumns: BasicColumn[] = []; + const defColumns: BasicColumn[] = []; + for (const column of columns) { + if (column.fixed === 'left') { + fixedLeftColumns.push(column); + continue; + } + if (column.fixed === 'right') { + fixedRightColumns.push(column); + continue; + } + defColumns.push(column); + } + return [...fixedLeftColumns, ...defColumns, ...fixedRightColumns].filter(item => !item.defaultHidden); +} + +// format cell +export function formatCell(text: string | number, format: CellFormat, record: Recordable, index: number) { + if (!format) { + return text; + } + + // custom function + if (isFunction(format)) { + return format(text as string, record, index); + } + + try { + // date type + const DATE_FORMAT_PREFIX = 'date|'; + if (isString(format) && format.startsWith(DATE_FORMAT_PREFIX) && (text || text === 0)) { + const dateFormat = format.replace(DATE_FORMAT_PREFIX, ''); + + if (!dateFormat) { + return text; + } + return formatToDate(text, dateFormat); + } + + // Map + if (isMap(format)) { + return format.get(text); + } + } catch (error) { + return text; + } +} diff --git a/src/components/Table/src/hooks/useColumnsCache.ts b/src/components/Table/src/hooks/useColumnsCache.ts new file mode 100644 index 0000000..16b31c9 --- /dev/null +++ b/src/components/Table/src/hooks/useColumnsCache.ts @@ -0,0 +1,149 @@ +import { computed, nextTick, unref, watchEffect } from 'vue'; +import { router } from '@/router'; +import { useRoute } from 'vue-router'; +import { createLocalStorage } from '@/utils/cache'; +import { useTableContext } from './useTableContext'; +import { useMessage } from '@/hooks/web/useMessage'; + +/** + * 列表配置缓存 + */ +export function useColumnsCache(opt, setColumns, handleColumnFixed) { + let isInit = false; + const table = useTableContext(); + const $ls = createLocalStorage(); + const { createMessage: $message } = useMessage(); + const route = useRoute(); + // 列表配置缓存key + const cacheKey = computed(() => { + // update-begin--author:liaozhiyang---date:20240226---for:【QQYUN-8367】online报表配置列展示保存,影响到其他页面的table字段的显示隐藏(开发环境热更新会有此问题,生产环境无问题) + const path = route.path; + let key = path.replace(/[\/\\]/g, '_'); + // update-end--author:liaozhiyang---date:20240226---for:【QQYUN-8367】online报表配置列展示保存,影响到其他页面的table字段的显示隐藏(开发环境热更新会有此问题,生产环境无问题) + let cacheKey = table.getBindValues.value.tableSetting?.cacheKey; + if (cacheKey) { + key += ':' + cacheKey; + } + return 'columnCache:' + key; + }); + + watchEffect(() => { + const columns = table.getColumns(); + if (columns.length) { + init(); + } + }); + + async function init() { + if (isInit) { + return; + } + isInit = true; + let columnCache = $ls.get(cacheKey.value); + if (columnCache && columnCache.checkedList) { + const { checkedList, sortedList, sortableOrder, checkIndex } = columnCache; + await nextTick(); + // checkbox的排序缓存 + opt.sortableOrder.value = sortableOrder; + // checkbox的选中缓存 + opt.state.checkedList = checkedList; + // tableColumn的排序缓存 + opt.plainSortOptions.value.sort((prev, next) => { + return sortedList.indexOf(prev.value) - sortedList.indexOf(next.value); + }); + // 重新排序tableColumn + checkedList.sort((prev, next) => sortedList.indexOf(prev) - sortedList.indexOf(next)); + // 是否显示行号列 + if (checkIndex) { + table.setProps({ showIndexColumn: true }); + } + setColumns(checkedList); + // 设置固定列 + setColumnFixed(columnCache); + } + } + + /** 设置被固定的列 */ + async function setColumnFixed(columnCache) { + const { fixedColumns } = columnCache; + const columns = opt.plainOptions.value; + for (const column of columns) { + let fixedCol = fixedColumns.find(fc => fc.key === (column.key || column.dataIndex)); + if (fixedCol) { + await nextTick(); + handleColumnFixed(column, fixedCol.fixed); + } + } + } + + // 判断列固定状态 + const fixedReg = /^(true|left|right)$/; + + /** 获取被固定的列 */ + function getFixedColumns() { + let fixedColumns: any[] = []; + const columns = opt.plainOptions.value; + for (const column of columns) { + if (fixedReg.test((column.fixed ?? '').toString())) { + fixedColumns.push({ + key: column.key || column.dataIndex, + fixed: column.fixed === true ? 'left' : column.fixed, + }); + } + } + return fixedColumns; + } + + /** 保存列配置 */ + function saveSetting() { + const { checkedList } = opt.state; + // update-begin--author:liaozhiyang---date:20240611---for:【TV360X-105】列展示设置问题[重置之后保存的顺序还是上次的] + let sortedList = []; + if (opt.restAfterOptions.value) { + sortedList = opt.restAfterOptions.value.map(item => item.value); + } else { + sortedList = unref(opt.plainSortOptions).map(item => item.value); + } + // update-end--author:liaozhiyang---date:20240611---for:【TV360X-105】列展示设置问题[重置之后保存的顺序还是上次的] + $ls.set(cacheKey.value, { + // 保存的列 + checkedList, + // 排序后的列 + sortedList, + // 是否显示行号列 + checkIndex: unref(opt.checkIndex), + // checkbox原始排序 + sortableOrder: unref(opt.sortableOrder), + // 固定列 + fixedColumns: getFixedColumns(), + }); + $message.success('保存成功'); + // 保存之后直接关闭 + opt.popoverVisible.value = false; + } + + /** 重置(删除)列配置 */ + async function resetSetting() { + // 重置固定列 + await resetFixedColumn(); + $ls.remove(cacheKey.value); + $message.success('重置成功'); + } + + async function resetFixedColumn() { + const columns = opt.plainOptions.value; + for (const column of columns) { + column.fixed; + if (fixedReg.test((column.fixed ?? '').toString())) { + await nextTick(); + handleColumnFixed(column, null); + } + } + } + + return { + saveSetting, + resetSetting, + getCache: () => $ls.get(cacheKey.value), + }; +} diff --git a/src/components/Table/src/hooks/useCustomRow.ts b/src/components/Table/src/hooks/useCustomRow.ts new file mode 100644 index 0000000..9e44d34 --- /dev/null +++ b/src/components/Table/src/hooks/useCustomRow.ts @@ -0,0 +1,100 @@ +import type { ComputedRef } from 'vue'; +import type { BasicTableProps } from '../types/table'; +import { unref } from 'vue'; +import { ROW_KEY } from '../const'; +import { isString, isFunction } from '@/utils/is'; + +interface Options { + setSelectedRowKeys: (keys: string[]) => void; + getSelectRowKeys: () => string[]; + clearSelectedRowKeys: () => void; + emit: EmitType; + getAutoCreateKey: ComputedRef; +} + +function getKey(record: Recordable, rowKey: string | ((record: Record) => string) | undefined, autoCreateKey?: boolean) { + if (!rowKey || autoCreateKey) { + return record[ROW_KEY]; + } + if (isString(rowKey)) { + return record[rowKey]; + } + if (isFunction(rowKey)) { + return record[rowKey(record)]; + } + return null; +} + +export function useCustomRow( + propsRef: ComputedRef, + { setSelectedRowKeys, getSelectRowKeys, getAutoCreateKey, clearSelectedRowKeys, emit }: Options, +) { + const customRow = (record: Recordable, index: number) => { + return { + onClick: (e: Event) => { + e?.stopPropagation(); + function handleClick() { + const { rowSelection, rowKey, clickToRowSelect } = unref(propsRef); + if (!rowSelection || !clickToRowSelect) return; + const keys = getSelectRowKeys() || []; + const key = getKey(record, rowKey, unref(getAutoCreateKey)); + if (!key) return; + + const isCheckbox = rowSelection.type === 'checkbox'; + if (isCheckbox) { + // 找到tr + const tr: HTMLElement = (e as MouseEvent).composedPath?.().find((dom: HTMLElement) => dom.tagName === 'TR') as HTMLElement; + if (!tr) return; + // 找到Checkbox,检查是否为disabled + const checkBox = tr.querySelector('input[type=checkbox]'); + if (!checkBox || checkBox.hasAttribute('disabled')) return; + if (!keys.includes(key)) { + setSelectedRowKeys([...keys, key]); + return; + } + const keyIndex = keys.findIndex(item => item === key); + keys.splice(keyIndex, 1); + setSelectedRowKeys(keys); + return; + } + + const isRadio = rowSelection.type === 'radio'; + if (isRadio) { + // 找到tr + const tr: HTMLElement = (e as MouseEvent).composedPath?.().find((dom: HTMLElement) => dom.tagName === 'TR') as HTMLElement; + if (!tr) return; + // 找到radio,检查是否为disabled + const radio = tr.querySelector('input[type=radio]'); + if (!radio || radio.hasAttribute('disabled')) return; + if (!keys.includes(key)) { + if (keys.length) { + clearSelectedRowKeys(); + } + setSelectedRowKeys([key]); + return; + } + clearSelectedRowKeys(); + } + } + handleClick(); + emit('row-click', record, index, e); + }, + onDblclick: (event: Event) => { + emit('row-dbClick', record, index, event); + }, + onContextmenu: (event: Event) => { + emit('row-contextmenu', record, index, event); + }, + onMouseenter: (event: Event) => { + emit('row-mouseenter', record, index, event); + }, + onMouseleave: (event: Event) => { + emit('row-mouseleave', record, index, event); + }, + }; + }; + + return { + customRow, + }; +} diff --git a/src/components/Table/src/hooks/useDataSource.ts b/src/components/Table/src/hooks/useDataSource.ts new file mode 100644 index 0000000..9e108c1 --- /dev/null +++ b/src/components/Table/src/hooks/useDataSource.ts @@ -0,0 +1,365 @@ +import type { BasicTableProps, FetchParams, SorterResult } from '../types/table'; +import type { PaginationProps } from '../types/pagination'; +import { ref, unref, ComputedRef, computed, onMounted, watch, reactive, Ref, watchEffect, nextTick } from 'vue'; +import { useTimeoutFn } from '@/hooks/core/useTimeout'; +import { buildUUID } from '@/utils/uuid'; +import { isFunction, isBoolean, isObject } from '@/utils/is'; +import { get, cloneDeep, merge } from 'lodash-es'; +import { FETCH_SETTING, ROW_KEY, PAGE_SIZE } from '../const'; + +interface ActionType { + getPaginationInfo: ComputedRef; + setPagination: (info: Partial) => void; + setLoading: (loading: boolean) => void; + getFieldsValue: () => Recordable; + clearSelectedRowKeys: () => void; + expandAll: () => void; + tableData: Ref; +} + +interface SearchState { + sortInfo: Recordable; + filterInfo: Record; +} +export function useDataSource( + propsRef: ComputedRef, + { getPaginationInfo, setPagination, setLoading, getFieldsValue, clearSelectedRowKeys, expandAll, tableData }: ActionType, + emit: EmitType, +) { + const searchState = reactive({ + sortInfo: {}, + filterInfo: {}, + }); + const dataSourceRef = ref([]); + const rawDataSourceRef = ref({}); + const fetchParams = ref({}); + + watchEffect(() => { + tableData.value = unref(dataSourceRef); + }); + watch( + () => unref(propsRef).dataSource, + () => { + const { dataSource, api } = unref(propsRef); + !api && dataSource && (dataSourceRef.value = dataSource); + }, + { + immediate: true, + deep: true, + }, + ); + + function handleTableChange(pagination: PaginationProps, filters: Partial>, sorter: SorterResult) { + const { clearSelectOnPageChange, sortFn, filterFn } = unref(propsRef); + if (clearSelectOnPageChange) clearSelectedRowKeys(); + setPagination(pagination); + + const params: Recordable = {}; + if (sorter && isFunction(sortFn)) { + const sortInfo = sortFn(sorter); + searchState.sortInfo = sortInfo; + params.sortInfo = sortInfo; + } + + if (filters && isFunction(filterFn)) { + const filterInfo = filterFn(filters); + searchState.filterInfo = filterInfo; + params.filterInfo = filterInfo; + } + fetch(params); + } + + function setTableKey(items: any[]) { + if (!items || !Array.isArray(items)) return; + items.forEach(item => { + if (!item[ROW_KEY]) { + item[ROW_KEY] = buildUUID(); + } + if (item.children && item.children.length) { + setTableKey(item.children); + } + }); + } + + const getAutoCreateKey = computed(() => { + return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey; + }); + + const getRowKey = computed(() => { + const { rowKey } = unref(propsRef); + return unref(getAutoCreateKey) ? ROW_KEY : rowKey; + }); + + const getDataSourceRef = computed(() => { + const dataSource = unref(dataSourceRef); + if (!dataSource || dataSource.length === 0) { + return unref(dataSourceRef); + } + if (unref(getAutoCreateKey)) { + const firstItem = dataSource[0]; + const lastItem = dataSource[dataSource.length - 1]; + + if (firstItem && lastItem) { + if (!firstItem[ROW_KEY] || !lastItem[ROW_KEY]) { + const data = cloneDeep(unref(dataSourceRef)); + data.forEach(item => { + if (!item[ROW_KEY]) { + item[ROW_KEY] = buildUUID(); + } + if (item.children && item.children.length) { + setTableKey(item.children); + } + }); + dataSourceRef.value = data; + } + } + } + return unref(dataSourceRef); + }); + + async function updateTableData(index: number, key: string, value: any) { + const record = dataSourceRef.value[index]; + if (record) { + dataSourceRef.value[index][key] = value; + } + return dataSourceRef.value[index]; + } + + function updateTableDataRecord(rowKey: string | number, record: Recordable): Recordable | undefined { + const row = findTableDataRecord(rowKey); + + if (row) { + for (const field in row) { + if (Reflect.has(record, field)) row[field] = record[field]; + } + return row; + } + } + + function deleteTableDataRecord(rowKey: string | number | string[] | number[]) { + if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; + const rowKeyName = unref(getRowKey); + if (!rowKeyName) return; + const rowKeys = !Array.isArray(rowKey) ? [rowKey] : rowKey; + + function deleteRow(data, key) { + const row: { index: number; data: [] } = findRow(data, key); + if (row === null || row.index === -1) { + return; + } + row.data.splice(row.index, 1); + + function findRow(data, key) { + if (data === null || data === undefined) { + return null; + } + for (let i = 0; i < data.length; i++) { + const row = data[i]; + let targetKeyName: string = rowKeyName as string; + if (isFunction(rowKeyName)) { + targetKeyName = rowKeyName(row); + } + if (row[targetKeyName] === key) { + return { index: i, data }; + } + if (row.children?.length > 0) { + const result = findRow(row.children, key); + if (result != null) { + return result; + } + } + } + return null; + } + } + + for (const key of rowKeys) { + deleteRow(dataSourceRef.value, key); + deleteRow(unref(propsRef).dataSource, key); + } + setPagination({ + total: unref(propsRef).dataSource?.length, + }); + } + + function insertTableDataRecord(record: Recordable | Recordable[], index: number): Recordable[] | undefined { + // if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; + index = index ?? dataSourceRef.value?.length; + const _record = isObject(record) ? [record as Recordable] : (record as Recordable[]); + unref(dataSourceRef).splice(index, 0, ..._record); + return unref(dataSourceRef); + } + + function findTableDataRecord(rowKey: string | number) { + if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; + + const rowKeyName = unref(getRowKey); + if (!rowKeyName) return; + + const { childrenColumnName = 'children' } = unref(propsRef); + + const findRow = (array: any[]) => { + let ret; + array.some(function iter(r) { + if (typeof rowKeyName === 'function') { + if ((rowKeyName(r) as string) === rowKey) { + ret = r; + return true; + } + } else { + if (Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey) { + ret = r; + return true; + } + } + return r[childrenColumnName] && r[childrenColumnName].some(iter); + }); + return ret; + }; + + // const row = dataSourceRef.value.find(r => { + // if (typeof rowKeyName === 'function') { + // return (rowKeyName(r) as string) === rowKey + // } else { + // return Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey + // } + // }) + return findRow(dataSourceRef.value); + } + + async function fetch(opt?: FetchParams) { + const { clearSelectOnPageChange } = unref(propsRef); + if (clearSelectOnPageChange) clearSelectedRowKeys(); + + const { api, searchInfo, defSort, fetchSetting, beforeFetch, afterFetch, useSearchForm, pagination } = unref(propsRef); + if (!api || !isFunction(api)) return; + try { + setLoading(true); + const { pageField, sizeField, listField, totalField } = Object.assign({}, FETCH_SETTING, fetchSetting); + let pageParams: Recordable = {}; + + const { current = 1, pageSize = PAGE_SIZE } = unref(getPaginationInfo) as PaginationProps; + const isNoPagination = (isBoolean(pagination) && !pagination) || isBoolean(getPaginationInfo); + + if (isNoPagination) { + pageParams = {}; + } else { + pageParams[pageField] = (opt && opt.page) || current; + pageParams[sizeField] = pageSize; + } + + const { sortInfo = {}, filterInfo } = searchState; + + let params: Recordable = merge( + pageParams, + useSearchForm ? getFieldsValue() : {}, + searchInfo, + opt?.searchInfo ?? {}, + defSort, + sortInfo, + filterInfo, + opt?.sortInfo ?? {}, + opt?.filterInfo ?? {}, + ); + if (beforeFetch && isFunction(beforeFetch)) { + params = (await beforeFetch(params)) || params; + } + fetchParams.value = params; + + const res = await api(params); + const data = res.data; + rawDataSourceRef.value = data; + + const isArrayResult = Array.isArray(data); + + let resultItems: Recordable[] = isArrayResult ? data : get(data, listField); + let resultTotal: number = 0; + if (!isNoPagination) resultTotal = isArrayResult ? data.length : get(data, totalField); + + // 假如数据变少,导致总页数变少并小于当前选中页码,通过getPaginationRef获取到的页码是不正确的,需获取正确的页码再次执行 + if (Number(resultTotal)) { + const currentTotalPage = Math.ceil(resultTotal / pageSize); + if (current > currentTotalPage) { + setPagination({ + current: currentTotalPage, + }); + return await fetch(opt); + } + } + + if (afterFetch && isFunction(afterFetch)) { + resultItems = (await afterFetch(resultItems)) || resultItems; + } + dataSourceRef.value = resultItems; + setPagination({ + total: resultTotal || 0, + }); + if (opt && opt.page) { + setPagination({ + current: opt.page || 1, + }); + } + emit('fetch-success', { + items: unref(resultItems), + total: resultTotal, + }); + return resultItems; + } catch (error) { + emit('fetch-error', error); + dataSourceRef.value = []; + setPagination({ + total: 0, + }); + } finally { + const { isTreeTable, defaultExpandAllRows } = unref(propsRef); + nextTick(() => { + if (isTreeTable && defaultExpandAllRows) expandAll(); + }); + setLoading(false); + } + } + + function setTableData(values: T[]) { + dataSourceRef.value = values as []; + } + + function getDataSource() { + return getDataSourceRef.value as T[]; + } + + function getRawDataSource() { + return rawDataSourceRef.value as T; + } + + function getFetchParams() { + return fetchParams.value as T; + } + + async function reload(opt?: FetchParams) { + return await fetch(opt); + } + + onMounted(() => { + useTimeoutFn(() => { + unref(propsRef).immediate && fetch(); + }, 16); + }); + + return { + getDataSourceRef, + getDataSource, + getRawDataSource, + getFetchParams, + getRowKey, + setTableData, + getAutoCreateKey, + fetch, + reload, + updateTableData, + updateTableDataRecord, + deleteTableDataRecord, + insertTableDataRecord, + findTableDataRecord, + handleTableChange, + }; +} diff --git a/src/components/Table/src/hooks/useLoading.ts b/src/components/Table/src/hooks/useLoading.ts new file mode 100644 index 0000000..fe8a0f1 --- /dev/null +++ b/src/components/Table/src/hooks/useLoading.ts @@ -0,0 +1,21 @@ +import { ref, ComputedRef, unref, computed, watch } from 'vue'; +import type { BasicTableProps } from '../types/table'; + +export function useLoading(props: ComputedRef) { + const loadingRef = ref(unref(props).loading); + + watch( + () => unref(props).loading, + (loading) => { + loadingRef.value = loading; + }, + ); + + const getLoading = computed(() => unref(loadingRef)); + + function setLoading(loading: boolean) { + loadingRef.value = loading; + } + + return { getLoading, setLoading }; +} diff --git a/src/components/Table/src/hooks/usePagination.tsx b/src/components/Table/src/hooks/usePagination.tsx new file mode 100644 index 0000000..dc539ee --- /dev/null +++ b/src/components/Table/src/hooks/usePagination.tsx @@ -0,0 +1,85 @@ +import type { PaginationProps } from '../types/pagination'; +import type { BasicTableProps } from '../types/table'; +import { computed, unref, ref, ComputedRef, watch } from 'vue'; +import { LeftOutlined, RightOutlined } from '@ant-design/icons-vue'; +import { isBoolean } from '@/utils/is'; +import { PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../const'; +import { useI18n } from '@/hooks/web/useI18n'; + +interface ItemRender { + page: number; + type: 'page' | 'prev' | 'next'; + originalElement: any; +} + +function itemRender({ page, type, originalElement }: ItemRender) { + if (type === 'prev') { + return page === 0 ? null : ; + } else if (type === 'next') { + return page === 1 ? null : ; + } + return originalElement; +} + +export function usePagination(refProps: ComputedRef) { + const { t } = useI18n(); + + const configRef = ref({}); + const show = ref(true); + + watch( + () => unref(refProps).pagination, + pagination => { + if (!isBoolean(pagination) && pagination) { + configRef.value = { + ...unref(configRef), + ...(pagination ?? {}), + }; + } + }, + ); + + const getPaginationInfo = computed((): PaginationProps | boolean => { + const { pagination } = unref(refProps); + + if (!unref(show) || (isBoolean(pagination) && !pagination)) { + return false; + } + + return { + current: 1, + pageSize: PAGE_SIZE, + size: 'small', + defaultPageSize: PAGE_SIZE, + showTotal: total => t('component.table.total', { total }), + showSizeChanger: true, + pageSizeOptions: PAGE_SIZE_OPTIONS, + itemRender: itemRender, + showQuickJumper: true, + ...(isBoolean(pagination) ? {} : pagination), + ...unref(configRef), + }; + }); + + function setPagination(info: Partial) { + const paginationInfo = unref(getPaginationInfo); + configRef.value = { + ...(!isBoolean(paginationInfo) ? paginationInfo : {}), + ...info, + }; + } + + function getPagination() { + return unref(getPaginationInfo); + } + + function getShowPagination() { + return unref(show); + } + + async function setShowPagination(flag: boolean) { + show.value = flag; + } + + return { getPagination, getPaginationInfo, setShowPagination, getShowPagination, setPagination }; +} diff --git a/src/components/Table/src/hooks/useRowSelection.ts b/src/components/Table/src/hooks/useRowSelection.ts new file mode 100644 index 0000000..d151e3c --- /dev/null +++ b/src/components/Table/src/hooks/useRowSelection.ts @@ -0,0 +1,126 @@ +import { isFunction } from '@/utils/is'; +import type { BasicTableProps, TableRowSelection } from '../types/table'; +import { computed, ComputedRef, nextTick, Ref, ref, toRaw, unref, watch } from 'vue'; +import { ROW_KEY } from '../const'; +import { omit } from 'lodash-es'; +import { findNodeAll } from '@/utils/helper/treeHelper'; + +export function useRowSelection(propsRef: ComputedRef, tableData: Ref, emit: EmitType) { + const selectedRowKeysRef = ref([]); + const selectedRowRef = ref([]); + + const getRowSelectionRef = computed((): TableRowSelection | null => { + const { rowSelection } = unref(propsRef); + if (!rowSelection) { + return null; + } + + return { + // AntDV3.0 之后使用远程加载数据进行分页时, + // 默认会清空上一页选择的行数据(导致无法跨页选择), + // 将此属性设置为 true 即可解决。 + preserveSelectedRowKeys: true, + selectedRowKeys: unref(selectedRowKeysRef), + onChange: (selectedRowKeys: string[]) => { + setSelectedRowKeys(selectedRowKeys); + }, + ...omit(rowSelection, ['onChange']), + }; + }); + + watch( + () => unref(propsRef).rowSelection?.selectedRowKeys, + (v: string[]) => { + setSelectedRowKeys(v); + }, + ); + + watch( + () => unref(selectedRowKeysRef), + () => { + nextTick(() => { + const { rowSelection } = unref(propsRef); + if (rowSelection) { + const { onChange } = rowSelection; + if (onChange && isFunction(onChange)) onChange(getSelectRowKeys(), getSelectRows()); + } + // table行选择时卡顿明显 + if (unref(tableData).length) { + emit('selection-change', { + keys: getSelectRowKeys(), + rows: getSelectRows(), + }); + } + // table行选择时卡顿明显 + }); + }, + { deep: true }, + ); + + const getAutoCreateKey = computed(() => { + return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey; + }); + + const getRowKey = computed(() => { + const { rowKey } = unref(propsRef); + return unref(getAutoCreateKey) ? ROW_KEY : rowKey; + }); + + function setSelectedRowKeys(rowKeys: string[]) { + selectedRowKeysRef.value = rowKeys; + const allSelectedRows = findNodeAll( + toRaw(unref(tableData)).concat(toRaw(unref(selectedRowRef))), + item => rowKeys?.includes(item[unref(getRowKey) as string]), + { + children: propsRef.value.childrenColumnName ?? 'children', + }, + ); + const trueSelectedRows: any[] = []; + rowKeys?.forEach((key: string) => { + const found = allSelectedRows.find(item => item[unref(getRowKey) as string] === key); + found && trueSelectedRows.push(found); + }); + selectedRowRef.value = trueSelectedRows; + } + + function setSelectedRows(rows: Recordable[]) { + selectedRowRef.value = rows; + } + + function clearSelectedRowKeys() { + selectedRowRef.value = []; + selectedRowKeysRef.value = []; + } + + function deleteSelectRowByKey(key: string) { + const selectedRowKeys = unref(selectedRowKeysRef); + const index = selectedRowKeys.findIndex(item => item === key); + if (index !== -1) { + unref(selectedRowKeysRef).splice(index, 1); + } + } + + function getSelectRowKeys() { + return unref(selectedRowKeysRef); + } + + function getSelectRows() { + // const ret = toRaw(unref(selectedRowRef)).map((item) => toRaw(item)); + return unref(selectedRowRef) as T[]; + } + + function getRowSelection() { + return unref(getRowSelectionRef)!; + } + + return { + getRowSelection, + getRowSelectionRef, + getSelectRows, + getSelectRowKeys, + setSelectedRowKeys, + clearSelectedRowKeys, + deleteSelectRowByKey, + setSelectedRows, + }; +} diff --git a/src/components/Table/src/hooks/useScrollTo.ts b/src/components/Table/src/hooks/useScrollTo.ts new file mode 100644 index 0000000..e695c7e --- /dev/null +++ b/src/components/Table/src/hooks/useScrollTo.ts @@ -0,0 +1,50 @@ +import type { ComputedRef, Ref } from 'vue'; +import { nextTick, unref } from 'vue'; +import { warn } from '@/utils/log'; + +export function useTableScrollTo(tableElRef: Ref, getDataSourceRef: ComputedRef) { + let bodyEl: HTMLElement | null; + + async function findTargetRowToScroll(targetRowData: Recordable) { + const { id } = targetRowData; + const targetRowEl: HTMLElement | null | undefined = bodyEl?.querySelector(`[data-row-key="${id}"]`); + //Add a delay to get new dataSource + await nextTick(); + bodyEl?.scrollTo({ + top: targetRowEl?.offsetTop ?? 0, + behavior: 'smooth', + }); + } + + function scrollTo(pos: string): void { + const table = unref(tableElRef); + if (!table) return; + + const tableEl: Element = table.$el; + if (!tableEl) return; + + if (!bodyEl) { + bodyEl = tableEl.querySelector('.ant-table-body'); + if (!bodyEl) return; + } + + const dataSource = unref(getDataSourceRef); + if (!dataSource) return; + + // judge pos type + if (pos === 'top') { + findTargetRowToScroll(dataSource[0]); + } else if (pos === 'bottom') { + findTargetRowToScroll(dataSource[dataSource.length - 1]); + } else { + const targetRowData = dataSource.find(data => data.id === pos); + if (targetRowData) { + findTargetRowToScroll(targetRowData); + } else { + warn(`id: ${pos} doesn't exist`); + } + } + } + + return { scrollTo }; +} diff --git a/src/components/Table/src/hooks/useTable.ts b/src/components/Table/src/hooks/useTable.ts new file mode 100644 index 0000000..a59214f --- /dev/null +++ b/src/components/Table/src/hooks/useTable.ts @@ -0,0 +1,174 @@ +import type { BasicTableProps, TableActionType, FetchParams, BasicColumn } from '../types/table'; +import type { PaginationProps } from '../types/pagination'; +import type { DynamicProps } from '#/utils'; +import type { FormActionType } from '@/components/Form'; +import type { WatchStopHandle } from 'vue'; +import { getDynamicProps } from '@/utils'; +import { ref, onUnmounted, unref, watch, toRaw } from 'vue'; +import { isProdMode } from '@/utils/env'; +import { error } from '@/utils/log'; + +type Props = Partial>; + +type UseTableMethod = TableActionType & { + getForm: () => FormActionType; +}; + +export function useTable(tableProps?: Props): [ + (instance: TableActionType, formInstance: UseTableMethod) => void, + TableActionType & { + getForm: () => FormActionType; + }, +] { + const tableRef = ref>(null); + const loadedRef = ref>(false); + const formRef = ref>(null); + + let stopWatch: WatchStopHandle; + + function register(instance: TableActionType, formInstance: UseTableMethod) { + isProdMode() && + onUnmounted(() => { + tableRef.value = null; + loadedRef.value = null; + }); + + if (unref(loadedRef) && isProdMode() && instance === unref(tableRef)) return; + + tableRef.value = instance; + formRef.value = formInstance; + tableProps && instance.setProps(getDynamicProps(tableProps)); + loadedRef.value = true; + + stopWatch?.(); + + stopWatch = watch( + () => tableProps, + () => { + tableProps && instance.setProps(getDynamicProps(tableProps)); + }, + { + immediate: true, + deep: true, + }, + ); + } + + function getTableInstance(): TableActionType { + const table = unref(tableRef); + if (!table) { + error('The table instance has not been obtained yet, please make sure the table is presented when performing the table operation!'); + } + return table as TableActionType; + } + + const methods: TableActionType & { + getForm: () => FormActionType; + } = { + reload: async (opt?: FetchParams) => { + return await getTableInstance().reload(opt); + }, + setProps: (props: Partial) => { + getTableInstance().setProps(props); + }, + redoHeight: () => { + getTableInstance().redoHeight(); + }, + setSelectedRows: (rows: Recordable[]) => { + return toRaw(getTableInstance().setSelectedRows(rows)); + }, + setLoading: (loading: boolean) => { + getTableInstance().setLoading(loading); + }, + getDataSource: () => { + return getTableInstance().getDataSource(); + }, + getRawDataSource: () => { + return getTableInstance().getRawDataSource(); + }, + getFetchParams: () => { + return getTableInstance().getFetchParams(); + }, + getColumns: ({ ignoreIndex = false }: { ignoreIndex?: boolean } = {}) => { + const columns = getTableInstance().getColumns({ ignoreIndex }) || []; + return toRaw(columns); + }, + setColumns: (columns: BasicColumn[]) => { + getTableInstance().setColumns(columns); + }, + setTableData: (values: any[]) => { + return getTableInstance().setTableData(values); + }, + setPagination: (info: Partial) => { + return getTableInstance().setPagination(info); + }, + deleteSelectRowByKey: (key: string) => { + getTableInstance().deleteSelectRowByKey(key); + }, + getSelectRowKeys: () => { + return toRaw(getTableInstance().getSelectRowKeys()); + }, + getSelectRows: () => { + return toRaw(getTableInstance().getSelectRows()); + }, + clearSelectedRowKeys: () => { + getTableInstance().clearSelectedRowKeys(); + }, + setSelectedRowKeys: (keys: string[] | number[]) => { + getTableInstance().setSelectedRowKeys(keys); + }, + getPaginationRef: () => { + return getTableInstance().getPaginationRef(); + }, + getSize: () => { + return toRaw(getTableInstance().getSize()); + }, + updateTableData: (index: number, key: string, value: any) => { + return getTableInstance().updateTableData(index, key, value); + }, + deleteTableDataRecord: (rowKey: string | number | string[] | number[]) => { + return getTableInstance().deleteTableDataRecord(rowKey); + }, + insertTableDataRecord: (record: Recordable | Recordable[], index?: number) => { + return getTableInstance().insertTableDataRecord(record, index); + }, + updateTableDataRecord: (rowKey: string | number, record: Recordable) => { + return getTableInstance().updateTableDataRecord(rowKey, record); + }, + findTableDataRecord: (rowKey: string | number) => { + return getTableInstance().findTableDataRecord(rowKey); + }, + getRowSelection: () => { + return toRaw(getTableInstance().getRowSelection()); + }, + getCacheColumns: () => { + return toRaw(getTableInstance().getCacheColumns()); + }, + getForm: () => { + return unref(formRef) as unknown as FormActionType; + }, + setShowPagination: async (show: boolean) => { + getTableInstance().setShowPagination(show); + }, + getShowPagination: () => { + return toRaw(getTableInstance().getShowPagination()); + }, + expandAll: () => { + getTableInstance().expandAll(); + }, + expandRows: (keys: string[]) => { + getTableInstance().expandRows(keys); + }, + collapseAll: () => { + getTableInstance().collapseAll(); + }, + getIsExpanded: () => { + return getTableInstance().getIsExpanded(); + }, + scrollTo: (pos: string) => { + getTableInstance().scrollTo(pos); + }, + }; + + return [register, methods]; +} diff --git a/src/components/Table/src/hooks/useTableContext.ts b/src/components/Table/src/hooks/useTableContext.ts new file mode 100644 index 0000000..b657bb2 --- /dev/null +++ b/src/components/Table/src/hooks/useTableContext.ts @@ -0,0 +1,22 @@ +import type { Ref } from 'vue'; +import type { BasicTableProps, TableActionType } from '../types/table'; +import { provide, inject, ComputedRef } from 'vue'; + +const key = Symbol('basic-table'); + +type Instance = TableActionType & { + wrapRef: Ref>; + getBindValues: ComputedRef; +}; + +type RetInstance = Omit & { + getBindValues: ComputedRef; +}; + +export function createTableContext(instance: Instance) { + provide(key, instance); +} + +export function useTableContext(): RetInstance { + return inject(key) as RetInstance; +} diff --git a/src/components/Table/src/hooks/useTableExpand.ts b/src/components/Table/src/hooks/useTableExpand.ts new file mode 100644 index 0000000..e193d4f --- /dev/null +++ b/src/components/Table/src/hooks/useTableExpand.ts @@ -0,0 +1,67 @@ +import type { ComputedRef, Ref } from 'vue'; +import type { BasicTableProps } from '../types/table'; +import { computed, unref, ref, toRaw } from 'vue'; +import { ROW_KEY } from '../const'; + +export function useTableExpand(propsRef: ComputedRef, tableData: Ref, emit: EmitType) { + const expandedRowKeys = ref([]); + const isExpanded = ref(false); + + const getAutoCreateKey = computed(() => { + return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey; + }); + + const getRowKey = computed(() => { + const { rowKey } = unref(propsRef); + return unref(getAutoCreateKey) ? ROW_KEY : rowKey; + }); + + const getExpandOption = computed(() => { + const { isTreeTable } = unref(propsRef); + if (!isTreeTable) return {}; + + return { + expandedRowKeys: unref(expandedRowKeys), + onExpandedRowsChange: (keys: string[]) => { + expandedRowKeys.value = keys; + emit('expanded-rows-change', keys); + }, + }; + }); + + function getIsExpanded() { + return isExpanded.value; + } + function expandAll() { + isExpanded.value = true; + const keys = getAllKeys(); + expandedRowKeys.value = keys; + } + + function expandRows(keys: string[]) { + // use row ID expands the specified table row + const { isTreeTable } = unref(propsRef); + if (!isTreeTable) return; + expandedRowKeys.value = [...expandedRowKeys.value, ...keys]; + } + + function getAllKeys(data?: Recordable[]) { + const keys: string[] = []; + const { childrenColumnName } = unref(propsRef); + toRaw(data || unref(tableData)).forEach((item) => { + keys.push(item[unref(getRowKey) as string]); + const children = item[childrenColumnName || 'children']; + if (children?.length) { + keys.push(...getAllKeys(children)); + } + }); + return keys; + } + + function collapseAll() { + isExpanded.value = false; + expandedRowKeys.value = []; + } + + return { getExpandOption, expandAll, expandRows, collapseAll, getIsExpanded }; +} diff --git a/src/components/Table/src/hooks/useTableFooter.ts b/src/components/Table/src/hooks/useTableFooter.ts new file mode 100644 index 0000000..9aa13c2 --- /dev/null +++ b/src/components/Table/src/hooks/useTableFooter.ts @@ -0,0 +1,52 @@ +import type { ComputedRef, Ref } from 'vue'; +import type { BasicTableProps } from '../types/table'; +import { unref, computed, h, nextTick, watchEffect } from 'vue'; +import TableFooter from '../components/TableFooter.vue'; +import { useEventListener } from '@/hooks/event/useEventListener'; + +export function useTableFooter( + propsRef: ComputedRef, + scrollRef: ComputedRef<{ + x: string | number | true; + y: string | number | null; + scrollToFirstRowOnChange: boolean; + }>, + tableElRef: Ref, + getDataSourceRef: ComputedRef, +) { + const getIsEmptyData = computed(() => { + return (unref(getDataSourceRef) || []).length === 0; + }); + + const getFooterProps = computed((): Recordable | undefined => { + const { summaryFunc, showSummary, summaryData } = unref(propsRef); + return showSummary && !unref(getIsEmptyData) ? () => h(TableFooter, { summaryFunc, summaryData, scroll: unref(scrollRef) }) : undefined; + }); + + watchEffect(() => { + handleSummary(); + }); + + function handleSummary() { + const { showSummary } = unref(propsRef); + if (!showSummary || unref(getIsEmptyData)) return; + + nextTick(() => { + const tableEl = unref(tableElRef); + if (!tableEl) return; + const bodyDom = tableEl.$el.querySelector('.ant-table-content'); + useEventListener({ + el: bodyDom, + name: 'scroll', + listener: () => { + const footerBodyDom = tableEl.$el.querySelector('.ant-table-footer .ant-table-content') as HTMLDivElement; + if (!footerBodyDom || !bodyDom) return; + footerBodyDom.scrollLeft = bodyDom.scrollLeft; + }, + wait: 0, + options: true, + }); + }); + } + return { getFooterProps }; +} diff --git a/src/components/Table/src/hooks/useTableForm.ts b/src/components/Table/src/hooks/useTableForm.ts new file mode 100644 index 0000000..e8821ff --- /dev/null +++ b/src/components/Table/src/hooks/useTableForm.ts @@ -0,0 +1,51 @@ +import type { ComputedRef, Slots } from 'vue'; +import type { BasicTableProps, FetchParams } from '../types/table'; +import { unref, computed } from 'vue'; +import type { FormProps } from '@/components/Form'; +import { isFunction } from '@/utils/is'; + +export function useTableForm( + propsRef: ComputedRef, + slots: Slots, + fetch: (opt?: FetchParams | undefined) => Promise[] | undefined>, + getLoading: ComputedRef, +) { + const getFormProps = computed((): Partial => { + const { formConfig } = unref(propsRef); + const { submitButtonOptions } = formConfig || {}; + return { + showActionButtonGroup: true, + showAdvancedButton: true, + baseColProps: { span: 6 }, + ...formConfig, + submitButtonOptions: { loading: false, ...submitButtonOptions }, + compact: true, + labelAlign: 'left', + }; + }); + + const getFormSlotKeys: ComputedRef = computed(() => { + const keys = Object.keys(slots); + return keys.map(item => (item.startsWith('form-') ? item : null)).filter(item => !!item) as string[]; + }); + + function replaceFormSlotKey(key: string) { + if (!key) return ''; + return key?.replace?.(/form\-/, '') ?? ''; + } + + function handleSearchInfoChange(info: Recordable) { + const { handleSearchInfoFn } = unref(propsRef); + if (handleSearchInfoFn && isFunction(handleSearchInfoFn)) { + info = handleSearchInfoFn(info) || info; + } + fetch({ searchInfo: info, page: 1 }); + } + + return { + getFormProps, + replaceFormSlotKey, + getFormSlotKeys, + handleSearchInfoChange, + }; +} diff --git a/src/components/Table/src/hooks/useTableHeader.ts b/src/components/Table/src/hooks/useTableHeader.ts new file mode 100644 index 0000000..9210f20 --- /dev/null +++ b/src/components/Table/src/hooks/useTableHeader.ts @@ -0,0 +1,55 @@ +import type { ComputedRef, Slots } from 'vue'; +import type { BasicTableProps, InnerHandlers } from '../types/table'; +import { unref, computed, h } from 'vue'; +import TableHeader from '../components/TableHeader.vue'; +import { isString } from '@/utils/is'; +import { getSlot } from '@/utils/helper/tsxHelper'; + +export function useTableHeader(propsRef: ComputedRef, slots: Slots, handlers: InnerHandlers) { + const getHeaderProps = computed((): Recordable => { + const { title, showTableSetting, titleHelpMessage, tableSetting } = unref(propsRef); + const hideTitle = !slots.tableTitle && !title && !slots.toolbar && !showTableSetting; + if (hideTitle && !isString(title)) { + return {}; + } + + return { + title: hideTitle + ? null + : () => + h( + TableHeader, + { + title, + titleHelpMessage, + showTableSetting, + tableSetting, + onColumnsChange: handlers.onColumnsChange, + } as Recordable, + { + ...(slots.toolbar + ? { + toolbar: () => getSlot(slots, 'toolbar'), + } + : {}), + ...(slots.toolbarAfter + ? { + toolbarAfter: () => getSlot(slots, 'toolbarAfter'), + } + : {}), + ...(slots.tableTitle + ? { + tableTitle: () => getSlot(slots, 'tableTitle'), + } + : {}), + ...(slots.headerTop + ? { + headerTop: () => getSlot(slots, 'headerTop'), + } + : {}), + }, + ), + }; + }); + return { getHeaderProps }; +} diff --git a/src/components/Table/src/hooks/useTableScroll.ts b/src/components/Table/src/hooks/useTableScroll.ts new file mode 100644 index 0000000..495bf6c --- /dev/null +++ b/src/components/Table/src/hooks/useTableScroll.ts @@ -0,0 +1,215 @@ +import type { BasicTableProps, TableRowSelection, BasicColumn } from '../types/table'; +import { Ref, ComputedRef, ref } from 'vue'; +import { computed, unref, nextTick, watch } from 'vue'; +import { getViewportOffset } from '@/utils/domUtils'; +import { isBoolean } from '@/utils/is'; +import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'; +import { useModalContext } from '@/components/Modal'; +import { onMountedOrActivated } from '@/hooks/core/onMountedOrActivated'; +import { useDebounceFn } from '@vueuse/core'; + +export function useTableScroll( + propsRef: ComputedRef, + tableElRef: Ref, + columnsRef: ComputedRef, + rowSelectionRef: ComputedRef, + getDataSourceRef: ComputedRef, + wrapRef: Ref, + formRef: Ref, +) { + const tableHeightRef: Ref> = ref(167); + const modalFn = useModalContext(); + + // Greater than animation time 280 + const debounceRedoHeight = useDebounceFn(redoHeight, 100); + + const getCanResize = computed(() => { + const { canResize, scroll } = unref(propsRef); + return canResize && !(scroll || {}).y; + }); + + watch( + () => [unref(getCanResize), unref(getDataSourceRef)?.length], + () => { + debounceRedoHeight(); + }, + { + flush: 'post', + }, + ); + + function redoHeight() { + nextTick(() => { + calcTableHeight(); + }); + } + + function setHeight(height: number) { + tableHeightRef.value = height; + // Solve the problem of modal adaptive height calculation when the form is placed in the modal + modalFn?.redoModalHeight?.(); + } + + // No need to repeat queries + let paginationEl: HTMLElement | null; + let footerEl: HTMLElement | null; + // 原生合计 + let summaryEl: HTMLElement | null; + let bodyEl: HTMLElement | null; + + async function calcTableHeight() { + const { resizeHeightOffset, pagination, maxHeight, isCanResizeParent, useSearchForm } = unref(propsRef); + const tableData = unref(getDataSourceRef); + + const table = unref(tableElRef); + if (!table) return; + + const tableEl: Element = table.$el; + if (!tableEl) return; + + if (!bodyEl) { + bodyEl = tableEl.querySelector('.ant-table-body'); + if (!bodyEl) return; + } + + const hasScrollBarY = bodyEl.scrollHeight > bodyEl.clientHeight; + const hasScrollBarX = bodyEl.scrollWidth > bodyEl.clientWidth; + + if (hasScrollBarY) { + tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.remove('hide-scrollbar-y'); + } else { + !tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.add('hide-scrollbar-y'); + } + + if (hasScrollBarX) { + tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.remove('hide-scrollbar-x'); + } else { + !tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.add('hide-scrollbar-x'); + } + + bodyEl!.style.height = 'unset'; + + if (!unref(getCanResize) || !unref(tableData)) return; + + await nextTick(); + // Add a delay to get the correct bottomIncludeBody paginationHeight footerHeight headerHeight + + // const headEl = tableEl.querySelector('.ant-table-thead'); + const headEl = tableEl.querySelector('.ant-table-header'); + + if (!headEl) return; + + // Table height from bottom height-custom offset + let paddingHeight = 10; + // Pager height + let paginationHeight = 0; + if (!isBoolean(pagination)) { + paginationEl = tableEl.querySelector('.ant-pagination') as HTMLElement; + if (paginationEl) { + const offsetHeight = paginationEl.offsetHeight; + paginationHeight += (offsetHeight || 0) + 10; + } else { + // TODO First fix 34 + paginationHeight += 34; + } + } else { + paginationHeight = 0; + } + + let footerHeight = 0; + if (!isBoolean(pagination)) { + if (!footerEl) { + footerEl = tableEl.querySelector('.ant-table-footer') as HTMLElement; + } else { + const offsetHeight = footerEl.offsetHeight; + footerHeight += offsetHeight || 0; + } + } + if (!summaryEl) { + summaryEl = tableEl.querySelector('.ant-table-summary') as HTMLElement; + } + footerHeight += summaryEl?.offsetHeight || 0; + + let headerHeight = 0; + if (headEl) { + headerHeight = (headEl as HTMLElement).offsetHeight; + } + + let bottomIncludeBody = 0; + if (unref(wrapRef) && isCanResizeParent) { + const tablePadding = 0; + const formMargin = 0; + let paginationMargin = 10; + const wrapHeight = unref(wrapRef)?.offsetHeight ?? 0; + + let formHeight = unref(formRef)?.$el.offsetHeight ?? 0; + if (formHeight) { + formHeight += formMargin; + } + if (isBoolean(pagination) && !pagination) { + paginationMargin = 0; + } + if (isBoolean(useSearchForm) && !useSearchForm) { + paddingHeight = 0; + } + + const headerCellHeight = (tableEl.querySelector('.ant-table-title') as HTMLElement)?.offsetHeight ?? 0; + + bottomIncludeBody = wrapHeight - formHeight - headerCellHeight - tablePadding - paginationMargin; + } else { + // Table height from bottom + bottomIncludeBody = getViewportOffset(headEl).bottomIncludeBody; + } + + let height = bottomIncludeBody - (resizeHeightOffset || 0) - paddingHeight - paginationHeight - footerHeight - headerHeight; + height = (height > maxHeight! ? (maxHeight as number) : height) ?? height; + setHeight(height); + + bodyEl!.style.height = `${height}px`; + } + useWindowSizeFn(calcTableHeight, 280); + onMountedOrActivated(() => { + calcTableHeight(); + nextTick(() => { + debounceRedoHeight(); + }); + }); + + const getScrollX = computed(() => { + let width = 0; + if (unref(rowSelectionRef)) { + width += 60; + } + + // TODO props ?? 0; + const NORMAL_WIDTH = 150; + + const columns = unref(columnsRef).filter(item => !item.defaultHidden); + columns.forEach(item => { + width += Number.parseFloat(item.width as string) || 0; + }); + const unsetWidthColumns = columns.filter(item => !Reflect.has(item, 'width')); + + const len = unsetWidthColumns.length; + if (len !== 0) { + width += len * NORMAL_WIDTH; + } + + const table = unref(tableElRef); + const tableWidth = table?.$el?.offsetWidth ?? 0; + return tableWidth > width ? '100%' : width; + }); + + const getScrollRef = computed(() => { + const tableHeight = unref(tableHeightRef); + const { canResize, scroll } = unref(propsRef); + return { + x: unref(getScrollX), + y: canResize ? tableHeight : null, + scrollToFirstRowOnChange: false, + ...scroll, + }; + }); + + return { getScrollRef, redoHeight }; +} diff --git a/src/components/Table/src/hooks/useTableStyle.ts b/src/components/Table/src/hooks/useTableStyle.ts new file mode 100644 index 0000000..f11ff97 --- /dev/null +++ b/src/components/Table/src/hooks/useTableStyle.ts @@ -0,0 +1,20 @@ +import type { ComputedRef } from 'vue'; +import type { BasicTableProps, TableCustomRecord } from '../types/table'; +import { unref } from 'vue'; +import { isFunction } from '@/utils/is'; + +export function useTableStyle(propsRef: ComputedRef, prefixCls: string) { + function getRowClassName(record: TableCustomRecord, index: number) { + const { striped, rowClassName } = unref(propsRef); + const classNames: string[] = []; + if (striped) { + classNames.push((index || 0) % 2 === 1 ? `${prefixCls}-row__striped` : ''); + } + if (rowClassName && isFunction(rowClassName)) { + classNames.push(rowClassName(record, index)); + } + return classNames.filter(cls => !!cls).join(' '); + } + + return { getRowClassName }; +} diff --git a/src/components/Table/src/props.ts b/src/components/Table/src/props.ts new file mode 100644 index 0000000..37891d6 --- /dev/null +++ b/src/components/Table/src/props.ts @@ -0,0 +1,151 @@ +import type { PropType } from 'vue'; +import type { PaginationProps } from './types/pagination'; +import type { BasicColumn, FetchSetting, TableSetting, SorterResult, TableCustomRecord, TableRowSelection, SizeType } from './types/table'; +import type { FormProps } from '@/components/Form'; + +import { DEFAULT_FILTER_FN, DEFAULT_SORT_FN, FETCH_SETTING, DEFAULT_SIZE } from './const'; +import { propTypes } from '@/utils/propTypes'; + +export const basicProps = { + clickToRowSelect: { type: Boolean, default: true }, + isTreeTable: Boolean, + defaultExpandAllRows: { type: Boolean, default: true }, + tableSetting: propTypes.shape({ + expand: propTypes.bool, + }), + inset: Boolean, + sortFn: { + type: Function as PropType<(sortInfo: SorterResult) => any>, + default: DEFAULT_SORT_FN, + }, + filterFn: { + type: Function as PropType<(data: Partial>) => any>, + default: DEFAULT_FILTER_FN, + }, + showTableSetting: { type: Boolean, default: true }, + autoCreateKey: { type: Boolean, default: true }, + striped: { type: Boolean, default: false }, + showSummary: Boolean, + summaryFunc: { + type: [Function, Array] as PropType<(...arg: any[]) => any[]>, + default: null, + }, + summaryData: { + type: Array as PropType, + default: null, + }, + indentSize: propTypes.number.def(24), + canColDrag: { type: Boolean, default: true }, + api: { + type: Function as PropType<(...arg: any[]) => Promise>, + default: null, + }, + beforeFetch: { + type: Function as PropType, + default: null, + }, + afterFetch: { + type: Function as PropType, + default: null, + }, + handleSearchInfoFn: { + type: Function as PropType, + default: null, + }, + fetchSetting: { + type: Object as PropType, + default: () => { + return FETCH_SETTING; + }, + }, + // 立即请求接口 + immediate: { type: Boolean, default: true }, + emptyDataIsShowTable: { type: Boolean, default: true }, + // 额外的请求参数 + searchInfo: { + type: Object as PropType, + default: null, + }, + // 默认的排序参数 + defSort: { + type: Object as PropType, + default: null, + }, + // 使用搜索表单 + useSearchForm: propTypes.bool, + // 表单配置 + formConfig: { + type: Object as PropType>, + default: null, + }, + columns: { + type: Array as PropType, + default: () => [], + }, + showIndexColumn: { type: Boolean, default: true }, + indexColumnProps: { + type: Object as PropType, + default: null, + }, + actionColumn: { + type: Object as PropType, + default: null, + }, + ellipsis: { type: Boolean, default: true }, + isCanResizeParent: { type: Boolean, default: false }, + canResize: { type: Boolean, default: true }, + clearSelectOnPageChange: propTypes.bool, + resizeHeightOffset: propTypes.number.def(0), + rowSelection: { + type: Object as PropType, + default: null, + }, + title: { + type: [String, Function] as PropType string)>, + default: null, + }, + titleHelpMessage: { + type: [String, Array] as PropType, + }, + minHeight: propTypes.number, + maxHeight: propTypes.number, + expandColumnWidth: propTypes.number.def(48), + // 统一设置列最大宽度 + maxColumnWidth: propTypes.number, + dataSource: { + type: Array as PropType, + default: null, + }, + rowKey: { + type: [String, Function] as PropType string)>, + default: '', + }, + bordered: propTypes.bool, + pagination: { + type: [Object, Boolean] as PropType, + default: null, + }, + loading: propTypes.bool, + rowClassName: { + type: Function as PropType<(record: TableCustomRecord, index: number) => string>, + }, + customRow: { + type: Function as PropType<(record: TableCustomRecord, index: number) => object>, + default: null, + }, + scroll: { + type: Object as PropType<{ x: number | string | true; y: number | string }>, + default: null, + }, + beforeEditSubmit: { + type: Function as PropType<(data: { record: Recordable; index: number; key: string | number; value: any }) => Promise>, + }, + size: { + type: String as PropType, + default: DEFAULT_SIZE, + }, + expandedRowKeys: { + type: Array, + default: null, + }, +}; diff --git a/src/components/Table/src/types/column.ts b/src/components/Table/src/types/column.ts new file mode 100644 index 0000000..efaf5ca --- /dev/null +++ b/src/components/Table/src/types/column.ts @@ -0,0 +1,201 @@ +import { VNodeChild } from 'vue'; + +export interface ColumnFilterItem { + text?: string; + value?: string; + children?: any; +} + +export declare type SortOrder = 'ascend' | 'descend'; + +export interface RecordProps { + text: any; + record: T; + index: number; +} + +export interface FilterDropdownProps { + prefixCls?: string; + setSelectedKeys?: (selectedKeys: string[]) => void; + selectedKeys?: string[]; + confirm?: () => void; + clearFilters?: () => void; + filters?: ColumnFilterItem[]; + getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement; + visible?: boolean; +} + +export declare type CustomRenderFunction = (record: RecordProps) => VNodeChild | JSX.Element; + +export interface ColumnProps { + /** + * specify how content is aligned + * @default 'left' + * @type string + */ + align?: 'left' | 'right' | 'center'; + + /** + * ellipsize cell content, not working with sorter and filters for now. + * tableLayout would be fixed when ellipsis is true. + * @default false + * @type boolean + */ + ellipsis?: boolean; + + /** + * Span of this column's title + * @type number + */ + colSpan?: number; + + /** + * Display field of the data record, could be set like a.b.c + * @type string + */ + dataIndex?: string; + + /** + * Default filtered values + * @type string[] + */ + defaultFilteredValue?: string[]; + + /** + * Default order of sorted values: 'ascend' 'descend' null + * @type string + */ + defaultSortOrder?: SortOrder; + + /** + * Customized filter overlay + * @type any (slot) + */ + filterDropdown?: VNodeChild | JSX.Element | ((props: FilterDropdownProps) => VNodeChild | JSX.Element); + + /** + * Whether filterDropdown is visible + * @type boolean + */ + filterDropdownOpen?: boolean; + + /** + * Whether the dataSource is filtered + * @default false + * @type boolean + */ + filtered?: boolean; + + /** + * Controlled filtered value, filter icon will highlight + * @type string[] + */ + filteredValue?: string[]; + + /** + * Customized filter icon + * @default false + * @type any + */ + filterIcon?: boolean | VNodeChild | JSX.Element; + + /** + * Whether multiple filters can be selected + * @default true + * @type boolean + */ + filterMultiple?: boolean; + + /** + * Filter menu config + * @type object[] + */ + filters?: ColumnFilterItem[]; + + /** + * Set column to be fixed: true(same as left) 'left' 'right' + * @default false + * @type boolean | string + */ + fixed?: boolean | 'left' | 'right'; + + /** + * Unique key of this column, you can ignore this prop if you've set a unique dataIndex + * @type string + */ + key?: string; + + /** + * Renderer of the table cell. The return value should be a VNode, or an object for colSpan/rowSpan config + * @type Function | ScopedSlot + */ + customRender?: CustomRenderFunction | VNodeChild | JSX.Element; + + /** + * Sort function for local sort, see Array.sort's compareFunction. If you need sort buttons only, set to true + * @type boolean | Function + */ + sorter?: boolean | Function; + + /** + * Order of sorted values: 'ascend' 'descend' false + * @type boolean | string + */ + sortOrder?: boolean | SortOrder; + + /** + * supported sort way, could be 'ascend', 'descend' + * @default ['ascend', 'descend'] + * @type string[] + */ + sortDirections?: SortOrder[]; + + /** + * Title of this column + * @type any (string | slot) + */ + title?: VNodeChild | JSX.Element; + + /** + * Width of this column + * 是否可拖动调整宽度,此时 width 必须是 number 类型 + */ + resizable?: boolean; + + /** + * Width of this column + * @type string | number + */ + width?: string | number; + + /** + * Set props on per cell + * @type Function + */ + customCell?: (record: T, rowIndex: number) => object; + + /** + * Set props on per header cell + * @type object + */ + customHeaderCell?: (column: ColumnProps) => object; + + /** + * Callback executed when the confirm filter button is clicked, Use as a filter event when using template or jsx + * @type Function + */ + onFilter?: (value: any, record: T) => boolean; + + /** + * Callback executed when filterDropdownOpen is changed, Use as a filterDropdownOpen event when using template or jsx + * @type Function + */ + onFilterDropdownOpenChange?: (visible: boolean) => void; + + /** + * When using columns, you can setting this property to configure the properties that support the slot, + * such as slots: { filterIcon: 'XXX'} + * @type object + */ + slots?: Recordable; +} diff --git a/src/components/Table/src/types/componentType.ts b/src/components/Table/src/types/componentType.ts new file mode 100644 index 0000000..74dea43 --- /dev/null +++ b/src/components/Table/src/types/componentType.ts @@ -0,0 +1 @@ +export type ComponentType = 'Input' | 'InputNumber' | 'Select' | 'TreeSelect' | 'AutoComplete' | 'Checkbox' | 'Switch' | 'DatePicker' | 'TimePicker'; diff --git a/src/components/Table/src/types/pagination.ts b/src/components/Table/src/types/pagination.ts new file mode 100644 index 0000000..0c59422 --- /dev/null +++ b/src/components/Table/src/types/pagination.ts @@ -0,0 +1,115 @@ +import Pagination from 'ant-design-vue/lib/pagination'; +import { VNodeChild } from 'vue'; + +interface PaginationRenderProps { + page: number; + type: 'page' | 'prev' | 'next'; + originalElement: any; +} + +type PaginationPosition = + | 'topLeft' + | 'topCenter' + | 'topRight' + | 'bottomLeft' + | 'bottomCenter' + | 'bottomRight'; + +export declare class PaginationConfig extends Pagination { + position?: PaginationPosition[]; +} + +export interface PaginationProps { + /** + * total number of data items + * @default 0 + * @type number + */ + total?: number; + + /** + * default initial page number + * @default 1 + * @type number + */ + defaultCurrent?: number; + + /** + * current page number + * @type number + */ + current?: number; + + /** + * default number of data items per page + * @default 10 + * @type number + */ + defaultPageSize?: number; + + /** + * number of data items per page + * @type number + */ + pageSize?: number; + + /** + * Whether to hide pager on single page + * @default false + * @type boolean + */ + hideOnSinglePage?: boolean; + + /** + * determine whether pageSize can be changed + * @default false + * @type boolean + */ + showSizeChanger?: boolean; + + /** + * specify the sizeChanger options + * @default ['10', '20', '30', '40'] + * @type string[] + */ + pageSizeOptions?: string[]; + + /** + * determine whether you can jump to pages directly + * @default false + * @type boolean + */ + showQuickJumper?: boolean | object; + + /** + * to display the total number and range + * @type Function + */ + showTotal?: (total: number, range: [number, number]) => any; + + /** + * specify the size of Pagination, can be set to small + * @default '' + * @type string + */ + size?: string; + + /** + * whether to setting simple mode + * @type boolean + */ + simple?: boolean; + + /** + * to customize item innerHTML + * @type Function + */ + itemRender?: (props: PaginationRenderProps) => VNodeChild | JSX.Element; + + /** + * specify the position of Pagination + * @default ['bottomRight'] + * @type string[] + */ + position?: PaginationPosition[]; +} diff --git a/src/components/Table/src/types/table.ts b/src/components/Table/src/types/table.ts new file mode 100644 index 0000000..f8116db --- /dev/null +++ b/src/components/Table/src/types/table.ts @@ -0,0 +1,470 @@ +import type { VNodeChild } from 'vue'; +import type { PaginationProps } from './pagination'; +import type { FormProps } from '@/components/Form'; +import type { TableRowSelection as ITableRowSelection } from 'ant-design-vue/lib/table/interface'; +import type { ColumnProps } from 'ant-design-vue/lib/table'; + +import { ComponentType } from './componentType'; +import { VueNode } from '@/utils/propTypes'; + +export declare type SortOrder = 'ascend' | 'descend'; + +export interface TableCurrentDataSource { + currentDataSource: T[]; +} + +export interface TableRowSelection extends ITableRowSelection { + /** + * Callback executed when selected rows change + * @type Function + */ + onChange?: (selectedRowKeys: string[] | number[], selectedRows: T[]) => any; + + /** + * Callback executed when select/deselect one row + * @type Function + */ + onSelect?: (record: T, selected: boolean, selectedRows: Object[], nativeEvent: Event) => any; + + /** + * Callback executed when select/deselect all rows + * @type Function + */ + onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => any; + + /** + * Callback executed when row selection is inverted + * @type Function + */ + onSelectInvert?: (selectedRows: string[] | number[]) => any; +} + +export interface TableCustomRecord { + record?: T; + index?: number; +} + +export interface ExpandedRowRenderRecord extends TableCustomRecord { + indent?: number; + expanded?: boolean; +} +export interface ColumnFilterItem { + text?: string; + value?: string; + children?: any; +} + +export interface TableCustomRecord { + record?: T; + index?: number; +} + +export interface SorterResult { + column: ColumnProps; + order: SortOrder; + field: string; + columnKey: string; +} + +export interface FetchParams { + searchInfo?: Recordable; + page?: number; + sortInfo?: Recordable; + filterInfo?: Recordable; +} + +export interface GetColumnsParams { + ignoreIndex?: boolean; + ignoreAction?: boolean; + sort?: boolean; +} + +export type SizeType = 'default' | 'middle' | 'small' | 'large'; + +export interface TableActionType { + reload: (opt?: FetchParams) => Promise[] | undefined>; + setSelectedRows: (rows: Recordable[]) => void; + getSelectRows: () => T[]; + clearSelectedRowKeys: () => void; + expandAll: () => void; + expandRows: (keys: string[] | number[]) => void; + collapseAll: () => void; + getIsExpanded: () => boolean; + scrollTo: (pos: string) => void; // pos: id | "top" | "bottom" + getSelectRowKeys: () => string[]; + deleteSelectRowByKey: (key: string) => void; + setPagination: (info: Partial) => void; + setTableData: (values: T[]) => void; + updateTableDataRecord: (rowKey: string | number, record: Recordable) => Recordable | void; + deleteTableDataRecord: (rowKey: string | number | string[] | number[]) => void; + insertTableDataRecord: (record: Recordable | Recordable[], index?: number) => Recordable[] | void; + findTableDataRecord: (rowKey: string | number) => Recordable | void; + getColumns: (opt?: GetColumnsParams) => BasicColumn[]; + setColumns: (columns: BasicColumn[] | string[]) => void; + getDataSource: () => T[]; + getRawDataSource: () => T; + getFetchParams: () => T; + setLoading: (loading: boolean) => void; + setProps: (props: Partial) => void; + redoHeight: () => void; + setSelectedRowKeys: (rowKeys: string[] | number[]) => void; + getPaginationRef: () => PaginationProps | boolean; + getSize: () => SizeType; + getRowSelection: () => TableRowSelection; + getCacheColumns: () => BasicColumn[]; + emit?: EmitType; + updateTableData: (index: number, key: string, value: any) => Recordable; + setShowPagination: (show: boolean) => Promise; + getShowPagination: () => boolean; + setCacheColumnsByField?: (dataIndex: string | undefined, value: BasicColumn) => void; + setCacheColumns?: (columns: BasicColumn[]) => void; +} + +export interface FetchSetting { + // 请求接口当前页数 + pageField: string; + // 每页显示多少条 + sizeField: string; + // 请求结果列表字段 支持 a.b.c + listField: string; + // 请求结果总数字段 支持 a.b.c + totalField: string; +} + +export interface TableSetting { + expand?: boolean; + redo?: boolean; + size?: boolean; + setting?: boolean; + // 缓存“字段调整”配置的key,用于页面上有多个表格需要区分的情况 + cacheKey?: string; + fullScreen?: boolean; +} + +export interface BasicTableProps { + // 点击行选中 + clickToRowSelect?: boolean; + isTreeTable?: boolean; + // 自定义排序方法 + sortFn?: (sortInfo: SorterResult) => any; + // 排序方法 + filterFn?: (data: Partial>) => any; + // 取消表格的默认padding + inset?: boolean; + // 显示表格设置 + showTableSetting?: boolean; + // 表格上方操作按钮设置 + tableSetting?: TableSetting; + // 斑马纹 + striped?: boolean; + // 是否自动生成key + autoCreateKey?: boolean; + // 计算合计行的方法 + summaryFunc?: (...arg: any) => Recordable[]; + // 自定义合计表格内容 + summaryData?: Recordable[]; + // 是否显示合计行 + showSummary?: boolean; + // 是否可拖拽列 + canColDrag?: boolean; + // 接口请求对象 + api?: (...arg: any) => Promise; + // 请求之前处理参数 + beforeFetch?: Fn; + // 自定义处理接口返回参数 + afterFetch?: Fn; + // 查询条件请求之前处理 + handleSearchInfoFn?: Fn; + // 请求接口配置 + fetchSetting?: Partial; + // 立即请求接口 + immediate?: boolean; + // 在开起搜索表单的时候,如果没有数据是否显示表格 + emptyDataIsShowTable?: boolean; + // 额外的请求参数 + searchInfo?: Recordable; + // 默认的排序参数 + defSort?: Recordable; + // 使用搜索表单 + useSearchForm?: boolean; + // 表单配置 + formConfig?: Partial; + // 列配置 + columns: BasicColumn[]; + // 是否显示序号列 + showIndexColumn?: boolean; + // 序号列配置 + indexColumnProps?: BasicColumn; + // 操作列配置 + actionColumn?: BasicColumn; + // 文本超过宽度是否显示。。。 + ellipsis?: boolean; + // 是否继承父级高度(父级高度-表单高度-padding高度) + isCanResizeParent?: boolean; + // 是否可以自适应高度 + canResize?: boolean; + // 自适应高度偏移, 计算结果-偏移量 + resizeHeightOffset?: number; + + // 在分页改变的时候清空选项 + clearSelectOnPageChange?: boolean; + // + rowKey?: string | ((record: Recordable) => string); + // 数据 + dataSource?: Recordable[]; + // 标题右侧提示 + titleHelpMessage?: string | string[]; + // 表格最小高度 + minHeight?: number; + // 表格滚动最大高度 + maxHeight?: number; + // 是否显示边框 + bordered?: boolean; + // 展开列宽度 + expandColumnWidth: number; + // 分页配置 + pagination?: PaginationProps | boolean; + // loading加载 + loading?: boolean; + + /** + * The column contains children to display + * @default 'children' + * @type string | string[] + */ + childrenColumnName?: string; + + /** + * Override default table elements + * @type object + */ + components?: object; + + /** + * Expand all rows initially + * @default false + * @type boolean + */ + defaultExpandAllRows?: boolean; + + /** + * Initial expanded row keys + * @type string[] + */ + defaultExpandedRowKeys?: string[]; + + /** + * Current expanded row keys + * @type string[] + */ + expandedRowKeys?: string[]; + + /** + * Expanded container render for each row + * @type Function + */ + expandedRowRender?: (record?: ExpandedRowRenderRecord) => VNodeChild | JSX.Element; + + /** + * Customize row expand Icon. + * @type Function | VNodeChild + */ + expandIcon?: Function | VNodeChild | JSX.Element; + + /** + * Whether to expand row by clicking anywhere in the whole row + * @default false + * @type boolean + */ + expandRowByClick?: boolean; + + /** + * The index of `expandIcon` which column will be inserted when `expandIconAsCell` is false. default 0 + */ + expandIconColumnIndex?: number; + + /** + * Table footer renderer + * @type Function | VNodeChild + */ + footer?: Function | VNodeChild | JSX.Element; + + /** + * Indent size in pixels of tree data + * @default 15 + * @type number + */ + indentSize?: number; + + /** + * i18n text including filter, sort, empty text, etc + * @default { filterConfirm: 'Ok', filterReset: 'Reset', emptyText: 'No Data' } + * @type object + */ + locale?: object; + + /** + * Row's className + * @type Function + */ + rowClassName?: (record: TableCustomRecord, index: number) => string; + + /** + * Row selection config + * @type object + */ + rowSelection?: TableRowSelection; + + /** + * Set horizontal or vertical scrolling, can also be used to specify the width and height of the scroll area. + * It is recommended to set a number for x, if you want to set it to true, + * you need to add style .ant-table td { white-space: nowrap; }. + * @type object + */ + scroll?: { x?: number | string | true; y?: number | string }; + + /** + * Whether to show table header + * @default true + * @type boolean + */ + showHeader?: boolean; + + /** + * Size of table + * @default 'default' + * @type string + */ + size?: SizeType; + + /** + * Table title renderer + * @type Function | ScopedSlot + */ + title?: VNodeChild | JSX.Element | string | ((data: Recordable) => string); + + /** + * Set props on per header row + * @type Function + */ + customHeaderRow?: (column: ColumnProps, index: number) => object; + + /** + * Set props on per row + * @type Function + */ + customRow?: (record: T, index: number) => object; + + /** + * `table-layout` attribute of table element + * `fixed` when header/columns are fixed, or using `column.ellipsis` + * + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout + * @version 1.5.0 + */ + tableLayout?: 'auto' | 'fixed' | string; + + /** + * the render container of dropdowns in table + * @param triggerNode + * @version 1.5.0 + */ + getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement; + + /** + * Data can be changed again before rendering. + * The default configuration of general user empty data. + * You can configured globally through [ConfigProvider](https://antdv.com/components/config-provider-cn/) + * + * @version 1.5.4 + */ + transformCellText?: Function; + + /** + * Callback executed before editable cell submit value, not for row-editor + * + * The cell will not submit data while callback return false + */ + beforeEditSubmit?: (data: { record: Recordable; index: number; key: string | number; value: any }) => Promise; + + /** + * Callback executed when pagination, filters or sorter is changed + * @param pagination + * @param filters + * @param sorter + * @param currentDataSource + */ + onChange?: (pagination: any, filters: any, sorter: any, extra: any) => void; + + /** + * Callback executed when the row expand icon is clicked + * + * @param expanded + * @param record + */ + onExpand?: (expande: boolean, record: T) => void; + + /** + * Callback executed when the expanded rows change + * @param expandedRows + */ + onExpandedRowsChange?: (expandedRows: string[] | number[]) => void; + + onColumnsChange?: (data: ColumnChangeParam[]) => void; +} + +export type CellFormat = string | ((text: string, record: Recordable, index: number) => string | number) | Map; + +// @ts-ignore +export interface BasicColumn extends ColumnProps { + children?: BasicColumn[]; + filters?: { + text: string; + value: string; + children?: unknown[] | (((props: Record) => unknown[]) & (() => unknown[]) & (() => unknown[])); + }[]; + + // + flag?: 'INDEX' | 'DEFAULT' | 'CHECKBOX' | 'RADIO' | 'ACTION'; + customTitle?: VueNode; + + slots?: Recordable; + + // Whether to hide the column by default, it can be displayed in the column configuration + defaultHidden?: boolean; + + // Help text for table column header + helpMessage?: string | string[]; + + format?: CellFormat; + + // Editable + edit?: boolean; + editRow?: boolean; + editable?: boolean; + editComponent?: ComponentType; + editComponentProps?: + | ((opt: { text: string | number | boolean | Recordable; record: Recordable; column: BasicColumn; index: number }) => Recordable) + | Recordable; + editRule?: boolean | ((text: string, record: Recordable) => Promise); + editValueMap?: (value: any) => string; + onEditRow?: () => void; + // 权限编码控制是否显示 + auth?: string; + // 业务控制是否显示 + ifShow?: boolean | ((column: BasicColumn) => boolean); + // 自定义修改后显示的内容 + editRender?: (opt: { text: string | number | boolean | Recordable; record: Recordable; column: BasicColumn; index: number }) => VNodeChild | JSX.Element; + // 动态 Disabled + editDynamicDisabled?: boolean | ((record: Recordable) => boolean); +} + +export type ColumnChangeParam = { + dataIndex: string; + fixed: boolean | 'left' | 'right' | undefined; + visible: boolean; +}; + +export interface InnerHandlers { + onColumnsChange: (data: ColumnChangeParam[]) => void; +} diff --git a/src/components/Table/src/types/tableAction.ts b/src/components/Table/src/types/tableAction.ts new file mode 100644 index 0000000..0af3f4b --- /dev/null +++ b/src/components/Table/src/types/tableAction.ts @@ -0,0 +1,48 @@ +import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; +import { TooltipProps } from 'ant-design-vue/es/tooltip/Tooltip'; +export interface ActionItem extends ButtonProps { + onClick?: Fn; + label?: string; + color?: 'success' | 'error' | 'warning'; + icon?: string; + popConfirm?: PopConfirm; + modelConfirm?: modelConfirm; + disabled?: boolean; + divider?: boolean; + // 权限编码控制是否显示 + auth?: string; + // 业务控制是否显示 + ifShow?: boolean | ((action: ActionItem) => boolean); + tooltip?: string | TooltipProps; +} + +export interface PopConfirm { + title: string; + okText?: string; + cancelText?: string; + confirm: Fn; + cancel?: Fn; + icon?: string; + placement?: + | 'top' + | 'left' + | 'right' + | 'bottom' + | 'topLeft' + | 'topRight' + | 'leftTop' + | 'leftBottom' + | 'rightTop' + | 'rightBottom' + | 'bottomLeft' + | 'bottomRight'; +} +export interface modelConfirm { + title?: string; + content?: string; + okText?: string; + okType?: string; + cancelText?: string; + onOk?: Fn; + onCancel?: Fn; +} diff --git a/src/components/Time/index.ts b/src/components/Time/index.ts new file mode 100644 index 0000000..c2aae2d --- /dev/null +++ b/src/components/Time/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils/index'; +import time from './src/Time.vue'; + +export const Time = withInstall(time); diff --git a/src/components/Time/src/Time.vue b/src/components/Time/src/Time.vue new file mode 100644 index 0000000..4dd4572 --- /dev/null +++ b/src/components/Time/src/Time.vue @@ -0,0 +1,107 @@ + + diff --git a/src/components/Tinymce/index.ts b/src/components/Tinymce/index.ts new file mode 100644 index 0000000..c42a9a9 --- /dev/null +++ b/src/components/Tinymce/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils/index'; +import tinymce from './src/Editor.vue'; + +export const Tinymce = withInstall(tinymce); diff --git a/src/components/Tinymce/src/Editor.vue b/src/components/Tinymce/src/Editor.vue new file mode 100644 index 0000000..6ea0bc2 --- /dev/null +++ b/src/components/Tinymce/src/Editor.vue @@ -0,0 +1,370 @@ + + + + + + + diff --git a/src/components/Tinymce/src/ImgUpload.vue b/src/components/Tinymce/src/ImgUpload.vue new file mode 100644 index 0000000..28a7de0 --- /dev/null +++ b/src/components/Tinymce/src/ImgUpload.vue @@ -0,0 +1,119 @@ + + + diff --git a/src/components/Tinymce/src/helper.ts b/src/components/Tinymce/src/helper.ts new file mode 100644 index 0000000..2526ae7 --- /dev/null +++ b/src/components/Tinymce/src/helper.ts @@ -0,0 +1,81 @@ +const validEvents = [ + 'onActivate', + 'onAddUndo', + 'onBeforeAddUndo', + 'onBeforeExecCommand', + 'onBeforeGetContent', + 'onBeforeRenderUI', + 'onBeforeSetContent', + 'onBeforePaste', + 'onBlur', + 'onChange', + 'onClearUndos', + 'onClick', + 'onContextMenu', + 'onCopy', + 'onCut', + 'onDblclick', + 'onDeactivate', + 'onDirty', + 'onDrag', + 'onDragDrop', + 'onDragEnd', + 'onDragGesture', + 'onDragOver', + 'onDrop', + 'onExecCommand', + 'onFocus', + 'onFocusIn', + 'onFocusOut', + 'onGetContent', + 'onHide', + 'onInit', + 'onKeyDown', + 'onKeyPress', + 'onKeyUp', + 'onLoadContent', + 'onMouseDown', + 'onMouseEnter', + 'onMouseLeave', + 'onMouseMove', + 'onMouseOut', + 'onMouseOver', + 'onMouseUp', + 'onNodeChange', + 'onObjectResizeStart', + 'onObjectResized', + 'onObjectSelected', + 'onPaste', + 'onPostProcess', + 'onPostRender', + 'onPreProcess', + 'onProgressState', + 'onRedo', + 'onRemove', + 'onReset', + 'onSaveContent', + 'onSelectionChange', + 'onSetAttrib', + 'onSetContent', + 'onShow', + 'onSubmit', + 'onUndo', + 'onVisualAid', +]; + +const isValidKey = (key: string) => validEvents.indexOf(key) !== -1; + +export const bindHandlers = (initEvent: Event, listeners: any, editor: any): void => { + Object.keys(listeners) + .filter(isValidKey) + .forEach((key: string) => { + const handler = listeners[key]; + if (typeof handler === 'function') { + if (key === 'onInit') { + handler(initEvent, editor); + } else { + editor.on(key.substring(2), (e: any) => handler(e, editor)); + } + } + }); +}; diff --git a/src/components/Tinymce/src/tinymce.ts b/src/components/Tinymce/src/tinymce.ts new file mode 100644 index 0000000..c56112f --- /dev/null +++ b/src/components/Tinymce/src/tinymce.ts @@ -0,0 +1,13 @@ +// Any plugins you want to setting has to be imported +// Detail plugins list see https://www.tinymce.com/docs/plugins/ +// Custom builds see https://www.tinymce.com/download/custom-builds/ +// colorpicker/contextmenu/textcolor plugin is now built in to the core editor, please remove it from your editor configuration + +export const plugins = [ + 'advlist anchor autolink autosave code codesample directionality fullscreen hr insertdatetime link lists media table nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus template textpattern visualblocks visualchars wordcount', +]; + +export const toolbar = [ + 'fontsizeselect lineheight searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', + 'hr bullist numlist table link preview anchor pagebreak insertdatetime media forecolor backcolor fullscreen', +]; diff --git a/src/components/Transition/index.ts b/src/components/Transition/index.ts new file mode 100644 index 0000000..7eb79b5 --- /dev/null +++ b/src/components/Transition/index.ts @@ -0,0 +1,27 @@ +import { createSimpleTransition, createJavascriptTransition } from './src/CreateTransition'; + +import ExpandTransitionGenerator from './src/ExpandTransition'; + +export { default as CollapseTransition } from './src/CollapseTransition.vue'; + +export const FadeTransition = createSimpleTransition('fade-transition'); +export const ScaleTransition = createSimpleTransition('scale-transition'); +export const SlideYTransition = createSimpleTransition('slide-y-transition'); +export const ScrollYTransition = createSimpleTransition('scroll-y-transition'); +export const SlideYReverseTransition = createSimpleTransition('slide-y-reverse-transition'); +export const ScrollYReverseTransition = createSimpleTransition('scroll-y-reverse-transition'); +export const SlideXTransition = createSimpleTransition('slide-x-transition'); +export const ScrollXTransition = createSimpleTransition('scroll-x-transition'); +export const SlideXReverseTransition = createSimpleTransition('slide-x-reverse-transition'); +export const ScrollXReverseTransition = createSimpleTransition('scroll-x-reverse-transition'); +export const ScaleRotateTransition = createSimpleTransition('scale-rotate-transition'); + +export const ExpandXTransition = createJavascriptTransition( + 'expand-x-transition', + ExpandTransitionGenerator('', true), +); + +export const ExpandTransition = createJavascriptTransition( + 'expand-transition', + ExpandTransitionGenerator(''), +); diff --git a/src/components/Transition/src/CollapseTransition.vue b/src/components/Transition/src/CollapseTransition.vue new file mode 100644 index 0000000..719ff03 --- /dev/null +++ b/src/components/Transition/src/CollapseTransition.vue @@ -0,0 +1,78 @@ + + diff --git a/src/components/Transition/src/CreateTransition.tsx b/src/components/Transition/src/CreateTransition.tsx new file mode 100644 index 0000000..b187d39 --- /dev/null +++ b/src/components/Transition/src/CreateTransition.tsx @@ -0,0 +1,68 @@ +import type { PropType } from 'vue'; + +import { defineComponent, Transition, TransitionGroup } from 'vue'; +import { getSlot } from '@/utils/helper/tsxHelper'; + +type Mode = 'in-out' | 'out-in' | 'default' | undefined; + +export function createSimpleTransition(name: string, origin = 'top center 0', mode?: Mode) { + return defineComponent({ + name, + props: { + group: { + type: Boolean as PropType, + default: false, + }, + mode: { + type: String as PropType, + default: mode, + }, + origin: { + type: String as PropType, + default: origin, + }, + }, + setup(props, { slots, attrs }) { + const onBeforeEnter = (el: HTMLElement) => { + el.style.transformOrigin = props.origin; + }; + + return () => { + const Tag = !props.group ? Transition : TransitionGroup; + return ( + + {() => getSlot(slots)} + + ); + }; + }, + }); +} +export function createJavascriptTransition(name: string, functions: Recordable, mode: Mode = 'in-out') { + return defineComponent({ + name, + props: { + mode: { + type: String as PropType, + default: mode, + }, + }, + setup(props, { attrs, slots }) { + return () => { + return ( + + {() => getSlot(slots)} + + ); + }; + }, + }); +} diff --git a/src/components/Transition/src/ExpandTransition.ts b/src/components/Transition/src/ExpandTransition.ts new file mode 100644 index 0000000..2aaef9a --- /dev/null +++ b/src/components/Transition/src/ExpandTransition.ts @@ -0,0 +1,89 @@ +/** + * Makes the first character of a string uppercase + */ +export function upperFirst(str: string): string { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +interface HTMLExpandElement extends HTMLElement { + _parent?: (Node & ParentNode & HTMLElement) | null; + _initialStyle: { + transition: string; + overflow: string | null; + height?: string | null; + width?: string | null; + }; +} + +export default function (expandedParentClass = '', x = false) { + const sizeProperty = x ? 'width' : ('height' as 'width' | 'height'); + const offsetProperty = `offset${upperFirst(sizeProperty)}` as 'offsetHeight' | 'offsetWidth'; + + return { + beforeEnter(el: HTMLExpandElement) { + el._parent = el.parentNode as (Node & ParentNode & HTMLElement) | null; + el._initialStyle = { + transition: el.style.transition, + overflow: el.style.overflow, + [sizeProperty]: el.style[sizeProperty], + }; + }, + + enter(el: HTMLExpandElement) { + const initialStyle = el._initialStyle; + + el.style.setProperty('transition', 'none', 'important'); + el.style.overflow = 'hidden'; + // const offset = `${el[offsetProperty]}px`; + + // el.style[sizeProperty] = '0'; + + void el.offsetHeight; // force reflow + + el.style.transition = initialStyle.transition; + + if (expandedParentClass && el._parent) { + el._parent.classList.add(expandedParentClass); + } + + requestAnimationFrame(() => { + // el.style[sizeProperty] = offset; + }); + }, + + afterEnter: resetStyles, + enterCancelled: resetStyles, + + leave(el: HTMLExpandElement) { + el._initialStyle = { + transition: '', + overflow: el.style.overflow, + [sizeProperty]: el.style[sizeProperty], + }; + + el.style.overflow = 'hidden'; + el.style[sizeProperty] = `${el[offsetProperty]}px`; + /* eslint-disable-next-line */ + void el.offsetHeight; // force reflow + + requestAnimationFrame(() => (el.style[sizeProperty] = '0')); + }, + + afterLeave, + leaveCancelled: afterLeave, + }; + + function afterLeave(el: HTMLExpandElement) { + if (expandedParentClass && el._parent) { + el._parent.classList.remove(expandedParentClass); + } + resetStyles(el); + } + + function resetStyles(el: HTMLExpandElement) { + const size = el._initialStyle[sizeProperty]; + el.style.overflow = el._initialStyle.overflow!; + if (size != null) el.style[sizeProperty] = size; + Reflect.deleteProperty(el, '_initialStyle'); + } +} diff --git a/src/components/Tree/index.ts b/src/components/Tree/index.ts new file mode 100644 index 0000000..b40611b --- /dev/null +++ b/src/components/Tree/index.ts @@ -0,0 +1,7 @@ +import BasicTree from './src/BasicTree.vue'; +import BasicLeftTree from './src/BasicLeftTree.vue'; +import './style'; + +export { BasicTree, BasicLeftTree }; +export type { ContextMenuItem } from '@/hooks/web/useContextMenu'; +export * from './src/types/tree'; diff --git a/src/components/Tree/src/BasicLeftTree.vue b/src/components/Tree/src/BasicLeftTree.vue new file mode 100644 index 0000000..91c04dd --- /dev/null +++ b/src/components/Tree/src/BasicLeftTree.vue @@ -0,0 +1,220 @@ + + + + diff --git a/src/components/Tree/src/BasicTree.vue b/src/components/Tree/src/BasicTree.vue new file mode 100644 index 0000000..678dc69 --- /dev/null +++ b/src/components/Tree/src/BasicTree.vue @@ -0,0 +1,444 @@ + diff --git a/src/components/Tree/src/TreeIcon.ts b/src/components/Tree/src/TreeIcon.ts new file mode 100644 index 0000000..bec07de --- /dev/null +++ b/src/components/Tree/src/TreeIcon.ts @@ -0,0 +1,13 @@ +import type { VNode, FunctionalComponent } from 'vue'; + +import { h } from 'vue'; +import { isString } from '@vue/shared'; +import { Icon } from '@/components/Icon'; + +export const TreeIcon: FunctionalComponent = ({ icon }: { icon: VNode | string }) => { + if (!icon) return null; + if (isString(icon)) { + return h('i', { class: 'icon-my mr-6px ' + icon }); + } + return Icon; +}; diff --git a/src/components/Tree/src/components/LeftTreeHeader.vue b/src/components/Tree/src/components/LeftTreeHeader.vue new file mode 100644 index 0000000..91cc350 --- /dev/null +++ b/src/components/Tree/src/components/LeftTreeHeader.vue @@ -0,0 +1,153 @@ + + diff --git a/src/components/Tree/src/components/TreeHeader.vue b/src/components/Tree/src/components/TreeHeader.vue new file mode 100644 index 0000000..60b58c1 --- /dev/null +++ b/src/components/Tree/src/components/TreeHeader.vue @@ -0,0 +1,162 @@ + + diff --git a/src/components/Tree/src/hooks/useTree.ts b/src/components/Tree/src/hooks/useTree.ts new file mode 100644 index 0000000..af2e342 --- /dev/null +++ b/src/components/Tree/src/hooks/useTree.ts @@ -0,0 +1,246 @@ +import type { InsertNodeParams, KeyType, FieldNames, TreeItem } from '../types/tree'; +import type { Ref, ComputedRef } from 'vue'; +import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; + +import { cloneDeep } from 'lodash-es'; +import { unref } from 'vue'; +import { forEach } from '@/utils/helper/treeHelper'; + +export function useTree(treeDataRef: Ref, getFieldNames: ComputedRef) { + function getAllKeys(list?: TreeDataItem[]) { + const keys: string[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return keys; + + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + keys.push(node[keyField]!); + const children = node[childrenField]; + if (children && children.length) { + keys.push(...(getAllKeys(children) as string[])); + } + } + return keys as KeyType[]; + } + + // get keys that can be checked and selected + function getEnabledKeys(list?: TreeDataItem[]) { + const keys: string[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return keys; + + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + node.disabled !== true && node.selectable !== false && keys.push(node[keyField]!); + const children = node[childrenField]; + if (children && children.length) { + keys.push(...(getEnabledKeys(children) as string[])); + } + } + return keys as KeyType[]; + } + + function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]) { + const keys: KeyType[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return keys; + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + const children = node[childrenField]; + if (nodeKey === node[keyField]) { + keys.push(node[keyField]!); + if (children && children.length) { + keys.push(...(getAllKeys(children) as string[])); + } + } else { + if (children && children.length) { + keys.push(...getChildrenKeys(nodeKey, children)); + } + } + } + return keys as KeyType[]; + } + + // Update node + function updateNodeByKey(key: string, node: TreeDataItem, list?: TreeDataItem[]) { + if (!key) return; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + + if (!childrenField || !keyField) return; + + for (let index = 0; index < treeData.length; index++) { + const element: any = treeData[index]; + const children = element[childrenField]; + + if (element[keyField] === key) { + treeData[index] = { ...treeData[index], ...node }; + break; + } else if (children && children.length) { + updateNodeByKey(key, node, element[childrenField]); + } + } + } + + // Expand the specified level + function filterByLevel(level = 1, list?: TreeDataItem[], currentLevel = 1) { + if (!level) { + return []; + } + const res: (string | number)[] = []; + const data = list || unref(treeDataRef) || []; + for (let index = 0; index < data.length; index++) { + const item = data[index]; + + const { key: keyField, children: childrenField } = unref(getFieldNames); + const key = keyField ? item[keyField] : ''; + const children = childrenField ? item[childrenField] : []; + res.push(key); + if (children && children.length && currentLevel < level) { + currentLevel += 1; + res.push(...filterByLevel(level, children, currentLevel)); + } + } + return res as string[] | number[]; + } + + /** + * 添加节点 + */ + function insertNodeByKey({ parentKey = null, node, push = 'push' }: InsertNodeParams) { + const treeData: any = cloneDeep(unref(treeDataRef)); + if (!parentKey) { + treeData[push](node); + treeDataRef.value = treeData; + return; + } + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return; + + forEach(treeData, treeItem => { + if (treeItem[keyField] === parentKey) { + treeItem[childrenField] = treeItem[childrenField] || []; + treeItem[childrenField][push](node); + return true; + } + }); + treeDataRef.value = treeData; + } + /** + * 批量添加节点 + */ + function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) { + const treeData: any = cloneDeep(unref(treeDataRef)); + if (!list || list.length < 1) { + return; + } + if (!parentKey) { + for (let i = 0; i < list.length; i++) { + treeData[push](list[i]); + } + treeDataRef.value = treeData; + return; + } else { + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return; + + forEach(treeData, treeItem => { + if (treeItem[keyField] === parentKey) { + treeItem[childrenField] = treeItem[childrenField] || []; + for (let i = 0; i < list.length; i++) { + treeItem[childrenField][push](list[i]); + } + treeDataRef.value = treeData; + return true; + } + }); + } + } + // Delete node + function deleteNodeByKey(key: string, list?: TreeDataItem[]) { + if (!key) return; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return; + + for (let index = 0; index < treeData.length; index++) { + const element: any = treeData[index]; + const children = element[childrenField]; + + if (element[keyField] === key) { + treeData.splice(index, 1); + break; + } else if (children && children.length) { + deleteNodeByKey(key, element[childrenField]); + } + } + } + + // Get selected node + function getSelectedNode(key: KeyType, list?: TreeItem[], selectedNode?: TreeItem | null) { + if (!key && key !== 0) return null; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return; + treeData.forEach(item => { + if (selectedNode?.[keyField] || selectedNode?.[keyField] === 0) return selectedNode; + if (item[keyField] === key) { + selectedNode = item; + return; + } + if (item[childrenField] && item[childrenField].length) { + selectedNode = getSelectedNode(key, item[childrenField], selectedNode); + } + }); + return selectedNode || null; + } + // 获取选中节点 + function getEnabledNodes(keys: KeyType[], list?: TreeItem[]) { + let enabledNodes: TreeItem[] = []; + if (!keys || !keys?.length) return []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return []; + treeData.forEach(item => { + if (keys.includes(item[keyField])) enabledNodes.push(item); + if (item[childrenField] && item[childrenField].length) { + enabledNodes.push(...getEnabledNodes(keys, item[childrenField])); + } + }); + return enabledNodes; + } + + function getParentKeys(list?: TreeDataItem[], isFilterDisabledNode = false) { + const keys: string[] = []; + const treeData = list || unref(treeDataRef); + const { key: keyField, children: childrenField } = unref(getFieldNames); + if (!childrenField || !keyField) return keys; + + for (let index = 0; index < treeData.length; index++) { + const node = treeData[index]; + const children = node[childrenField]; + if (children && children.length && ((isFilterDisabledNode && !node.disabled) || !isFilterDisabledNode)) { + keys.push(node[keyField]); + keys.push(...(getParentKeys(children) as string[])); + } + } + return keys as KeyType[]; + } + + return { + deleteNodeByKey, + insertNodeByKey, + insertNodesByKey, + filterByLevel, + updateNodeByKey, + getAllKeys, + getChildrenKeys, + getEnabledKeys, + getParentKeys, + getSelectedNode, + getEnabledNodes, + }; +} diff --git a/src/components/Tree/src/types/tree.ts b/src/components/Tree/src/types/tree.ts new file mode 100644 index 0000000..4a36739 --- /dev/null +++ b/src/components/Tree/src/types/tree.ts @@ -0,0 +1,192 @@ +import type { ExtractPropTypes } from 'vue'; +import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; + +import { buildProps } from '@/utils/props'; + +export enum ToolbarEnum { + RELOAD, + SELECT_ALL, + UN_SELECT_ALL, + EXPAND_ALL, + UN_EXPAND_ALL, + CHECK_STRICTLY, + CHECK_UN_STRICTLY, +} + +export const treeEmits = ['update:expandedKeys', 'update:selectedKeys', 'update:value', 'change', 'check', 'update:searchValue', 'select']; + +export interface TreeState { + expandedKeys: KeyType[]; + selectedKeys: KeyType[]; + checkedKeys: CheckKeys; + halfCheckedKeys: KeyType[]; + checkedNodes: any[]; + checkStrictly: boolean; +} + +export interface FieldNames { + children?: string; + title?: string; + key?: string; +} + +export type KeyType = string | number; + +export type CheckKeys = KeyType[] | { checked: string[] | number[]; halfChecked: string[] | number[] }; + +export const treeProps = buildProps({ + value: { + type: [Object, Array] as PropType, + }, + + renderIcon: { + type: Function as PropType<(params: Recordable) => string>, + }, + + helpMessage: { + type: [String, Array] as PropType, + default: '', + }, + + title: { + type: String, + default: '', + }, + toolbar: Boolean, + search: Boolean, + searchValue: { + type: String, + default: '', + }, + checkStrictly: Boolean, + clickRowToExpand: { + type: Boolean, + default: false, + }, + checkable: Boolean, + defaultExpandLevel: { + type: [String, Number] as PropType, + default: '', + }, + defaultExpandAll: Boolean, + + fieldNames: { + type: Object as PropType, + default: () => ({ key: 'id', title: 'fullName', children: 'children' }), + }, + + treeData: { + type: Array as PropType, + }, + + actionList: { + type: Array as PropType, + default: () => [], + }, + + expandedKeys: { + type: Array as PropType, + default: () => [], + }, + + selectedKeys: { + type: Array as PropType, + default: () => [], + }, + + checkedKeys: { + type: [Array, Object] as PropType, + default: () => [], + }, + + beforeRightClick: { + type: Function as PropType<(...arg: any) => ContextMenuItem[] | ContextMenuOptions>, + default: undefined, + }, + + rightMenuList: { + type: Array as PropType, + }, + // 自定义数据过滤判断方法(注: 不是整个过滤方法,而是内置过滤的判断方法,用于增强原本仅能通过title进行过滤的方式) + filterFn: { + type: Function as PropType<(searchValue: any, node: TreeItem, fieldNames: FieldNames) => boolean>, + default: undefined, + }, + // 高亮搜索值,仅高亮具体匹配值(通过title)值为true时使用默认色值,值为#xxx时使用此值替代且高亮开启 + highlight: { + type: [Boolean, String] as PropType, + default: true, + }, + // 搜索完成时自动展开结果 + expandOnSearch: Boolean, + // 搜索完成自动选中所有结果,当且仅当 checkable===true 时生效 + checkOnSearch: Boolean, + // 搜索完成自动select所有结果 + selectedOnSearch: Boolean, + loading: { + type: Boolean, + default: false, + }, + treeWrapperClassName: String, +}); + +export type TreeProps = ExtractPropTypes; + +export interface ContextMenuItem { + label: string; + icon?: string; + hidden?: boolean; + disabled?: boolean; + handler?: Fn; + divider?: boolean; + children?: ContextMenuItem[]; +} + +export interface ContextMenuOptions { + icon?: string; + styles?: any; + items?: ContextMenuItem[]; +} + +export interface TreeItem extends TreeDataItem { + icon?: any; +} + +export interface TreeActionItem { + render: (record: Recordable) => any; + show?: boolean | ((record: Recordable) => boolean); +} +export interface DropDownActionItem { + label: string; + onClick?: Fn; +} + +export interface InsertNodeParams { + parentKey: string | null; + node: TreeDataItem; + list?: TreeDataItem[]; + push?: 'push' | 'unshift'; +} + +export interface TreeActionType { + checkAll: (checkAll: boolean) => void; + expandAll: (expandAll: boolean) => void; + getAllKeys: () => KeyType[]; + setExpandedKeys: (keys: KeyType[]) => void; + getExpandedKeys: () => KeyType[]; + setSelectedKeys: (keys: KeyType[]) => void; + getSelectedKeys: () => KeyType[]; + setCheckedKeys: (keys: CheckKeys) => void; + getCheckedKeys: () => CheckKeys; + getHalfCheckedKeys: () => KeyType[]; + getParentKeys: (treeList?: TreeItem[], isFilterDisabledNode?: boolean) => KeyType[]; + filterByLevel: (level: number) => void; + insertNodeByKey: (opt: InsertNodeParams) => void; + insertNodesByKey: (opt: InsertNodeParams) => void; + deleteNodeByKey: (key: string) => void; + updateNodeByKey: (key: string, node: Omit) => void; + setSearchValue: (value: string) => void; + getSearchValue: () => string; + getSelectedNode: (key: KeyType, treeList?: TreeItem[], selectNode?: TreeItem | null) => TreeItem | null | undefined; + getCheckedNodes: () => TreeItem[]; +} diff --git a/src/components/Tree/style/index.less b/src/components/Tree/style/index.less new file mode 100644 index 0000000..e06ce06 --- /dev/null +++ b/src/components/Tree/style/index.less @@ -0,0 +1,94 @@ +@tree-prefix-cls: ~'@{namespace}-tree'; + +.@{tree-prefix-cls} { + background-color: @component-background; + &.remove-active-tree { + .ant-tree .ant-tree-treenode.ant-tree-treenode-selected { + background-color: @selected-hover-bg; + } + } + .ant-tree { + .ant-tree-treenode { + padding: 0; + &:hover { + background-color: @selected-hover-bg; + } + &.ant-tree-treenode-selected { + background-color: @tree-node-selected-bg; + } + } + + .ant-tree-switcher { + line-height: 32px; + .ant-tree-switcher-icon { + vertical-align: 0.25em; + } + } + .ant-tree-checkbox { + margin: 8px 8px 0 0; + margin-block-start: 0 !important; + } + + .ant-tree-node-content-wrapper { + position: relative; + height: 32px; + line-height: 32px; + &:hover, + &.ant-tree-node-selected { + background-color: unset !important; + } + + .ant-tree-title { + position: absolute; + left: 0; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + + &__title { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding-right: 10px; + + &:hover { + .@{tree-prefix-cls}__action { + visibility: visible; + } + } + } + &__name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + &__content { + overflow: hidden; + } + + &__actions { + position: absolute; + //top: 2px; + right: 3px; + display: flex; + } + + &__action { + margin-left: 4px; + visibility: hidden; + } + + &-header { + border-bottom: 1px solid @border-color-base; + } + .ant-empty-normal { + padding: 32px 0; + margin: 0 !important; + } +} diff --git a/src/components/Tree/style/index.ts b/src/components/Tree/style/index.ts new file mode 100644 index 0000000..d74e52e --- /dev/null +++ b/src/components/Tree/style/index.ts @@ -0,0 +1 @@ +import './index.less'; diff --git a/src/components/Verify/index.ts b/src/components/Verify/index.ts new file mode 100644 index 0000000..ddd9c98 --- /dev/null +++ b/src/components/Verify/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '@/utils/index'; +import basicDragVerify from './src/DragVerify.vue'; +import rotateDragVerify from './src/ImgRotate.vue'; + +export const BasicDragVerify = withInstall(basicDragVerify); +export const RotateDragVerify = withInstall(rotateDragVerify); +export * from './src/typing'; diff --git a/src/components/Verify/src/DragVerify.vue b/src/components/Verify/src/DragVerify.vue new file mode 100644 index 0000000..7022a3f --- /dev/null +++ b/src/components/Verify/src/DragVerify.vue @@ -0,0 +1,360 @@ + + diff --git a/src/components/Verify/src/ImgRotate.vue b/src/components/Verify/src/ImgRotate.vue new file mode 100644 index 0000000..27a4a4e --- /dev/null +++ b/src/components/Verify/src/ImgRotate.vue @@ -0,0 +1,214 @@ + + diff --git a/src/components/Verify/src/props.ts b/src/components/Verify/src/props.ts new file mode 100644 index 0000000..a1549e6 --- /dev/null +++ b/src/components/Verify/src/props.ts @@ -0,0 +1,87 @@ +import type { PropType } from 'vue'; +import { useI18n } from '@/hooks/web/useI18n'; + +const { t } = useI18n(); +export const basicProps = { + value: { + type: Boolean as PropType, + default: false, + }, + + isSlot: { + type: Boolean as PropType, + default: false, + }, + + text: { + type: [String] as PropType, + default: t('component.verify.dragText'), + }, + successText: { + type: [String] as PropType, + default: t('component.verify.successText'), + }, + height: { + type: [Number, String] as PropType, + default: 40, + }, + + width: { + type: [Number, String] as PropType, + default: 220, + }, + + circle: { + type: Boolean as PropType, + default: false, + }, + + wrapStyle: { + type: Object as PropType, + default: () => ({}), + }, + contentStyle: { + type: Object as PropType, + default: () => ({}), + }, + barStyle: { + type: Object as PropType, + default: () => ({}), + }, + actionStyle: { + type: Object as PropType, + default: () => ({}), + }, +}; + +export const rotateProps = { + ...basicProps, + src: { + type: String as PropType, + }, + + imgWidth: { + type: Number as PropType, + default: 260, + }, + + imgWrapStyle: { + type: Object as PropType, + default: {}, + }, + + minDegree: { + type: Number as PropType, + default: 90, + }, + + maxDegree: { + type: Number as PropType, + default: 270, + }, + + diffDegree: { + type: Number as PropType, + default: 20, + }, +}; diff --git a/src/components/Verify/src/typing.ts b/src/components/Verify/src/typing.ts new file mode 100644 index 0000000..48f7d4c --- /dev/null +++ b/src/components/Verify/src/typing.ts @@ -0,0 +1,14 @@ +export interface DragVerifyActionType { + resume: () => void; +} + +export interface PassingData { + isPassing: boolean; + time: number; +} + +export interface MoveData { + event: MouseEvent | TouchEvent; + moveDistance: number; + moveX: number; +} diff --git a/src/components/VirtualScroll/index.ts b/src/components/VirtualScroll/index.ts new file mode 100644 index 0000000..8561396 --- /dev/null +++ b/src/components/VirtualScroll/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils/index'; +import vScroll from './src/VirtualScroll.vue'; + +export const VScroll = withInstall(vScroll); diff --git a/src/components/VirtualScroll/src/VirtualScroll.vue b/src/components/VirtualScroll/src/VirtualScroll.vue new file mode 100644 index 0000000..b7ec920 --- /dev/null +++ b/src/components/VirtualScroll/src/VirtualScroll.vue @@ -0,0 +1,180 @@ + + diff --git a/src/components/VisualPortal/Design/components/AddBtn.vue b/src/components/VisualPortal/Design/components/AddBtn.vue new file mode 100644 index 0000000..86e2262 --- /dev/null +++ b/src/components/VisualPortal/Design/components/AddBtn.vue @@ -0,0 +1,47 @@ + + + diff --git a/src/components/VisualPortal/Design/components/Parser.vue b/src/components/VisualPortal/Design/components/Parser.vue new file mode 100644 index 0000000..dbe2a3e --- /dev/null +++ b/src/components/VisualPortal/Design/components/Parser.vue @@ -0,0 +1,189 @@ + + + diff --git a/src/components/VisualPortal/Design/components/PortalDesigner.vue b/src/components/VisualPortal/Design/components/PortalDesigner.vue new file mode 100644 index 0000000..c0cc99b --- /dev/null +++ b/src/components/VisualPortal/Design/components/PortalDesigner.vue @@ -0,0 +1,442 @@ + + diff --git a/src/components/VisualPortal/Design/components/Preview.vue b/src/components/VisualPortal/Design/components/Preview.vue new file mode 100644 index 0000000..55118fd --- /dev/null +++ b/src/components/VisualPortal/Design/components/Preview.vue @@ -0,0 +1,124 @@ + + + + diff --git a/src/components/VisualPortal/Design/components/RightPanel.vue b/src/components/VisualPortal/Design/components/RightPanel.vue new file mode 100644 index 0000000..3d429f7 --- /dev/null +++ b/src/components/VisualPortal/Design/components/RightPanel.vue @@ -0,0 +1,118 @@ + + diff --git a/src/components/VisualPortal/Design/helper/componentMap.ts b/src/components/VisualPortal/Design/helper/componentMap.ts new file mode 100644 index 0000000..0311729 --- /dev/null +++ b/src/components/VisualPortal/Design/helper/componentMap.ts @@ -0,0 +1,1700 @@ +const dataBoardDefault = [ + { + fullName: '新增客户', + unit: '个', + num: 262, + field: '', + icon: 'icon-ym icon-ym-wf-contractApproval', + iconColor: 'rgb(123, 26, 225)', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + id: '1', + }, + { + fullName: '新增商机', + unit: '个', + num: 199, + field: '', + icon: 'icon-ym icon-ym-wf-outgoingApply', + iconColor: 'rgb(74, 184, 255)', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + id: '2', + }, + { + fullName: '合同金额', + unit: '元', + num: 126263.5, + field: '', + icon: 'icon-ym icon-ym-wf-payDistribution', + iconColor: 'rgb(255, 139, 88)', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + id: '3', + }, + { + fullName: '回款金额', + unit: '元', + num: 6223.2, + field: '', + icon: 'icon-ym icon-ym-wf-incomeRecognition', + iconColor: 'rgb(252, 91, 135)', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + id: '4', + }, +]; +// 布局控件 +export const layoutComponents = [ + { + icon: 'icon-ym icon-ym-portal-card', + label: '卡片面板', + yunzhupaasKey: 'card', + title: '卡片面板', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-card', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + children: [], + w: 6, + h: 6, + minW: 1, + minH: 4, + maxW: 12, + maxH: 12, + }, + { + icon: 'icon-ym icon-ym-portal-tab', + label: '标签面板', + yunzhupaasKey: 'tab', + title: '标签面板', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-tab', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + children: [ + { + title: 'Tab 1', + name: '1', + icon: '', + children: [], + }, + { + title: 'Tab 2', + name: '2', + icon: '', + children: [], + }, + ], + active: '1', + type: '', + tabPosition: 'top', + w: 6, + h: 6, + minW: 1, + minH: 4, + maxW: 12, + maxH: 12, + }, +]; +// 基础控件 +export const basicComponents = [ + { + icon: 'icon-ym icon-ym-generator-function', + label: '常用功能', + yunzhupaasKey: 'commonFunc', + title: '常用功能', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-function', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + option: { + styleType: 1, + appStyleType: 1, + defaultValue: [ + { + fullName: '表单设计', + moduleId: '85cd7bca426e49ce83a061bf461b1447', + linkType: '1', + linkTarget: '_self', + urlAddress: 'onlineDev/webDesign', + icon: 'icon-ym icon-ym-webDesign', + iconBgColor: '#FF3B3B', + type: 2, + id: '1', + }, + { + fullName: '流程设计', + moduleId: 'fe0150960dd542ec9328067e4495074b', + linkType: '1', + linkTarget: '_self', + urlAddress: 'workFlow/flowEngine', + icon: 'icon-ym icon-ym-flowDesign', + iconBgColor: '#7B1AE1', + type: 2, + id: '2', + }, + { + fullName: '权限管理', + moduleId: '9057d797550e4457b7ddf2456ce45882', + linkType: '1', + linkTarget: '_self', + urlAddress: 'permission/authorize', + icon: 'icon-ym icon-ym-authorize', + iconBgColor: '#1890FF', + type: 2, + id: '3', + }, + { + fullName: '报表设计', + moduleId: 'c7159f97177b420d9fc8ec8c74ae541b', + linkType: '1', + linkTarget: '_self', + urlAddress: 'onlineDev/dataReport', + icon: 'icon-ym icon-ym-reportDesign', + iconBgColor: '#F68900', + type: 2, + id: '4', + }, + { + fullName: '门户设计', + moduleId: '232d7226f00446d882e1e1bd999f7b2d', + linkType: '1', + linkTarget: '_self', + urlAddress: 'onlineDev/visualPortal', + icon: 'icon-ym icon-ym-portalDesign', + iconBgColor: '#33B932', + type: 2, + id: '5', + }, + ], + appDefaultValue: [ + { + fullName: 'YUNZHUPAAS快速开发', + moduleId: '', + linkType: '2', + urlAddress: 'https://www.yunzhupaas.com/', + linkTarget: '_blank', + icon: 'icon-ym icon-ym-webDesign', + iconBgColor: '#33B932', + type: 2, + id: '1', + }, + ], + rowNumber: 5, + showBorder: false, + appRowNumber: 4, + appShowBorder: false, + labelFontSize: 14, + labelFontWeight: false, + labelFontColor: '#606266', + }, + w: 6, + h: 4, + minW: 1, + minH: 3, + maxW: 12, + maxH: 12, + }, + { + icon: 'icon-ym icon-ym-generator-textarea', + label: '文本', + yunzhupaasKey: 'text', + title: '文本', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-textarea', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: '', + textFontSize: 14, + textFontColor: '#303133', + textFontWeight: false, + textFontStyle: false, + textLeft: 'left', + textUnderLine: 'none', + textBgColor: '', + textAutoplay: false, + textAutoplayMode: 'left', + textAutoplaySpeed: 60, + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 4, + h: 3, + minW: 1, + minH: 2, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-portal-image', + label: '图片', + yunzhupaasKey: 'image', + title: '图片', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-image', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 2, + defaultValue: '', + textDefaultValue: '云筑项目管理平台', + textFontSize: 14, + textFontColor: '#fff', + textFontWeight: false, + textFontStyle: false, + textLeft: 'center', + textBgColor: '#30313399', + imageFillStyle: 'cover', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 6, + minW: 1, + minH: 4, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-portal-carousel', + label: '轮播图', + yunzhupaasKey: 'carousel', + title: '轮播图', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-carousel', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + carouselType: false, + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: [ + { + imageUrl: 'https://app.cdn.yunzhupaas.com/image/3.2/banner1.png', + dataType: 2, + propsApi: '', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + textDefaultValue: '', + id: '1', + }, + { + imageUrl: 'https://app.cdn.yunzhupaas.com/image/3.2/banner2.png', + dataType: 2, + propsApi: '', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + textDefaultValue: '', + id: '2', + }, + { + imageUrl: 'https://app.cdn.yunzhupaas.com/image/3.2/banner4.png', + dataType: 2, + propsApi: '', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + textDefaultValue: '', + id: '3', + }, + ], + appDefaultValue: [ + { + imageUrl: 'https://app.cdn.yunzhupaas.com/image/3.2/banner1.png', + dataType: 2, + propsApi: '', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + textDefaultValue: '', + id: '1', + }, + { + imageUrl: 'https://app.cdn.yunzhupaas.com/image/3.2/banner2.png', + dataType: 2, + propsApi: '', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + textDefaultValue: '', + id: '2', + }, + { + imageUrl: 'https://app.cdn.yunzhupaas.com/image/3.2/banner4.png', + dataType: 2, + propsApi: '', + moduleId: '', + linkType: '', + urlAddress: '', + linkTarget: '_self', + textDefaultValue: '', + id: '3', + }, + ], + carouselAutoplay: true, + carouselDirection: 'horizontal', + carouselInterval: 3000, + carouselIndicatorPosition: 'bottomRight', + carouselArrow: 'never', + carouselLoop: true, + imageFillStyle: 'cover', + textFontSize: 14, + textFontColor: '#fff', + textFontWeight: false, + textFontStyle: false, + textLeft: 'center', + textBgColor: '#30313399', + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 6, + minW: 1, + minH: 4, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-portal-video', + label: '视频', + yunzhupaasKey: 'video', + title: '视频', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-video', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 2, + defaultValue: '', + videoAutoplay: true, + playNumber: 2, + mutePlay: false, + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 6, + minW: 1, + minH: 4, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-portal-iframe', + label: 'Iframe', + yunzhupaasKey: 'iframe', + title: 'Iframe', + visibility: ['pc'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-iframe', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + option: { + defaultValue: 'https://www.yunzhupaas.com/', + }, + w: 12, + h: 8, + minW: 1, + minH: 8, + maxW: 12, + maxH: 20, + }, +]; +// 系统控件 +export const systemComponents = [ + { + icon: 'icon-ym icon-ym-generator-todo', + label: '我的待办', + yunzhupaasKey: 'todo', + title: '我的待办', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-todo', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + option: { + styleType: 1, + defaultValue: [ + { + fullName: '流程待签', + id: 'flowToSign', + noShow: false, + num: 0, + category: [], + urlAddress: '/workFlow/flowToSign', + icon: 'icon-ym icon-ym-flowToSign', + iconBgColor: '#1997f4', + type: 2, + }, + { + fullName: '流程待办', + id: 'flowTodo', + noShow: false, + num: 0, + category: [], + urlAddress: '/workFlow/flowTodo', + icon: 'icon-ym icon-ym-flowTodo', + iconBgColor: '#f29700', + type: 2, + }, + { + fullName: '流程在办', + id: 'flowDoing', + noShow: false, + num: 0, + category: [], + urlAddress: '/workFlow/flowDoing', + icon: 'icon-ym icon-ym-flowDoing', + iconBgColor: '#495dfd', + type: 2, + }, + { + fullName: '流程已办', + id: 'flowDone', + noShow: false, + num: 0, + category: [], + urlAddress: '/workFlow/flowDone', + icon: 'icon-ym icon-ym-flowDone', + iconBgColor: '#7b1ae1', + type: 2, + }, + { + fullName: '流程抄送', + id: 'flowCirculate', + noShow: false, + num: 0, + category: [], + urlAddress: '/workFlow/flowCirculate', + icon: 'icon-ym icon-ym-flowCirculate', + iconBgColor: '#33b932', + type: 2, + }, + ], + rowNumber: 5, + showBorder: false, + appRowNumber: 5, + appShowBorder: false, + labelFontSize: 14, + labelFontWeight: false, + labelFontColor: '#606266', + valueFontSize: 24, + valueFontWeight: true, + valueFontColor: '#303133', + valueFontBgColor: '#FE433E', + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 12, + h: 4, + minW: 1, + minH: 3, + maxW: 12, + maxH: 12, + }, + { + icon: 'icon-ym icon-ym-flowToSign', + label: '待签事项', + yunzhupaasKey: 'todoList', + title: '待签事项', + visibility: ['pc', 'app'], + type: 1, + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-flowToSign', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + w: 6, + h: 7, + minW: 1, + minH: 7, + maxW: 12, + maxH: 12, + }, + { + icon: 'icon-ym icon-ym-flowTodo', + label: '待办事项', + yunzhupaasKey: 'todoList', + title: '待办事项', + visibility: ['pc', 'app'], + type: 2, + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-flowTodo', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + w: 6, + h: 7, + minW: 1, + minH: 7, + maxW: 12, + maxH: 12, + }, + { + icon: 'icon-ym icon-ym-flowDoing', + label: '在办事项', + yunzhupaasKey: 'todoList', + title: '在办事项', + type: 3, + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-flowDoing', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + w: 6, + h: 7, + minW: 1, + minH: 7, + maxW: 12, + maxH: 12, + }, + { + icon: 'icon-ym icon-ym-generator-notice', + label: '公告通知', + yunzhupaasKey: 'notice', + title: '公告通知', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-notice', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + option: { + border: true, + showOverflow: true, + showHeader: true, + styleType: 1, + appStyleType: 1, + defaultValue: [], + showImage: true, + headerFontSize: 14, + headerFontWeight: false, + headerFontColor: '#303133', + headerLeft: 'center', + headerBgColor: '#F3F6F9', + tableIndex: true, + noticeCount: 5, + tableFontSize: 14, + tableFontColor: '#606266', + tableBgColor: '', + tableOddLineColor: '', + tableEvenLineColor: '', + describe: false, + showText: true, + textFontSize: 14, + textFontColor: '#606266', + textFontWeight: false, + appCount: 5, + appColumnList: [ + { fullName: '类型', filedName: 'classify', fontSize: 12, classify: [], fontWeight: false, fontColor: '#606266', show: true }, + { fullName: '标题', filedName: 'fullName', fontSize: 14, fontWeight: false, fontColor: '#303133', show: true }, + { fullName: '摘要', filedName: 'content', fontSize: 12, fontWeight: false, fontColor: '#606266', show: true }, + { fullName: '时间', filedName: 'time', fontSize: 12, timeClassify: 1, fontWeight: false, fontColor: '#606266', show: true }, + { fullName: '人员', filedName: 'user', fontSize: 12, userClassify: 1, fontWeight: false, fontColor: '#606266', show: true }, + ], + columnData: [ + { fullName: '类型', filedName: 'classify', sortable: false, show: true, fixed: 'none', align: 'center', width: 0, classify: [] }, + { fullName: '标题', filedName: 'fullName', sortable: false, show: true, fixed: 'none', align: 'center', width: 0 }, + { fullName: '创建人', filedName: 'creatorUser', sortable: false, show: true, fixed: 'none', align: 'center', width: 0 }, + { fullName: '创建时间', filedName: 'creatorTime', sortable: false, show: true, fixed: 'none', align: 'center', width: 0 }, + { fullName: '发布人', filedName: 'releaseUser', sortable: false, show: true, fixed: 'none', align: 'center', width: 0 }, + { fullName: '发布时间', filedName: 'releaseTime', sortable: false, show: true, fixed: 'none', align: 'center', width: 0 }, + ], + rowData: [ + { fullName: '类型', filedName: 'classify', fontSize: 12, classify: [], fontWeight: false, fontColor: '#606266', show: true }, + { fullName: '标题', filedName: 'fullName', fontSize: 14, fontWeight: false, fontColor: '#303133', show: true }, + { fullName: '摘要', filedName: 'content', fontSize: 12, fontWeight: false, fontColor: '#606266', show: true }, + { fullName: '时间', filedName: 'time', fontSize: 12, timeClassify: 1, fontWeight: false, fontColor: '#606266', show: true }, + ], + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 12, + h: 7, + minW: 1, + minH: 7, + maxW: 12, + maxH: 20, + }, +]; + +// 图表控件 +export const chartComponents = [ + { + icon: 'icon-ym icon-ym-generator-Panel', + label: '数据面板', + yunzhupaasKey: 'dataBoard', + title: '数据面板', + dataType: 'static', + propsApi: '', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-function', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + option: { + styleType: 1, + appStyleType: 1, + defaultValue: dataBoardDefault, + appDefaultValue: dataBoardDefault, + rowNumber: 4, + showBorder: false, + appRowNumber: 4, + appShowBorder: false, + labelFontSize: 14, + labelFontWeight: false, + labelFontColor: '#606266', + valueFontSize: 24, + valueFontWeight: true, + valueFontColor: '#303133', + unitFontSize: 14, + unitFontWeight: false, + unitFontColor: '#606266', + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 12, + h: 4, + minW: 1, + minH: 3, + maxW: 12, + maxH: 12, + }, + { + icon: 'icon-ym icon-ym-generator-table', + label: '表格列表', + yunzhupaasKey: 'tableList', + title: '表格列表', + dataType: 'static', + propsApi: '', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-table', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + option: { + border: true, + showOverflow: true, + styleType: 1, + defaultValue: [], + showHeader: true, + headerFontSize: 14, + headerFontWeight: false, + headerFontColor: '#303133', + headerLeft: 'center', + headerBgColor: '#F3F6F9', + tableIndex: true, + tableCount: 5, + tableFontSize: 14, + tableFontColor: '#606266', + tableOddLineColor: '', + tableEvenLineColor: '', + tableBgColor: '', + describe: false, + showName: true, + dataFontSize: 14, + dataFontColor: '#606266', + dataFontWeight: false, + nameFontSize: 14, + nameFontColor: '#303133', + nameFontWeight: false, + appCount: 5, + appColumnList: [ + { fullName: '姓名', filedName: 'inputField102' }, + { fullName: '日期', filedName: 'inputField105' }, + ], + columnData: [ + { fullName: '排名', filedName: 'inputField101', sortable: false, fixed: 'none', align: 'center', width: 0, id: '1' }, + { fullName: '姓名', filedName: 'inputField102', sortable: false, fixed: 'none', align: 'center', width: 0, id: '2' }, + { fullName: '销售额', filedName: 'inputField103', sortable: false, fixed: 'none', align: 'center', width: 0, id: '3' }, + { fullName: '完成情况', filedName: 'inputField104', sortable: false, fixed: 'none', align: 'center', width: 0, id: '4' }, + ], + rowData: [ + { fullName: '标题', filedName: 'inputField102', fontSize: 14, fontWeight: false, fontColor: '#303133' }, + { fullName: '描述', filedName: 'inputField103', fontSize: 12, fontWeight: false, fontColor: '#606266' }, + { fullName: '时间', filedName: 'inputField105', fontSize: 12, fontWeight: false, fontColor: '#606266' }, + ], + target: '_self', + urlAddress: '', + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 4, + maxW: 12, + maxH: 20, + }, + + { + icon: 'icon-ym icon-ym-generator-bar', + label: '柱状图', + yunzhupaasKey: 'barChart', + title: '柱状图', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-bar', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: [], + // 图表标题设置 + titleText: '', //主标题 + titleTextStyleColor: '#303133', //主标题字体颜色 + titleTextStyleFontSize: 18, //主标题字体大小[12-25px] + titleTextStyleFontWeight: false, //主标题是否加粗 + titleLeft: 'center', //主子标题位置[left,center,right] + titleBgColor: '', //主子标题背景色[rgba(),#303133] + // 图表副标题设置 + titleSubtext: '', //子标题 + titleSubtextStyleColor: '#303133', //子标题字体颜色 + titleSubtextStyleFontSize: 12, //子标题字体大小[12-25px] + titleSubtextStyleFontWeight: false, //子标题是否加粗 + // 柱体设置 + seriesBarWidth: 30, //柱体宽度 + seriesItemStyleBarBorderRadius: 0, //柱体圆角 + // X轴设置 + xAxisName: '', //X轴名称 + xAxisNameTextStyleFontSize: 14, //X轴名称字体大小 + xAxisNameTextStyleColor: '#303133', //X轴名称字体颜色 + xAxisNameTextStyleFontWeight: false, //X轴名称是否加粗 + xAxisShow: true, //X轴是否显示 + category: 'category', //X轴类型[category,value] + xAxisAxisLineLineStyleColor: '#303133', //X轴线颜色 + xAxisAxisLabelRotate: 0, //X轴标签角度 + xAxisAxisLabelTextStyleFontSize: 14, //X轴标签字体大小 + xAxisAxisLabelTextStyleColor: '#303133', //X轴标签字体颜色 + xAxisAxisLabelTextFontWeight: false, //X轴标签是否加粗 + xAxisSplitLineShow: false, //X轴网格线 + xAxisSplitLineLineStyleColor: '#DFDFDF', //X轴网格线颜色 + xAxisInverse: false, //X轴反转 + // Y轴设置 + yAxisName: '', //Y轴名称 + yAxisNameTextStyleFontSize: 14, //Y轴名称字体大小 + yAxisNameTextStyleColor: '#303133', //Y轴名称字体颜色 + yAxisNameTextStyleFontWeight: false, //Y轴名称是否加粗 + yAxisShow: true, //Y轴是否显示 + yAxisAxisLineLineStyleColor: '#303133', //Y轴颜色 + yAxisSplitLineShow: true, //Y轴网格线 + yAxisSplitLineLineStyleColor: '#DFDFDF', //Y轴网格线颜色 + yAxisAxisLabelTextStyleFontSize: 14, //Y轴标签字体大小 + yAxisAxisLabelTextStyleColor: '#303133', //Y轴标签字体颜色 + yAxisAxisLabelTextFontWeight: false, //Y轴标签是否加粗 + //数值设置 + seriesLabelShow: true, //显示数值 + seriesLabelFontSize: 14, //数值大小 + seriesLabelFontWeight: false, //数值加粗 + seriesLabelColor: '#303133', //数值颜色 + seriesLabelBgColor: '', //数值背景色 + //提示语设置 + tooltipShow: true, //提示语显示 + tooltipTextStyleFontSize: 14, //提示语字体大小 + tooltipTextStyleFontWeight: false, //提示语是否加粗 + tooltipTextStyleColor: '#303133', //提示语字体颜色 + tooltipBgColor: '#fff', //提示语背景颜色 + //坐标轴边距设置 + gridLeft: 20, //左边距 max:400 + gridTop: 50, //顶边距 max:400 + gridRight: 20, //右边距 max:400 + gridBottom: 20, //底边距 max:400 + //图例设置 + legendShow: true, //显示图例 + legendTextStyleFontSize: 14, //图例字体大小 + legendOrient: 'horizontal', //图例布局[horizontal,vertical] + legendLeft: 0, //图例上下边距 + legendTop: 0, //图例左右边距 + //自定义配色 + AxisTextStyleColor: '', //X、Y轴字体的颜色全局设置 + AxisLineStyleColor: '', //X、Y轴轴线颜色全局设置 + colorList: [], + //数据设置(系列) + barType: [], + target: '_self', + urlAddress: '', + }, + mappingConfig: [ + { field: '系列', value: '' }, + { field: '维度', value: '' }, + { field: '数值', value: '' }, + ], + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 8, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-generator-pie', + label: '饼图', + yunzhupaasKey: 'pieChart', + title: '饼图', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-pie', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: [], + roseType: false, + roseType1: false, + // 图表标题设置 + titleText: '', //主标题 + titleTextStyleColor: '#303133', //主标题字体颜色 + titleTextStyleFontSize: 18, //主标题字体大小[12-25px] + titleTextStyleFontWeight: false, //主标题是否加粗 + titleLeft: 'center', //主子标题位置[left,center,right] + titleBgColor: '', //主子标题背景色[rgba(),#303133] + // 图表副标题设置 + titleSubtext: '', //子标题 + titleSubtextStyleColor: '#303133', //子标题字体颜色 + titleSubtextStyleFontSize: 12, //子标题字体大小[12-25px] + titleSubtextStyleFontWeight: false, //子标题是否加粗 + //数值设置 + seriesLabelShow: true, //显示数值 + seriesLabelPosition: 'outside', + seriesLabelShowInfo: ['count', 'percent'], + seriesCenterLeft: 50, + seriesCenterTop: 50, + seriesLabelFontSize: 14, //数值大小 + seriesLabelFontWeight: false, //数值加粗 + seriesLabelColor: '#303133', //数值颜色 + seriesLabelBgColor: '', //数值背景色 + seriesLineStyleWidth: 2, + seriesSymbolRotate: 4, + //提示语设置 + tooltipShow: true, //提示语显示 + tooltipTextStyleFontSize: 14, //提示语字体大小 + tooltipTextStyleFontWeight: false, //提示语是否加粗 + tooltipTextStyleColor: '#303133', //提示语字体颜色 + tooltipBgColor: '#fff', //提示语背景颜色 + //坐标轴边距设置 + gridLeft: 20, //左边距 max:400 + gridTop: 50, //顶边距 max:400 + gridRight: 20, //右边距 max:400 + gridBottom: 20, //底边距 max:400 + //图例设置 + legendShow: true, //显示图例 + legendTextStyleFontSize: 14, //图例字体大小 + legendOrient: 'horizontal', //图例布局[horizontal,vertical] + legendLeft: 0, //图例上下边距 + legendTop: 0, //图例左右边距 + //自定义配色 + AxisTextStyleColor: '', //X、Y轴字体的颜色全局设置 + AxisLineStyleColor: '', //X、Y轴轴线颜色全局设置 + colorList: [], + target: '_self', + urlAddress: '', + }, + mappingConfig: [ + { field: '系列', value: '' }, + { field: '维度', value: '' }, + { field: '数值', value: '' }, + ], + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 8, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-generator-line', + label: '折线图', + yunzhupaasKey: 'lineChart', + title: '折线图', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-line', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: [], + areaStyle: false, + // 图表标题设置 + titleText: '', //主标题 + titleTextStyleColor: '#303133', //主标题字体颜色 + titleTextStyleFontSize: 18, //主标题字体大小[12-25px] + titleTextStyleFontWeight: false, //主标题是否加粗 + titleLeft: 'center', //主子标题位置[left,center,right] + titleBgColor: '', //主子标题背景色[rgba(),#303133] + // 图表副标题设置 + titleSubtext: '', //子标题 + titleSubtextStyleColor: '#303133', //子标题字体颜色 + titleSubtextStyleFontSize: 12, //子标题字体大小[12-25px] + titleSubtextStyleFontWeight: false, //子标题是否加粗 + // X轴设置 + xAxisName: '', //X轴名称 + xAxisNameTextStyleFontSize: 14, //X轴名称字体大小 + xAxisNameTextStyleColor: '#303133', //X轴名称字体颜色 + xAxisNameTextStyleFontWeight: false, //X轴名称是否加粗 + xAxisShow: true, //X轴是否显示 + category: 'category', //X轴类型[category,value] + xAxisAxisLineLineStyleColor: '#303133', //X轴线颜色 + xAxisAxisLabelRotate: 0, //X轴标签角度 + xAxisAxisLabelTextStyleFontSize: 14, //X轴标签字体大小 + xAxisAxisLabelTextStyleColor: '#303133', //X轴标签字体颜色 + xAxisAxisLabelTextFontWeight: false, //X轴标签是否加粗 + xAxisSplitLineShow: false, //X轴网格线 + xAxisSplitLineLineStyleColor: '#DFDFDF', //X轴网格线颜色 + xAxisInverse: false, //X轴反转 + // Y轴设置 + yAxisName: '', //Y轴名称 + yAxisNameTextStyleFontSize: 14, //Y轴名称字体大小 + yAxisNameTextStyleColor: '#303133', //Y轴名称字体颜色 + yAxisNameTextStyleFontWeight: false, //Y轴名称是否加粗 + yAxisShow: true, //Y轴是否显示 + yAxisAxisLineLineStyleColor: '#303133', //Y轴颜色 + yAxisSplitLineShow: true, //Y轴网格线 + yAxisSplitLineLineStyleColor: '#DFDFDF', //Y轴网格线颜色 + yAxisAxisLabelTextStyleFontSize: 14, //Y轴标签字体大小 + yAxisAxisLabelTextStyleColor: '#303133', //Y轴标签字体颜色 + yAxisAxisLabelTextFontWeight: false, //Y轴标签是否加粗 + //数值设置 + seriesLabelShow: true, //显示数值 + seriesLabelFontSize: 14, //数值大小 + seriesLabelFontWeight: false, //数值加粗 + seriesLabelColor: '#303133', //数值颜色 + seriesLabelBgColor: '', //数值背景色 + seriesLineStyleWidth: 2, + seriesSymbolRotate: 4, + //提示语设置 + tooltipShow: true, //提示语显示 + tooltipTextStyleFontSize: 14, //提示语字体大小 + tooltipTextStyleFontWeight: false, //提示语是否加粗 + tooltipTextStyleColor: '#303133', //提示语字体颜色 + tooltipBgColor: '#fff', //提示语背景颜色 + //坐标轴边距设置 + gridLeft: 20, //左边距 max:400 + gridTop: 50, //顶边距 max:400 + gridRight: 20, //右边距 max:400 + gridBottom: 20, //底边距 max:400 + //图例设置 + legendShow: true, //显示图例 + legendTextStyleFontSize: 14, //图例字体大小 + legendOrient: 'horizontal', //图例布局[horizontal,vertical] + legendLeft: 0, //图例上下边距 + legendTop: 0, //图例左右边距 + //自定义配色 + AxisTextStyleColor: '', //X、Y轴字体的颜色全局设置 + AxisLineStyleColor: '', //X、Y轴轴线颜色全局设置 + colorList: [], + target: '_self', + urlAddress: '', + }, + mappingConfig: [ + { field: '系列', value: '' }, + { field: '维度', value: '' }, + { field: '数值', value: '' }, + ], + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 8, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-generator-radar', //'icon-ym icon-ym-generator-annular', + label: '雷达图', + yunzhupaasKey: 'radarChart', + title: '雷达图', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-radar', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: [], + radarAxisNameFontWeight: false, + radarAxisNameFontSize: 14, + radarAxisNameColor: '#303133', + seriesAreaStyleOpacity: 0.3, + radarCenterLeft: 50, + radarCenterTop: 50, + // 图表标题设置 + titleText: '', //主标题 + titleTextStyleColor: '#303133', //主标题字体颜色 + titleTextStyleFontSize: 18, //主标题字体大小[12-25px] + titleTextStyleFontWeight: false, //主标题是否加粗 + titleLeft: 'center', //主子标题位置[left,center,right] + titleBgColor: '', //主子标题背景色[rgba(),#303133] + // 图表副标题设置 + titleSubtext: '', //子标题 + titleSubtextStyleColor: '#303133', //子标题字体颜色 + titleSubtextStyleFontSize: 12, //子标题字体大小[12-25px] + titleSubtextStyleFontWeight: false, //子标题是否加粗 + //数值设置 + seriesLabelShow: true, //显示数值 + seriesLabelFontSize: 14, //数值大小 + seriesLabelFontWeight: false, //数值加粗 + seriesLabelColor: '#303133', //数值颜色 + seriesLabelBgColor: '', //数值背景色 + seriesLineStyleWidth: 2, + seriesSymbolRotate: 4, + //提示语设置 + tooltipShow: true, //提示语显示 + tooltipTextStyleFontSize: 14, //提示语字体大小 + tooltipTextStyleFontWeight: false, //提示语是否加粗 + tooltipTextStyleColor: '#303133', //提示语字体颜色 + tooltipBgColor: '#fff', //提示语背景颜色 + //坐标轴边距设置 + gridLeft: 20, //左边距 max:400 + gridTop: 50, //顶边距 max:400 + gridRight: 20, //右边距 max:400 + gridBottom: 20, //底边距 max:400 + //图例设置 + legendShow: true, //显示图例 + legendTextStyleFontSize: 14, //图例字体大小 + legendOrient: 'horizontal', //图例布局[horizontal,vertical] + legendLeft: 0, //图例上下边距 + legendTop: 0, //图例左右边距 + //自定义配色 + AxisTextStyleColor: '', //X、Y轴字体的颜色全局设置 + AxisLineStyleColor: '', //X、Y轴轴线颜色全局设置 + colorList: [], + target: '_self', + urlAddress: '', + }, + mappingConfig: [ + { field: '系列', value: '' }, + { field: '维度', value: '' }, + { field: '数值', value: '' }, + { field: '最大值', value: '' }, + ], + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 8, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-portal-timeAxis', + label: '时间轴', + yunzhupaasKey: 'timeAxis', + title: '时间轴', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-timeAxis', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: [], + layout: 1, + sortable: 1, + showNumber: undefined, + appShowNumber: undefined, + target: '_self', + urlAddress: '', + }, + mappingConfig: [ + { field: '内容', value: '' }, + { field: '时间戳', value: '' }, + ], + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 8, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-portal-rankList', + label: '排行榜', + yunzhupaasKey: 'rankList', + title: '排行榜', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-rankList', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: [], + columnOptions: [ + { label: '部门', value: 'label' }, + { label: '金额', value: 'value' }, + ], + target: '_self', + urlAddress: '', + }, + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 4, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-generator-area', + label: '地图', + yunzhupaasKey: 'mapChart', + title: '地图', + renderKey: '', + visibility: ['pc'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-generator-area', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: { + styleType: 1, + defaultValue: [], + mapType: ['100000'], + mspScale: 1, + bgColor: '', + geoAreaColor: '#eee', //区域颜色 + geoBorderColor: '#606266', //描边线颜色 + geoBorderWidth: 1, //描边线 0 不显示 + geoLabelShow: false, //区域名称 + geoLabelColor: '#303133', //区域颜色 + geoLabelFontWeight: false, //区域加粗 + geoLabelFontSize: 14, //区域字体 + geoShadowOffset: 0, //阴影大小 + geoShadowColor: '#000', //阴影颜色 + geoRoam: true, //缩放 + geoAspectScale: 0.75, //地图长宽比 + drillDown: true, //是否下钻 + drillDownFontSize: 14, + drillDownFontWeight: false, + drillDownColor: '#303133', + // 图表标题设置 + titleText: '', //主标题 + titleTextStyleColor: '#303133', //主标题字体颜色 + titleTextStyleFontSize: 18, //主标题字体大小[12-25px] + titleTextStyleFontWeight: false, //主标题是否加粗 + titleLeft: 'center', //主子标题位置[left,center,right] + titleBgColor: '', //主子标题背景色[rgba(),#303133] + // 图表副标题设置 + titleSubtext: '', //子标题 + titleSubtextStyleColor: '#303133', //子标题字体颜色 + titleSubtextStyleFontSize: 12, //子标题字体大小[12-25px] + titleSubtextStyleFontWeight: false, //子标题是否加粗 + //提示语设置 + tooltipShow: true, //提示语显示 + tooltipTextStyleFontSize: 14, //提示语字体大小 + tooltipTextStyleFontWeight: false, //提示语是否加粗 + tooltipTextStyleColor: '#303133', //提示语字体颜色 + tooltipBgColor: '#fff', //提示语背景颜色 + //坐标轴边距设置 + seriesCenterLeft: 50, //左边距 + seriesCenterTop: 50, //右边距 + seriesItemStyleOpacity: 1, //散点透明度 + seriesType: 'effectScatter', //散点类型 + seriesPointSize: 20, //热力图点的大小 + seriesBlurSize: 20, //热力图点的模糊大小 + seriesMaxOpacity: 1, //热力图最大透明度 + showNumber: undefined, //数据显示数量 + appShowNumber: undefined, //app数据显示数量 + autoCarousel: true, //自动轮播 + autoCarouselTime: 3000, //自动轮播时间 + visualMapType: 'continuous', //continuous:连续型视觉 piecewise:分段型视觉 + visualMapMin: 0, //最小值 + visualMapMax: 200, //最大值 + // 柱体设置 + seriesBarWidth: 30, //柱体宽度 + seriesItemStyleBarBorderRadius: 0, //柱体圆角 + //柱体排名 + barTitleText: '数据统计排名', + barTitleTextStyleFontSize: '14', + barTitleTextStyleFontWeight: false, + barTitleTextStyleColor: '#303133', + berGridTop: 35, //顶边距 + berGridRight: 10, //右边距 + berGridBottom: 180, //底边距 + updateMapType: '', + target: '_self', + urlAddress: '', + }, + mappingConfig: [ + { field: '维度', value: '' }, + { field: '数值', value: '' }, + { field: '经度', value: '' }, + { field: '纬度', value: '' }, + ], + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 4, + maxW: 12, + maxH: 20, + }, + { + icon: 'icon-ym icon-ym-portal-custom-echart', + label: '自定义echart', + yunzhupaasKey: 'customEcharts', + title: '自定义echart', + renderKey: '', + visibility: ['pc', 'app'], + card: { + titleFontSize: 14, + titleFontWeight: false, + titleFontColor: '#303133', + titleLeft: 'left', + titleBgColor: '', + cardIcon: 'icon-ym icon-ym-portal-custom-echart', + cardIconColor: '#606266', + linkType: '', + type: '', + moduleId: '', + urlAddress: '', + linkTarget: '_self', + appLinkType: '', + appType: '', + appModuleId: '', + appUrlAddress: '', + }, + dataType: 'static', + propsApi: '', + option: '', + refresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + appDataType: 'static', + appPropsApi: '', + appPropsName: '', + appTemplateJson: {}, + appOption: '', + appRefresh: { + autoRefresh: false, + autoRefreshTime: 5, + }, + w: 6, + h: 8, + minW: 1, + minH: 8, + maxW: 12, + maxH: 20, + }, +]; diff --git a/src/components/VisualPortal/Design/helper/dataMap.ts b/src/components/VisualPortal/Design/helper/dataMap.ts new file mode 100644 index 0000000..e0d0534 --- /dev/null +++ b/src/components/VisualPortal/Design/helper/dataMap.ts @@ -0,0 +1,770 @@ +export const chartData = { + baseBarData: [ + { + name: '苹果', + type: '手机品牌', + value: 1000879, + }, + { + name: '三星', + type: '手机品牌', + value: 3400879, + }, + { + name: '小米', + type: '手机品牌', + value: 2300879, + }, + { + name: 'oppo', + type: '手机品牌', + value: 5400879, + }, + { + name: 'vivo', + type: '手机品牌', + value: 3400879, + }, + ], + mulBarData: [ + { + name: '1991', + value: 3, + type: 'Lon', + }, + { + name: '1992', + value: 4, + type: 'Lon', + }, + { + name: '1993', + value: 3.5, + type: 'Lon', + }, + { + name: '1994', + value: 5, + type: 'Lon', + }, + { + name: '1995', + value: 4.9, + type: 'Lon', + }, + { + name: '1996', + value: 6, + type: 'Lon', + }, + { + name: '1997', + value: 7, + type: 'Lon', + }, + { + name: '1998', + value: 9, + type: 'Lon', + }, + { + name: '1999', + value: 13, + type: 'Lon', + }, + { + name: '1991', + value: 3, + type: 'Bor', + }, + { + name: '1992', + value: 4, + type: 'Bor', + }, + { + name: '1993', + value: 3.5, + type: 'Bor', + }, + { + name: '1994', + value: 5, + type: 'Bor', + }, + { + name: '1995', + value: 4.9, + type: 'Bor', + }, + { + name: '1996', + value: 6, + type: 'Bor', + }, + { + name: '1997', + value: 7, + type: 'Bor', + }, + { + name: '1998', + value: 9, + type: 'Bor', + }, + { + name: '1999', + value: 13, + type: 'Bor', + }, + ], + plusMinusBarData: [ + { + name: '周一', + value: 200, + type: '利润', + }, + { + name: '周二', + value: 170, + type: '利润', + }, + { + name: '周三', + value: 240, + type: '利润', + }, + { + name: '周四', + value: 244, + type: '利润', + }, + { + name: '周五', + value: 200, + type: '利润', + }, + { + name: '周六', + value: 220, + type: '利润', + }, + { + name: '周日', + value: 210, + type: '利润', + }, + { + name: '周一', + value: 320, + type: '收入', + }, + { + name: '周二', + value: 302, + type: '收入', + }, + { + name: '周三', + value: 341, + type: '收入', + }, + { + name: '周四', + value: 374, + type: '收入', + }, + { + name: '周五', + value: 390, + type: '收入', + }, + { + name: '周六', + value: 450, + type: '收入', + }, + { + name: '周日', + value: 420, + type: '收入', + }, + { + name: '周一', + value: -120, + type: '支出', + }, + { + name: '周二', + value: -132, + type: '支出', + }, + { + name: '周三', + value: -101, + type: '支出', + }, + { + name: '周四', + value: -134, + type: '支出', + }, + { + name: '周五', + value: -190, + type: '支出', + }, + { + name: '周六', + value: -230, + type: '支出', + }, + { + name: '周日', + value: -210, + type: '支出', + }, + ], + brokenColumnBarData: [ + { + name: '1991', + value: 110, + type: '降水量', + }, + { + name: '1992', + value: 130, + type: '降水量', + }, + { + name: '1993', + value: 113.5, + type: '降水量', + }, + { + name: '1994', + value: 150, + type: '降水量', + }, + { + name: '1995', + value: 240.9, + type: '降水量', + }, + { + name: '1996', + value: 160, + type: '降水量', + }, + { + name: '1997', + value: 97, + type: '降水量', + }, + { + name: '1998', + value: 290, + type: '降水量', + }, + { + name: '1999', + value: 230, + type: '降水量', + }, + { + name: '1991', + value: 33, + type: '温度', + }, + { + name: '1992', + value: 35, + type: '温度', + }, + { + name: '1993', + value: 37, + type: '温度', + }, + { + name: '1994', + value: 35, + type: '温度', + }, + { + name: '1995', + value: 34.9, + type: '温度', + }, + { + name: '1996', + value: 36, + type: '温度', + }, + { + name: '1997', + value: 37, + type: '温度', + }, + { + name: '1998', + value: 39, + type: '温度', + }, + { + name: '1999', + value: 33, + type: '温度', + }, + ], + radarData: [ + { + value: 75, + name: '得分', + type: 'NBA', + max: 100, + }, + { + value: 65, + name: '篮板', + type: 'NBA', + max: 100, + }, + { + value: 55, + name: '防守', + type: 'NBA', + max: 100, + }, + { + value: 74, + name: '失误', + type: 'NBA', + max: 100, + }, + { + value: 38, + name: '盖帽', + type: 'NBA', + max: 100, + }, + { + value: 88, + name: '三分', + type: 'NBA', + max: 100, + }, + { + value: 35, + name: '得分', + type: 'CBA', + max: 100, + }, + { + value: 62, + name: '篮板', + type: 'CBA', + max: 100, + }, + { + value: 44, + name: '防守', + type: 'CBA', + max: 100, + }, + { + value: 66, + name: '失误', + type: 'CBA', + max: 100, + }, + { + value: 28, + name: '盖帽', + type: 'CBA', + max: 100, + }, + { + value: 58, + name: '三分', + type: 'CBA', + max: 100, + }, + ], + customEchartsData: { + color: ['#5470C6', '#91CC75', '#EE6666'], + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'cross', + }, + }, + grid: { + right: '20%', + }, + legend: { + data: ['Evaporation', 'Precipitation', 'Temperature'], + }, + xAxis: [ + { + type: 'category', + axisTick: { + alignWithLabel: true, + }, + // prettier-ignore + data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + }, + ], + yAxis: [ + { + type: 'value', + name: 'Evaporation', + position: 'right', + alignTicks: true, + axisLine: { + show: true, + lineStyle: { + color: '#5470C6', + }, + }, + axisLabel: { + formatter: '{value} ml', + }, + }, + { + type: 'value', + name: 'Precipitation', + position: 'right', + alignTicks: true, + offset: 80, + axisLine: { + show: true, + lineStyle: { + color: '#91CC75', + }, + }, + axisLabel: { + formatter: '{value} ml', + }, + }, + { + type: 'value', + name: '温度', + position: 'left', + alignTicks: true, + axisLine: { + show: true, + lineStyle: { + color: '#EE6666', + }, + }, + axisLabel: { + formatter: '{value} °C', + }, + }, + ], + series: [ + { + name: 'Evaporation', + type: 'bar', + data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3], + }, + { + name: 'Precipitation', + type: 'bar', + yAxisIndex: 1, + data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3], + }, + { + name: 'Temperature', + type: 'line', + yAxisIndex: 2, + data: [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2], + }, + ], + }, + customAppEchartsData: { + type: 'column', + opts: { + color: ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'], + padding: [15, 15, 0, 5], + enableScroll: false, + legend: {}, + xAxis: { + disableGrid: true, + }, + yAxis: { + data: [ + { + min: 0, + }, + ], + }, + extra: { + column: { + type: 'group', + width: 30, + activeBgColor: '#000000', + activeBgOpacity: 0.08, + }, + }, + }, + chartData: { + categories: ['2018', '2019', '2020', '2021', '2022', '2023'], + series: [ + { + name: '目标值', + data: [35, 36, 31, 33, 13, 34], + }, + { + name: '完成量', + data: [18, 27, 21, 24, 6, 28], + }, + ], + }, + }, +}; + +export const rankList = [ + { + label: '北京-销售部', + value: '¥ 895560880', + }, + { + label: '上海-销售部', + value: '¥ 829546160', + }, + { + label: '深圳-销售部', + value: '¥ 46564535', + }, + { + label: '厦门-销售部', + value: '¥ 146564535', + }, + { + label: '广州-销售部', + value: '¥ 125264330', + }, +]; + +export const timeAxisList = [ + { + timestamp: '2012-04-12 08:46', + content: '节点发起', + }, + { + timestamp: '2012-04-12 10:10', + content: '节点加签', + }, + { + timestamp: '2012-04-12 11:46', + content: '节点审批', + }, + { + timestamp: '2012-04-12 13:20', + content: '结束', + }, +]; +export const tableList = [ + { + inputField101: '01', + inputField102: 'xx门店', + inputField103: '2598元', + inputField104: '85%', + inputField105: '2012-04-12 08:46', + }, + { + inputField101: '02', + inputField102: 'xx门店', + inputField103: '2598元', + inputField104: '85%', + inputField105: '2012-04-12 08:46', + }, + { + inputField101: '03', + inputField102: 'xx门店', + inputField103: '2598元', + inputField104: '85%', + inputField105: '2012-04-12 08:46', + }, + { + inputField101: '04', + inputField102: 'xx门店', + inputField103: '2598元', + inputField104: '85%', + inputField105: '2012-04-12 08:46', + }, + { + inputField101: '05', + inputField102: 'xx门店', + inputField103: '2598元', + inputField104: '85%', + inputField105: '2012-04-12 08:46', + }, +]; + +export const mapChartData = [ + { name: '北京市', value: 190, long: 116.46, lat: 39.92 }, + { name: '上海市', value: 180, long: 121.48, lat: 31.22 }, + { name: '成都市', value: 90, long: 104.06, lat: 30.65 }, + { name: '深圳市', value: 120, long: 114.07, lat: 22.62 }, + { name: '厦门市', value: 80, long: 118.11, lat: 24.49 }, +]; +//四个基础图表控件 +export const chartList = ['barChart', 'lineChart', 'pieChart', 'radarChart']; +//系统控件 +export const systemList = ['notice', 'email', 'todoList']; +//布局控件 +export const layoutList = ['card', 'tab', 'collapse']; +//是否需要数据设置控件 +export const needDataSetList = ['rankList', 'timeAxis', 'mapChart', ...chartList]; +//是否需要跳转设置控件 +export const needJumpSetList = ['tableList', 'rankList', 'timeAxis', 'mapChart', ...chartList]; + +//是否需要分格类型 +export const noStyleTypeList = ['text', 'image', 'carousel', 'video', 'iframe', 'todo', 'commonFunc', 'dataBoard', 'tableList', 'customEcharts', ...layoutList]; + +//是否需要mask层控件 +export const noNeedMaskList = [ + 'text', + 'image', + 'carousel', + 'video', + 'iframe', + 'rankList', + 'timeAxis', + 'tableList', + 'mapChart', + 'customEcharts', + ...layoutList, + ...chartList, +]; + +export const needDefaultList = ['text', 'image', 'video', 'rankList', 'timeAxis', 'tableList', 'mapChart', ...chartList]; + +export const alignList = [ + { fullName: '左对齐', id: 'left' }, + { fullName: '居中对齐', id: 'center' }, + { fullName: '右对齐', id: 'right' }, +]; +export const underLineList = [ + { fullName: '无', id: 'none' }, + { fullName: '下划线', id: 'underline' }, + { fullName: '删除线', id: 'line-through' }, +]; +export const linkTypeList = [ + { fullName: '菜单', id: '1' }, + { fullName: '外链', id: '2' }, +]; +export const directionList = [ + { fullName: '横向', id: 'horizontal' }, + { fullName: '纵向', id: 'vertical' }, +]; +export const indicatorPositionList = [ + { label: '无', title: '无', id: 'none' }, + { label: '底部', title: '右侧', id: 'bottomRight' }, + { label: '顶部', title: '左侧', id: 'topLeft' }, +]; +export const arrowList = [ + { fullName: '无', id: 'never' }, + { fullName: '悬停', id: 'hover' }, + { fullName: '始终', id: 'always' }, +]; +export const fillStyleList = [ + { fullName: '适应', id: 'contain' }, + { fullName: '填充', id: 'cover' }, + { fullName: '拉伸', id: 'fill' }, +]; +export const playNumberList = [ + { fullName: '播放一次', id: 1 }, + { fullName: '循环播放', id: 2 }, +]; +export const barStyleList = [ + { fullName: '基础', id: 1 }, + { fullName: '堆叠', id: 2 }, + { fullName: '背景', id: 4 }, + { fullName: '对比', id: 5 }, + { fullName: '正负条', id: 6 }, + { fullName: '折柱图', id: 7 }, +]; +export const lineStyleList = [ + { fullName: '基础', id: 1 }, + { fullName: '平滑', id: 2 }, + { fullName: '阶梯', id: 3 }, + { fullName: '堆叠', id: 4 }, +]; +export const pieStyleList = [ + { fullName: '饼图', id: 1 }, + { fullName: '环形', id: 2 }, +]; +export const radarStyleList = [ + { fullName: '基础', id: 1 }, + { fullName: '圆形', id: 2 }, +]; +export const rankStyleList = [ + { fullName: '基础', id: 1 }, + { fullName: '勋章', id: 2 }, + { fullName: '奖杯', id: 3 }, + { fullName: '奖牌', id: 4 }, +]; +export const timeStyleList = [ + { fullName: '基础', id: 1 }, + { fullName: '卡片', id: 2 }, +]; +export const layoutStyleList = [ + { fullName: '纵向-左右交错', id: 1 }, + { fullName: '纵向-右左交错', id: 2 }, + { fullName: '纵向-轴左侧', id: 3 }, + { fullName: '纵向-轴右侧', id: 4 }, + { fullName: '横向-上下交错', id: 5 }, + { fullName: '横向-下上交错', id: 6 }, + { fullName: '横向-轴上侧', id: 7 }, + { fullName: '横向-轴下侧', id: 8 }, +]; +export const appLayoutStyleList = [ + { fullName: '纵向-轴左侧', id: 1 }, + { fullName: '纵向-轴右侧', id: 2 }, + { fullName: '横向-轴上侧', id: 3 }, + { fullName: '横向-轴下侧', id: 4 }, +]; +export const sortList = [ + { fullName: '升序', id: 1 }, + { fullName: '降序', id: 2 }, +]; +export const textStyleList = [ + { fullName: '文本', id: 1 }, + { fullName: 'HTML', id: 2 }, +]; +export const imageStyleList = [ + { fullName: '本地上传', id: 1 }, + { fullName: 'URL路径', id: 2 }, + { fullName: '数据接口', id: 3 }, +]; +export const videoStyleList = [ + { fullName: '本地上传', id: 1 }, + { fullName: 'URL路径', id: 2 }, + { fullName: '数据接口', id: 3 }, +]; +export const mapStyleList = [ + { fullName: '散点', id: 1 }, + { fullName: '热力', id: 2 }, + { fullName: '柱形', id: 3 }, + { fullName: '柱形排名', id: 4 }, +]; +export const appTodoStyleList = [ + { fullName: '横向滚动', id: 1 }, + { fullName: '全部展示', id: 2 }, +]; +export const commonFuncStyleList = [ + { fullName: '顶部', id: 1 }, + { fullName: '靠左', id: 2 }, +]; +export const dataTypeList = [ + { fullName: '静态数据', id: 'static' }, + { fullName: '数据接口', id: 'dynamic' }, +]; +export const typeList: any[] = [ + { fullName: '_self', id: '_self' }, + { fullName: '_blank', id: '_blank' }, +]; diff --git a/src/components/VisualPortal/Design/hooks/useCommon.ts b/src/components/VisualPortal/Design/hooks/useCommon.ts new file mode 100644 index 0000000..5bbf677 --- /dev/null +++ b/src/components/VisualPortal/Design/hooks/useCommon.ts @@ -0,0 +1,162 @@ +import CardHeader from '../../Portal/CardHeader/index.vue'; +import webLink from '../../Portal/Link/index.vue'; +import { getDataInterfaceRes } from '@/api/systemData/dataInterface'; +import { computed, onMounted, reactive, toRefs, unref, watch } from 'vue'; +import { useGlobSetting } from '@/hooks/setting'; +import { getParamList } from '@/utils/yunzhupaas'; + +export function useCommon(activeData) { + interface State { + firstData: any; + secondData: any; + thirdData: any; + otherDataList: any[]; + value: string; + list: any[]; + timeList: any[]; + } + + const state = reactive({ + firstData: {}, + secondData: {}, + thirdData: {}, + otherDataList: [], + value: '', + list: [], + timeList: [], + }); + const { firstData, secondData, thirdData, otherDataList, value, list, timeList } = toRefs(state); + const arrayList: any[] = ['carousel', 'rankList', 'timeAxis']; + const globSetting = useGlobSetting(); + + const getOption = computed(() => activeData.option); + const getYunzhupaasKey = computed(() => activeData.yunzhupaasKey); + + watch( + () => unref(getOption).styleType, + val => { + if (unref(getYunzhupaasKey) == 'rankList' && (val == 3 || val == 4)) handleRankList(); + }, + ); + watch( + () => activeData.dataType, + () => { + if (arrayList.includes(unref(getYunzhupaasKey))) { + getOption.value.defaultValue = []; + state.list = []; + } + }, + ); + watch( + () => unref(getOption).defaultValue, + val => { + if (arrayList.includes(unref(getYunzhupaasKey))) { + state.list = JSON.parse(JSON.stringify(val)); + } else { + state.value = JSON.parse(JSON.stringify(val)); + } + if (unref(getYunzhupaasKey) == 'rankList' && (getOption.value.styleType == 3 || getOption.value.styleType == 4)) handleRankList(); + if (unref(getYunzhupaasKey) == 'timeAxis') handleTimeAxis(); + if (unref(getYunzhupaasKey) == 'video' && getOption.value.styleType == 1 && val.url) state.value = globSetting.apiUrl + val.url; + }, + { immediate: true, deep: true }, + ); + watch( + () => unref(getOption).sortable, + () => handleTimeAxis(), + ); + watch( + () => unref(getOption).showNumber, + () => handleTimeAxis(), + ); + watch( + () => activeData.propsApi, + val => { + if (activeData.dataType === 'static' || !val) return; + state.list = []; + state.value = ''; + const query = { paramList: getParamList(activeData.templateJson) }; + getDataInterfaceRes(val, query).then(res => { + if (arrayList.includes(unref(getYunzhupaasKey))) { + if (Array.isArray(res.data)) state.list = res.data; + if (unref(getYunzhupaasKey) == 'rankList' && (unref(getOption).styleType == 3 || unref(getOption).styleType == 4)) handleRankList(); + if (unref(getYunzhupaasKey) == 'timeAxis') handleTimeAxis(); + } else { + state.value = res.data; + } + }); + }, + ); + watch( + () => activeData.mappingConfig, + () => { + handleTimeAxis(); + }, + { deep: true }, + ); + + function initData() { + if (activeData.dataType === 'dynamic') { + const propsApi = activeData.propsApi; + if (!propsApi) return; + const query = { paramList: getParamList(activeData.templateJson) }; + getDataInterfaceRes(propsApi, query).then(res => { + handleData(res.data); + }); + } else { + handleData(activeData.option.defaultValue); + } + } + function mappingConfig() { + let optionData = JSON.parse(JSON.stringify(state.list)) || []; + if (!activeData.mappingConfig || activeData.dataType === 'static') return optionData; + if (activeData.yunzhupaasKey == 'timeAxis') + return optionData.map(o => ({ + content: o[activeData.mappingConfig[0].value ? activeData.mappingConfig[0].value : 'content'], + timestamp: o[activeData.mappingConfig[1].value ? activeData.mappingConfig[1].value : 'timestamp'], + })); + } + function handleData(val) { + const option = activeData.option; + if (arrayList.includes(unref(getYunzhupaasKey))) { + state.list = JSON.parse(JSON.stringify(val)); + } else { + state.value = JSON.parse(JSON.stringify(val)); + } + if (unref(getYunzhupaasKey) == 'rankList' && (option.styleType == 3 || option.styleType == 4)) handleRankList(); + if (unref(getYunzhupaasKey) == 'timeAxis') handleTimeAxis(); + if (unref(getYunzhupaasKey) == 'video' && option.styleType == 1 && val.url) state.value = globSetting.apiUrl + val.url; + } + function handleRankList() { + state.firstData = {}; + state.secondData = {}; + state.thirdData = {}; + state.otherDataList = []; + if (state.list && state.list.length) state.firstData = state.list[0]; + if (state.list && state.list.length && state.list.length >= 2) state.secondData = state.list[1]; + if (state.list && state.list.length && state.list.length >= 3) state.thirdData = state.list[2]; + state.otherDataList = JSON.parse(JSON.stringify(state.list)).slice(3, state.list.length); + } + function handleTimeAxis() { + const showNumber = unref(getOption).showNumber || 50; + let mappingConfigList = mappingConfig(); + const list = mappingConfigList.slice(0, showNumber); + state.timeList = JSON.parse(JSON.stringify(list)); + if (activeData.option.sortable == 2) state.timeList.reverse(); + } + + onMounted(() => initData()); + + return { + CardHeader, + webLink, + getOption, + value, + list, + firstData, + secondData, + thirdData, + otherDataList, + timeList, + }; +} diff --git a/src/components/VisualPortal/Design/hooks/useEChart.ts b/src/components/VisualPortal/Design/hooks/useEChart.ts new file mode 100644 index 0000000..5170061 --- /dev/null +++ b/src/components/VisualPortal/Design/hooks/useEChart.ts @@ -0,0 +1,472 @@ +import CardHeader from '../../Portal/CardHeader/index.vue'; +import * as echarts from 'echarts'; +import { getDataInterfaceRes } from '@/api/systemData/dataInterface'; +import { reactive, toRefs, watch, Ref, inject, nextTick } from 'vue'; +import { chartData as defaultChartData } from '../helper/dataMap'; +import { useECharts } from '@/hooks/web/useECharts'; +import { getParamList } from '@/utils/yunzhupaas'; +import { useGo } from '@/hooks/web/usePage'; +import { encryptByBase64 } from '@/utils/cipher'; + +export function useEChart(activeData, chartRef) { + interface State { + currOption: any; + chartData: any[]; + } + const state = reactive({ + currOption: {}, + chartData: [], + }); + const { chartData, currOption } = toRefs(state); + const { setOptions, resize } = useECharts(chartRef as Ref, undefined, handleClick); + const emitter: any = inject('emitter'); + const go = useGo(); + + watch( + () => activeData.option, + () => { + initChartData(); + }, + { deep: true }, + ); + watch( + () => activeData.dataType, + val => { + activeData.option.defaultValue = []; + state.chartData = []; + if (val == 'static') initStaticData(activeData.option.styleType); + initBarType(); + }, + { deep: true }, + ); + watch( + () => activeData.option.styleType, + val => { + if (activeData.dataType == 'static') initStaticData(val); + initBarType(); + }, + ); + watch( + () => activeData.option.defaultValue, + val => { + if (activeData.dataType !== 'static') return; + setTimeout(() => { + state.chartData = val; + initChartData(); + initBarType(); + }, 0); + }, + ); + watch( + () => activeData.propsApi, + val => { + if (activeData.dataType === 'static' || !val) return; + const query = { paramList: getParamList(activeData.templateJson) }; + getDataInterfaceRes(val, query).then(res => { + state.chartData = res.data; + initChartData(); + initBarType(); + }); + }, + ); + watch( + () => activeData.mappingConfig, + () => { + initChartData(); + }, + { deep: true }, + ); + + function init() { + if (activeData.dataType === 'dynamic') { + if (!activeData.propsApi) return (state.chartData = []); + const query = { paramList: getParamList(activeData.templateJson) }; + getDataInterfaceRes(activeData.propsApi, query).then(res => { + state.chartData = res.data; + initChartData(); + }); + } else { + setTimeout(() => { + state.chartData = activeData.option.defaultValue; + initChartData(); + }, 0); + } + emitter.on('eChart' + activeData.i, () => { + nextTick(() => resize()); + }); + } + function mappingConfig() { + let optionData = JSON.parse(JSON.stringify(state.chartData)) || []; + if (!activeData.mappingConfig || activeData.dataType === 'static') return optionData; + if (['barChart', 'pieChart', 'lineChart'].includes(activeData.yunzhupaasKey)) + return optionData.map(o => ({ + type: o[activeData.mappingConfig[0].value ? activeData.mappingConfig[0].value : 'type'], + name: o[activeData.mappingConfig[1].value ? activeData.mappingConfig[1].value : 'name'], + value: o[activeData.mappingConfig[2].value ? activeData.mappingConfig[2].value : 'value'], + })); + if (activeData.yunzhupaasKey == 'radarChart') + return optionData.map(o => ({ + type: o[activeData.mappingConfig[0].value ? activeData.mappingConfig[0].value : 'type'], + name: o[activeData.mappingConfig[1].value ? activeData.mappingConfig[1].value : 'name'], + value: o[activeData.mappingConfig[2].value ? activeData.mappingConfig[2].value : 'value'], + max: o[activeData.mappingConfig[3].value ? activeData.mappingConfig[3].value : 'max'], + })); + } + function initChartData() { + const yunzhupaasKey = activeData.yunzhupaasKey; + const styleType = activeData.option.styleType; + const option = activeData.option; + const optionData = mappingConfig(); + let typeArr = Array.from(new Set(optionData.map(item => item.type))); + let axisData = Array.from(new Set(optionData.map(item => item.name))); + let seriesData: any[] = []; + typeArr.forEach((title, index) => { + const type = getType(title); + let obj = { + name: title, + type: type, + stack: styleType == 5 || styleType == 6 || styleType == 7 || (styleType != 4 && yunzhupaasKey == 'lineChart') ? title : 'total', + }; + let chartArr = optionData.filter(item => title === item.type); + if (yunzhupaasKey == 'pieChart') { + obj['data'] = chartArr.map(item => { + return { + value: item.value, + name: item.name, + }; + }); + if (option.sortable) getPieData(obj['data']); + if (option.showYunzhupaas) obj['data'] = obj['data'].filter(item => item.value != 0); + } else if (yunzhupaasKey == 'radarChart') { + const typeList = chartArr.map(item => item.type); + const element = { + value: chartArr.map(item => item.value), + name: typeList && typeList.length ? typeList[0] : '', + areaStyle: { + color: getColor(index), + opacity: option.seriesAreaStyleOpacity, + }, + }; + obj['data'] = [element]; + obj['colorBy'] = 'series'; + } else { + obj['data'] = chartArr.map(item => item.value); + } + seriesData.push(obj); + }); + let xAxis: any = { + type: option.category == 'category' ? 'category' : 'value', + show: option.xAxisShow, + inverse: option.xAxisInverse, + data: axisData, + name: option.xAxisName, + nameTextStyle: { + color: option.xAxisNameTextStyleColor, + fontSize: option.xAxisNameTextStyleFontSize, + fontWeight: option.xAxisNameTextStyleFontWeight ? 'bolder' : '', + }, + splitLine: { + show: option.xAxisSplitLineShow, + lineStyle: { + color: option.xAxisSplitLineLineStyleColor, + }, + }, + axisLabel: { + rotate: option.xAxisAxisLabelRotate, + color: option.AxisTextStyleColor ? option.AxisTextStyleColor : option.xAxisAxisLabelTextStyleColor, + fontSize: option.xAxisAxisLabelTextStyleFontSize, + fontWeight: option.xAxisAxisLabelTextFontWeight ? 'bolder' : '', + }, + axisLine: { + show: option.xAxisShow, + lineStyle: { + color: option.AxisLineStyleColor ? option.AxisLineStyleColor : option.xAxisAxisLineLineStyleColor, + }, + }, + }; + let yAxis = [ + { + type: option.category == 'category' ? 'value' : 'category', + show: option.yAxisShow, + inverse: option.yAxisInverse, + data: axisData, + name: option.yAxisName, + nameTextStyle: { + color: option.yAxisNameTextStyleColor, + fontSize: option.yAxisNameTextStyleFontSize, + fontWeight: option.yAxisNameTextStyleFontWeight ? 'bolder' : '', + }, + splitLine: { + show: option.yAxisSplitLineShow, + lineStyle: { + color: option.yAxisSplitLineLineStyleColor, + }, + }, + axisLabel: { + interval: option.yAxisAxisLabelInterval, + rotate: option.yAxisAxisLabelRotate, + color: option.AxisTextStyleColor ? option.AxisTextStyleColor : option.yAxisAxisLabelTextStyleColor, + fontSize: option.yAxisAxisLabelTextStyleFontSize, + fontWeight: option.yAxisAxisLabelTextFontWeight ? 'bolder' : '', + }, + axisLine: { + show: option.yAxisShow, + lineStyle: { + color: option.AxisLineStyleColor ? option.AxisLineStyleColor : option.yAxisAxisLineLineStyleColor, + }, + }, + }, + ]; + let newOption: any = { + //标题 + title: { + show: option.titleText || option.titleSubtext, + text: option.titleText, + textStyle: { + color: option.titleTextStyleColor, + fontSize: option.titleTextStyleFontSize, + fontWeight: option.titleTextStyleFontWeight ? 'bolder' : '', + }, + subtext: option.titleSubtext, + subtextStyle: { + color: option.titleSubtextStyleColor, + fontSize: option.titleSubtextStyleFontSize, + fontWeight: option.titleSubtextStyleFontWeight ? 'bolder' : '', + }, + left: option.titleLeft, + backgroundColor: option.titleText || option.titleSubtext ? option.titleBgColor || '#fff' : '#fff', + }, + //提示 + tooltip: { + show: option.tooltipShow, + backgroundColor: option.tooltipBgColor, + textStyle: { + color: option.tooltipTextStyleColor, + fontSize: option.tooltipTextStyleFontSize, + fontWeight: option.tooltipTextStyleFontWeight ? 'bolder' : '', + }, + }, + //网格 + grid: { + left: option.gridLeft, + top: option.gridTop, + right: option.gridRight, + bottom: option.gridBottom, + containLabel: true, + }, + //图例 + legend: { + show: option.legendShow, + orient: option.legendOrient, + textStyle: { + fontSize: option.legendTextStyleFontSize || 12, + }, + top: option.legendTop + '%', + right: option.legendLeft + '%', + }, + series: (() => { + const list: any[] = (seriesData || []).map((ele: any, index) => { + let label: any = { + show: option.seriesLabelShow, + position: yunzhupaasKey == 'pieChart' ? option.seriesLabelPosition : 'top', + fontSize: option.seriesLabelFontSize, + fontWeight: option.seriesLabelFontWeight ? 'bolder' : 'normal', + color: option.seriesLabelColor, + backgroundColor: option.seriesLabelBgColor, + }; + let itemStyle: any = { + borderRadius: option.seriesItemStyleBarBorderRadius, + }; + if (yunzhupaasKey == 'barChart' || yunzhupaasKey == 'lineChart' || yunzhupaasKey == 'radarChart') itemStyle.color = getColor(index); + if (yunzhupaasKey == 'lineChart') { + ele.smooth = styleType == 2; + ele.step = styleType == 3; + ele.lineStyle = { + width: option.seriesLineStyleWidth, + }; + ele.symbolSize = option.seriesSymbolRotate; + if (option.areaStyle) ele.areaStyle = {}; + } + if (yunzhupaasKey == 'pieChart') { + if (styleType == 1) ele.radius = '60%'; + if (styleType == 2) ele.radius = ['30%', '60%']; + if (option.roseType) ele.roseType = 'area'; + if (option.seriesLabelShowInfo && option.seriesLabelShowInfo.length) { + if (option.seriesLabelShowInfo.includes('count') && option.seriesLabelShowInfo.includes('percent')) { + label.formatter = '{b}: {c} ({d}%)'; + } else if (option.seriesLabelShowInfo.includes('count')) { + label.formatter = '{b}: {c} '; + } else if (option.seriesLabelShowInfo.includes('percent')) { + label.formatter = '{b}: ({d}%) '; + } + } + if (option.colorList && option.colorList.length) { + const colorList: any[] = []; + option.colorList.map((_item, index) => { + const color = getColor(index) || '#71B6F5'; + colorList.push(color); + }); + ele.color = colorList; + } + ele.center = [option.seriesCenterLeft + '%', option.seriesCenterTop + '%']; + } + return Object.assign(ele, { + name: ele.name, + type: ele.type, + data: ele.data, + stack: ele.stack, + showBackground: styleType == 4 ? true : false, + barWidth: option.seriesBarWidth, + itemStyle, + label, + }); + }); + return list; + })(), + }; + if (yunzhupaasKey == 'barChart' || yunzhupaasKey == 'lineChart') { + if (yunzhupaasKey == 'lineChart' && option.areaStyle) xAxis.boundaryGap = false; + newOption.xAxis = xAxis; + newOption.yAxis = yAxis; + } else if (yunzhupaasKey == 'radarChart') { + newOption.radar = []; + typeArr.map(item => { + const indicator = axisData.map(items => { + const maxObj = optionData.find(element => { + return element.type == item && element.name == items; + }); + return { + name: items, + max: maxObj ? maxObj.max : '', + }; + }); + const radarObj = { + indicator: indicator, + shape: option.styleType == 1 ? 'polygon' : 'circle', + axisName: { + fontSize: option.radarAxisNameFontSize, + fontWeight: option.radarAxisNameFontWeight ? 'bolder' : 'normal', + color: option.radarAxisNameColor, + }, + center: [option.radarCenterLeft + '%', option.radarCenterTop + '%'], + }; + newOption.radar.push(radarObj); + }); + } else if (yunzhupaasKey == 'pieChart') { + if (option.seriesLabelShowInfo.includes('count') && option.seriesLabelShowInfo.includes('percent')) { + newOption.tooltip.formatter = '{b}: {c} ({d}%)'; + } else if (option.seriesLabelShowInfo.includes('count')) { + newOption.tooltip.formatter = '{b}: {c}'; + } else if (option.seriesLabelShowInfo.includes('percent')) { + newOption.tooltip.formatter = '{b}: {d}%'; + } else { + newOption.tooltip.formatter = '{b}'; + } + } + state.currOption = newOption; + setOptions(newOption, true); + } + function getType(title) { + const yunzhupaasKey = activeData.yunzhupaasKey; + const option = activeData.option; + if (yunzhupaasKey == 'barChart') { + if (option.styleType == 7) { + const arr = option.barType.find(ele => title == ele.title); + if (arr && arr.type) return arr.type; + } + return 'bar'; + } else if (yunzhupaasKey == 'lineChart') { + return 'line'; + } else if (yunzhupaasKey == 'pieChart') { + return 'pie'; + } else if (yunzhupaasKey == 'radarChart') { + return 'radar'; + } + } + function getColor(index) { + const option = activeData.option; + const barColor = option.colorList || []; + if (barColor[index]) { + const color1 = barColor[index].color1; + const color2 = barColor[index].color2; + if (color2 && color1) + return new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { offset: 0, color: color1 }, + { offset: 1, color: color2 }, + ]); + return color1; + } + } + function getPieData(list) { + for (let i = 0; i < list.length - 1; i++) { + for (let j = 0; j < list.length - 1; j++) { + if (list[j].value > list[j + 1].value) { + let t = list[j]; + list[j] = list[j + 1]; + list[j + 1] = t; + } + } + } + } + function initStaticData(val) { + const yunzhupaasKey = activeData.yunzhupaasKey; + activeData.option.defaultValue = []; + if (yunzhupaasKey == 'barChart') { + if (val == 1 || val == 4) activeData.option.defaultValue = defaultChartData.baseBarData; + if (val == 2 || val == 5) activeData.option.defaultValue = defaultChartData.mulBarData; + if (val == 6) activeData.option.defaultValue = defaultChartData.plusMinusBarData; + if (val == 7) { + activeData.option.defaultValue = defaultChartData.brokenColumnBarData; + initBarType(); + } + } else if (yunzhupaasKey == 'lineChart') { + if (val == 1 || val == 2 || val == 3) activeData.option.defaultValue = defaultChartData.baseBarData; + if (val == 4) activeData.option.defaultValue = defaultChartData.mulBarData; + } else if (yunzhupaasKey == 'pieChart') { + activeData.option.defaultValue = defaultChartData.baseBarData; + } else if (yunzhupaasKey == 'radarChart') { + activeData.option.defaultValue = defaultChartData.radarData; + } + } + function initBarType() { + const option = activeData.option; + if (option.styleType !== 7) return; + const optionData = state.chartData || []; + if (!Array.isArray(optionData)) return; + option.barType = []; + let typeArr = Array.from(new Set(optionData.map(item => item.type))); + typeArr.map((item, index) => { + if (item) { + option.barType.push({ + title: item, + type: index == 1 ? 'line' : 'bar', + }); + } + }); + } + function handleClick(item) { + if (!activeData.option?.urlAddress) return; + let urlAddress = JSON.parse(JSON.stringify(activeData.option.urlAddress)); + const regex = /\${[^{}]+}/g; + urlAddress = urlAddress.replace(regex, match => { + const key = match.slice(2, -1); + let value = ''; + if (key === 'type') value = item.seriesName; + if (key === 'name') value = item.name; + if (key === 'value') value = item.value; + return value || match; + }); + if (activeData.option.target == '_self') { + go(`/externalLink?href=${encodeURIComponent(encryptByBase64(urlAddress))}`); + } else { + window.open(urlAddress, activeData.option.target); + } + } + + return { + CardHeader, + chartData, + currOption, + init, + }; +} diff --git a/src/components/VisualPortal/Design/hooks/useTable.ts b/src/components/VisualPortal/Design/hooks/useTable.ts new file mode 100644 index 0000000..6d8b258 --- /dev/null +++ b/src/components/VisualPortal/Design/hooks/useTable.ts @@ -0,0 +1,216 @@ +import { computed, onMounted, ref, unref, watch, nextTick } from 'vue'; +import { useElementBounding } from '@vueuse/core'; +import { getDataInterfaceRes } from '@/api/systemData/dataInterface'; +import { getNoticeList } from '@/api/onlineDev/portal'; +import dayjs from 'dayjs'; +import { getParamList } from '@/utils/yunzhupaas'; +import { useI18n } from '@/hooks/web/useI18n'; +import { useGo } from '@/hooks/web/usePage'; +import { encryptByBase64 } from '@/utils/cipher'; + +const { t } = useI18n(); + +export function useTable(activeData) { + const tableListRef = ref(); + const tableElRef = ref(); + const list: any = ref([]); + const headerHeight = ref(39); + const { height } = useElementBounding(tableListRef); + const lastHeight = ref(0); + const go = useGo(); + + const getOption = computed(() => activeData.option); + const getBorder = computed(() => unref(getOption).border); + const getColumns = computed(() => { + if (activeData.option.styleType != 1) return activeData.option.rowData; + const index = { fullName: t('component.table.index'), filedName: 'index', width: 50, fixed: 'left', align: 'center' }; + let columnData = activeData.option.tableIndex ? [index, ...activeData.option.columnData] : activeData.option.columnData; + if (activeData.yunzhupaasKey == 'notice') { + columnData = columnData.filter(o => (o.show && o.filedName !== 'classify') || o.filedName === 'index'); + } + if (!columnData.length) return []; + const columnList = columnData.map((o, i) => { + let newObj: any = { + title: o.fullName, + dataIndex: o.filedName, + key: o.filedName, + width: o.width || 100, + fixed: o.fixed === 'none' ? false : o.fixed, + ellipsis: !!unref(getOption).showOverflow, + customHeaderCell: () => { + return { + style: { + backgroundColor: activeData.option.headerBgColor, + color: activeData.option.headerFontColor, + fontSize: (activeData.option.headerFontSize || 14) + 'px', + fontWeight: activeData.option.headerFontWeight ? 600 : 500, + textAlign: activeData.option.headerLeft || o.align || 'center', + }, + }; + }, + customCell: (_record, rowIndex, _column) => { + const rowColorKey = (rowIndex + 1) % 2 === 0 ? 'tableEvenLineColor' : 'tableOddLineColor'; + const color = activeData.option[rowColorKey] || activeData.option.tableBgColor; + return { + style: { + backgroundColor: color, + color: activeData.option.tableFontColor, + fontSize: (activeData.option.tableFontSize || 14) + 'px', + textAlign: o.align || 'center', + }, + }; + }, + }; + if (newObj.key === 'index') newObj.customRender = ({ index }) => index + 1; + if (o.sortable) newObj.sorter = { compare: (a, b) => a[newObj.key] - b[newObj.key], multiple: i }; + return newObj; + }); + return sortFixedColumn(columnList); + }); + const getTableBindValues = computed(() => { + return { + columns: unref(getColumns), + pagination: false, + size: 'small', + rowKey: 'id', + scroll: { y: lastHeight.value - (activeData.option.showHeader ? headerHeight.value : 0) }, + showHeader: activeData.option.showHeader, + bordered: unref(getBorder), + customRow: record => { + return { + onClick: () => handleRowClick(record), // 点击事件处理 + }; + }, + }; + }); + + watch( + () => height.value, + () => { + nextTick(() => { + lastHeight.value = tableListRef.value?.clientHeight; + }); + }, + ); + + watch( + () => lastHeight.value, + val => { + nextTick(() => { + const tableEl = tableElRef.value?.$el; + let bodyEl = tableEl?.querySelector('.ant-table-body'); + if (bodyEl) bodyEl!.style.height = `${val - (activeData.option.showHeader ? headerHeight.value : 0)}px`; + }); + }, + ); + watch( + () => [unref(getOption).headerFontSize, unref(getOption).border], + () => { + nextTick(() => getHeaderHeight()); + }, + ); + watch( + () => unref(getOption).columnData, + () => { + setTimeout(() => getHeaderHeight(), 100); + }, + { deep: true, immediate: true }, + ); + + function initData() { + if (activeData.yunzhupaasKey === 'tableList') { + if (activeData.dataType === 'dynamic') { + list.value = []; + const propsApi = activeData.propsApi; + if (!propsApi) return; + const query = { paramList: getParamList(activeData.templateJson) }; + getDataInterfaceRes(propsApi, query).then(res => { + list.value = res.data || []; + handleData(); + }); + } else { + list.value = JSON.parse(JSON.stringify(activeData.option.defaultValue)); + handleData(); + } + } else { + const rowColumnKey = activeData.option.styleType === 1 ? 'columnData' : 'rowData'; + let typeList: any[] = []; + activeData.option[rowColumnKey].forEach(o => { + if (o.classify?.length) typeList = o.classify; + }); + getNoticeList({ typeList }).then(res => { + list.value = res.data.list || []; + list.value.map(o => { + o.creatorTime = dayjs(o.creatorTime).format('YYYY-MM-DD HH:mm:ss'); + o.releaseTime = dayjs(o.releaseTime).format('YYYY-MM-DD HH:mm:ss'); + }); + handleData(2); + }); + } + } + function handleData(type?) { + const count = type === 2 ? activeData.option.noticeCount || 50 : activeData.option.tableCount || 50; + list.value = list.value.slice(0, count); + nextTick(() => getHeaderHeight()); + } + function getHeaderHeight() { + headerHeight.value = unref(tableListRef)?.getElementsByTagName('thead')[0]?.getBoundingClientRect()?.height + 1 || 39; + } + function sortFixedColumn(columns: any[]) { + const fixedLeftColumns: any[] = []; + const fixedRightColumns: any[] = []; + const defColumns: any[] = []; + for (const column of columns) { + if (column.fixed === 'left') { + fixedLeftColumns.push(column); + continue; + } + if (column.fixed === 'right') { + fixedRightColumns.push(column); + continue; + } + defColumns.push(column); + } + return [...fixedLeftColumns, ...defColumns, ...fixedRightColumns].filter(item => !item.defaultHidden); + } + function getItemStyle(index) { + const rowColorKey = (index + 1) % 2 === 0 ? 'tableEvenLineColor' : 'tableOddLineColor'; + const color = activeData.option[rowColorKey] || activeData.option.tableBgColor; + return { backgroundColor: color }; + } + function getColumnsStyle(type = 0) { + const fontWeight = unref(getColumns)[type].fontWeight ? 'bolder' : 'normal'; + const fontSize = (unref(getColumns)[type].fontSize || 14) + 'px'; + const color = unref(getColumns)[type].fontColor; + return { 'font-weight': fontWeight, 'font-size': fontSize, color } as any; + } + function handleRowClick(row) { + if (!activeData.option?.urlAddress) return; + let urlAddress = JSON.parse(JSON.stringify(activeData.option.urlAddress)); + const regex = /\${[^{}]+}/g; + urlAddress = urlAddress.replace(regex, match => { + const key = match.slice(2, -1); + return row[key] || match; + }); + if (activeData.option.target == '_self') { + go(`/externalLink?href=${encodeURIComponent(encryptByBase64(urlAddress))}`); + } else { + window.open(urlAddress, activeData.option.target); + } + } + + onMounted(() => initData()); + + return { + getItemStyle, + getColumnsStyle, + getOption, + getColumns, + getTableBindValues, + list, + tableListRef, + tableElRef, + getBorder, + handleRowClick, + }; +} diff --git a/src/components/VisualPortal/Design/index.vue b/src/components/VisualPortal/Design/index.vue new file mode 100644 index 0000000..db6e55e --- /dev/null +++ b/src/components/VisualPortal/Design/index.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/components/VisualPortal/Design/rightComponents/RBarStyle.vue b/src/components/VisualPortal/Design/rightComponents/RBarStyle.vue new file mode 100644 index 0000000..d52b5b8 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RBarStyle.vue @@ -0,0 +1,14 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RCard.vue b/src/components/VisualPortal/Design/rightComponents/RCard.vue new file mode 100644 index 0000000..e5c48dc --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RCard.vue @@ -0,0 +1,39 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RCarouselModal.vue b/src/components/VisualPortal/Design/rightComponents/RCarouselModal.vue new file mode 100644 index 0000000..8b86e64 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RCarouselModal.vue @@ -0,0 +1,171 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RColor.vue b/src/components/VisualPortal/Design/rightComponents/RColor.vue new file mode 100644 index 0000000..e96774f --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RColor.vue @@ -0,0 +1,57 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RColumnModal.vue b/src/components/VisualPortal/Design/rightComponents/RColumnModal.vue new file mode 100644 index 0000000..d582b5c --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RColumnModal.vue @@ -0,0 +1,178 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RCommon.vue b/src/components/VisualPortal/Design/rightComponents/RCommon.vue new file mode 100644 index 0000000..1d41461 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RCommon.vue @@ -0,0 +1,600 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RCommonFunModal.vue b/src/components/VisualPortal/Design/rightComponents/RCommonFunModal.vue new file mode 100644 index 0000000..df6cfd7 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RCommonFunModal.vue @@ -0,0 +1,140 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RCustomEcharts.vue b/src/components/VisualPortal/Design/rightComponents/RCustomEcharts.vue new file mode 100644 index 0000000..a091f7c --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RCustomEcharts.vue @@ -0,0 +1,100 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RData.vue b/src/components/VisualPortal/Design/rightComponents/RData.vue new file mode 100644 index 0000000..8b4c0cc --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RData.vue @@ -0,0 +1,183 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RDataBoardModal.vue b/src/components/VisualPortal/Design/rightComponents/RDataBoardModal.vue new file mode 100644 index 0000000..7cc1907 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RDataBoardModal.vue @@ -0,0 +1,201 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/REditorModal.vue b/src/components/VisualPortal/Design/rightComponents/REditorModal.vue new file mode 100644 index 0000000..a92d60b --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/REditorModal.vue @@ -0,0 +1,23 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RJsonModal.vue b/src/components/VisualPortal/Design/rightComponents/RJsonModal.vue new file mode 100644 index 0000000..84a3924 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RJsonModal.vue @@ -0,0 +1,26 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RJump.vue b/src/components/VisualPortal/Design/rightComponents/RJump.vue new file mode 100644 index 0000000..a000f1d --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RJump.vue @@ -0,0 +1,26 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RLabel.vue b/src/components/VisualPortal/Design/rightComponents/RLabel.vue new file mode 100644 index 0000000..26e5e58 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RLabel.vue @@ -0,0 +1,53 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RLegend.vue b/src/components/VisualPortal/Design/rightComponents/RLegend.vue new file mode 100644 index 0000000..d7daaf9 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RLegend.vue @@ -0,0 +1,29 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RLink.vue b/src/components/VisualPortal/Design/rightComponents/RLink.vue new file mode 100644 index 0000000..ea31550 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RLink.vue @@ -0,0 +1,179 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RMainTitle.vue b/src/components/VisualPortal/Design/rightComponents/RMainTitle.vue new file mode 100644 index 0000000..b0100f2 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RMainTitle.vue @@ -0,0 +1,28 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RMapSet.vue b/src/components/VisualPortal/Design/rightComponents/RMapSet.vue new file mode 100644 index 0000000..81058a8 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RMapSet.vue @@ -0,0 +1,176 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RMargin.vue b/src/components/VisualPortal/Design/rightComponents/RMargin.vue new file mode 100644 index 0000000..dfa8d8c --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RMargin.vue @@ -0,0 +1,43 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RNoticeColumnModal.vue b/src/components/VisualPortal/Design/rightComponents/RNoticeColumnModal.vue new file mode 100644 index 0000000..8119772 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RNoticeColumnModal.vue @@ -0,0 +1,177 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RNoticeSet.vue b/src/components/VisualPortal/Design/rightComponents/RNoticeSet.vue new file mode 100644 index 0000000..337b61d --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RNoticeSet.vue @@ -0,0 +1,134 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RRefresh.vue b/src/components/VisualPortal/Design/rightComponents/RRefresh.vue new file mode 100644 index 0000000..8d4d27c --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RRefresh.vue @@ -0,0 +1,13 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RSubTitle.vue b/src/components/VisualPortal/Design/rightComponents/RSubTitle.vue new file mode 100644 index 0000000..f06d7ab --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RSubTitle.vue @@ -0,0 +1,20 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RTabSet.vue b/src/components/VisualPortal/Design/rightComponents/RTabSet.vue new file mode 100644 index 0000000..87a139f --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RTabSet.vue @@ -0,0 +1,79 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RTableSet.vue b/src/components/VisualPortal/Design/rightComponents/RTableSet.vue new file mode 100644 index 0000000..296302f --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RTableSet.vue @@ -0,0 +1,200 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RTextSet.vue b/src/components/VisualPortal/Design/rightComponents/RTextSet.vue new file mode 100644 index 0000000..0648c8b --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RTextSet.vue @@ -0,0 +1,30 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RTodoModal.vue b/src/components/VisualPortal/Design/rightComponents/RTodoModal.vue new file mode 100644 index 0000000..4897078 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RTodoModal.vue @@ -0,0 +1,95 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RTooltip.vue b/src/components/VisualPortal/Design/rightComponents/RTooltip.vue new file mode 100644 index 0000000..b2a52f6 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RTooltip.vue @@ -0,0 +1,27 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RXAxis.vue b/src/components/VisualPortal/Design/rightComponents/RXAxis.vue new file mode 100644 index 0000000..679a4a3 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RXAxis.vue @@ -0,0 +1,58 @@ + + diff --git a/src/components/VisualPortal/Design/rightComponents/RYAxis.vue b/src/components/VisualPortal/Design/rightComponents/RYAxis.vue new file mode 100644 index 0000000..e7d6877 --- /dev/null +++ b/src/components/VisualPortal/Design/rightComponents/RYAxis.vue @@ -0,0 +1,48 @@ + + diff --git a/src/components/VisualPortal/Portal/CardHeader/index.vue b/src/components/VisualPortal/Portal/CardHeader/index.vue new file mode 100644 index 0000000..671b7df --- /dev/null +++ b/src/components/VisualPortal/Portal/CardHeader/index.vue @@ -0,0 +1,29 @@ + + diff --git a/src/components/VisualPortal/Portal/HAppCommon/index.vue b/src/components/VisualPortal/Portal/HAppCommon/index.vue new file mode 100644 index 0000000..78cd3c9 --- /dev/null +++ b/src/components/VisualPortal/Portal/HAppCommon/index.vue @@ -0,0 +1,13 @@ + + diff --git a/src/components/VisualPortal/Portal/HCarousel/index.vue b/src/components/VisualPortal/Portal/HCarousel/index.vue new file mode 100644 index 0000000..0d3eb39 --- /dev/null +++ b/src/components/VisualPortal/Portal/HCarousel/index.vue @@ -0,0 +1,157 @@ + + + diff --git a/src/components/VisualPortal/Portal/HChart/index.vue b/src/components/VisualPortal/Portal/HChart/index.vue new file mode 100644 index 0000000..47a2230 --- /dev/null +++ b/src/components/VisualPortal/Portal/HChart/index.vue @@ -0,0 +1,20 @@ + + diff --git a/src/components/VisualPortal/Portal/HCommonFunc/index.vue b/src/components/VisualPortal/Portal/HCommonFunc/index.vue new file mode 100644 index 0000000..5645bb5 --- /dev/null +++ b/src/components/VisualPortal/Portal/HCommonFunc/index.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/components/VisualPortal/Portal/HCustomEcharts/index.vue b/src/components/VisualPortal/Portal/HCustomEcharts/index.vue new file mode 100644 index 0000000..2c6f8a6 --- /dev/null +++ b/src/components/VisualPortal/Portal/HCustomEcharts/index.vue @@ -0,0 +1,57 @@ + + diff --git a/src/components/VisualPortal/Portal/HDataBoard/index.vue b/src/components/VisualPortal/Portal/HDataBoard/index.vue new file mode 100644 index 0000000..944f0f1 --- /dev/null +++ b/src/components/VisualPortal/Portal/HDataBoard/index.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/components/VisualPortal/Portal/HEmail/index.vue b/src/components/VisualPortal/Portal/HEmail/index.vue new file mode 100644 index 0000000..9f140fb --- /dev/null +++ b/src/components/VisualPortal/Portal/HEmail/index.vue @@ -0,0 +1,37 @@ + + diff --git a/src/components/VisualPortal/Portal/HIframe/index.vue b/src/components/VisualPortal/Portal/HIframe/index.vue new file mode 100644 index 0000000..1b356a0 --- /dev/null +++ b/src/components/VisualPortal/Portal/HIframe/index.vue @@ -0,0 +1,19 @@ + + diff --git a/src/components/VisualPortal/Portal/HImage/index.vue b/src/components/VisualPortal/Portal/HImage/index.vue new file mode 100644 index 0000000..a80d01b --- /dev/null +++ b/src/components/VisualPortal/Portal/HImage/index.vue @@ -0,0 +1,90 @@ + + + diff --git a/src/components/VisualPortal/Portal/HMapChart/index.vue b/src/components/VisualPortal/Portal/HMapChart/index.vue new file mode 100644 index 0000000..f759d11 --- /dev/null +++ b/src/components/VisualPortal/Portal/HMapChart/index.vue @@ -0,0 +1,643 @@ + + + diff --git a/src/components/VisualPortal/Portal/HNotice/index.vue b/src/components/VisualPortal/Portal/HNotice/index.vue new file mode 100644 index 0000000..33ba914 --- /dev/null +++ b/src/components/VisualPortal/Portal/HNotice/index.vue @@ -0,0 +1,145 @@ + + + diff --git a/src/components/VisualPortal/Portal/HRankList/index.vue b/src/components/VisualPortal/Portal/HRankList/index.vue new file mode 100644 index 0000000..c1f00a3 --- /dev/null +++ b/src/components/VisualPortal/Portal/HRankList/index.vue @@ -0,0 +1,169 @@ + + diff --git a/src/components/VisualPortal/Portal/HTableList/index.vue b/src/components/VisualPortal/Portal/HTableList/index.vue new file mode 100644 index 0000000..c3fa006 --- /dev/null +++ b/src/components/VisualPortal/Portal/HTableList/index.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/components/VisualPortal/Portal/HText/index.vue b/src/components/VisualPortal/Portal/HText/index.vue new file mode 100644 index 0000000..de82012 --- /dev/null +++ b/src/components/VisualPortal/Portal/HText/index.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/components/VisualPortal/Portal/HTimeAxis/index.vue b/src/components/VisualPortal/Portal/HTimeAxis/index.vue new file mode 100644 index 0000000..a771111 --- /dev/null +++ b/src/components/VisualPortal/Portal/HTimeAxis/index.vue @@ -0,0 +1,228 @@ + + + diff --git a/src/components/VisualPortal/Portal/HTodo/index.vue b/src/components/VisualPortal/Portal/HTodo/index.vue new file mode 100644 index 0000000..0a5a732 --- /dev/null +++ b/src/components/VisualPortal/Portal/HTodo/index.vue @@ -0,0 +1,133 @@ + + + diff --git a/src/components/VisualPortal/Portal/HTodoList/index.vue b/src/components/VisualPortal/Portal/HTodoList/index.vue new file mode 100644 index 0000000..50f4a31 --- /dev/null +++ b/src/components/VisualPortal/Portal/HTodoList/index.vue @@ -0,0 +1,42 @@ + + diff --git a/src/components/VisualPortal/Portal/HVideo/index.vue b/src/components/VisualPortal/Portal/HVideo/index.vue new file mode 100644 index 0000000..70923b3 --- /dev/null +++ b/src/components/VisualPortal/Portal/HVideo/index.vue @@ -0,0 +1,56 @@ + + diff --git a/src/components/VisualPortal/Portal/Layout/index.vue b/src/components/VisualPortal/Portal/Layout/index.vue new file mode 100644 index 0000000..4c56db8 --- /dev/null +++ b/src/components/VisualPortal/Portal/Layout/index.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/VisualPortal/Portal/Link/index.vue b/src/components/VisualPortal/Portal/Link/index.vue new file mode 100644 index 0000000..6bc433b --- /dev/null +++ b/src/components/VisualPortal/Portal/Link/index.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/VisualPortal/style/index.less b/src/components/VisualPortal/style/index.less new file mode 100644 index 0000000..d89147f --- /dev/null +++ b/src/components/VisualPortal/style/index.less @@ -0,0 +1,634 @@ +@prefix-cls: ~'@{namespace}-basic-portal'; + +.@{prefix-cls} { + .components-menu { + :deep(.components-item) { + line-height: 35px; + padding: 0 25px 0 20px; + } + } + .portal-card-box { + height: 100%; + display: flex; + flex-direction: column; + .ant-card-head { + margin-bottom: unset; + padding: unset; + height: 55px; + .ant-card-head-wrapper { + height: 100%; + .ant-card-head-title { + height: 100%; + padding: unset; + } + } + } + .portal-common-title { + width: 100%; + height: 100%; + font-size: 16px; + padding: 0 15px; + display: flex; + align-items: center; + justify-content: space-between; + overflow: hidden; + .title { + flex: 1; + display: flex; + align-items: center; + overflow: hidden; + i { + font-size: 18px; + } + span { + padding-left: 5px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + } + .button { + padding-left: 10px; + max-width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: unset; + } + } + .ant-card-body { + width: 100%; + overflow: hidden; + flex: 1; + padding: unset; + } + .portal-card-timeline { + padding: 15px 20px; + overflow: auto !important; + } + .portal-card-rankList { + :hover { + cursor: pointer; + } + .rank-box { + line-height: 35px; + .rank-box-span { + display: inline-block; + width: 24px; + height: 24px; + line-height: 24px; + text-align: center; + background-color: rgba(24, 144, 255, 0.39); + border-radius: 50%; + color: @component-background; + opacity: 0.3; + } + img { + width: 35px; + height: 35px; + margin: 0 auto; + } + } + .cup-medal-box { + height: 100%; + display: flex; + flex-direction: column; + .cup-top-box { + display: flex; + justify-content: center; + align-items: flex-end; + overflow: hidden; + padding: 10px 0 15px; + .cup-box { + display: flex; + flex-direction: column; + align-items: center; + img { + width: 46px; + margin-bottom: -6px; + z-index: 20; + } + .top-bg { + width: 230px; + height: 0; + border-bottom: 9px solid rgba(239, 233, 225, 0.39); + border-left: 20px solid transparent; + border-right: 10px solid transparent; + } + .cup-box-content { + width: 230px; + height: 81px; + background: rgba(245, 241, 234, 0.59); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + color: #6f89ac; + p { + width: 100%; + margin-bottom: 4px; + padding: 0 10px; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + .cup1-box { + img { + width: 63px; + } + .top-bg { + width: 260px; + border-right: 20px solid transparent; + border-bottom: 9px solid rgba(250, 247, 242, 0.59); + } + .cup-box-content { + width: 260px; + height: 103px; + background: rgba(250, 247, 242, 0.59); + color: #ce7c1f; + } + } + .cup3-box { + .top-bg { + border-bottom: 9px solid rgba(245, 241, 234, 0.59); + border-left: 10px solid transparent; + border-right: 20px solid transparent; + } + .cup-box-content { + height: 65px; + background: rgba(245, 241, 234, 0.59); + color: #8d4112; + } + } + } + } + .medal-box { + display: flex; + flex-direction: column; + align-items: center; + .medal-top-box { + margin: 60px 0 15px; + display: flex; + justify-content: space-between; + align-items: flex-end; + min-width: 70%; + .medal-box { + width: 160px; + height: 91px; + border-radius: 4px; + border: 1px solid rgba(111, 137, 172, 0.59); + flex-shrink: 0; + position: relative; + .medal-box-content { + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + color: #6f89ac; + p { + width: 100%; + margin-bottom: 4px; + padding: 0 10px; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + img { + width: 60px; + margin-top: -30px; + } + } + .medal1-box { + width: 200px; + height: 100px; + margin: 0 10px; + border: 1px solid rgba(206, 124, 31, 0.59); + .medal-box-content { + color: #ce7c1f; + } + img { + width: 100px; + margin-top: -65px; + } + } + .medal3-box { + border: 1px solid rgba(141, 65, 18, 0.59); + .medal-box-content { + color: #8d4112; + } + } + } + } + } + .portal-card-iframe { + height: 100%; + iframe { + width: 100%; + height: 100%; + } + } + .portal-card-todoList, + .portal-card-email { + padding: 16px 20px; + .item { + display: block; + line-height: 20px; + font-size: 0; + margin-bottom: 12px; + cursor: pointer; + &::after { + content: ''; + clear: both; + overflow: hidden; + } + .com-hover:hover { + color: @primary-color !important; + } + .name { + font-size: 14px; + display: inline-block; + width: calc(100% - 90px); + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + word-break: break-all; + vertical-align: top; + color: @text-color-base; + } + .time { + font-size: 14px; + display: inline-block; + color: @text-color-secondary; + width: 90px; + text-align: right; + } + } + } + .portal-card-body { + height: 100%; + overflow: hidden; + .portal-common-noData { + margin: auto; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + .noData-img { + width: 100px; + height: 100px; + margin: 0 auto; + } + .noData-txt { + font-size: 14px; + color: #909399; + line-height: 20px; + } + } + } + } + .portal-box-tab, + .portal-card-box { + .portal-box-item { + width: 100%; + height: 100%; + position: relative; + border: 1px solid #f0f0f0; + .active-item { + border: 1px solid #409eff; + } + } + } +} +.portal-design-box { + position: relative; + width: 100%; + height: 100%; + display: flex; + .center-box { + flex: 1; + height: 100%; + overflow: hidden; + background-color: @component-background; + margin-right: 10px; + border-radius: 8px; + .components-part { + margin-right: 20px; + .components-title { + cursor: pointer; + display: flex; + align-items: center; + i { + font-size: 12px; + line-height: 12px; + margin-left: 4px; + } + } + } + .empty-info { + position: absolute; + top: calc(50% - 200px); + left: calc(50% - 200px); + + .empty-img { + width: 400px; + height: 400px; + } + } + .layout-area { + height: calc(100% - 42px); + background: @component-background; + position: relative; + border: none; + #ipad { + height: calc(100% - 42px); + display: flex; + justify-content: center; + align-items: center; + min-height: 781px; + .portal-card-body, + .ant-tabs-content-holder, + .ant-tabs-content { + height: 100px !important; + display: flex; + align-items: center; + justify-content: center; + color: @text-color-secondary; + } + .empty-info { + top: calc(50% - 150px); + left: calc(50% - 150px); + .empty-img { + width: 300px; + height: 300px; + } + } + .outer-ipad { + background: url('../../../assets/images/iphoneBg.png'); + width: 389px; + height: 711px; + padding: 65px 40px; + .ipadHead { + background: #f7f8f9; + text-align: center; + .ipadHead-img { + margin: 0 auto; + height: 20px; + } + } + .ipad-body { + height: 100%; + .ipad-name { + text-align: center; + margin-bottom: 5px; + margin-top: 5px; + } + .center-scrollbar { + height: 100%; + overflow: hidden; + } + } + } + } + .drawing-board, + .vue-grid-item, + .item-box { + position: relative; + height: 100%; + border-radius: var(--border-radius); + border: 1px dashed @border-color-base1; + &.active-item { + border: 1px solid @primary-color; + & > .drawing-item-action { + display: flex !important; + } + } + .mask { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 9; + border-radius: var(--border-radius); + overflow: hidden; + } + .vue-resizable-handle { + z-index: 200; + } + .drawing-item-action { + position: absolute; + top: -10px; + height: 24px; + line-height: 22px; + border-radius: 24px; + font-size: 12px; + border: 1px solid @primary-color; + background: @component-background; + cursor: pointer; + z-index: 20; + right: 20px; + display: none; + overflow: hidden; + .drawing-item-action-item { + display: block; + width: 30px; + height: 22px; + height: 100%; + text-align: center; + position: relative; + align-items: center; + justify-content: flex-start; + color: @text-color-label; + &.drawing-item-delete { + color: @text-color-label; + &:hover { + background: #ffe5e5; + color: @error-color; + } + } + &:hover { + background: @primary-1; + color: @primary-color; + } + &:first-child { + &::after { + display: none; + } + } + &::after { + display: block; + content: ''; + position: absolute; + top: 3px; + left: 0; + height: 16px; + width: 1px; + background-color: @border-color-base1; + } + } + } + &:hover { + .drawing-item-action { + display: flex; + } + } + } + } + } + .right-box { + width: 340px; + background-color: @component-background; + border-radius: 8px; + .filed-box { + position: relative; + height: calc(100% - 42px); + box-sizing: border-box; + overflow: hidden; + } + .ant-collapse { + overflow-x: hidden; + .ant-collapse-item { + border-bottom: 1px solid @border-color-base1; + .ant-collapse-header { + padding: 12px 0 !important; + .ant-collapse-arrow { + right: 8px; + } + } + .ant-collapse-content-box { + padding: 10px 0 0; + } + } + } + .right-radio { + .ant-radio-button-wrapper { + padding: 0 11px; + } + } + .right-radio-more { + .ant-radio-button-wrapper { + padding: 0 8px; + } + } + .options-list { + padding-bottom: 18px; + .select-item { + display: flex; + border: 1px dashed @component-background; + box-sizing: border-box; + & .ant-input + .ant-input { + margin-left: 4px; + } + .ant-select { + width: 100%; + } + & + .select-item { + margin-top: 4px; + } + &.sortable-chosen { + border: 1px dashed @primary-color; + } + .select-line-icon { + line-height: 31px; + font-size: 22px; + padding: 0 4px; + color: #606266; + .icon-ym-darg { + font-size: 20px; + line-height: 31px; + display: inline-block; + } + .icon-ym-btn-clearn { + font-size: 18px; + } + } + .close-btn { + cursor: pointer; + color: @error-color; + height: 32px; + display: flex; + align-items: center; + } + .option-drag { + cursor: move; + } + } + .add-btn { + padding-left: 12px; + } + } + } +} +.custom-table { + .ant-table-header table { + border-top: unset !important; + } +} +.ant-modal.json-modal { + .ant-modal-body { + & > .scrollbar { + padding: 20px; + } + } + .ant-modal-body { + .json-editor { + height: 400px; + height: 400px; + border: 1px solid @border-color-base1; + border-radius: 6px; + overflow: hidden; + } + } +} +.portal-layout-nodata { + text-align: center; + position: absolute; + top: calc(50% - 200px); + left: calc(50% - 200px); + .ant-empty-image, + .layout-nodata-img { + width: 400px; + height: 400px; + } + .ant-empty-description, + .layout-nodata-txt { + margin-top: -60px; + font-size: 20px; + color: #909399; + line-height: 30px; + } +} +.custom-page { + width: 100%; + height: 100%; +} +html[data-theme='dark'] { + .portal-design-box .center-box .layout-area #ipad .outer-ipad { + background: url('../../../assets/images/iphoneBg-dark.png'); + } + .portal-design-box .right-box .filed-box .ant-collapse { + border: unset; + } + .cup-box-content { + background: rgba(51, 51, 51, 0.59) !important; + } + .top-bg { + border-bottom: 9px solid rgba(51, 51, 51, 0.59) !important; + } + .yunzhupaas-basic-portal { + .portal-box-tab, + .portal-card-box { + .portal-box-item { + border: 1px solid #303030; + } + } + } +} diff --git a/src/components/Yunzhupaas/Alert/index.ts b/src/components/Yunzhupaas/Alert/index.ts new file mode 100644 index 0000000..ebd26fc --- /dev/null +++ b/src/components/Yunzhupaas/Alert/index.ts @@ -0,0 +1,17 @@ +// 临时占位组件 - 需要实现真实的 Yunzhupaas 组件 +// import { defineComponent, h } from 'vue'; + +// export const YunzhupaasAlert = defineComponent({ +// name: 'YunzhupaasAlert', +// setup(_, { slots }) { +// return () => h('div', { class: 'yunzhupaas-alert-placeholder' }, [ +// 'YunzhupaasAlert 组件待实现', +// slots.default?.(), +// ]); +// }, +// }); + +import { withInstall } from '@/utils'; +import Alert from './src/Alert.vue'; + +export const YunzhupaasAlert = withInstall(Alert); diff --git a/src/components/Yunzhupaas/Alert/src/Alert.vue b/src/components/Yunzhupaas/Alert/src/Alert.vue new file mode 100644 index 0000000..09ca239 --- /dev/null +++ b/src/components/Yunzhupaas/Alert/src/Alert.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/Yunzhupaas/AreaSelect/index.ts b/src/components/Yunzhupaas/AreaSelect/index.ts new file mode 100644 index 0000000..486bb66 --- /dev/null +++ b/src/components/Yunzhupaas/AreaSelect/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import AreaSelect from './src/AreaSelect.vue'; + +export const YunzhupaasAreaSelect = withInstall(AreaSelect); diff --git a/src/components/Yunzhupaas/AreaSelect/src/AreaSelect.vue b/src/components/Yunzhupaas/AreaSelect/src/AreaSelect.vue new file mode 100644 index 0000000..102bf18 --- /dev/null +++ b/src/components/Yunzhupaas/AreaSelect/src/AreaSelect.vue @@ -0,0 +1,230 @@ + + + diff --git a/src/components/Yunzhupaas/AreaSelect/src/props.ts b/src/components/Yunzhupaas/AreaSelect/src/props.ts new file mode 100644 index 0000000..0d2b170 --- /dev/null +++ b/src/components/Yunzhupaas/AreaSelect/src/props.ts @@ -0,0 +1,9 @@ +export const areaSelectProps = { + value: { type: Array as PropType }, + multiple: { type: Boolean, default: false }, + level: { type: Number, default: 2 }, + placeholder: { type: String, default: '请选择' }, + disabled: { type: Boolean, default: false }, + allowClear: { type: Boolean, default: true }, + size: String, +}; diff --git a/src/components/Yunzhupaas/AutoComplete/index.ts b/src/components/Yunzhupaas/AutoComplete/index.ts new file mode 100644 index 0000000..2480804 --- /dev/null +++ b/src/components/Yunzhupaas/AutoComplete/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '@/utils'; +import type { ExtractPropTypes } from 'vue'; +import AutoComplete from './src/AutoComplete.vue'; +import { autoCompleteProps } from './src/props'; + +export const YunzhupaasAutoComplete = withInstall(AutoComplete); +export declare type AutoCompleteProps = Partial>; diff --git a/src/components/Yunzhupaas/AutoComplete/src/AutoComplete.vue b/src/components/Yunzhupaas/AutoComplete/src/AutoComplete.vue new file mode 100644 index 0000000..165d257 --- /dev/null +++ b/src/components/Yunzhupaas/AutoComplete/src/AutoComplete.vue @@ -0,0 +1,120 @@ + + + + diff --git a/src/components/Yunzhupaas/AutoComplete/src/props.ts b/src/components/Yunzhupaas/AutoComplete/src/props.ts new file mode 100644 index 0000000..52a388e --- /dev/null +++ b/src/components/Yunzhupaas/AutoComplete/src/props.ts @@ -0,0 +1,12 @@ +export const autoCompleteProps = { + value: [String, Number] as PropType, + interfaceId: { type: String, default: '' }, + templateJson: { type: Array, default: () => [] }, + relationField: { type: String, default: 'fullName' }, + total: { type: Number, default: 50 }, + placeholder: { type: String, default: '请选择' }, + allowClear: { type: Boolean, default: true }, + disabled: { type: Boolean, default: false }, + rowIndex: { default: null }, + formData: { type: Object }, +}; diff --git a/src/components/Yunzhupaas/Barcode/index.ts b/src/components/Yunzhupaas/Barcode/index.ts new file mode 100644 index 0000000..01f0c35 --- /dev/null +++ b/src/components/Yunzhupaas/Barcode/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import Barcode from './src/Barcode.vue'; + +export const YunzhupaasBarcode = withInstall(Barcode); diff --git a/src/components/Yunzhupaas/Barcode/src/Barcode.vue b/src/components/Yunzhupaas/Barcode/src/Barcode.vue new file mode 100644 index 0000000..90ecb58 --- /dev/null +++ b/src/components/Yunzhupaas/Barcode/src/Barcode.vue @@ -0,0 +1,88 @@ + + + + diff --git a/src/components/Yunzhupaas/Button/index.ts b/src/components/Yunzhupaas/Button/index.ts new file mode 100644 index 0000000..0b353d9 --- /dev/null +++ b/src/components/Yunzhupaas/Button/index.ts @@ -0,0 +1,7 @@ +import { withInstall } from '@/utils'; +import type { ExtractPropTypes } from 'vue'; +import Button from './src/Button.vue'; +import { buttonProps } from './src/props'; + +export const YunzhupaasButton = withInstall(Button); +export declare type ButtonProps = Partial>; diff --git a/src/components/Yunzhupaas/Button/src/Button.vue b/src/components/Yunzhupaas/Button/src/Button.vue new file mode 100644 index 0000000..3813576 --- /dev/null +++ b/src/components/Yunzhupaas/Button/src/Button.vue @@ -0,0 +1,34 @@ + + + + diff --git a/src/components/Yunzhupaas/Button/src/props.ts b/src/components/Yunzhupaas/Button/src/props.ts new file mode 100644 index 0000000..d8424cb --- /dev/null +++ b/src/components/Yunzhupaas/Button/src/props.ts @@ -0,0 +1,5 @@ +export const buttonProps = { + align: { type: String, default: 'left' }, + buttonText: { type: String, default: '' }, + onClick: { type: Function as PropType<(...args) => any>, default: null }, +}; diff --git a/src/components/Yunzhupaas/Calculate/index.ts b/src/components/Yunzhupaas/Calculate/index.ts new file mode 100644 index 0000000..575376c --- /dev/null +++ b/src/components/Yunzhupaas/Calculate/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import Calculate from './src/Calculate.vue'; + +export const YunzhupaasCalculate = withInstall(Calculate); diff --git a/src/components/Yunzhupaas/Calculate/src/Calculate.vue b/src/components/Yunzhupaas/Calculate/src/Calculate.vue new file mode 100644 index 0000000..3932dd7 --- /dev/null +++ b/src/components/Yunzhupaas/Calculate/src/Calculate.vue @@ -0,0 +1,164 @@ + + + + diff --git a/src/components/Yunzhupaas/Cascader/index.ts b/src/components/Yunzhupaas/Cascader/index.ts new file mode 100644 index 0000000..7badb24 --- /dev/null +++ b/src/components/Yunzhupaas/Cascader/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import Cascader from './src/Cascader.vue'; + +export const YunzhupaasCascader = withInstall(Cascader); diff --git a/src/components/Yunzhupaas/Cascader/src/Cascader.vue b/src/components/Yunzhupaas/Cascader/src/Cascader.vue new file mode 100644 index 0000000..38ced0b --- /dev/null +++ b/src/components/Yunzhupaas/Cascader/src/Cascader.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/components/Yunzhupaas/Checkbox/index.ts b/src/components/Yunzhupaas/Checkbox/index.ts new file mode 100644 index 0000000..3f13232 --- /dev/null +++ b/src/components/Yunzhupaas/Checkbox/index.ts @@ -0,0 +1,6 @@ +import { withInstall } from '@/utils'; +import Checkbox from './src/Checkbox.vue'; +import CheckboxSingle from './src/CheckboxSingle.vue'; + +export const YunzhupaasCheckbox = withInstall(Checkbox); +export const YunzhupaasCheckboxSingle = withInstall(CheckboxSingle); diff --git a/src/components/Yunzhupaas/Checkbox/src/Checkbox.vue b/src/components/Yunzhupaas/Checkbox/src/Checkbox.vue new file mode 100644 index 0000000..8e57697 --- /dev/null +++ b/src/components/Yunzhupaas/Checkbox/src/Checkbox.vue @@ -0,0 +1,63 @@ + + + + diff --git a/src/components/Yunzhupaas/Checkbox/src/CheckboxSingle.vue b/src/components/Yunzhupaas/Checkbox/src/CheckboxSingle.vue new file mode 100644 index 0000000..626d2cf --- /dev/null +++ b/src/components/Yunzhupaas/Checkbox/src/CheckboxSingle.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/components/Yunzhupaas/Checkbox/src/props.ts b/src/components/Yunzhupaas/Checkbox/src/props.ts new file mode 100644 index 0000000..5e8373f --- /dev/null +++ b/src/components/Yunzhupaas/Checkbox/src/props.ts @@ -0,0 +1,23 @@ +export interface FieldNames { + label?: string; + value?: string; + disabled?: string; +} + +export const checkboxProps = { + value: { + type: Array as PropType, + }, + options: { + type: Array, + default: () => [], + }, + fieldNames: { + type: Object as PropType, + default: () => ({ value: 'id', label: 'fullName', disabled: 'disabled' }), + }, + direction: { + type: String, + default: 'horizontal', + }, +}; diff --git a/src/components/Yunzhupaas/ColorPicker/index.ts b/src/components/Yunzhupaas/ColorPicker/index.ts new file mode 100644 index 0000000..7ce3fc8 --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import ColorPicker from './src/ColorPicker.vue'; + +export const YunzhupaasColorPicker = withInstall(ColorPicker); diff --git a/src/components/Yunzhupaas/ColorPicker/src/ColorPicker.vue b/src/components/Yunzhupaas/ColorPicker/src/ColorPicker.vue new file mode 100644 index 0000000..02fa78f --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/ColorPicker.vue @@ -0,0 +1,372 @@ + + + + diff --git a/src/components/Yunzhupaas/ColorPicker/src/components/alphaSlider.vue b/src/components/Yunzhupaas/ColorPicker/src/components/alphaSlider.vue new file mode 100644 index 0000000..a2a0fbf --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/components/alphaSlider.vue @@ -0,0 +1,180 @@ + + + + diff --git a/src/components/Yunzhupaas/ColorPicker/src/components/hueSlider.vue b/src/components/Yunzhupaas/ColorPicker/src/components/hueSlider.vue new file mode 100644 index 0000000..59a9393 --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/components/hueSlider.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/components/Yunzhupaas/ColorPicker/src/components/preDefine.vue b/src/components/Yunzhupaas/ColorPicker/src/components/preDefine.vue new file mode 100644 index 0000000..4d72550 --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/components/preDefine.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/components/Yunzhupaas/ColorPicker/src/components/svPanel.vue b/src/components/Yunzhupaas/ColorPicker/src/components/svPanel.vue new file mode 100644 index 0000000..a87128b --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/components/svPanel.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/components/Yunzhupaas/ColorPicker/src/lib/color.ts b/src/components/Yunzhupaas/ColorPicker/src/lib/color.ts new file mode 100644 index 0000000..82b7370 --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/lib/color.ts @@ -0,0 +1,329 @@ +import { hasOwn } from '@vue/shared'; +import { Options } from '../type/types'; + +const hsv2hsl = function (hue: number, sat: number, val: number) { + return [hue, (sat * val) / ((hue = (2 - sat) * val) < 1 ? hue : 2 - hue) || 0, hue / 2]; +}; + +const isOnePointYunzhupaas = function (n: unknown) { + return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1; +}; + +const isPercentage = function (n: unknown) { + return typeof n === 'string' && n.indexOf('%') !== -1; +}; + +const bound01 = function (value: number | string, max: number | string) { + if (isOnePointYunzhupaas(value)) value = '100%'; + + const processPercent = isPercentage(value); + value = Math.min(max as number, Math.max(0, parseFloat(`${value}`))); + + if (processPercent) { + value = parseInt(`${value * (max as number)}`, 10) / 100; + } + + if (Math.abs(value - (max as number)) < 0.000001) { + return 1; + } + + return (value % (max as number)) / parseFloat(max as string); +}; + +const INT_HEX_MAP = { 10: 'A', 11: 'B', 12: 'C', 13: 'D', 14: 'E', 15: 'F' }; + +const hexOne = function (value: number) { + value = Math.min(Math.round(value), 255); + const high = Math.floor(value / 16); + const low = value % 16; + return `${INT_HEX_MAP[high] || high}${INT_HEX_MAP[low] || low}`; +}; + +const toHex = function ({ r, g, b }) { + if (isNaN(r) || isNaN(g) || isNaN(b)) return ''; + + return `#${hexOne(r)}${hexOne(g)}${hexOne(b)}`; +}; + +const HEX_INT_MAP = { A: 10, B: 11, C: 12, D: 13, E: 14, F: 15 }; + +const parseHexChannel = function (hex: string) { + if (hex.length === 2) { + return (HEX_INT_MAP[hex[0].toUpperCase()] || +hex[0]) * 16 + (HEX_INT_MAP[hex[1].toUpperCase()] || +hex[1]); + } + + return HEX_INT_MAP[hex[1].toUpperCase()] || +hex[1]; +}; + +const hsl2hsv = function (hue: number, sat: number, light: number) { + sat = sat / 100; + light = light / 100; + let smin = sat; + const lmin = Math.max(light, 0.01); + // let sv + // let v + + light *= 2; + sat *= light <= 1 ? light : 2 - light; + smin *= lmin <= 1 ? lmin : 2 - lmin; + const v = (light + sat) / 2; + const sv = light === 0 ? (2 * smin) / (lmin + smin) : (2 * sat) / (light + sat); + + return { + h: hue, + s: sv * 100, + v: v * 100, + }; +}; + +const rgb2hsv = function (r, g, b) { + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + let h; + const v = max; + + const d = max - min; + const s = max === 0 ? 0 : d / max; + + if (max === min) { + h = 0; // achromatic + } else { + switch (max) { + case r: { + h = (g - b) / d + (g < b ? 6 : 0); + break; + } + case g: { + h = (b - r) / d + 2; + break; + } + case b: { + h = (r - g) / d + 4; + break; + } + } + h /= 6; + } + + return { h: h * 360, s: s * 100, v: v * 100 }; +}; + +const hsv2rgb = function (h, s, v) { + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + const i = Math.floor(h); + const f = h - i; + const p = v * (1 - s); + const q = v * (1 - f * s); + const t = v * (1 - (1 - f) * s); + const mod = i % 6; + const r = [v, q, p, p, t, v][mod]; + const g = [t, v, v, q, p, p][mod]; + const b = [p, p, t, v, v, q][mod]; + + return { + r: Math.round(r * 255), + g: Math.round(g * 255), + b: Math.round(b * 255), + }; +}; + +export default class Color { + private _hue = 0; + private _saturation = 100; + private _value = 100; + private _alpha = 100; + public enableAlpha = false; + public format = 'hex'; + public value = ''; + public selected?: boolean; + constructor(options?: Options) { + options = options || ({} as Options); + + for (const option in options) { + if (hasOwn(options, option)) { + this[option] = options[option]; + } + } + + this.doOnChange(); + } + + set(prop: { [key: string]: any } | any, value?: number) { + if (arguments.length === 1 && typeof prop === 'object') { + for (const p in prop) { + if (hasOwn(prop, p)) { + this.set(p, prop[p]); + } + } + + return; + } + + this[`_${prop}`] = value; + this.doOnChange(); + } + + get(prop: string) { + if (prop === 'alpha') { + return Math.floor(this[`_${prop}`]); + } + return this[`_${prop}`]; + } + + toRgb() { + return hsv2rgb(this._hue, this._saturation, this._value); + } + + fromString(value) { + if (!value) { + this._hue = 0; + this._saturation = 100; + this._value = 100; + + this.doOnChange(); + return; + } + + const fromHSV = (h, s, v) => { + this._hue = Math.max(0, Math.min(360, h)); + this._saturation = Math.max(0, Math.min(100, s)); + this._value = Math.max(0, Math.min(100, v)); + + this.doOnChange(); + }; + + if (value.indexOf('hsl') !== -1) { + const parts = value + .replace(/hsla|hsl|\(|\)/gm, '') + .split(/\s|,/g) + .filter(val => val !== '') + .map((val, index) => (index > 2 ? parseFloat(val) : parseInt(val, 10))); + + if (parts.length === 4) { + this._alpha = parseFloat(parts[3]) * 100; + } else if (parts.length === 3) { + this._alpha = 100; + } + if (parts.length >= 3) { + const { h, s, v } = hsl2hsv(parts[0], parts[1], parts[2]); + fromHSV(h, s, v); + } + } else if (value.indexOf('hsv') !== -1) { + const parts = value + .replace(/hsva|hsv|\(|\)/gm, '') + .split(/\s|,/g) + .filter(val => val !== '') + .map((val, index) => (index > 2 ? parseFloat(val) : parseInt(val, 10))); + + if (parts.length === 4) { + this._alpha = parseFloat(parts[3]) * 100; + } else if (parts.length === 3) { + this._alpha = 100; + } + if (parts.length >= 3) { + fromHSV(parts[0], parts[1], parts[2]); + } + } else if (value.indexOf('rgb') !== -1) { + const parts = value + .replace(/rgba|rgb|\(|\)/gm, '') + .split(/\s|,/g) + .filter(val => val !== '') + .map((val, index) => (index > 2 ? parseFloat(val) : parseInt(val, 10))); + + if (parts.length === 4) { + this._alpha = parseFloat(parts[3]) * 100; + } else if (parts.length === 3) { + this._alpha = 100; + } + if (parts.length >= 3) { + const { h, s, v } = rgb2hsv(parts[0], parts[1], parts[2]); + fromHSV(h, s, v); + } + } else if (value.indexOf('#') !== -1) { + const hex = value.replace('#', '').trim(); + if (!/^[0-9a-fA-F]{3}$|^[0-9a-fA-F]{6}$|^[0-9a-fA-F]{8}$/.test(hex)) return; + let r, g, b; + + if (hex.length === 3) { + r = parseHexChannel(hex[0] + hex[0]); + g = parseHexChannel(hex[1] + hex[1]); + b = parseHexChannel(hex[2] + hex[2]); + } else if (hex.length === 6 || hex.length === 8) { + r = parseHexChannel(hex.substring(0, 2)); + g = parseHexChannel(hex.substring(2, 4)); + b = parseHexChannel(hex.substring(4, 6)); + } + + if (hex.length === 8) { + this._alpha = (parseHexChannel(hex.substring(6)) / 255) * 100; + } else if (hex.length === 3 || hex.length === 6) { + this._alpha = 100; + } + + const { h, s, v } = rgb2hsv(r, g, b); + fromHSV(h, s, v); + } + } + + compare(color) { + return ( + Math.abs(color._hue - this._hue) < 2 && + Math.abs(color._saturation - this._saturation) < 1 && + Math.abs(color._value - this._value) < 1 && + Math.abs(color._alpha - this._alpha) < 1 + ); + } + + doOnChange() { + const { _hue, _saturation, _value, _alpha, format } = this; + + if (this.enableAlpha) { + switch (format) { + case 'hsl': { + const hsl = hsv2hsl(_hue, _saturation / 100, _value / 100); + this.value = `hsla(${_hue}, ${Math.round(hsl[1] * 100)}%, ${Math.round(hsl[2] * 100)}%, ${this.get('alpha') / 100})`; + break; + } + case 'hsv': { + this.value = `hsva(${_hue}, ${Math.round(_saturation)}%, ${Math.round(_value)}%, ${this.get('alpha') / 100})`; + break; + } + case 'hex': { + this.value = `${toHex(hsv2rgb(_hue, _saturation, _value))}${hexOne((_alpha * 255) / 100)}`; + break; + } + default: { + const { r, g, b } = hsv2rgb(_hue, _saturation, _value); + this.value = `rgba(${r}, ${g}, ${b}, ${this.get('alpha') / 100})`; + } + } + } else { + switch (format) { + case 'hsl': { + const hsl = hsv2hsl(_hue, _saturation / 100, _value / 100); + this.value = `hsl(${_hue}, ${Math.round(hsl[1] * 100)}%, ${Math.round(hsl[2] * 100)}%)`; + break; + } + case 'hsv': { + this.value = `hsv(${_hue}, ${Math.round(_saturation)}%, ${Math.round(_value)}%)`; + break; + } + case 'rgb': { + const { r, g, b } = hsv2rgb(_hue, _saturation, _value); + this.value = `rgb(${r}, ${g}, ${b})`; + break; + } + default: { + this.value = toHex(hsv2rgb(_hue, _saturation, _value)); + } + } + } + } +} diff --git a/src/components/Yunzhupaas/ColorPicker/src/lib/draggable.ts b/src/components/Yunzhupaas/ColorPicker/src/lib/draggable.ts new file mode 100644 index 0000000..0d7689c --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/lib/draggable.ts @@ -0,0 +1,36 @@ +let isDragging = false; + +export declare interface IOptions { + drag?: (event: Event) => void; + start?: (event: Event) => void; + end?: (event: Event) => void; +} + +export default function (ele: HTMLElement, options: IOptions) { + const moveFun = function (event: Event) { + options?.drag?.(event); + }; + + const upFun = function (event: Event) { + document.removeEventListener('mousemove', moveFun); + document.removeEventListener('mouseup', upFun); + document.onselectstart = null; + document.ondragstart = null; + + isDragging = false; + + options?.end?.(event); + }; + + ele.addEventListener('mousedown', function (event: Event) { + if (isDragging) return; + document.onselectstart = () => false; + document.ondragstart = () => false; + document.addEventListener('mousemove', moveFun); + document.addEventListener('mouseup', upFun); + + isDragging = true; + + options?.start?.(event); + }); +} diff --git a/src/components/Yunzhupaas/ColorPicker/src/lib/validators.ts b/src/components/Yunzhupaas/ColorPicker/src/lib/validators.ts new file mode 100644 index 0000000..f79256d --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/lib/validators.ts @@ -0,0 +1,3 @@ +export const isValidComponentSize = (val: string): boolean => { + return ['', 'large', 'default', 'small'].includes(val); +}; diff --git a/src/components/Yunzhupaas/ColorPicker/src/type/types.ts b/src/components/Yunzhupaas/ColorPicker/src/type/types.ts new file mode 100644 index 0000000..35576d1 --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/type/types.ts @@ -0,0 +1,9 @@ +export interface Options { + enableAlpha: boolean; + format: string; + value?: string; +} + +export type Nullable = T | null; + +export type ComponentSize = 'large' | 'default' | 'small'; diff --git a/src/components/Yunzhupaas/ColorPicker/src/useOptions.ts b/src/components/Yunzhupaas/ColorPicker/src/useOptions.ts new file mode 100644 index 0000000..e76cd60 --- /dev/null +++ b/src/components/Yunzhupaas/ColorPicker/src/useOptions.ts @@ -0,0 +1,13 @@ +import { inject } from 'vue'; + +import type { ComputedRef } from 'vue'; + +export interface IUseOptions { + currentColor: ComputedRef; +} + +export const OPTIONS_KEY = Symbol(); + +export const useOptions = () => { + return inject(OPTIONS_KEY); +}; diff --git a/src/components/Yunzhupaas/Cron/EasyCronInner.vue b/src/components/Yunzhupaas/Cron/EasyCronInner.vue new file mode 100644 index 0000000..b43c9fc --- /dev/null +++ b/src/components/Yunzhupaas/Cron/EasyCronInner.vue @@ -0,0 +1,273 @@ + + + + diff --git a/src/components/Yunzhupaas/Cron/EasyCronInput.vue b/src/components/Yunzhupaas/Cron/EasyCronInput.vue new file mode 100644 index 0000000..362e9e0 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/EasyCronInput.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/components/Yunzhupaas/Cron/EasyCronModal.vue b/src/components/Yunzhupaas/Cron/EasyCronModal.vue new file mode 100644 index 0000000..3f4648d --- /dev/null +++ b/src/components/Yunzhupaas/Cron/EasyCronModal.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/Yunzhupaas/Cron/easy.cron.data.ts b/src/components/Yunzhupaas/Cron/easy.cron.data.ts new file mode 100644 index 0000000..7f3538c --- /dev/null +++ b/src/components/Yunzhupaas/Cron/easy.cron.data.ts @@ -0,0 +1,10 @@ +import { propTypes } from '@/utils/propTypes'; + +export const cronEmits = ['change', 'update:value']; +export const cronProps = { + value: propTypes.string.def(''), + disabled: propTypes.bool.def(false), + hideSecond: propTypes.bool.def(false), + hideYear: propTypes.bool.def(false), + remote: propTypes.func, +}; diff --git a/src/components/Yunzhupaas/Cron/easy.cron.inner.less b/src/components/Yunzhupaas/Cron/easy.cron.inner.less new file mode 100644 index 0000000..a8a1229 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/easy.cron.inner.less @@ -0,0 +1,71 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-easy-cron-inner'; + +.@{prefix-cls} { + .content { + .ant-checkbox-wrapper + .ant-checkbox-wrapper { + margin-left: 0; + } + } + + &-config-list { + text-align: left; + margin: 0 10px; + + .item { + margin-top: 5px; + font-size: 14px; + + span { + padding: 0 2px; + } + } + + .choice { + padding: 5px 8px; + } + + .w60 { + width: 60px !important; + min-width: 60px; + } + + .w80 { + width: 80px; + min-width: 80px; + } + + .list { + margin: 0 20px; + } + + .list-check-item { + padding: 1px 3px; + width: 4em; + } + + .list-cn .list-check-item { + width: 5em; + } + + .tip-info { + color: #999; + } + } + .cron-list { + } + .time-list { + display: flex; + margin-bottom: 10px; + .ant-input-group-wrapper { + margin-right: 5px; + + &:last-child { + margin-right: unset; + } + } + } + .allow-click { + cursor: pointer; + } +} diff --git a/src/components/Yunzhupaas/Cron/easy.cron.input.less b/src/components/Yunzhupaas/Cron/easy.cron.input.less new file mode 100644 index 0000000..d72aa15 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/easy.cron.input.less @@ -0,0 +1,14 @@ +//noinspection LessUnresolvedVariable +@prefix-cls: ~'@{namespace}-easy-cron-input'; + +.@{prefix-cls} { + a.open-btn { + cursor: pointer; + + .app-iconify { + position: relative; + top: 1px; + right: 2px; + } + } +} diff --git a/src/components/Yunzhupaas/Cron/index.ts b/src/components/Yunzhupaas/Cron/index.ts new file mode 100644 index 0000000..46ac42f --- /dev/null +++ b/src/components/Yunzhupaas/Cron/index.ts @@ -0,0 +1,8 @@ +import { withInstall } from '@/utils'; +import cron from './EasyCronInput.vue'; +import cronInner from './EasyCronInner.vue'; +import cronModal from './EasyCronModal.vue'; + +export const YunzhupaasCron = withInstall(cron); +export const CronInner = withInstall(cronInner); +export const CronModal = withInstall(cronModal); diff --git a/src/components/Yunzhupaas/Cron/tabs/DayUI.vue b/src/components/Yunzhupaas/Cron/tabs/DayUI.vue new file mode 100644 index 0000000..fbf3554 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/tabs/DayUI.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/components/Yunzhupaas/Cron/tabs/HourUI.vue b/src/components/Yunzhupaas/Cron/tabs/HourUI.vue new file mode 100644 index 0000000..c3c5224 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/tabs/HourUI.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Yunzhupaas/Cron/tabs/MinuteUI.vue b/src/components/Yunzhupaas/Cron/tabs/MinuteUI.vue new file mode 100644 index 0000000..34617bf --- /dev/null +++ b/src/components/Yunzhupaas/Cron/tabs/MinuteUI.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Yunzhupaas/Cron/tabs/MonthUI.vue b/src/components/Yunzhupaas/Cron/tabs/MonthUI.vue new file mode 100644 index 0000000..78f7f4e --- /dev/null +++ b/src/components/Yunzhupaas/Cron/tabs/MonthUI.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Yunzhupaas/Cron/tabs/SecondUI.vue b/src/components/Yunzhupaas/Cron/tabs/SecondUI.vue new file mode 100644 index 0000000..6b65b85 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/tabs/SecondUI.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/Yunzhupaas/Cron/tabs/WeekUI.vue b/src/components/Yunzhupaas/Cron/tabs/WeekUI.vue new file mode 100644 index 0000000..93f20da --- /dev/null +++ b/src/components/Yunzhupaas/Cron/tabs/WeekUI.vue @@ -0,0 +1,125 @@ + + + diff --git a/src/components/Yunzhupaas/Cron/tabs/YearUI.vue b/src/components/Yunzhupaas/Cron/tabs/YearUI.vue new file mode 100644 index 0000000..2be7972 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/tabs/YearUI.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/components/Yunzhupaas/Cron/tabs/useTabMixin.ts b/src/components/Yunzhupaas/Cron/tabs/useTabMixin.ts new file mode 100644 index 0000000..6d479d8 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/tabs/useTabMixin.ts @@ -0,0 +1,199 @@ +// 主要用于日和星期的互斥使用 +import { computed, inject, reactive, ref, unref, watch } from 'vue'; +import { propTypes } from '@/utils/propTypes'; + +export enum TypeEnum { + unset = 'UNSET', + every = 'EVERY', + range = 'RANGE', + loop = 'LOOP', + work = 'WORK', + last = 'LAST', + specify = 'SPECIFY', +} + +// use 公共 props +export function useTabProps(options) { + const defaultValue = options?.defaultValue ?? '?'; + return { + value: propTypes.string.def(defaultValue), + disabled: propTypes.bool.def(false), + ...options?.props, + }; +} + +// use 公共 emits +export function useTabEmits() { + return ['change', 'update:value']; +} + +// use 公共 setup +export function useTabSetup(props, context, options) { + const { emit } = context; + const prefixCls = inject('prefixCls'); + const defaultValue = ref(options?.defaultValue ?? '?'); + // 类型 + const type = ref(options.defaultType ?? TypeEnum.every); + const valueList = ref([]); + // 对于不同的类型,所定义的值也有所不同 + const valueRange = reactive(options.valueRange); + const valueLoop = reactive(options.valueLoop); + const valueWeek = reactive(options.valueWeek || {}); + const valueWork = ref(options.valueWork); + const maxValue = ref(options.maxValue); + const minValue = ref(options.minValue); + + // 根据不同的类型计算出的value + const computeValue = computed(() => { + let valueArray: any[] = []; + switch (type.value) { + case TypeEnum.unset: + valueArray.push('?'); + break; + case TypeEnum.every: + valueArray.push('*'); + break; + case TypeEnum.range: + valueArray.push(`${valueRange.start}-${valueRange.end}`); + break; + case TypeEnum.loop: + valueArray.push(`${valueLoop.start}/${valueLoop.interval}`); + break; + case TypeEnum.work: + valueArray.push(`${valueWork.value}W`); + break; + case TypeEnum.last: + valueArray.push('L'); + break; + case TypeEnum.specify: + if (valueList.value.length === 0) { + valueList.value.push(minValue.value); + } + valueArray.push(valueList.value.join(',')); + break; + default: + valueArray.push(defaultValue.value); + break; + } + return valueArray.length > 0 ? valueArray.join('') : defaultValue.value; + }); + // 指定值范围区间,介于最小值和最大值之间 + const specifyRange = computed(() => { + let range: number[] = []; + if (maxValue.value != null) { + for (let i = minValue.value; i <= maxValue.value; i++) { + range.push(i); + } + } + return range; + }); + + watch( + () => props.value, + val => { + if (val !== computeValue.value) { + parseValue(val); + } + }, + { immediate: true }, + ); + + watch(computeValue, v => updateValue(v)); + + function updateValue(value) { + emit('change', value); + emit('update:value', value); + } + + /** + * parseValue + * @param value + */ + function parseValue(value) { + if (value === computeValue.value) { + return; + } + try { + if (!value || value === defaultValue.value) { + type.value = TypeEnum.every; + } else if (value.indexOf('?') >= 0) { + type.value = TypeEnum.unset; + } else if (value.indexOf('-') >= 0) { + type.value = TypeEnum.range; + const values = value.split('-'); + if (values.length >= 2) { + valueRange.start = parseInt(values[0]); + valueRange.end = parseInt(values[1]); + } + } else if (value.indexOf('/') >= 0) { + type.value = TypeEnum.loop; + const values = value.split('/'); + if (values.length >= 2) { + valueLoop.start = value[0] === '*' ? 0 : parseInt(values[0]); + valueLoop.interval = parseInt(values[1]); + } + } else if (value.indexOf('W') >= 0) { + type.value = TypeEnum.work; + const values = value.split('W'); + if (!values[0] && !isNaN(values[0])) { + valueWork.value = parseInt(values[0]); + } + } else if (value.indexOf('L') >= 0) { + type.value = TypeEnum.last; + } else if (value.indexOf(',') >= 0 || !isNaN(value)) { + type.value = TypeEnum.specify; + valueList.value = value.split(',').map(item => parseInt(item)); + } else { + type.value = TypeEnum.every; + } + } catch (e) { + type.value = TypeEnum.every; + } + } + + const beforeRadioAttrs = computed(() => ({ + class: ['choice'], + disabled: props.disabled || unref(options.disabled), + })); + const inputNumberAttrs = computed(() => ({ + class: ['w60'], + max: maxValue.value, + min: minValue.value, + precision: 0, + })); + const typeRangeAttrs = computed(() => ({ + disabled: type.value !== TypeEnum.range || props.disabled || unref(options.disabled), + ...inputNumberAttrs.value, + })); + const typeLoopAttrs = computed(() => ({ + disabled: type.value !== TypeEnum.loop || props.disabled || unref(options.disabled), + ...inputNumberAttrs.value, + })); + const typeSpecifyAttrs = computed(() => ({ + disabled: type.value !== TypeEnum.specify || props.disabled || unref(options.disabled), + class: ['list-check-item'], + })); + + return { + type, + TypeEnum, + prefixCls, + defaultValue, + valueRange, + valueLoop, + valueWeek, + valueList, + valueWork, + maxValue, + minValue, + computeValue, + specifyRange, + updateValue, + parseValue, + beforeRadioAttrs, + inputNumberAttrs, + typeRangeAttrs, + typeLoopAttrs, + typeSpecifyAttrs, + }; +} diff --git a/src/components/Yunzhupaas/Cron/validator.ts b/src/components/Yunzhupaas/Cron/validator.ts new file mode 100644 index 0000000..308f1e8 --- /dev/null +++ b/src/components/Yunzhupaas/Cron/validator.ts @@ -0,0 +1,48 @@ +import CronParser from 'cron-parser'; +import type { ValidatorRule } from 'ant-design-vue/lib/form/interface'; + +const cronRule: ValidatorRule = { + validator({}, value) { + // 没填写就不校验 + if (!value) { + return Promise.resolve(); + } + const values: string[] = value.split(' ').filter((item) => !!item); + if (values.length > 7) { + return Promise.reject('Cron表达式最多7项!'); + } + // 检查第7项 + let val: string = value; + if (values.length === 7) { + const year = values[6]; + if (year !== '*' && year !== '?') { + let yearValues: string[] = []; + if (year.indexOf('-') >= 0) { + yearValues = year.split('-'); + } else if (year.indexOf('/')) { + yearValues = year.split('/'); + } else { + yearValues = [year]; + } + // 判断是否都是数字 + const checkYear = yearValues.some((item) => isNaN(Number(item))); + if (checkYear) { + return Promise.reject('Cron表达式参数[年]错误:' + year); + } + } + // 取其中的前六项 + val = values.slice(0, 6).join(' '); + } + // 6位 没有年 + // 5位没有秒、年 + try { + const iter = CronParser.parseExpression(val); + iter.next(); + return Promise.resolve(); + } catch (e) { + return Promise.reject('Cron表达式错误:' + e); + } + }, +}; + +export default cronRule.validator; diff --git a/src/components/Yunzhupaas/DatePicker/index.ts b/src/components/Yunzhupaas/DatePicker/index.ts new file mode 100644 index 0000000..ea9120a --- /dev/null +++ b/src/components/Yunzhupaas/DatePicker/index.ts @@ -0,0 +1,10 @@ +import { withInstall } from '@/utils'; +import DatePicker from './src/DatePicker.vue'; +import DateRange from './src/DateRange.vue'; +import TimePicker from './src/TimePicker.vue'; +import TimeRange from './src/TimeRange.vue'; + +export const YunzhupaasDatePicker = withInstall(DatePicker); +export const YunzhupaasDateRange = withInstall(DateRange); +export const YunzhupaasTimePicker = withInstall(TimePicker); +export const YunzhupaasTimeRange = withInstall(TimeRange); diff --git a/src/components/Yunzhupaas/DatePicker/src/DatePicker.vue b/src/components/Yunzhupaas/DatePicker/src/DatePicker.vue new file mode 100644 index 0000000..b9a4131 --- /dev/null +++ b/src/components/Yunzhupaas/DatePicker/src/DatePicker.vue @@ -0,0 +1,185 @@ + + + diff --git a/src/components/Yunzhupaas/DatePicker/src/DateRange.vue b/src/components/Yunzhupaas/DatePicker/src/DateRange.vue new file mode 100644 index 0000000..6cdf8e2 --- /dev/null +++ b/src/components/Yunzhupaas/DatePicker/src/DateRange.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/components/Yunzhupaas/DatePicker/src/TimePicker.vue b/src/components/Yunzhupaas/DatePicker/src/TimePicker.vue new file mode 100644 index 0000000..7c40381 --- /dev/null +++ b/src/components/Yunzhupaas/DatePicker/src/TimePicker.vue @@ -0,0 +1,162 @@ + + + diff --git a/src/components/Yunzhupaas/DatePicker/src/TimeRange.vue b/src/components/Yunzhupaas/DatePicker/src/TimeRange.vue new file mode 100644 index 0000000..db06bcf --- /dev/null +++ b/src/components/Yunzhupaas/DatePicker/src/TimeRange.vue @@ -0,0 +1,148 @@ + + + diff --git a/src/components/Yunzhupaas/DatePicker/src/props.ts b/src/components/Yunzhupaas/DatePicker/src/props.ts new file mode 100644 index 0000000..456fcd7 --- /dev/null +++ b/src/components/Yunzhupaas/DatePicker/src/props.ts @@ -0,0 +1,26 @@ +export const datePickerProps = { + value: [Number, String], + format: { type: String, default: 'YYYY-MM-DD' }, + startTime: { type: Number, default: null }, + endTime: { type: Number, default: null }, +}; +export const dateRangeProps = { + value: { type: Array as PropType }, + format: { type: String, default: 'YYYY-MM-DD' }, + startTime: { type: Number, default: null }, + endTime: { type: Number, default: null }, + placeholder: { type: Array, default: ['开始日期', '结束日期'] }, +}; +export const timePickerProps = { + value: String, + format: { type: String, default: 'HH:mm:ss' }, + startTime: { type: String, default: null }, + endTime: { type: String, default: null }, +}; +export const timeRangeProps = { + value: { type: Array as PropType }, + format: { type: String, default: 'HH:mm:ss' }, + startTime: { type: String, default: null }, + endTime: { type: String, default: null }, + placeholder: { type: Array, default: ['开始时间', '结束时间'] }, +}; diff --git a/src/components/Yunzhupaas/Divider/index.ts b/src/components/Yunzhupaas/Divider/index.ts new file mode 100644 index 0000000..c9d1bbe --- /dev/null +++ b/src/components/Yunzhupaas/Divider/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import Divider from './src/Divider.vue'; + +export const YunzhupaasDivider = withInstall(Divider); diff --git a/src/components/Yunzhupaas/Divider/src/Divider.vue b/src/components/Yunzhupaas/Divider/src/Divider.vue new file mode 100644 index 0000000..8adbaad --- /dev/null +++ b/src/components/Yunzhupaas/Divider/src/Divider.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/Yunzhupaas/Empty/index.ts b/src/components/Yunzhupaas/Empty/index.ts new file mode 100644 index 0000000..b7b49ec --- /dev/null +++ b/src/components/Yunzhupaas/Empty/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import Empty from './src/Empty.vue'; + +export const YunzhupaasEmpty = withInstall(Empty); diff --git a/src/components/Yunzhupaas/Empty/src/Empty.vue b/src/components/Yunzhupaas/Empty/src/Empty.vue new file mode 100644 index 0000000..9756b79 --- /dev/null +++ b/src/components/Yunzhupaas/Empty/src/Empty.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components/Yunzhupaas/IconPicker/data/ymCustom.ts b/src/components/Yunzhupaas/IconPicker/data/ymCustom.ts new file mode 100644 index 0000000..fe131d6 --- /dev/null +++ b/src/components/Yunzhupaas/IconPicker/data/ymCustom.ts @@ -0,0 +1,12588 @@ +export const ymCustomJson = { + id: '2016749', + name: 'YUNZHUPAAS3.0-custom', + font_family: 'ym-custom', + css_prefix_text: 'ym-custom-', + description: '', + glyphs: [ + { + icon_id: '1444008', + name: 'battery-charging-40', + font_class: 'battery-charging-3', + unicode: 'e6a2', + unicode_decimal: 59042, + }, + { + icon_id: '1444265', + name: 'cloud-print-outline', + font_class: 'cloud-print-outline', + unicode: 'e7a2', + unicode_decimal: 59298, + }, + { + icon_id: '1444522', + name: 'filter-outline', + font_class: 'filter-outline', + unicode: 'e8a2', + unicode_decimal: 59554, + }, + { + icon_id: '1444779', + name: 'instapaper', + font_class: 'instapaper', + unicode: 'e9a2', + unicode_decimal: 59810, + }, + { + icon_id: '1445035', + name: 'package-variant-closed', + font_class: 'package-variant-closed', + unicode: 'eaa2', + unicode_decimal: 60066, + }, + { + icon_id: '1445291', + name: 'signal-3g', + font_class: 'signal-g2', + unicode: 'eba2', + unicode_decimal: 60322, + }, + { + icon_id: '1445548', + name: 'view-module', + font_class: 'view-module', + unicode: 'eca2', + unicode_decimal: 60578, + }, + { + icon_id: '1444009', + name: 'battery-charging-100', + font_class: 'battery-charging-4', + unicode: 'e6a3', + unicode_decimal: 59043, + }, + { + icon_id: '1444266', + name: 'cloud-upload', + font_class: 'cloud-upload', + unicode: 'e7a3', + unicode_decimal: 59299, + }, + { + icon_id: '1444523', + name: 'filter-variant', + font_class: 'filter-variant', + unicode: 'e8a3', + unicode_decimal: 59555, + }, + { + icon_id: '1444780', + name: 'invert-colors', + font_class: 'invert-colors', + unicode: 'e9a3', + unicode_decimal: 59811, + }, + { + icon_id: '1445036', + name: 'page-first', + font_class: 'page-first', + unicode: 'eaa3', + unicode_decimal: 60067, + }, + { + icon_id: '1445292', + name: 'signal-hspa', + font_class: 'signal-hspa', + unicode: 'eba3', + unicode_decimal: 60323, + }, + { + icon_id: '1445549', + name: 'view-parallel', + font_class: 'view-parallel', + unicode: 'eca3', + unicode_decimal: 60579, + }, + { + icon_id: '1444010', + name: 'battery-charging-90', + font_class: 'battery-charging-5', + unicode: 'e6a4', + unicode_decimal: 59044, + }, + { + icon_id: '1444267', + name: 'cloud-sync', + font_class: 'cloud-sync', + unicode: 'e7a4', + unicode_decimal: 59300, + }, + { + icon_id: '1444524', + name: 'fish', + font_class: 'fish', + unicode: 'e8a4', + unicode_decimal: 59556, + }, + { + icon_id: '1444781', + name: 'itunes', + font_class: 'itunes', + unicode: 'e9a4', + unicode_decimal: 59812, + }, + { + icon_id: '1445037', + name: 'palette', + font_class: 'palette', + unicode: 'eaa4', + unicode_decimal: 60068, + }, + { + icon_id: '1445293', + name: 'signal-hspa-plus', + font_class: 'signal-hspa-plus', + unicode: 'eba4', + unicode_decimal: 60324, + }, + { + icon_id: '1445550', + name: 'view-quilt', + font_class: 'view-quilt', + unicode: 'eca4', + unicode_decimal: 60580, + }, + { + icon_id: '1444011', + name: 'battery-charging-80', + font_class: 'battery-charging-6', + unicode: 'e6a5', + unicode_decimal: 59045, + }, + { + icon_id: '1444268', + name: 'code-array', + font_class: 'code-array', + unicode: 'e7a5', + unicode_decimal: 59301, + }, + { + icon_id: '1444525', + name: 'flag', + font_class: 'flag', + unicode: 'e8a5', + unicode_decimal: 59557, + }, + { + icon_id: '1444782', + name: 'internet-explorer', + font_class: 'internet-explorer', + unicode: 'e9a5', + unicode_decimal: 59813, + }, + { + icon_id: '1445038', + name: 'page-last', + font_class: 'page-last', + unicode: 'eaa5', + unicode_decimal: 60069, + }, + { + icon_id: '1445294', + name: 'signal-variant', + font_class: 'signal-variant', + unicode: 'eba5', + unicode_decimal: 60325, + }, + { + icon_id: '1445551', + name: 'view-stream', + font_class: 'view-stream', + unicode: 'eca5', + unicode_decimal: 60581, + }, + { + icon_id: '1444012', + name: 'battery-minus', + font_class: 'battery-minus', + unicode: 'e6a6', + unicode_decimal: 59046, + }, + { + icon_id: '1444269', + name: 'code-brackets', + font_class: 'code-brackets', + unicode: 'e7a6', + unicode_decimal: 59302, + }, + { + icon_id: '1444526', + name: 'firefox', + font_class: 'firefox', + unicode: 'e8a6', + unicode_decimal: 59558, + }, + { + icon_id: '1444783', + name: 'jeepney', + font_class: 'jeepney', + unicode: 'e9a6', + unicode_decimal: 59814, + }, + { + icon_id: '1445039', + name: 'palette-advanced', + font_class: 'palette-advanced', + unicode: 'eaa6', + unicode_decimal: 60070, + }, + { + icon_id: '1445295', + name: 'silverware-fork', + font_class: 'silverware-fork', + unicode: 'eba6', + unicode_decimal: 60326, + }, + { + icon_id: '1445552', + name: 'view-sequential', + font_class: 'view-sequential', + unicode: 'eca6', + unicode_decimal: 60582, + }, + { + icon_id: '1444013', + name: 'battery-outline', + font_class: 'battery-outline', + unicode: 'e6a7', + unicode_decimal: 59047, + }, + { + icon_id: '1444270', + name: 'code-braces', + font_class: 'code-braces', + unicode: 'e7a7', + unicode_decimal: 59303, + }, + { + icon_id: '1444527', + name: 'fingerprint', + font_class: 'fingerprint', + unicode: 'e8a7', + unicode_decimal: 59559, + }, + { + icon_id: '1444784', + name: 'jira', + font_class: 'jira', + unicode: 'e9a7', + unicode_decimal: 59815, + }, + { + icon_id: '1445040', + name: 'panda', + font_class: 'panda', + unicode: 'eaa7', + unicode_decimal: 60071, + }, + { + icon_id: '1445296', + name: 'sign-caution', + font_class: 'sign-caution', + unicode: 'eba7', + unicode_decimal: 60327, + }, + { + icon_id: '1445553', + name: 'view-headline', + font_class: 'view-headline', + unicode: 'eca7', + unicode_decimal: 60583, + }, + { + icon_id: '1444014', + name: 'battery-negative', + font_class: 'battery-negative', + unicode: 'e6a8', + unicode_decimal: 59048, + }, + { + icon_id: '1444271', + name: 'code-equal', + font_class: 'code-equal', + unicode: 'e7a8', + unicode_decimal: 59304, + }, + { + icon_id: '1444528', + name: 'fire', + font_class: 'fire', + unicode: 'e8a8', + unicode_decimal: 59560, + }, + { + icon_id: '1444785', + name: 'jsfiddle', + font_class: 'jsfiddle', + unicode: 'e9a8', + unicode_decimal: 59816, + }, + { + icon_id: '1445041', + name: 'pandora', + font_class: 'pandora', + unicode: 'eaa8', + unicode_decimal: 60072, + }, + { + icon_id: '1445297', + name: 'silverware', + font_class: 'silverware', + unicode: 'eba8', + unicode_decimal: 60328, + }, + { + icon_id: '1445554', + name: 'view-week', + font_class: 'view-week', + unicode: 'eca8', + unicode_decimal: 60584, + }, + { + icon_id: '1444015', + name: 'battery-positive', + font_class: 'battery-positive', + unicode: 'e6a9', + unicode_decimal: 59049, + }, + { + icon_id: '1444272', + name: 'code-greater-than', + font_class: 'code-greater-than', + unicode: 'e7a9', + unicode_decimal: 59305, + }, + { + icon_id: '1444529', + name: 'flag-checkered', + font_class: 'flag-checkered', + unicode: 'e8a9', + unicode_decimal: 59561, + }, + { + icon_id: '1444786', + name: 'keg', + font_class: 'keg', + unicode: 'e9a9', + unicode_decimal: 59817, + }, + { + icon_id: '1445042', + name: 'panorama', + font_class: 'panorama', + unicode: 'eaa9', + unicode_decimal: 60073, + }, + { + icon_id: '1445298', + name: 'silverware-spoon', + font_class: 'silverware-spoon', + unicode: 'eba9', + unicode_decimal: 60329, + }, + { + icon_id: '1445555', + name: 'vimeo', + font_class: 'vimeo', + unicode: 'eca9', + unicode_decimal: 60585, + }, + { + icon_id: '1444016', + name: 'battery-plus', + font_class: 'battery-plus', + unicode: 'e6aa', + unicode_decimal: 59050, + }, + { + icon_id: '1444273', + name: 'code-less-than', + font_class: 'code-less-than', + unicode: 'e7aa', + unicode_decimal: 59306, + }, + { + icon_id: '1444530', + name: 'flag-triangle', + font_class: 'flag-triangle', + unicode: 'e8aa', + unicode_decimal: 59562, + }, + { + icon_id: '1444787', + name: 'json', + font_class: 'json', + unicode: 'e9aa', + unicode_decimal: 59818, + }, + { + icon_id: '1445043', + name: 'panorama-fisheye', + font_class: 'panorama-fisheye', + unicode: 'eaaa', + unicode_decimal: 60074, + }, + { + icon_id: '1445299', + name: 'silverware-variant', + font_class: 'silverware-variant', + unicode: 'ebaa', + unicode_decimal: 60330, + }, + { + icon_id: '1445556', + name: 'vine', + font_class: 'vine', + unicode: 'ecaa', + unicode_decimal: 60586, + }, + { + icon_id: '1444017', + name: 'battery-unknown', + font_class: 'battery-unknown', + unicode: 'e6ab', + unicode_decimal: 59051, + }, + { + icon_id: '1444274', + name: 'code-greater-than-or-equal', + font_class: 'code-greater-than-or-equal', + unicode: 'e7ab', + unicode_decimal: 59307, + }, + { + icon_id: '1444531', + name: 'flag-outline', + font_class: 'flag-outline', + unicode: 'e8ab', + unicode_decimal: 59563, + }, + { + icon_id: '1444788', + name: 'kettle', + font_class: 'kettle', + unicode: 'e9ab', + unicode_decimal: 59819, + }, + { + icon_id: '1445044', + name: 'panorama-horizontal', + font_class: 'panorama-horizontal', + unicode: 'eaab', + unicode_decimal: 60075, + }, + { + icon_id: '1445300', + name: 'sim', + font_class: 'sim', + unicode: 'ebab', + unicode_decimal: 60331, + }, + { + icon_id: '1445557', + name: 'view-grid', + font_class: 'view-grid', + unicode: 'ecab', + unicode_decimal: 60587, + }, + { + icon_id: '1444018', + name: 'beach', + font_class: 'beach', + unicode: 'e6ac', + unicode_decimal: 59052, + }, + { + icon_id: '1444275', + name: 'code-less-than-or-equal', + font_class: 'code-less-than-or-equal', + unicode: 'e7ac', + unicode_decimal: 59308, + }, + { + icon_id: '1444532', + name: 'flag-variant', + font_class: 'flag-variant', + unicode: 'e8ac', + unicode_decimal: 59564, + }, + { + icon_id: '1444789', + name: 'key', + font_class: 'key', + unicode: 'e9ac', + unicode_decimal: 59820, + }, + { + icon_id: '1445045', + name: 'panorama-vertical', + font_class: 'panorama-vertical', + unicode: 'eaac', + unicode_decimal: 60076, + }, + { + icon_id: '1445301', + name: 'sim-alert', + font_class: 'sim-alert', + unicode: 'ebac', + unicode_decimal: 60332, + }, + { + icon_id: '1445558', + name: 'visualstudio', + font_class: 'visualstudio', + unicode: 'ecac', + unicode_decimal: 60588, + }, + { + icon_id: '1444019', + name: 'beats', + font_class: 'beats', + unicode: 'e6ad', + unicode_decimal: 59053, + }, + { + icon_id: '1444276', + name: 'code-not-equal', + font_class: 'code-not-equal', + unicode: 'e7ad', + unicode_decimal: 59309, + }, + { + icon_id: '1444533', + name: 'flag-outline-variant', + font_class: 'flag-outline-variant', + unicode: 'e8ad', + unicode_decimal: 59565, + }, + { + icon_id: '1444790', + name: 'key-change', + font_class: 'key-change', + unicode: 'e9ad', + unicode_decimal: 59821, + }, + { + icon_id: '1445046', + name: 'panorama-wide-angle', + font_class: 'panorama-wide-angle', + unicode: 'eaad', + unicode_decimal: 60077, + }, + { + icon_id: '1445302', + name: 'skip-backward', + font_class: 'skip-backward', + unicode: 'ebad', + unicode_decimal: 60333, + }, + { + icon_id: '1445559', + name: 'violin', + font_class: 'violin', + unicode: 'ecad', + unicode_decimal: 60589, + }, + { + icon_id: '1444020', + name: 'beaker', + font_class: 'beaker', + unicode: 'e6ae', + unicode_decimal: 59054, + }, + { + icon_id: '1444277', + name: 'code-not-equal-variant', + font_class: 'code-not-equal-variant', + unicode: 'e7ae', + unicode_decimal: 59310, + }, + { + icon_id: '1444534', + name: 'flash-auto', + font_class: 'flash-auto', + unicode: 'e8ae', + unicode_decimal: 59566, + }, + { + icon_id: '1444791', + name: 'key-minus', + font_class: 'key-minus', + unicode: 'e9ae', + unicode_decimal: 59822, + }, + { + icon_id: '1445047', + name: 'paper-cut-vertical', + font_class: 'paper-cut-vertical', + unicode: 'eaae', + unicode_decimal: 60078, + }, + { + icon_id: '1445303', + name: 'sitemap', + font_class: 'sitemap', + unicode: 'ebae', + unicode_decimal: 60334, + }, + { + icon_id: '1445560', + name: 'vk', + font_class: 'vk', + unicode: 'ecae', + unicode_decimal: 60590, + }, + { + icon_id: '1444021', + name: 'bell', + font_class: 'bell', + unicode: 'e6af', + unicode_decimal: 59055, + }, + { + icon_id: '1444278', + name: 'code-parentheses', + font_class: 'code-parentheses', + unicode: 'e7af', + unicode_decimal: 59311, + }, + { + icon_id: '1444535', + name: 'flash', + font_class: 'flash', + unicode: 'e8af', + unicode_decimal: 59567, + }, + { + icon_id: '1444792', + name: 'key-remove', + font_class: 'key-remove', + unicode: 'e9af', + unicode_decimal: 59823, + }, + { + icon_id: '1445048', + name: 'paperclip', + font_class: 'paperclip', + unicode: 'eaaf', + unicode_decimal: 60079, + }, + { + icon_id: '1445304', + name: 'skip-next', + font_class: 'skip-next', + unicode: 'ebaf', + unicode_decimal: 60335, + }, + { + icon_id: '1445561', + name: 'vk-box', + font_class: 'vk-box', + unicode: 'ecaf', + unicode_decimal: 60591, + }, + { + icon_id: '1444022', + name: 'beer', + font_class: 'beer', + unicode: 'e6b0', + unicode_decimal: 59056, + }, + { + icon_id: '1444279', + name: 'code-string', + font_class: 'code-string', + unicode: 'e7b0', + unicode_decimal: 59312, + }, + { + icon_id: '1444536', + name: 'flashlight', + font_class: 'flashlight', + unicode: 'e8b0', + unicode_decimal: 59568, + }, + { + icon_id: '1444793', + name: 'key-plus', + font_class: 'key-plus', + unicode: 'e9b0', + unicode_decimal: 59824, + }, + { + icon_id: '1445049', + name: 'parking', + font_class: 'parking', + unicode: 'eab0', + unicode_decimal: 60080, + }, + { + icon_id: '1445305', + name: 'skip-forward', + font_class: 'skip-forward', + unicode: 'ebb0', + unicode_decimal: 60336, + }, + { + icon_id: '1445562', + name: 'vk-circle', + font_class: 'vk-circle', + unicode: 'ecb0', + unicode_decimal: 60592, + }, + { + icon_id: '1444023', + name: 'behance', + font_class: 'behance', + unicode: 'e6b1', + unicode_decimal: 59057, + }, + { + icon_id: '1444280', + name: 'codepen', + font_class: 'codepen', + unicode: 'e7b1', + unicode_decimal: 59313, + }, + { + icon_id: '1444537', + name: 'flash-outline', + font_class: 'flash-outline', + unicode: 'e8b1', + unicode_decimal: 59569, + }, + { + icon_id: '1444794', + name: 'keyboard', + font_class: 'keyboard', + unicode: 'e9b1', + unicode_decimal: 59825, + }, + { + icon_id: '1445050', + name: 'pause', + font_class: 'pause', + unicode: 'eab1', + unicode_decimal: 60081, + }, + { + icon_id: '1445306', + name: 'sim-off', + font_class: 'sim-off', + unicode: 'ebb1', + unicode_decimal: 60337, + }, + { + icon_id: '1445563', + name: 'vlc', + font_class: 'vlc', + unicode: 'ecb1', + unicode_decimal: 60593, + }, + { + icon_id: '1444024', + name: 'bell-off', + font_class: 'bell-off', + unicode: 'e6b2', + unicode_decimal: 59058, + }, + { + icon_id: '1444281', + name: 'code-tags', + font_class: 'code-tags', + unicode: 'e7b2', + unicode_decimal: 59314, + }, + { + icon_id: '1444538', + name: 'flash-off', + font_class: 'flash-off', + unicode: 'e8b2', + unicode_decimal: 59570, + }, + { + icon_id: '1444795', + name: 'keyboard-caps', + font_class: 'keyboard-caps', + unicode: 'e9b2', + unicode_decimal: 59826, + }, + { + icon_id: '1445051', + name: 'pause-circle', + font_class: 'pause-circle', + unicode: 'eab2', + unicode_decimal: 60082, + }, + { + icon_id: '1445307', + name: 'skip-next-circle', + font_class: 'skip-next-circle', + unicode: 'ebb2', + unicode_decimal: 60338, + }, + { + icon_id: '1445564', + name: 'voice', + font_class: 'voice', + unicode: 'ecb2', + unicode_decimal: 60594, + }, + { + icon_id: '1444025', + name: 'bell-plus', + font_class: 'bell-plus', + unicode: 'e6b3', + unicode_decimal: 59059, + }, + { + icon_id: '1444282', + name: 'code-tags-check', + font_class: 'code-tags-check', + unicode: 'e7b3', + unicode_decimal: 59315, + }, + { + icon_id: '1444539', + name: 'flask', + font_class: 'flask', + unicode: 'e8b3', + unicode_decimal: 59571, + }, + { + icon_id: '1444796', + name: 'keyboard-backspace', + font_class: 'keyboard-backspace', + unicode: 'e9b3', + unicode_decimal: 59827, + }, + { + icon_id: '1445052', + name: 'pause-circle-outline', + font_class: 'pause-circle-outline', + unicode: 'eab3', + unicode_decimal: 60083, + }, + { + icon_id: '1445308', + name: 'skip-previous', + font_class: 'skip-previous', + unicode: 'ebb3', + unicode_decimal: 60339, + }, + { + icon_id: '1445565', + name: 'voicemail', + font_class: 'voicemail', + unicode: 'ecb3', + unicode_decimal: 60595, + }, + { + icon_id: '1444026', + name: 'bell-outline', + font_class: 'bell-outline', + unicode: 'e6b4', + unicode_decimal: 59060, + }, + { + icon_id: '1444283', + name: 'coffee', + font_class: 'coffee', + unicode: 'e7b4', + unicode_decimal: 59316, + }, + { + icon_id: '1444540', + name: 'flashlight-off', + font_class: 'flashlight-off', + unicode: 'e8b4', + unicode_decimal: 59572, + }, + { + icon_id: '1444797', + name: 'keyboard-close', + font_class: 'keyboard-close', + unicode: 'e9b4', + unicode_decimal: 59828, + }, + { + icon_id: '1445053', + name: 'pause-octagon', + font_class: 'pause-octagon', + unicode: 'eab4', + unicode_decimal: 60084, + }, + { + icon_id: '1445309', + name: 'skip-previous-circle', + font_class: 'skip-previous-circle', + unicode: 'ebb4', + unicode_decimal: 60340, + }, + { + icon_id: '1445566', + name: 'volume-high', + font_class: 'volume-high', + unicode: 'ecb4', + unicode_decimal: 60596, + }, + { + icon_id: '1444027', + name: 'bell-ring', + font_class: 'bell-ring', + unicode: 'e6b5', + unicode_decimal: 59061, + }, + { + icon_id: '1444284', + name: 'coffee-outline', + font_class: 'coffee-outline', + unicode: 'e7b5', + unicode_decimal: 59317, + }, + { + icon_id: '1444541', + name: 'flash-red-eye', + font_class: 'flash-red-eye', + unicode: 'e8b5', + unicode_decimal: 59573, + }, + { + icon_id: '1444798', + name: 'keyboard-return', + font_class: 'keyboard-return', + unicode: 'e9b5', + unicode_decimal: 59829, + }, + { + icon_id: '1445054', + name: 'pause-octagon-outline', + font_class: 'pause-octagon-outline', + unicode: 'eab5', + unicode_decimal: 60085, + }, + { + icon_id: '1445310', + name: 'skip-next-circle-outline', + font_class: 'skip-next-circle-outline', + unicode: 'ebb5', + unicode_decimal: 60341, + }, + { + icon_id: '1445567', + name: 'volume-low', + font_class: 'volume-low', + unicode: 'ecb5', + unicode_decimal: 60597, + }, + { + icon_id: '1444028', + name: 'bell-ring-outline', + font_class: 'bell-ring-outline', + unicode: 'e6b6', + unicode_decimal: 59062, + }, + { + icon_id: '1444285', + name: 'coffee-to-go', + font_class: 'coffee-to-go', + unicode: 'e7b6', + unicode_decimal: 59318, + }, + { + icon_id: '1444542', + name: 'flask-empty', + font_class: 'flask-empty', + unicode: 'e8b6', + unicode_decimal: 59574, + }, + { + icon_id: '1444799', + name: 'keyboard-off', + font_class: 'keyboard-off', + unicode: 'e9b6', + unicode_decimal: 59830, + }, + { + icon_id: '1445055', + name: 'paw', + font_class: 'paw', + unicode: 'eab6', + unicode_decimal: 60086, + }, + { + icon_id: '1445311', + name: 'skip-previous-circle-outline', + font_class: 'skip-previous-circle-outline', + unicode: 'ebb6', + unicode_decimal: 60342, + }, + { + icon_id: '1445568', + name: 'volume-medium', + font_class: 'volume-medium', + unicode: 'ecb6', + unicode_decimal: 60598, + }, + { + icon_id: '1444029', + name: 'bell-sleep', + font_class: 'bell-sleep', + unicode: 'e6b7', + unicode_decimal: 59063, + }, + { + icon_id: '1444286', + name: 'coin', + font_class: 'coin', + unicode: 'e7b7', + unicode_decimal: 59319, + }, + { + icon_id: '1444543', + name: 'flask-outline', + font_class: 'flask-outline', + unicode: 'e8b7', + unicode_decimal: 59575, + }, + { + icon_id: '1444800', + name: 'key-variant', + font_class: 'key-variant', + unicode: 'e9b7', + unicode_decimal: 59831, + }, + { + icon_id: '1445056', + name: 'pencil', + font_class: 'pencil', + unicode: 'eab7', + unicode_decimal: 60087, + }, + { + icon_id: '1445312', + name: 'skull', + font_class: 'skull', + unicode: 'ebb7', + unicode_decimal: 60343, + }, + { + icon_id: '1445569', + name: 'volume-off', + font_class: 'volume-off', + unicode: 'ecb7', + unicode_decimal: 60599, + }, + { + icon_id: '1444031', + name: 'beta', + font_class: 'beta', + unicode: 'e6b8', + unicode_decimal: 59064, + }, + { + icon_id: '1444287', + name: 'coins', + font_class: 'coins', + unicode: 'e7b8', + unicode_decimal: 59320, + }, + { + icon_id: '1444544', + name: 'flip-to-back', + font_class: 'flip-to-back', + unicode: 'e8b8', + unicode_decimal: 59576, + }, + { + icon_id: '1444801', + name: 'keyboard-variant', + font_class: 'keyboard-variant', + unicode: 'e9b8', + unicode_decimal: 59832, + }, + { + icon_id: '1445057', + name: 'paw-off', + font_class: 'paw-off', + unicode: 'eab8', + unicode_decimal: 60088, + }, + { + icon_id: '1445313', + name: 'skype', + font_class: 'skype', + unicode: 'ebb8', + unicode_decimal: 60344, + }, + { + icon_id: '1445570', + name: 'walk', + font_class: 'walk', + unicode: 'ecb8', + unicode_decimal: 60600, + }, + { + icon_id: '1444032', + name: 'bible', + font_class: 'bible', + unicode: 'e6b9', + unicode_decimal: 59065, + }, + { + icon_id: '1444288', + name: 'collage', + font_class: 'collage', + unicode: 'e7b9', + unicode_decimal: 59321, + }, + { + icon_id: '1444545', + name: 'flattr', + font_class: 'flattr', + unicode: 'e8b9', + unicode_decimal: 59577, + }, + { + icon_id: '1444802', + name: 'label', + font_class: 'label', + unicode: 'e9b9', + unicode_decimal: 59833, + }, + { + icon_id: '1445058', + name: 'pencil-box', + font_class: 'pencil-box', + unicode: 'eab9', + unicode_decimal: 60089, + }, + { + icon_id: '1445314', + name: 'skype-business', + font_class: 'skype-business', + unicode: 'ebb9', + unicode_decimal: 60345, + }, + { + icon_id: '1445571', + name: 'vpn', + font_class: 'vpn', + unicode: 'ecb9', + unicode_decimal: 60601, + }, + { + icon_id: '1444033', + name: 'bike', + font_class: 'bike', + unicode: 'e6ba', + unicode_decimal: 59066, + }, + { + icon_id: '1444289', + name: 'color-helper', + font_class: 'color-helper', + unicode: 'e7ba', + unicode_decimal: 59322, + }, + { + icon_id: '1444546', + name: 'flask-empty-outline', + font_class: 'flask-empty-outline', + unicode: 'e8ba', + unicode_decimal: 59578, + }, + { + icon_id: '1444803', + name: 'kodi', + font_class: 'kodi', + unicode: 'e9ba', + unicode_decimal: 59834, + }, + { + icon_id: '1445059', + name: 'pencil-box-outline', + font_class: 'pencil-box-outline', + unicode: 'eaba', + unicode_decimal: 60090, + }, + { + icon_id: '1445315', + name: 'slack', + font_class: 'slack', + unicode: 'ebba', + unicode_decimal: 60346, + }, + { + icon_id: '1445572', + name: 'wallet', + font_class: 'wallet', + unicode: 'ecba', + unicode_decimal: 60602, + }, + { + icon_id: '1444034', + name: 'bing', + font_class: 'bing', + unicode: 'e6bb', + unicode_decimal: 59067, + }, + { + icon_id: '1444290', + name: 'comment', + font_class: 'comment', + unicode: 'e7bb', + unicode_decimal: 59323, + }, + { + icon_id: '1444547', + name: 'flip-to-front', + font_class: 'flip-to-front', + unicode: 'e8bb', + unicode_decimal: 59579, + }, + { + icon_id: '1444804', + name: 'keyboard-tab', + font_class: 'keyboard-tab', + unicode: 'e9bb', + unicode_decimal: 59835, + }, + { + icon_id: '1445060', + name: 'pencil-circle', + font_class: 'pencil-circle', + unicode: 'eabb', + unicode_decimal: 60091, + }, + { + icon_id: '1445316', + name: 'sleep', + font_class: 'sleep', + unicode: 'ebbb', + unicode_decimal: 60347, + }, + { + icon_id: '1445573', + name: 'wallet-giftcard', + font_class: 'wallet-giftcard', + unicode: 'ecbb', + unicode_decimal: 60603, + }, + { + icon_id: '1444035', + name: 'binoculars', + font_class: 'binoculars', + unicode: 'e6bc', + unicode_decimal: 59068, + }, + { + icon_id: '1444291', + name: 'comment-account', + font_class: 'comment-account', + unicode: 'e7bc', + unicode_decimal: 59324, + }, + { + icon_id: '1444548', + name: 'floppy', + font_class: 'floppy', + unicode: 'e8bc', + unicode_decimal: 59580, + }, + { + icon_id: '1444805', + name: 'label-outline', + font_class: 'label-outline', + unicode: 'e9bc', + unicode_decimal: 59836, + }, + { + icon_id: '1445061', + name: 'pencil-lock', + font_class: 'pencil-lock', + unicode: 'eabc', + unicode_decimal: 60092, + }, + { + icon_id: '1445317', + name: 'smoking', + font_class: 'smoking', + unicode: 'ebbc', + unicode_decimal: 60348, + }, + { + icon_id: '1445574', + name: 'wallet-travel', + font_class: 'wallet-travel', + unicode: 'ecbc', + unicode_decimal: 60604, + }, + { + icon_id: '1444036', + name: 'bio', + font_class: 'bio', + unicode: 'e6bd', + unicode_decimal: 59069, + }, + { + icon_id: '1444292', + name: 'comment-alert', + font_class: 'comment-alert', + unicode: 'e7bd', + unicode_decimal: 59325, + }, + { + icon_id: '1444549', + name: 'flower', + font_class: 'flower', + unicode: 'e8bd', + unicode_decimal: 59581, + }, + { + icon_id: '1444806', + name: 'lambda', + font_class: 'lambda', + unicode: 'e9bd', + unicode_decimal: 59837, + }, + { + icon_id: '1445062', + name: 'pencil-off', + font_class: 'pencil-off', + unicode: 'eabd', + unicode_decimal: 60093, + }, + { + icon_id: '1445318', + name: 'sleep-off', + font_class: 'sleep-off', + unicode: 'ebbd', + unicode_decimal: 60349, + }, + { + icon_id: '1445575', + name: 'wallet-membership', + font_class: 'wallet-membership', + unicode: 'ecbd', + unicode_decimal: 60605, + }, + { + icon_id: '1444037', + name: 'biohazard', + font_class: 'biohazard', + unicode: 'e6be', + unicode_decimal: 59070, + }, + { + icon_id: '1444293', + name: 'comment-account-outline', + font_class: 'comment-account-outline', + unicode: 'e7be', + unicode_decimal: 59326, + }, + { + icon_id: '1444550', + name: 'folder', + font_class: 'folder', + unicode: 'e8be', + unicode_decimal: 59582, + }, + { + icon_id: '1444807', + name: 'lamp', + font_class: 'lamp', + unicode: 'e9be', + unicode_decimal: 59838, + }, + { + icon_id: '1445063', + name: 'pen', + font_class: 'pen', + unicode: 'eabe', + unicode_decimal: 60094, + }, + { + icon_id: '1445319', + name: 'smoking-off', + font_class: 'smoking-off', + unicode: 'ebbe', + unicode_decimal: 60350, + }, + { + icon_id: '1445576', + name: 'wan', + font_class: 'wan', + unicode: 'ecbe', + unicode_decimal: 60606, + }, + { + icon_id: '1444038', + name: 'bitbucket', + font_class: 'bitbucket', + unicode: 'e6bf', + unicode_decimal: 59071, + }, + { + icon_id: '1444294', + name: 'comment-alert-outline', + font_class: 'comment-alert-outline', + unicode: 'e7bf', + unicode_decimal: 59327, + }, + { + icon_id: '1444551', + name: 'folder-account', + font_class: 'folder-account', + unicode: 'e8bf', + unicode_decimal: 59583, + }, + { + icon_id: '1444808', + name: 'lan', + font_class: 'lan', + unicode: 'e9bf', + unicode_decimal: 59839, + }, + { + icon_id: '1445064', + name: 'pentagon-outline', + font_class: 'pentagon-outline', + unicode: 'eabf', + unicode_decimal: 60095, + }, + { + icon_id: '1445320', + name: 'snapchat', + font_class: 'snapchat', + unicode: 'ebbf', + unicode_decimal: 60351, + }, + { + icon_id: '1445577', + name: 'washing-machine', + font_class: 'washing-machine', + unicode: 'ecbf', + unicode_decimal: 60607, + }, + { + icon_id: '1444039', + name: 'black-mesa', + font_class: 'black-mesa', + unicode: 'e6c0', + unicode_decimal: 59072, + }, + { + icon_id: '1444295', + name: 'comment-check', + font_class: 'comment-check', + unicode: 'e7c0', + unicode_decimal: 59328, + }, + { + icon_id: '1444552', + name: 'folder-google-drive', + font_class: 'folder-google-drive', + unicode: 'e8c0', + unicode_decimal: 59584, + }, + { + icon_id: '1444809', + name: 'lan-disconnect', + font_class: 'lan-disconnect', + unicode: 'e9c0', + unicode_decimal: 59840, + }, + { + icon_id: '1445065', + name: 'pentagon', + font_class: 'pentagon', + unicode: 'eac0', + unicode_decimal: 60096, + }, + { + icon_id: '1445321', + name: 'sofa', + font_class: 'sofa', + unicode: 'ebc0', + unicode_decimal: 60352, + }, + { + icon_id: '1445578', + name: 'watch', + font_class: 'watch', + unicode: 'ecc0', + unicode_decimal: 60608, + }, + { + icon_id: '1444040', + name: 'blackberry', + font_class: 'blackberry', + unicode: 'e6c1', + unicode_decimal: 59073, + }, + { + icon_id: '1444296', + name: 'comment-check-outline', + font_class: 'comment-check-outline', + unicode: 'e7c1', + unicode_decimal: 59329, + }, + { + icon_id: '1444553', + name: 'folder-download', + font_class: 'folder-download', + unicode: 'e8c1', + unicode_decimal: 59585, + }, + { + icon_id: '1444810', + name: 'language-c', + font_class: 'language-c', + unicode: 'e9c1', + unicode_decimal: 59841, + }, + { + icon_id: '1445066', + name: 'pharmacy', + font_class: 'pharmacy', + unicode: 'eac1', + unicode_decimal: 60097, + }, + { + icon_id: '1445322', + name: 'snowman', + font_class: 'snowman', + unicode: 'ebc1', + unicode_decimal: 60353, + }, + { + icon_id: '1445579', + name: 'watch-import', + font_class: 'watch-import', + unicode: 'ecc1', + unicode_decimal: 60609, + }, + { + icon_id: '1444041', + name: 'blender', + font_class: 'blender', + unicode: 'e6c2', + unicode_decimal: 59074, + }, + { + icon_id: '1444297', + name: 'comment-multiple-outline', + font_class: 'comment-multiple-outline', + unicode: 'e7c2', + unicode_decimal: 59330, + }, + { + icon_id: '1444554', + name: 'folder-image', + font_class: 'folder-image', + unicode: 'e8c2', + unicode_decimal: 59586, + }, + { + icon_id: '1444811', + name: 'lan-connect', + font_class: 'lan-connect', + unicode: 'e9c2', + unicode_decimal: 59842, + }, + { + icon_id: '1445067', + name: 'percent', + font_class: 'percent', + unicode: 'eac2', + unicode_decimal: 60098, + }, + { + icon_id: '1445323', + name: 'soccer', + font_class: 'soccer', + unicode: 'ebc2', + unicode_decimal: 60354, + }, + { + icon_id: '1445580', + name: 'watch-export', + font_class: 'watch-export', + unicode: 'ecc2', + unicode_decimal: 60610, + }, + { + icon_id: '1444042', + name: 'blinds', + font_class: 'blinds', + unicode: 'e6c3', + unicode_decimal: 59075, + }, + { + icon_id: '1444298', + name: 'comment-outline', + font_class: 'comment-outline', + unicode: 'e7c3', + unicode_decimal: 59331, + }, + { + icon_id: '1444555', + name: 'folder-lock', + font_class: 'folder-lock', + unicode: 'e8c3', + unicode_decimal: 59587, + }, + { + icon_id: '1444812', + name: 'language-cpp', + font_class: 'language-cpp', + unicode: 'e9c3', + unicode_decimal: 59843, + }, + { + icon_id: '1445068', + name: 'phone', + font_class: 'phone', + unicode: 'eac3', + unicode_decimal: 60099, + }, + { + icon_id: '1445324', + name: 'solid', + font_class: 'solid', + unicode: 'ebc3', + unicode_decimal: 60355, + }, + { + icon_id: '1445581', + name: 'water', + font_class: 'water', + unicode: 'ecc3', + unicode_decimal: 60611, + }, + { + icon_id: '1444043', + name: 'block-helper', + font_class: 'block-helper', + unicode: 'e6c4', + unicode_decimal: 59076, + }, + { + icon_id: '1444299', + name: 'comment-plus-outline', + font_class: 'comment-plus-outline', + unicode: 'e7c4', + unicode_decimal: 59332, + }, + { + icon_id: '1444556', + name: 'folder-lock-open', + font_class: 'folder-lock-open', + unicode: 'e8c4', + unicode_decimal: 59588, + }, + { + icon_id: '1444813', + name: 'language-css3', + font_class: 'language-css', + unicode: 'e9c4', + unicode_decimal: 59844, + }, + { + icon_id: '1445069', + name: 'phone-bluetooth', + font_class: 'phone-bluetooth', + unicode: 'eac4', + unicode_decimal: 60100, + }, + { + icon_id: '1445325', + name: 'sort', + font_class: 'sort', + unicode: 'ebc4', + unicode_decimal: 60356, + }, + { + icon_id: '1445582', + name: 'watch-vibrate', + font_class: 'watch-vibrate', + unicode: 'ecc4', + unicode_decimal: 60612, + }, + { + icon_id: '1444044', + name: 'bluetooth', + font_class: 'bluetooth', + unicode: 'e6c5', + unicode_decimal: 59077, + }, + { + icon_id: '1444300', + name: 'comment-processing', + font_class: 'comment-processing', + unicode: 'e7c5', + unicode_decimal: 59333, + }, + { + icon_id: '1444557', + name: 'folder-multiple', + font_class: 'folder-multiple', + unicode: 'e8c5', + unicode_decimal: 59589, + }, + { + icon_id: '1444814', + name: 'language-csharp', + font_class: 'language-csharp', + unicode: 'e9c5', + unicode_decimal: 59845, + }, + { + icon_id: '1445070', + name: 'phone-classic', + font_class: 'phone-classic', + unicode: 'eac5', + unicode_decimal: 60101, + }, + { + icon_id: '1445326', + name: 'sort-descending', + font_class: 'sort-descending', + unicode: 'ebc5', + unicode_decimal: 60357, + }, + { + icon_id: '1445583', + name: 'watermark', + font_class: 'watermark', + unicode: 'ecc5', + unicode_decimal: 60613, + }, + { + icon_id: '1444045', + name: 'bluetooth-audio', + font_class: 'bluetooth-audio', + unicode: 'e6c6', + unicode_decimal: 59078, + }, + { + icon_id: '1444301', + name: 'comment-processing-outline', + font_class: 'comment-processing-outline', + unicode: 'e7c6', + unicode_decimal: 59334, + }, + { + icon_id: '1444558', + name: 'folder-multiple-image', + font_class: 'folder-multiple-image', + unicode: 'e8c6', + unicode_decimal: 59590, + }, + { + icon_id: '1444815', + name: 'language-html5', + font_class: 'language-html', + unicode: 'e9c6', + unicode_decimal: 59846, + }, + { + icon_id: '1445071', + name: 'phone-incoming', + font_class: 'phone-incoming', + unicode: 'eac6', + unicode_decimal: 60102, + }, + { + icon_id: '1445327', + name: 'sort-alphabetical', + font_class: 'sort-alphabetical', + unicode: 'ebc6', + unicode_decimal: 60358, + }, + { + icon_id: '1445584', + name: 'water-percent', + font_class: 'water-percent', + unicode: 'ecc6', + unicode_decimal: 60614, + }, + { + icon_id: '1444046', + name: 'blogger', + font_class: 'blogger', + unicode: 'e6c7', + unicode_decimal: 59079, + }, + { + icon_id: '1444302', + name: 'comment-question-outline', + font_class: 'comment-question-outline', + unicode: 'e7c7', + unicode_decimal: 59335, + }, + { + icon_id: '1444560', + name: 'folder-outline', + font_class: 'folder-outline', + unicode: 'e8c7', + unicode_decimal: 59591, + }, + { + icon_id: '1444816', + name: 'language-javascript', + font_class: 'language-javascript', + unicode: 'e9c7', + unicode_decimal: 59847, + }, + { + icon_id: '1445072', + name: 'phone-hangup', + font_class: 'phone-hangup', + unicode: 'eac7', + unicode_decimal: 60103, + }, + { + icon_id: '1445328', + name: 'sort-ascending', + font_class: 'sort-ascending', + unicode: 'ebc7', + unicode_decimal: 60359, + }, + { + icon_id: '1445585', + name: 'weather-cloudy', + font_class: 'weather-cloudy', + unicode: 'ecc7', + unicode_decimal: 60615, + }, + { + icon_id: '1444047', + name: 'bluetooth-connect', + font_class: 'bluetooth-connect', + unicode: 'e6c8', + unicode_decimal: 59080, + }, + { + icon_id: '1444303', + name: 'comment-text-outline', + font_class: 'comment-text-outline', + unicode: 'e7c8', + unicode_decimal: 59336, + }, + { + icon_id: '1444561', + name: 'folder-remove', + font_class: 'folder-remove', + unicode: 'e8c8', + unicode_decimal: 59592, + }, + { + icon_id: '1444817', + name: 'language-php', + font_class: 'language-php', + unicode: 'e9c8', + unicode_decimal: 59848, + }, + { + icon_id: '1445073', + name: 'phone-in-talk', + font_class: 'phone-in-talk', + unicode: 'eac8', + unicode_decimal: 60104, + }, + { + icon_id: '1445329', + name: 'sort-numeric', + font_class: 'sort-numeric', + unicode: 'ebc8', + unicode_decimal: 60360, + }, + { + icon_id: '1445586', + name: 'water-pump', + font_class: 'water-pump', + unicode: 'ecc8', + unicode_decimal: 60616, + }, + { + icon_id: '1444048', + name: 'bluetooth-off', + font_class: 'bluetooth-off', + unicode: 'e6c9', + unicode_decimal: 59081, + }, + { + icon_id: '1444304', + name: 'comment-remove-outline', + font_class: 'comment-remove-outline', + unicode: 'e7c9', + unicode_decimal: 59337, + }, + { + icon_id: '1444562', + name: 'folder-star', + font_class: 'folder-star', + unicode: 'e8c9', + unicode_decimal: 59593, + }, + { + icon_id: '1444818', + name: 'language-python-text', + font_class: 'language-python-text', + unicode: 'e9c9', + unicode_decimal: 59849, + }, + { + icon_id: '1445074', + name: 'phone-forward', + font_class: 'phone-forward', + unicode: 'eac9', + unicode_decimal: 60105, + }, + { + icon_id: '1445330', + name: 'sort-variant', + font_class: 'sort-variant', + unicode: 'ebc9', + unicode_decimal: 60361, + }, + { + icon_id: '1445587', + name: 'water-off', + font_class: 'water-off', + unicode: 'ecc9', + unicode_decimal: 60617, + }, + { + icon_id: '1444049', + name: 'bluetooth-settings', + font_class: 'bluetooth-settings', + unicode: 'e6ca', + unicode_decimal: 59082, + }, + { + icon_id: '1444305', + name: 'comment-text', + font_class: 'comment-text', + unicode: 'e7ca', + unicode_decimal: 59338, + }, + { + icon_id: '1444563', + name: 'folder-upload', + font_class: 'folder-upload', + unicode: 'e8ca', + unicode_decimal: 59594, + }, + { + icon_id: '1444819', + name: 'language-python', + font_class: 'language-python', + unicode: 'e9ca', + unicode_decimal: 59850, + }, + { + icon_id: '1445075', + name: 'phone-locked', + font_class: 'phone-locked', + unicode: 'eaca', + unicode_decimal: 60106, + }, + { + icon_id: '1445331', + name: 'soundcloud', + font_class: 'soundcloud', + unicode: 'ebca', + unicode_decimal: 60362, + }, + { + icon_id: '1445588', + name: 'weather-fog', + font_class: 'weather-fog', + unicode: 'ecca', + unicode_decimal: 60618, + }, + { + icon_id: '1444050', + name: 'bluetooth-transfer', + font_class: 'bluetooth-transfer', + unicode: 'e6cb', + unicode_decimal: 59083, + }, + { + icon_id: '1444306', + name: 'compare', + font_class: 'compare', + unicode: 'e7cb', + unicode_decimal: 59339, + }, + { + icon_id: '1444564', + name: 'food', + font_class: 'food', + unicode: 'e8cb', + unicode_decimal: 59595, + }, + { + icon_id: '1444820', + name: 'laptop', + font_class: 'laptop', + unicode: 'e9cb', + unicode_decimal: 59851, + }, + { + icon_id: '1445076', + name: 'phone-minus', + font_class: 'phone-minus', + unicode: 'eacb', + unicode_decimal: 60107, + }, + { + icon_id: '1445332', + name: 'source-commit', + font_class: 'source-commit', + unicode: 'ebcb', + unicode_decimal: 60363, + }, + { + icon_id: '1445589', + name: 'weather-night', + font_class: 'weather-night', + unicode: 'eccb', + unicode_decimal: 60619, + }, + { + icon_id: '1444051', + name: 'blur', + font_class: 'blur', + unicode: 'e6cc', + unicode_decimal: 59084, + }, + { + icon_id: '1444307', + name: 'compass', + font_class: 'compass', + unicode: 'e7cc', + unicode_decimal: 59340, + }, + { + icon_id: '1444565', + name: 'folder-move', + font_class: 'folder-move', + unicode: 'e8cc', + unicode_decimal: 59596, + }, + { + icon_id: '1444821', + name: 'language-swift', + font_class: 'language-swift', + unicode: 'e9cc', + unicode_decimal: 59852, + }, + { + icon_id: '1445077', + name: 'phone-log', + font_class: 'phone-log', + unicode: 'eacc', + unicode_decimal: 60108, + }, + { + icon_id: '1445333', + name: 'source-branch', + font_class: 'source-branch', + unicode: 'ebcc', + unicode_decimal: 60364, + }, + { + icon_id: '1445590', + name: 'weather-lightning-rainy', + font_class: 'weather-lightning-rainy', + unicode: 'eccc', + unicode_decimal: 60620, + }, + { + icon_id: '1444052', + name: 'blur-linear', + font_class: 'blur-linear', + unicode: 'e6cd', + unicode_decimal: 59085, + }, + { + icon_id: '1444308', + name: 'compass-outline', + font_class: 'compass-outline', + unicode: 'e7cd', + unicode_decimal: 59341, + }, + { + icon_id: '1444566', + name: 'folder-plus', + font_class: 'folder-plus', + unicode: 'e8cd', + unicode_decimal: 59597, + }, + { + icon_id: '1444822', + name: 'lan-pending', + font_class: 'lan-pending', + unicode: 'e9cd', + unicode_decimal: 59853, + }, + { + icon_id: '1445078', + name: 'phone-outgoing', + font_class: 'phone-outgoing', + unicode: 'eacd', + unicode_decimal: 60109, + }, + { + icon_id: '1445334', + name: 'source-commit-end', + font_class: 'source-commit-end', + unicode: 'ebcd', + unicode_decimal: 60365, + }, + { + icon_id: '1445591', + name: 'weather-hail', + font_class: 'weather-hail', + unicode: 'eccd', + unicode_decimal: 60621, + }, + { + icon_id: '1444053', + name: 'blur-off', + font_class: 'blur-off', + unicode: 'e6ce', + unicode_decimal: 59086, + }, + { + icon_id: '1444309', + name: 'contact-mail', + font_class: 'contact-mail', + unicode: 'e7ce', + unicode_decimal: 59342, + }, + { + icon_id: '1444567', + name: 'food-apple', + font_class: 'food-apple', + unicode: 'e8ce', + unicode_decimal: 59598, + }, + { + icon_id: '1444823', + name: 'laptop-chromebook', + font_class: 'laptop-chromebook', + unicode: 'e9ce', + unicode_decimal: 59854, + }, + { + icon_id: '1445079', + name: 'phone-plus', + font_class: 'phone-plus', + unicode: 'eace', + unicode_decimal: 60110, + }, + { + icon_id: '1445335', + name: 'source-commit-end-local', + font_class: 'source-commit-end-local', + unicode: 'ebce', + unicode_decimal: 60366, + }, + { + icon_id: '1445592', + name: 'weather-lightning', + font_class: 'weather-lightning', + unicode: 'ecce', + unicode_decimal: 60622, + }, + { + icon_id: '1444054', + name: 'blur-radial', + font_class: 'blur-radial', + unicode: 'e6cf', + unicode_decimal: 59087, + }, + { + icon_id: '1444310', + name: 'console', + font_class: 'console', + unicode: 'e7cf', + unicode_decimal: 59343, + }, + { + icon_id: '1444568', + name: 'food-fork-drink', + font_class: 'food-fork-drink', + unicode: 'e8cf', + unicode_decimal: 59599, + }, + { + icon_id: '1444824', + name: 'laptop-off', + font_class: 'laptop-off', + unicode: 'e9cf', + unicode_decimal: 59855, + }, + { + icon_id: '1445080', + name: 'phone-missed', + font_class: 'phone-missed', + unicode: 'eacf', + unicode_decimal: 60111, + }, + { + icon_id: '1445336', + name: 'source-commit-next-local', + font_class: 'source-commit-next-local', + unicode: 'ebcf', + unicode_decimal: 60367, + }, + { + icon_id: '1445593', + name: 'weather-partlycloudy', + font_class: 'weather-partlycloudy', + unicode: 'eccf', + unicode_decimal: 60623, + }, + { + icon_id: '1444055', + name: 'bomb', + font_class: 'bomb', + unicode: 'e6d0', + unicode_decimal: 59088, + }, + { + icon_id: '1444311', + name: 'contacts', + font_class: 'contacts', + unicode: 'e7d0', + unicode_decimal: 59344, + }, + { + icon_id: '1444569', + name: 'food-variant', + font_class: 'food-variant', + unicode: 'e8d0', + unicode_decimal: 59600, + }, + { + icon_id: '1444825', + name: 'laptop-mac', + font_class: 'laptop-mac', + unicode: 'e9d0', + unicode_decimal: 59856, + }, + { + icon_id: '1445081', + name: 'phone-paused', + font_class: 'phone-paused', + unicode: 'ead0', + unicode_decimal: 60112, + }, + { + icon_id: '1445337', + name: 'source-commit-start', + font_class: 'source-commit-start', + unicode: 'ebd0', + unicode_decimal: 60368, + }, + { + icon_id: '1445594', + name: 'weather-pouring', + font_class: 'weather-pouring', + unicode: 'ecd0', + unicode_decimal: 60624, + }, + { + icon_id: '1444056', + name: 'bomb-off', + font_class: 'bomb-off', + unicode: 'e6d1', + unicode_decimal: 59089, + }, + { + icon_id: '1444312', + name: 'content-duplicate', + font_class: 'content-duplicate', + unicode: 'e7d1', + unicode_decimal: 59345, + }, + { + icon_id: '1444570', + name: 'football', + font_class: 'football', + unicode: 'e8d1', + unicode_decimal: 59601, + }, + { + icon_id: '1444826', + name: 'laptop-windows', + font_class: 'laptop-windows', + unicode: 'e9d1', + unicode_decimal: 59857, + }, + { + icon_id: '1445082', + name: 'phone-settings', + font_class: 'phone-settings', + unicode: 'ead1', + unicode_decimal: 60113, + }, + { + icon_id: '1445338', + name: 'source-commit-local', + font_class: 'source-commit-local', + unicode: 'ebd1', + unicode_decimal: 60369, + }, + { + icon_id: '1445595', + name: 'weather-rainy', + font_class: 'weather-rainy', + unicode: 'ecd1', + unicode_decimal: 60625, + }, + { + icon_id: '1444057', + name: 'bone', + font_class: 'bone', + unicode: 'e6d2', + unicode_decimal: 59090, + }, + { + icon_id: '1444313', + name: 'content-copy', + font_class: 'content-copy', + unicode: 'e7d2', + unicode_decimal: 59346, + }, + { + icon_id: '1444571', + name: 'food-off', + font_class: 'food-off', + unicode: 'e8d2', + unicode_decimal: 59602, + }, + { + icon_id: '1444827', + name: 'lastfm', + font_class: 'lastfm', + unicode: 'e9d2', + unicode_decimal: 59858, + }, + { + icon_id: '1445083', + name: 'phone-voip', + font_class: 'phone-voip', + unicode: 'ead2', + unicode_decimal: 60114, + }, + { + icon_id: '1445339', + name: 'source-commit-start-next-local', + font_class: 'source-commit-start-next-local', + unicode: 'ebd2', + unicode_decimal: 60370, + }, + { + icon_id: '1445596', + name: 'weather-sunny', + font_class: 'weather-sunny', + unicode: 'ecd2', + unicode_decimal: 60626, + }, + { + icon_id: '1444058', + name: 'book', + font_class: 'book', + unicode: 'e6d3', + unicode_decimal: 59091, + }, + { + icon_id: '1444314', + name: 'content-paste', + font_class: 'content-paste', + unicode: 'e7d3', + unicode_decimal: 59347, + }, + { + icon_id: '1444572', + name: 'football-australian', + font_class: 'football-australian', + unicode: 'e8d3', + unicode_decimal: 59603, + }, + { + icon_id: '1444828', + name: 'launch', + font_class: 'launch', + unicode: 'e9d3', + unicode_decimal: 59859, + }, + { + icon_id: '1445084', + name: 'pi-box', + font_class: 'pi-box', + unicode: 'ead3', + unicode_decimal: 60115, + }, + { + icon_id: '1445340', + name: 'source-fork', + font_class: 'source-fork', + unicode: 'ebd3', + unicode_decimal: 60371, + }, + { + icon_id: '1445597', + name: 'weather-snowy', + font_class: 'weather-snowy', + unicode: 'ecd3', + unicode_decimal: 60627, + }, + { + icon_id: '1444059', + name: 'bookmark', + font_class: 'bookmark', + unicode: 'e6d4', + unicode_decimal: 59092, + }, + { + icon_id: '1444315', + name: 'content-cut', + font_class: 'content-cut', + unicode: 'e7d4', + unicode_decimal: 59348, + }, + { + icon_id: '1444573', + name: 'football-helmet', + font_class: 'football-helmet', + unicode: 'e8d4', + unicode_decimal: 59604, + }, + { + icon_id: '1444829', + name: 'layers', + font_class: 'layers', + unicode: 'e9d4', + unicode_decimal: 59860, + }, + { + icon_id: '1445085', + name: 'pi', + font_class: 'pi', + unicode: 'ead4', + unicode_decimal: 60116, + }, + { + icon_id: '1445341', + name: 'speaker', + font_class: 'speaker', + unicode: 'ebd4', + unicode_decimal: 60372, + }, + { + icon_id: '1445598', + name: 'weather-snowy-rainy', + font_class: 'weather-snowy-rainy', + unicode: 'ecd4', + unicode_decimal: 60628, + }, + { + icon_id: '1444060', + name: 'bookmark-check', + font_class: 'bookmark-check', + unicode: 'e6d5', + unicode_decimal: 59093, + }, + { + icon_id: '1444316', + name: 'content-save-all', + font_class: 'content-save-all', + unicode: 'e7d5', + unicode_decimal: 59349, + }, + { + icon_id: '1444574', + name: 'format-align-center', + font_class: 'format-align-center', + unicode: 'e8d5', + unicode_decimal: 59605, + }, + { + icon_id: '1444830', + name: 'layers-off', + font_class: 'layers-off', + unicode: 'e9d5', + unicode_decimal: 59861, + }, + { + icon_id: '1445086', + name: 'piano', + font_class: 'piano', + unicode: 'ead5', + unicode_decimal: 60117, + }, + { + icon_id: '1445342', + name: 'source-pull', + font_class: 'source-pull', + unicode: 'ebd5', + unicode_decimal: 60373, + }, + { + icon_id: '1445599', + name: 'weather-sunset-down', + font_class: 'weather-sunset-down', + unicode: 'ecd5', + unicode_decimal: 60629, + }, + { + icon_id: '1444061', + name: 'bookmark-music', + font_class: 'bookmark-music', + unicode: 'e6d6', + unicode_decimal: 59094, + }, + { + icon_id: '1444317', + name: 'content-save', + font_class: 'content-save', + unicode: 'e7d6', + unicode_decimal: 59350, + }, + { + icon_id: '1444575', + name: 'format-align-justify', + font_class: 'format-align-justify', + unicode: 'e8d6', + unicode_decimal: 59606, + }, + { + icon_id: '1444831', + name: 'leaf', + font_class: 'leaf', + unicode: 'e9d6', + unicode_decimal: 59862, + }, + { + icon_id: '1445087', + name: 'pig', + font_class: 'pig', + unicode: 'ead6', + unicode_decimal: 60118, + }, + { + icon_id: '1445343', + name: 'source-merge', + font_class: 'source-merge', + unicode: 'ebd6', + unicode_decimal: 60374, + }, + { + icon_id: '1445600', + name: 'weather-sunset', + font_class: 'weather-sunset', + unicode: 'ecd6', + unicode_decimal: 60630, + }, + { + icon_id: '1444062', + name: 'bookmark-plus', + font_class: 'bookmark-plus', + unicode: 'e6d7', + unicode_decimal: 59095, + }, + { + icon_id: '1444318', + name: 'content-save-settings', + font_class: 'content-save-settings', + unicode: 'e7d7', + unicode_decimal: 59351, + }, + { + icon_id: '1444576', + name: 'format-align-left', + font_class: 'format-align-left', + unicode: 'e8d7', + unicode_decimal: 59607, + }, + { + icon_id: '1444832', + name: 'lead-pencil', + font_class: 'lead-pencil', + unicode: 'e9d7', + unicode_decimal: 59863, + }, + { + icon_id: '1445088', + name: 'pill', + font_class: 'pill', + unicode: 'ead7', + unicode_decimal: 60119, + }, + { + icon_id: '1445344', + name: 'speaker-off', + font_class: 'speaker-off', + unicode: 'ebd7', + unicode_decimal: 60375, + }, + { + icon_id: '1445601', + name: 'weather-sunset-up', + font_class: 'weather-sunset-up', + unicode: 'ecd7', + unicode_decimal: 60631, + }, + { + icon_id: '1444063', + name: 'bookmark-plus-outline', + font_class: 'bookmark-plus-outline', + unicode: 'e6d8', + unicode_decimal: 59096, + }, + { + icon_id: '1444319', + name: 'contrast-circle', + font_class: 'contrast-circle', + unicode: 'e7d8', + unicode_decimal: 59352, + }, + { + icon_id: '1444577', + name: 'format-align-right', + font_class: 'format-align-right', + unicode: 'e8d8', + unicode_decimal: 59608, + }, + { + icon_id: '1444833', + name: 'led-off', + font_class: 'led-off', + unicode: 'e9d8', + unicode_decimal: 59864, + }, + { + icon_id: '1445089', + name: 'pillar', + font_class: 'pillar', + unicode: 'ead8', + unicode_decimal: 60120, + }, + { + icon_id: '1445345', + name: 'speaker-wireless', + font_class: 'speaker-wireless', + unicode: 'ebd8', + unicode_decimal: 60376, + }, + { + icon_id: '1445602', + name: 'weather-windy', + font_class: 'weather-windy', + unicode: 'ecd8', + unicode_decimal: 60632, + }, + { + icon_id: '1444064', + name: 'bookmark-outline', + font_class: 'bookmark-outline', + unicode: 'e6d9', + unicode_decimal: 59097, + }, + { + icon_id: '1444320', + name: 'contrast', + font_class: 'contrast', + unicode: 'e7d9', + unicode_decimal: 59353, + }, + { + icon_id: '1444578', + name: 'format-annotation-plus', + font_class: 'format-annotation-plus', + unicode: 'e8d9', + unicode_decimal: 59609, + }, + { + icon_id: '1444834', + name: 'led-on', + font_class: 'led-on', + unicode: 'e9d9', + unicode_decimal: 59865, + }, + { + icon_id: '1445090', + name: 'pine-tree', + font_class: 'pine-tree', + unicode: 'ead9', + unicode_decimal: 60121, + }, + { + icon_id: '1445346', + name: 'spellcheck', + font_class: 'spellcheck', + unicode: 'ebd9', + unicode_decimal: 60377, + }, + { + icon_id: '1445603', + name: 'weather-windy-variant', + font_class: 'weather-windy-variant', + unicode: 'ecd9', + unicode_decimal: 60633, + }, + { + icon_id: '1444065', + name: 'bookmark-remove', + font_class: 'bookmark-remove', + unicode: 'e6da', + unicode_decimal: 59098, + }, + { + icon_id: '1444321', + name: 'contrast-box', + font_class: 'contrast-box', + unicode: 'e7da', + unicode_decimal: 59354, + }, + { + icon_id: '1444579', + name: 'format-bold', + font_class: 'format-bold', + unicode: 'e8da', + unicode_decimal: 59610, + }, + { + icon_id: '1444835', + name: 'led-outline', + font_class: 'led-outline', + unicode: 'e9da', + unicode_decimal: 59866, + }, + { + icon_id: '1445091', + name: 'pin', + font_class: 'pin', + unicode: 'eada', + unicode_decimal: 60122, + }, + { + icon_id: '1445347', + name: 'speedometer', + font_class: 'speedometer', + unicode: 'ebda', + unicode_decimal: 60378, + }, + { + icon_id: '1445604', + name: 'web', + font_class: 'web', + unicode: 'ecda', + unicode_decimal: 60634, + }, + { + icon_id: '1444066', + name: 'book-minus', + font_class: 'book-minus', + unicode: 'e6db', + unicode_decimal: 59099, + }, + { + icon_id: '1444322', + name: 'cookie', + font_class: 'cookie', + unicode: 'e7db', + unicode_decimal: 59355, + }, + { + icon_id: '1444580', + name: 'format-clear', + font_class: 'format-clear', + unicode: 'e8db', + unicode_decimal: 59611, + }, + { + icon_id: '1444836', + name: 'led-variant-on', + font_class: 'led-variant-on', + unicode: 'e9db', + unicode_decimal: 59867, + }, + { + icon_id: '1445092', + name: 'pin-off', + font_class: 'pin-off', + unicode: 'eadb', + unicode_decimal: 60123, + }, + { + icon_id: '1445348', + name: 'spotify', + font_class: 'spotify', + unicode: 'ebdb', + unicode_decimal: 60379, + }, + { + icon_id: '1445605', + name: 'weight', + font_class: 'weight', + unicode: 'ecdb', + unicode_decimal: 60635, + }, + { + icon_id: '1444067', + name: 'book-multiple', + font_class: 'book-multiple', + unicode: 'e6dc', + unicode_decimal: 59100, + }, + { + icon_id: '1444323', + name: 'copyright', + font_class: 'copyright', + unicode: 'e7dc', + unicode_decimal: 59356, + }, + { + icon_id: '1444581', + name: 'format-color-fill', + font_class: 'format-color-fill', + unicode: 'e8dc', + unicode_decimal: 59612, + }, + { + icon_id: '1444837', + name: 'led-variant-off', + font_class: 'led-variant-off', + unicode: 'e9dc', + unicode_decimal: 59868, + }, + { + icon_id: '1445093', + name: 'pine-tree-box', + font_class: 'pine-tree-box', + unicode: 'eadc', + unicode_decimal: 60124, + }, + { + icon_id: '1445349', + name: 'spotlight', + font_class: 'spotlight', + unicode: 'ebdc', + unicode_decimal: 60380, + }, + { + icon_id: '1445606', + name: 'webhook', + font_class: 'webhook', + unicode: 'ecdc', + unicode_decimal: 60636, + }, + { + icon_id: '1444068', + name: 'book-multiple-variant', + font_class: 'book-multiple-variant', + unicode: 'e6dd', + unicode_decimal: 59101, + }, + { + icon_id: '1444324', + name: 'counter', + font_class: 'counter', + unicode: 'e7dd', + unicode_decimal: 59357, + }, + { + icon_id: '1444582', + name: 'format-color-text', + font_class: 'format-color-text', + unicode: 'e8dd', + unicode_decimal: 59613, + }, + { + icon_id: '1444838', + name: 'led-variant-outline', + font_class: 'led-variant-outline', + unicode: 'e9dd', + unicode_decimal: 59869, + }, + { + icon_id: '1445094', + name: 'pinterest', + font_class: 'pinterest', + unicode: 'eadd', + unicode_decimal: 60125, + }, + { + icon_id: '1445350', + name: 'spotlight-beam', + font_class: 'spotlight-beam', + unicode: 'ebdd', + unicode_decimal: 60381, + }, + { + icon_id: '1445607', + name: 'weight-kilogram', + font_class: 'weight-kilogram', + unicode: 'ecdd', + unicode_decimal: 60637, + }, + { + icon_id: '1444069', + name: 'book-open', + font_class: 'book-open', + unicode: 'e6de', + unicode_decimal: 59102, + }, + { + icon_id: '1444325', + name: 'creation', + font_class: 'creation', + unicode: 'e7de', + unicode_decimal: 59358, + }, + { + icon_id: '1444583', + name: 'format-float-center', + font_class: 'format-float-center', + unicode: 'e8de', + unicode_decimal: 59614, + }, + { + icon_id: '1444839', + name: 'library', + font_class: 'library', + unicode: 'e9de', + unicode_decimal: 59870, + }, + { + icon_id: '1445095', + name: 'pinterest-box', + font_class: 'pinterest-box', + unicode: 'eade', + unicode_decimal: 60126, + }, + { + icon_id: '1445351', + name: 'spray', + font_class: 'spray', + unicode: 'ebde', + unicode_decimal: 60382, + }, + { + icon_id: '1445608', + name: 'whatsapp', + font_class: 'whatsapp', + unicode: 'ecde', + unicode_decimal: 60638, + }, + { + icon_id: '1444070', + name: 'book-open-page-variant', + font_class: 'book-open-page-variant', + unicode: 'e6df', + unicode_decimal: 59103, + }, + { + icon_id: '1444326', + name: 'cow', + font_class: 'cow', + unicode: 'e7df', + unicode_decimal: 59359, + }, + { + icon_id: '1444584', + name: 'format-float-left', + font_class: 'format-float-left', + unicode: 'e8df', + unicode_decimal: 59615, + }, + { + icon_id: '1444840', + name: 'library-books', + font_class: 'library-books', + unicode: 'e9df', + unicode_decimal: 59871, + }, + { + icon_id: '1445096', + name: 'pistol', + font_class: 'pistol', + unicode: 'eadf', + unicode_decimal: 60127, + }, + { + icon_id: '1445352', + name: 'square-inc', + font_class: 'square-inc', + unicode: 'ebdf', + unicode_decimal: 60383, + }, + { + icon_id: '1445609', + name: 'webcam', + font_class: 'webcam', + unicode: 'ecdf', + unicode_decimal: 60639, + }, + { + icon_id: '1444071', + name: 'book-plus', + font_class: 'book-plus', + unicode: 'e6e0', + unicode_decimal: 59104, + }, + { + icon_id: '1444327', + name: 'credit-card', + font_class: 'credit-card', + unicode: 'e7e0', + unicode_decimal: 59360, + }, + { + icon_id: '1444585', + name: 'format-float-none', + font_class: 'format-float-none', + unicode: 'e8e0', + unicode_decimal: 59616, + }, + { + icon_id: '1444841', + name: 'library-music', + font_class: 'library-music', + unicode: 'e9e0', + unicode_decimal: 59872, + }, + { + icon_id: '1445097', + name: 'pizza', + font_class: 'pizza', + unicode: 'eae0', + unicode_decimal: 60128, + }, + { + icon_id: '1445353', + name: 'stackexchange', + font_class: 'stackexchange', + unicode: 'ebe0', + unicode_decimal: 60384, + }, + { + icon_id: '1445610', + name: 'wechat', + font_class: 'wechat', + unicode: 'ece0', + unicode_decimal: 60640, + }, + { + icon_id: '1444072', + name: 'book-open-variant', + font_class: 'book-open-variant', + unicode: 'e6e1', + unicode_decimal: 59105, + }, + { + icon_id: '1444328', + name: 'credit-card-multiple', + font_class: 'credit-card-multiple', + unicode: 'e7e1', + unicode_decimal: 59361, + }, + { + icon_id: '1444586', + name: 'format-float-right', + font_class: 'format-float-right', + unicode: 'e8e1', + unicode_decimal: 59617, + }, + { + icon_id: '1444842', + name: 'library-plus', + font_class: 'library-plus', + unicode: 'e9e1', + unicode_decimal: 59873, + }, + { + icon_id: '1445098', + name: 'plane-shield', + font_class: 'plane-shield', + unicode: 'eae1', + unicode_decimal: 60129, + }, + { + icon_id: '1445354', + name: 'square-inc-cash', + font_class: 'square-inc-cash', + unicode: 'ebe1', + unicode_decimal: 60385, + }, + { + icon_id: '1445611', + name: 'white-balance-auto', + font_class: 'white-balance-auto', + unicode: 'ece1', + unicode_decimal: 60641, + }, + { + icon_id: '1444073', + name: 'book-variant', + font_class: 'book-variant', + unicode: 'e6e2', + unicode_decimal: 59106, + }, + { + icon_id: '1444329', + name: 'credit-card-off', + font_class: 'credit-card-off', + unicode: 'e7e2', + unicode_decimal: 59362, + }, + { + icon_id: '1444587', + name: 'format-header-1', + font_class: 'format-header-', + unicode: 'e8e2', + unicode_decimal: 59618, + }, + { + icon_id: '1444843', + name: 'lightbulb-on-outline', + font_class: 'lightbulb-on-outline', + unicode: 'e9e2', + unicode_decimal: 59874, + }, + { + icon_id: '1445099', + name: 'play', + font_class: 'play', + unicode: 'eae2', + unicode_decimal: 60130, + }, + { + icon_id: '1445355', + name: 'stackoverflow', + font_class: 'stackoverflow', + unicode: 'ebe2', + unicode_decimal: 60386, + }, + { + icon_id: '1445612', + name: 'white-balance-iridescent', + font_class: 'white-balance-iridescent', + unicode: 'ece2', + unicode_decimal: 60642, + }, + { + icon_id: '1444074', + name: 'boombox', + font_class: 'boombox', + unicode: 'e6e3', + unicode_decimal: 59107, + }, + { + icon_id: '1444330', + name: 'credit-card-plus', + font_class: 'credit-card-plus', + unicode: 'e7e3', + unicode_decimal: 59363, + }, + { + icon_id: '1444588', + name: 'format-header-2', + font_class: 'format-header-1', + unicode: 'e8e3', + unicode_decimal: 59619, + }, + { + icon_id: '1444844', + name: 'lightbulb', + font_class: 'lightbulb', + unicode: 'e9e3', + unicode_decimal: 59875, + }, + { + icon_id: '1445100', + name: 'play-box-outline', + font_class: 'play-box-outline', + unicode: 'eae3', + unicode_decimal: 60131, + }, + { + icon_id: '1445356', + name: 'stadium', + font_class: 'stadium', + unicode: 'ebe3', + unicode_decimal: 60387, + }, + { + icon_id: '1445613', + name: 'wheelchair-accessibility', + font_class: 'wheelchair-accessibility', + unicode: 'ece3', + unicode_decimal: 60643, + }, + { + icon_id: '1444075', + name: 'border-all', + font_class: 'border-all', + unicode: 'e6e4', + unicode_decimal: 59108, + }, + { + icon_id: '1444331', + name: 'crop', + font_class: 'crop', + unicode: 'e7e4', + unicode_decimal: 59364, + }, + { + icon_id: '1444589', + name: 'format-header-3', + font_class: 'format-header-2', + unicode: 'e8e4', + unicode_decimal: 59620, + }, + { + icon_id: '1444845', + name: 'lightbulb-on', + font_class: 'lightbulb-on', + unicode: 'e9e4', + unicode_decimal: 59876, + }, + { + icon_id: '1445101', + name: 'play-circle', + font_class: 'play-circle', + unicode: 'eae4', + unicode_decimal: 60132, + }, + { + icon_id: '1445357', + name: 'stairs', + font_class: 'stairs', + unicode: 'ebe4', + unicode_decimal: 60388, + }, + { + icon_id: '1445614', + name: 'white-balance-incandescent', + font_class: 'white-balance-incandescent', + unicode: 'ece4', + unicode_decimal: 60644, + }, + { + icon_id: '1444076', + name: 'border-bottom', + font_class: 'border-bottom', + unicode: 'e6e5', + unicode_decimal: 59109, + }, + { + icon_id: '1444332', + name: 'crop-free', + font_class: 'crop-free', + unicode: 'e7e5', + unicode_decimal: 59365, + }, + { + icon_id: '1444590', + name: 'format-header-4', + font_class: 'format-header-3', + unicode: 'e8e5', + unicode_decimal: 59621, + }, + { + icon_id: '1444846', + name: 'lightbulb-outline', + font_class: 'lightbulb-outline', + unicode: 'e9e5', + unicode_decimal: 59877, + }, + { + icon_id: '1445102', + name: 'play-circle-outline', + font_class: 'play-circle-outline', + unicode: 'eae5', + unicode_decimal: 60133, + }, + { + icon_id: '1445358', + name: 'star-circle', + font_class: 'star-circle', + unicode: 'ebe5', + unicode_decimal: 60389, + }, + { + icon_id: '1445615', + name: 'widgets', + font_class: 'widgets', + unicode: 'ece5', + unicode_decimal: 60645, + }, + { + icon_id: '1444077', + name: 'border-color', + font_class: 'border-color', + unicode: 'e6e6', + unicode_decimal: 59110, + }, + { + icon_id: '1444333', + name: 'credit-card-scan', + font_class: 'credit-card-scan', + unicode: 'e7e6', + unicode_decimal: 59366, + }, + { + icon_id: '1444591', + name: 'format-header-5', + font_class: 'format-header-4', + unicode: 'e8e6', + unicode_decimal: 59622, + }, + { + icon_id: '1444847', + name: 'link', + font_class: 'link', + unicode: 'e9e6', + unicode_decimal: 59878, + }, + { + icon_id: '1445103', + name: 'playlist-check', + font_class: 'playlist-check', + unicode: 'eae6', + unicode_decimal: 60134, + }, + { + icon_id: '1445359', + name: 'star-half', + font_class: 'star-half', + unicode: 'ebe6', + unicode_decimal: 60390, + }, + { + icon_id: '1445616', + name: 'white-balance-sunny', + font_class: 'white-balance-sunny', + unicode: 'ece6', + unicode_decimal: 60646, + }, + { + icon_id: '1444078', + name: 'border-horizontal', + font_class: 'border-horizontal', + unicode: 'e6e7', + unicode_decimal: 59111, + }, + { + icon_id: '1444334', + name: 'crop-landscape', + font_class: 'crop-landscape', + unicode: 'e7e7', + unicode_decimal: 59367, + }, + { + icon_id: '1444592', + name: 'format-header-decrease', + font_class: 'format-header-decrease', + unicode: 'e8e7', + unicode_decimal: 59623, + }, + { + icon_id: '1444848', + name: 'linkedin', + font_class: 'linkedin', + unicode: 'e9e7', + unicode_decimal: 59879, + }, + { + icon_id: '1445104', + name: 'playlist-play', + font_class: 'playlist-play', + unicode: 'eae7', + unicode_decimal: 60135, + }, + { + icon_id: '1445360', + name: 'star', + font_class: 'star', + unicode: 'ebe7', + unicode_decimal: 60391, + }, + { + icon_id: '1445617', + name: 'wiiu', + font_class: 'wiiu', + unicode: 'ece7', + unicode_decimal: 60647, + }, + { + icon_id: '1444079', + name: 'border-inside', + font_class: 'border-inside', + unicode: 'e6e8', + unicode_decimal: 59112, + }, + { + icon_id: '1444335', + name: 'crop-portrait', + font_class: 'crop-portrait', + unicode: 'e7e8', + unicode_decimal: 59368, + }, + { + icon_id: '1444593', + name: 'format-header-6', + font_class: 'format-header-5', + unicode: 'e8e8', + unicode_decimal: 59624, + }, + { + icon_id: '1444849', + name: 'link-off', + font_class: 'link-off', + unicode: 'e9e8', + unicode_decimal: 59880, + }, + { + icon_id: '1445105', + name: 'playlist-minus', + font_class: 'playlist-minus', + unicode: 'eae8', + unicode_decimal: 60136, + }, + { + icon_id: '1445361', + name: 'star-off', + font_class: 'star-off', + unicode: 'ebe8', + unicode_decimal: 60392, + }, + { + icon_id: '1445618', + name: 'wifi', + font_class: 'wifi', + unicode: 'ece8', + unicode_decimal: 60648, + }, + { + icon_id: '1444080', + name: 'border-none', + font_class: 'border-none', + unicode: 'e6e9', + unicode_decimal: 59113, + }, + { + icon_id: '1444336', + name: 'crop-rotate', + font_class: 'crop-rotate', + unicode: 'e7e9', + unicode_decimal: 59369, + }, + { + icon_id: '1444594', + name: 'format-header-equal', + font_class: 'format-header-equal', + unicode: 'e8e9', + unicode_decimal: 59625, + }, + { + icon_id: '1444850', + name: 'link-variant-off', + font_class: 'link-variant-off', + unicode: 'e9e9', + unicode_decimal: 59881, + }, + { + icon_id: '1445106', + name: 'playlist-remove', + font_class: 'playlist-remove', + unicode: 'eae9', + unicode_decimal: 60137, + }, + { + icon_id: '1445362', + name: 'star-outline', + font_class: 'star-outline', + unicode: 'ebe9', + unicode_decimal: 60393, + }, + { + icon_id: '1445619', + name: 'wifi-off', + font_class: 'wifi-off', + unicode: 'ece9', + unicode_decimal: 60649, + }, + { + icon_id: '1444081', + name: 'border-left', + font_class: 'border-left', + unicode: 'e6ea', + unicode_decimal: 59114, + }, + { + icon_id: '1444337', + name: 'crop-square', + font_class: 'crop-square', + unicode: 'e7ea', + unicode_decimal: 59370, + }, + { + icon_id: '1444595', + name: 'format-header-increase', + font_class: 'format-header-increase', + unicode: 'e8ea', + unicode_decimal: 59626, + }, + { + icon_id: '1444851', + name: 'link-variant', + font_class: 'link-variant', + unicode: 'e9ea', + unicode_decimal: 59882, + }, + { + icon_id: '1445107', + name: 'playlist-plus', + font_class: 'playlist-plus', + unicode: 'eaea', + unicode_decimal: 60138, + }, + { + icon_id: '1445363', + name: 'steam', + font_class: 'steam', + unicode: 'ebea', + unicode_decimal: 60394, + }, + { + icon_id: '1445620', + name: 'wii', + font_class: 'wii', + unicode: 'ecea', + unicode_decimal: 60650, + }, + { + icon_id: '1444082', + name: 'border-outside', + font_class: 'border-outside', + unicode: 'e6eb', + unicode_decimal: 59115, + }, + { + icon_id: '1444338', + name: 'crosshairs', + font_class: 'crosshairs', + unicode: 'e7eb', + unicode_decimal: 59371, + }, + { + icon_id: '1444596', + name: 'format-header-pound', + font_class: 'format-header-pound', + unicode: 'e8eb', + unicode_decimal: 59627, + }, + { + icon_id: '1444852', + name: 'linkedin-box', + font_class: 'linkedin-box', + unicode: 'e9eb', + unicode_decimal: 59883, + }, + { + icon_id: '1445108', + name: 'play-pause', + font_class: 'play-pause', + unicode: 'eaeb', + unicode_decimal: 60139, + }, + { + icon_id: '1445364', + name: 'steering', + font_class: 'steering', + unicode: 'ebeb', + unicode_decimal: 60395, + }, + { + icon_id: '1445621', + name: 'window-close', + font_class: 'window-close', + unicode: 'eceb', + unicode_decimal: 60651, + }, + { + icon_id: '1444083', + name: 'border-right', + font_class: 'border-right', + unicode: 'e6ec', + unicode_decimal: 59116, + }, + { + icon_id: '1444339', + name: 'crosshairs-gps', + font_class: 'crosshairs-gps', + unicode: 'e7ec', + unicode_decimal: 59372, + }, + { + icon_id: '1444597', + name: 'format-horizontal-align-center', + font_class: 'format-horizontal-align-center', + unicode: 'e8ec', + unicode_decimal: 59628, + }, + { + icon_id: '1444853', + name: 'linux', + font_class: 'linux', + unicode: 'e9ec', + unicode_decimal: 59884, + }, + { + icon_id: '1445109', + name: 'playstation', + font_class: 'playstation', + unicode: 'eaec', + unicode_decimal: 60140, + }, + { + icon_id: '1445365', + name: 'step-backward', + font_class: 'step-backward', + unicode: 'ebec', + unicode_decimal: 60396, + }, + { + icon_id: '1445622', + name: 'wikipedia', + font_class: 'wikipedia', + unicode: 'ecec', + unicode_decimal: 60652, + }, + { + icon_id: '1444084', + name: 'border-top', + font_class: 'border-top', + unicode: 'e6ed', + unicode_decimal: 59117, + }, + { + icon_id: '1444340', + name: 'cube', + font_class: 'cube', + unicode: 'e7ed', + unicode_decimal: 59373, + }, + { + icon_id: '1444598', + name: 'format-horizontal-align-left', + font_class: 'format-horizontal-align-left', + unicode: 'e8ed', + unicode_decimal: 59629, + }, + { + icon_id: '1444854', + name: 'lock', + font_class: 'lock', + unicode: 'e9ed', + unicode_decimal: 59885, + }, + { + icon_id: '1445110', + name: 'plex', + font_class: 'plex', + unicode: 'eaed', + unicode_decimal: 60141, + }, + { + icon_id: '1445366', + name: 'step-forward', + font_class: 'step-forward', + unicode: 'ebed', + unicode_decimal: 60397, + }, + { + icon_id: '1445623', + name: 'window-maximize', + font_class: 'window-maximize', + unicode: 'eced', + unicode_decimal: 60653, + }, + { + icon_id: '1444085', + name: 'border-style', + font_class: 'border-style', + unicode: 'e6ee', + unicode_decimal: 59118, + }, + { + icon_id: '1444341', + name: 'crown', + font_class: 'crown', + unicode: 'e7ee', + unicode_decimal: 59374, + }, + { + icon_id: '1444599', + name: 'format-indent-increase', + font_class: 'format-indent-increase', + unicode: 'e8ee', + unicode_decimal: 59630, + }, + { + icon_id: '1444855', + name: 'lock-outline', + font_class: 'lock-outline', + unicode: 'e9ee', + unicode_decimal: 59886, + }, + { + icon_id: '1445111', + name: 'plus', + font_class: 'plus', + unicode: 'eaee', + unicode_decimal: 60142, + }, + { + icon_id: '1445367', + name: 'step-forward-2', + font_class: 'step-forward-', + unicode: 'ebee', + unicode_decimal: 60398, + }, + { + icon_id: '1445624', + name: 'window-open', + font_class: 'window-open', + unicode: 'ecee', + unicode_decimal: 60654, + }, + { + icon_id: '1444086', + name: 'border-vertical', + font_class: 'border-vertical', + unicode: 'e6ef', + unicode_decimal: 59119, + }, + { + icon_id: '1444342', + name: 'cube-outline', + font_class: 'cube-outline', + unicode: 'e7ef', + unicode_decimal: 59375, + }, + { + icon_id: '1444600', + name: 'format-indent-decrease', + font_class: 'format-indent-decrease', + unicode: 'e8ef', + unicode_decimal: 59631, + }, + { + icon_id: '1444856', + name: 'lock-open-outline', + font_class: 'lock-open-outline', + unicode: 'e9ef', + unicode_decimal: 59887, + }, + { + icon_id: '1445112', + name: 'plus-box-outline', + font_class: 'plus-box-outline', + unicode: 'eaef', + unicode_decimal: 60143, + }, + { + icon_id: '1445368', + name: 'step-backward-2', + font_class: 'step-backward-', + unicode: 'ebef', + unicode_decimal: 60399, + }, + { + icon_id: '1445625', + name: 'window-restore', + font_class: 'window-restore', + unicode: 'ecef', + unicode_decimal: 60655, + }, + { + icon_id: '1444087', + name: 'bowl', + font_class: 'bowl', + unicode: 'e6f0', + unicode_decimal: 59120, + }, + { + icon_id: '1444343', + name: 'cube-send', + font_class: 'cube-send', + unicode: 'e7f0', + unicode_decimal: 59376, + }, + { + icon_id: '1444601', + name: 'format-line-spacing', + font_class: 'format-line-spacing', + unicode: 'e8f0', + unicode_decimal: 59632, + }, + { + icon_id: '1444857', + name: 'lock-open', + font_class: 'lock-open', + unicode: 'e9f0', + unicode_decimal: 59888, + }, + { + icon_id: '1445113', + name: 'plus-box', + font_class: 'plus-box', + unicode: 'eaf0', + unicode_decimal: 60144, + }, + { + icon_id: '1445369', + name: 'stethoscope', + font_class: 'stethoscope', + unicode: 'ebf0', + unicode_decimal: 60400, + }, + { + icon_id: '1445626', + name: 'windows', + font_class: 'windows', + unicode: 'ecf0', + unicode_decimal: 60656, + }, + { + icon_id: '1444088', + name: 'box-shadow', + font_class: 'box-shadow', + unicode: 'e6f1', + unicode_decimal: 59121, + }, + { + icon_id: '1444344', + name: 'cup', + font_class: 'cup', + unicode: 'e7f1', + unicode_decimal: 59377, + }, + { + icon_id: '1444602', + name: 'format-italic', + font_class: 'format-italic', + unicode: 'e8f1', + unicode_decimal: 59633, + }, + { + icon_id: '1444858', + name: 'lock-pattern', + font_class: 'lock-pattern', + unicode: 'e9f1', + unicode_decimal: 59889, + }, + { + icon_id: '1445114', + name: 'plus-circle', + font_class: 'plus-circle', + unicode: 'eaf1', + unicode_decimal: 60145, + }, + { + icon_id: '1445370', + name: 'sticker', + font_class: 'sticker', + unicode: 'ebf1', + unicode_decimal: 60401, + }, + { + icon_id: '1445627', + name: 'window-minimize', + font_class: 'window-minimize', + unicode: 'ecf1', + unicode_decimal: 60657, + }, + { + icon_id: '1444089', + name: 'bow-tie', + font_class: 'bow-tie', + unicode: 'e6f2', + unicode_decimal: 59122, + }, + { + icon_id: '1444345', + name: 'cube-unfolded', + font_class: 'cube-unfolded', + unicode: 'e7f2', + unicode_decimal: 59378, + }, + { + icon_id: '1444603', + name: 'format-line-style', + font_class: 'format-line-style', + unicode: 'e8f2', + unicode_decimal: 59634, + }, + { + icon_id: '1444859', + name: 'login', + font_class: 'login', + unicode: 'e9f2', + unicode_decimal: 59890, + }, + { + icon_id: '1445115', + name: 'plus-circle-multiple-outline', + font_class: 'plus-circle-multiple-outline', + unicode: 'eaf2', + unicode_decimal: 60146, + }, + { + icon_id: '1445371', + name: 'stocking', + font_class: 'stocking', + unicode: 'ebf2', + unicode_decimal: 60402, + }, + { + icon_id: '1445628', + name: 'window-closed', + font_class: 'window-closed', + unicode: 'ecf2', + unicode_decimal: 60658, + }, + { + icon_id: '1444090', + name: 'bowling', + font_class: 'bowling', + unicode: 'e6f3', + unicode_decimal: 59123, + }, + { + icon_id: '1444346', + name: 'cup-off', + font_class: 'cup-off', + unicode: 'e7f3', + unicode_decimal: 59379, + }, + { + icon_id: '1444604', + name: 'format-horizontal-align-right', + font_class: 'format-horizontal-align-right', + unicode: 'e8f3', + unicode_decimal: 59635, + }, + { + icon_id: '1444860', + name: 'lock-plus', + font_class: 'lock-plus', + unicode: 'e9f3', + unicode_decimal: 59891, + }, + { + icon_id: '1445116', + name: 'plus-network', + font_class: 'plus-network', + unicode: 'eaf3', + unicode_decimal: 60147, + }, + { + icon_id: '1445372', + name: 'stop', + font_class: 'stop', + unicode: 'ebf3', + unicode_decimal: 60403, + }, + { + icon_id: '1445629', + name: 'worker', + font_class: 'worker', + unicode: 'ecf3', + unicode_decimal: 60659, + }, + { + icon_id: '1444091', + name: 'box-cutter', + font_class: 'box-cutter', + unicode: 'e6f4', + unicode_decimal: 59124, + }, + { + icon_id: '1444347', + name: 'cup-water', + font_class: 'cup-water', + unicode: 'e7f4', + unicode_decimal: 59380, + }, + { + icon_id: '1444605', + name: 'format-line-weight', + font_class: 'format-line-weight', + unicode: 'e8f4', + unicode_decimal: 59636, + }, + { + icon_id: '1444861', + name: 'login-variant', + font_class: 'login-variant', + unicode: 'e9f4', + unicode_decimal: 59892, + }, + { + icon_id: '1445117', + name: 'plus-one', + font_class: 'plus-one', + unicode: 'eaf4', + unicode_decimal: 60148, + }, + { + icon_id: '1445373', + name: 'stop-circle-outline', + font_class: 'stop-circle-outline', + unicode: 'ebf4', + unicode_decimal: 60404, + }, + { + icon_id: '1445630', + name: 'wordpress', + font_class: 'wordpress', + unicode: 'ecf4', + unicode_decimal: 60660, + }, + { + icon_id: '1444092', + name: 'box', + font_class: 'box', + unicode: 'e6f5', + unicode_decimal: 59125, + }, + { + icon_id: '1444348', + name: 'currency-btc', + font_class: 'currency-btc', + unicode: 'e7f5', + unicode_decimal: 59381, + }, + { + icon_id: '1444606', + name: 'format-list-bulleted', + font_class: 'format-list-bulleted', + unicode: 'e8f5', + unicode_decimal: 59637, + }, + { + icon_id: '1444862', + name: 'logout', + font_class: 'logout', + unicode: 'e9f5', + unicode_decimal: 59893, + }, + { + icon_id: '1445118', + name: 'plus-circle-outline', + font_class: 'plus-circle-outline', + unicode: 'eaf5', + unicode_decimal: 60149, + }, + { + icon_id: '1445374', + name: 'stop-circle', + font_class: 'stop-circle', + unicode: 'ebf5', + unicode_decimal: 60405, + }, + { + icon_id: '1445631', + name: 'wrench', + font_class: 'wrench', + unicode: 'ecf5', + unicode_decimal: 60661, + }, + { + icon_id: '1444093', + name: 'bridge', + font_class: 'bridge', + unicode: 'e6f6', + unicode_decimal: 59126, + }, + { + icon_id: '1444349', + name: 'currency-gbp', + font_class: 'currency-gbp', + unicode: 'e7f6', + unicode_decimal: 59382, + }, + { + icon_id: '1444607', + name: 'format-list-bulleted-type', + font_class: 'format-list-bulleted-type', + unicode: 'e8f6', + unicode_decimal: 59638, + }, + { + icon_id: '1444863', + name: 'logout-variant', + font_class: 'logout-variant', + unicode: 'e9f6', + unicode_decimal: 59894, + }, + { + icon_id: '1445119', + name: 'pocket', + font_class: 'pocket', + unicode: 'eaf6', + unicode_decimal: 60150, + }, + { + icon_id: '1445375', + name: 'store', + font_class: 'store', + unicode: 'ebf6', + unicode_decimal: 60406, + }, + { + icon_id: '1445632', + name: 'wrap', + font_class: 'wrap', + unicode: 'ecf6', + unicode_decimal: 60662, + }, + { + icon_id: '1444094', + name: 'briefcase', + font_class: 'briefcase', + unicode: 'e6f7', + unicode_decimal: 59127, + }, + { + icon_id: '1444350', + name: 'currency-eur', + font_class: 'currency-eur', + unicode: 'e7f7', + unicode_decimal: 59383, + }, + { + icon_id: '1444608', + name: 'format-page-break', + font_class: 'format-page-break', + unicode: 'e8f7', + unicode_decimal: 59639, + }, + { + icon_id: '1444864', + name: 'looks', + font_class: 'looks', + unicode: 'e9f7', + unicode_decimal: 59895, + }, + { + icon_id: '1445120', + name: 'plus-outline', + font_class: 'plus-outline', + unicode: 'eaf7', + unicode_decimal: 60151, + }, + { + icon_id: '1445376', + name: 'store-24-hour', + font_class: 'store--hour', + unicode: 'ebf7', + unicode_decimal: 60407, + }, + { + icon_id: '1445633', + name: 'wunderlist', + font_class: 'wunderlist', + unicode: 'ecf7', + unicode_decimal: 60663, + }, + { + icon_id: '1444095', + name: 'briefcase-check', + font_class: 'briefcase-check', + unicode: 'e6f8', + unicode_decimal: 59128, + }, + { + icon_id: '1444351', + name: 'currency-inr', + font_class: 'currency-inr', + unicode: 'e7f8', + unicode_decimal: 59384, + }, + { + icon_id: '1444609', + name: 'format-list-numbers', + font_class: 'format-list-numbers', + unicode: 'e8f8', + unicode_decimal: 59640, + }, + { + icon_id: '1444865', + name: 'loop', + font_class: 'loop', + unicode: 'e9f8', + unicode_decimal: 59896, + }, + { + icon_id: '1445121', + name: 'polaroid', + font_class: 'polaroid', + unicode: 'eaf8', + unicode_decimal: 60152, + }, + { + icon_id: '1445377', + name: 'stove', + font_class: 'stove', + unicode: 'ebf8', + unicode_decimal: 60408, + }, + { + icon_id: '1445634', + name: 'xaml', + font_class: 'xaml', + unicode: 'ecf8', + unicode_decimal: 60664, + }, + { + icon_id: '1444096', + name: 'briefcase-download', + font_class: 'briefcase-download', + unicode: 'e6f9', + unicode_decimal: 59129, + }, + { + icon_id: '1444352', + name: 'currency-ngn', + font_class: 'currency-ngn', + unicode: 'e7f9', + unicode_decimal: 59385, + }, + { + icon_id: '1444610', + name: 'format-paragraph', + font_class: 'format-paragraph', + unicode: 'e8f9', + unicode_decimal: 59641, + }, + { + icon_id: '1444866', + name: 'loupe', + font_class: 'loupe', + unicode: 'e9f9', + unicode_decimal: 59897, + }, + { + icon_id: '1445122', + name: 'poll', + font_class: 'poll', + unicode: 'eaf9', + unicode_decimal: 60153, + }, + { + icon_id: '1445378', + name: 'subway', + font_class: 'subway', + unicode: 'ebf9', + unicode_decimal: 60409, + }, + { + icon_id: '1445635', + name: 'xbox', + font_class: 'xbox', + unicode: 'ecf9', + unicode_decimal: 60665, + }, + { + icon_id: '1444097', + name: 'briefcase-upload', + font_class: 'briefcase-upload', + unicode: 'e6fa', + unicode_decimal: 59130, + }, + { + icon_id: '1444353', + name: 'currency-rub', + font_class: 'currency-rub', + unicode: 'e7fa', + unicode_decimal: 59386, + }, + { + icon_id: '1444611', + name: 'format-pilcrow', + font_class: 'format-pilcrow', + unicode: 'e8fa', + unicode_decimal: 59642, + }, + { + icon_id: '1444867', + name: 'lumx', + font_class: 'lumx', + unicode: 'e9fa', + unicode_decimal: 59898, + }, + { + icon_id: '1445123', + name: 'pokeball', + font_class: 'pokeball', + unicode: 'eafa', + unicode_decimal: 60154, + }, + { + icon_id: '1445379', + name: 'subdirectory-arrow-left', + font_class: 'subdirectory-arrow-left', + unicode: 'ebfa', + unicode_decimal: 60410, + }, + { + icon_id: '1445636', + name: 'xbox-controller', + font_class: 'xbox-controller', + unicode: 'ecfa', + unicode_decimal: 60666, + }, + { + icon_id: '1444098', + name: 'brightness-1', + font_class: 'brightness-', + unicode: 'e6fb', + unicode_decimal: 59131, + }, + { + icon_id: '1444354', + name: 'currency-try', + font_class: 'currency-try', + unicode: 'e7fb', + unicode_decimal: 59387, + }, + { + icon_id: '1444612', + name: 'format-quote', + font_class: 'format-quote', + unicode: 'e8fb', + unicode_decimal: 59643, + }, + { + icon_id: '1444868', + name: 'magnet', + font_class: 'magnet', + unicode: 'e9fb', + unicode_decimal: 59899, + }, + { + icon_id: '1445124', + name: 'poll-box', + font_class: 'poll-box', + unicode: 'eafb', + unicode_decimal: 60155, + }, + { + icon_id: '1445380', + name: 'subdirectory-arrow-right', + font_class: 'subdirectory-arrow-right', + unicode: 'ebfb', + unicode_decimal: 60411, + }, + { + icon_id: '1445637', + name: 'xbox-controller-off', + font_class: 'xbox-controller-off', + unicode: 'ecfb', + unicode_decimal: 60667, + }, + { + icon_id: '1444099', + name: 'brightness-2', + font_class: 'brightness-1', + unicode: 'e6fc', + unicode_decimal: 59132, + }, + { + icon_id: '1444355', + name: 'currency-usd', + font_class: 'currency-usd', + unicode: 'e7fc', + unicode_decimal: 59388, + }, + { + icon_id: '1444613', + name: 'format-paint', + font_class: 'format-paint', + unicode: 'e8fc', + unicode_decimal: 59644, + }, + { + icon_id: '1444869', + name: 'magnet-on', + font_class: 'magnet-on', + unicode: 'e9fc', + unicode_decimal: 59900, + }, + { + icon_id: '1445125', + name: 'polymer', + font_class: 'polymer', + unicode: 'eafc', + unicode_decimal: 60156, + }, + { + icon_id: '1445381', + name: 'subway-variant', + font_class: 'subway-variant', + unicode: 'ebfc', + unicode_decimal: 60412, + }, + { + icon_id: '1445638', + name: 'xda', + font_class: 'xda', + unicode: 'ecfc', + unicode_decimal: 60668, + }, + { + icon_id: '1444100', + name: 'brightness-3', + font_class: 'brightness-2', + unicode: 'e6fd', + unicode_decimal: 59133, + }, + { + icon_id: '1444356', + name: 'currency-usd-off', + font_class: 'currency-usd-off', + unicode: 'e7fd', + unicode_decimal: 59389, + }, + { + icon_id: '1444614', + name: 'format-size', + font_class: 'format-size', + unicode: 'e8fd', + unicode_decimal: 59645, + }, + { + icon_id: '1444870', + name: 'magnify', + font_class: 'magnify', + unicode: 'e9fd', + unicode_decimal: 59901, + }, + { + icon_id: '1445126', + name: 'play-protected-content', + font_class: 'play-protected-content', + unicode: 'eafd', + unicode_decimal: 60157, + }, + { + icon_id: '1445382', + name: 'sunglasses', + font_class: 'sunglasses', + unicode: 'ebfd', + unicode_decimal: 60413, + }, + { + icon_id: '1445639', + name: 'xing', + font_class: 'xing', + unicode: 'ecfd', + unicode_decimal: 60669, + }, + { + icon_id: '1444101', + name: 'brightness-4', + font_class: 'brightness-3', + unicode: 'e6fe', + unicode_decimal: 59134, + }, + { + icon_id: '1444357', + name: 'cursor-default', + font_class: 'cursor-default', + unicode: 'e7fe', + unicode_decimal: 59390, + }, + { + icon_id: '1444615', + name: 'format-section', + font_class: 'format-section', + unicode: 'e8fe', + unicode_decimal: 59646, + }, + { + icon_id: '1444871', + name: 'magnify-plus', + font_class: 'magnify-plus', + unicode: 'e9fe', + unicode_decimal: 59902, + }, + { + icon_id: '1445127', + name: 'pool', + font_class: 'pool', + unicode: 'eafe', + unicode_decimal: 60158, + }, + { + icon_id: '1445383', + name: 'swap-horizontal', + font_class: 'swap-horizontal', + unicode: 'ebfe', + unicode_decimal: 60414, + }, + { + icon_id: '1445640', + name: 'xing-circle', + font_class: 'xing-circle', + unicode: 'ecfe', + unicode_decimal: 60670, + }, + { + icon_id: '1444102', + name: 'brightness-5', + font_class: 'brightness-4', + unicode: 'e6ff', + unicode_decimal: 59135, + }, + { + icon_id: '1444358', + name: 'cursor-default-outline', + font_class: 'cursor-default-outline', + unicode: 'e7ff', + unicode_decimal: 59391, + }, + { + icon_id: '1444616', + name: 'format-strikethrough', + font_class: 'format-strikethrough', + unicode: 'e8ff', + unicode_decimal: 59647, + }, + { + icon_id: '1444872', + name: 'magnify-minus', + font_class: 'magnify-minus', + unicode: 'e9ff', + unicode_decimal: 59903, + }, + { + icon_id: '1445128', + name: 'pot', + font_class: 'pot', + unicode: 'eaff', + unicode_decimal: 60159, + }, + { + icon_id: '1445384', + name: 'surround-sound', + font_class: 'surround-sound', + unicode: 'ebff', + unicode_decimal: 60415, + }, + { + icon_id: '1445641', + name: 'xing-box', + font_class: 'xing-box', + unicode: 'ecff', + unicode_decimal: 60671, + }, + { + icon_id: '1444103', + name: 'brightness-6', + font_class: 'brightness-5', + unicode: 'e700', + unicode_decimal: 59136, + }, + { + icon_id: '1444359', + name: 'cursor-pointer', + font_class: 'cursor-pointer', + unicode: 'e800', + unicode_decimal: 59392, + }, + { + icon_id: '1444617', + name: 'format-strikethrough-variant', + font_class: 'format-strikethrough-variant', + unicode: 'e900', + unicode_decimal: 59648, + }, + { + icon_id: '1444873', + name: 'map', + font_class: 'map', + unicode: 'ea00', + unicode_decimal: 59904, + }, + { + icon_id: '1445129', + name: 'popcorn', + font_class: 'popcorn', + unicode: 'eb00', + unicode_decimal: 60160, + }, + { + icon_id: '1445385', + name: 'swap-vertical', + font_class: 'swap-vertical', + unicode: 'ec00', + unicode_decimal: 60416, + }, + { + icon_id: '1445642', + name: 'xml', + font_class: 'xml', + unicode: 'ed00', + unicode_decimal: 60672, + }, + { + icon_id: '1441009', + name: 'access-point', + font_class: 'access-point', + unicode: 'e601', + unicode_decimal: 58881, + }, + { + icon_id: '1444104', + name: 'brightness-7', + font_class: 'brightness-6', + unicode: 'e701', + unicode_decimal: 59137, + }, + { + icon_id: '1444360', + name: 'cursor-move', + font_class: 'cursor-move', + unicode: 'e801', + unicode_decimal: 59393, + }, + { + icon_id: '1444618', + name: 'format-subscript', + font_class: 'format-subscript', + unicode: 'e901', + unicode_decimal: 59649, + }, + { + icon_id: '1444874', + name: 'mail-ru', + font_class: 'mail-ru', + unicode: 'ea01', + unicode_decimal: 59905, + }, + { + icon_id: '1445130', + name: 'pound', + font_class: 'pound', + unicode: 'eb01', + unicode_decimal: 60161, + }, + { + icon_id: '1445386', + name: 'swim', + font_class: 'swim', + unicode: 'ec01', + unicode_decimal: 60417, + }, + { + icon_id: '1445643', + name: 'yelp', + font_class: 'yelp', + unicode: 'ed01', + unicode_decimal: 60673, + }, + { + icon_id: '1441080', + name: 'account-box-outline', + font_class: 'account-box-outline', + unicode: 'e602', + unicode_decimal: 58882, + }, + { + icon_id: '1444105', + name: 'broom', + font_class: 'broom', + unicode: 'e702', + unicode_decimal: 59138, + }, + { + icon_id: '1444361', + name: 'cursor-text', + font_class: 'cursor-text', + unicode: 'e802', + unicode_decimal: 59394, + }, + { + icon_id: '1444619', + name: 'format-superscript', + font_class: 'format-superscript', + unicode: 'e902', + unicode_decimal: 59650, + }, + { + icon_id: '1444875', + name: 'map-marker', + font_class: 'map-marker', + unicode: 'ea02', + unicode_decimal: 59906, + }, + { + icon_id: '1445131', + name: 'pound-box', + font_class: 'pound-box', + unicode: 'eb02', + unicode_decimal: 60162, + }, + { + icon_id: '1445387', + name: 'switch', + font_class: 'switch', + unicode: 'ec02', + unicode_decimal: 60418, + }, + { + icon_id: '1445644', + name: 'yeast', + font_class: 'yeast', + unicode: 'ed02', + unicode_decimal: 60674, + }, + { + icon_id: '1441081', + name: 'account-box', + font_class: 'account-box', + unicode: 'e603', + unicode_decimal: 58883, + }, + { + icon_id: '1444106', + name: 'brightness-auto', + font_class: 'brightness-auto', + unicode: 'e703', + unicode_decimal: 59139, + }, + { + icon_id: '1444362', + name: 'database', + font_class: 'database', + unicode: 'e803', + unicode_decimal: 59395, + }, + { + icon_id: '1444620', + name: 'format-text', + font_class: 'format-text', + unicode: 'e903', + unicode_decimal: 59651, + }, + { + icon_id: '1444876', + name: 'map-marker-minus', + font_class: 'map-marker-minus', + unicode: 'ea03', + unicode_decimal: 59907, + }, + { + icon_id: '1445132', + name: 'pot-mix', + font_class: 'pot-mix', + unicode: 'eb03', + unicode_decimal: 60163, + }, + { + icon_id: '1445388', + name: 'sync', + font_class: 'sync', + unicode: 'ec03', + unicode_decimal: 60419, + }, + { + icon_id: '1445645', + name: 'yin-yang', + font_class: 'yin-yang', + unicode: 'ed03', + unicode_decimal: 60675, + }, + { + icon_id: '1441082', + name: 'access-point-network', + font_class: 'access-point-network', + unicode: 'e604', + unicode_decimal: 58884, + }, + { + icon_id: '1444107', + name: 'brush', + font_class: 'brush', + unicode: 'e704', + unicode_decimal: 59140, + }, + { + icon_id: '1444363', + name: 'database-minus', + font_class: 'database-minus', + unicode: 'e804', + unicode_decimal: 59396, + }, + { + icon_id: '1444621', + name: 'format-textdirection-l-to-r', + font_class: 'format-textdirection-l-to-r', + unicode: 'e904', + unicode_decimal: 59652, + }, + { + icon_id: '1444877', + name: 'map-marker-circle', + font_class: 'map-marker-circle', + unicode: 'ea04', + unicode_decimal: 59908, + }, + { + icon_id: '1445133', + name: 'power', + font_class: 'power', + unicode: 'eb04', + unicode_decimal: 60164, + }, + { + icon_id: '1445389', + name: 'sync-alert', + font_class: 'sync-alert', + unicode: 'ec04', + unicode_decimal: 60420, + }, + { + icon_id: '1445646', + name: 'youtube-play', + font_class: 'youtube-play', + unicode: 'ed04', + unicode_decimal: 60676, + }, + { + icon_id: '1441083', + name: 'account-alert', + font_class: 'account-alert', + unicode: 'e605', + unicode_decimal: 58885, + }, + { + icon_id: '1444108', + name: 'bug', + font_class: 'bug', + unicode: 'e705', + unicode_decimal: 59141, + }, + { + icon_id: '1444364', + name: 'database-plus', + font_class: 'database-plus', + unicode: 'e805', + unicode_decimal: 59397, + }, + { + icon_id: '1444622', + name: 'format-textdirection-r-to-l', + font_class: 'format-textdirection-r-to-l', + unicode: 'e905', + unicode_decimal: 59653, + }, + { + icon_id: '1444878', + name: 'map-marker-multiple', + font_class: 'map-marker-multiple', + unicode: 'ea05', + unicode_decimal: 59909, + }, + { + icon_id: '1445134', + name: 'power-plug', + font_class: 'power-plug', + unicode: 'eb05', + unicode_decimal: 60165, + }, + { + icon_id: '1445390', + name: 'tab', + font_class: 'tab', + unicode: 'ec05', + unicode_decimal: 60421, + }, + { + icon_id: '1445647', + name: 'zip-box', + font_class: 'zip-box', + unicode: 'ed05', + unicode_decimal: 60677, + }, + { + icon_id: '1441084', + name: 'account-card-details', + font_class: 'account-card-details', + unicode: 'e606', + unicode_decimal: 58886, + }, + { + icon_id: '1444109', + name: 'buffer', + font_class: 'buffer', + unicode: 'e706', + unicode_decimal: 59142, + }, + { + icon_id: '1444365', + name: 'debug-step-into', + font_class: 'debug-step-into', + unicode: 'e806', + unicode_decimal: 59398, + }, + { + icon_id: '1444623', + name: 'format-title', + font_class: 'format-title', + unicode: 'e906', + unicode_decimal: 59654, + }, + { + icon_id: '1444879', + name: 'map-marker-off', + font_class: 'map-marker-off', + unicode: 'ea06', + unicode_decimal: 59910, + }, + { + icon_id: '1445135', + name: 'power-settings', + font_class: 'power-settings', + unicode: 'eb06', + unicode_decimal: 60166, + }, + { + icon_id: '1445391', + name: 'table', + font_class: 'table', + unicode: 'ec06', + unicode_decimal: 60422, + }, + { + icon_id: '1441085', + name: 'account', + font_class: 'account', + unicode: 'e607', + unicode_decimal: 58887, + }, + { + icon_id: '1444110', + name: 'bulletin-board', + font_class: 'bulletin-board', + unicode: 'e707', + unicode_decimal: 59143, + }, + { + icon_id: '1444366', + name: 'debug-step-over', + font_class: 'debug-step-over', + unicode: 'e807', + unicode_decimal: 59399, + }, + { + icon_id: '1444624', + name: 'format-vertical-align-bottom', + font_class: 'format-vertical-align-bottom', + unicode: 'e907', + unicode_decimal: 59655, + }, + { + icon_id: '1444880', + name: 'map-marker-plus', + font_class: 'map-marker-plus', + unicode: 'ea07', + unicode_decimal: 59911, + }, + { + icon_id: '1445136', + name: 'power-plug-off', + font_class: 'power-plug-off', + unicode: 'eb07', + unicode_decimal: 60167, + }, + { + icon_id: '1445392', + name: 'table-column-plus-before', + font_class: 'table-column-plus-before', + unicode: 'ec07', + unicode_decimal: 60423, + }, + { + icon_id: '1441086', + name: 'account-check', + font_class: 'account-check', + unicode: 'e608', + unicode_decimal: 58888, + }, + { + icon_id: '1444111', + name: 'bullhorn', + font_class: 'bullhorn', + unicode: 'e708', + unicode_decimal: 59144, + }, + { + icon_id: '1444367', + name: 'debug-step-out', + font_class: 'debug-step-out', + unicode: 'e808', + unicode_decimal: 59400, + }, + { + icon_id: '1444625', + name: 'format-underline', + font_class: 'format-underline', + unicode: 'e908', + unicode_decimal: 59656, + }, + { + icon_id: '1444881', + name: 'map-marker-radius', + font_class: 'map-marker-radius', + unicode: 'ea08', + unicode_decimal: 59912, + }, + { + icon_id: '1445137', + name: 'power-socket', + font_class: 'power-socket', + unicode: 'eb08', + unicode_decimal: 60168, + }, + { + icon_id: '1445393', + name: 'table-column-plus-after', + font_class: 'table-column-plus-after', + unicode: 'ec08', + unicode_decimal: 60424, + }, + { + icon_id: '1441330', + name: 'account-key', + font_class: 'account-key', + unicode: 'e609', + unicode_decimal: 58889, + }, + { + icon_id: '1444112', + name: 'bullseye', + font_class: 'bullseye', + unicode: 'e709', + unicode_decimal: 59145, + }, + { + icon_id: '1444368', + name: 'decimal-decrease', + font_class: 'decimal-decrease', + unicode: 'e809', + unicode_decimal: 59401, + }, + { + icon_id: '1444626', + name: 'format-vertical-align-center', + font_class: 'format-vertical-align-center', + unicode: 'e909', + unicode_decimal: 59657, + }, + { + icon_id: '1444882', + name: 'markdown', + font_class: 'markdown', + unicode: 'ea09', + unicode_decimal: 59913, + }, + { + icon_id: '1445138', + name: 'prescription', + font_class: 'prescription', + unicode: 'eb09', + unicode_decimal: 60169, + }, + { + icon_id: '1445394', + name: 'table-column-remove', + font_class: 'table-column-remove', + unicode: 'ec09', + unicode_decimal: 60425, + }, + { + icon_id: '1441331', + name: 'account-convert', + font_class: 'account-convert', + unicode: 'e60a', + unicode_decimal: 58890, + }, + { + icon_id: '1444113', + name: 'bus', + font_class: 'bus', + unicode: 'e70a', + unicode_decimal: 59146, + }, + { + icon_id: '1444369', + name: 'delete', + font_class: 'delete', + unicode: 'e80a', + unicode_decimal: 59402, + }, + { + icon_id: '1444627', + name: 'format-vertical-align-top', + font_class: 'format-vertical-align-top', + unicode: 'e90a', + unicode_decimal: 59658, + }, + { + icon_id: '1444883', + name: 'margin', + font_class: 'margin', + unicode: 'ea0a', + unicode_decimal: 59914, + }, + { + icon_id: '1445139', + name: 'presentation', + font_class: 'presentation', + unicode: 'eb0a', + unicode_decimal: 60170, + }, + { + icon_id: '1445395', + name: 'table-column-width', + font_class: 'table-column-width', + unicode: 'ec0a', + unicode_decimal: 60426, + }, + { + icon_id: '1441332', + name: 'account-circle', + font_class: 'account-circle', + unicode: 'e60b', + unicode_decimal: 58891, + }, + { + icon_id: '1444114', + name: 'burst-mode', + font_class: 'burst-mode', + unicode: 'e70b', + unicode_decimal: 59147, + }, + { + icon_id: '1444370', + name: 'decimal-increase', + font_class: 'decimal-increase', + unicode: 'e80b', + unicode_decimal: 59403, + }, + { + icon_id: '1444628', + name: 'format-wrap-inline', + font_class: 'format-wrap-inline', + unicode: 'e90b', + unicode_decimal: 59659, + }, + { + icon_id: '1444884', + name: 'marker', + font_class: 'marker', + unicode: 'ea0b', + unicode_decimal: 59915, + }, + { + icon_id: '1445140', + name: 'presentation-play', + font_class: 'presentation-play', + unicode: 'eb0b', + unicode_decimal: 60171, + }, + { + icon_id: '1445396', + name: 'table-large', + font_class: 'table-large', + unicode: 'ec0b', + unicode_decimal: 60427, + }, + { + icon_id: '1441333', + name: 'account-minus', + font_class: 'account-minus', + unicode: 'e60c', + unicode_decimal: 58892, + }, + { + icon_id: '1444115', + name: 'cake', + font_class: 'cake', + unicode: 'e70c', + unicode_decimal: 59148, + }, + { + icon_id: '1444371', + name: 'delete-circle', + font_class: 'delete-circle', + unicode: 'e80c', + unicode_decimal: 59404, + }, + { + icon_id: '1444629', + name: 'format-wrap-tight', + font_class: 'format-wrap-tight', + unicode: 'e90c', + unicode_decimal: 59660, + }, + { + icon_id: '1444885', + name: 'marker-check', + font_class: 'marker-check', + unicode: 'ea0c', + unicode_decimal: 59916, + }, + { + icon_id: '1445141', + name: 'printer', + font_class: 'printer', + unicode: 'eb0c', + unicode_decimal: 60172, + }, + { + icon_id: '1445397', + name: 'table-row-height', + font_class: 'table-row-height', + unicode: 'ec0c', + unicode_decimal: 60428, + }, + { + icon_id: '1441334', + name: 'account-location', + font_class: 'account-location', + unicode: 'e60d', + unicode_decimal: 58893, + }, + { + icon_id: '1444116', + name: 'cake-layered', + font_class: 'cake-layered', + unicode: 'e70d', + unicode_decimal: 59149, + }, + { + icon_id: '1444372', + name: 'delete-empty', + font_class: 'delete-empty', + unicode: 'e80d', + unicode_decimal: 59405, + }, + { + icon_id: '1444630', + name: 'format-wrap-top-bottom', + font_class: 'format-wrap-top-bottom', + unicode: 'e90d', + unicode_decimal: 59661, + }, + { + icon_id: '1444886', + name: 'material-ui', + font_class: 'material-ui', + unicode: 'ea0d', + unicode_decimal: 59917, + }, + { + icon_id: '1445142', + name: 'printer-3d', + font_class: 'printer-d', + unicode: 'eb0d', + unicode_decimal: 60173, + }, + { + icon_id: '1445398', + name: 'table-edit', + font_class: 'table-edit', + unicode: 'ec0d', + unicode_decimal: 60429, + }, + { + icon_id: '1441335', + name: 'account-multiple', + font_class: 'account-multiple', + unicode: 'e60e', + unicode_decimal: 58894, + }, + { + icon_id: '1444117', + name: 'cached', + font_class: 'cached', + unicode: 'e70e', + unicode_decimal: 59150, + }, + { + icon_id: '1444373', + name: 'delete-forever', + font_class: 'delete-forever', + unicode: 'e80e', + unicode_decimal: 59406, + }, + { + icon_id: '1444631', + name: 'format-wrap-square', + font_class: 'format-wrap-square', + unicode: 'e90e', + unicode_decimal: 59662, + }, + { + icon_id: '1444887', + name: 'martini', + font_class: 'martini', + unicode: 'ea0e', + unicode_decimal: 59918, + }, + { + icon_id: '1445143', + name: 'printer-alert', + font_class: 'printer-alert', + unicode: 'eb0e', + unicode_decimal: 60174, + }, + { + icon_id: '1445399', + name: 'table-row-plus-after', + font_class: 'table-row-plus-after', + unicode: 'ec0e', + unicode_decimal: 60430, + }, + { + icon_id: '1441336', + name: 'account-multiple-minus', + font_class: 'account-multiple-minus', + unicode: 'e60f', + unicode_decimal: 58895, + }, + { + icon_id: '1444118', + name: 'calculator', + font_class: 'calculator', + unicode: 'e70f', + unicode_decimal: 59151, + }, + { + icon_id: '1444374', + name: 'delete-sweep', + font_class: 'delete-sweep', + unicode: 'e80f', + unicode_decimal: 59407, + }, + { + icon_id: '1444632', + name: 'forum', + font_class: 'forum', + unicode: 'e90f', + unicode_decimal: 59663, + }, + { + icon_id: '1444888', + name: 'math-compass', + font_class: 'math-compass', + unicode: 'ea0f', + unicode_decimal: 59919, + }, + { + icon_id: '1445144', + name: 'printer-settings', + font_class: 'printer-settings', + unicode: 'eb0f', + unicode_decimal: 60175, + }, + { + icon_id: '1445400', + name: 'sword', + font_class: 'sword', + unicode: 'ec0f', + unicode_decimal: 60431, + }, + { + icon_id: '1441389', + name: 'account-multiple-plus', + font_class: 'account-multiple-plus', + unicode: 'e610', + unicode_decimal: 58896, + }, + { + icon_id: '1444119', + name: 'cake-variant', + font_class: 'cake-variant', + unicode: 'e710', + unicode_decimal: 59152, + }, + { + icon_id: '1444375', + name: 'delete-variant', + font_class: 'delete-variant', + unicode: 'e810', + unicode_decimal: 59408, + }, + { + icon_id: '1444633', + name: 'forward', + font_class: 'forward', + unicode: 'e910', + unicode_decimal: 59664, + }, + { + icon_id: '1444889', + name: 'matrix', + font_class: 'matrix', + unicode: 'ea10', + unicode_decimal: 59920, + }, + { + icon_id: '1445145', + name: 'priority-high', + font_class: 'priority-high', + unicode: 'eb10', + unicode_decimal: 60176, + }, + { + icon_id: '1445401', + name: 'sync-off', + font_class: 'sync-off', + unicode: 'ec10', + unicode_decimal: 60432, + }, + { + icon_id: '1441390', + name: 'account-multiple-outline', + font_class: 'account-multiple-outline', + unicode: 'e611', + unicode_decimal: 58897, + }, + { + icon_id: '1444120', + name: 'calendar', + font_class: 'calendar', + unicode: 'e711', + unicode_decimal: 59153, + }, + { + icon_id: '1444376', + name: 'delta', + font_class: 'delta', + unicode: 'e811', + unicode_decimal: 59409, + }, + { + icon_id: '1444634', + name: 'foursquare', + font_class: 'foursquare', + unicode: 'e911', + unicode_decimal: 59665, + }, + { + icon_id: '1444890', + name: 'maxcdn', + font_class: 'maxcdn', + unicode: 'ea11', + unicode_decimal: 59921, + }, + { + icon_id: '1445146', + name: 'priority-low', + font_class: 'priority-low', + unicode: 'eb11', + unicode_decimal: 60177, + }, + { + icon_id: '1445402', + name: 'table-row-plus-before', + font_class: 'table-row-plus-before', + unicode: 'ec11', + unicode_decimal: 60433, + }, + { + icon_id: '1441391', + name: 'account-plus', + font_class: 'account-plus', + unicode: 'e612', + unicode_decimal: 58898, + }, + { + icon_id: '1444121', + name: 'calendar-blank', + font_class: 'calendar-blank', + unicode: 'e712', + unicode_decimal: 59154, + }, + { + icon_id: '1444377', + name: 'deskphone', + font_class: 'deskphone', + unicode: 'e812', + unicode_decimal: 59410, + }, + { + icon_id: '1444635', + name: 'fridge', + font_class: 'fridge', + unicode: 'e912', + unicode_decimal: 59666, + }, + { + icon_id: '1444891', + name: 'medical-bag', + font_class: 'medical-bag', + unicode: 'ea12', + unicode_decimal: 59922, + }, + { + icon_id: '1445147', + name: 'professional-hexagon', + font_class: 'professional-hexagon', + unicode: 'eb12', + unicode_decimal: 60178, + }, + { + icon_id: '1445403', + name: 'tablet', + font_class: 'tablet', + unicode: 'ec12', + unicode_decimal: 60434, + }, + { + icon_id: '1441392', + name: 'account-network', + font_class: 'account-network', + unicode: 'e613', + unicode_decimal: 58899, + }, + { + icon_id: '1444122', + name: 'calendar-check', + font_class: 'calendar-check', + unicode: 'e713', + unicode_decimal: 59155, + }, + { + icon_id: '1444378', + name: 'desktop-mac', + font_class: 'desktop-mac', + unicode: 'e813', + unicode_decimal: 59411, + }, + { + icon_id: '1444636', + name: 'fridge-filled', + font_class: 'fridge-filled', + unicode: 'e913', + unicode_decimal: 59667, + }, + { + icon_id: '1444892', + name: 'medium', + font_class: 'medium', + unicode: 'ea13', + unicode_decimal: 59923, + }, + { + icon_id: '1445148', + name: 'projector-screen', + font_class: 'projector-screen', + unicode: 'eb13', + unicode_decimal: 60179, + }, + { + icon_id: '1445404', + name: 'table-row-remove', + font_class: 'table-row-remove', + unicode: 'ec13', + unicode_decimal: 60435, + }, + { + icon_id: '1441393', + name: 'account-off', + font_class: 'account-off', + unicode: 'e614', + unicode_decimal: 58900, + }, + { + icon_id: '1444123', + name: 'calendar-clock', + font_class: 'calendar-clock', + unicode: 'e714', + unicode_decimal: 59156, + }, + { + icon_id: '1444379', + name: 'deviantart', + font_class: 'deviantart', + unicode: 'e814', + unicode_decimal: 59412, + }, + { + icon_id: '1444637', + name: 'fridge-filled-bottom', + font_class: 'fridge-filled-bottom', + unicode: 'e914', + unicode_decimal: 59668, + }, + { + icon_id: '1444893', + name: 'memory', + font_class: 'memory', + unicode: 'ea14', + unicode_decimal: 59924, + }, + { + icon_id: '1445149', + name: 'projector', + font_class: 'projector', + unicode: 'eb14', + unicode_decimal: 60180, + }, + { + icon_id: '1445405', + name: 'tablet-android', + font_class: 'tablet-android', + unicode: 'ec14', + unicode_decimal: 60436, + }, + { + icon_id: '1441394', + name: 'account-outline', + font_class: 'account-outline', + unicode: 'e615', + unicode_decimal: 58901, + }, + { + icon_id: '1444124', + name: 'calendar-plus', + font_class: 'calendar-plus', + unicode: 'e715', + unicode_decimal: 59157, + }, + { + icon_id: '1444380', + name: 'desktop-tower', + font_class: 'desktop-tower', + unicode: 'e815', + unicode_decimal: 59413, + }, + { + icon_id: '1444638', + name: 'fridge-filled-top', + font_class: 'fridge-filled-top', + unicode: 'e915', + unicode_decimal: 59669, + }, + { + icon_id: '1444894', + name: 'menu', + font_class: 'menu', + unicode: 'ea15', + unicode_decimal: 59925, + }, + { + icon_id: '1445150', + name: 'publish', + font_class: 'publish', + unicode: 'eb15', + unicode_decimal: 60181, + }, + { + icon_id: '1445406', + name: 'tablet-ipad', + font_class: 'tablet-ipad', + unicode: 'ec15', + unicode_decimal: 60437, + }, + { + icon_id: '1441395', + name: 'account-remove', + font_class: 'account-remove', + unicode: 'e616', + unicode_decimal: 58902, + }, + { + icon_id: '1444125', + name: 'calendar-multiple', + font_class: 'calendar-multiple', + unicode: 'e716', + unicode_decimal: 59158, + }, + { + icon_id: '1444381', + name: 'details', + font_class: 'details', + unicode: 'e816', + unicode_decimal: 59414, + }, + { + icon_id: '1444639', + name: 'fullscreen', + font_class: 'fullscreen', + unicode: 'e916', + unicode_decimal: 59670, + }, + { + icon_id: '1444895', + name: 'menu-down', + font_class: 'menu-down', + unicode: 'ea16', + unicode_decimal: 59926, + }, + { + icon_id: '1445151', + name: 'pulse', + font_class: 'pulse', + unicode: 'eb16', + unicode_decimal: 60182, + }, + { + icon_id: '1445407', + name: 'tab-unselected', + font_class: 'tab-unselected', + unicode: 'ec16', + unicode_decimal: 60438, + }, + { + icon_id: '1441396', + name: 'account-star', + font_class: 'account-star', + unicode: 'e617', + unicode_decimal: 58903, + }, + { + icon_id: '1444126', + name: 'calendar-multiple-check', + font_class: 'calendar-multiple-check', + unicode: 'e717', + unicode_decimal: 59159, + }, + { + icon_id: '1444382', + name: 'developer-board', + font_class: 'developer-board', + unicode: 'e817', + unicode_decimal: 59415, + }, + { + icon_id: '1444640', + name: 'fullscreen-exit', + font_class: 'fullscreen-exit', + unicode: 'e917', + unicode_decimal: 59671, + }, + { + icon_id: '1444896', + name: 'menu-down-outline', + font_class: 'menu-down-outline', + unicode: 'ea17', + unicode_decimal: 59927, + }, + { + icon_id: '1445152', + name: 'puzzle', + font_class: 'puzzle', + unicode: 'eb17', + unicode_decimal: 60183, + }, + { + icon_id: '1445408', + name: 'tag-heart', + font_class: 'tag-heart', + unicode: 'ec17', + unicode_decimal: 60439, + }, + { + icon_id: '1441397', + name: 'account-settings', + font_class: 'account-settings', + unicode: 'e618', + unicode_decimal: 58904, + }, + { + icon_id: '1444127', + name: 'calendar-range', + font_class: 'calendar-range', + unicode: 'e718', + unicode_decimal: 59160, + }, + { + icon_id: '1444383', + name: 'dialpad', + font_class: 'dialpad', + unicode: 'e818', + unicode_decimal: 59416, + }, + { + icon_id: '1444641', + name: 'gamepad', + font_class: 'gamepad', + unicode: 'e918', + unicode_decimal: 59672, + }, + { + icon_id: '1444897', + name: 'menu-left', + font_class: 'menu-left', + unicode: 'ea18', + unicode_decimal: 59928, + }, + { + icon_id: '1445153', + name: 'qrcode', + font_class: 'qrcode', + unicode: 'eb18', + unicode_decimal: 60184, + }, + { + icon_id: '1445409', + name: 'tag', + font_class: 'tag', + unicode: 'ec18', + unicode_decimal: 60440, + }, + { + icon_id: '1441398', + name: 'account-settings-variant', + font_class: 'account-settings-variant', + unicode: 'e619', + unicode_decimal: 58905, + }, + { + icon_id: '1444128', + name: 'calendar-question', + font_class: 'calendar-question', + unicode: 'e719', + unicode_decimal: 59161, + }, + { + icon_id: '1444384', + name: 'dice-2', + font_class: 'dice-', + unicode: 'e819', + unicode_decimal: 59417, + }, + { + icon_id: '1444642', + name: 'function', + font_class: 'function', + unicode: 'e919', + unicode_decimal: 59673, + }, + { + icon_id: '1444898', + name: 'menu-right', + font_class: 'menu-right', + unicode: 'ea19', + unicode_decimal: 59929, + }, + { + icon_id: '1445154', + name: 'qrcode-scan', + font_class: 'qrcode-scan', + unicode: 'eb19', + unicode_decimal: 60185, + }, + { + icon_id: '1445410', + name: 'tag-faces', + font_class: 'tag-faces', + unicode: 'ec19', + unicode_decimal: 60441, + }, + { + icon_id: '1441399', + name: 'account-search', + font_class: 'account-search', + unicode: 'e61a', + unicode_decimal: 58906, + }, + { + icon_id: '1444129', + name: 'calendar-remove', + font_class: 'calendar-remove', + unicode: 'e71a', + unicode_decimal: 59162, + }, + { + icon_id: '1444385', + name: 'diamond', + font_class: 'diamond', + unicode: 'e81a', + unicode_decimal: 59418, + }, + { + icon_id: '1444643', + name: 'garage', + font_class: 'garage', + unicode: 'e91a', + unicode_decimal: 59674, + }, + { + icon_id: '1444899', + name: 'menu-up', + font_class: 'menu-up', + unicode: 'ea1a', + unicode_decimal: 59930, + }, + { + icon_id: '1445155', + name: 'qqchat', + font_class: 'qqchat', + unicode: 'eb1a', + unicode_decimal: 60186, + }, + { + icon_id: '1445411', + name: 'tag-multiple', + font_class: 'tag-multiple', + unicode: 'ec1a', + unicode_decimal: 60442, + }, + { + icon_id: '1441400', + name: 'account-star-variant', + font_class: 'account-star-variant', + unicode: 'e61b', + unicode_decimal: 58907, + }, + { + icon_id: '1444130', + name: 'calendar-today', + font_class: 'calendar-today', + unicode: 'e71b', + unicode_decimal: 59163, + }, + { + icon_id: '1444386', + name: 'dice-1', + font_class: 'dice-1', + unicode: 'e81b', + unicode_decimal: 59419, + }, + { + icon_id: '1444644', + name: 'gamepad-variant', + font_class: 'gamepad-variant', + unicode: 'e91b', + unicode_decimal: 59675, + }, + { + icon_id: '1444900', + name: 'message', + font_class: 'message', + unicode: 'ea1b', + unicode_decimal: 59931, + }, + { + icon_id: '1445156', + name: 'quadcopter', + font_class: 'quadcopter', + unicode: 'eb1b', + unicode_decimal: 60187, + }, + { + icon_id: '1445412', + name: 'tag-outline', + font_class: 'tag-outline', + unicode: 'ec1b', + unicode_decimal: 60443, + }, + { + icon_id: '1441401', + name: 'account-switch', + font_class: 'account-switch', + unicode: 'e61c', + unicode_decimal: 58908, + }, + { + icon_id: '1444131', + name: 'call-merge', + font_class: 'call-merge', + unicode: 'e71c', + unicode_decimal: 59164, + }, + { + icon_id: '1444387', + name: 'dice-3', + font_class: 'dice-2', + unicode: 'e81c', + unicode_decimal: 59420, + }, + { + icon_id: '1444645', + name: 'garage-open', + font_class: 'garage-open', + unicode: 'e91c', + unicode_decimal: 59676, + }, + { + icon_id: '1444901', + name: 'message-bulleted', + font_class: 'message-bulleted', + unicode: 'ea1c', + unicode_decimal: 59932, + }, + { + icon_id: '1445157', + name: 'quality-high', + font_class: 'quality-high', + unicode: 'eb1c', + unicode_decimal: 60188, + }, + { + icon_id: '1445413', + name: 'tag-text-outline', + font_class: 'tag-text-outline', + unicode: 'ec1c', + unicode_decimal: 60444, + }, + { + icon_id: '1441402', + name: 'adjust', + font_class: 'adjust', + unicode: 'e61d', + unicode_decimal: 58909, + }, + { + icon_id: '1444132', + name: 'call-made', + font_class: 'call-made', + unicode: 'e71d', + unicode_decimal: 59165, + }, + { + icon_id: '1444389', + name: 'dice-d4', + font_class: 'dice-d', + unicode: 'e81d', + unicode_decimal: 59421, + }, + { + icon_id: '1444646', + name: 'gas-cylinder', + font_class: 'gas-cylinder', + unicode: 'e91d', + unicode_decimal: 59677, + }, + { + icon_id: '1444902', + name: 'menu-up-outline', + font_class: 'menu-up-outline', + unicode: 'ea1d', + unicode_decimal: 59933, + }, + { + icon_id: '1445158', + name: 'quicktime', + font_class: 'quicktime', + unicode: 'eb1d', + unicode_decimal: 60189, + }, + { + icon_id: '1445414', + name: 'target', + font_class: 'target', + unicode: 'ec1d', + unicode_decimal: 60445, + }, + { + icon_id: '1441403', + name: 'air-conditioner', + font_class: 'air-conditioner', + unicode: 'e61e', + unicode_decimal: 58910, + }, + { + icon_id: '1444133', + name: 'calendar-text', + font_class: 'calendar-text', + unicode: 'e71e', + unicode_decimal: 59166, + }, + { + icon_id: '1444390', + name: 'dice-6', + font_class: 'dice-3', + unicode: 'e81e', + unicode_decimal: 59422, + }, + { + icon_id: '1444647', + name: 'gas-station', + font_class: 'gas-station', + unicode: 'e91e', + unicode_decimal: 59678, + }, + { + icon_id: '1444903', + name: 'message-alert', + font_class: 'message-alert', + unicode: 'ea1e', + unicode_decimal: 59934, + }, + { + icon_id: '1445159', + name: 'radar', + font_class: 'radar', + unicode: 'eb1e', + unicode_decimal: 60190, + }, + { + icon_id: '1445415', + name: 'teamviewer', + font_class: 'teamviewer', + unicode: 'ec1e', + unicode_decimal: 60446, + }, + { + icon_id: '1441450', + name: 'airballoon', + font_class: 'airballoon', + unicode: 'e61f', + unicode_decimal: 58911, + }, + { + icon_id: '1444134', + name: 'call-missed', + font_class: 'call-missed', + unicode: 'e71f', + unicode_decimal: 59167, + }, + { + icon_id: '1444391', + name: 'dice-d8', + font_class: 'dice-d1', + unicode: 'e81f', + unicode_decimal: 59423, + }, + { + icon_id: '1444648', + name: 'gate', + font_class: 'gate', + unicode: 'e91f', + unicode_decimal: 59679, + }, + { + icon_id: '1444904', + name: 'message-bulleted-off', + font_class: 'message-bulleted-off', + unicode: 'ea1f', + unicode_decimal: 59935, + }, + { + icon_id: '1445160', + name: 'radio', + font_class: 'radio', + unicode: 'eb1f', + unicode_decimal: 60191, + }, + { + icon_id: '1445416', + name: 'taxi', + font_class: 'taxi', + unicode: 'ec1f', + unicode_decimal: 60447, + }, + { + icon_id: '1441451', + name: 'airplane-landing', + font_class: 'airplane-landing', + unicode: 'e620', + unicode_decimal: 58912, + }, + { + icon_id: '1444135', + name: 'call-received', + font_class: 'call-received', + unicode: 'e720', + unicode_decimal: 59168, + }, + { + icon_id: '1444392', + name: 'dice-d6', + font_class: 'dice-d2', + unicode: 'e820', + unicode_decimal: 59424, + }, + { + icon_id: '1444649', + name: 'gauge', + font_class: 'gauge', + unicode: 'e920', + unicode_decimal: 59680, + }, + { + icon_id: '1444905', + name: 'message-draw', + font_class: 'message-draw', + unicode: 'ea20', + unicode_decimal: 59936, + }, + { + icon_id: '1445161', + name: 'radiator', + font_class: 'radiator', + unicode: 'eb20', + unicode_decimal: 60192, + }, + { + icon_id: '1445417', + name: 'telegram', + font_class: 'telegram', + unicode: 'ec20', + unicode_decimal: 60448, + }, + { + icon_id: '1441452', + name: 'airplane-off', + font_class: 'airplane-off', + unicode: 'e621', + unicode_decimal: 58913, + }, + { + icon_id: '1444136', + name: 'call-split', + font_class: 'call-split', + unicode: 'e721', + unicode_decimal: 59169, + }, + { + icon_id: '1444393', + name: 'dice-4', + font_class: 'dice-4', + unicode: 'e821', + unicode_decimal: 59425, + }, + { + icon_id: '1444650', + name: 'gavel', + font_class: 'gavel', + unicode: 'e921', + unicode_decimal: 59681, + }, + { + icon_id: '1444906', + name: 'message-image', + font_class: 'message-image', + unicode: 'ea21', + unicode_decimal: 59937, + }, + { + icon_id: '1445162', + name: 'radioactive', + font_class: 'radioactive', + unicode: 'eb21', + unicode_decimal: 60193, + }, + { + icon_id: '1445418', + name: 'television', + font_class: 'television', + unicode: 'ec21', + unicode_decimal: 60449, + }, + { + icon_id: '1441453', + name: 'airplay', + font_class: 'airplay', + unicode: 'e622', + unicode_decimal: 58914, + }, + { + icon_id: '1444137', + name: 'camcorder-box', + font_class: 'camcorder-box', + unicode: 'e722', + unicode_decimal: 59170, + }, + { + icon_id: '1444394', + name: 'dice-d20', + font_class: 'dice-d3', + unicode: 'e822', + unicode_decimal: 59426, + }, + { + icon_id: '1444651', + name: 'gender-female', + font_class: 'gender-female', + unicode: 'e922', + unicode_decimal: 59682, + }, + { + icon_id: '1444907', + name: 'message-outline', + font_class: 'message-outline', + unicode: 'ea22', + unicode_decimal: 59938, + }, + { + icon_id: '1445163', + name: 'radiobox-marked', + font_class: 'radiobox-marked', + unicode: 'eb22', + unicode_decimal: 60194, + }, + { + icon_id: '1445419', + name: 'television-guide', + font_class: 'television-guide', + unicode: 'ec22', + unicode_decimal: 60450, + }, + { + icon_id: '1441454', + name: 'airplane-takeoff', + font_class: 'airplane-takeoff', + unicode: 'e623', + unicode_decimal: 58915, + }, + { + icon_id: '1444138', + name: 'camcorder', + font_class: 'camcorder', + unicode: 'e723', + unicode_decimal: 59171, + }, + { + icon_id: '1444395', + name: 'dictionary', + font_class: 'dictionary', + unicode: 'e823', + unicode_decimal: 59427, + }, + { + icon_id: '1444652', + name: 'gender-male', + font_class: 'gender-male', + unicode: 'e923', + unicode_decimal: 59683, + }, + { + icon_id: '1444908', + name: 'message-processing', + font_class: 'message-processing', + unicode: 'ea23', + unicode_decimal: 59939, + }, + { + icon_id: '1445164', + name: 'radiobox-blank', + font_class: 'radiobox-blank', + unicode: 'eb23', + unicode_decimal: 60195, + }, + { + icon_id: '1445420', + name: 'temperature-celsius', + font_class: 'temperature-celsius', + unicode: 'ec23', + unicode_decimal: 60451, + }, + { + icon_id: '1441455', + name: 'airplane', + font_class: 'airplane', + unicode: 'e624', + unicode_decimal: 58916, + }, + { + icon_id: '1444139', + name: 'camcorder-box-off', + font_class: 'camcorder-box-off', + unicode: 'e724', + unicode_decimal: 59172, + }, + { + icon_id: '1444396', + name: 'dice-5', + font_class: 'dice-5', + unicode: 'e824', + unicode_decimal: 59428, + }, + { + icon_id: '1444653', + name: 'gender-male-female', + font_class: 'gender-male-female', + unicode: 'e924', + unicode_decimal: 59684, + }, + { + icon_id: '1444909', + name: 'message-reply', + font_class: 'message-reply', + unicode: 'ea24', + unicode_decimal: 59940, + }, + { + icon_id: '1445165', + name: 'radio-handheld', + font_class: 'radio-handheld', + unicode: 'eb24', + unicode_decimal: 60196, + }, + { + icon_id: '1445421', + name: 'temperature-kelvin', + font_class: 'temperature-kelvin', + unicode: 'ec24', + unicode_decimal: 60452, + }, + { + icon_id: '1441456', + name: 'alarm', + font_class: 'alarm', + unicode: 'e625', + unicode_decimal: 58917, + }, + { + icon_id: '1444140', + name: 'camcorder-off', + font_class: 'camcorder-off', + unicode: 'e725', + unicode_decimal: 59173, + }, + { + icon_id: '1444397', + name: 'directions-fork', + font_class: 'directions-fork', + unicode: 'e825', + unicode_decimal: 59429, + }, + { + icon_id: '1444654', + name: 'gender-transgender', + font_class: 'gender-transgender', + unicode: 'e925', + unicode_decimal: 59685, + }, + { + icon_id: '1444910', + name: 'message-plus', + font_class: 'message-plus', + unicode: 'ea25', + unicode_decimal: 59941, + }, + { + icon_id: '1445166', + name: 'radio-tower', + font_class: 'radio-tower', + unicode: 'eb25', + unicode_decimal: 60197, + }, + { + icon_id: '1445422', + name: 'temperature-fahrenheit', + font_class: 'temperature-fahrenheit', + unicode: 'ec25', + unicode_decimal: 60453, + }, + { + icon_id: '1441457', + name: 'alarm-check', + font_class: 'alarm-check', + unicode: 'e626', + unicode_decimal: 58918, + }, + { + icon_id: '1444141', + name: 'camera', + font_class: 'camera', + unicode: 'e726', + unicode_decimal: 59174, + }, + { + icon_id: '1444398', + name: 'directions', + font_class: 'directions', + unicode: 'e826', + unicode_decimal: 59430, + }, + { + icon_id: '1444655', + name: 'ghost', + font_class: 'ghost', + unicode: 'e926', + unicode_decimal: 59686, + }, + { + icon_id: '1444911', + name: 'message-reply-text', + font_class: 'message-reply-text', + unicode: 'ea26', + unicode_decimal: 59942, + }, + { + icon_id: '1445167', + name: 'raspberrypi', + font_class: 'raspberrypi', + unicode: 'eb26', + unicode_decimal: 60198, + }, + { + icon_id: '1445423', + name: 'tennis', + font_class: 'tennis', + unicode: 'ec26', + unicode_decimal: 60454, + }, + { + icon_id: '1441458', + name: 'alarm-multiple', + font_class: 'alarm-multiple', + unicode: 'e627', + unicode_decimal: 58919, + }, + { + icon_id: '1444142', + name: 'camera-enhance', + font_class: 'camera-enhance', + unicode: 'e727', + unicode_decimal: 59175, + }, + { + icon_id: '1444399', + name: 'discord', + font_class: 'discord', + unicode: 'e827', + unicode_decimal: 59431, + }, + { + icon_id: '1444656', + name: 'git', + font_class: 'git', + unicode: 'e927', + unicode_decimal: 59687, + }, + { + icon_id: '1444912', + name: 'message-text', + font_class: 'message-text', + unicode: 'ea27', + unicode_decimal: 59943, + }, + { + icon_id: '1445168', + name: 'ray-end', + font_class: 'ray-end', + unicode: 'eb27', + unicode_decimal: 60199, + }, + { + icon_id: '1445424', + name: 'tent', + font_class: 'tent', + unicode: 'ec27', + unicode_decimal: 60455, + }, + { + icon_id: '1441459', + name: 'alarm-snooze', + font_class: 'alarm-snooze', + unicode: 'e628', + unicode_decimal: 58920, + }, + { + icon_id: '1444143', + name: 'camera-burst', + font_class: 'camera-burst', + unicode: 'e728', + unicode_decimal: 59176, + }, + { + icon_id: '1444400', + name: 'disk', + font_class: 'disk', + unicode: 'e828', + unicode_decimal: 59432, + }, + { + icon_id: '1444657', + name: 'gift', + font_class: 'gift', + unicode: 'e928', + unicode_decimal: 59688, + }, + { + icon_id: '1444913', + name: 'message-text-outline', + font_class: 'message-text-outline', + unicode: 'ea28', + unicode_decimal: 59944, + }, + { + icon_id: '1445169', + name: 'ray-end-arrow', + font_class: 'ray-end-arrow', + unicode: 'eb28', + unicode_decimal: 60200, + }, + { + icon_id: '1445425', + name: 'terrain', + font_class: 'terrain', + unicode: 'ec28', + unicode_decimal: 60456, + }, + { + icon_id: '1441460', + name: 'alarm-off', + font_class: 'alarm-off', + unicode: 'e629', + unicode_decimal: 58921, + }, + { + icon_id: '1444144', + name: 'camera-front', + font_class: 'camera-front', + unicode: 'e729', + unicode_decimal: 59177, + }, + { + icon_id: '1444401', + name: 'disk-alert', + font_class: 'disk-alert', + unicode: 'e829', + unicode_decimal: 59433, + }, + { + icon_id: '1444658', + name: 'github-box', + font_class: 'github-box', + unicode: 'e929', + unicode_decimal: 59689, + }, + { + icon_id: '1444914', + name: 'message-video', + font_class: 'message-video', + unicode: 'ea29', + unicode_decimal: 59945, + }, + { + icon_id: '1445170', + name: 'ray-start', + font_class: 'ray-start', + unicode: 'eb29', + unicode_decimal: 60201, + }, + { + icon_id: '1445426', + name: 'test-tube', + font_class: 'test-tube', + unicode: 'ec29', + unicode_decimal: 60457, + }, + { + icon_id: '1441461', + name: 'alarm-plus', + font_class: 'alarm-plus', + unicode: 'e62a', + unicode_decimal: 58922, + }, + { + icon_id: '1444145', + name: 'camera-front-variant', + font_class: 'camera-front-variant', + unicode: 'e72a', + unicode_decimal: 59178, + }, + { + icon_id: '1444402', + name: 'disqus', + font_class: 'disqus', + unicode: 'e82a', + unicode_decimal: 59434, + }, + { + icon_id: '1444659', + name: 'github-circle', + font_class: 'github-circle', + unicode: 'e92a', + unicode_decimal: 59690, + }, + { + icon_id: '1444915', + name: 'meteor', + font_class: 'meteor', + unicode: 'ea2a', + unicode_decimal: 59946, + }, + { + icon_id: '1445171', + name: 'ray-start-arrow', + font_class: 'ray-start-arrow', + unicode: 'eb2a', + unicode_decimal: 60202, + }, + { + icon_id: '1445427', + name: 'text-shadow', + font_class: 'text-shadow', + unicode: 'ec2a', + unicode_decimal: 60458, + }, + { + icon_id: '1441462', + name: 'alert', + font_class: 'alert', + unicode: 'e62b', + unicode_decimal: 58923, + }, + { + icon_id: '1444146', + name: 'camera-iris', + font_class: 'camera-iris', + unicode: 'e72b', + unicode_decimal: 59179, + }, + { + icon_id: '1444403', + name: 'disqus-outline', + font_class: 'disqus-outline', + unicode: 'e82b', + unicode_decimal: 59435, + }, + { + icon_id: '1444660', + name: 'glass-stange', + font_class: 'glass-stange', + unicode: 'e92b', + unicode_decimal: 59691, + }, + { + icon_id: '1444916', + name: 'microphone', + font_class: 'microphone', + unicode: 'ea2b', + unicode_decimal: 59947, + }, + { + icon_id: '1445172', + name: 'ray-start-end', + font_class: 'ray-start-end', + unicode: 'eb2b', + unicode_decimal: 60203, + }, + { + icon_id: '1445428', + name: 'textbox', + font_class: 'textbox', + unicode: 'ec2b', + unicode_decimal: 60459, + }, + { + icon_id: '1441463', + name: 'alert-box', + font_class: 'alert-box', + unicode: 'e62c', + unicode_decimal: 58924, + }, + { + icon_id: '1444147', + name: 'camera-off', + font_class: 'camera-off', + unicode: 'e72c', + unicode_decimal: 59180, + }, + { + icon_id: '1444404', + name: 'division-box', + font_class: 'division-box', + unicode: 'e82c', + unicode_decimal: 59436, + }, + { + icon_id: '1444661', + name: 'glassdoor', + font_class: 'glassdoor', + unicode: 'e92c', + unicode_decimal: 59692, + }, + { + icon_id: '1444917', + name: 'microphone-off', + font_class: 'microphone-off', + unicode: 'ea2c', + unicode_decimal: 59948, + }, + { + icon_id: '1445173', + name: 'ray-vertex', + font_class: 'ray-vertex', + unicode: 'eb2c', + unicode_decimal: 60204, + }, + { + icon_id: '1445429', + name: 'text-to-speech', + font_class: 'text-to-speech', + unicode: 'ec2c', + unicode_decimal: 60460, + }, + { + icon_id: '1441537', + name: 'alert-circle', + font_class: 'alert-circle', + unicode: 'e62d', + unicode_decimal: 58925, + }, + { + icon_id: '1444148', + name: 'camera-party-mode', + font_class: 'camera-party-mode', + unicode: 'e72d', + unicode_decimal: 59181, + }, + { + icon_id: '1444405', + name: 'division', + font_class: 'division', + unicode: 'e82d', + unicode_decimal: 59437, + }, + { + icon_id: '1444662', + name: 'glasses', + font_class: 'glasses', + unicode: 'e92d', + unicode_decimal: 59693, + }, + { + icon_id: '1444918', + name: 'microphone-outline', + font_class: 'microphone-outline', + unicode: 'ea2d', + unicode_decimal: 59949, + }, + { + icon_id: '1445174', + name: 'rdio', + font_class: 'rdio', + unicode: 'eb2d', + unicode_decimal: 60205, + }, + { + icon_id: '1445430', + name: 'text-to-speech-off', + font_class: 'text-to-speech-off', + unicode: 'ec2d', + unicode_decimal: 60461, + }, + { + icon_id: '1441538', + name: 'alert-circle-outline', + font_class: 'alert-circle-outline', + unicode: 'e62e', + unicode_decimal: 58926, + }, + { + icon_id: '1444149', + name: 'camera-rear', + font_class: 'camera-rear', + unicode: 'e72e', + unicode_decimal: 59182, + }, + { + icon_id: '1444406', + name: 'dna', + font_class: 'dna', + unicode: 'e82e', + unicode_decimal: 59438, + }, + { + icon_id: '1444663', + name: 'glass-mug', + font_class: 'glass-mug', + unicode: 'e92e', + unicode_decimal: 59694, + }, + { + icon_id: '1444919', + name: 'microphone-settings', + font_class: 'microphone-settings', + unicode: 'ea2e', + unicode_decimal: 59950, + }, + { + icon_id: '1445175', + name: 'readability', + font_class: 'readability', + unicode: 'eb2e', + unicode_decimal: 60206, + }, + { + icon_id: '1445431', + name: 'texture', + font_class: 'texture', + unicode: 'ec2e', + unicode_decimal: 60462, + }, + { + icon_id: '1441539', + name: 'alert-octagon', + font_class: 'alert-octagon', + unicode: 'e62f', + unicode_decimal: 58927, + }, + { + icon_id: '1444150', + name: 'camera-rear-variant', + font_class: 'camera-rear-variant', + unicode: 'e72f', + unicode_decimal: 59183, + }, + { + icon_id: '1444407', + name: 'dns', + font_class: 'dns', + unicode: 'e82f', + unicode_decimal: 59439, + }, + { + icon_id: '1444664', + name: 'glass-flute', + font_class: 'glass-flute', + unicode: 'e92f', + unicode_decimal: 59695, + }, + { + icon_id: '1444920', + name: 'microphone-variant', + font_class: 'microphone-variant', + unicode: 'ea2f', + unicode_decimal: 59951, + }, + { + icon_id: '1445176', + name: 'receipt', + font_class: 'receipt', + unicode: 'eb2f', + unicode_decimal: 60207, + }, + { + icon_id: '1445432', + name: 'theater', + font_class: 'theater', + unicode: 'ec2f', + unicode_decimal: 60463, + }, + { + icon_id: '1441540', + name: 'all-inclusive', + font_class: 'all-inclusive', + unicode: 'e630', + unicode_decimal: 58928, + }, + { + icon_id: '1444151', + name: 'camera-switch', + font_class: 'camera-switch', + unicode: 'e730', + unicode_decimal: 59184, + }, + { + icon_id: '1444408', + name: 'dolby', + font_class: 'dolby', + unicode: 'e830', + unicode_decimal: 59440, + }, + { + icon_id: '1444665', + name: 'glass-tulip', + font_class: 'glass-tulip', + unicode: 'e930', + unicode_decimal: 59696, + }, + { + icon_id: '1444921', + name: 'microphone-variant-off', + font_class: 'microphone-variant-off', + unicode: 'ea30', + unicode_decimal: 59952, + }, + { + icon_id: '1445177', + name: 'read', + font_class: 'read', + unicode: 'eb30', + unicode_decimal: 60208, + }, + { + icon_id: '1445433', + name: 'theme-light-dark', + font_class: 'theme-light-dark', + unicode: 'ec30', + unicode_decimal: 60464, + }, + { + icon_id: '1441541', + name: 'alert-outline', + font_class: 'alert-outline', + unicode: 'e631', + unicode_decimal: 58929, + }, + { + icon_id: '1444152', + name: 'camera-timer', + font_class: 'camera-timer', + unicode: 'e731', + unicode_decimal: 59185, + }, + { + icon_id: '1444409', + name: 'do-not-disturb-off', + font_class: 'do-not-disturb-off', + unicode: 'e831', + unicode_decimal: 59441, + }, + { + icon_id: '1444666', + name: 'gnome', + font_class: 'gnome', + unicode: 'e931', + unicode_decimal: 59697, + }, + { + icon_id: '1444922', + name: 'microscope', + font_class: 'microscope', + unicode: 'ea31', + unicode_decimal: 59953, + }, + { + icon_id: '1445178', + name: 'recycle', + font_class: 'recycle', + unicode: 'eb31', + unicode_decimal: 60209, + }, + { + icon_id: '1445434', + name: 'thermometer-lines', + font_class: 'thermometer-lines', + unicode: 'ec31', + unicode_decimal: 60465, + }, + { + icon_id: '1441542', + name: 'alpha', + font_class: 'alpha', + unicode: 'e632', + unicode_decimal: 58930, + }, + { + icon_id: '1444153', + name: 'candle', + font_class: 'candle', + unicode: 'e732', + unicode_decimal: 59186, + }, + { + icon_id: '1444410', + name: 'do-not-disturb', + font_class: 'do-not-disturb', + unicode: 'e832', + unicode_decimal: 59442, + }, + { + icon_id: '1444667', + name: 'google', + font_class: 'google', + unicode: 'e932', + unicode_decimal: 59698, + }, + { + icon_id: '1444923', + name: 'minecraft', + font_class: 'minecraft', + unicode: 'ea32', + unicode_decimal: 59954, + }, + { + icon_id: '1445179', + name: 'record', + font_class: 'record', + unicode: 'eb32', + unicode_decimal: 60210, + }, + { + icon_id: '1445435', + name: 'thumb-down', + font_class: 'thumb-down', + unicode: 'ec32', + unicode_decimal: 60466, + }, + { + icon_id: '1441543', + name: 'alphabetical', + font_class: 'alphabetical', + unicode: 'e633', + unicode_decimal: 58931, + }, + { + icon_id: '1444154', + name: 'candycane', + font_class: 'candycane', + unicode: 'e733', + unicode_decimal: 59187, + }, + { + icon_id: '1444411', + name: 'domain', + font_class: 'domain', + unicode: 'e833', + unicode_decimal: 59443, + }, + { + icon_id: '1444668', + name: 'gondola', + font_class: 'gondola', + unicode: 'e933', + unicode_decimal: 59699, + }, + { + icon_id: '1444924', + name: 'microsoft', + font_class: 'microsoft', + unicode: 'ea33', + unicode_decimal: 59955, + }, + { + icon_id: '1445180', + name: 'record-rec', + font_class: 'record-rec', + unicode: 'eb33', + unicode_decimal: 60211, + }, + { + icon_id: '1445436', + name: 'thermometer', + font_class: 'thermometer', + unicode: 'ec33', + unicode_decimal: 60467, + }, + { + icon_id: '1441544', + name: 'altimeter', + font_class: 'altimeter', + unicode: 'e634', + unicode_decimal: 58932, + }, + { + icon_id: '1444155', + name: 'car', + font_class: 'car', + unicode: 'e734', + unicode_decimal: 59188, + }, + { + icon_id: '1444412', + name: 'dots-horizontal', + font_class: 'dots-horizontal', + unicode: 'e834', + unicode_decimal: 59444, + }, + { + icon_id: '1444669', + name: 'google-cardboard', + font_class: 'google-cardboard', + unicode: 'e934', + unicode_decimal: 59700, + }, + { + icon_id: '1444925', + name: 'minus', + font_class: 'minus', + unicode: 'ea34', + unicode_decimal: 59956, + }, + { + icon_id: '1445181', + name: 'redo', + font_class: 'redo', + unicode: 'eb34', + unicode_decimal: 60212, + }, + { + icon_id: '1445437', + name: 'thumbs-up-down', + font_class: 'thumbs-up-down', + unicode: 'ec34', + unicode_decimal: 60468, + }, + { + icon_id: '1441545', + name: 'amazon', + font_class: 'amazon', + unicode: 'e635', + unicode_decimal: 58933, + }, + { + icon_id: '1444156', + name: 'car-battery', + font_class: 'car-battery', + unicode: 'e735', + unicode_decimal: 59189, + }, + { + icon_id: '1444413', + name: 'dots-vertical', + font_class: 'dots-vertical', + unicode: 'e835', + unicode_decimal: 59445, + }, + { + icon_id: '1444670', + name: 'gmail', + font_class: 'gmail', + unicode: 'e935', + unicode_decimal: 59701, + }, + { + icon_id: '1444926', + name: 'minus-box', + font_class: 'minus-box', + unicode: 'ea35', + unicode_decimal: 59957, + }, + { + icon_id: '1445182', + name: 'redo-variant', + font_class: 'redo-variant', + unicode: 'eb35', + unicode_decimal: 60213, + }, + { + icon_id: '1445438', + name: 'thumb-down-outline', + font_class: 'thumb-down-outline', + unicode: 'ec35', + unicode_decimal: 60469, + }, + { + icon_id: '1441546', + name: 'amazon-clouddrive', + font_class: 'amazon-clouddrive', + unicode: 'e636', + unicode_decimal: 58934, + }, + { + icon_id: '1444157', + name: 'car-connected', + font_class: 'car-connected', + unicode: 'e736', + unicode_decimal: 59190, + }, + { + icon_id: '1444414', + name: 'douban', + font_class: 'douban', + unicode: 'e836', + unicode_decimal: 59446, + }, + { + icon_id: '1444671', + name: 'google-chrome', + font_class: 'google-chrome', + unicode: 'e936', + unicode_decimal: 59702, + }, + { + icon_id: '1444927', + name: 'minus-circle', + font_class: 'minus-circle', + unicode: 'ea36', + unicode_decimal: 59958, + }, + { + icon_id: '1445183', + name: 'reddit', + font_class: 'reddit', + unicode: 'eb36', + unicode_decimal: 60214, + }, + { + icon_id: '1445439', + name: 'thumb-up', + font_class: 'thumb-up', + unicode: 'ec36', + unicode_decimal: 60470, + }, + { + icon_id: '1441547', + name: 'amplifier', + font_class: 'amplifier', + unicode: 'e637', + unicode_decimal: 58935, + }, + { + icon_id: '1444158', + name: 'cards', + font_class: 'cards', + unicode: 'e737', + unicode_decimal: 59191, + }, + { + icon_id: '1444415', + name: 'drag', + font_class: 'drag', + unicode: 'e837', + unicode_decimal: 59447, + }, + { + icon_id: '1444672', + name: 'google-circles-communities', + font_class: 'google-circles-communities', + unicode: 'e937', + unicode_decimal: 59703, + }, + { + icon_id: '1444928', + name: 'minus-circle-outline', + font_class: 'minus-circle-outline', + unicode: 'ea37', + unicode_decimal: 59959, + }, + { + icon_id: '1445184', + name: 'refresh', + font_class: 'refresh', + unicode: 'eb37', + unicode_decimal: 60215, + }, + { + icon_id: '1445440', + name: 'thumb-up-outline', + font_class: 'thumb-up-outline', + unicode: 'ec37', + unicode_decimal: 60471, + }, + { + icon_id: '1441548', + name: 'ambulance', + font_class: 'ambulance', + unicode: 'e638', + unicode_decimal: 58936, + }, + { + icon_id: '1444159', + name: 'cards-outline', + font_class: 'cards-outline', + unicode: 'e738', + unicode_decimal: 59192, + }, + { + icon_id: '1444416', + name: 'download', + font_class: 'download', + unicode: 'e838', + unicode_decimal: 59448, + }, + { + icon_id: '1444673', + name: 'google-circles', + font_class: 'google-circles', + unicode: 'e938', + unicode_decimal: 59704, + }, + { + icon_id: '1444929', + name: 'minus-network', + font_class: 'minus-network', + unicode: 'ea38', + unicode_decimal: 59960, + }, + { + icon_id: '1445185', + name: 'regex', + font_class: 'regex', + unicode: 'eb38', + unicode_decimal: 60216, + }, + { + icon_id: '1445441', + name: 'ticket', + font_class: 'ticket', + unicode: 'ec38', + unicode_decimal: 60472, + }, + { + icon_id: '1441549', + name: 'android-debug-bridge', + font_class: 'android-debug-bridge', + unicode: 'e639', + unicode_decimal: 58937, + }, + { + icon_id: '1444160', + name: 'cards-variant', + font_class: 'cards-variant', + unicode: 'e739', + unicode_decimal: 59193, + }, + { + icon_id: '1444417', + name: 'drag-horizontal', + font_class: 'drag-horizontal', + unicode: 'e839', + unicode_decimal: 59449, + }, + { + icon_id: '1444674', + name: 'google-circles-group', + font_class: 'google-circles-group', + unicode: 'e939', + unicode_decimal: 59705, + }, + { + icon_id: '1444930', + name: 'mixcloud', + font_class: 'mixcloud', + unicode: 'ea39', + unicode_decimal: 59961, + }, + { + icon_id: '1445186', + name: 'relative-scale', + font_class: 'relative-scale', + unicode: 'eb39', + unicode_decimal: 60217, + }, + { + icon_id: '1445442', + name: 'ticket-account', + font_class: 'ticket-account', + unicode: 'ec39', + unicode_decimal: 60473, + }, + { + icon_id: '1441550', + name: 'anchor', + font_class: 'anchor', + unicode: 'e63a', + unicode_decimal: 58938, + }, + { + icon_id: '1444161', + name: 'cards-playing-outline', + font_class: 'cards-playing-outline', + unicode: 'e73a', + unicode_decimal: 59194, + }, + { + icon_id: '1444418', + name: 'drag-vertical', + font_class: 'drag-vertical', + unicode: 'e83a', + unicode_decimal: 59450, + }, + { + icon_id: '1444675', + name: 'google-circles-extended', + font_class: 'google-circles-extended', + unicode: 'e93a', + unicode_decimal: 59706, + }, + { + icon_id: '1444931', + name: 'monitor', + font_class: 'monitor', + unicode: 'ea3a', + unicode_decimal: 59962, + }, + { + icon_id: '1445187', + name: 'reload', + font_class: 'reload', + unicode: 'eb3a', + unicode_decimal: 60218, + }, + { + icon_id: '1445443', + name: 'ticket-confirmation', + font_class: 'ticket-confirmation', + unicode: 'ec3a', + unicode_decimal: 60474, + }, + { + icon_id: '1441551', + name: 'android', + font_class: 'android', + unicode: 'e63b', + unicode_decimal: 58939, + }, + { + icon_id: '1444162', + name: 'cart', + font_class: 'cart', + unicode: 'e73b', + unicode_decimal: 59195, + }, + { + icon_id: '1444419', + name: 'drawing', + font_class: 'drawing', + unicode: 'e83b', + unicode_decimal: 59451, + }, + { + icon_id: '1444676', + name: 'google-controller', + font_class: 'google-controller', + unicode: 'e93b', + unicode_decimal: 59707, + }, + { + icon_id: '1444932', + name: 'monitor-multiple', + font_class: 'monitor-multiple', + unicode: 'ea3b', + unicode_decimal: 59963, + }, + { + icon_id: '1445188', + name: 'remote', + font_class: 'remote', + unicode: 'eb3b', + unicode_decimal: 60219, + }, + { + icon_id: '1445444', + name: 'ticket-percent', + font_class: 'ticket-percent', + unicode: 'ec3b', + unicode_decimal: 60475, + }, + { + icon_id: '1441594', + name: 'angular', + font_class: 'angular', + unicode: 'e63c', + unicode_decimal: 58940, + }, + { + icon_id: '1444163', + name: 'carrot', + font_class: 'carrot', + unicode: 'e73c', + unicode_decimal: 59196, + }, + { + icon_id: '1444420', + name: 'drawing-box', + font_class: 'drawing-box', + unicode: 'e83c', + unicode_decimal: 59452, + }, + { + icon_id: '1444677', + name: 'google-drive', + font_class: 'google-drive', + unicode: 'e93c', + unicode_decimal: 59708, + }, + { + icon_id: '1444933', + name: 'motorbike', + font_class: 'motorbike', + unicode: 'ea3c', + unicode_decimal: 59964, + }, + { + icon_id: '1445189', + name: 'reorder-horizontal', + font_class: 'reorder-horizontal', + unicode: 'eb3c', + unicode_decimal: 60220, + }, + { + icon_id: '1445445', + name: 'tie', + font_class: 'tie', + unicode: 'ec3c', + unicode_decimal: 60476, + }, + { + icon_id: '1441595', + name: 'apple-ios', + font_class: 'apple-ios', + unicode: 'e63d', + unicode_decimal: 58941, + }, + { + icon_id: '1444164', + name: 'cart-off', + font_class: 'cart-off', + unicode: 'e73d', + unicode_decimal: 59197, + }, + { + icon_id: '1444421', + name: 'drone', + font_class: 'drone', + unicode: 'e83d', + unicode_decimal: 59453, + }, + { + icon_id: '1444678', + name: 'google-controller-off', + font_class: 'google-controller-off', + unicode: 'e93d', + unicode_decimal: 59709, + }, + { + icon_id: '1444934', + name: 'more', + font_class: 'more', + unicode: 'ea3d', + unicode_decimal: 59965, + }, + { + icon_id: '1445190', + name: 'rename-box', + font_class: 'rename-box', + unicode: 'eb3d', + unicode_decimal: 60221, + }, + { + icon_id: '1445446', + name: 'tilde', + font_class: 'tilde', + unicode: 'ec3d', + unicode_decimal: 60477, + }, + { + icon_id: '1441596', + name: 'apple-finder', + font_class: 'apple-finder', + unicode: 'e63e', + unicode_decimal: 58942, + }, + { + icon_id: '1444165', + name: 'cart-outline', + font_class: 'cart-outline', + unicode: 'e73e', + unicode_decimal: 59198, + }, + { + icon_id: '1444422', + name: 'dribbble', + font_class: 'dribbble', + unicode: 'e83e', + unicode_decimal: 59454, + }, + { + icon_id: '1444679', + name: 'google-earth', + font_class: 'google-earth', + unicode: 'e93e', + unicode_decimal: 59710, + }, + { + icon_id: '1444935', + name: 'mouse', + font_class: 'mouse', + unicode: 'ea3e', + unicode_decimal: 59966, + }, + { + icon_id: '1445191', + name: 'reorder-vertical', + font_class: 'reorder-vertical', + unicode: 'eb3e', + unicode_decimal: 60222, + }, + { + icon_id: '1445447', + name: 'timelapse', + font_class: 'timelapse', + unicode: 'ec3e', + unicode_decimal: 60478, + }, + { + icon_id: '1441597', + name: 'animation', + font_class: 'animation', + unicode: 'e63f', + unicode_decimal: 58943, + }, + { + icon_id: '1444166', + name: 'cart-plus', + font_class: 'cart-plus', + unicode: 'e73f', + unicode_decimal: 59199, + }, + { + icon_id: '1444423', + name: 'dribbble-box', + font_class: 'dribbble-box', + unicode: 'e83f', + unicode_decimal: 59455, + }, + { + icon_id: '1444680', + name: 'google-glass', + font_class: 'google-glass', + unicode: 'e93f', + unicode_decimal: 59711, + }, + { + icon_id: '1444936', + name: 'mouse-variant', + font_class: 'mouse-variant', + unicode: 'ea3f', + unicode_decimal: 59967, + }, + { + icon_id: '1445192', + name: 'repeat', + font_class: 'repeat', + unicode: 'eb3f', + unicode_decimal: 60223, + }, + { + icon_id: '1445448', + name: 'timer-3', + font_class: 'timer-', + unicode: 'ec3f', + unicode_decimal: 60479, + }, + { + icon_id: '1441598', + name: 'android-studio', + font_class: 'android-studio', + unicode: 'e640', + unicode_decimal: 58944, + }, + { + icon_id: '1444167', + name: 'car-wash', + font_class: 'car-wash', + unicode: 'e740', + unicode_decimal: 59200, + }, + { + icon_id: '1444424', + name: 'dropbox', + font_class: 'dropbox', + unicode: 'e840', + unicode_decimal: 59456, + }, + { + icon_id: '1444681', + name: 'google-keep', + font_class: 'google-keep', + unicode: 'e940', + unicode_decimal: 59712, + }, + { + icon_id: '1444937', + name: 'mouse-off', + font_class: 'mouse-off', + unicode: 'ea40', + unicode_decimal: 59968, + }, + { + icon_id: '1445193', + name: 'repeat-off', + font_class: 'repeat-off', + unicode: 'eb40', + unicode_decimal: 60224, + }, + { + icon_id: '1445449', + name: 'timer', + font_class: 'timer', + unicode: 'ec40', + unicode_decimal: 60480, + }, + { + icon_id: '1441599', + name: 'apple', + font_class: 'apple', + unicode: 'e641', + unicode_decimal: 58945, + }, + { + icon_id: '1444168', + name: 'case-sensitive-alt', + font_class: 'case-sensitive-alt', + unicode: 'e741', + unicode_decimal: 59201, + }, + { + icon_id: '1444425', + name: 'drupal', + font_class: 'drupal', + unicode: 'e841', + unicode_decimal: 59457, + }, + { + icon_id: '1444682', + name: 'google-maps', + font_class: 'google-maps', + unicode: 'e941', + unicode_decimal: 59713, + }, + { + icon_id: '1444938', + name: 'mouse-variant-off', + font_class: 'mouse-variant-off', + unicode: 'ea41', + unicode_decimal: 59969, + }, + { + icon_id: '1445194', + name: 'reply', + font_class: 'reply', + unicode: 'eb41', + unicode_decimal: 60225, + }, + { + icon_id: '1445450', + name: 'timer-10', + font_class: 'timer-1', + unicode: 'ec41', + unicode_decimal: 60481, + }, + { + icon_id: '1441600', + name: 'apple-keyboard-caps', + font_class: 'apple-keyboard-caps', + unicode: 'e642', + unicode_decimal: 58946, + }, + { + icon_id: '1444169', + name: 'cash', + font_class: 'cash', + unicode: 'e742', + unicode_decimal: 59202, + }, + { + icon_id: '1444426', + name: 'duck', + font_class: 'duck', + unicode: 'e842', + unicode_decimal: 59458, + }, + { + icon_id: '1444683', + name: 'google-nearby', + font_class: 'google-nearby', + unicode: 'e942', + unicode_decimal: 59714, + }, + { + icon_id: '1444939', + name: 'move-resize', + font_class: 'move-resize', + unicode: 'ea42', + unicode_decimal: 59970, + }, + { + icon_id: '1445195', + name: 'repeat-once', + font_class: 'repeat-once', + unicode: 'eb42', + unicode_decimal: 60226, + }, + { + icon_id: '1445451', + name: 'timer-off', + font_class: 'timer-off', + unicode: 'ec42', + unicode_decimal: 60482, + }, + { + icon_id: '1441601', + name: 'apple-keyboard-command', + font_class: 'apple-keyboard-command', + unicode: 'e643', + unicode_decimal: 58947, + }, + { + icon_id: '1444170', + name: 'cash-multiple', + font_class: 'cash-multiple', + unicode: 'e743', + unicode_decimal: 59203, + }, + { + icon_id: '1444427', + name: 'dumbbell', + font_class: 'dumbbell', + unicode: 'e843', + unicode_decimal: 59459, + }, + { + icon_id: '1444684', + name: 'google-pages', + font_class: 'google-pages', + unicode: 'e943', + unicode_decimal: 59715, + }, + { + icon_id: '1444940', + name: 'move-resize-variant', + font_class: 'move-resize-variant', + unicode: 'ea43', + unicode_decimal: 59971, + }, + { + icon_id: '1445196', + name: 'replay', + font_class: 'replay', + unicode: 'eb43', + unicode_decimal: 60227, + }, + { + icon_id: '1445452', + name: 'timer-sand', + font_class: 'timer-sand', + unicode: 'ec43', + unicode_decimal: 60483, + }, + { + icon_id: '1441602', + name: 'apple-keyboard-control', + font_class: 'apple-keyboard-control', + unicode: 'e644', + unicode_decimal: 58948, + }, + { + icon_id: '1444171', + name: 'cash-100', + font_class: 'cash-', + unicode: 'e744', + unicode_decimal: 59204, + }, + { + icon_id: '1444428', + name: 'earth-box', + font_class: 'earth-box', + unicode: 'e844', + unicode_decimal: 59460, + }, + { + icon_id: '1444685', + name: 'google-photos', + font_class: 'google-photos', + unicode: 'e944', + unicode_decimal: 59716, + }, + { + icon_id: '1444941', + name: 'movie', + font_class: 'movie', + unicode: 'ea44', + unicode_decimal: 59972, + }, + { + icon_id: '1445197', + name: 'reply-all', + font_class: 'reply-all', + unicode: 'eb44', + unicode_decimal: 60228, + }, + { + icon_id: '1445453', + name: 'timer-sand-empty', + font_class: 'timer-sand-empty', + unicode: 'ec44', + unicode_decimal: 60484, + }, + { + icon_id: '1441603', + name: 'apple-keyboard-shift', + font_class: 'apple-keyboard-shift', + unicode: 'e645', + unicode_decimal: 58949, + }, + { + icon_id: '1444172', + name: 'cash-usd', + font_class: 'cash-usd', + unicode: 'e745', + unicode_decimal: 59205, + }, + { + icon_id: '1444429', + name: 'earth', + font_class: 'earth', + unicode: 'e845', + unicode_decimal: 59461, + }, + { + icon_id: '1444686', + name: 'google-physical-web', + font_class: 'google-physical-web', + unicode: 'e945', + unicode_decimal: 59717, + }, + { + icon_id: '1444942', + name: 'multiplication', + font_class: 'multiplication', + unicode: 'ea45', + unicode_decimal: 59973, + }, + { + icon_id: '1445198', + name: 'reproduction', + font_class: 'reproduction', + unicode: 'eb45', + unicode_decimal: 60229, + }, + { + icon_id: '1445454', + name: 'toggle-switch', + font_class: 'toggle-switch', + unicode: 'ec45', + unicode_decimal: 60485, + }, + { + icon_id: '1441604', + name: 'apple-keyboard-option', + font_class: 'apple-keyboard-option', + unicode: 'e646', + unicode_decimal: 58950, + }, + { + icon_id: '1444173', + name: 'cast-connected', + font_class: 'cast-connected', + unicode: 'e746', + unicode_decimal: 59206, + }, + { + icon_id: '1444430', + name: 'earth-box-off', + font_class: 'earth-box-off', + unicode: 'e846', + unicode_decimal: 59462, + }, + { + icon_id: '1444687', + name: 'google-play', + font_class: 'google-play', + unicode: 'e946', + unicode_decimal: 59718, + }, + { + icon_id: '1444943', + name: 'music-box-outline', + font_class: 'music-box-outline', + unicode: 'ea46', + unicode_decimal: 59974, + }, + { + icon_id: '1445199', + name: 'rewind', + font_class: 'rewind', + unicode: 'eb46', + unicode_decimal: 60230, + }, + { + icon_id: '1445455', + name: 'timetable', + font_class: 'timetable', + unicode: 'ec46', + unicode_decimal: 60486, + }, + { + icon_id: '1441605', + name: 'apple-mobileme', + font_class: 'apple-mobileme', + unicode: 'e647', + unicode_decimal: 58951, + }, + { + icon_id: '1444174', + name: 'cast', + font_class: 'cast', + unicode: 'e747', + unicode_decimal: 59207, + }, + { + icon_id: '1444431', + name: 'edge', + font_class: 'edge', + unicode: 'e847', + unicode_decimal: 59463, + }, + { + icon_id: '1444688', + name: 'google-plus', + font_class: 'google-plus', + unicode: 'e947', + unicode_decimal: 59719, + }, + { + icon_id: '1444944', + name: 'multiplication-box', + font_class: 'multiplication-box', + unicode: 'ea47', + unicode_decimal: 59975, + }, + { + icon_id: '1445200', + name: 'resize-bottom-right', + font_class: 'resize-bottom-right', + unicode: 'eb47', + unicode_decimal: 60231, + }, + { + icon_id: '1445456', + name: 'toggle-switch-off', + font_class: 'toggle-switch-off', + unicode: 'ec47', + unicode_decimal: 60487, + }, + { + icon_id: '1441606', + name: 'apple-safari', + font_class: 'apple-safari', + unicode: 'e648', + unicode_decimal: 58952, + }, + { + icon_id: '1444175', + name: 'cellphone', + font_class: 'cellphone', + unicode: 'e748', + unicode_decimal: 59208, + }, + { + icon_id: '1444432', + name: 'elevation-decline', + font_class: 'elevation-decline', + unicode: 'e848', + unicode_decimal: 59464, + }, + { + icon_id: '1444689', + name: 'google-translate', + font_class: 'google-translate', + unicode: 'e948', + unicode_decimal: 59720, + }, + { + icon_id: '1444945', + name: 'music-box', + font_class: 'music-box', + unicode: 'ea48', + unicode_decimal: 59976, + }, + { + icon_id: '1445201', + name: 'responsive', + font_class: 'responsive', + unicode: 'eb48', + unicode_decimal: 60232, + }, + { + icon_id: '1445457', + name: 'tooltip', + font_class: 'tooltip', + unicode: 'ec48', + unicode_decimal: 60488, + }, + { + icon_id: '1441607', + name: 'appnet', + font_class: 'appnet', + unicode: 'e649', + unicode_decimal: 58953, + }, + { + icon_id: '1444176', + name: 'castle', + font_class: 'castle', + unicode: 'e749', + unicode_decimal: 59209, + }, + { + icon_id: '1444433', + name: 'eject', + font_class: 'eject', + unicode: 'e849', + unicode_decimal: 59465, + }, + { + icon_id: '1444690', + name: 'google-plus-box', + font_class: 'google-plus-box', + unicode: 'e949', + unicode_decimal: 59721, + }, + { + icon_id: '1444946', + name: 'music-circle', + font_class: 'music-circle', + unicode: 'ea49', + unicode_decimal: 59977, + }, + { + icon_id: '1445202', + name: 'restore', + font_class: 'restore', + unicode: 'eb49', + unicode_decimal: 60233, + }, + { + icon_id: '1445458', + name: 'tooltip-edit', + font_class: 'tooltip-edit', + unicode: 'ec49', + unicode_decimal: 60489, + }, + { + icon_id: '1441608', + name: 'application', + font_class: 'application', + unicode: 'e64a', + unicode_decimal: 58954, + }, + { + icon_id: '1444177', + name: 'cat', + font_class: 'cat', + unicode: 'e74a', + unicode_decimal: 59210, + }, + { + icon_id: '1444434', + name: 'earth-off', + font_class: 'earth-off', + unicode: 'e84a', + unicode_decimal: 59466, + }, + { + icon_id: '1444691', + name: 'google-wallet', + font_class: 'google-wallet', + unicode: 'e94a', + unicode_decimal: 59722, + }, + { + icon_id: '1444947', + name: 'music-note', + font_class: 'music-note', + unicode: 'ea4a', + unicode_decimal: 59978, + }, + { + icon_id: '1445203', + name: 'rewind-outline', + font_class: 'rewind-outline', + unicode: 'eb4a', + unicode_decimal: 60234, + }, + { + icon_id: '1445459', + name: 'tooltip-image', + font_class: 'tooltip-image', + unicode: 'ec4a', + unicode_decimal: 60490, + }, + { + icon_id: '1441682', + name: 'apps', + font_class: 'apps', + unicode: 'e64b', + unicode_decimal: 58955, + }, + { + icon_id: '1444178', + name: 'cellphone-android', + font_class: 'cellphone-android', + unicode: 'e74b', + unicode_decimal: 59211, + }, + { + icon_id: '1444435', + name: 'elevator', + font_class: 'elevator', + unicode: 'e84b', + unicode_decimal: 59467, + }, + { + icon_id: '1444692', + name: 'gradient', + font_class: 'gradient', + unicode: 'e94b', + unicode_decimal: 59723, + }, + { + icon_id: '1444948', + name: 'music-note-bluetooth', + font_class: 'music-note-bluetooth', + unicode: 'ea4b', + unicode_decimal: 59979, + }, + { + icon_id: '1445204', + name: 'rhombus', + font_class: 'rhombus', + unicode: 'eb4b', + unicode_decimal: 60235, + }, + { + icon_id: '1445460', + name: 'tooltip-outline', + font_class: 'tooltip-outline', + unicode: 'ec4b', + unicode_decimal: 60491, + }, + { + icon_id: '1441683', + name: 'arrange-send-to-back', + font_class: 'arrange-send-to-back', + unicode: 'e64c', + unicode_decimal: 58956, + }, + { + icon_id: '1444179', + name: 'cellphone-dock', + font_class: 'cellphone-dock', + unicode: 'e74c', + unicode_decimal: 59212, + }, + { + icon_id: '1444436', + name: 'elevation-rise', + font_class: 'elevation-rise', + unicode: 'e84c', + unicode_decimal: 59468, + }, + { + icon_id: '1444693', + name: 'grease-pencil', + font_class: 'grease-pencil', + unicode: 'e94c', + unicode_decimal: 59724, + }, + { + icon_id: '1444949', + name: 'music-note-bluetooth-off', + font_class: 'music-note-bluetooth-off', + unicode: 'ea4c', + unicode_decimal: 59980, + }, + { + icon_id: '1445205', + name: 'road', + font_class: 'road', + unicode: 'eb4c', + unicode_decimal: 60236, + }, + { + icon_id: '1445461', + name: 'tooltip-outline-plus', + font_class: 'tooltip-outline-plus', + unicode: 'ec4c', + unicode_decimal: 60492, + }, + { + icon_id: '1441684', + name: 'arrange-send-backward', + font_class: 'arrange-send-backward', + unicode: 'e64d', + unicode_decimal: 58957, + }, + { + icon_id: '1444180', + name: 'cellphone-iphone', + font_class: 'cellphone-iphone', + unicode: 'e74d', + unicode_decimal: 59213, + }, + { + icon_id: '1444437', + name: 'email', + font_class: 'email', + unicode: 'e84d', + unicode_decimal: 59469, + }, + { + icon_id: '1444694', + name: 'grid', + font_class: 'grid', + unicode: 'e94d', + unicode_decimal: 59725, + }, + { + icon_id: '1444950', + name: 'music-note-half', + font_class: 'music-note-half', + unicode: 'ea4d', + unicode_decimal: 59981, + }, + { + icon_id: '1445206', + name: 'ribbon', + font_class: 'ribbon', + unicode: 'eb4d', + unicode_decimal: 60237, + }, + { + icon_id: '1445462', + name: 'tooltip-text', + font_class: 'tooltip-text', + unicode: 'ec4d', + unicode_decimal: 60493, + }, + { + icon_id: '1441685', + name: 'arrange-bring-forward', + font_class: 'arrange-bring-forward', + unicode: 'e64e', + unicode_decimal: 58958, + }, + { + icon_id: '1444181', + name: 'cellphone-basic', + font_class: 'cellphone-basic', + unicode: 'e74e', + unicode_decimal: 59214, + }, + { + icon_id: '1444438', + name: 'email-open', + font_class: 'email-open', + unicode: 'e84e', + unicode_decimal: 59470, + }, + { + icon_id: '1444695', + name: 'guitar-electric', + font_class: 'guitar-electric', + unicode: 'e94e', + unicode_decimal: 59726, + }, + { + icon_id: '1444951', + name: 'music-note-eighth', + font_class: 'music-note-eighth', + unicode: 'ea4e', + unicode_decimal: 59982, + }, + { + icon_id: '1445207', + name: 'road-variant', + font_class: 'road-variant', + unicode: 'eb4e', + unicode_decimal: 60238, + }, + { + icon_id: '1445463', + name: 'tooth', + font_class: 'tooth', + unicode: 'ec4e', + unicode_decimal: 60494, + }, + { + icon_id: '1441686', + name: 'archive', + font_class: 'archive', + unicode: 'e64f', + unicode_decimal: 58959, + }, + { + icon_id: '1444182', + name: 'cellphone-link', + font_class: 'cellphone-link', + unicode: 'e74f', + unicode_decimal: 59215, + }, + { + icon_id: '1444439', + name: 'email-outline', + font_class: 'email-outline', + unicode: 'e84f', + unicode_decimal: 59471, + }, + { + icon_id: '1444696', + name: 'grid-off', + font_class: 'grid-off', + unicode: 'e94f', + unicode_decimal: 59727, + }, + { + icon_id: '1444952', + name: 'music-note-off', + font_class: 'music-note-off', + unicode: 'ea4f', + unicode_decimal: 59983, + }, + { + icon_id: '1445208', + name: 'rhombus-outline', + font_class: 'rhombus-outline', + unicode: 'eb4f', + unicode_decimal: 60239, + }, + { + icon_id: '1445464', + name: 'tor', + font_class: 'tor', + unicode: 'ec4f', + unicode_decimal: 60495, + }, + { + icon_id: '1441687', + name: 'arrange-bring-to-front', + font_class: 'arrange-bring-to-front', + unicode: 'e650', + unicode_decimal: 58960, + }, + { + icon_id: '1444183', + name: 'cellphone-link-off', + font_class: 'cellphone-link-off', + unicode: 'e750', + unicode_decimal: 59216, + }, + { + icon_id: '1444440', + name: 'email-open-outline', + font_class: 'email-open-outline', + unicode: 'e850', + unicode_decimal: 59472, + }, + { + icon_id: '1444697', + name: 'guitar-pick', + font_class: 'guitar-pick', + unicode: 'e950', + unicode_decimal: 59728, + }, + { + icon_id: '1444953', + name: 'music-note-quarter', + font_class: 'music-note-quarter', + unicode: 'ea50', + unicode_decimal: 59984, + }, + { + icon_id: '1445209', + name: 'robot', + font_class: 'robot', + unicode: 'eb50', + unicode_decimal: 60240, + }, + { + icon_id: '1445465', + name: 'tower-beach', + font_class: 'tower-beach', + unicode: 'ec50', + unicode_decimal: 60496, + }, + { + icon_id: '1441688', + name: 'arrow-all', + font_class: 'arrow-all', + unicode: 'e651', + unicode_decimal: 58961, + }, + { + icon_id: '1444184', + name: 'cellphone-settings', + font_class: 'cellphone-settings', + unicode: 'e751', + unicode_decimal: 59217, + }, + { + icon_id: '1444441', + name: 'email-variant', + font_class: 'email-variant', + unicode: 'e851', + unicode_decimal: 59473, + }, + { + icon_id: '1444698', + name: 'group', + font_class: 'group', + unicode: 'e951', + unicode_decimal: 59729, + }, + { + icon_id: '1444954', + name: 'music-note-sixteenth', + font_class: 'music-note-sixteenth', + unicode: 'ea51', + unicode_decimal: 59985, + }, + { + icon_id: '1445210', + name: 'rocket', + font_class: 'rocket', + unicode: 'eb51', + unicode_decimal: 60241, + }, + { + icon_id: '1445466', + name: 'train', + font_class: 'train', + unicode: 'ec51', + unicode_decimal: 60497, + }, + { + icon_id: '1441689', + name: 'arrow-bottom-right', + font_class: 'arrow-bottom-right', + unicode: 'e652', + unicode_decimal: 58962, + }, + { + icon_id: '1444185', + name: 'certificate', + font_class: 'certificate', + unicode: 'e752', + unicode_decimal: 59218, + }, + { + icon_id: '1444442', + name: 'email-secure', + font_class: 'email-secure', + unicode: 'e852', + unicode_decimal: 59474, + }, + { + icon_id: '1444699', + name: 'guitar-pick-outline', + font_class: 'guitar-pick-outline', + unicode: 'e952', + unicode_decimal: 59730, + }, + { + icon_id: '1444955', + name: 'music-note-whole', + font_class: 'music-note-whole', + unicode: 'ea52', + unicode_decimal: 59986, + }, + { + icon_id: '1445211', + name: 'roomba', + font_class: 'roomba', + unicode: 'eb52', + unicode_decimal: 60242, + }, + { + icon_id: '1445467', + name: 'tower-fire', + font_class: 'tower-fire', + unicode: 'ec52', + unicode_decimal: 60498, + }, + { + icon_id: '1441690', + name: 'arrow-bottom-left', + font_class: 'arrow-bottom-left', + unicode: 'e653', + unicode_decimal: 58963, + }, + { + icon_id: '1444186', + name: 'chair-school', + font_class: 'chair-school', + unicode: 'e753', + unicode_decimal: 59219, + }, + { + icon_id: '1444443', + name: 'emoticon', + font_class: 'emoticon', + unicode: 'e853', + unicode_decimal: 59475, + }, + { + icon_id: '1444700', + name: 'hackernews', + font_class: 'hackernews', + unicode: 'e953', + unicode_decimal: 59731, + }, + { + icon_id: '1444956', + name: 'nature', + font_class: 'nature', + unicode: 'ea53', + unicode_decimal: 59987, + }, + { + icon_id: '1445212', + name: 'rotate-3d', + font_class: 'rotate-d', + unicode: 'eb53', + unicode_decimal: 60243, + }, + { + icon_id: '1445468', + name: 'traffic-light', + font_class: 'traffic-light', + unicode: 'ec53', + unicode_decimal: 60499, + }, + { + icon_id: '1441691', + name: 'arrow-compress', + font_class: 'arrow-compress', + unicode: 'e654', + unicode_decimal: 58964, + }, + { + icon_id: '1444187', + name: 'chart-arc', + font_class: 'chart-arc', + unicode: 'e754', + unicode_decimal: 59220, + }, + { + icon_id: '1444444', + name: 'emby', + font_class: 'emby', + unicode: 'e854', + unicode_decimal: 59476, + }, + { + icon_id: '1444701', + name: 'hand-pointing-right', + font_class: 'hand-pointing-right', + unicode: 'e954', + unicode_decimal: 59732, + }, + { + icon_id: '1444957', + name: 'nature-people', + font_class: 'nature-people', + unicode: 'ea54', + unicode_decimal: 59988, + }, + { + icon_id: '1445213', + name: 'rotate-left', + font_class: 'rotate-left', + unicode: 'eb54', + unicode_decimal: 60244, + }, + { + icon_id: '1445470', + name: 'transfer', + font_class: 'transfer', + unicode: 'ec54', + unicode_decimal: 60500, + }, + { + icon_id: '1441692', + name: 'arrow-compress-all', + font_class: 'arrow-compress-all', + unicode: 'e655', + unicode_decimal: 58965, + }, + { + icon_id: '1444188', + name: 'chart-areaspline', + font_class: 'chart-areaspline', + unicode: 'e755', + unicode_decimal: 59221, + }, + { + icon_id: '1444445', + name: 'emoticon-dead', + font_class: 'emoticon-dead', + unicode: 'e855', + unicode_decimal: 59477, + }, + { + icon_id: '1444702', + name: 'hamburger', + font_class: 'hamburger', + unicode: 'e955', + unicode_decimal: 59733, + }, + { + icon_id: '1444958', + name: 'needle', + font_class: 'needle', + unicode: 'ea55', + unicode_decimal: 59989, + }, + { + icon_id: '1445214', + name: 'rotate-90', + font_class: 'rotate-', + unicode: 'eb55', + unicode_decimal: 60245, + }, + { + icon_id: '1445471', + name: 'transcribe-close', + font_class: 'transcribe-close', + unicode: 'ec55', + unicode_decimal: 60501, + }, + { + icon_id: '1441693', + name: 'arrow-down', + font_class: 'arrow-down', + unicode: 'e656', + unicode_decimal: 58966, + }, + { + icon_id: '1444189', + name: 'chart-bar', + font_class: 'chart-bar', + unicode: 'e756', + unicode_decimal: 59222, + }, + { + icon_id: '1444446', + name: 'emoticon-cool', + font_class: 'emoticon-cool', + unicode: 'e856', + unicode_decimal: 59478, + }, + { + icon_id: '1444703', + name: 'hangouts', + font_class: 'hangouts', + unicode: 'e956', + unicode_decimal: 59734, + }, + { + icon_id: '1444959', + name: 'navigation', + font_class: 'navigation', + unicode: 'ea56', + unicode_decimal: 59990, + }, + { + icon_id: '1445215', + name: 'rotate-right', + font_class: 'rotate-right', + unicode: 'eb56', + unicode_decimal: 60246, + }, + { + icon_id: '1445472', + name: 'transcribe', + font_class: 'transcribe', + unicode: 'ec56', + unicode_decimal: 60502, + }, + { + icon_id: '1441694', + name: 'arrow-down-bold', + font_class: 'arrow-down-bold', + unicode: 'e657', + unicode_decimal: 58967, + }, + { + icon_id: '1444190', + name: 'chart-bubble', + font_class: 'chart-bubble', + unicode: 'e757', + unicode_decimal: 59223, + }, + { + icon_id: '1444447', + name: 'emoticon-devil', + font_class: 'emoticon-devil', + unicode: 'e857', + unicode_decimal: 59479, + }, + { + icon_id: '1444704', + name: 'harddisk', + font_class: 'harddisk', + unicode: 'e957', + unicode_decimal: 59735, + }, + { + icon_id: '1444960', + name: 'near-me', + font_class: 'near-me', + unicode: 'ea57', + unicode_decimal: 59991, + }, + { + icon_id: '1445216', + name: 'rotate-left-variant', + font_class: 'rotate-left-variant', + unicode: 'eb57', + unicode_decimal: 60247, + }, + { + icon_id: '1445473', + name: 'translate', + font_class: 'translate', + unicode: 'ec57', + unicode_decimal: 60503, + }, + { + icon_id: '1441695', + name: 'arrow-down-bold-circle-outline', + font_class: 'arrow-down-bold-circle-outline', + unicode: 'e658', + unicode_decimal: 58968, + }, + { + icon_id: '1444191', + name: 'chart-histogram', + font_class: 'chart-histogram', + unicode: 'e758', + unicode_decimal: 59224, + }, + { + icon_id: '1444448', + name: 'emoticon-excited', + font_class: 'emoticon-excited', + unicode: 'e858', + unicode_decimal: 59480, + }, + { + icon_id: '1444705', + name: 'headphones', + font_class: 'headphones', + unicode: 'e958', + unicode_decimal: 59736, + }, + { + icon_id: '1444961', + name: 'nest-protect', + font_class: 'nest-protect', + unicode: 'ea58', + unicode_decimal: 59992, + }, + { + icon_id: '1445217', + name: 'rotate-right-variant', + font_class: 'rotate-right-variant', + unicode: 'eb58', + unicode_decimal: 60248, + }, + { + icon_id: '1445474', + name: 'transit-transfer', + font_class: 'transit-transfer', + unicode: 'ec58', + unicode_decimal: 60504, + }, + { + icon_id: '1441696', + name: 'arrow-down-bold-circle', + font_class: 'arrow-down-bold-circle', + unicode: 'e659', + unicode_decimal: 58969, + }, + { + icon_id: '1444192', + name: 'chart-line', + font_class: 'chart-line', + unicode: 'e759', + unicode_decimal: 59225, + }, + { + icon_id: '1444449', + name: 'emoticon-happy', + font_class: 'emoticon-happy', + unicode: 'e859', + unicode_decimal: 59481, + }, + { + icon_id: '1444706', + name: 'headphones-box', + font_class: 'headphones-box', + unicode: 'e959', + unicode_decimal: 59737, + }, + { + icon_id: '1444962', + name: 'nest-thermostat', + font_class: 'nest-thermostat', + unicode: 'ea59', + unicode_decimal: 59993, + }, + { + icon_id: '1445218', + name: 'rounded-corner', + font_class: 'rounded-corner', + unicode: 'eb59', + unicode_decimal: 60249, + }, + { + icon_id: '1445475', + name: 'tram', + font_class: 'tram', + unicode: 'ec59', + unicode_decimal: 60505, + }, + { + icon_id: '1441759', + name: 'arrow-down-box', + font_class: 'arrow-down-box', + unicode: 'e65a', + unicode_decimal: 58970, + }, + { + icon_id: '1444193', + name: 'chart-pie', + font_class: 'chart-pie', + unicode: 'e75a', + unicode_decimal: 59226, + }, + { + icon_id: '1444450', + name: 'emoticon-neutral', + font_class: 'emoticon-neutral', + unicode: 'e85a', + unicode_decimal: 59482, + }, + { + icon_id: '1444707', + name: 'headphones-settings', + font_class: 'headphones-settings', + unicode: 'e95a', + unicode_decimal: 59738, + }, + { + icon_id: '1444963', + name: 'new-box', + font_class: 'new-box', + unicode: 'ea5a', + unicode_decimal: 59994, + }, + { + icon_id: '1445219', + name: 'routes', + font_class: 'routes', + unicode: 'eb5a', + unicode_decimal: 60250, + }, + { + icon_id: '1445476', + name: 'tree', + font_class: 'tree', + unicode: 'ec5a', + unicode_decimal: 60506, + }, + { + icon_id: '1441760', + name: 'arrow-down-drop-circle-outline', + font_class: 'arrow-down-drop-circle-outline', + unicode: 'e65b', + unicode_decimal: 58971, + }, + { + icon_id: '1444194', + name: 'chart-gantt', + font_class: 'chart-gantt', + unicode: 'e75b', + unicode_decimal: 59227, + }, + { + icon_id: '1444451', + name: 'emoticon-sad', + font_class: 'emoticon-sad', + unicode: 'e85b', + unicode_decimal: 59483, + }, + { + icon_id: '1444708', + name: 'headset', + font_class: 'headset', + unicode: 'e95b', + unicode_decimal: 59739, + }, + { + icon_id: '1444964', + name: 'newspaper', + font_class: 'newspaper', + unicode: 'ea5b', + unicode_decimal: 59995, + }, + { + icon_id: '1445220', + name: 'router-wireless', + font_class: 'router-wireless', + unicode: 'eb5b', + unicode_decimal: 60251, + }, + { + icon_id: '1445477', + name: 'treasure-chest', + font_class: 'treasure-chest', + unicode: 'ec5b', + unicode_decimal: 60507, + }, + { + icon_id: '1441761', + name: 'arrow-expand', + font_class: 'arrow-expand', + unicode: 'e65c', + unicode_decimal: 58972, + }, + { + icon_id: '1444195', + name: 'chart-scatterplot-hexbin', + font_class: 'chart-scatterplot-hexbin', + unicode: 'e75c', + unicode_decimal: 59228, + }, + { + icon_id: '1444452', + name: 'emoticon-poop', + font_class: 'emoticon-poop', + unicode: 'e85c', + unicode_decimal: 59484, + }, + { + icon_id: '1444709', + name: 'hanger', + font_class: 'hanger', + unicode: 'e95c', + unicode_decimal: 59740, + }, + { + icon_id: '1444965', + name: 'nfc', + font_class: 'nfc', + unicode: 'ea5c', + unicode_decimal: 59996, + }, + { + icon_id: '1445221', + name: 'rowing', + font_class: 'rowing', + unicode: 'eb5c', + unicode_decimal: 60252, + }, + { + icon_id: '1445478', + name: 'trending-up', + font_class: 'trending-up', + unicode: 'ec5c', + unicode_decimal: 60508, + }, + { + icon_id: '1441762', + name: 'arrow-down-drop-circle', + font_class: 'arrow-down-drop-circle', + unicode: 'e65d', + unicode_decimal: 58973, + }, + { + icon_id: '1444196', + name: 'chart-timeline', + font_class: 'chart-timeline', + unicode: 'e75d', + unicode_decimal: 59229, + }, + { + icon_id: '1444453', + name: 'emoticon-tongue', + font_class: 'emoticon-tongue', + unicode: 'e85d', + unicode_decimal: 59485, + }, + { + icon_id: '1444710', + name: 'headset-dock', + font_class: 'headset-dock', + unicode: 'e95d', + unicode_decimal: 59741, + }, + { + icon_id: '1444966', + name: 'nfc-variant', + font_class: 'nfc-variant', + unicode: 'ea5d', + unicode_decimal: 59997, + }, + { + icon_id: '1445222', + name: 'rss', + font_class: 'rss', + unicode: 'eb5d', + unicode_decimal: 60253, + }, + { + icon_id: '1445479', + name: 'trending-neutral', + font_class: 'trending-neutral', + unicode: 'ec5d', + unicode_decimal: 60509, + }, + { + icon_id: '1441763', + name: 'arrow-down-bold-hexagon-outline', + font_class: 'arrow-down-bold-hexagon-outline', + unicode: 'e65e', + unicode_decimal: 58974, + }, + { + icon_id: '1444197', + name: 'check', + font_class: 'check', + unicode: 'e75e', + unicode_decimal: 59230, + }, + { + icon_id: '1444454', + name: 'engine', + font_class: 'engine', + unicode: 'e85e', + unicode_decimal: 59486, + }, + { + icon_id: '1444711', + name: 'headset-off', + font_class: 'headset-off', + unicode: 'e95e', + unicode_decimal: 59742, + }, + { + icon_id: '1444967', + name: 'nodejs', + font_class: 'nodejs', + unicode: 'ea5e', + unicode_decimal: 59998, + }, + { + icon_id: '1445223', + name: 'rss-box', + font_class: 'rss-box', + unicode: 'eb5e', + unicode_decimal: 60254, + }, + { + icon_id: '1445480', + name: 'trello', + font_class: 'trello', + unicode: 'ec5e', + unicode_decimal: 60510, + }, + { + icon_id: '1441764', + name: 'arrow-expand-all', + font_class: 'arrow-expand-all', + unicode: 'e65f', + unicode_decimal: 58975, + }, + { + icon_id: '1444198', + name: 'check-all', + font_class: 'check-all', + unicode: 'e75f', + unicode_decimal: 59231, + }, + { + icon_id: '1444455', + name: 'engine-outline', + font_class: 'engine-outline', + unicode: 'e85f', + unicode_decimal: 59487, + }, + { + icon_id: '1444712', + name: 'heart', + font_class: 'heart', + unicode: 'e95f', + unicode_decimal: 59743, + }, + { + icon_id: '1444968', + name: 'note', + font_class: 'note', + unicode: 'ea5f', + unicode_decimal: 59999, + }, + { + icon_id: '1445224', + name: 'ruler', + font_class: 'ruler', + unicode: 'eb5f', + unicode_decimal: 60255, + }, + { + icon_id: '1445481', + name: 'trending-down', + font_class: 'trending-down', + unicode: 'ec5f', + unicode_decimal: 60511, + }, + { + icon_id: '1441765', + name: 'arrow-left', + font_class: 'arrow-left', + unicode: 'e660', + unicode_decimal: 58976, + }, + { + icon_id: '1444199', + name: 'checkbox-blank', + font_class: 'checkbox-blank', + unicode: 'e760', + unicode_decimal: 59232, + }, + { + icon_id: '1444456', + name: 'equal', + font_class: 'equal', + unicode: 'e860', + unicode_decimal: 59488, + }, + { + icon_id: '1444713', + name: 'heart-box-outline', + font_class: 'heart-box-outline', + unicode: 'e960', + unicode_decimal: 59744, + }, + { + icon_id: '1444969', + name: 'nfc-tap', + font_class: 'nfc-tap', + unicode: 'ea60', + unicode_decimal: 60000, + }, + { + icon_id: '1445225', + name: 'sale', + font_class: 'sale', + unicode: 'eb60', + unicode_decimal: 60256, + }, + { + icon_id: '1445482', + name: 'triangle', + font_class: 'triangle', + unicode: 'ec60', + unicode_decimal: 60512, + }, + { + icon_id: '1441766', + name: 'arrow-left-bold', + font_class: 'arrow-left-bold', + unicode: 'e661', + unicode_decimal: 58977, + }, + { + icon_id: '1444200', + name: 'checkbox-blank-circle', + font_class: 'checkbox-blank-circle', + unicode: 'e761', + unicode_decimal: 59233, + }, + { + icon_id: '1444457', + name: 'eraser', + font_class: 'eraser', + unicode: 'e861', + unicode_decimal: 59489, + }, + { + icon_id: '1444714', + name: 'heart-broken', + font_class: 'heart-broken', + unicode: 'e961', + unicode_decimal: 59745, + }, + { + icon_id: '1444970', + name: 'note-multiple', + font_class: 'note-multiple', + unicode: 'ea61', + unicode_decimal: 60001, + }, + { + icon_id: '1445226', + name: 'run', + font_class: 'run', + unicode: 'eb61', + unicode_decimal: 60257, + }, + { + icon_id: '1445483', + name: 'triangle-outline', + font_class: 'triangle-outline', + unicode: 'ec61', + unicode_decimal: 60513, + }, + { + icon_id: '1441767', + name: 'arrow-left-bold-circle', + font_class: 'arrow-left-bold-circle', + unicode: 'e662', + unicode_decimal: 58978, + }, + { + icon_id: '1444201', + name: 'checkbox-blank-circle-outline', + font_class: 'checkbox-blank-circle-outline', + unicode: 'e762', + unicode_decimal: 59234, + }, + { + icon_id: '1444458', + name: 'eraser-variant', + font_class: 'eraser-variant', + unicode: 'e862', + unicode_decimal: 59490, + }, + { + icon_id: '1444715', + name: 'heart-box', + font_class: 'heart-box', + unicode: 'e962', + unicode_decimal: 59746, + }, + { + icon_id: '1444971', + name: 'note-multiple-outline', + font_class: 'note-multiple-outline', + unicode: 'ea62', + unicode_decimal: 60002, + }, + { + icon_id: '1445227', + name: 'satellite', + font_class: 'satellite', + unicode: 'eb62', + unicode_decimal: 60258, + }, + { + icon_id: '1445484', + name: 'trophy-award', + font_class: 'trophy-award', + unicode: 'ec62', + unicode_decimal: 60514, + }, + { + icon_id: '1441768', + name: 'arrow-left-bold-circle-outline', + font_class: 'arrow-left-bold-circle-outline', + unicode: 'e663', + unicode_decimal: 58979, + }, + { + icon_id: '1444202', + name: 'checkbox-blank-outline', + font_class: 'checkbox-blank-outline', + unicode: 'e763', + unicode_decimal: 59235, + }, + { + icon_id: '1444459', + name: 'equal-box', + font_class: 'equal-box', + unicode: 'e863', + unicode_decimal: 59491, + }, + { + icon_id: '1444716', + name: 'heart-half-outline', + font_class: 'heart-half-outline', + unicode: 'e963', + unicode_decimal: 59747, + }, + { + icon_id: '1444972', + name: 'note-outline', + font_class: 'note-outline', + unicode: 'ea63', + unicode_decimal: 60003, + }, + { + icon_id: '1445228', + name: 'satellite-variant', + font_class: 'satellite-variant', + unicode: 'eb63', + unicode_decimal: 60259, + }, + { + icon_id: '1445485', + name: 'trophy-outline', + font_class: 'trophy-outline', + unicode: 'ec63', + unicode_decimal: 60515, + }, + { + icon_id: '1441769', + name: 'arrow-left-bold-hexagon-outline', + font_class: 'arrow-left-bold-hexagon-outline', + unicode: 'e664', + unicode_decimal: 58980, + }, + { + icon_id: '1444203', + name: 'checkbox-marked-circle', + font_class: 'checkbox-marked-circle', + unicode: 'e764', + unicode_decimal: 59236, + }, + { + icon_id: '1444460', + name: 'escalator', + font_class: 'escalator', + unicode: 'e864', + unicode_decimal: 59492, + }, + { + icon_id: '1444717', + name: 'heart-half-part', + font_class: 'heart-half-part', + unicode: 'e964', + unicode_decimal: 59748, + }, + { + icon_id: '1444973', + name: 'note-plus', + font_class: 'note-plus', + unicode: 'ea64', + unicode_decimal: 60004, + }, + { + icon_id: '1445229', + name: 'saxophone', + font_class: 'saxophone', + unicode: 'eb64', + unicode_decimal: 60260, + }, + { + icon_id: '1445486', + name: 'trophy', + font_class: 'trophy', + unicode: 'ec64', + unicode_decimal: 60516, + }, + { + icon_id: '1441770', + name: 'arrow-left-box', + font_class: 'arrow-left-box', + unicode: 'e665', + unicode_decimal: 58981, + }, + { + icon_id: '1444204', + name: 'checkbox-marked-circle-outline', + font_class: 'checkbox-marked-circle-outline', + unicode: 'e765', + unicode_decimal: 59237, + }, + { + icon_id: '1444461', + name: 'ethernet-cable', + font_class: 'ethernet-cable', + unicode: 'e865', + unicode_decimal: 59493, + }, + { + icon_id: '1444718', + name: 'heart-half-part-outline', + font_class: 'heart-half-part-outline', + unicode: 'e965', + unicode_decimal: 59749, + }, + { + icon_id: '1444974', + name: 'note-text', + font_class: 'note-text', + unicode: 'ea65', + unicode_decimal: 60005, + }, + { + icon_id: '1445230', + name: 'scale', + font_class: 'scale', + unicode: 'eb65', + unicode_decimal: 60261, + }, + { + icon_id: '1445487', + name: 'trophy-variant', + font_class: 'trophy-variant', + unicode: 'ec65', + unicode_decimal: 60517, + }, + { + icon_id: '1441771', + name: 'arrow-left-drop-circle', + font_class: 'arrow-left-drop-circle', + unicode: 'e666', + unicode_decimal: 58982, + }, + { + icon_id: '1444205', + name: 'checkbox-marked-outline', + font_class: 'checkbox-marked-outline', + unicode: 'e766', + unicode_decimal: 59238, + }, + { + icon_id: '1444462', + name: 'ethernet', + font_class: 'ethernet', + unicode: 'e866', + unicode_decimal: 59494, + }, + { + icon_id: '1444719', + name: 'help', + font_class: 'help', + unicode: 'e966', + unicode_decimal: 59750, + }, + { + icon_id: '1444975', + name: 'note-plus-outline', + font_class: 'note-plus-outline', + unicode: 'ea66', + unicode_decimal: 60006, + }, + { + icon_id: '1445231', + name: 'scale-balance', + font_class: 'scale-balance', + unicode: 'eb66', + unicode_decimal: 60262, + }, + { + icon_id: '1445488', + name: 'trophy-variant-outline', + font_class: 'trophy-variant-outline', + unicode: 'ec66', + unicode_decimal: 60518, + }, + { + icon_id: '1441772', + name: 'arrow-left-drop-circle-outline', + font_class: 'arrow-left-drop-circle-outline', + unicode: 'e667', + unicode_decimal: 58983, + }, + { + icon_id: '1444206', + name: 'checkbox-marked', + font_class: 'checkbox-marked', + unicode: 'e767', + unicode_decimal: 59239, + }, + { + icon_id: '1444463', + name: 'ethernet-cable-off', + font_class: 'ethernet-cable-off', + unicode: 'e867', + unicode_decimal: 59495, + }, + { + icon_id: '1444720', + name: 'heart-outline', + font_class: 'heart-outline', + unicode: 'e967', + unicode_decimal: 59751, + }, + { + icon_id: '1444976', + name: 'notification-clear-all', + font_class: 'notification-clear-all', + unicode: 'ea67', + unicode_decimal: 60007, + }, + { + icon_id: '1445232', + name: 'scale-bathroom', + font_class: 'scale-bathroom', + unicode: 'eb67', + unicode_decimal: 60263, + }, + { + icon_id: '1445489', + name: 'truck-delivery', + font_class: 'truck-delivery', + unicode: 'ec67', + unicode_decimal: 60519, + }, + { + icon_id: '1441773', + name: 'arrow-right', + font_class: 'arrow-right', + unicode: 'e668', + unicode_decimal: 58984, + }, + { + icon_id: '1444207', + name: 'checkbox-multiple-blank-circle', + font_class: 'checkbox-multiple-blank-circle', + unicode: 'e768', + unicode_decimal: 59240, + }, + { + icon_id: '1444464', + name: 'etsy', + font_class: 'etsy', + unicode: 'e868', + unicode_decimal: 59496, + }, + { + icon_id: '1444721', + name: 'heart-pulse', + font_class: 'heart-pulse', + unicode: 'e968', + unicode_decimal: 59752, + }, + { + icon_id: '1444977', + name: 'npm', + font_class: 'npm', + unicode: 'ea68', + unicode_decimal: 60008, + }, + { + icon_id: '1445233', + name: 'scanner', + font_class: 'scanner', + unicode: 'eb68', + unicode_decimal: 60264, + }, + { + icon_id: '1445490', + name: 'truck-trailer', + font_class: 'truck-trailer', + unicode: 'ec68', + unicode_decimal: 60520, + }, + { + icon_id: '1443404', + name: 'arrow-right-bold-circle', + font_class: 'arrow-right-bold-circle', + unicode: 'e669', + unicode_decimal: 58985, + }, + { + icon_id: '1444208', + name: 'checkbox-multiple-blank', + font_class: 'checkbox-multiple-blank', + unicode: 'e769', + unicode_decimal: 59241, + }, + { + icon_id: '1444465', + name: 'evernote', + font_class: 'evernote', + unicode: 'e869', + unicode_decimal: 59497, + }, + { + icon_id: '1444722', + name: 'help-circle', + font_class: 'help-circle', + unicode: 'e969', + unicode_decimal: 59753, + }, + { + icon_id: '1444978', + name: 'nuke', + font_class: 'nuke', + unicode: 'ea69', + unicode_decimal: 60009, + }, + { + icon_id: '1445234', + name: 'school', + font_class: 'school', + unicode: 'eb69', + unicode_decimal: 60265, + }, + { + icon_id: '1445491', + name: 'tshirt-crew', + font_class: 'tshirt-crew', + unicode: 'ec69', + unicode_decimal: 60521, + }, + { + icon_id: '1443405', + name: 'arrow-right-bold', + font_class: 'arrow-right-bold', + unicode: 'e66a', + unicode_decimal: 58986, + }, + { + icon_id: '1444209', + name: 'checkbox-multiple-blank-circle-outline', + font_class: 'checkbox-multiple-blank-circle-outline', + unicode: 'e76a', + unicode_decimal: 59242, + }, + { + icon_id: '1444466', + name: 'ev-station', + font_class: 'ev-station', + unicode: 'e86a', + unicode_decimal: 59498, + }, + { + icon_id: '1444723', + name: 'help-circle-outline', + font_class: 'help-circle-outline', + unicode: 'e96a', + unicode_decimal: 59754, + }, + { + icon_id: '1444979', + name: 'numeric', + font_class: 'numeric', + unicode: 'ea6a', + unicode_decimal: 60010, + }, + { + icon_id: '1445235', + name: 'screen-rotation', + font_class: 'screen-rotation', + unicode: 'eb6a', + unicode_decimal: 60266, + }, + { + icon_id: '1445492', + name: 'tshirt-v', + font_class: 'tshirt-v', + unicode: 'ec6a', + unicode_decimal: 60522, + }, + { + icon_id: '1443406', + name: 'arrow-right-bold-circle-outline', + font_class: 'arrow-right-bold-circle-outline', + unicode: 'e66b', + unicode_decimal: 58987, + }, + { + icon_id: '1444210', + name: 'checkbox-multiple-blank-outline', + font_class: 'checkbox-multiple-blank-outline', + unicode: 'e76b', + unicode_decimal: 59243, + }, + { + icon_id: '1444467', + name: 'exclamation', + font_class: 'exclamation', + unicode: 'e86b', + unicode_decimal: 59499, + }, + { + icon_id: '1444724', + name: 'hexagon', + font_class: 'hexagon', + unicode: 'e96b', + unicode_decimal: 59755, + }, + { + icon_id: '1444980', + name: 'numeric-0-box', + font_class: 'numeric--box', + unicode: 'ea6b', + unicode_decimal: 60011, + }, + { + icon_id: '1445236', + name: 'screen-rotation-lock', + font_class: 'screen-rotation-lock', + unicode: 'eb6b', + unicode_decimal: 60267, + }, + { + icon_id: '1445493', + name: 'tumblr', + font_class: 'tumblr', + unicode: 'ec6b', + unicode_decimal: 60523, + }, + { + icon_id: '1443407', + name: 'arrow-right-box', + font_class: 'arrow-right-box', + unicode: 'e66c', + unicode_decimal: 58988, + }, + { + icon_id: '1444211', + name: 'checkbox-multiple-marked', + font_class: 'checkbox-multiple-marked', + unicode: 'e76c', + unicode_decimal: 59244, + }, + { + icon_id: '1444468', + name: 'exit-to-app', + font_class: 'exit-to-app', + unicode: 'e86c', + unicode_decimal: 59500, + }, + { + icon_id: '1444725', + name: 'highway', + font_class: 'highway', + unicode: 'e96c', + unicode_decimal: 59756, + }, + { + icon_id: '1444981', + name: 'numeric-0-box-multiple-outline', + font_class: 'numeric--box-multiple-outline', + unicode: 'ea6c', + unicode_decimal: 60012, + }, + { + icon_id: '1445237', + name: 'screwdriver', + font_class: 'screwdriver', + unicode: 'eb6c', + unicode_decimal: 60268, + }, + { + icon_id: '1445494', + name: 'tumblr-reblog', + font_class: 'tumblr-reblog', + unicode: 'ec6c', + unicode_decimal: 60524, + }, + { + icon_id: '1443408', + name: 'arrow-right-bold-hexagon-outline', + font_class: 'arrow-right-bold-hexagon-outline', + unicode: 'e66d', + unicode_decimal: 58989, + }, + { + icon_id: '1444212', + name: 'checkbox-multiple-marked-circle', + font_class: 'checkbox-multiple-marked-circle', + unicode: 'e76d', + unicode_decimal: 59245, + }, + { + icon_id: '1444469', + name: 'export', + font_class: 'export', + unicode: 'e86d', + unicode_decimal: 59501, + }, + { + icon_id: '1444726', + name: 'hexagon-outline', + font_class: 'hexagon-outline', + unicode: 'e96d', + unicode_decimal: 59757, + }, + { + icon_id: '1444982', + name: 'numeric-0-box-outline', + font_class: 'numeric--box-outline', + unicode: 'ea6d', + unicode_decimal: 60013, + }, + { + icon_id: '1445238', + name: 'script', + font_class: 'script', + unicode: 'eb6d', + unicode_decimal: 60269, + }, + { + icon_id: '1445495', + name: 'tune', + font_class: 'tune', + unicode: 'ec6d', + unicode_decimal: 60525, + }, + { + icon_id: '1443409', + name: 'arrow-right-drop-circle', + font_class: 'arrow-right-drop-circle', + unicode: 'e66e', + unicode_decimal: 58990, + }, + { + icon_id: '1444213', + name: 'checkbox-multiple-marked-circle-outline', + font_class: 'checkbox-multiple-marked-circle-outline', + unicode: 'e76e', + unicode_decimal: 59246, + }, + { + icon_id: '1444470', + name: 'eye', + font_class: 'eye', + unicode: 'e86e', + unicode_decimal: 59502, + }, + { + icon_id: '1444727', + name: 'history', + font_class: 'history', + unicode: 'e96e', + unicode_decimal: 59758, + }, + { + icon_id: '1444983', + name: 'numeric-1-box', + font_class: 'numeric--box1', + unicode: 'ea6e', + unicode_decimal: 60014, + }, + { + icon_id: '1445239', + name: 'sd', + font_class: 'sd', + unicode: 'eb6e', + unicode_decimal: 60270, + }, + { + icon_id: '1445496', + name: 'truck', + font_class: 'truck', + unicode: 'ec6e', + unicode_decimal: 60526, + }, + { + icon_id: '1443410', + name: 'arrow-right-drop-circle-outline', + font_class: 'arrow-right-drop-circle-outline', + unicode: 'e66f', + unicode_decimal: 58991, + }, + { + icon_id: '1444214', + name: 'check-circle', + font_class: 'check-circle', + unicode: 'e76f', + unicode_decimal: 59247, + }, + { + icon_id: '1444471', + name: 'eyedropper', + font_class: 'eyedropper', + unicode: 'e86f', + unicode_decimal: 59503, + }, + { + icon_id: '1444728', + name: 'home', + font_class: 'home', + unicode: 'e96f', + unicode_decimal: 59759, + }, + { + icon_id: '1444984', + name: 'numeric-1-box-outline', + font_class: 'numeric--box-outline1', + unicode: 'ea6f', + unicode_decimal: 60015, + }, + { + icon_id: '1445240', + name: 'seat-flat', + font_class: 'seat-flat', + unicode: 'eb6f', + unicode_decimal: 60271, + }, + { + icon_id: '1445497', + name: 'tune-vertical', + font_class: 'tune-vertical', + unicode: 'ec6f', + unicode_decimal: 60527, + }, + { + icon_id: '1443411', + name: 'arrow-top-right', + font_class: 'arrow-top-right', + unicode: 'e670', + unicode_decimal: 58992, + }, + { + icon_id: '1444215', + name: 'checkbox-multiple-marked-outline', + font_class: 'checkbox-multiple-marked-outline', + unicode: 'e770', + unicode_decimal: 59248, + }, + { + icon_id: '1444472', + name: 'eye-off', + font_class: 'eye-off', + unicode: 'e870', + unicode_decimal: 59504, + }, + { + icon_id: '1444729', + name: 'hololens', + font_class: 'hololens', + unicode: 'e970', + unicode_decimal: 59760, + }, + { + icon_id: '1444985', + name: 'numeric-1-box-multiple-outline', + font_class: 'numeric--box-multiple-outline1', + unicode: 'ea70', + unicode_decimal: 60016, + }, + { + icon_id: '1445241', + name: 'seat-flat-angled', + font_class: 'seat-flat-angled', + unicode: 'eb70', + unicode_decimal: 60272, + }, + { + icon_id: '1445498', + name: 'twitch', + font_class: 'twitch', + unicode: 'ec70', + unicode_decimal: 60528, + }, + { + icon_id: '1443412', + name: 'arrow-up', + font_class: 'arrow-up', + unicode: 'e671', + unicode_decimal: 58993, + }, + { + icon_id: '1444216', + name: 'checkerboard', + font_class: 'checkerboard', + unicode: 'e771', + unicode_decimal: 59249, + }, + { + icon_id: '1444473', + name: 'eyedropper-variant', + font_class: 'eyedropper-variant', + unicode: 'e871', + unicode_decimal: 59505, + }, + { + icon_id: '1444730', + name: 'home-modern', + font_class: 'home-modern', + unicode: 'e971', + unicode_decimal: 59761, + }, + { + icon_id: '1444986', + name: 'numeric-2-box', + font_class: 'numeric--box2', + unicode: 'ea71', + unicode_decimal: 60017, + }, + { + icon_id: '1445242', + name: 'seat-individual-suite', + font_class: 'seat-individual-suite', + unicode: 'eb71', + unicode_decimal: 60273, + }, + { + icon_id: '1445499', + name: 'twitter', + font_class: 'twitter', + unicode: 'ec71', + unicode_decimal: 60529, + }, + { + icon_id: '1443413', + name: 'arrow-up-bold', + font_class: 'arrow-up-bold', + unicode: 'e672', + unicode_decimal: 58994, + }, + { + icon_id: '1444217', + name: 'check-circle-outline', + font_class: 'check-circle-outline', + unicode: 'e772', + unicode_decimal: 59250, + }, + { + icon_id: '1444474', + name: 'face', + font_class: 'face', + unicode: 'e872', + unicode_decimal: 59506, + }, + { + icon_id: '1444731', + name: 'home-outline', + font_class: 'home-outline', + unicode: 'e972', + unicode_decimal: 59762, + }, + { + icon_id: '1444987', + name: 'numeric-2-box-multiple-outline', + font_class: 'numeric--box-multiple-outline2', + unicode: 'ea72', + unicode_decimal: 60018, + }, + { + icon_id: '1445243', + name: 'seal', + font_class: 'seal', + unicode: 'eb72', + unicode_decimal: 60274, + }, + { + icon_id: '1445500', + name: 'twitter-circle', + font_class: 'twitter-circle', + unicode: 'ec72', + unicode_decimal: 60530, + }, + { + icon_id: '1443414', + name: 'arrow-top-left', + font_class: 'arrow-top-left', + unicode: 'e673', + unicode_decimal: 58995, + }, + { + icon_id: '1444218', + name: 'chemical-weapon', + font_class: 'chemical-weapon', + unicode: 'e773', + unicode_decimal: 59251, + }, + { + icon_id: '1444475', + name: 'facebook-box', + font_class: 'facebook-box', + unicode: 'e873', + unicode_decimal: 59507, + }, + { + icon_id: '1444732', + name: 'home-variant', + font_class: 'home-variant', + unicode: 'e973', + unicode_decimal: 59763, + }, + { + icon_id: '1444988', + name: 'numeric-2-box-outline', + font_class: 'numeric--box-outline2', + unicode: 'ea73', + unicode_decimal: 60019, + }, + { + icon_id: '1445244', + name: 'seat-legroom-extra', + font_class: 'seat-legroom-extra', + unicode: 'eb73', + unicode_decimal: 60275, + }, + { + icon_id: '1445501', + name: 'twitter-box', + font_class: 'twitter-box', + unicode: 'ec73', + unicode_decimal: 60531, + }, + { + icon_id: '1443415', + name: 'arrow-up-bold-circle', + font_class: 'arrow-up-bold-circle', + unicode: 'e674', + unicode_decimal: 58996, + }, + { + icon_id: '1444219', + name: 'chevron-double-down', + font_class: 'chevron-double-down', + unicode: 'e774', + unicode_decimal: 59252, + }, + { + icon_id: '1444476', + name: 'facebook', + font_class: 'facebook', + unicode: 'e874', + unicode_decimal: 59508, + }, + { + icon_id: '1444733', + name: 'home-map-marker', + font_class: 'home-map-marker', + unicode: 'e974', + unicode_decimal: 59764, + }, + { + icon_id: '1444989', + name: 'numeric-3-box-multiple-outline', + font_class: 'numeric--box-multiple-outline3', + unicode: 'ea74', + unicode_decimal: 60020, + }, + { + icon_id: '1445245', + name: 'seat-legroom-normal', + font_class: 'seat-legroom-normal', + unicode: 'eb74', + unicode_decimal: 60276, + }, + { + icon_id: '1445502', + name: 'umbraco', + font_class: 'umbraco', + unicode: 'ec74', + unicode_decimal: 60532, + }, + { + icon_id: '1443416', + name: 'arrow-up-bold-circle-outline', + font_class: 'arrow-up-bold-circle-outline', + unicode: 'e675', + unicode_decimal: 58997, + }, + { + icon_id: '1444220', + name: 'chevron-double-left', + font_class: 'chevron-double-left', + unicode: 'e775', + unicode_decimal: 59253, + }, + { + icon_id: '1444477', + name: 'face-profile', + font_class: 'face-profile', + unicode: 'e875', + unicode_decimal: 59509, + }, + { + icon_id: '1444734', + name: 'hook', + font_class: 'hook', + unicode: 'e975', + unicode_decimal: 59765, + }, + { + icon_id: '1444990', + name: 'numeric-3-box-outline', + font_class: 'numeric--box-outline3', + unicode: 'ea75', + unicode_decimal: 60021, + }, + { + icon_id: '1445246', + name: 'seat-recline-extra', + font_class: 'seat-recline-extra', + unicode: 'eb75', + unicode_decimal: 60277, + }, + { + icon_id: '1445503', + name: 'twitter-retweet', + font_class: 'twitter-retweet', + unicode: 'ec75', + unicode_decimal: 60533, + }, + { + icon_id: '1443417', + name: 'arrow-up-bold-hexagon-outline', + font_class: 'arrow-up-bold-hexagon-outline', + unicode: 'e676', + unicode_decimal: 58998, + }, + { + icon_id: '1444221', + name: 'chevron-double-right', + font_class: 'chevron-double-right', + unicode: 'e776', + unicode_decimal: 59254, + }, + { + icon_id: '1444478', + name: 'facebook-messenger', + font_class: 'facebook-messenger', + unicode: 'e876', + unicode_decimal: 59510, + }, + { + icon_id: '1444735', + name: 'hook-off', + font_class: 'hook-off', + unicode: 'e976', + unicode_decimal: 59766, + }, + { + icon_id: '1444991', + name: 'numeric-3-box', + font_class: 'numeric--box3', + unicode: 'ea76', + unicode_decimal: 60022, + }, + { + icon_id: '1445247', + name: 'seat-legroom-reduced', + font_class: 'seat-legroom-reduced', + unicode: 'eb76', + unicode_decimal: 60278, + }, + { + icon_id: '1445504', + name: 'ubuntu', + font_class: 'ubuntu', + unicode: 'ec76', + unicode_decimal: 60534, + }, + { + icon_id: '1443418', + name: 'arrow-up-box', + font_class: 'arrow-up-box', + unicode: 'e677', + unicode_decimal: 58999, + }, + { + icon_id: '1444222', + name: 'chevron-double-up', + font_class: 'chevron-double-up', + unicode: 'e777', + unicode_decimal: 59255, + }, + { + icon_id: '1444479', + name: 'factory', + font_class: 'factory', + unicode: 'e877', + unicode_decimal: 59511, + }, + { + icon_id: '1444736', + name: 'hops', + font_class: 'hops', + unicode: 'e977', + unicode_decimal: 59767, + }, + { + icon_id: '1444992', + name: 'numeric-4-box', + font_class: 'numeric--box4', + unicode: 'ea77', + unicode_decimal: 60023, + }, + { + icon_id: '1445248', + name: 'seat-recline-normal', + font_class: 'seat-recline-normal', + unicode: 'eb77', + unicode_decimal: 60279, + }, + { + icon_id: '1445505', + name: 'umbrella', + font_class: 'umbrella', + unicode: 'ec77', + unicode_decimal: 60535, + }, + { + icon_id: '1443517', + name: 'album', + font_class: 'album', + unicode: 'e678', + unicode_decimal: 59000, + }, + { + icon_id: '1444223', + name: 'chevron-down', + font_class: 'chevron-down', + unicode: 'e778', + unicode_decimal: 59256, + }, + { + icon_id: '1444480', + name: 'fast-forward', + font_class: 'fast-forward', + unicode: 'e878', + unicode_decimal: 59512, + }, + { + icon_id: '1444737', + name: 'hospital', + font_class: 'hospital', + unicode: 'e978', + unicode_decimal: 59768, + }, + { + icon_id: '1444993', + name: 'numeric-4-box-outline', + font_class: 'numeric--box-outline4', + unicode: 'ea78', + unicode_decimal: 60024, + }, + { + icon_id: '1445249', + name: 'security', + font_class: 'security', + unicode: 'eb78', + unicode_decimal: 60280, + }, + { + icon_id: '1445506', + name: 'unfold-less', + font_class: 'unfold-less', + unicode: 'ec78', + unicode_decimal: 60536, + }, + { + icon_id: '1443590', + name: 'assistant', + font_class: 'assistant', + unicode: 'e679', + unicode_decimal: 59001, + }, + { + icon_id: '1444224', + name: 'chevron-left', + font_class: 'chevron-left', + unicode: 'e779', + unicode_decimal: 59257, + }, + { + icon_id: '1444481', + name: 'fan', + font_class: 'fan', + unicode: 'e879', + unicode_decimal: 59513, + }, + { + icon_id: '1444738', + name: 'hospital-building', + font_class: 'hospital-building', + unicode: 'e979', + unicode_decimal: 59769, + }, + { + icon_id: '1444994', + name: 'numeric-4-box-multiple-outline', + font_class: 'numeric--box-multiple-outline4', + unicode: 'ea79', + unicode_decimal: 60025, + }, + { + icon_id: '1445250', + name: 'security-home', + font_class: 'security-home', + unicode: 'eb79', + unicode_decimal: 60281, + }, + { + icon_id: '1445507', + name: 'undo-variant', + font_class: 'undo-variant', + unicode: 'ec79', + unicode_decimal: 60537, + }, + { + icon_id: '1443591', + name: 'arrow-up-drop-circle-outline', + font_class: 'arrow-up-drop-circle-outline', + unicode: 'e67a', + unicode_decimal: 59002, + }, + { + icon_id: '1444225', + name: 'chevron-right', + font_class: 'chevron-right', + unicode: 'e77a', + unicode_decimal: 59258, + }, + { + icon_id: '1444482', + name: 'fast-forward-outline', + font_class: 'fast-forward-outline', + unicode: 'e87a', + unicode_decimal: 59514, + }, + { + icon_id: '1444739', + name: 'hospital-marker', + font_class: 'hospital-marker', + unicode: 'e97a', + unicode_decimal: 59770, + }, + { + icon_id: '1444995', + name: 'numeric-5-box', + font_class: 'numeric--box5', + unicode: 'ea7a', + unicode_decimal: 60026, + }, + { + icon_id: '1445251', + name: 'security-network', + font_class: 'security-network', + unicode: 'eb7a', + unicode_decimal: 60282, + }, + { + icon_id: '1445508', + name: 'undo', + font_class: 'undo', + unicode: 'ec7a', + unicode_decimal: 60538, + }, + { + icon_id: '1443592', + name: 'arrow-up-drop-circle', + font_class: 'arrow-up-drop-circle', + unicode: 'e67b', + unicode_decimal: 59003, + }, + { + icon_id: '1444226', + name: 'chevron-up', + font_class: 'chevron-up', + unicode: 'e77b', + unicode_decimal: 59259, + }, + { + icon_id: '1444483', + name: 'fax', + font_class: 'fax', + unicode: 'e87b', + unicode_decimal: 59515, + }, + { + icon_id: '1444740', + name: 'hotel', + font_class: 'hotel', + unicode: 'e97b', + unicode_decimal: 59771, + }, + { + icon_id: '1444996', + name: 'numeric-5-box-multiple-outline', + font_class: 'numeric--box-multiple-outline5', + unicode: 'ea7b', + unicode_decimal: 60027, + }, + { + icon_id: '1445252', + name: 'select-all', + font_class: 'select-all', + unicode: 'eb7b', + unicode_decimal: 60283, + }, + { + icon_id: '1445509', + name: 'unfold-more', + font_class: 'unfold-more', + unicode: 'ec7b', + unicode_decimal: 60539, + }, + { + icon_id: '1443593', + name: 'attachment', + font_class: 'attachment', + unicode: 'e67c', + unicode_decimal: 59004, + }, + { + icon_id: '1444227', + name: 'church', + font_class: 'church', + unicode: 'e77c', + unicode_decimal: 59260, + }, + { + icon_id: '1444484', + name: 'feather', + font_class: 'feather', + unicode: 'e87c', + unicode_decimal: 59516, + }, + { + icon_id: '1444741', + name: 'houzz', + font_class: 'houzz', + unicode: 'e97c', + unicode_decimal: 59772, + }, + { + icon_id: '1444997', + name: 'numeric-5-box-outline', + font_class: 'numeric--box-outline5', + unicode: 'ea7c', + unicode_decimal: 60028, + }, + { + icon_id: '1445253', + name: 'select-inverse', + font_class: 'select-inverse', + unicode: 'eb7c', + unicode_decimal: 60284, + }, + { + icon_id: '1445510', + name: 'ungroup', + font_class: 'ungroup', + unicode: 'ec7c', + unicode_decimal: 60540, + }, + { + icon_id: '1443594', + name: 'asterisk', + font_class: 'asterisk', + unicode: 'e67d', + unicode_decimal: 59005, + }, + { + icon_id: '1444228', + name: 'chip', + font_class: 'chip', + unicode: 'e77d', + unicode_decimal: 59261, + }, + { + icon_id: '1444485', + name: 'ferry', + font_class: 'ferry', + unicode: 'e87d', + unicode_decimal: 59517, + }, + { + icon_id: '1444742', + name: 'houzz-box', + font_class: 'houzz-box', + unicode: 'e97d', + unicode_decimal: 59773, + }, + { + icon_id: '1444998', + name: 'numeric-6-box', + font_class: 'numeric--box6', + unicode: 'ea7d', + unicode_decimal: 60029, + }, + { + icon_id: '1445254', + name: 'select', + font_class: 'select', + unicode: 'eb7d', + unicode_decimal: 60285, + }, + { + icon_id: '1445511', + name: 'umbrella-outline', + font_class: 'umbrella-outline', + unicode: 'ec7d', + unicode_decimal: 60541, + }, + { + icon_id: '1443595', + name: 'at', + font_class: 'at', + unicode: 'e67e', + unicode_decimal: 59006, + }, + { + icon_id: '1444229', + name: 'cisco-webex', + font_class: 'cisco-webex', + unicode: 'e77e', + unicode_decimal: 59262, + }, + { + icon_id: '1444486', + name: 'file', + font_class: 'file', + unicode: 'e87e', + unicode_decimal: 59518, + }, + { + icon_id: '1444743', + name: 'human-child', + font_class: 'human-child', + unicode: 'e97e', + unicode_decimal: 59774, + }, + { + icon_id: '1444999', + name: 'numeric-6-box-multiple-outline', + font_class: 'numeric--box-multiple-outline6', + unicode: 'ea7e', + unicode_decimal: 60030, + }, + { + icon_id: '1445255', + name: 'selection', + font_class: 'selection', + unicode: 'eb7e', + unicode_decimal: 60286, + }, + { + icon_id: '1445512', + name: 'update', + font_class: 'update', + unicode: 'ec7e', + unicode_decimal: 60542, + }, + { + icon_id: '1443596', + name: 'audiobook', + font_class: 'audiobook', + unicode: 'e67f', + unicode_decimal: 59007, + }, + { + icon_id: '1444230', + name: 'city', + font_class: 'city', + unicode: 'e77f', + unicode_decimal: 59263, + }, + { + icon_id: '1444487', + name: 'file-chart', + font_class: 'file-chart', + unicode: 'e87f', + unicode_decimal: 59519, + }, + { + icon_id: '1444744', + name: 'human', + font_class: 'human', + unicode: 'e97f', + unicode_decimal: 59775, + }, + { + icon_id: '1445000', + name: 'numeric-7-box', + font_class: 'numeric--box7', + unicode: 'ea7f', + unicode_decimal: 60031, + }, + { + icon_id: '1445256', + name: 'select-off', + font_class: 'select-off', + unicode: 'eb7f', + unicode_decimal: 60287, + }, + { + icon_id: '1445513', + name: 'untappd', + font_class: 'untappd', + unicode: 'ec7f', + unicode_decimal: 60543, + }, + { + icon_id: '1443597', + name: 'auto-fix', + font_class: 'auto-fix', + unicode: 'e680', + unicode_decimal: 59008, + }, + { + icon_id: '1444231', + name: 'clipboard', + font_class: 'clipboard', + unicode: 'e780', + unicode_decimal: 59264, + }, + { + icon_id: '1444488', + name: 'file-check', + font_class: 'file-check', + unicode: 'e880', + unicode_decimal: 59520, + }, + { + icon_id: '1444745', + name: 'human-greeting', + font_class: 'human-greeting', + unicode: 'e980', + unicode_decimal: 59776, + }, + { + icon_id: '1445001', + name: 'numeric-6-box-outline', + font_class: 'numeric--box-outline6', + unicode: 'ea80', + unicode_decimal: 60032, + }, + { + icon_id: '1445257', + name: 'send', + font_class: 'send', + unicode: 'eb80', + unicode_decimal: 60288, + }, + { + icon_id: '1445514', + name: 'unity', + font_class: 'unity', + unicode: 'ec80', + unicode_decimal: 60544, + }, + { + icon_id: '1443598', + name: 'auto-upload', + font_class: 'auto-upload', + unicode: 'e681', + unicode_decimal: 59009, + }, + { + icon_id: '1444232', + name: 'clipboard-account', + font_class: 'clipboard-account', + unicode: 'e781', + unicode_decimal: 59265, + }, + { + icon_id: '1444489', + name: 'file-cloud', + font_class: 'file-cloud', + unicode: 'e881', + unicode_decimal: 59521, + }, + { + icon_id: '1444746', + name: 'human-female', + font_class: 'human-female', + unicode: 'e981', + unicode_decimal: 59777, + }, + { + icon_id: '1445002', + name: 'numeric-7-box-multiple-outline', + font_class: 'numeric--box-multiple-outline7', + unicode: 'ea81', + unicode_decimal: 60033, + }, + { + icon_id: '1445258', + name: 'serial-port', + font_class: 'serial-port', + unicode: 'eb81', + unicode_decimal: 60289, + }, + { + icon_id: '1445515', + name: 'upload', + font_class: 'upload', + unicode: 'ec81', + unicode_decimal: 60545, + }, + { + icon_id: '1443599', + name: 'autorenew', + font_class: 'autorenew', + unicode: 'e682', + unicode_decimal: 59010, + }, + { + icon_id: '1444233', + name: 'clipboard-arrow-down', + font_class: 'clipboard-arrow-down', + unicode: 'e782', + unicode_decimal: 59266, + }, + { + icon_id: '1444490', + name: 'file-delimited', + font_class: 'file-delimited', + unicode: 'e882', + unicode_decimal: 59522, + }, + { + icon_id: '1444747', + name: 'human-handsup', + font_class: 'human-handsup', + unicode: 'e982', + unicode_decimal: 59778, + }, + { + icon_id: '1445003', + name: 'numeric-7-box-outline', + font_class: 'numeric--box-outline7', + unicode: 'ea82', + unicode_decimal: 60034, + }, + { + icon_id: '1445259', + name: 'server-minus', + font_class: 'server-minus', + unicode: 'eb82', + unicode_decimal: 60290, + }, + { + icon_id: '1445516', + name: 'vector-arrange-above', + font_class: 'vector-arrange-above', + unicode: 'ec82', + unicode_decimal: 60546, + }, + { + icon_id: '1443600', + name: 'av-timer', + font_class: 'av-timer', + unicode: 'e683', + unicode_decimal: 59011, + }, + { + icon_id: '1444234', + name: 'clipboard-alert', + font_class: 'clipboard-alert', + unicode: 'e783', + unicode_decimal: 59267, + }, + { + icon_id: '1444491', + name: 'file-document-box', + font_class: 'file-document-box', + unicode: 'e883', + unicode_decimal: 59523, + }, + { + icon_id: '1444748', + name: 'human-handsdown', + font_class: 'human-handsdown', + unicode: 'e983', + unicode_decimal: 59779, + }, + { + icon_id: '1445004', + name: 'numeric-8-box', + font_class: 'numeric--box8', + unicode: 'ea83', + unicode_decimal: 60035, + }, + { + icon_id: '1445260', + name: 'server', + font_class: 'server', + unicode: 'eb83', + unicode_decimal: 60291, + }, + { + icon_id: '1445517', + name: 'usb', + font_class: 'usb', + unicode: 'ec83', + unicode_decimal: 60547, + }, + { + icon_id: '1443601', + name: 'backspace', + font_class: 'backspace', + unicode: 'e684', + unicode_decimal: 59012, + }, + { + icon_id: '1444235', + name: 'clipboard-arrow-left', + font_class: 'clipboard-arrow-left', + unicode: 'e784', + unicode_decimal: 59268, + }, + { + icon_id: '1444492', + name: 'file-excel', + font_class: 'file-excel', + unicode: 'e884', + unicode_decimal: 59524, + }, + { + icon_id: '1444749', + name: 'human-male-female', + font_class: 'human-male-female', + unicode: 'e984', + unicode_decimal: 59780, + }, + { + icon_id: '1445005', + name: 'numeric-8-box-multiple-outline', + font_class: 'numeric--box-multiple-outline8', + unicode: 'ea84', + unicode_decimal: 60036, + }, + { + icon_id: '1445261', + name: 'server-network-off', + font_class: 'server-network-off', + unicode: 'eb84', + unicode_decimal: 60292, + }, + { + icon_id: '1445518', + name: 'vector-arrange-below', + font_class: 'vector-arrange-below', + unicode: 'ec84', + unicode_decimal: 60548, + }, + { + icon_id: '1443602', + name: 'backburger', + font_class: 'backburger', + unicode: 'e685', + unicode_decimal: 59013, + }, + { + icon_id: '1444236', + name: 'clipboard-check', + font_class: 'clipboard-check', + unicode: 'e785', + unicode_decimal: 59269, + }, + { + icon_id: '1444493', + name: 'file-document', + font_class: 'file-document', + unicode: 'e885', + unicode_decimal: 59525, + }, + { + icon_id: '1444750', + name: 'human-male', + font_class: 'human-male', + unicode: 'e985', + unicode_decimal: 59781, + }, + { + icon_id: '1445006', + name: 'numeric-9-box', + font_class: 'numeric--box9', + unicode: 'ea85', + unicode_decimal: 60037, + }, + { + icon_id: '1445262', + name: 'server-network', + font_class: 'server-network', + unicode: 'eb85', + unicode_decimal: 60293, + }, + { + icon_id: '1445519', + name: 'vector-circle', + font_class: 'vector-circle', + unicode: 'ec85', + unicode_decimal: 60549, + }, + { + icon_id: '1443603', + name: 'baby-buggy', + font_class: 'baby-buggy', + unicode: 'e686', + unicode_decimal: 59014, + }, + { + icon_id: '1444237', + name: 'clipboard-flow', + font_class: 'clipboard-flow', + unicode: 'e786', + unicode_decimal: 59270, + }, + { + icon_id: '1444494', + name: 'file-excel-box', + font_class: 'file-excel-box', + unicode: 'e886', + unicode_decimal: 59526, + }, + { + icon_id: '1444751', + name: 'human-pregnant', + font_class: 'human-pregnant', + unicode: 'e986', + unicode_decimal: 59782, + }, + { + icon_id: '1445007', + name: 'numeric-8-box-outline', + font_class: 'numeric--box-outline8', + unicode: 'ea86', + unicode_decimal: 60038, + }, + { + icon_id: '1445263', + name: 'server-off', + font_class: 'server-off', + unicode: 'eb86', + unicode_decimal: 60294, + }, + { + icon_id: '1445520', + name: 'vector-combine', + font_class: 'vector-combine', + unicode: 'ec86', + unicode_decimal: 60550, + }, + { + icon_id: '1443604', + name: 'baby', + font_class: 'baby', + unicode: 'e687', + unicode_decimal: 59015, + }, + { + icon_id: '1444238', + name: 'clipboard-outline', + font_class: 'clipboard-outline', + unicode: 'e787', + unicode_decimal: 59271, + }, + { + icon_id: '1444495', + name: 'file-export', + font_class: 'file-export', + unicode: 'e887', + unicode_decimal: 59527, + }, + { + icon_id: '1444752', + name: 'image', + font_class: 'image', + unicode: 'e987', + unicode_decimal: 59783, + }, + { + icon_id: '1445008', + name: 'numeric-9-box-multiple-outline', + font_class: 'numeric--box-multiple-outline9', + unicode: 'ea87', + unicode_decimal: 60039, + }, + { + icon_id: '1445264', + name: 'server-plus', + font_class: 'server-plus', + unicode: 'eb87', + unicode_decimal: 60295, + }, + { + icon_id: '1445521', + name: 'vector-circle-variant', + font_class: 'vector-circle-variant', + unicode: 'ec87', + unicode_decimal: 60551, + }, + { + icon_id: '1443982', + name: 'bandcamp', + font_class: 'bandcamp', + unicode: 'e688', + unicode_decimal: 59016, + }, + { + icon_id: '1444239', + name: 'clipboard-text', + font_class: 'clipboard-text', + unicode: 'e788', + unicode_decimal: 59272, + }, + { + icon_id: '1444496', + name: 'file-find', + font_class: 'file-find', + unicode: 'e888', + unicode_decimal: 59528, + }, + { + icon_id: '1444753', + name: 'image-album', + font_class: 'image-album', + unicode: 'e988', + unicode_decimal: 59784, + }, + { + icon_id: '1445009', + name: 'numeric-9-box-outline', + font_class: 'numeric--box-outline9', + unicode: 'ea88', + unicode_decimal: 60040, + }, + { + icon_id: '1445265', + name: 'server-remove', + font_class: 'server-remove', + unicode: 'eb88', + unicode_decimal: 60296, + }, + { + icon_id: '1445522', + name: 'vector-curve', + font_class: 'vector-curve', + unicode: 'ec88', + unicode_decimal: 60552, + }, + { + icon_id: '1443983', + name: 'bank', + font_class: 'bank', + unicode: 'e689', + unicode_decimal: 59017, + }, + { + icon_id: '1444240', + name: 'clippy', + font_class: 'clippy', + unicode: 'e789', + unicode_decimal: 59273, + }, + { + icon_id: '1444497', + name: 'file-image', + font_class: 'file-image', + unicode: 'e889', + unicode_decimal: 59529, + }, + { + icon_id: '1444754', + name: 'image-area', + font_class: 'image-area', + unicode: 'e989', + unicode_decimal: 59785, + }, + { + icon_id: '1445010', + name: 'numeric-9-plus-box', + font_class: 'numeric--plus-box', + unicode: 'ea89', + unicode_decimal: 60041, + }, + { + icon_id: '1445266', + name: 'shape-circle-plus', + font_class: 'shape-circle-plus', + unicode: 'eb89', + unicode_decimal: 60297, + }, + { + icon_id: '1445523', + name: 'vector-difference', + font_class: 'vector-difference', + unicode: 'ec89', + unicode_decimal: 60553, + }, + { + icon_id: '1443984', + name: 'backup-restore', + font_class: 'backup-restore', + unicode: 'e68a', + unicode_decimal: 59018, + }, + { + icon_id: '1444241', + name: 'clock', + font_class: 'clock', + unicode: 'e78a', + unicode_decimal: 59274, + }, + { + icon_id: '1444498', + name: 'file-hidden', + font_class: 'file-hidden', + unicode: 'e88a', + unicode_decimal: 59530, + }, + { + icon_id: '1444755', + name: 'image-area-close', + font_class: 'image-area-close', + unicode: 'e98a', + unicode_decimal: 59786, + }, + { + icon_id: '1445011', + name: 'numeric-9-plus-box-multiple-outline', + font_class: 'numeric--plus-box-multiple-outline', + unicode: 'ea8a', + unicode_decimal: 60042, + }, + { + icon_id: '1445267', + name: 'server-security', + font_class: 'server-security', + unicode: 'eb8a', + unicode_decimal: 60298, + }, + { + icon_id: '1445524', + name: 'vector-difference-ba', + font_class: 'vector-difference-ba', + unicode: 'ec8a', + unicode_decimal: 60554, + }, + { + icon_id: '1443985', + name: 'barley', + font_class: 'barley', + unicode: 'e68b', + unicode_decimal: 59019, + }, + { + icon_id: '1444242', + name: 'clock-end', + font_class: 'clock-end', + unicode: 'e78b', + unicode_decimal: 59275, + }, + { + icon_id: '1444499', + name: 'file-import', + font_class: 'file-import', + unicode: 'e88b', + unicode_decimal: 59531, + }, + { + icon_id: '1444756', + name: 'image-filter-black-white', + font_class: 'image-filter-black-white', + unicode: 'e98b', + unicode_decimal: 59787, + }, + { + icon_id: '1445012', + name: 'nutrition', + font_class: 'nutrition', + unicode: 'ea8b', + unicode_decimal: 60043, + }, + { + icon_id: '1445268', + name: 'settings-box', + font_class: 'settings-box', + unicode: 'eb8b', + unicode_decimal: 60299, + }, + { + icon_id: '1445525', + name: 'vector-difference-ab', + font_class: 'vector-difference-ab', + unicode: 'ec8b', + unicode_decimal: 60555, + }, + { + icon_id: '1443986', + name: 'barcode-scan', + font_class: 'barcode-scan', + unicode: 'e68c', + unicode_decimal: 59020, + }, + { + icon_id: '1444243', + name: 'clock-alert', + font_class: 'clock-alert', + unicode: 'e78c', + unicode_decimal: 59276, + }, + { + icon_id: '1444500', + name: 'file-lock', + font_class: 'file-lock', + unicode: 'e88c', + unicode_decimal: 59532, + }, + { + icon_id: '1444757', + name: 'image-filter', + font_class: 'image-filter', + unicode: 'e98c', + unicode_decimal: 59788, + }, + { + icon_id: '1445013', + name: 'numeric-9-plus-box-outline', + font_class: 'numeric--plus-box-outline', + unicode: 'ea8c', + unicode_decimal: 60044, + }, + { + icon_id: '1445269', + name: 'shape-polygon-plus', + font_class: 'shape-polygon-plus', + unicode: 'eb8c', + unicode_decimal: 60300, + }, + { + icon_id: '1445526', + name: 'vector-line', + font_class: 'vector-line', + unicode: 'ec8c', + unicode_decimal: 60556, + }, + { + icon_id: '1443987', + name: 'barcode', + font_class: 'barcode', + unicode: 'e68d', + unicode_decimal: 59021, + }, + { + icon_id: '1444244', + name: 'clock-in', + font_class: 'clock-in', + unicode: 'e78d', + unicode_decimal: 59277, + }, + { + icon_id: '1444501', + name: 'file-multiple', + font_class: 'file-multiple', + unicode: 'e88d', + unicode_decimal: 59533, + }, + { + icon_id: '1444758', + name: 'image-broken-variant', + font_class: 'image-broken-variant', + unicode: 'e98d', + unicode_decimal: 59789, + }, + { + icon_id: '1445014', + name: 'oar', + font_class: 'oar', + unicode: 'ea8d', + unicode_decimal: 60045, + }, + { + icon_id: '1445270', + name: 'settings', + font_class: 'settings', + unicode: 'eb8d', + unicode_decimal: 60301, + }, + { + icon_id: '1445527', + name: 'vector-intersection', + font_class: 'vector-intersection', + unicode: 'ec8d', + unicode_decimal: 60557, + }, + { + icon_id: '1443988', + name: 'barrel', + font_class: 'barrel', + unicode: 'e68e', + unicode_decimal: 59022, + }, + { + icon_id: '1444245', + name: 'clock-out', + font_class: 'clock-out', + unicode: 'e78e', + unicode_decimal: 59278, + }, + { + icon_id: '1444502', + name: 'file-outline', + font_class: 'file-outline', + unicode: 'e88e', + unicode_decimal: 59534, + }, + { + icon_id: '1444759', + name: 'image-broken', + font_class: 'image-broken', + unicode: 'e98e', + unicode_decimal: 59790, + }, + { + icon_id: '1445015', + name: 'octagon', + font_class: 'octagon', + unicode: 'ea8e', + unicode_decimal: 60046, + }, + { + icon_id: '1445271', + name: 'shape-plus', + font_class: 'shape-plus', + unicode: 'eb8e', + unicode_decimal: 60302, + }, + { + icon_id: '1445528', + name: 'vector-point', + font_class: 'vector-point', + unicode: 'ec8e', + unicode_decimal: 60558, + }, + { + icon_id: '1443989', + name: 'basecamp', + font_class: 'basecamp', + unicode: 'e68f', + unicode_decimal: 59023, + }, + { + icon_id: '1444246', + name: 'clock-fast', + font_class: 'clock-fast', + unicode: 'e78f', + unicode_decimal: 59279, + }, + { + icon_id: '1444503', + name: 'file-music', + font_class: 'file-music', + unicode: 'e88f', + unicode_decimal: 59535, + }, + { + icon_id: '1444760', + name: 'image-filter-center-focus-weak', + font_class: 'image-filter-center-focus-weak', + unicode: 'e98f', + unicode_decimal: 59791, + }, + { + icon_id: '1445016', + name: 'octagon-outline', + font_class: 'octagon-outline', + unicode: 'ea8f', + unicode_decimal: 60047, + }, + { + icon_id: '1445272', + name: 'share', + font_class: 'share', + unicode: 'eb8f', + unicode_decimal: 60303, + }, + { + icon_id: '1445529', + name: 'vector-polygon', + font_class: 'vector-polygon', + unicode: 'ec8f', + unicode_decimal: 60559, + }, + { + icon_id: '1443990', + name: 'basket', + font_class: 'basket', + unicode: 'e690', + unicode_decimal: 59024, + }, + { + icon_id: '1444247', + name: 'clock-start', + font_class: 'clock-start', + unicode: 'e790', + unicode_decimal: 59280, + }, + { + icon_id: '1444504', + name: 'file-pdf', + font_class: 'file-pdf', + unicode: 'e890', + unicode_decimal: 59536, + }, + { + icon_id: '1444761', + name: 'image-filter-center-focus', + font_class: 'image-filter-center-focus', + unicode: 'e990', + unicode_decimal: 59792, + }, + { + icon_id: '1445017', + name: 'odnoklassniki', + font_class: 'odnoklassniki', + unicode: 'ea90', + unicode_decimal: 60048, + }, + { + icon_id: '1445273', + name: 'shape-square-plus', + font_class: 'shape-square-plus', + unicode: 'eb90', + unicode_decimal: 60304, + }, + { + icon_id: '1445530', + name: 'vector-polyline', + font_class: 'vector-polyline', + unicode: 'ec90', + unicode_decimal: 60560, + }, + { + icon_id: '1443991', + name: 'basket-fill', + font_class: 'basket-fill', + unicode: 'e691', + unicode_decimal: 59025, + }, + { + icon_id: '1444248', + name: 'close-box', + font_class: 'close-box', + unicode: 'e791', + unicode_decimal: 59281, + }, + { + icon_id: '1444505', + name: 'file-powerpoint', + font_class: 'file-powerpoint', + unicode: 'e891', + unicode_decimal: 59537, + }, + { + icon_id: '1444762', + name: 'image-filter-drama', + font_class: 'image-filter-drama', + unicode: 'e991', + unicode_decimal: 59793, + }, + { + icon_id: '1445018', + name: 'office', + font_class: 'office', + unicode: 'ea91', + unicode_decimal: 60049, + }, + { + icon_id: '1445274', + name: 'share-variant', + font_class: 'share-variant', + unicode: 'eb91', + unicode_decimal: 60305, + }, + { + icon_id: '1445531', + name: 'vector-rectangle', + font_class: 'vector-rectangle', + unicode: 'ec91', + unicode_decimal: 60561, + }, + { + icon_id: '1443992', + name: 'battery', + font_class: 'battery', + unicode: 'e692', + unicode_decimal: 59026, + }, + { + icon_id: '1444249', + name: 'close-box-outline', + font_class: 'close-box-outline', + unicode: 'e792', + unicode_decimal: 59282, + }, + { + icon_id: '1444506', + name: 'file-pdf-box', + font_class: 'file-pdf-box', + unicode: 'e892', + unicode_decimal: 59538, + }, + { + icon_id: '1444763', + name: 'image-filter-frames', + font_class: 'image-filter-frames', + unicode: 'e992', + unicode_decimal: 59794, + }, + { + icon_id: '1445019', + name: 'oil-temperature', + font_class: 'oil-temperature', + unicode: 'ea92', + unicode_decimal: 60050, + }, + { + icon_id: '1445275', + name: 'shield', + font_class: 'shield', + unicode: 'eb92', + unicode_decimal: 60306, + }, + { + icon_id: '1445532', + name: 'vector-selection', + font_class: 'vector-selection', + unicode: 'ec92', + unicode_decimal: 60562, + }, + { + icon_id: '1443993', + name: 'basket-unfill', + font_class: 'basket-unfill', + unicode: 'e693', + unicode_decimal: 59027, + }, + { + icon_id: '1444250', + name: 'close-circle', + font_class: 'close-circle', + unicode: 'e793', + unicode_decimal: 59283, + }, + { + icon_id: '1444507', + name: 'file-powerpoint-box', + font_class: 'file-powerpoint-box', + unicode: 'e893', + unicode_decimal: 59539, + }, + { + icon_id: '1444764', + name: 'image-filter-hdr', + font_class: 'image-filter-hdr', + unicode: 'e993', + unicode_decimal: 59795, + }, + { + icon_id: '1445020', + name: 'oil', + font_class: 'oil', + unicode: 'ea93', + unicode_decimal: 60051, + }, + { + icon_id: '1445276', + name: 'shopping', + font_class: 'shopping', + unicode: 'eb93', + unicode_decimal: 60307, + }, + { + icon_id: '1445533', + name: 'vector-square', + font_class: 'vector-square', + unicode: 'ec93', + unicode_decimal: 60563, + }, + { + icon_id: '1443994', + name: 'battery-10', + font_class: 'battery-', + unicode: 'e694', + unicode_decimal: 59028, + }, + { + icon_id: '1444251', + name: 'close-circle-outline', + font_class: 'close-circle-outline', + unicode: 'e794', + unicode_decimal: 59284, + }, + { + icon_id: '1444508', + name: 'file-restore', + font_class: 'file-restore', + unicode: 'e894', + unicode_decimal: 59540, + }, + { + icon_id: '1444765', + name: 'image-filter-none', + font_class: 'image-filter-none', + unicode: 'e994', + unicode_decimal: 59796, + }, + { + icon_id: '1445021', + name: 'omega', + font_class: 'omega', + unicode: 'ea94', + unicode_decimal: 60052, + }, + { + icon_id: '1445277', + name: 'shovel', + font_class: 'shovel', + unicode: 'eb94', + unicode_decimal: 60308, + }, + { + icon_id: '1445534', + name: 'vector-triangle', + font_class: 'vector-triangle', + unicode: 'ec94', + unicode_decimal: 60564, + }, + { + icon_id: '1443995', + name: 'battery-20', + font_class: 'battery-1', + unicode: 'e695', + unicode_decimal: 59029, + }, + { + icon_id: '1444252', + name: 'close', + font_class: 'close', + unicode: 'e795', + unicode_decimal: 59285, + }, + { + icon_id: '1444509', + name: 'file-send', + font_class: 'file-send', + unicode: 'e895', + unicode_decimal: 59541, + }, + { + icon_id: '1444766', + name: 'image-filter-tilt-shift', + font_class: 'image-filter-tilt-shift', + unicode: 'e995', + unicode_decimal: 59797, + }, + { + icon_id: '1445022', + name: 'opacity', + font_class: 'opacity', + unicode: 'ea95', + unicode_decimal: 60053, + }, + { + icon_id: '1445278', + name: 'shopping-music', + font_class: 'shopping-music', + unicode: 'eb95', + unicode_decimal: 60309, + }, + { + icon_id: '1445535', + name: 'vector-union', + font_class: 'vector-union', + unicode: 'ec95', + unicode_decimal: 60565, + }, + { + icon_id: '1443996', + name: 'battery-30', + font_class: 'battery-2', + unicode: 'e696', + unicode_decimal: 59030, + }, + { + icon_id: '1444253', + name: 'closed-caption', + font_class: 'closed-caption', + unicode: 'e796', + unicode_decimal: 59286, + }, + { + icon_id: '1444510', + name: 'file-tree', + font_class: 'file-tree', + unicode: 'e896', + unicode_decimal: 59542, + }, + { + icon_id: '1444767', + name: 'image-filter-vintage', + font_class: 'image-filter-vintage', + unicode: 'e996', + unicode_decimal: 59798, + }, + { + icon_id: '1445023', + name: 'onedrive', + font_class: 'onedrive', + unicode: 'ea96', + unicode_decimal: 60054, + }, + { + icon_id: '1445279', + name: 'shovel-off', + font_class: 'shovel-off', + unicode: 'eb96', + unicode_decimal: 60310, + }, + { + icon_id: '1445536', + name: 'vibrate', + font_class: 'vibrate', + unicode: 'ec96', + unicode_decimal: 60566, + }, + { + icon_id: '1443997', + name: 'battery-40', + font_class: 'battery-3', + unicode: 'e697', + unicode_decimal: 59031, + }, + { + icon_id: '1444254', + name: 'close-octagon', + font_class: 'close-octagon', + unicode: 'e797', + unicode_decimal: 59287, + }, + { + icon_id: '1444511', + name: 'file-video', + font_class: 'file-video', + unicode: 'e897', + unicode_decimal: 59543, + }, + { + icon_id: '1444768', + name: 'image-multiple', + font_class: 'image-multiple', + unicode: 'e997', + unicode_decimal: 59799, + }, + { + icon_id: '1445024', + name: 'openid', + font_class: 'openid', + unicode: 'ea97', + unicode_decimal: 60055, + }, + { + icon_id: '1445280', + name: 'shredder', + font_class: 'shredder', + unicode: 'eb97', + unicode_decimal: 60311, + }, + { + icon_id: '1445537', + name: 'verified', + font_class: 'verified', + unicode: 'ec97', + unicode_decimal: 60567, + }, + { + icon_id: '1443998', + name: 'battery-60', + font_class: 'battery-4', + unicode: 'e698', + unicode_decimal: 59032, + }, + { + icon_id: '1444255', + name: 'close-outline', + font_class: 'close-outline', + unicode: 'e798', + unicode_decimal: 59288, + }, + { + icon_id: '1444512', + name: 'file-word', + font_class: 'file-word', + unicode: 'e898', + unicode_decimal: 59544, + }, + { + icon_id: '1444769', + name: 'import', + font_class: 'import', + unicode: 'e998', + unicode_decimal: 59800, + }, + { + icon_id: '1445025', + name: 'open-in-new', + font_class: 'open-in-new', + unicode: 'ea98', + unicode_decimal: 60056, + }, + { + icon_id: '1445281', + name: 'shuffle', + font_class: 'shuffle', + unicode: 'eb98', + unicode_decimal: 60312, + }, + { + icon_id: '1445538', + name: 'video', + font_class: 'video', + unicode: 'ec98', + unicode_decimal: 60568, + }, + { + icon_id: '1443999', + name: 'battery-50', + font_class: 'battery-5', + unicode: 'e699', + unicode_decimal: 59033, + }, + { + icon_id: '1444256', + name: 'close-network', + font_class: 'close-network', + unicode: 'e799', + unicode_decimal: 59289, + }, + { + icon_id: '1444513', + name: 'file-presentation-box', + font_class: 'file-presentation-box', + unicode: 'e899', + unicode_decimal: 59545, + }, + { + icon_id: '1444770', + name: 'inbox-arrow-down', + font_class: 'inbox-arrow-down', + unicode: 'e999', + unicode_decimal: 59801, + }, + { + icon_id: '1445026', + name: 'open-in-app', + font_class: 'open-in-app', + unicode: 'ea99', + unicode_decimal: 60057, + }, + { + icon_id: '1445282', + name: 'shuffle-disabled', + font_class: 'shuffle-disabled', + unicode: 'eb99', + unicode_decimal: 60313, + }, + { + icon_id: '1445539', + name: 'video-off', + font_class: 'video-off', + unicode: 'ec99', + unicode_decimal: 60569, + }, + { + icon_id: '1444000', + name: 'battery-70', + font_class: 'battery-6', + unicode: 'e69a', + unicode_decimal: 59034, + }, + { + icon_id: '1444257', + name: 'cloud', + font_class: 'cloud', + unicode: 'e79a', + unicode_decimal: 59290, + }, + { + icon_id: '1444514', + name: 'file-word-box', + font_class: 'file-word-box', + unicode: 'e89a', + unicode_decimal: 59546, + }, + { + icon_id: '1444771', + name: 'inbox', + font_class: 'inbox', + unicode: 'e99a', + unicode_decimal: 59802, + }, + { + icon_id: '1445027', + name: 'opera', + font_class: 'opera', + unicode: 'ea9a', + unicode_decimal: 60058, + }, + { + icon_id: '1445283', + name: 'shuffle-variant', + font_class: 'shuffle-variant', + unicode: 'eb9a', + unicode_decimal: 60314, + }, + { + icon_id: '1445540', + name: 'video-switch', + font_class: 'video-switch', + unicode: 'ec9a', + unicode_decimal: 60570, + }, + { + icon_id: '1444001', + name: 'battery-80', + font_class: 'battery-7', + unicode: 'e69b', + unicode_decimal: 59035, + }, + { + icon_id: '1444258', + name: 'close-octagon-outline', + font_class: 'close-octagon-outline', + unicode: 'e79b', + unicode_decimal: 59291, + }, + { + icon_id: '1444515', + name: 'file-xml', + font_class: 'file-xml', + unicode: 'e89b', + unicode_decimal: 59547, + }, + { + icon_id: '1444772', + name: 'incognito', + font_class: 'incognito', + unicode: 'e99b', + unicode_decimal: 59803, + }, + { + icon_id: '1445028', + name: 'ornament', + font_class: 'ornament', + unicode: 'ea9b', + unicode_decimal: 60059, + }, + { + icon_id: '1445284', + name: 'shape-rectangle-plus', + font_class: 'shape-rectangle-plus', + unicode: 'eb9b', + unicode_decimal: 60315, + }, + { + icon_id: '1445541', + name: 'view-agenda', + font_class: 'view-agenda', + unicode: 'ec9b', + unicode_decimal: 60571, + }, + { + icon_id: '1444002', + name: 'battery-90', + font_class: 'battery-8', + unicode: 'e69c', + unicode_decimal: 59036, + }, + { + icon_id: '1444259', + name: 'cloud-check', + font_class: 'cloud-check', + unicode: 'e79c', + unicode_decimal: 59292, + }, + { + icon_id: '1444516', + name: 'film', + font_class: 'film', + unicode: 'e89c', + unicode_decimal: 59548, + }, + { + icon_id: '1444773', + name: 'inbox-arrow-up', + font_class: 'inbox-arrow-up', + unicode: 'e99c', + unicode_decimal: 59804, + }, + { + icon_id: '1445029', + name: 'ornament-variant', + font_class: 'ornament-variant', + unicode: 'ea9c', + unicode_decimal: 60060, + }, + { + icon_id: '1445285', + name: 'shield-outline', + font_class: 'shield-outline', + unicode: 'eb9c', + unicode_decimal: 60316, + }, + { + icon_id: '1445542', + name: 'view-array', + font_class: 'view-array', + unicode: 'ec9c', + unicode_decimal: 60572, + }, + { + icon_id: '1444003', + name: 'battery-charging-20', + font_class: 'battery-charging-', + unicode: 'e69d', + unicode_decimal: 59037, + }, + { + icon_id: '1444260', + name: 'cloud-download', + font_class: 'cloud-download', + unicode: 'e79d', + unicode_decimal: 59293, + }, + { + icon_id: '1444517', + name: 'filmstrip', + font_class: 'filmstrip', + unicode: 'e89d', + unicode_decimal: 59549, + }, + { + icon_id: '1444774', + name: 'infinity', + font_class: 'infinity', + unicode: 'e99d', + unicode_decimal: 59805, + }, + { + icon_id: '1445030', + name: 'owl', + font_class: 'owl', + unicode: 'ea9d', + unicode_decimal: 60061, + }, + { + icon_id: '1445286', + name: 'sigma', + font_class: 'sigma', + unicode: 'eb9d', + unicode_decimal: 60317, + }, + { + icon_id: '1445543', + name: 'view-carousel', + font_class: 'view-carousel', + unicode: 'ec9d', + unicode_decimal: 60573, + }, + { + icon_id: '1444004', + name: 'battery-alert', + font_class: 'battery-alert', + unicode: 'e69e', + unicode_decimal: 59038, + }, + { + icon_id: '1444261', + name: 'cloud-outline-off', + font_class: 'cloud-outline-off', + unicode: 'e79e', + unicode_decimal: 59294, + }, + { + icon_id: '1444518', + name: 'filmstrip-off', + font_class: 'filmstrip-off', + unicode: 'e89e', + unicode_decimal: 59550, + }, + { + icon_id: '1444775', + name: 'information-outline', + font_class: 'information-outline', + unicode: 'e99e', + unicode_decimal: 59806, + }, + { + icon_id: '1445031', + name: 'package', + font_class: 'package', + unicode: 'ea9e', + unicode_decimal: 60062, + }, + { + icon_id: '1445287', + name: 'sigma-lower', + font_class: 'sigma-lower', + unicode: 'eb9e', + unicode_decimal: 60318, + }, + { + icon_id: '1445544', + name: 'view-column', + font_class: 'view-column', + unicode: 'ec9e', + unicode_decimal: 60574, + }, + { + icon_id: '1444005', + name: 'battery-charging', + font_class: 'battery-charging', + unicode: 'e69f', + unicode_decimal: 59039, + }, + { + icon_id: '1444262', + name: 'cloud-outline', + font_class: 'cloud-outline', + unicode: 'e79f', + unicode_decimal: 59295, + }, + { + icon_id: '1444519', + name: 'filter', + font_class: 'filter', + unicode: 'e89f', + unicode_decimal: 59551, + }, + { + icon_id: '1444776', + name: 'information', + font_class: 'information', + unicode: 'e99f', + unicode_decimal: 59807, + }, + { + icon_id: '1445032', + name: 'package-down', + font_class: 'package-down', + unicode: 'ea9f', + unicode_decimal: 60063, + }, + { + icon_id: '1445288', + name: 'signal', + font_class: 'signal', + unicode: 'eb9f', + unicode_decimal: 60319, + }, + { + icon_id: '1445545', + name: 'view-dashboard', + font_class: 'view-dashboard', + unicode: 'ec9f', + unicode_decimal: 60575, + }, + { + icon_id: '1444006', + name: 'battery-charging-30', + font_class: 'battery-charging-1', + unicode: 'e6a0', + unicode_decimal: 59040, + }, + { + icon_id: '1444263', + name: 'cloud-circle', + font_class: 'cloud-circle', + unicode: 'e7a0', + unicode_decimal: 59296, + }, + { + icon_id: '1444520', + name: 'filter-remove', + font_class: 'filter-remove', + unicode: 'e8a0', + unicode_decimal: 59552, + }, + { + icon_id: '1444777', + name: 'information-variant', + font_class: 'information-variant', + unicode: 'e9a0', + unicode_decimal: 59808, + }, + { + icon_id: '1445033', + name: 'package-up', + font_class: 'package-up', + unicode: 'eaa0', + unicode_decimal: 60064, + }, + { + icon_id: '1445289', + name: 'signal-2g', + font_class: 'signal-g', + unicode: 'eba0', + unicode_decimal: 60320, + }, + { + icon_id: '1445546', + name: 'view-day', + font_class: 'view-day', + unicode: 'eca0', + unicode_decimal: 60576, + }, + { + icon_id: '1444007', + name: 'battery-charging-60', + font_class: 'battery-charging-2', + unicode: 'e6a1', + unicode_decimal: 59041, + }, + { + icon_id: '1444264', + name: 'cloud-print', + font_class: 'cloud-print', + unicode: 'e7a1', + unicode_decimal: 59297, + }, + { + icon_id: '1444521', + name: 'filter-remove-outline', + font_class: 'filter-remove-outline', + unicode: 'e8a1', + unicode_decimal: 59553, + }, + { + icon_id: '1444778', + name: 'instagram', + font_class: 'instagram', + unicode: 'e9a1', + unicode_decimal: 59809, + }, + { + icon_id: '1445034', + name: 'package-variant', + font_class: 'package-variant', + unicode: 'eaa1', + unicode_decimal: 60065, + }, + { + icon_id: '1445290', + name: 'signal-4g', + font_class: 'signal-g1', + unicode: 'eba1', + unicode_decimal: 60321, + }, + { + icon_id: '1445547', + name: 'view-list', + font_class: 'view-list', + unicode: 'eca1', + unicode_decimal: 60577, + }, + ], +}; diff --git a/src/components/Yunzhupaas/IconPicker/data/ymIcon.ts b/src/components/Yunzhupaas/IconPicker/data/ymIcon.ts new file mode 100644 index 0000000..b8f8060 --- /dev/null +++ b/src/components/Yunzhupaas/IconPicker/data/ymIcon.ts @@ -0,0 +1,4405 @@ +export const ymIconJson = { + id: '3271933', + name: 'YUNZHUPAAS-ym', + font_family: 'icon-ym', + css_prefix_text: 'icon-ym-', + description: '', + glyphs: [ + { + icon_id: '43445533', + name: 'ai', + font_class: 'ai', + unicode: 'e97a', + unicode_decimal: 59770, + }, + { + icon_id: '43147680', + name: 'harmonyOS', + font_class: 'harmonyOS', + unicode: 'e979', + unicode_decimal: 59769, + }, + { + icon_id: '42704068', + name: 'flow-node-paste', + font_class: 'flow-node-paste', + unicode: 'e974', + unicode_decimal: 59764, + }, + { + icon_id: '42704067', + name: 'flow-node-parallel', + font_class: 'flow-node-parallel', + unicode: 'e975', + unicode_decimal: 59765, + }, + { + icon_id: '42704065', + name: 'flow-node-copy', + font_class: 'flow-node-copy', + unicode: 'e976', + unicode_decimal: 59766, + }, + { + icon_id: '42704063', + name: 'ai-list', + font_class: 'ai-list', + unicode: 'e977', + unicode_decimal: 59767, + }, + { + icon_id: '42704064', + name: 'flow-node-condition-multiple', + font_class: 'flow-node-condition-multiple', + unicode: 'e978', + unicode_decimal: 59768, + }, + { + icon_id: '42704071', + name: 'flow-node-cope', + font_class: 'flow-node-cope', + unicode: 'e96f', + unicode_decimal: 59759, + }, + { + icon_id: '42704072', + name: 'select-cell', + font_class: 'select-cell', + unicode: 'e970', + unicode_decimal: 59760, + }, + { + icon_id: '42704070', + name: 'flow-node-condition-single', + font_class: 'flow-node-condition-single', + unicode: 'e971', + unicode_decimal: 59761, + }, + { + icon_id: '42704069', + name: 'shortcut', + font_class: 'shortcut1', + unicode: 'e972', + unicode_decimal: 59762, + }, + { + icon_id: '42704066', + name: 'ai-form', + font_class: 'ai-form', + unicode: 'e973', + unicode_decimal: 59763, + }, + { + icon_id: '41731344', + name: 'right-join', + font_class: 'right-join', + unicode: 'e96b', + unicode_decimal: 59755, + }, + { + icon_id: '41731343', + name: 'left-join', + font_class: 'left-join', + unicode: 'e96c', + unicode_decimal: 59756, + }, + { + icon_id: '41731342', + name: 'inner-join', + font_class: 'inner-join', + unicode: 'e96d', + unicode_decimal: 59757, + }, + { + icon_id: '41731341', + name: 'full-join', + font_class: 'full-join', + unicode: 'e96e', + unicode_decimal: 59758, + }, + { + icon_id: '41725080', + name: 'flow-trigger-timer', + font_class: 'flow-trigger-timer', + unicode: 'e968', + unicode_decimal: 59752, + }, + { + icon_id: '41725081', + name: 'flow-trigger-event', + font_class: 'flow-trigger-event', + unicode: 'e969', + unicode_decimal: 59753, + }, + { + icon_id: '41725079', + name: 'dataLog', + font_class: 'dataLog', + unicode: 'e96a', + unicode_decimal: 59754, + }, + { + icon_id: '41725087', + name: 'save', + font_class: 'save', + unicode: 'e962', + unicode_decimal: 59746, + }, + { + icon_id: '41725086', + name: 'flow-view', + font_class: 'flow-view', + unicode: 'e963', + unicode_decimal: 59747, + }, + { + icon_id: '41725085', + name: 'batch-action', + font_class: 'batch-action', + unicode: 'e964', + unicode_decimal: 59748, + }, + { + icon_id: '41725083', + name: 'print-template', + font_class: 'print-template', + unicode: 'e965', + unicode_decimal: 59749, + }, + { + icon_id: '41725084', + name: 'flow-trigger-webhook', + font_class: 'flow-trigger-webhook', + unicode: 'e966', + unicode_decimal: 59750, + }, + { + icon_id: '41725082', + name: 'flow-trigger-notice', + font_class: 'flow-trigger-notice', + unicode: 'e967', + unicode_decimal: 59751, + }, + { + icon_id: '41725203', + name: 'kit', + font_class: 'kit', + unicode: 'e960', + unicode_decimal: 59744, + }, + { + icon_id: '41725202', + name: 'kit-fill', + font_class: 'kit-fill', + unicode: 'e961', + unicode_decimal: 59745, + }, + { + icon_id: '40617816', + name: 'tip', + font_class: 'tip', + unicode: 'e934', + unicode_decimal: 59700, + }, + { + icon_id: '40617814', + name: 'flow-minus', + font_class: 'flow-minus', + unicode: 'e935', + unicode_decimal: 59701, + }, + { + icon_id: '40617813', + name: 'flow-history', + font_class: 'flow-history', + unicode: 'e936', + unicode_decimal: 59702, + }, + { + icon_id: '40617815', + name: 'flow-align-middle', + font_class: 'flow-align-middle', + unicode: 'e938', + unicode_decimal: 59704, + }, + { + icon_id: '40617812', + name: 'flow-align-bottom', + font_class: 'flow-align-bottom', + unicode: 'e93c', + unicode_decimal: 59708, + }, + { + icon_id: '40617808', + name: 'beautify-horizontal', + font_class: 'beautify-horizontal', + unicode: 'e949', + unicode_decimal: 59721, + }, + { + icon_id: '40617811', + name: 'flow-aerial-view', + font_class: 'flow-aerial-view', + unicode: 'e94a', + unicode_decimal: 59722, + }, + { + icon_id: '40617810', + name: 'flow-align-center', + font_class: 'flow-align-center', + unicode: 'e950', + unicode_decimal: 59728, + }, + { + icon_id: '40617809', + name: 'beautify-vertical', + font_class: 'beautify-vertical', + unicode: 'e954', + unicode_decimal: 59732, + }, + { + icon_id: '40617829', + name: 'flow-align-left', + font_class: 'flow-align-left', + unicode: 'e90a', + unicode_decimal: 59658, + }, + { + icon_id: '40617828', + name: 'flow-selection', + font_class: 'flow-selection', + unicode: 'e911', + unicode_decimal: 59665, + }, + { + icon_id: '40617825', + name: 'flow-node-timer1', + font_class: 'flow-node-timer1', + unicode: 'e915', + unicode_decimal: 59669, + }, + { + icon_id: '40617827', + name: 'flow-shortcut', + font_class: 'flow-shortcut', + unicode: 'e91d', + unicode_decimal: 59677, + }, + { + icon_id: '40617826', + name: 'flow-focus', + font_class: 'flow-focus', + unicode: 'e922', + unicode_decimal: 59682, + }, + { + icon_id: '40617821', + name: 'flow-node-approve', + font_class: 'flow-node-approve', + unicode: 'e923', + unicode_decimal: 59683, + }, + { + icon_id: '40617822', + name: 'flow-plus', + font_class: 'flow-plus', + unicode: 'e925', + unicode_decimal: 59685, + }, + { + icon_id: '40617823', + name: 'flow-node-system-task', + font_class: 'flow-node-system-task', + unicode: 'e927', + unicode_decimal: 59687, + }, + { + icon_id: '40617824', + name: 'flow-move', + font_class: 'flow-move', + unicode: 'e92b', + unicode_decimal: 59691, + }, + { + icon_id: '40617818', + name: 'flow-align-let', + font_class: 'flow-align-let', + unicode: 'e92c', + unicode_decimal: 59692, + }, + { + icon_id: '40617820', + name: 'redo', + font_class: 'redo', + unicode: 'e92d', + unicode_decimal: 59693, + }, + { + icon_id: '40617819', + name: 'flow-align-right', + font_class: 'flow-align-right', + unicode: 'e930', + unicode_decimal: 59696, + }, + { + icon_id: '40617817', + name: 'undo', + font_class: 'undo', + unicode: 'e932', + unicode_decimal: 59698, + }, + { + icon_id: '40617830', + name: 'flow-align-top', + font_class: 'flow-align-top', + unicode: 'e904', + unicode_decimal: 59652, + }, + { + icon_id: '40432716', + name: 'hLine', + font_class: 'hLine', + unicode: 'e951', + unicode_decimal: 59729, + }, + { + icon_id: '40432715', + name: 'vLine', + font_class: 'vLine', + unicode: 'e953', + unicode_decimal: 59731, + }, + { + icon_id: '40430740', + name: 'header-notice', + font_class: 'header-notice', + unicode: 'e95f', + unicode_decimal: 59743, + }, + { + icon_id: '40430745', + name: 'header-fullscreen', + font_class: 'header-fullscreen1', + unicode: 'e917', + unicode_decimal: 59671, + }, + { + icon_id: '40430741', + name: 'cell', + font_class: 'cell', + unicode: 'e928', + unicode_decimal: 59688, + }, + { + icon_id: '40430751', + name: 'header-search', + font_class: 'header-search', + unicode: 'e92e', + unicode_decimal: 59694, + }, + { + icon_id: '40430750', + name: 'header-config', + font_class: 'header-config', + unicode: 'e92f', + unicode_decimal: 59695, + }, + { + icon_id: '40430744', + name: 'header-fullscreen-exit', + font_class: 'header-fullscreen-exit1', + unicode: 'e956', + unicode_decimal: 59734, + }, + { + icon_id: '40430746', + name: 'flowToSign', + font_class: 'flowToSign', + unicode: 'e95d', + unicode_decimal: 59741, + }, + { + icon_id: '40430742', + name: 'flowDoing', + font_class: 'flowDoing', + unicode: 'e95e', + unicode_decimal: 59742, + }, + { + icon_id: '40430754', + name: 'header-chat', + font_class: 'header-chat', + unicode: 'e907', + unicode_decimal: 59655, + }, + { + icon_id: '40430752', + name: 'header-sys-toggle', + font_class: 'header-sys-toggle', + unicode: 'e90d', + unicode_decimal: 59661, + }, + { + icon_id: '40430753', + name: 'schedule', + font_class: 'schedule', + unicode: 'e910', + unicode_decimal: 59664, + }, + { + icon_id: '40346908', + name: 'caret-left', + font_class: 'caret-left', + unicode: 'e95c', + unicode_decimal: 59740, + }, + { + icon_id: '40346911', + name: 'btn-export1', + font_class: 'btn-export1', + unicode: 'e959', + unicode_decimal: 59737, + }, + { + icon_id: '40346910', + name: 'caret-right', + font_class: 'caret-right', + unicode: 'e95a', + unicode_decimal: 59738, + }, + { + icon_id: '40346909', + name: 'btn-import1', + font_class: 'btn-import1', + unicode: 'e95b', + unicode_decimal: 59739, + }, + { + icon_id: '40197063', + name: 'rect', + font_class: 'rect', + unicode: 'e955', + unicode_decimal: 59733, + }, + { + icon_id: '40197060', + name: 'combination', + font_class: 'combination', + unicode: 'e957', + unicode_decimal: 59735, + }, + { + icon_id: '40197061', + name: 'oval', + font_class: 'oval', + unicode: 'e958', + unicode_decimal: 59736, + }, + { + icon_id: '40149927', + name: 'header-star-fill', + font_class: 'header-star-fill', + unicode: 'e952', + unicode_decimal: 59730, + }, + { + icon_id: '39938229', + name: 'flow-node-subFlow', + font_class: 'flow-node-subFlow', + unicode: 'e93a', + unicode_decimal: 59706, + }, + { + icon_id: '39938230', + name: 'flow-node-end', + font_class: 'flow-node-end', + unicode: 'e93d', + unicode_decimal: 59709, + }, + { + icon_id: '39938226', + name: 'flow-node-branch', + font_class: 'flow-node-branch', + unicode: 'e943', + unicode_decimal: 59715, + }, + { + icon_id: '39938238', + name: 'flow-node-condition', + font_class: 'flow-node-condition', + unicode: 'e919', + unicode_decimal: 59673, + }, + { + icon_id: '39938233', + name: 'flow-node-timer', + font_class: 'flow-node-timer', + unicode: 'e92a', + unicode_decimal: 59690, + }, + { + icon_id: '39938231', + name: 'flow-node-interflow', + font_class: 'flow-node-interflow', + unicode: 'e933', + unicode_decimal: 59699, + }, + { + icon_id: '39918743', + name: 'recovery', + font_class: 'recovery', + unicode: 'e94f', + unicode_decimal: 59727, + }, + { + icon_id: '39917975', + name: 'share-cancel', + font_class: 'share-cancel', + unicode: 'e94e', + unicode_decimal: 59726, + }, + { + icon_id: '39909379', + name: 'upload1', + font_class: 'upload1', + unicode: 'e91f', + unicode_decimal: 59679, + }, + { + icon_id: '39909378', + name: 'add-folder', + font_class: 'add-folder', + unicode: 'e94d', + unicode_decimal: 59725, + }, + { + icon_id: '39895472', + name: 'tile-mode', + font_class: 'tile-mode', + unicode: 'e94b', + unicode_decimal: 59723, + }, + { + icon_id: '39895471', + name: 'folder', + font_class: 'folder', + unicode: 'e94c', + unicode_decimal: 59724, + }, + { + icon_id: '39830540', + name: 'app-more', + font_class: 'app-more', + unicode: 'e916', + unicode_decimal: 59670, + }, + { + icon_id: '39830546', + name: 'add-cancel', + font_class: 'add-cancel', + unicode: 'e940', + unicode_decimal: 59712, + }, + { + icon_id: '39829402', + name: 'app-rename', + font_class: 'app-rename', + unicode: 'e941', + unicode_decimal: 59713, + }, + { + icon_id: '39829414', + name: 'flow-node-start', + font_class: 'flow-node-start', + unicode: 'e942', + unicode_decimal: 59714, + }, + { + icon_id: '39829405', + name: 'app-role-toggle', + font_class: 'app-role-toggle', + unicode: 'e944', + unicode_decimal: 59716, + }, + { + icon_id: '39829399', + name: 'auth-group', + font_class: 'auth-group', + unicode: 'e945', + unicode_decimal: 59717, + }, + { + icon_id: '39829403', + name: 'app-delete', + font_class: 'app-delete', + unicode: 'e946', + unicode_decimal: 59718, + }, + { + icon_id: '39829408', + name: 'app-share', + font_class: 'app-share', + unicode: 'e947', + unicode_decimal: 59719, + }, + { + icon_id: '39829406', + name: 'app-schedule', + font_class: 'app-schedule', + unicode: 'e948', + unicode_decimal: 59720, + }, + { + icon_id: '39829421', + name: 'dark', + font_class: 'dark', + unicode: 'e937', + unicode_decimal: 59703, + }, + { + icon_id: '39829419', + name: 'app-todo', + font_class: 'app-todo', + unicode: 'e939', + unicode_decimal: 59705, + }, + { + icon_id: '39829407', + name: 'app-download', + font_class: 'app-download', + unicode: 'e93b', + unicode_decimal: 59707, + }, + { + icon_id: '39829401', + name: 'app-move', + font_class: 'app-move', + unicode: 'e93e', + unicode_decimal: 59710, + }, + { + icon_id: '39829409', + name: 'app-document', + font_class: 'app-document', + unicode: 'e93f', + unicode_decimal: 59711, + }, + { + icon_id: '39829441', + name: 'header-star', + font_class: 'header-star', + unicode: 'e929', + unicode_decimal: 59689, + }, + { + icon_id: '39829432', + name: 'msg-read-all', + font_class: 'msg-read-all', + unicode: 'e931', + unicode_decimal: 59697, + }, + { + icon_id: '39829449', + name: 'more-vertical', + font_class: 'more-vertical', + unicode: 'e91e', + unicode_decimal: 59678, + }, + { + icon_id: '39829447', + name: 'more', + font_class: 'more', + unicode: 'e920', + unicode_decimal: 59680, + }, + { + icon_id: '39829436', + name: 'header-fullscreen', + font_class: 'header-fullscreen', + unicode: 'e921', + unicode_decimal: 59681, + }, + { + icon_id: '39829440', + name: 'nav-home-fill', + font_class: 'nav-home-fill', + unicode: 'e924', + unicode_decimal: 59684, + }, + { + icon_id: '39829444', + name: 'tip-filled', + font_class: 'tip-filled', + unicode: 'e926', + unicode_decimal: 59686, + }, + { + icon_id: '39829427', + name: 'flow-line', + font_class: 'flow-line', + unicode: 'e912', + unicode_decimal: 59666, + }, + { + icon_id: '39829451', + name: 'header-refresh', + font_class: 'header-refresh', + unicode: 'e913', + unicode_decimal: 59667, + }, + { + icon_id: '39829457', + name: 'shareMe-filled', + font_class: 'shareMe-filled', + unicode: 'e914', + unicode_decimal: 59668, + }, + { + icon_id: '39829452', + name: 'share-filled', + font_class: 'share-filled', + unicode: 'e918', + unicode_decimal: 59672, + }, + { + icon_id: '39829453', + name: 'trash-filled', + font_class: 'trash-filled', + unicode: 'e91a', + unicode_decimal: 59674, + }, + { + icon_id: '39829450', + name: 'header-lang', + font_class: 'header-lang', + unicode: 'e91b', + unicode_decimal: 59675, + }, + { + icon_id: '39829412', + name: 'app-entrust', + font_class: 'app-entrust', + unicode: 'e91c', + unicode_decimal: 59676, + }, + { + icon_id: '39829461', + name: 'release', + font_class: 'release', + unicode: 'e90e', + unicode_decimal: 59662, + }, + { + icon_id: '39829456', + name: 'star-filled', + font_class: 'star-filled', + unicode: 'e90f', + unicode_decimal: 59663, + }, + { + icon_id: '39829463', + name: 'header-role-toggle', + font_class: 'header-role-toggle', + unicode: 'e906', + unicode_decimal: 59654, + }, + { + icon_id: '39829464', + name: 'light', + font_class: 'light', + unicode: 'e908', + unicode_decimal: 59656, + }, + { + icon_id: '39829459', + name: 'header-fullscreen-exit', + font_class: 'header-fullscreen-exit', + unicode: 'e909', + unicode_decimal: 59657, + }, + { + icon_id: '39829462', + name: 'org-tree', + font_class: 'org-tree', + unicode: 'e90b', + unicode_decimal: 59659, + }, + { + icon_id: '39829397', + name: 'app-checkAll', + font_class: 'app-checkAll', + unicode: 'e90c', + unicode_decimal: 59660, + }, + { + icon_id: '39829466', + name: 'thumb-mode', + font_class: 'thumb-mode', + unicode: 'e905', + unicode_decimal: 59653, + }, + { + icon_id: '39664514', + name: 'generator-steps', + font_class: 'generator-steps', + unicode: 'e7ed', + unicode_decimal: 59373, + }, + { + icon_id: '39661024', + name: 'portal-custom-echart', + font_class: 'portal-custom-echart', + unicode: 'e903', + unicode_decimal: 59651, + }, + { + icon_id: '39339289', + name: 'signature1', + font_class: 'signature1', + unicode: 'e902', + unicode_decimal: 59650, + }, + { + icon_id: '38073409', + name: 'launch', + font_class: 'launch', + unicode: 'e901', + unicode_decimal: 59649, + }, + { + icon_id: '37913881', + name: 'turn', + font_class: 'turn', + unicode: 'e8fa', + unicode_decimal: 59642, + }, + { + icon_id: '37913880', + name: 'roll-call', + font_class: 'roll-call', + unicode: 'e8fb', + unicode_decimal: 59643, + }, + { + icon_id: '37913879', + name: 'comment-img', + font_class: 'comment-img', + unicode: 'e8fc', + unicode_decimal: 59644, + }, + { + icon_id: '37913878', + name: 'condition', + font_class: 'condition', + unicode: 'e8fd', + unicode_decimal: 59645, + }, + { + icon_id: '37913876', + name: 'generator-iframe', + font_class: 'generator-iframe', + unicode: 'e8fe', + unicode_decimal: 59646, + }, + { + icon_id: '37913877', + name: 'edit', + font_class: 'edit', + unicode: 'e8ff', + unicode_decimal: 59647, + }, + { + icon_id: '37913875', + name: 'comment-file', + font_class: 'comment-file', + unicode: 'e900', + unicode_decimal: 59648, + }, + { + icon_id: '37913884', + name: 'emoji', + font_class: 'emoji', + unicode: 'e8f7', + unicode_decimal: 59639, + }, + { + icon_id: '37913883', + name: 'generator-location', + font_class: 'generator-location', + unicode: 'e8f8', + unicode_decimal: 59640, + }, + { + icon_id: '37913882', + name: 'chat', + font_class: 'chat', + unicode: 'e8f9', + unicode_decimal: 59641, + }, + { + icon_id: '37442290', + name: 'synForThird', + font_class: 'synForThird', + unicode: 'e8f6', + unicode_decimal: 59638, + }, + { + icon_id: '36578616', + name: 'authGroup', + font_class: 'authGroup', + unicode: 'e8f2', + unicode_decimal: 59634, + }, + { + icon_id: '36578614', + name: 'fail', + font_class: 'fail', + unicode: 'e8f3', + unicode_decimal: 59635, + }, + { + icon_id: '36578615', + name: 'success', + font_class: 'success', + unicode: 'e8f4', + unicode_decimal: 59636, + }, + { + icon_id: '36578613', + name: 'clock', + font_class: 'clock', + unicode: 'e8f5', + unicode_decimal: 59637, + }, + { + icon_id: '35394200', + name: 'view', + font_class: 'view', + unicode: 'e8f1', + unicode_decimal: 59633, + }, + { + icon_id: '35388007', + name: 'shortcut', + font_class: 'shortcut', + unicode: 'e8f0', + unicode_decimal: 59632, + }, + { + icon_id: '35085997', + name: 'liveData', + font_class: 'liveData', + unicode: 'e8ef', + unicode_decimal: 59631, + }, + { + icon_id: '34573599', + name: 'generator-autoComplete', + font_class: 'generator-autoComplete', + unicode: 'e8eb', + unicode_decimal: 59627, + }, + { + icon_id: '34573600', + name: 'contacts', + font_class: 'contacts', + unicode: 'e8ec', + unicode_decimal: 59628, + }, + { + icon_id: '34573601', + name: 'portal-text', + font_class: 'portal-text', + unicode: 'e8ed', + unicode_decimal: 59629, + }, + { + icon_id: '34573602', + name: 'portal-mapChart', + font_class: 'portal-mapChart', + unicode: 'e8ee', + unicode_decimal: 59630, + }, + { + icon_id: '34465802', + name: 'generator-tableGrid', + font_class: 'generator-tableGrid', + unicode: 'e8db', + unicode_decimal: 59611, + }, + { + icon_id: '34465803', + name: 'portal-card', + font_class: 'portal-card', + unicode: 'e8dc', + unicode_decimal: 59612, + }, + { + icon_id: '34465804', + name: 'portal-carousel', + font_class: 'portal-carousel', + unicode: 'e8dd', + unicode_decimal: 59613, + }, + { + icon_id: '34465805', + name: 'generator-insertCol', + font_class: 'generator-insertCol', + unicode: 'e8de', + unicode_decimal: 59614, + }, + { + icon_id: '34465806', + name: 'generator-insertRow', + font_class: 'generator-insertRow', + unicode: 'e8df', + unicode_decimal: 59615, + }, + { + icon_id: '34465807', + name: 'btn-batch', + font_class: 'btn-batch', + unicode: 'e8e0', + unicode_decimal: 59616, + }, + { + icon_id: '34465808', + name: 'portal-collapse', + font_class: 'portal-collapse', + unicode: 'e8e1', + unicode_decimal: 59617, + }, + { + icon_id: '34465809', + name: 'portal-rankList', + font_class: 'portal-rankList', + unicode: 'e8e2', + unicode_decimal: 59618, + }, + { + icon_id: '34465810', + name: 'portal-image', + font_class: 'portal-image', + unicode: 'e8e3', + unicode_decimal: 59619, + }, + { + icon_id: '34465811', + name: 'portal-tab', + font_class: 'portal-tab', + unicode: 'e8e4', + unicode_decimal: 59620, + }, + { + icon_id: '34465812', + name: 'portal-video', + font_class: 'portal-video', + unicode: 'e8e5', + unicode_decimal: 59621, + }, + { + icon_id: '34465813', + name: 'generator-TableSettings', + font_class: 'generator-TableSettings', + unicode: 'e8e6', + unicode_decimal: 59622, + }, + { + icon_id: '34465814', + name: 'btn-common', + font_class: 'btn-common', + unicode: 'e8e7', + unicode_decimal: 59623, + }, + { + icon_id: '34465815', + name: 'portal-iframe', + font_class: 'portal-iframe', + unicode: 'e8e8', + unicode_decimal: 59624, + }, + { + icon_id: '34465816', + name: 'portal-timeAxis', + font_class: 'portal-timeAxis', + unicode: 'e8e9', + unicode_decimal: 59625, + }, + { + icon_id: '34465817', + name: 'portal-schedule', + font_class: 'portal-schedule', + unicode: 'e8ea', + unicode_decimal: 59626, + }, + { + icon_id: '32732986', + name: 'flowEntrust-app', + font_class: 'flowEntrust-app', + unicode: 'e8da', + unicode_decimal: 59610, + }, + { + icon_id: '32473793', + name: 'btn-download', + font_class: 'btn-download', + unicode: 'e8d9', + unicode_decimal: 59609, + }, + { + icon_id: '32450926', + name: 'btn-upload', + font_class: 'btn-upload', + unicode: 'e8d7', + unicode_decimal: 59607, + }, + { + icon_id: '32440940', + name: 'right', + font_class: 'right', + unicode: 'e8d4', + unicode_decimal: 59604, + }, + { + icon_id: '32440941', + name: 'left', + font_class: 'left', + unicode: 'e8d5', + unicode_decimal: 59605, + }, + { + icon_id: '32440942', + name: 'arrow-down', + font_class: 'arrow-down', + unicode: 'e8d6', + unicode_decimal: 59606, + }, + { + icon_id: '32440944', + name: 'add-flow', + font_class: 'add-flow', + unicode: 'e8d8', + unicode_decimal: 59608, + }, + { + icon_id: '31997659', + name: 'launchFlow', + font_class: 'launchFlow', + unicode: 'e8d2', + unicode_decimal: 59602, + }, + { + icon_id: '31997660', + name: 'funcFlow', + font_class: 'funcFlow', + unicode: 'e8d3', + unicode_decimal: 59603, + }, + { + icon_id: '31355272', + name: 'accountConfig', + font_class: 'accountConfig', + unicode: 'e8cb', + unicode_decimal: 59595, + }, + { + icon_id: '31355273', + name: 'sendConfig', + font_class: 'sendConfig', + unicode: 'e8cc', + unicode_decimal: 59596, + }, + { + icon_id: '31355274', + name: 'smsConfig', + font_class: 'smsConfig', + unicode: 'e8cd', + unicode_decimal: 59597, + }, + { + icon_id: '31355275', + name: 'emailConfig', + font_class: 'emailConfig', + unicode: 'e8ce', + unicode_decimal: 59598, + }, + { + icon_id: '31355276', + name: 'msgCenter', + font_class: 'msgCenter', + unicode: 'e8cf', + unicode_decimal: 59599, + }, + { + icon_id: '31355277', + name: 'msgTemplate', + font_class: 'msgTemplate', + unicode: 'e8d0', + unicode_decimal: 59600, + }, + { + icon_id: '31355278', + name: 'msgMonitor', + font_class: 'msgMonitor', + unicode: 'e8d1', + unicode_decimal: 59601, + }, + { + icon_id: '31353254', + name: 'logo-webhook', + font_class: 'logo-webhook', + unicode: 'e8ca', + unicode_decimal: 59594, + }, + { + icon_id: '30714846', + name: 'logo-github', + font_class: 'logo-github', + unicode: 'e8b0', + unicode_decimal: 59568, + }, + { + icon_id: '30714847', + name: 'logo-feishu', + font_class: 'logo-feishu', + unicode: 'e8c5', + unicode_decimal: 59589, + }, + { + icon_id: '30714848', + name: 'logo-dingding', + font_class: 'logo-dingding', + unicode: 'e8c6', + unicode_decimal: 59590, + }, + { + icon_id: '30714849', + name: 'logo-wechat', + font_class: 'logo-wechat', + unicode: 'e8c7', + unicode_decimal: 59591, + }, + { + icon_id: '30714850', + name: 'logo-qq', + font_class: 'logo-qq', + unicode: 'e8c8', + unicode_decimal: 59592, + }, + { + icon_id: '30714851', + name: 'logo-wxWork', + font_class: 'logo-wxWork', + unicode: 'e8c9', + unicode_decimal: 59593, + }, + { + icon_id: '30244876', + name: 'position1', + font_class: 'position1', + unicode: 'e8c3', + unicode_decimal: 59587, + }, + { + icon_id: '30244877', + name: 'generator-popupTableSelect', + font_class: 'generator-popupTableSelect', + unicode: 'e8c4', + unicode_decimal: 59588, + }, + { + icon_id: '30164688', + name: 'gradeManage', + font_class: 'gradeManage', + unicode: 'e8c2', + unicode_decimal: 59586, + }, + { + icon_id: '29877000', + name: 'fold', + font_class: 'fold', + unicode: 'e829', + unicode_decimal: 59433, + }, + { + icon_id: '29877001', + name: 'customForm', + font_class: 'customForm', + unicode: 'e857', + unicode_decimal: 59479, + }, + { + icon_id: '29877003', + name: 'branch', + font_class: 'branch', + unicode: 'e8b1', + unicode_decimal: 59569, + }, + { + icon_id: '29877004', + name: 'codeGeneration1', + font_class: 'codeGeneration1', + unicode: 'e8b2', + unicode_decimal: 59570, + }, + { + icon_id: '29877005', + name: 'filter', + font_class: 'filter', + unicode: 'e8b3', + unicode_decimal: 59571, + }, + { + icon_id: '29877006', + name: 'download', + font_class: 'download', + unicode: 'e8b4', + unicode_decimal: 59572, + }, + { + icon_id: '29877007', + name: 'functionForm', + font_class: 'functionForm', + unicode: 'e8b5', + unicode_decimal: 59573, + }, + { + icon_id: '29877008', + name: 'unfold', + font_class: 'unfold', + unicode: 'e8b6', + unicode_decimal: 59574, + }, + { + icon_id: '29877009', + name: 'node', + font_class: 'node', + unicode: 'e8b7', + unicode_decimal: 59575, + }, + { + icon_id: '29877010', + name: 'nav-home', + font_class: 'nav-home', + unicode: 'e8b8', + unicode_decimal: 59576, + }, + { + icon_id: '29877011', + name: 'systemForm', + font_class: 'systemForm', + unicode: 'e8b9', + unicode_decimal: 59577, + }, + { + icon_id: '29877012', + name: 'generator-link', + font_class: 'generator-link', + unicode: 'e8ba', + unicode_decimal: 59578, + }, + { + icon_id: '29877013', + name: 'timer', + font_class: 'timer', + unicode: 'e8bb', + unicode_decimal: 59579, + }, + { + icon_id: '29877014', + name: 'generator-alert', + font_class: 'generator-alert', + unicode: 'e8bc', + unicode_decimal: 59580, + }, + { + icon_id: '29877015', + name: 'generator-group', + font_class: 'generator-group1', + unicode: 'e8bd', + unicode_decimal: 59581, + }, + { + icon_id: '29877016', + name: 'generator-role', + font_class: 'generator-role', + unicode: 'e8be', + unicode_decimal: 59582, + }, + { + icon_id: '29877017', + name: 'systemToggle', + font_class: 'systemToggle', + unicode: 'e8bf', + unicode_decimal: 59583, + }, + { + icon_id: '29877018', + name: 'upload', + font_class: 'upload', + unicode: 'e8c0', + unicode_decimal: 59584, + }, + { + icon_id: '29877019', + name: 'generator-department1', + font_class: 'generator-department1', + unicode: 'e8c1', + unicode_decimal: 59585, + }, + { + icon_id: '29746765', + name: 'signature', + font_class: 'signature', + unicode: 'e8af', + unicode_decimal: 59567, + }, + { + icon_id: '29420127', + name: 'yingyong', + font_class: 'yingyong', + unicode: 'e81e', + unicode_decimal: 59422, + }, + { + icon_id: '29420128', + name: 'generator-section', + font_class: 'generator-section', + unicode: 'e853', + unicode_decimal: 59475, + }, + { + icon_id: '29420129', + name: 'lianxi', + font_class: 'lianxi', + unicode: 'e873', + unicode_decimal: 59507, + }, + { + icon_id: '29418546', + name: 'bigScreenExampl', + font_class: 'bigScreenExampl', + unicode: 'e755', + unicode_decimal: 59221, + }, + { + icon_id: '29418547', + name: 'appForm', + font_class: 'appForm', + unicode: 'e756', + unicode_decimal: 59222, + }, + { + icon_id: '29418548', + name: 'authorize', + font_class: 'authorize', + unicode: 'e75c', + unicode_decimal: 59228, + }, + { + icon_id: '29418549', + name: 'dataApplication', + font_class: 'dataApplication', + unicode: 'e75d', + unicode_decimal: 59229, + }, + { + icon_id: '29418550', + name: 'dataDictionary', + font_class: 'dataDictionary', + unicode: 'e76c', + unicode_decimal: 59244, + }, + { + icon_id: '29418551', + name: 'codeGeneration', + font_class: 'codeGeneration', + unicode: 'e76f', + unicode_decimal: 59247, + }, + { + icon_id: '29418552', + name: 'documentPreviewExample', + font_class: 'documentPreviewExample', + unicode: 'e77b', + unicode_decimal: 59259, + }, + { + icon_id: '29418553', + name: 'dataInterface', + font_class: 'dataInterface', + unicode: 'e78f', + unicode_decimal: 59279, + }, + { + icon_id: '29418554', + name: 'bigScreenDesign', + font_class: 'bigScreenDesign', + unicode: 'e7a7', + unicode_decimal: 59303, + }, + { + icon_id: '29418555', + name: 'dataSync', + font_class: 'dataSync', + unicode: 'e7ab', + unicode_decimal: 59307, + }, + { + icon_id: '29418556', + name: 'extend', + font_class: 'extend', + unicode: 'e7b1', + unicode_decimal: 59313, + }, + { + icon_id: '29418557', + name: 'flowForm', + font_class: 'flowForm', + unicode: 'e7b2', + unicode_decimal: 59314, + }, + { + icon_id: '29418558', + name: 'dataModel', + font_class: 'dataModel', + unicode: 'e7bb', + unicode_decimal: 59323, + }, + { + icon_id: '29418559', + name: 'formExample', + font_class: 'formExample', + unicode: 'e7c8', + unicode_decimal: 59336, + }, + { + icon_id: '29418560', + name: 'department', + font_class: 'department', + unicode: 'e812', + unicode_decimal: 59410, + }, + { + icon_id: '29418561', + name: 'dataSource', + font_class: 'dataSource', + unicode: 'e816', + unicode_decimal: 59414, + }, + { + icon_id: '29418562', + name: 'flowLaunch', + font_class: 'flowLaunch', + unicode: 'e81b', + unicode_decimal: 59419, + }, + { + icon_id: '29418563', + name: 'flowForm1', + font_class: 'flowForm1', + unicode: 'e81f', + unicode_decimal: 59423, + }, + { + icon_id: '29418564', + name: 'formDesign', + font_class: 'formDesign', + unicode: 'e827', + unicode_decimal: 59431, + }, + { + icon_id: '29418565', + name: 'highchartsWordcloud', + font_class: 'highchartsWordcloud', + unicode: 'e82c', + unicode_decimal: 59436, + }, + { + icon_id: '29418566', + name: 'dataBackup', + font_class: 'dataBackup', + unicode: 'e830', + unicode_decimal: 59440, + }, + { + icon_id: '29418567', + name: 'flowEntrust', + font_class: 'flowEntrust', + unicode: 'e831', + unicode_decimal: 59441, + }, + { + icon_id: '29418568', + name: 'role', + font_class: 'role', + unicode: 'e832', + unicode_decimal: 59442, + }, + { + icon_id: '29418569', + name: 'information', + font_class: 'information', + unicode: 'e834', + unicode_decimal: 59444, + }, + { + icon_id: '29418570', + name: 'portalDesign', + font_class: 'portalDesign', + unicode: 'e83b', + unicode_decimal: 59451, + }, + { + icon_id: '29418571', + name: 'highchartsColumn', + font_class: 'highchartsColumn', + unicode: 'e83c', + unicode_decimal: 59452, + }, + { + icon_id: '29418572', + name: 'onlineUser', + font_class: 'onlineUser', + unicode: 'e83f', + unicode_decimal: 59455, + }, + { + icon_id: '29418573', + name: 'sysMonitor', + font_class: 'sysMonitor', + unicode: 'e842', + unicode_decimal: 59458, + }, + { + icon_id: '29418574', + name: 'sysCache', + font_class: 'sysCache', + unicode: 'e843', + unicode_decimal: 59459, + }, + { + icon_id: '29418575', + name: 'organization', + font_class: 'organization', + unicode: 'e845', + unicode_decimal: 59461, + }, + { + icon_id: '29418576', + name: 'flowTodo', + font_class: 'flowTodo', + unicode: 'e847', + unicode_decimal: 59463, + }, + { + icon_id: '29418577', + name: 'pause', + font_class: 'pause', + unicode: 'e849', + unicode_decimal: 59465, + }, + { + icon_id: '29418578', + name: 'report-icon-preview-pageIndex', + font_class: 'report-icon-preview-pageIndex', + unicode: 'e84c', + unicode_decimal: 59468, + }, + { + icon_id: '29418579', + name: 'sysProvince', + font_class: 'sysProvince', + unicode: 'e850', + unicode_decimal: 59472, + }, + { + icon_id: '29418580', + name: 'sysNotice', + font_class: 'sysNotice', + unicode: 'e851', + unicode_decimal: 59473, + }, + { + icon_id: '29418581', + name: 'wf-finishedProduct', + font_class: 'wf-finishedProduct', + unicode: 'e852', + unicode_decimal: 59474, + }, + { + icon_id: '29418583', + name: 'reportExample', + font_class: 'reportExample', + unicode: 'e85d', + unicode_decimal: 59485, + }, + { + icon_id: '29418584', + name: 'wf-crmOrder', + font_class: 'wf-crmOrder', + unicode: 'e864', + unicode_decimal: 59492, + }, + { + icon_id: '29418585', + name: 'signetExample', + font_class: 'signetExample', + unicode: 'e866', + unicode_decimal: 59494, + }, + { + icon_id: '29418586', + name: 'position', + font_class: 'position', + unicode: 'e867', + unicode_decimal: 59495, + }, + { + icon_id: '29418587', + name: 'permission', + font_class: 'permission', + unicode: 'e868', + unicode_decimal: 59496, + }, + { + icon_id: '29418588', + name: 'user', + font_class: 'user', + unicode: 'e871', + unicode_decimal: 59505, + }, + { + icon_id: '29418589', + name: 'wf-expenseExpenditure', + font_class: 'wf-expenseExpenditure', + unicode: 'e877', + unicode_decimal: 59511, + }, + { + icon_id: '29418590', + name: 'onlineDevelopment', + font_class: 'onlineDevelopment', + unicode: 'e87a', + unicode_decimal: 59514, + }, + { + icon_id: '29418591', + name: 'sysBillRule', + font_class: 'sysBillRule', + unicode: 'e88b', + unicode_decimal: 59531, + }, + { + icon_id: '29418592', + name: 'system', + font_class: 'system', + unicode: 'e892', + unicode_decimal: 59538, + }, + { + icon_id: '29418593', + name: 'reportDesign', + font_class: 'reportDesign', + unicode: 'e896', + unicode_decimal: 59542, + }, + { + icon_id: '29418594', + name: 'sysQuartz', + font_class: 'sysQuartz', + unicode: 'e897', + unicode_decimal: 59543, + }, + { + icon_id: '29418595', + name: 'workFlow', + font_class: 'workFlow', + unicode: 'e89e', + unicode_decimal: 59550, + }, + { + icon_id: '29418596', + name: 'sysIcon', + font_class: 'sysIcon', + unicode: 'e8a4', + unicode_decimal: 59556, + }, + { + icon_id: '29418597', + name: 'huibao', + font_class: 'huibao', + unicode: 'e8a5', + unicode_decimal: 59557, + }, + { + icon_id: '29418598', + name: 'webForm', + font_class: 'webForm', + unicode: 'e8a6', + unicode_decimal: 59558, + }, + { + icon_id: '29418599', + name: 'wf-staffOvertime', + font_class: 'wf-staffOvertime', + unicode: 'e8a7', + unicode_decimal: 59559, + }, + { + icon_id: '29418600', + name: 'tree-manage1', + font_class: 'tree-manage1', + unicode: 'e8a8', + unicode_decimal: 59560, + }, + { + icon_id: '29418601', + name: 'webDesign', + font_class: 'webDesign', + unicode: 'e8a9', + unicode_decimal: 59561, + }, + { + icon_id: '29418602', + name: 'wf-receiptSign', + font_class: 'wf-receiptSign', + unicode: 'e8aa', + unicode_decimal: 59562, + }, + { + icon_id: '29418603', + name: 'windows', + font_class: 'windows', + unicode: 'e8ab', + unicode_decimal: 59563, + }, + { + icon_id: '29418604', + name: 'systemTemplate', + font_class: 'systemTemplate', + unicode: 'e8ac', + unicode_decimal: 59564, + }, + { + icon_id: '29418605', + name: 'sysLog', + font_class: 'sysLog', + unicode: 'e8ad', + unicode_decimal: 59565, + }, + { + icon_id: '29418606', + name: 'sysConfig', + font_class: 'sysConfig', + unicode: 'e8ae', + unicode_decimal: 59566, + }, + { + icon_id: '29375660', + name: 'header-pannel', + font_class: 'header-pannel', + unicode: 'e7cf', + unicode_decimal: 59343, + }, + { + icon_id: '29375661', + name: 'search', + font_class: 'search', + unicode: 'e804', + unicode_decimal: 59396, + }, + { + icon_id: '29375662', + name: 'header-message', + font_class: 'header-message', + unicode: 'e810', + unicode_decimal: 59408, + }, + { + icon_id: '29375663', + name: 'generator-jobs', + font_class: 'generator-jobs', + unicode: 'e819', + unicode_decimal: 59417, + }, + { + icon_id: '29375664', + name: 'clean', + font_class: 'clean', + unicode: 'e83e', + unicode_decimal: 59454, + }, + { + icon_id: '29375665', + name: 'header-IM', + font_class: 'header-IM', + unicode: 'e899', + unicode_decimal: 59545, + }, + { + icon_id: '29375666', + name: 'header-language', + font_class: 'header-language', + unicode: 'e8a3', + unicode_decimal: 59555, + }, + { + icon_id: '29279588', + name: 'flowDone-app', + font_class: 'flowDone-app', + unicode: 'e7a6', + unicode_decimal: 59302, + }, + { + icon_id: '29279589', + name: 'flowLaunch-app', + font_class: 'flowLaunch-app', + unicode: 'e7b3', + unicode_decimal: 59315, + }, + { + icon_id: '29279590', + name: 'addFlow', + font_class: 'addFlow', + unicode: 'e7b8', + unicode_decimal: 59320, + }, + { + icon_id: '29279591', + name: 'flowCopy-app', + font_class: 'flowCopy-app', + unicode: 'e7bf', + unicode_decimal: 59327, + }, + { + icon_id: '29279592', + name: 'flowTodo-app', + font_class: 'flowTodo-app', + unicode: 'e8a2', + unicode_decimal: 59554, + }, + { + icon_id: '29050019', + name: 'mobile', + font_class: 'mobile', + unicode: 'e7dc', + unicode_decimal: 59356, + }, + { + icon_id: '29050020', + name: 'pc', + font_class: 'pc', + unicode: 'e7ee', + unicode_decimal: 59374, + }, + { + icon_id: '29050021', + name: 'video-play', + font_class: 'video-play', + unicode: 'e8a1', + unicode_decimal: 59553, + }, + { + icon_id: '28946226', + name: 'header-collapse1', + font_class: 'header-collapse1', + unicode: 'e809', + unicode_decimal: 59401, + }, + { + icon_id: '28943111', + name: 'xitong', + font_class: 'xitong', + unicode: 'e814', + unicode_decimal: 59412, + }, + { + icon_id: '28934314', + name: 'full-screen1', + font_class: 'full-screen1', + unicode: 'e7d0', + unicode_decimal: 59344, + }, + { + icon_id: '28934315', + name: 'file-html1', + font_class: 'file-html1', + unicode: 'e7d1', + unicode_decimal: 59345, + }, + { + icon_id: '28934316', + name: 'generator-area', + font_class: 'generator-area', + unicode: 'e7d2', + unicode_decimal: 59346, + }, + { + icon_id: '28934317', + name: 'generator-modifytime', + font_class: 'generator-modifytime', + unicode: 'e7d3', + unicode_decimal: 59347, + }, + { + icon_id: '28934318', + name: 'generator-fold', + font_class: 'generator-fold', + unicode: 'e7d4', + unicode_decimal: 59348, + }, + { + icon_id: '28934319', + name: 'generator-founder', + font_class: 'generator-founder', + unicode: 'e7d5', + unicode_decimal: 59349, + }, + { + icon_id: '28934320', + name: 'generator-line', + font_class: 'generator-line', + unicode: 'e7d6', + unicode_decimal: 59350, + }, + { + icon_id: '28934321', + name: 'generator-department', + font_class: 'generator-department', + unicode: 'e7d7', + unicode_decimal: 59351, + }, + { + icon_id: '28934322', + name: 'generator-function', + font_class: 'generator-function', + unicode: 'e7d8', + unicode_decimal: 59352, + }, + { + icon_id: '28934323', + name: 'generator-notice', + font_class: 'generator-notice', + unicode: 'e7d9', + unicode_decimal: 59353, + }, + { + icon_id: '28934324', + name: 'generator-Provinces', + font_class: 'generator-Provinces', + unicode: 'e7da', + unicode_decimal: 59354, + }, + { + icon_id: '28934325', + name: 'generator-popup-attr', + font_class: 'generator-popup-attr', + unicode: 'e7dd', + unicode_decimal: 59357, + }, + { + icon_id: '28934326', + name: 'generator-divider', + font_class: 'generator-divider', + unicode: 'e7de', + unicode_decimal: 59358, + }, + { + icon_id: '28934327', + name: 'generator-radio', + font_class: 'generator-radio', + unicode: 'e7df', + unicode_decimal: 59359, + }, + { + icon_id: '28934328', + name: 'generator-menu', + font_class: 'generator-menu', + unicode: 'e7e0', + unicode_decimal: 59360, + }, + { + icon_id: '28934329', + name: 'generator-popup', + font_class: 'generator-popup', + unicode: 'e7e1', + unicode_decimal: 59361, + }, + { + icon_id: '28934330', + name: 'generator-input', + font_class: 'generator-input', + unicode: 'e7e2', + unicode_decimal: 59362, + }, + { + icon_id: '28934331', + name: 'generator-rich-text', + font_class: 'generator-rich-text', + unicode: 'e7e3', + unicode_decimal: 59363, + }, + { + icon_id: '28934332', + name: 'generator-Panel', + font_class: 'generator-Panel', + unicode: 'e7e4', + unicode_decimal: 59364, + }, + { + icon_id: '28934333', + name: 'generator-table', + font_class: 'generator-table', + unicode: 'e7e5', + unicode_decimal: 59365, + }, + { + icon_id: '28934334', + name: 'generator-radar', + font_class: 'generator-radar', + unicode: 'e7e6', + unicode_decimal: 59366, + }, + { + icon_id: '28934335', + name: 'generator-password', + font_class: 'generator-password', + unicode: 'e7e7', + unicode_decimal: 59367, + }, + { + icon_id: '28934336', + name: 'generator-component', + font_class: 'generator-component', + unicode: 'e7e8', + unicode_decimal: 59368, + }, + { + icon_id: '28934337', + name: 'generator-station', + font_class: 'generator-station', + unicode: 'e7e9', + unicode_decimal: 59369, + }, + { + icon_id: '28934338', + name: 'generator-rate', + font_class: 'generator-rate', + unicode: 'e7ea', + unicode_decimal: 59370, + }, + { + icon_id: '28934339', + name: 'generator-subFlow', + font_class: 'generator-subFlow1', + unicode: 'e7eb', + unicode_decimal: 59371, + }, + { + icon_id: '28934340', + name: 'generator-number', + font_class: 'generator-number', + unicode: 'e7ec', + unicode_decimal: 59372, + }, + { + icon_id: '28934342', + name: 'generator-flow', + font_class: 'generator-flow', + unicode: 'e7ef', + unicode_decimal: 59375, + }, + { + icon_id: '28934343', + name: 'generator-color', + font_class: 'generator-color', + unicode: 'e7f0', + unicode_decimal: 59376, + }, + { + icon_id: '28934344', + name: 'generator-label', + font_class: 'generator-label', + unicode: 'e7f1', + unicode_decimal: 59377, + }, + { + icon_id: '28934345', + name: 'generator-nature', + font_class: 'generator-nature', + unicode: 'e7f2', + unicode_decimal: 59378, + }, + { + icon_id: '28934346', + name: 'generator-select', + font_class: 'generator-select', + unicode: 'e7f3', + unicode_decimal: 59379, + }, + { + icon_id: '28934347', + name: 'generator-slider', + font_class: 'generator-slider', + unicode: 'e7f4', + unicode_decimal: 59380, + }, + { + icon_id: '28934348', + name: 'generator-qrcode', + font_class: 'generator-qrcode', + unicode: 'e7f5', + unicode_decimal: 59381, + }, + { + icon_id: '28934349', + name: 'generator-group', + font_class: 'generator-group', + unicode: 'e7f6', + unicode_decimal: 59382, + }, + { + icon_id: '28934350', + name: 'generator-time', + font_class: 'generator-time', + unicode: 'e7f7', + unicode_decimal: 59383, + }, + { + icon_id: '28934351', + name: 'generator-user', + font_class: 'generator-user', + unicode: 'e7f8', + unicode_decimal: 59384, + }, + { + icon_id: '28934352', + name: 'generator-modifier', + font_class: 'generator-modifier', + unicode: 'e7f9', + unicode_decimal: 59385, + }, + { + icon_id: '28934353', + name: 'h5', + font_class: 'h5', + unicode: 'e7fa', + unicode_decimal: 59386, + }, + { + icon_id: '28934354', + name: 'generator-tree', + font_class: 'generator-tree', + unicode: 'e7fb', + unicode_decimal: 59387, + }, + { + icon_id: '28934355', + name: 'gonggao', + font_class: 'gonggao', + unicode: 'e7fc', + unicode_decimal: 59388, + }, + { + icon_id: '28934356', + name: 'generator-kanban', + font_class: 'generator-kanban', + unicode: 'e7fd', + unicode_decimal: 59389, + }, + { + icon_id: '28934357', + name: 'generator-textarea', + font_class: 'generator-textarea', + unicode: 'e7fe', + unicode_decimal: 59390, + }, + { + icon_id: '28934358', + name: 'generator-todo', + font_class: 'generator-todo', + unicode: 'e7ff', + unicode_decimal: 59391, + }, + { + icon_id: '28934359', + name: 'header-loginOut', + font_class: 'header-loginOut', + unicode: 'e800', + unicode_decimal: 59392, + }, + { + icon_id: '28934360', + name: 'header-expand', + font_class: 'header-expand', + unicode: 'e801', + unicode_decimal: 59393, + }, + { + icon_id: '28934361', + name: 'generator-time-range', + font_class: 'generator-time-range', + unicode: 'e802', + unicode_decimal: 59394, + }, + { + icon_id: '28934362', + name: 'header-lockScreen', + font_class: 'header-lockScreen', + unicode: 'e803', + unicode_decimal: 59395, + }, + { + icon_id: '28934364', + name: 'generator-switch', + font_class: 'generator-switch', + unicode: 'e805', + unicode_decimal: 59397, + }, + { + icon_id: '28934365', + name: 'header-feedBack', + font_class: 'header-feedBack', + unicode: 'e806', + unicode_decimal: 59398, + }, + { + icon_id: '28934366', + name: 'header-skins', + font_class: 'header-skins', + unicode: 'e807', + unicode_decimal: 59399, + }, + { + icon_id: '28934367', + name: 'global-role', + font_class: 'global-role', + unicode: 'e808', + unicode_decimal: 59400, + }, + { + icon_id: '28934368', + name: 'highchartsBullet', + font_class: 'highchartsBullet', + unicode: 'e80b', + unicode_decimal: 59403, + }, + { + icon_id: '28934369', + name: 'header-userInfo', + font_class: 'header-userInfo', + unicode: 'e80c', + unicode_decimal: 59404, + }, + { + icon_id: '28934370', + name: 'generator-upload', + font_class: 'generator-upload', + unicode: 'e80d', + unicode_decimal: 59405, + }, + { + icon_id: '28934371', + name: 'generator-todolist', + font_class: 'generator-todolist', + unicode: 'e80e', + unicode_decimal: 59406, + }, + { + icon_id: '28934372', + name: 'highchartsArea', + font_class: 'highchartsArea', + unicode: 'e80f', + unicode_decimal: 59407, + }, + { + icon_id: '28934374', + name: 'highchartsFunnel', + font_class: 'highchartsFunnel', + unicode: 'e811', + unicode_decimal: 59409, + }, + { + icon_id: '28934376', + name: 'highcharts', + font_class: 'highcharts', + unicode: 'e813', + unicode_decimal: 59411, + }, + { + icon_id: '28934378', + name: 'header-about', + font_class: 'header-about', + unicode: 'e815', + unicode_decimal: 59413, + }, + { + icon_id: '28934380', + name: 'importAndExportExample', + font_class: 'importAndExportExample', + unicode: 'e817', + unicode_decimal: 59415, + }, + { + icon_id: '28934381', + name: 'highchartsScatter', + font_class: 'highchartsScatter', + unicode: 'e818', + unicode_decimal: 59416, + }, + { + icon_id: '28934383', + name: 'header-language1', + font_class: 'header-language1', + unicode: 'e81a', + unicode_decimal: 59418, + }, + { + icon_id: '28934385', + name: 'mpMenu', + font_class: 'mpMenu', + unicode: 'e81c', + unicode_decimal: 59420, + }, + { + icon_id: '28934386', + name: 'group', + font_class: 'group', + unicode: 'e81d', + unicode_decimal: 59421, + }, + { + icon_id: '28934389', + name: 'nav-close', + font_class: 'nav-close', + unicode: 'e820', + unicode_decimal: 59424, + }, + { + icon_id: '28934390', + name: 'highchartsLine', + font_class: 'highchartsLine', + unicode: 'e821', + unicode_decimal: 59425, + }, + { + icon_id: '28934391', + name: 'ios', + font_class: 'ios', + unicode: 'e822', + unicode_decimal: 59426, + }, + { + icon_id: '28934392', + name: 'highchartsBellcurve', + font_class: 'highchartsBellcurve', + unicode: 'e823', + unicode_decimal: 59427, + }, + { + icon_id: '28934393', + name: 'mpMaterial', + font_class: 'mpMaterial', + unicode: 'e824', + unicode_decimal: 59428, + }, + { + icon_id: '28934394', + name: 'mpMessage', + font_class: 'mpMessage', + unicode: 'e825', + unicode_decimal: 59429, + }, + { + icon_id: '28934395', + name: 'message', + font_class: 'message', + unicode: 'e826', + unicode_decimal: 59430, + }, + { + icon_id: '28934397', + name: 'java', + font_class: 'java', + unicode: 'e828', + unicode_decimal: 59432, + }, + { + icon_id: '28934399', + name: 'orderDemo', + font_class: 'orderDemo', + unicode: 'e82a', + unicode_decimal: 59434, + }, + { + icon_id: '28934400', + name: 'position-1', + font_class: 'position-1', + unicode: 'e82b', + unicode_decimal: 59435, + }, + { + icon_id: '28934402', + name: 'nav-next', + font_class: 'nav-next', + unicode: 'e82d', + unicode_decimal: 59437, + }, + { + icon_id: '28934403', + name: 'projectExample', + font_class: 'projectExample', + unicode: 'e82f', + unicode_decimal: 59439, + }, + { + icon_id: '28934407', + name: 'mapExample', + font_class: 'mapExample', + unicode: 'e833', + unicode_decimal: 59443, + }, + { + icon_id: '28934409', + name: 'qyUser', + font_class: 'qyUser', + unicode: 'e835', + unicode_decimal: 59445, + }, + { + icon_id: '28934410', + name: 'scanCode1', + font_class: 'scanCode1', + unicode: 'e836', + unicode_decimal: 59446, + }, + { + icon_id: '28934411', + name: 'report-icon-picture', + font_class: 'report-icon-picture', + unicode: 'e837', + unicode_decimal: 59447, + }, + { + icon_id: '28934412', + name: 'mpConfig', + font_class: 'mpConfig', + unicode: 'e838', + unicode_decimal: 59448, + }, + { + icon_id: '28934413', + name: 'options1', + font_class: 'options1', + unicode: 'e839', + unicode_decimal: 59449, + }, + { + icon_id: '28934414', + name: 'nav-prev', + font_class: 'nav-prev', + unicode: 'e83a', + unicode_decimal: 59450, + }, + { + icon_id: '28934417', + name: 'scheduleExample', + font_class: 'scheduleExample', + unicode: 'e83d', + unicode_decimal: 59453, + }, + { + icon_id: '28934420', + name: 'Refresh', + font_class: 'Refresh', + unicode: 'e840', + unicode_decimal: 59456, + }, + { + icon_id: '28934421', + name: 'options', + font_class: 'options', + unicode: 'e841', + unicode_decimal: 59457, + }, + { + icon_id: '28934424', + name: 'saolian', + font_class: 'saolian', + unicode: 'e844', + unicode_decimal: 59460, + }, + { + icon_id: '28934426', + name: 'shezhi', + font_class: 'shezhi', + unicode: 'e846', + unicode_decimal: 59462, + }, + { + icon_id: '28934428', + name: 'sysMenu', + font_class: 'sysMenu', + unicode: 'e848', + unicode_decimal: 59464, + }, + { + icon_id: '28934173', + name: 'barCodeExample', + font_class: 'barCodeExample', + unicode: 'e73b', + unicode_decimal: 59195, + }, + { + icon_id: '28934430', + name: 'sysLanguage', + font_class: 'sysLanguage', + unicode: 'e84a', + unicode_decimal: 59466, + }, + { + icon_id: '28934431', + name: 'report-icon-pie', + font_class: 'report-icon-pie', + unicode: 'e84b', + unicode_decimal: 59467, + }, + { + icon_id: '28934176', + name: 'bigScreenExample1', + font_class: 'bigScreenExample1', + unicode: 'e73e', + unicode_decimal: 59198, + }, + { + icon_id: '28934177', + name: 'bigDataExample', + font_class: 'bigDataExample', + unicode: 'e73f', + unicode_decimal: 59199, + }, + { + icon_id: '28934433', + name: 'orderExample', + font_class: 'orderExample', + unicode: 'e84d', + unicode_decimal: 59469, + }, + { + icon_id: '28934434', + name: 'preview-excel-paging', + font_class: 'preview-excel-paging', + unicode: 'e84e', + unicode_decimal: 59470, + }, + { + icon_id: '28934179', + name: 'btn-import', + font_class: 'btn-import', + unicode: 'e741', + unicode_decimal: 59201, + }, + { + icon_id: '28934435', + name: 'tableExample', + font_class: 'tableExample', + unicode: 'e84f', + unicode_decimal: 59471, + }, + { + icon_id: '28934180', + name: 'btn-collapse', + font_class: 'btn-collapse', + unicode: 'e742', + unicode_decimal: 59202, + }, + { + icon_id: '28934181', + name: 'btn-edit', + font_class: 'btn-edit', + unicode: 'e743', + unicode_decimal: 59203, + }, + { + icon_id: '28934182', + name: 'chartExample', + font_class: 'chartExample', + unicode: 'e744', + unicode_decimal: 59204, + }, + { + icon_id: '28934184', + name: 'btn-refresh', + font_class: 'btn-refresh', + unicode: 'e746', + unicode_decimal: 59206, + }, + { + icon_id: '28934440', + name: 'tree-department', + font_class: 'tree-department', + unicode: 'e855', + unicode_decimal: 59477, + }, + { + icon_id: '28934185', + name: 'checktriangle', + font_class: 'checktriangle', + unicode: 'e747', + unicode_decimal: 59207, + }, + { + icon_id: '28934186', + name: 'btn-fields', + font_class: 'btn-fields', + unicode: 'e748', + unicode_decimal: 59208, + }, + { + icon_id: '28934442', + name: 'tree-department2', + font_class: 'tree-department2', + unicode: 'e858', + unicode_decimal: 59480, + }, + { + icon_id: '28934187', + name: 'btn-export', + font_class: 'btn-export', + unicode: 'e749', + unicode_decimal: 59209, + }, + { + icon_id: '28934443', + name: 'tree-normal1', + font_class: 'tree-normal1', + unicode: 'e859', + unicode_decimal: 59481, + }, + { + icon_id: '28934188', + name: 'btn-preview', + font_class: 'btn-preview', + unicode: 'e74a', + unicode_decimal: 59210, + }, + { + icon_id: '28934444', + name: 'tree-normal', + font_class: 'tree-normal', + unicode: 'e85a', + unicode_decimal: 59482, + }, + { + icon_id: '28934445', + name: 'tree-organization3', + font_class: 'tree-organization3', + unicode: 'e85b', + unicode_decimal: 59483, + }, + { + icon_id: '28934190', + name: 'btn-add', + font_class: 'btn-add', + unicode: 'e74c', + unicode_decimal: 59212, + }, + { + icon_id: '28934446', + name: 'tree-position2', + font_class: 'tree-position2', + unicode: 'e85c', + unicode_decimal: 59484, + }, + { + icon_id: '28934192', + name: 'btn-expand', + font_class: 'btn-expand', + unicode: 'e74e', + unicode_decimal: 59214, + }, + { + icon_id: '28934448', + name: 'tree-user2', + font_class: 'tree-user2', + unicode: 'e85e', + unicode_decimal: 59486, + }, + { + icon_id: '28934193', + name: 'daiban1', + font_class: 'daiban1', + unicode: 'e74f', + unicode_decimal: 59215, + }, + { + icon_id: '28934449', + name: 'tree-department1', + font_class: 'tree-department1', + unicode: 'e85f', + unicode_decimal: 59487, + }, + { + icon_id: '28934194', + name: 'daka', + font_class: 'daka', + unicode: 'e750', + unicode_decimal: 59216, + }, + { + icon_id: '28934451', + name: 'tableExample1', + font_class: 'tableExample1', + unicode: 'e860', + unicode_decimal: 59488, + }, + { + icon_id: '28934452', + name: 'tree-manage', + font_class: 'tree-manage', + unicode: 'e861', + unicode_decimal: 59489, + }, + { + icon_id: '28934196', + name: 'android', + font_class: 'android', + unicode: 'e752', + unicode_decimal: 59218, + }, + { + icon_id: '28934453', + name: 'wf-applyDeliverGoods', + font_class: 'wf-applyDeliverGoods', + unicode: 'e862', + unicode_decimal: 59490, + }, + { + icon_id: '28934197', + name: 'darg', + font_class: 'darg', + unicode: 'e753', + unicode_decimal: 59219, + }, + { + icon_id: '28934454', + name: 'wechat1', + font_class: 'wechat1', + unicode: 'e863', + unicode_decimal: 59491, + }, + { + icon_id: '28934198', + name: 'duties', + font_class: 'duties', + unicode: 'e754', + unicode_decimal: 59220, + }, + { + icon_id: '28934456', + name: 'tree-position1', + font_class: 'tree-position1', + unicode: 'e865', + unicode_decimal: 59493, + }, + { + icon_id: '28934201', + name: 'echartsColumn', + font_class: 'echartsColumn', + unicode: 'e757', + unicode_decimal: 59223, + }, + { + icon_id: '28934202', + name: 'delete', + font_class: 'delete', + unicode: 'e758', + unicode_decimal: 59224, + }, + { + icon_id: '28934203', + name: 'echartsCandlestick', + font_class: 'echartsCandlestick', + unicode: 'e759', + unicode_decimal: 59225, + }, + { + icon_id: '28934460', + name: 'visual-studio', + font_class: 'visual-studio', + unicode: 'e869', + unicode_decimal: 59497, + }, + { + icon_id: '28934204', + name: 'btn-remove', + font_class: 'btn-remove', + unicode: 'e75a', + unicode_decimal: 59226, + }, + { + icon_id: '28934461', + name: 'wf-conBilling', + font_class: 'wf-conBilling', + unicode: 'e86a', + unicode_decimal: 59498, + }, + { + icon_id: '28934205', + name: 'echartsFunnel', + font_class: 'echartsFunnel', + unicode: 'e75b', + unicode_decimal: 59227, + }, + { + icon_id: '28934462', + name: 'wf-batchPack', + font_class: 'wf-batchPack', + unicode: 'e86b', + unicode_decimal: 59499, + }, + { + icon_id: '28934463', + name: 'tree-department-1', + font_class: 'tree-department-1', + unicode: 'e86c', + unicode_decimal: 59500, + }, + { + icon_id: '28934464', + name: 'wf-articlesWarehous', + font_class: 'wf-articlesWarehous', + unicode: 'e86d', + unicode_decimal: 59501, + }, + { + icon_id: '28934208', + name: 'emailExample', + font_class: 'emailExample', + unicode: 'e75e', + unicode_decimal: 59230, + }, + { + icon_id: '28934465', + name: 'wf-applyMeeting', + font_class: 'wf-applyMeeting', + unicode: 'e86e', + unicode_decimal: 59502, + }, + { + icon_id: '28934209', + name: 'dingdang', + font_class: 'dingdang', + unicode: 'e75f', + unicode_decimal: 59231, + }, + { + icon_id: '28934466', + name: 'wf-batchTable', + font_class: 'wf-batchTable', + unicode: 'e86f', + unicode_decimal: 59503, + }, + { + icon_id: '28934210', + name: 'echartsLineArea', + font_class: 'echartsLineArea', + unicode: 'e760', + unicode_decimal: 59232, + }, + { + icon_id: '28934467', + name: 'wf-applyBanquet', + font_class: 'wf-applyBanquet', + unicode: 'e870', + unicode_decimal: 59504, + }, + { + icon_id: '28934211', + name: 'crm', + font_class: 'crm', + unicode: 'e761', + unicode_decimal: 59233, + }, + { + icon_id: '28934212', + name: 'extend-ambulance', + font_class: 'extend-ambulance', + unicode: 'e762', + unicode_decimal: 59234, + }, + { + icon_id: '28934469', + name: 'wf-documentApproval', + font_class: 'wf-documentApproval', + unicode: 'e872', + unicode_decimal: 59506, + }, + { + icon_id: '28934213', + name: 'echartsScatter', + font_class: 'echartsScatter', + unicode: 'e763', + unicode_decimal: 59235, + }, + { + icon_id: '28934470', + name: 'wf-archivalBorrow', + font_class: 'wf-archivalBorrow', + unicode: 'e874', + unicode_decimal: 59508, + }, + { + icon_id: '28934214', + name: 'dbLink', + font_class: 'dbLink', + unicode: 'e764', + unicode_decimal: 59236, + }, + { + icon_id: '28934471', + name: 'wf-debitBill', + font_class: 'wf-debitBill', + unicode: 'e875', + unicode_decimal: 59509, + }, + { + icon_id: '28934215', + name: 'dot-net', + font_class: 'dot-net', + unicode: 'e765', + unicode_decimal: 59237, + }, + { + icon_id: '28934472', + name: 'weChat', + font_class: 'weChat', + unicode: 'e876', + unicode_decimal: 59510, + }, + { + icon_id: '28934216', + name: 'extend-exclamation-triangle', + font_class: 'extend-exclamation-triangle', + unicode: 'e766', + unicode_decimal: 59238, + }, + { + icon_id: '28934217', + name: 'btn-copy', + font_class: 'btn-copy', + unicode: 'e767', + unicode_decimal: 59239, + }, + { + icon_id: '28934474', + name: 'wf-contractApproval', + font_class: 'wf-contractApproval', + unicode: 'e879', + unicode_decimal: 59513, + }, + { + icon_id: '28934218', + name: 'documentExample', + font_class: 'documentExample', + unicode: 'e768', + unicode_decimal: 59240, + }, + { + icon_id: '28934219', + name: 'echartsLineBar', + font_class: 'echartsLineBar', + unicode: 'e769', + unicode_decimal: 59241, + }, + { + icon_id: '28934476', + name: 'wf-documentSigning', + font_class: 'wf-documentSigning', + unicode: 'e87b', + unicode_decimal: 59515, + }, + { + icon_id: '28934220', + name: 'extend-clock', + font_class: 'extend-clock', + unicode: 'e76a', + unicode_decimal: 59242, + }, + { + icon_id: '28934477', + name: 'wf-contractApprovalSheet', + font_class: 'wf-contractApprovalSheet', + unicode: 'e87d', + unicode_decimal: 59517, + }, + { + icon_id: '28934221', + name: 'extend-check-circle-o', + font_class: 'extend-check-circle-o', + unicode: 'e76b', + unicode_decimal: 59243, + }, + { + icon_id: '28934478', + name: 'wf-leaveApply', + font_class: 'wf-leaveApply', + unicode: 'e87f', + unicode_decimal: 59519, + }, + { + icon_id: '28934479', + name: 'wf-letterService', + font_class: 'wf-letterService', + unicode: 'e880', + unicode_decimal: 59520, + }, + { + icon_id: '28934223', + name: 'erweima', + font_class: 'erweima', + unicode: 'e76d', + unicode_decimal: 59245, + }, + { + icon_id: '28934480', + name: 'wf-officeSupplies', + font_class: 'wf-officeSupplies', + unicode: 'e881', + unicode_decimal: 59521, + }, + { + icon_id: '28934224', + name: 'echartsBarAcross', + font_class: 'echartsBarAcross', + unicode: 'e76e', + unicode_decimal: 59246, + }, + { + icon_id: '28934481', + name: 'wf-payDistribution', + font_class: 'wf-payDistribution', + unicode: 'e882', + unicode_decimal: 59522, + }, + { + icon_id: '28934482', + name: 'wf-incomeRecognition', + font_class: 'wf-incomeRecognition', + unicode: 'e883', + unicode_decimal: 59523, + }, + { + icon_id: '28934226', + name: 'extend-eye', + font_class: 'extend-eye', + unicode: 'e770', + unicode_decimal: 59248, + }, + { + icon_id: '28934483', + name: 'wf-postBatchTab', + font_class: 'wf-postBatchTab', + unicode: 'e884', + unicode_decimal: 59524, + }, + { + icon_id: '28934227', + name: 'extend-circle', + font_class: 'extend-circle', + unicode: 'e771', + unicode_decimal: 59249, + }, + { + icon_id: '28934484', + name: 'wf-quotationApproval', + font_class: 'wf-quotationApproval', + unicode: 'e885', + unicode_decimal: 59525, + }, + { + icon_id: '28934228', + name: 'extend-bar-chart', + font_class: 'extend-bar-chart', + unicode: 'e772', + unicode_decimal: 59250, + }, + { + icon_id: '28934485', + name: 'wf-rewardPunishment', + font_class: 'wf-rewardPunishment', + unicode: 'e886', + unicode_decimal: 59526, + }, + { + icon_id: '28934229', + name: 'extend-mail-forward', + font_class: 'extend-mail-forward', + unicode: 'e773', + unicode_decimal: 59251, + }, + { + icon_id: '28934486', + name: 'wf-monthlyReport', + font_class: 'wf-monthlyReport', + unicode: 'e887', + unicode_decimal: 59527, + }, + { + icon_id: '28934230', + name: 'extend-car', + font_class: 'extend-car', + unicode: 'e774', + unicode_decimal: 59252, + }, + { + icon_id: '28934487', + name: 'wf-materialRequisition', + font_class: 'wf-materialRequisition', + unicode: 'e888', + unicode_decimal: 59528, + }, + { + icon_id: '28934231', + name: 'extend-meh', + font_class: 'extend-meh', + unicode: 'e775', + unicode_decimal: 59253, + }, + { + icon_id: '28934488', + name: 'wf-procurementMaterial', + font_class: 'wf-procurementMaterial', + unicode: 'e889', + unicode_decimal: 59529, + }, + { + icon_id: '28934232', + name: 'extend-cog', + font_class: 'extend-cog', + unicode: 'e776', + unicode_decimal: 59254, + }, + { + icon_id: '28934489', + name: 'wf-outboundOrder', + font_class: 'wf-outboundOrder', + unicode: 'e88a', + unicode_decimal: 59530, + }, + { + icon_id: '28934233', + name: 'extend-minus-circle', + font_class: 'extend-minus-circle', + unicode: 'e777', + unicode_decimal: 59255, + }, + { + icon_id: '28934234', + name: 'echartsPie', + font_class: 'echartsPie', + unicode: 'e778', + unicode_decimal: 59256, + }, + { + icon_id: '28934491', + name: 'wf-receiptProcessing', + font_class: 'wf-receiptProcessing', + unicode: 'e88c', + unicode_decimal: 59532, + }, + { + icon_id: '28934235', + name: 'extend-envelope', + font_class: 'extend-envelope', + unicode: 'e779', + unicode_decimal: 59257, + }, + { + icon_id: '28934492', + name: 'wf-salesOrder', + font_class: 'wf-salesOrder', + unicode: 'e88d', + unicode_decimal: 59533, + }, + { + icon_id: '28934236', + name: 'compress-screen', + font_class: 'compress-screen', + unicode: 'e77a', + unicode_decimal: 59258, + }, + { + icon_id: '28934493', + name: 'wf-salesSupport', + font_class: 'wf-salesSupport', + unicode: 'e88e', + unicode_decimal: 59534, + }, + { + icon_id: '28934494', + name: 'wf-travelApply', + font_class: 'wf-travelApply', + unicode: 'e88f', + unicode_decimal: 59535, + }, + { + icon_id: '28934238', + name: 'echartsTree', + font_class: 'echartsTree', + unicode: 'e77c', + unicode_decimal: 59260, + }, + { + icon_id: '28934495', + name: 'wf-paymentApply', + font_class: 'wf-paymentApply', + unicode: 'e890', + unicode_decimal: 59536, + }, + { + icon_id: '28934239', + name: 'extend-star-o', + font_class: 'extend-star-o', + unicode: 'e77d', + unicode_decimal: 59261, + }, + { + icon_id: '28934496', + name: 'wf-violationHandling', + font_class: 'wf-violationHandling', + unicode: 'e891', + unicode_decimal: 59537, + }, + { + icon_id: '28934240', + name: 'extend-paper-plane', + font_class: 'extend-paper-plane', + unicode: 'e77e', + unicode_decimal: 59262, + }, + { + icon_id: '28934241', + name: 'extend-history', + font_class: 'extend-history', + unicode: 'e77f', + unicode_decimal: 59263, + }, + { + icon_id: '28934498', + name: 'wf-purchaseList', + font_class: 'wf-purchaseList', + unicode: 'e893', + unicode_decimal: 59539, + }, + { + icon_id: '28934242', + name: 'echartsGauge', + font_class: 'echartsGauge', + unicode: 'e780', + unicode_decimal: 59264, + }, + { + icon_id: '28934499', + name: 'wf-warehouseReceipt', + font_class: 'wf-warehouseReceipt', + unicode: 'e894', + unicode_decimal: 59540, + }, + { + icon_id: '28934243', + name: 'extend-edit', + font_class: 'extend-edit', + unicode: 'e781', + unicode_decimal: 59265, + }, + { + icon_id: '28934500', + name: 'wf-workContactSheet', + font_class: 'wf-workContactSheet', + unicode: 'e895', + unicode_decimal: 59541, + }, + { + icon_id: '28934244', + name: 'extend-plane', + font_class: 'extend-plane', + unicode: 'e782', + unicode_decimal: 59266, + }, + { + icon_id: '28934245', + name: 'file-blank', + font_class: 'file-blank', + unicode: 'e783', + unicode_decimal: 59267, + }, + { + icon_id: '28934246', + name: 'extend-folder-open', + font_class: 'extend-folder-open', + unicode: 'e784', + unicode_decimal: 59268, + }, + { + icon_id: '28934503', + name: 'wf-travelReimbursement', + font_class: 'wf-travelReimbursement', + unicode: 'e898', + unicode_decimal: 59544, + }, + { + icon_id: '28934247', + name: 'extend-thumbs-up', + font_class: 'extend-thumbs-up', + unicode: 'e785', + unicode_decimal: 59269, + }, + { + icon_id: '28934248', + name: 'extend-truck', + font_class: 'extend-truck', + unicode: 'e786', + unicode_decimal: 59270, + }, + { + icon_id: '28934505', + name: 'wf-supplementCard', + font_class: 'wf-supplementCard', + unicode: 'e89a', + unicode_decimal: 59546, + }, + { + icon_id: '28934249', + name: 'extend-folder', + font_class: 'extend-folder', + unicode: 'e787', + unicode_decimal: 59271, + }, + { + icon_id: '28934506', + name: 'zhanghao', + font_class: 'zhanghao', + unicode: 'e89b', + unicode_decimal: 59547, + }, + { + icon_id: '28934250', + name: 'extend-paperclip', + font_class: 'extend-paperclip', + unicode: 'e788', + unicode_decimal: 59272, + }, + { + icon_id: '28934507', + name: 'zuzhi', + font_class: 'zuzhi', + unicode: 'e89c', + unicode_decimal: 59548, + }, + { + icon_id: '28934251', + name: 'extend-star', + font_class: 'extend-star', + unicode: 'e789', + unicode_decimal: 59273, + }, + { + icon_id: '28934508', + name: 'xingcheng', + font_class: 'xingcheng', + unicode: 'e89d', + unicode_decimal: 59549, + }, + { + icon_id: '28934252', + name: 'extend-train', + font_class: 'extend-train', + unicode: 'e78a', + unicode_decimal: 59274, + }, + { + icon_id: '28934253', + name: 'extend-motorcycle', + font_class: 'extend-motorcycle', + unicode: 'e78b', + unicode_decimal: 59275, + }, + { + icon_id: '28934510', + name: 'wf-vehicleApply', + font_class: 'wf-vehicleApply', + unicode: 'e89f', + unicode_decimal: 59551, + }, + { + icon_id: '28934254', + name: 'file-photo', + font_class: 'file-photo', + unicode: 'e78c', + unicode_decimal: 59276, + }, + { + icon_id: '28934511', + name: 'zujian', + font_class: 'zujian', + unicode: 'e8a0', + unicode_decimal: 59552, + }, + { + icon_id: '28934255', + name: 'extend-subway', + font_class: 'extend-subway', + unicode: 'e78d', + unicode_decimal: 59277, + }, + { + icon_id: '28934256', + name: 'extend-envelope-open-o', + font_class: 'extend-envelope-open-o', + unicode: 'e78e', + unicode_decimal: 59278, + }, + { + icon_id: '28934258', + name: 'file-csv1', + font_class: 'file-csv1', + unicode: 'e790', + unicode_decimal: 59280, + }, + { + icon_id: '28934259', + name: 'extend-pencil', + font_class: 'extend-pencil', + unicode: 'e791', + unicode_decimal: 59281, + }, + { + icon_id: '28934260', + name: 'extend-bicycle', + font_class: 'extend-bicycle', + unicode: 'e792', + unicode_decimal: 59282, + }, + { + icon_id: '28934261', + name: 'extend-save', + font_class: 'extend-save', + unicode: 'e793', + unicode_decimal: 59283, + }, + { + icon_id: '28934262', + name: 'extend-trash', + font_class: 'extend-trash', + unicode: 'e795', + unicode_decimal: 59285, + }, + { + icon_id: '28934263', + name: 'extend-bus', + font_class: 'extend-bus', + unicode: 'e796', + unicode_decimal: 59286, + }, + { + icon_id: '28934264', + name: 'file-eps', + font_class: 'file-eps', + unicode: 'e797', + unicode_decimal: 59287, + }, + { + icon_id: '28934265', + name: 'file-ai', + font_class: 'file-ai', + unicode: 'e798', + unicode_decimal: 59288, + }, + { + icon_id: '28934266', + name: 'extend-share', + font_class: 'extend-share', + unicode: 'e799', + unicode_decimal: 59289, + }, + { + icon_id: '28934267', + name: 'file-audio', + font_class: 'file-audio', + unicode: 'e79b', + unicode_decimal: 59291, + }, + { + icon_id: '28934268', + name: 'file-word', + font_class: 'file-word', + unicode: 'e79c', + unicode_decimal: 59292, + }, + { + icon_id: '28934269', + name: 'file-pdf', + font_class: 'file-pdf', + unicode: 'e79d', + unicode_decimal: 59293, + }, + { + icon_id: '28934270', + name: 'file-code', + font_class: 'file-code', + unicode: 'e79f', + unicode_decimal: 59295, + }, + { + icon_id: '28934271', + name: 'flowCirculate', + font_class: 'flowCirculate', + unicode: 'e7a1', + unicode_decimal: 59297, + }, + { + icon_id: '28934272', + name: 'file-ppt', + font_class: 'file-ppt', + unicode: 'e7a4', + unicode_decimal: 59300, + }, + { + icon_id: '28934273', + name: 'file-video', + font_class: 'file-video', + unicode: 'e7a5', + unicode_decimal: 59301, + }, + { + icon_id: '28934276', + name: 'file-zip', + font_class: 'file-zip', + unicode: 'e7a8', + unicode_decimal: 59304, + }, + { + icon_id: '28934277', + name: 'flowDone', + font_class: 'flowDone', + unicode: 'e7a9', + unicode_decimal: 59305, + }, + { + icon_id: '28934278', + name: 'file-psd', + font_class: 'file-psd', + unicode: 'e7aa', + unicode_decimal: 59306, + }, + { + icon_id: '28934280', + name: 'gangwei2', + font_class: 'gangwei2', + unicode: 'e7ac', + unicode_decimal: 59308, + }, + { + icon_id: '28934281', + name: 'full-screen', + font_class: 'full-screen', + unicode: 'e7ad', + unicode_decimal: 59309, + }, + { + icon_id: '28934282', + name: 'file-rar', + font_class: 'file-rar', + unicode: 'e7ae', + unicode_decimal: 59310, + }, + { + icon_id: '28934283', + name: 'file-visio-1', + font_class: 'file-visio-1', + unicode: 'e7af', + unicode_decimal: 59311, + }, + { + icon_id: '28934284', + name: 'file-movie', + font_class: 'file-movie', + unicode: 'e7b0', + unicode_decimal: 59312, + }, + { + icon_id: '28934287', + name: 'generator-barcode', + font_class: 'generator-barcode', + unicode: 'e7b4', + unicode_decimal: 59316, + }, + { + icon_id: '28934288', + name: 'flowDesign', + font_class: 'flowDesign', + unicode: 'e7b5', + unicode_decimal: 59317, + }, + { + icon_id: '28934289', + name: 'formExample1', + font_class: 'formExample1', + unicode: 'e7b7', + unicode_decimal: 59319, + }, + { + icon_id: '28934291', + name: 'file-xml', + font_class: 'file-xml', + unicode: 'e7b9', + unicode_decimal: 59321, + }, + { + icon_id: '28934292', + name: 'flowMonitor', + font_class: 'flowMonitor', + unicode: 'e7ba', + unicode_decimal: 59322, + }, + { + icon_id: '28934294', + name: 'extend-rocket', + font_class: 'extend-rocket', + unicode: 'e7bc', + unicode_decimal: 59324, + }, + { + icon_id: '28934295', + name: 'file-image', + font_class: 'file-image', + unicode: 'e7bd', + unicode_decimal: 59325, + }, + { + icon_id: '28934296', + name: 'generator-bar', + font_class: 'generator-bar', + unicode: 'e7be', + unicode_decimal: 59326, + }, + { + icon_id: '28934298', + name: 'generator-date-range', + font_class: 'generator-date-range', + unicode: 'e7c0', + unicode_decimal: 59328, + }, + { + icon_id: '28934299', + name: 'generator-date', + font_class: 'generator-date', + unicode: 'e7c1', + unicode_decimal: 59329, + }, + { + icon_id: '28934300', + name: 'generator-card', + font_class: 'generator-card', + unicode: 'e7c2', + unicode_decimal: 59330, + }, + { + icon_id: '28934301', + name: 'file-visio', + font_class: 'file-visio', + unicode: 'e7c3', + unicode_decimal: 59331, + }, + { + icon_id: '28934302', + name: 'generator-dictionary', + font_class: 'generator-dictionary', + unicode: 'e7c4', + unicode_decimal: 59332, + }, + { + icon_id: '28934303', + name: 'generator-email', + font_class: 'generator-email', + unicode: 'e7c5', + unicode_decimal: 59333, + }, + { + icon_id: '28934304', + name: 'generator-company', + font_class: 'generator-company', + unicode: 'e7c6', + unicode_decimal: 59334, + }, + { + icon_id: '28934305', + name: 'generator-annular', + font_class: 'generator-annular', + unicode: 'e7c7', + unicode_decimal: 59335, + }, + { + icon_id: '28934307', + name: 'generator-button', + font_class: 'generator-button', + unicode: 'e7c9', + unicode_decimal: 59337, + }, + { + icon_id: '28934308', + name: 'generator-count', + font_class: 'generator-count', + unicode: 'e7ca', + unicode_decimal: 59338, + }, + { + icon_id: '28934309', + name: 'generator-layout', + font_class: 'generator-layout', + unicode: 'e7cb', + unicode_decimal: 59339, + }, + { + icon_id: '28934310', + name: 'file-excel', + font_class: 'file-excel', + unicode: 'e7cc', + unicode_decimal: 59340, + }, + { + icon_id: '28934311', + name: 'generator-cascader', + font_class: 'generator-cascader', + unicode: 'e7cd', + unicode_decimal: 59341, + }, + { + icon_id: '28934312', + name: 'generator-checkbox', + font_class: 'generator-checkbox', + unicode: 'e7ce', + unicode_decimal: 59342, + }, + { + icon_id: '28543576', + name: 'highchartsGauge', + font_class: 'highchartsGauge', + unicode: 'e856', + unicode_decimal: 59478, + }, + { + icon_id: '28543409', + name: 'wf-outgoingApply', + font_class: 'wf-outgoingApply', + unicode: 'e854', + unicode_decimal: 59476, + }, + { + icon_id: '28511095', + name: 'mac', + font_class: 'mac', + unicode: 'e7db', + unicode_decimal: 59355, + }, + { + icon_id: '28510878', + name: 'appDesign', + font_class: 'appDesign', + unicode: 'e6f9', + unicode_decimal: 59129, + }, + { + icon_id: '17964633', + name: 'generator-pie', + font_class: 'generator-pie', + unicode: 'e60b', + unicode_decimal: 58891, + }, + { + icon_id: '18234345', + name: '扫码', + font_class: 'scanCode', + unicode: 'e87e', + unicode_decimal: 59518, + }, + { + icon_id: '16619690', + name: 'mpUser', + font_class: 'mpUser', + unicode: 'e794', + unicode_decimal: 59284, + }, + { + icon_id: '16619696', + name: 'printExample', + font_class: 'printExample', + unicode: 'e79a', + unicode_decimal: 59290, + }, + { + icon_id: '16619700', + name: 'qyOrg', + font_class: 'qyOrg', + unicode: 'e79e', + unicode_decimal: 59294, + }, + { + icon_id: '16619702', + name: 'qyMessage', + font_class: 'qyMessage', + unicode: 'e7a0', + unicode_decimal: 59296, + }, + { + icon_id: '21596734', + name: 'subFlow', + font_class: 'generator-subFlow', + unicode: 'e61b', + unicode_decimal: 58907, + }, + { + icon_id: '16619704', + name: 'reportExample1', + font_class: 'reportExample1', + unicode: 'e7a2', + unicode_decimal: 59298, + }, + { + icon_id: '16619705', + name: 'qyConfig', + font_class: 'qyConfig', + unicode: 'e7a3', + unicode_decimal: 59299, + }, + { + icon_id: '21737016', + name: 'saoyisao', + font_class: 'saoyisao', + unicode: 'e623', + unicode_decimal: 58915, + }, + { + icon_id: '16619724', + name: 'highcharts-Pie', + font_class: 'highcharts-Pie', + unicode: 'e7b6', + unicode_decimal: 59318, + }, + { + icon_id: '26737115', + name: 'report-icon-area', + font_class: 'report-icon-area', + unicode: 'e63e', + unicode_decimal: 58942, + }, + { + icon_id: '26737116', + name: 'report-icon-arrow-down', + font_class: 'report-icon-arrow-down', + unicode: 'e63f', + unicode_decimal: 58943, + }, + { + icon_id: '26737117', + name: 'report-icon-align-left', + font_class: 'report-icon-align-left', + unicode: 'e640', + unicode_decimal: 58944, + }, + { + icon_id: '26737118', + name: 'report-icon-align-top', + font_class: 'report-icon-align-top', + unicode: 'e641', + unicode_decimal: 58945, + }, + { + icon_id: '26737119', + name: 'report-icon-border-all', + font_class: 'report-icon-border-all', + unicode: 'e642', + unicode_decimal: 58946, + }, + { + icon_id: '26737120', + name: 'report-icon-align-bottom', + font_class: 'report-icon-align-bottom', + unicode: 'e643', + unicode_decimal: 58947, + }, + { + icon_id: '26737121', + name: 'report-icon-align-right', + font_class: 'report-icon-align-right', + unicode: 'e644', + unicode_decimal: 58948, + }, + { + icon_id: '26737122', + name: 'report-icon-bold', + font_class: 'report-icon-bold', + unicode: 'e645', + unicode_decimal: 58949, + }, + { + icon_id: '26737123', + name: 'report-icon-border-bottom', + font_class: 'report-icon-border-bottom', + unicode: 'e646', + unicode_decimal: 58950, + }, + { + icon_id: '26737124', + name: 'report-icon-align-center', + font_class: 'report-icon-align-center', + unicode: 'e647', + unicode_decimal: 58951, + }, + { + icon_id: '26737125', + name: 'report-icon-border-right', + font_class: 'report-icon-border-right', + unicode: 'e648', + unicode_decimal: 58952, + }, + { + icon_id: '26737126', + name: 'report-icon-bubble', + font_class: 'report-icon-bubble', + unicode: 'e649', + unicode_decimal: 58953, + }, + { + icon_id: '26737127', + name: 'report-icon-diagram', + font_class: 'report-icon-diagram', + unicode: 'e64a', + unicode_decimal: 58954, + }, + { + icon_id: '26737128', + name: 'report-icon-enlarge', + font_class: 'report-icon-enlarge', + unicode: 'e64b', + unicode_decimal: 58955, + }, + { + icon_id: '26737129', + name: 'report-icon-align-middle', + font_class: 'report-icon-align-middle', + unicode: 'e64c', + unicode_decimal: 58956, + }, + { + icon_id: '26737131', + name: 'report-icon-preview-pagePre', + font_class: 'report-icon-preview-pagePre', + unicode: 'e64e', + unicode_decimal: 58958, + }, + { + icon_id: '26737132', + name: 'report-icon-border-left', + font_class: 'report-icon-border-left', + unicode: 'e64f', + unicode_decimal: 58959, + }, + { + icon_id: '26737134', + name: 'report-icon-font', + font_class: 'report-icon-font', + unicode: 'e652', + unicode_decimal: 58962, + }, + { + icon_id: '26737135', + name: 'report-icon-border-top', + font_class: 'report-icon-border-top', + unicode: 'e653', + unicode_decimal: 58963, + }, + { + icon_id: '26737138', + name: 'report-icon-background-color', + font_class: 'report-icon-background-color', + unicode: 'e656', + unicode_decimal: 58966, + }, + { + icon_id: '26737139', + name: 'report-icon-border-custom', + font_class: 'report-icon-border-custom', + unicode: 'e657', + unicode_decimal: 58967, + }, + { + icon_id: '26737140', + name: 'report-icon-horizontal-column', + font_class: 'report-icon-horizontal-column', + unicode: 'e65c', + unicode_decimal: 58972, + }, + { + icon_id: '26737141', + name: 'report-icon-column', + font_class: 'report-icon-column', + unicode: 'e65d', + unicode_decimal: 58973, + }, + { + icon_id: '26737142', + name: 'report-icon-font-type', + font_class: 'report-icon-font-type', + unicode: 'e65e', + unicode_decimal: 58974, + }, + { + icon_id: '26737143', + name: 'report-icon-import-excel', + font_class: 'report-icon-import-excel', + unicode: 'e65f', + unicode_decimal: 58975, + }, + { + icon_id: '26737144', + name: 'report-icon-restore', + font_class: 'report-icon-restore', + unicode: 'e662', + unicode_decimal: 58978, + }, + { + icon_id: '26737145', + name: 'report-icon-oblique-head', + font_class: 'report-icon-oblique-head', + unicode: 'e663', + unicode_decimal: 58979, + }, + { + icon_id: '26737146', + name: 'report-icon-preview-pdf', + font_class: 'report-icon-preview-pdf', + unicode: 'e664', + unicode_decimal: 58980, + }, + { + icon_id: '26737147', + name: 'report-icon-preview-pageNext', + font_class: 'report-icon-preview-pageNext', + unicode: 'e665', + unicode_decimal: 58981, + }, + { + icon_id: '26737148', + name: 'report-icon-preview-print', + font_class: 'report-icon-preview-print', + unicode: 'e666', + unicode_decimal: 58982, + }, + { + icon_id: '26737149', + name: 'report-icon-preview-pageLast', + font_class: 'report-icon-preview-pageLast', + unicode: 'e667', + unicode_decimal: 58983, + }, + { + icon_id: '26737151', + name: 'report-icon-preview-excel-paging', + font_class: 'report-icon-preview-excel-paging', + unicode: 'e669', + unicode_decimal: 58985, + }, + { + icon_id: '26737152', + name: 'report-icon-radar', + font_class: 'report-icon-radar', + unicode: 'e66a', + unicode_decimal: 58986, + }, + { + icon_id: '26737153', + name: 'report-icon-border-none', + font_class: 'report-icon-border-none', + unicode: 'e66b', + unicode_decimal: 58987, + }, + { + icon_id: '26737154', + name: 'report-icon-preview-word', + font_class: 'report-icon-preview-word', + unicode: 'e66c', + unicode_decimal: 58988, + }, + { + icon_id: '26737157', + name: 'report-icon-scatter', + font_class: 'report-icon-scatter', + unicode: 'e66f', + unicode_decimal: 58991, + }, + { + icon_id: '26737158', + name: 'report-icon-preview-printPreview', + font_class: 'report-icon-preview-printPreview', + unicode: 'e670', + unicode_decimal: 58992, + }, + { + icon_id: '26737159', + name: 'report-icon-preview-excel-with-paging-sheet', + font_class: 'report-icon-preview-excel-with-paging-sheet', + unicode: 'e671', + unicode_decimal: 58993, + }, + { + icon_id: '26737160', + name: 'report-icon-fontsize', + font_class: 'report-icon-fontsize', + unicode: 'e672', + unicode_decimal: 58994, + }, + { + icon_id: '26737161', + name: 'report-icon-search-setting', + font_class: 'report-icon-search-setting', + unicode: 'e673', + unicode_decimal: 58995, + }, + { + icon_id: '26737162', + name: 'report-icon-preview-excel', + font_class: 'report-icon-preview-excel', + unicode: 'e674', + unicode_decimal: 58996, + }, + { + icon_id: '26737163', + name: 'report-icon-undo', + font_class: 'report-icon-undo', + unicode: 'e675', + unicode_decimal: 58997, + }, + { + icon_id: '26737164', + name: 'report-icon-shrink', + font_class: 'report-icon-shrink', + unicode: 'e676', + unicode_decimal: 58998, + }, + { + icon_id: '26737165', + name: 'report-icon-configuration', + font_class: 'report-icon-configuration', + unicode: 'e677', + unicode_decimal: 58999, + }, + { + icon_id: '26737166', + name: 'report-icon-preview-refresh', + font_class: 'report-icon-preview-refresh', + unicode: 'e678', + unicode_decimal: 59000, + }, + { + icon_id: '26737167', + name: 'report-icon-underline', + font_class: 'report-icon-underline', + unicode: 'e679', + unicode_decimal: 59001, + }, + { + icon_id: '26737169', + name: 'report-icon-italic', + font_class: 'report-icon-italic', + unicode: 'e67b', + unicode_decimal: 59003, + }, + { + icon_id: '26737170', + name: 'report-icon-preview-printPdf', + font_class: 'report-icon-preview-printPdf', + unicode: 'e67c', + unicode_decimal: 59004, + }, + { + icon_id: '26737861', + name: 'report-icon-merge-cell', + font_class: 'report-icon-merge-cell', + unicode: 'e67a', + unicode_decimal: 59002, + }, + { + icon_id: '26897626', + name: 'report-icon-polar-plot', + font_class: 'report-icon-polar-plot', + unicode: 'e650', + unicode_decimal: 58960, + }, + { + icon_id: '26897628', + name: 'report-icon-page-preview', + font_class: 'report-icon-page-preview', + unicode: 'e668', + unicode_decimal: 58984, + }, + { + icon_id: '26897629', + name: 'report-icon-doughnut', + font_class: 'report-icon-doughnut', + unicode: 'e66e', + unicode_decimal: 58990, + }, + { + icon_id: '27172163', + name: 'report-icon-preview', + font_class: 'report-icon-preview', + unicode: 'e655', + unicode_decimal: 58965, + }, + { + icon_id: '27761298', + name: 'pageDesign', + font_class: 'pageDesign', + unicode: 'e684', + unicode_decimal: 59012, + }, + { + icon_id: '27761299', + name: 'customUrl', + font_class: 'customUrl', + unicode: 'e685', + unicode_decimal: 59013, + }, + { + icon_id: '16685679', + name: 'btn-clearn', + font_class: 'btn-clearn', + unicode: 'e80a', + unicode_decimal: 59402, + }, + { + icon_id: '16705884', + name: 'tree-organization', + font_class: 'tree-organization1', + unicode: 'e82e', + unicode_decimal: 59438, + }, + { + icon_id: '17615283', + name: 'generator-documents', + font_class: 'generator-documents', + unicode: 'e878', + unicode_decimal: 59512, + }, + { + icon_id: '17615287', + name: 'generator-create time', + font_class: 'generator-createtime', + unicode: 'e87c', + unicode_decimal: 59516, + }, + ], +}; diff --git a/src/components/Yunzhupaas/IconPicker/index.ts b/src/components/Yunzhupaas/IconPicker/index.ts new file mode 100644 index 0000000..87798d9 --- /dev/null +++ b/src/components/Yunzhupaas/IconPicker/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import IconPicker from './src/IconPicker.vue'; + +export const YunzhupaasIconPicker = withInstall(IconPicker); diff --git a/src/components/Yunzhupaas/IconPicker/src/IconPicker.vue b/src/components/Yunzhupaas/IconPicker/src/IconPicker.vue new file mode 100644 index 0000000..e1812c6 --- /dev/null +++ b/src/components/Yunzhupaas/IconPicker/src/IconPicker.vue @@ -0,0 +1,167 @@ + + + + diff --git a/src/components/Yunzhupaas/IconPicker/src/props.ts b/src/components/Yunzhupaas/IconPicker/src/props.ts new file mode 100644 index 0000000..46969cb --- /dev/null +++ b/src/components/Yunzhupaas/IconPicker/src/props.ts @@ -0,0 +1,5 @@ +export const iconPickerProps = { + value: String, + placeholder: { type: String, default: '请选择' }, + disabled: { type: Boolean, default: false }, +}; diff --git a/src/components/Yunzhupaas/Iframe/index.ts b/src/components/Yunzhupaas/Iframe/index.ts new file mode 100644 index 0000000..5c8a965 --- /dev/null +++ b/src/components/Yunzhupaas/Iframe/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils'; +import Iframe from './src/Iframe.vue'; + +export const YunzhupaasIframe = withInstall(Iframe); diff --git a/src/components/Yunzhupaas/Iframe/src/Iframe.vue b/src/components/Yunzhupaas/Iframe/src/Iframe.vue new file mode 100644 index 0000000..6fbb5ef --- /dev/null +++ b/src/components/Yunzhupaas/Iframe/src/Iframe.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/components/Yunzhupaas/Upload/src/SimpleUploader/FileItem.vue b/src/components/Yunzhupaas/Upload/src/SimpleUploader/FileItem.vue new file mode 100644 index 0000000..2cdd801 --- /dev/null +++ b/src/components/Yunzhupaas/Upload/src/SimpleUploader/FileItem.vue @@ -0,0 +1,379 @@ + + + + + diff --git a/src/components/Yunzhupaas/Upload/src/SimpleUploader/FileUploader.vue b/src/components/Yunzhupaas/Upload/src/SimpleUploader/FileUploader.vue new file mode 100644 index 0000000..cabdbe9 --- /dev/null +++ b/src/components/Yunzhupaas/Upload/src/SimpleUploader/FileUploader.vue @@ -0,0 +1,307 @@ + + + + diff --git a/src/components/Yunzhupaas/Upload/src/UploadBtn.vue b/src/components/Yunzhupaas/Upload/src/UploadBtn.vue new file mode 100644 index 0000000..b3ebccb --- /dev/null +++ b/src/components/Yunzhupaas/Upload/src/UploadBtn.vue @@ -0,0 +1,175 @@ + + + + diff --git a/src/components/Yunzhupaas/Upload/src/UploadFile.vue b/src/components/Yunzhupaas/Upload/src/UploadFile.vue new file mode 100644 index 0000000..6fecc8f --- /dev/null +++ b/src/components/Yunzhupaas/Upload/src/UploadFile.vue @@ -0,0 +1,256 @@ + + + + diff --git a/src/components/Yunzhupaas/Upload/src/UploadImg.vue b/src/components/Yunzhupaas/Upload/src/UploadImg.vue new file mode 100644 index 0000000..6b8af57 --- /dev/null +++ b/src/components/Yunzhupaas/Upload/src/UploadImg.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/src/components/Yunzhupaas/Upload/src/UploadImgSingle.vue b/src/components/Yunzhupaas/Upload/src/UploadImgSingle.vue new file mode 100644 index 0000000..efc7008 --- /dev/null +++ b/src/components/Yunzhupaas/Upload/src/UploadImgSingle.vue @@ -0,0 +1,210 @@ + + + + diff --git a/src/components/Yunzhupaas/Upload/src/helper.ts b/src/components/Yunzhupaas/Upload/src/helper.ts new file mode 100644 index 0000000..7936b54 --- /dev/null +++ b/src/components/Yunzhupaas/Upload/src/helper.ts @@ -0,0 +1,27 @@ +export function checkFileType(file: File, accepts: string[]) { + const newTypes = accepts.join('|'); + // const reg = /\.(jpg|jpeg|png|gif|txt|doc|docx|xls|xlsx|xml)$/i; + const reg = new RegExp('\\.(' + newTypes + ')$', 'i'); + + return reg.test(file.name); +} + +export function checkImgType(file: File) { + return isImgTypeByName(file.name); +} + +export function isImgTypeByName(name: string) { + return /\.(jpg|jpeg|png|gif|webp)$/i.test(name); +} + +export function getBase64WithFile(file: File) { + return new Promise<{ + result: string; + file: File; + }>((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve({ result: reader.result as string, file }); + reader.onerror = error => reject(error); + }); +} diff --git a/src/components/Yunzhupaas/Upload/src/props.ts b/src/components/Yunzhupaas/Upload/src/props.ts new file mode 100644 index 0000000..cfc2db6 --- /dev/null +++ b/src/components/Yunzhupaas/Upload/src/props.ts @@ -0,0 +1,63 @@ +export interface imgItem { + name: string; + fileId: string; + url: string; + thumbUrl: string; +} +export interface fileItem extends imgItem { + fileSize: number | string; + fileExtension?: string; + fileVersionId?: string; +} + +export const units = { + KB: 1024, + MB: 1024 * 1024, + GB: 1024 * 1024 * 1024, +}; +const uploadBaseProps = { + disabled: { type: Boolean, default: false }, + detailed: { type: Boolean, default: false }, + sizeUnit: { type: String, default: 'MB' }, + fileSize: { type: Number, default: 10 }, + limit: { type: Number, default: 0 }, + tipText: { type: String, default: '' }, + showTip: { type: Boolean, default: false }, + simple: { type: Boolean, default: false }, + showUploadList: { type: Boolean, default: true }, + pathType: { type: String, default: 'defaultPath' }, + sortRule: { type: Object, default: () => [] }, + timeFormat: { type: String, default: 'YYYY' }, + folder: { type: String, default: '' }, +}; + +export const uploadImgProps = { + ...uploadBaseProps, + value: { type: Array as PropType }, + type: { type: String, default: 'annexpic' }, + accept: { type: String, default: 'image/*' }, + buttonText: { type: String, default: '' }, + // card,button,dragger + showType: { type: String, default: 'card' }, +}; +export const uploadFileProps = { + ...uploadBaseProps, + value: { type: Array as PropType, default: [] }, + type: { type: String, default: 'annex' }, + accept: { type: String, default: '*' }, + buttonText: { type: String, default: '点击上传' }, + showIcon: { type: Boolean, default: true }, + showView: { type: Boolean, default: true }, + showDownload: { type: Boolean, default: true }, +}; +export const uploadImgSingleProps = { + value: { type: String, default: '' }, + tipText: { type: String, default: '' }, + subTipText: { type: String, default: '' }, + type: { type: String, default: 'annexpic' }, + accept: { type: String, default: 'image/*' }, + disabled: { type: Boolean, default: false }, + sizeUnit: { type: String, default: 'MB' }, + fileSize: { type: Number, default: 10 }, + actionPrefix: { type: String, default: '' }, +}; diff --git a/src/components/Yunzhupaas/index.ts b/src/components/Yunzhupaas/index.ts new file mode 100644 index 0000000..d4c9fd0 --- /dev/null +++ b/src/components/Yunzhupaas/index.ts @@ -0,0 +1,123 @@ +import { Input, DatePicker } from 'ant-design-vue'; + +// yunzhupaas 组件 +import { BasicCaption } from '@/components/Basic'; +import { YunzhupaasAlert } from '@/components/Yunzhupaas/Alert'; +import { YunzhupaasAreaSelect } from '@/components/Yunzhupaas/AreaSelect'; +import { YunzhupaasAutoComplete } from '@/components/Yunzhupaas/AutoComplete'; +import { YunzhupaasButton } from '@/components/Yunzhupaas/Button'; +import { YunzhupaasCron } from '@/components/Yunzhupaas/Cron'; +import { YunzhupaasCascader } from '@/components/Yunzhupaas/Cascader'; +import { YunzhupaasCheckbox, YunzhupaasCheckboxSingle } from '@/components/Yunzhupaas/Checkbox'; +import { YunzhupaasColorPicker } from '@/components/Yunzhupaas/ColorPicker'; +import { YunzhupaasDatePicker, YunzhupaasDateRange, YunzhupaasTimePicker, YunzhupaasTimeRange } from '@/components/Yunzhupaas/DatePicker'; +import { YunzhupaasDivider } from '@/components/Yunzhupaas/Divider'; +import { YunzhupaasIconPicker } from '@/components/Yunzhupaas/IconPicker'; +import { YunzhupaasInput, YunzhupaasTextarea, YunzhupaasI18nInput } from '@/components/Yunzhupaas/Input'; +import { YunzhupaasInputNumber } from '@/components/Yunzhupaas/InputNumber'; +import { YunzhupaasLink } from '@/components/Yunzhupaas/Link'; +import { YunzhupaasOpenData } from '@/components/Yunzhupaas/OpenData'; +import { YunzhupaasOrganizeSelect, YunzhupaasDepSelect, YunzhupaasPosSelect, YunzhupaasGroupSelect, YunzhupaasRoleSelect, YunzhupaasUserSelect, YunzhupaasUsersSelect } from '@/components/Yunzhupaas/Organize'; +import { YunzhupaasQrcode } from '@/components/Yunzhupaas/Qrcode'; +import { YunzhupaasBarcode } from '@/components/Yunzhupaas/Barcode'; +import { YunzhupaasRadio } from '@/components/Yunzhupaas/Radio'; +import { YunzhupaasSelect } from '@/components/Yunzhupaas/Select'; +import { YunzhupaasRate } from '@/components/Yunzhupaas/Rate'; +import { YunzhupaasSlider } from '@/components/Yunzhupaas/Slider'; +import { YunzhupaasSign } from '@/components/Yunzhupaas/Sign'; +import { YunzhupaasSignature } from '@/components/Yunzhupaas/Signature'; +import { YunzhupaasSwitch } from '@/components/Yunzhupaas/Switch'; +import { YunzhupaasText } from '@/components/Yunzhupaas/Text'; +import { YunzhupaasTreeSelect } from '@/components/Yunzhupaas/TreeSelect'; +import { YunzhupaasUploadFile, YunzhupaasUploadImg, YunzhupaasUploadImgSingle } from '@/components/Yunzhupaas/Upload'; +import { Tinymce } from '@/components/Tinymce/index'; +import { YunzhupaasRelationForm } from '@/components/Yunzhupaas/RelationForm'; +import { YunzhupaasRelationFormByUrl } from '@/components/Yunzhupaas/RelationFormByUrl'; +import { YunzhupaasRelationFormAttr } from '@/components/Yunzhupaas/RelationFormAttr'; +import { YunzhupaasPopupSelect, YunzhupaasPopupTableSelect } from '@/components/Yunzhupaas/PopupSelect'; +import { YunzhupaasPopupAttr } from '@/components/Yunzhupaas/PopupAttr'; +import { YunzhupaasNumberRange } from '@/components/Yunzhupaas/NumberRange'; +import { YunzhupaasCalculate } from '@/components/Yunzhupaas/Calculate'; +import { YunzhupaasInputTable } from '@/components/Yunzhupaas/InputTable'; +import { YunzhupaasLocation } from '@/components/Yunzhupaas/Location'; +import { YunzhupaasIframe } from '@/components/Yunzhupaas/Iframe'; +import { YunzhupaasTextTag } from '@/components/Yunzhupaas/TextTag'; + +const YunzhupaasInputPassword = Input.Password; +YunzhupaasInputPassword.name = 'YunzhupaasInputPassword'; +const YunzhupaasInputGroup = Input.Group; +YunzhupaasInputGroup.name = 'YunzhupaasInputGroup'; +const YunzhupaasInputSearch = Input.Search; +YunzhupaasInputSearch.name = 'YunzhupaasInputSearch'; +const YunzhupaasEditor = Tinymce; +YunzhupaasEditor.name = 'YunzhupaasEditor'; +const YunzhupaasGroupTitle = BasicCaption; +YunzhupaasGroupTitle.name = 'YunzhupaasGroupTitle'; +const YunzhupaasMonthPicker = DatePicker.MonthPicker; +YunzhupaasMonthPicker.name = 'YunzhupaasMonthPicker'; +const YunzhupaasWeekPicker = DatePicker.WeekPicker; +YunzhupaasWeekPicker.name = 'YunzhupaasWeekPicker'; + +export { + YunzhupaasAlert, + YunzhupaasAreaSelect, + YunzhupaasAutoComplete, + YunzhupaasButton, + YunzhupaasCron, + YunzhupaasCascader, + YunzhupaasColorPicker, + YunzhupaasCheckbox, + YunzhupaasCheckboxSingle, + YunzhupaasDatePicker, + YunzhupaasDateRange, + YunzhupaasTimePicker, + YunzhupaasTimeRange, + YunzhupaasMonthPicker, + YunzhupaasWeekPicker, + YunzhupaasDivider, + YunzhupaasEditor, + YunzhupaasGroupTitle, + YunzhupaasIconPicker, + YunzhupaasInput, + YunzhupaasInputPassword, + YunzhupaasInputGroup, + YunzhupaasInputSearch, + YunzhupaasTextarea, + YunzhupaasI18nInput, + YunzhupaasInputNumber, + YunzhupaasLink, + YunzhupaasOpenData, + YunzhupaasOrganizeSelect, + YunzhupaasDepSelect, + YunzhupaasPosSelect, + YunzhupaasGroupSelect, + YunzhupaasRoleSelect, + YunzhupaasUserSelect, + YunzhupaasUsersSelect, + YunzhupaasQrcode, + YunzhupaasBarcode, + YunzhupaasRadio, + YunzhupaasRate, + YunzhupaasSelect, + YunzhupaasSlider, + YunzhupaasSign, + YunzhupaasSignature, + YunzhupaasSwitch, + YunzhupaasText, + YunzhupaasTreeSelect, + YunzhupaasUploadFile, + YunzhupaasUploadImg, + YunzhupaasUploadImgSingle, + YunzhupaasRelationForm, + YunzhupaasRelationFormByUrl, + YunzhupaasRelationFormAttr, + YunzhupaasPopupSelect, + YunzhupaasPopupTableSelect, + YunzhupaasPopupAttr, + YunzhupaasNumberRange, + YunzhupaasCalculate, + YunzhupaasInputTable, + YunzhupaasLocation, + YunzhupaasIframe, + YunzhupaasTextTag, +}; diff --git a/src/components/registerGlobComp.ts b/src/components/registerGlobComp.ts new file mode 100644 index 0000000..fcdecb8 --- /dev/null +++ b/src/components/registerGlobComp.ts @@ -0,0 +1,179 @@ +import type { App } from 'vue'; +import { Button } from './Button'; +import { + Input, + InputNumber, + Layout, + Form, + Switch, + Dropdown, + Menu, + Select, + Table, + Checkbox, + Tabs, + Collapse, + Card, + Tooltip, + Row, + Col, + Popconfirm, + Divider, + Alert, + AutoComplete, + Cascader, + Rate, + Slider, + Avatar, + Tag, + Space, + Steps, + Popover, + Radio, + Progress, + Image, + Upload, +} from 'ant-design-vue'; + +import { BasicHelp, BasicCaption } from '@/components/Basic'; + +import { YunzhupaasAlert } from '@/components/Yunzhupaas/Alert'; +import { YunzhupaasAreaSelect } from '@/components/Yunzhupaas/AreaSelect'; +import { YunzhupaasAutoComplete } from '@/components/Yunzhupaas/AutoComplete'; +import { YunzhupaasButton } from '@/components/Yunzhupaas/Button'; +import { YunzhupaasCron } from '@/components/Yunzhupaas/Cron'; +import { YunzhupaasCascader } from '@/components/Yunzhupaas/Cascader'; +import { YunzhupaasCheckbox, YunzhupaasCheckboxSingle } from '@/components/Yunzhupaas/Checkbox'; +import { YunzhupaasColorPicker } from '@/components/Yunzhupaas/ColorPicker'; +import { YunzhupaasDatePicker, YunzhupaasDateRange, YunzhupaasTimePicker, YunzhupaasTimeRange } from '@/components/Yunzhupaas/DatePicker'; +import { YunzhupaasDivider } from '@/components/Yunzhupaas/Divider'; +import { YunzhupaasEmpty } from '@/components/Yunzhupaas/Empty'; +import { YunzhupaasIconPicker } from '@/components/Yunzhupaas/IconPicker'; +import { YunzhupaasInput, YunzhupaasTextarea, YunzhupaasI18nInput } from '@/components/Yunzhupaas/Input'; +import { YunzhupaasInputNumber } from '@/components/Yunzhupaas/InputNumber'; +import { YunzhupaasLink } from '@/components/Yunzhupaas/Link'; +import { YunzhupaasOpenData } from '@/components/Yunzhupaas/OpenData'; +import { YunzhupaasOrganizeSelect, YunzhupaasDepSelect, YunzhupaasPosSelect, YunzhupaasGroupSelect, YunzhupaasRoleSelect, YunzhupaasUserSelect, YunzhupaasUsersSelect } from '@/components/Yunzhupaas/Organize'; +import { YunzhupaasQrcode } from '@/components/Yunzhupaas/Qrcode'; +import { YunzhupaasBarcode } from '@/components/Yunzhupaas/Barcode'; +import { YunzhupaasRadio } from '@/components/Yunzhupaas/Radio'; +import { YunzhupaasSelect } from '@/components/Yunzhupaas/Select'; +import { YunzhupaasRate } from '@/components/Yunzhupaas/Rate'; +import { YunzhupaasSlider } from '@/components/Yunzhupaas/Slider'; +import { YunzhupaasSign } from '@/components/Yunzhupaas/Sign'; +import { YunzhupaasSignature } from '@/components/Yunzhupaas/Signature'; +import { YunzhupaasSwitch } from '@/components/Yunzhupaas/Switch'; +import { YunzhupaasText } from '@/components/Yunzhupaas/Text'; +import { YunzhupaasTreeSelect } from '@/components/Yunzhupaas/TreeSelect'; +import { YunzhupaasUploadFile, YunzhupaasUploadImg, YunzhupaasUploadImgSingle, YunzhupaasUploadBtn } from '@/components/Yunzhupaas/Upload'; +import { Tinymce } from '@/components/Tinymce/index'; // 保留 Tinymce 导入,但暂时不注册 +import { YunzhupaasNumberRange } from '@/components/Yunzhupaas/NumberRange'; +import { YunzhupaasRelationFormAttr } from '@/components/Yunzhupaas/RelationFormAttr'; + +import { YunzhupaasPopupSelect, YunzhupaasPopupTableSelect } from '@/components/Yunzhupaas/PopupSelect'; +import { YunzhupaasPopupAttr } from '@/components/Yunzhupaas/PopupAttr'; +import { YunzhupaasCalculate } from '@/components/Yunzhupaas/Calculate'; +import { YunzhupaasLocation } from '@/components/Yunzhupaas/Location'; +import { YunzhupaasIframe } from '@/components/Yunzhupaas/Iframe'; +import { YunzhupaasTextTag } from '@/components/Yunzhupaas/TextTag'; + +const YunzhupaasEditor = Tinymce; +YunzhupaasEditor.name = 'YunzhupaasEditor'; +const YunzhupaasGroupTitle = BasicCaption; +YunzhupaasGroupTitle.name = 'YunzhupaasGroupTitle'; + +export function registerGlobComp(app: App) { + app + .use(Input) + .use(InputNumber) + .use(Button) + .use(Layout) + .use(Form) + .use(Switch) + .use(Dropdown) + .use(Menu) + .use(Select) + .use(Table) + .use(Checkbox) + .use(Tabs) + .use(Card) + .use(Collapse) + .use(Tooltip) + .use(Row) + .use(Col) + .use(Popconfirm) + .use(Popover) + .use(Divider) + .use(Slider) + .use(Rate) + .use(Alert) + .use(AutoComplete) + .use(Cascader) + .use(Avatar) + .use(Tag) + .use(Space) + .use(Steps) + .use(Radio) + .use(Progress) + .use(Image) + .use(Upload) + .use(BasicHelp) + // TODO: Yunzhupaas 组件待实现 + .use(YunzhupaasAlert) + .use(YunzhupaasRate) + .use(YunzhupaasSlider) + .use(YunzhupaasAreaSelect) + .use(YunzhupaasAutoComplete) + .use(YunzhupaasButton) + .use(YunzhupaasCron) + .use(YunzhupaasCascader) + .use(YunzhupaasCheckbox) + .use(YunzhupaasCheckboxSingle) + .use(YunzhupaasColorPicker) + .use(YunzhupaasDatePicker) + .use(YunzhupaasDateRange) + .use(YunzhupaasTimePicker) + .use(YunzhupaasTimeRange) + .use(YunzhupaasDivider) + .use(YunzhupaasEmpty) + .use(YunzhupaasGroupTitle) + .use(YunzhupaasIconPicker) + .use(YunzhupaasInput) + .use(YunzhupaasTextarea) + .use(YunzhupaasI18nInput) + .use(YunzhupaasInputNumber) + .use(YunzhupaasLink) + .use(YunzhupaasOrganizeSelect) + .use(YunzhupaasDepSelect) + .use(YunzhupaasPosSelect) + .use(YunzhupaasGroupSelect) + .use(YunzhupaasRoleSelect) + .use(YunzhupaasUserSelect) + .use(YunzhupaasUsersSelect) + .use(YunzhupaasOpenData) + .use(YunzhupaasQrcode) + .use(YunzhupaasBarcode) + .use(YunzhupaasRadio) + .use(YunzhupaasSelect) + .use(YunzhupaasSign) + .use(YunzhupaasSignature) + .use(YunzhupaasSwitch) + .use(YunzhupaasText) + .use(YunzhupaasTreeSelect) + // .use(Tinymce) // 注册 Tinymce 编辑器 + // TODO: Yunzhupaas 组件待实现 + .use(YunzhupaasEditor) + .use(YunzhupaasRelationFormAttr) + .use(YunzhupaasPopupSelect) + .use(YunzhupaasPopupTableSelect) + .use(YunzhupaasPopupAttr) + .use(YunzhupaasNumberRange) + .use(YunzhupaasCalculate) + .use(YunzhupaasUploadFile) + .use(YunzhupaasUploadImg) + .use(YunzhupaasUploadImgSingle) + .use(YunzhupaasUploadBtn) + .use(YunzhupaasLocation) + .use(YunzhupaasIframe) + .use(YunzhupaasTextTag); +} diff --git a/src/design/ant/btn.less b/src/design/ant/btn.less new file mode 100644 index 0000000..f4bee6a --- /dev/null +++ b/src/design/ant/btn.less @@ -0,0 +1,374 @@ +// button reset +.ant-btn { + &-link:hover, + &-link:focus, + &-link:active { + border-color: transparent !important; + } + &-text:not([disabled]):hover, + &-text:not([disabled]):focus, + &-text:not([disabled]):active { + border-color: transparent !important; + color: inherit !important; + } + + [data-theme='light'] &.ant-btn-link.is-disabled { + color: rgb(0 0 0 / 25%); + text-shadow: none; + cursor: not-allowed !important; + background-color: transparent !important; + border-color: transparent !important; + box-shadow: none; + &:hover { + color: rgb(0 0 0 / 25%); + } + } + + [data-theme='dark'] &.ant-btn-link.is-disabled { + color: rgb(255 255 255 / 25%) !important; + text-shadow: none; + cursor: not-allowed !important; + background-color: transparent !important; + border-color: transparent !important; + box-shadow: none; + &:hover { + color: rgb(255 255 255 / 25%) !important; + } + } + [data-theme='dark'] &.ant-btn-default { + border: 1px solid transparent; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + color: #c9d1d9; + border-color: #303030; + background: transparent; + &:hover, + &:focus, + &:active { + background: transparent; + } + } + + [data-theme='dark'] & { + &[disabled]:not(.ant-btn-text) { + color: rgba(255, 255, 255, 0.3); + background-color: rgba(255, 255, 255, 0.08); + border-color: #424242; + &:hover, + &:focus, + &:active { + color: rgba(255, 255, 255, 0.3); + background-color: rgba(255, 255, 255, 0.08); + border-color: #424242; + } + } + &.ant-btn-background-ghost:not(.ant-btn-primary, .ant-btn-warning, .ant-btn-success, .ant-btn-error) { + color: #c9d1d9; + border-color: rgba(255, 255, 255, 0.25); + &:hover, + &:focus, + &:active { + color: @primary-color; + border-color: @primary-color; + } + } + } + + // color: @white; + + &-success.ant-btn-link:not([disabled='disabled']) { + color: @button-success-color; + + &:hover, + &:focus { + color: @button-success-hover-color; + border-color: transparent; + } + + &:active { + color: @button-success-active-color; + } + } + + &-success.ant-btn-link.ant-btn-loading, + &-warning.ant-btn-link.ant-btn-loading, + &-danger.ant-btn-link.ant-btn-loading, + &-error.ant-btn-link.ant-btn-loading, + &-info.ant-btn-link.ant-btn-loading, + &-background-ghost.ant-btn-link.ant-btn-loading, + &.ant-btn-link.ant-btn-loading { + &::before { + background: transparent; + } + } + + &-success:not(.ant-btn-link, .is-disabled), + &-default&-success:not(.ant-btn-link, .is-disabled) { + color: @white; + background-color: @button-success-color; + border-color: @button-success-color; + //border-width: 0; + + &:hover, + &:focus { + color: @white; + background-color: @button-success-hover-color; + border-color: @button-success-hover-color; + } + + &:active { + background-color: @button-success-active-color; + border-color: @button-success-active-color; + } + } + + &-warning.ant-btn-link:not([disabled='disabled']) { + color: @button-warn-color; + + &:hover, + &:focus { + color: @button-warn-hover-color; + border-color: transparent; + } + + &:active { + color: @button-warn-active-color; + } + } + + &-warning:not(.ant-btn-link, .is-disabled, .ant-btn-dashed), + &-default&-warning:not(.ant-btn-link, .is-disabled) { + color: @white; + background-color: @button-warn-color; + border-color: @button-warn-color; + //border-width: 0; + + &:hover, + &:focus { + color: @white; + background-color: @button-warn-hover-color; + border-color: @button-warn-hover-color; + } + + &:active { + background-color: @button-warn-active-color; + border-color: @button-warn-active-color; + } + + //&[disabled], + //&[disabled]:hover { + // color: @white; + // background-color: fade(@button-warn-color, 40%); + // border-color: fade(@button-warn-color, 40%); + //} + } + + &-danger.ant-btn-link:not([disabled='disabled']), + &-error.ant-btn-link:not([disabled='disabled']) { + color: @button-error-color; + + &:hover, + &:focus { + color: @button-error-hover-color; + border-color: transparent; + } + + &:active { + color: @button-error-active-color; + } + } + + &-danger:not(.ant-btn-link, .is-disabled), + &-error:not(.ant-btn-link, .is-disabled), + &-default&-danger:not(.ant-btn-link, .is-disabled), + &-default&-error:not(.ant-btn-link, .is-disabled) { + color: @white; + background-color: @button-error-color; + border-color: @button-error-color; + //border-width: 0; + + &:hover, + &:focus { + color: @white; + background-color: @button-error-hover-color; + border-color: @button-error-hover-color; + } + + &:active { + background-color: @button-error-active-color; + border-color: @button-error-active-color; + } + + // &[disabled], + // &[disabled]:hover { + // color: @white; + // background-color: fade(@button-error-color, 40%); + // border-color: fade(@button-error-color, 40%); + // } + } + &-default&-dangerous:not(.ant-btn-link, .is-disabled) { + border-color: @button-error-color; + color: @button-error-color; + } + + &-info.ant-btn-link:not([disabled='disabled']) { + color: @button-info-color; + + &:hover, + &:focus { + color: @button-info-hover-color; + border-color: transparent; + } + + &:active { + color: @button-info-active-color; + } + } + + &-info:not(.ant-btn-link, .is-disabled) { + color: @white; + background-color: @button-info-color; + border-color: @button-info-color; + //border-width: 0; + + &:hover, + &:focus { + color: @white; + background-color: @button-info-hover-color; + border-color: @button-info-hover-color; + } + + &:active { + background-color: @button-info-active-color; + border-color: @button-info-active-color; + } + + //&[disabled], + //&[disabled]:hover { + // color: @white; + // background-color: fade(@button-info-color, 40%); + // border-color: fade(@button-info-color, 40%); + //} + } + + &-background-ghost, + &-default&-background-ghost { + border-width: 1px; + background-color: transparent !important; + + &[disabled], + &[disabled]:hover { + color: fade(@white, 40%) !important; + background-color: transparent !important; + border-color: fade(@white, 40%) !important; + } + } + + &-dashed&-background-ghost, + &-default&-background-ghost { + color: @button-ghost-color; + border-color: @button-ghost-color; + + &:hover, + &:focus { + color: @button-ghost-hover-color; + border-color: @button-ghost-hover-color; + } + + &:active { + color: @button-ghost-active-color; + border-color: @button-ghost-active-color; + } + + &[disabled], + &[disabled]:hover { + color: fade(@white, 40%) !important; + border-color: fade(@white, 40%) !important; + } + } + &-dashed&-background-ghost&-warning { + color: @button-warn-color; + border-color: @button-warn-color; + + &:hover, + &:focus { + color: @button-warn-hover-color !important; + border-color: @button-warn-hover-color !important; + } + + &:active { + color: @button-warn-active-color; + border-color: @button-warn-active-color; + } + } + + &-default&-background-ghost&-success:not(.ant-btn-link) { + color: @button-success-color; + background-color: transparent; + border-color: @button-success-color; + border-width: 1px; + + &:hover, + &:focus { + color: @button-success-hover-color !important; + border-color: @button-success-hover-color; + } + + &:active { + color: @button-success-active-color; + border-color: @button-success-active-color; + } + } + + &-default&-background-ghost&-warning:not(.ant-btn-link) { + color: @button-warn-color; + background-color: transparent; + border-color: @button-warn-color; + border-width: 1px; + + &:hover, + &:focus { + color: @button-warn-hover-color !important; + border-color: @button-warn-hover-color; + } + + &:active { + color: @button-warn-active-color; + border-color: @button-warn-active-color; + } + } + + &-default&-background-ghost&-danger:not(.ant-btn-link), + &-default&-background-ghost&-dangerous:not(.ant-btn-link), + &-default&-background-ghost&-error:not(.ant-btn-link) { + color: @button-error-color; + background-color: transparent; + border-color: @button-error-color; + border-width: 1px; + + &:hover, + &:focus { + color: @button-error-hover-color !important; + border-color: @button-error-hover-color; + } + + &:active { + color: @button-error-active-color; + border-color: @button-error-active-color; + } + } + + &-ghost.ant-btn-link:not([disabled='disabled']) { + color: @button-ghost-color; + + &:hover, + &:focus { + color: @button-ghost-hover-color; + border-color: transparent; + } + } + &:not(.ant-btn-link) { + .anticon { + vertical-align: middle; + } + } +} diff --git a/src/design/ant/index.less b/src/design/ant/index.less new file mode 100644 index 0000000..1b71584 --- /dev/null +++ b/src/design/ant/index.less @@ -0,0 +1,158 @@ +@import './pagination.less'; +@import './input.less'; +@import './btn.less'; +@import './table.less'; + +html[data-theme='light'] { + .ant-drawer { + .ant-drawer-header { + border-bottom: unset !important; + } + } + .ant-modal { + .ant-modal-header { + border-bottom: unset !important; + } + .ant-modal-footer { + padding: 12px 16px; + } + } +} + +.ant-image-preview-root { + img { + display: unset; + } +} + +.ant-back-top { + right: 20px; + bottom: 20px; +} + +.collapse-container__body { + > .ant-descriptions { + margin-left: 6px; + } +} + +.ant-image-preview-operations { + background-color: rgb(0 0 0 / 30%); +} + +.ant-popover { + &-content { + box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%); + } +} + +// ================================= +// ==============modal message====== +// ================================= +.modal-icon-warning { + color: @warning-color !important; +} + +.modal-icon-success { + color: @success-color !important; +} + +.modal-icon-error { + color: @error-color !important; +} + +.modal-icon-info { + color: @primary-color !important; +} + +.ant-form-item-control-input-content { + > div { + > div { + max-width: 100%; + } + } + .ant-picker { + width: 100%; + } +} +.ant-form { + .ant-form-item { + margin-bottom: 20px; + .ant-form-item-explain { + height: 0; + } + &.ant-form-item-with-help { + .ant-form-item-explain { + height: 20px; + line-height: 20px; + min-height: 20px; + } + } + } +} +.ant-steps { + &.ant-steps-small { + .ant-steps-item-icon { + line-height: 22px; + } + } + .ant-steps-item-custom .ant-steps-item-container .ant-steps-item-icon { + height: 32px; + .custom-icon { + font-size: 20px; + vertical-align: top; + line-height: 32px; + } + } +} +.ant-table-cell { + & > .ant-rate { + white-space: normal; + } + &[style*='text-align: right'] { + .yunzhupaas-sign { + justify-content: flex-end; + } + } + &[style*='text-align: center'] { + .yunzhupaas-sign { + justify-content: center; + } + } +} + +.ant-dropdown-trigger > .anticon.anticon-down, +.ant-dropdown-link > .anticon.anticon-down, +.ant-dropdown-button > .anticon.anticon-down { + font-size: 12px; + vertical-align: middle; +} +// /** 下拉菜单文字和图标折叠了 */ +.ant-dropdown .ant-dropdown-menu .ant-dropdown-menu-title-content, +.ant-dropdown-menu-submenu .ant-dropdown-menu .ant-dropdown-menu-title-content { + flex: auto; + white-space: nowrap; +} +.ant-popover .ant-popover-title { + font-weight: 500; +} +.ant-tree-select-dropdown .ant-select-tree .ant-select-tree-checkbox { + margin-block-start: 0 !important; +} + +.ant-drawer { + .ant-drawer-header { + background-color: @app-content-background !important; + } +} +.ant-modal { + .ant-modal-header { + background-color: @app-content-background !important; + } +} +.ant-checkbox-group { + .ant-checkbox + span { + word-break: break-all; + white-space: pre-wrap; + } +} diff --git a/src/design/ant/input.less b/src/design/ant/input.less new file mode 100644 index 0000000..c12c983 --- /dev/null +++ b/src/design/ant/input.less @@ -0,0 +1,22 @@ +@import (reference) '../color.less'; + +// input +.ant-input { + &-number, + &-number-group-wrapper { + width: 100% !important; + max-width: 100%; + } +} + +.ant-input-affix-wrapper .ant-input-suffix { + right: 9px; +} + +.ant-input-clear-icon { + margin-right: 5px; +} + +textarea.ant-input { + resize: none; +} diff --git a/src/design/ant/pagination.less b/src/design/ant/pagination.less new file mode 100644 index 0000000..7d54caf --- /dev/null +++ b/src/design/ant/pagination.less @@ -0,0 +1,99 @@ +html[data-theme='dark'] { + .ant-pagination { + &.ant-pagination-mini { + .ant-pagination-prev, + .ant-pagination-next, + .ant-pagination-item { + background-color: rgb(255 255 255 / 4%) !important; + + a { + color: #8b949e !important; + } + } + + .ant-select-arrow { + color: @text-color-secondary !important; + } + + .ant-pagination-item-active { + background-color: #1890f0 !important; + border: none; + border-radius: none !important; + + a { + color: @white !important; + } + } + } + } +} + +.ant-pagination { + &.ant-pagination-mini { + .ant-pagination-prev, + .ant-pagination-next { + font-size: 12px; + color: @text-color-base; + border: 1px solid; + } + + .ant-pagination-prev:hover, + .ant-pagination-next:hover, + .ant-pagination-item:focus, + .ant-pagination-item:hover { + a { + color: @primary-color; + } + } + + .ant-pagination-prev, + .ant-pagination-next, + .ant-pagination-item { + margin: 0 4px !important; + background-color: #f4f4f5 !important; + border: none; + border-radius: none !important; + + a { + margin-top: 1px; + color: #606266; + } + + &:last-child { + margin-right: 0 !important; + } + } + + .ant-pagination-item-active { + background-color: @primary-color !important; + border: none; + border-radius: none !important; + + a { + color: @white !important; + } + } + + .ant-pagination-options { + margin-left: 12px; + .ant-select { + width: auto; + } + } + + .ant-pagination-options-quick-jumper input { + height: 22px; + margin: 0 6px; + line-height: 22px; + text-align: center; + } + + .ant-select-arrow { + color: @border-color-shallow-dark; + } + } + + &-disabled { + display: none !important; + } +} diff --git a/src/design/ant/table.less b/src/design/ant/table.less new file mode 100644 index 0000000..a8ed809 --- /dev/null +++ b/src/design/ant/table.less @@ -0,0 +1,102 @@ +@prefix-cls: ~'@{namespace}-basic-table'; + +// fix table unnecessary scrollbar +.@{prefix-cls} { + .hide-scrollbar-y { + .ant-spin-nested-loading { + .ant-spin-container { + .ant-table { + .ant-table-container, + .ant-table-content { + .ant-table-scroll { + .ant-table-hide-scrollbar { + overflow-y: auto !important; + } + + .ant-table-body { + overflow-y: auto !important; + } + } + // .ant-table-body { + // overflow-y: auto !important; + // } + + .ant-table-fixed-right { + .ant-table-body-outer { + .ant-table-body-inner { + overflow-y: auto !important; + } + } + } + + .ant-table-fixed-left { + .ant-table-body-outer { + .ant-table-body-inner { + overflow-y: auto !important; + } + } + } + } + } + } + } + } + + .hide-scrollbar-x { + .ant-spin-nested-loading { + .ant-spin-container { + .ant-table { + .ant-table-container, + .ant-table-content { + .ant-table-scroll { + .ant-table-hide-scrollbar { + //overflow-x: auto !important; + } + + .ant-table-body { + overflow: auto !important; + } + } + + .ant-table-fixed-right { + .ant-table-body-outer { + .ant-table-body-inner { + overflow-x: auto !important; + } + } + } + + .ant-table-fixed-left { + .ant-table-body-outer { + .ant-table-body-inner { + overflow-x: auto !important; + } + } + } + } + } + } + } + } +} +.ant-table { + .ant-table-tbody .ant-table-wrapper .ant-table { + margin: 0 !important; + } + .ant-table-placeholder { + .ant-table-cell { + border-bottom: none !important; + .ant-table-expanded-row-fixed { + &::after { + border-right: none !important; + } + } + } + } +} +.ant-table-wrapper { + .ant-table-thead > tr > th, + .ant-table-thead > tr > td { + font-weight: 500; + } +} diff --git a/src/design/color.less b/src/design/color.less new file mode 100644 index 0000000..7772f57 --- /dev/null +++ b/src/design/color.less @@ -0,0 +1,143 @@ +html { + // header + --header-bg-color: #394664; + --header-bg-hover-color: #273352; + --header-active-menu-bg-color: #273352; + + // sider + --sider-dark-bg-color: #273352; + --sider-dark-darken-bg-color: #273352; + --sider-dark-lighten-bg-color: #273352; +} + +@white: #fff; + +@content-bg: #eaecf0; + +// :export { +// name: "less"; +// mainColor: @mainColor; +// fontSize: @fontSize; +// } +@iconify-bg-color: #5551; + +// ================================= +// ==============border-color======= +// ================================= + +// Dark-dark +@border-color-dark: #b6b7b9; + +// Dark-light +@border-color-shallow-dark: #cececd; + +// Light-dark +@border-color-light: @border-color-base; + +// ================================= +// ==============message============== +// ================================= + +// success-bg-color +@success-background-color: #f1f9ec; +// info-bg-color +@info-background-color: #e8eff8; +// warn-bg-color +@warning-background-color: #fdf6ed; +// danger-bg-color +@danger-background-color: #fef0f0; + +// ================================= +// ==============Header============= +// ================================= + +@header-dark-bg-color: var(--header-bg-color); +@header-dark-bg-hover-color: var(--header-bg-hover-color); +@header-light-bg-hover-color: #f6f6f6; +@header-light-desc-color: #7c8087; +@header-light-bottom-border-color: #eee; +// top-menu +@top-menu-active-bg-color: var(--header-active-menu-bg-color); + +// ================================= +// ==============Menu============ +// ================================= + +// let -menu +@sider-dark-bg-color: var(--sider-dark-bg-color); +@sider-dark-darken-bg-color: var(--sider-dark-darken-bg-color); +@sider-dark-lighten-bg-color: var(--sider-dark-lighten-bg-color); + +// trigger +@trigger-dark-hover-bg-color: rgba(255, 255, 255, 0.2); +@trigger-dark-bg-color: rgba(255, 255, 255, 0.1); + +// ================================= +// ==============tree============ +// ================================= +// tree item hover background +@tree-hover-background-color: #f5f7fa; +// tree item hover font color +@tree-hover-font-color: #f5f7fa; + +// ================================= +// ==============link============ +// ================================= +@link-hover-color: @primary-color; +@link-active-color: darken(@primary-color, 10%); + +// ================================= +// ==============Text color-============= +// ================================= + +// Main text color +@text-color-base: @text-color; + +// Label color +@text-color-call-out: #606266; +@text-color-label: #606266; + +// Auxiliary information color-dark +@text-color-help-dark: #909399; + +// ================================= +// ==============breadcrumb========= +// ================================= +@breadcrumb-item-normal-color: #999; +// ================================= +// ==============button============= +// ================================= + +@button-primary-color: @primary-color; +@button-primary-hover-color: lighten(@primary-color, 5%); +@button-primary-active-color: darken(@primary-color, 5%); + +@button-ghost-color: @white; +@button-ghost-hover-color: lighten(@white, 10%); +@button-ghost-hover-bg-color: #e1ebf6; +@button-ghost-active-color: darken(@white, 10%); + +@button-success-color: @success-color; +@button-success-hover-color: lighten(@success-color, 10%); +@button-success-active-color: darken(@success-color, 10%); + +@button-warn-color: @warning-color; +@button-warn-hover-color: lighten(@warning-color, 10%); +@button-warn-active-color: darken(@warning-color, 10%); + +@button-error-color: @error-color; +@button-error-hover-color: lighten(@error-color, 10%); +@button-error-active-color: darken(@error-color, 10%); + +@button-info-color: @btn-info-color; +@button-info-hover-color: lighten(@btn-info-color, 10%); +@button-info-active-color: darken(@btn-info-color, 10%); + +@button-cancel-color: @text-color-call-out; +@button-cancel-bg-color: @white; +@button-cancel-border-color: @border-color-shallow-dark; + +// Mouse over +@button-cancel-hover-color: @primary-color; +@button-cancel-hover-bg-color: @white; +@button-cancel-hover-border-color: @primary-color; diff --git a/src/design/common.less b/src/design/common.less new file mode 100644 index 0000000..d36a578 --- /dev/null +++ b/src/design/common.less @@ -0,0 +1,2561 @@ +.yunzhupaas-content-wrapper { + height: 100%; + width: 100%; + display: flex; + position: relative; + border-radius: 8px; + overflow: hidden; + &.yunzhupaas-content-wrapper-form { + flex-direction: column; + background-color: @component-background; + .yunzhupaas-content-wrapper-form-body { + flex: 1; + overflow: hidden; + } + } + .yunzhupaas-content-wrapper-left { + width: 220px; + background-color: @component-background; + flex-shrink: 0; + height: 100%; + display: flex; + flex-direction: column; + margin-right: 10px; + border-radius: 8px; + overflow: hidden; + } + .yunzhupaas-content-wrapper-center { + flex: 1; + height: 100%; + overflow: hidden; + display: flex; + flex-direction: column; + .yunzhupaas-content-wrapper-search-box { + padding: 10px 10px 0; + flex-shrink: 0; + margin-bottom: 10px; + background-color: @component-background; + border-radius: 8px; + overflow: hidden; + .search-form { + border-radius: 8px; + } + } + .yunzhupaas-content-wrapper-content { + border-radius: 8px; + flex: 1; + overflow: hidden; + .search-form, + .ant-table-wrapper { + border-radius: 8px; + overflow: hidden; + } + } + } +} +.yunzhupaas-content-wrapper-tabs { + & > .ant-tabs-nav { + padding: 0 10px; + margin-bottom: 0; + } + &.ant-tabs-card { + height: 100%; + & > .ant-tabs-nav { + margin-bottom: 0; + padding: 0; + .ant-tabs-tab { + border-top: none; + &:first-child { + border-left: none; + } + } + } + } + &.tabs-contain { + height: 100%; + & > .ant-tabs-content-holder { + height: 100%; + & > .ant-tabs-content { + height: 100%; + overflow: hidden; + & > .ant-tabs-tabpane { + height: 100%; + overflow: auto; + } + } + } + } +} +.ant-modal.transfer-modal { + &.member-modal { + .ant-modal-body > .scrollbar { + padding: 10px; + .transfer__body .transfer-pane { + width: 100%; + } + } + } + .ant-modal-body { + padding: 20px 10px; + & > .scrollbar { + padding: 20px 10px; + } + .scrollbar .scrollbar__wrap { + margin-bottom: 0 !important; + } + .transfer__body { + line-height: 32px; + display: flex; + justify-content: space-around; + height: 400px; + } + .transfer-pane { + width: 360px; + &.left-pane { + .selected-item { + cursor: pointer; + justify-content: flex-start; + } + .selected-item-user { + cursor: pointer; + } + } + .transfer-pane__tool { + margin-bottom: 8px; + height: 32px; + display: flex; + justify-content: space-between; + align-items: center; + .remove-all-btn { + cursor: pointer; + color: @error-color; + } + } + .transfer-pane__body { + position: relative; + width: 100%; + height: calc(100% - 40px); + overflow: auto; + overflow-x: hidden; + font-size: 14px; + border: 1px solid @border-color-base; + border-radius: var(--border-radius); + &.transfer-pane__body-tab { + overflow: hidden; + display: flex; + flex-direction: column; + .ant-tabs { + .ant-tabs-nav { + margin-bottom: 0; + } + .ant-tabs-nav-list { + width: 100%; + } + .ant-tabs-tab { + flex: auto; + .ant-tabs-tab-btn { + width: 100%; + text-align: center; + } + } + } + .tree-main { + flex: 1; + overflow: auto; + } + .pane-tabs { + flex-shrink: 0; + &.pane-tabs-single { + .ant-tabs-tab { + width: 25%; + flex: none; + } + } + .ant-tabs-nav-operations { + display: none !important; + } + } + } + } + .ant-tree { + .ant-tree-treenode { + &.ant-tree-treenode-selected { + background-color: @selected-hover-bg; + } + } + } + .custom-title { + height: 38px; + padding: 0 12px; + line-height: 38px; + font-size: 14px; + border-bottom: 1px solid @border-color-base; + } + .selected-item { + width: 100%; + padding: 0px 12px; + display: flex; + justify-content: space-between; + align-items: center; + &.selected-item-user { + .selected-item-main { + border-bottom: 1px solid @border-color-base1; + display: flex; + align-items: center; + height: 50px; + width: 100%; + box-sizing: border-box; + } + .selected-item-headIcon { + flex-shrink: 0; + &.icon { + width: 36px; + height: 36px; + text-align: center; + i { + font-size: 22px; + line-height: 36px; + } + } + } + .selected-item-text { + min-width: 0; + flex: 1; + margin-left: 10px; + .name { + height: 20px; + line-height: 20px; + font-size: 14px; + margin-bottom: 2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .organize { + height: 17px; + line-height: 17px; + color: #999999; + font-size: 12px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + &:hover { + background-color: @selected-hover-bg; + } + span { + max-width: 90%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .delete-btn:hover { + color: @error-color; + cursor: pointer; + } + } + .selected-item-user-multiple { + padding: 0 12px; + position: relative; + .selected-item-title { + font-size: 14px; + display: flex; + align-items: center; + span { + padding-left: 6px; + } + } + .selected-item-user { + padding: 0 15px; + &:last-child { + border-bottom: 1px solid @border-color-base1; + .selected-item-main { + border-bottom: none; + } + } + .selected-item-main { + box-sizing: content-box; + } + } + .selected-item-icon { + width: 36px; + height: 36px; + background: linear-gradient(193deg, #a7d6ff 0%, #1990fa 100%); + border-radius: 50%; + line-height: 36px; + color: #ffffff; + font-size: 14px; + text-align: center; + } + } + } + } +} +.ant-modal.form-script-modal { + .ant-modal-body { + height: 70vh; + & > .scrollbar { + padding: 0; + height: 100%; + .scrollbar__view { + height: 100%; + overflow: hidden; + & > div { + height: 100%; + overflow: hidden; + max-height: 100% !important; + } + .form-script-modal-body { + height: 100%; + display: flex; + overflow: hidden; + padding: 20px; + box-sizing: border-box; + .left-board { + height: 100%; + width: 220px; + flex-shrink: 0; + margin-right: 10px; + overflow: hidden auto; + } + .main-board { + height: 100%; + flex: 1; + display: flex; + flex-direction: column; + .main-board-editor { + flex: 1; + border: 1px solid @border-color-base1; + } + .main-board-tips { + flex-shrink: 0; + padding: 8px 16px; + background-color: @primary-1; + border-radius: 4px; + border-left: 5px solid @primary-color; + margin-top: 20px; + + p { + line-height: 24px; + color: @text-color-help-dark; + + span { + display: inline-block; + padding-right: 10px; + } + } + } + } + } + } + } + } +} +.btn-event-modal { + .ant-modal-body { + padding-bottom: 20px !important; + } + .main-board-editor { + height: 300px; + } + .ant-form-item { + margin-bottom: 20px; + .ant-form-item-explain { + height: 20px; + min-height: 20px; + } + } + .tip { + display: inline-block; + vertical-align: middle; + line-height: 32px; + color: @text-color-secondary; + } +} +.form-script-editor { + height: 260px; + border: 1px solid @border-color-base1; +} +.form-script-tips { + flex-shrink: 0; + padding: 8px 16px; + background-color: @primary-1; + border-radius: 4px; + border-left: 5px solid @primary-color; + margin-top: 20px; + + p { + line-height: 24px; + color: @text-color-help-dark; + + span { + display: inline-block; + padding-right: 10px; + } + } +} +.ant-modal.formula-modal { + .ant-modal-body { + & > .scrollbar { + padding: 20px; + } + } + .formula-modal-body { + .code-editor-area { + height: 250px; + border: 1px solid @border-color-base1; + border-radius: 6px; + margin-bottom: 10px; + overflow: hidden; + } + .operation-area { + height: 250px; + display: flex; + .area-item { + height: 250px; + border: 1px solid @border-color-base1; + border-radius: 6px; + width: 220px; + overflow: hidden; + &.formula-area { + margin: 0 20px; + } + &.formula-desc-area { + width: 280px; + .area-content { + padding: 10px; + } + } + .area-title { + padding: 0 10px; + height: 34px; + line-height: 34px; + border-bottom: 1px solid @border-color-base1; + } + .area-content { + height: 216px; + overflow: hidden auto; + .formula-desc-wrapper { + color: #5e6d82; + overflow-y: auto; + & > li { + margin-bottom: 4px; + word-break: break-all; + word-wrap: break-word; + list-style-type: none; + font-size: 12px; + line-height: 18px; + } + .formula-name { + color: @primary-color; + } + } + } + } + } + } +} +.yunzhupaas-common-page-header { + height: 60px; + border-bottom: 1px solid @border-color-base; + overflow: hidden; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 10px; + flex-shrink: 0; +} +.ant-modal.yunzhupaas-full-modal { + .ant-modal-header { + padding: 0; + .ant-modal-title { + font-weight: normal; + } + .yunzhupaas-full-modal-header { + padding: 0 20px; + height: 60px; + display: flex; + justify-content: space-between; + align-items: center; + .header-title { + height: 60px; + width: 320px; + display: flex; + align-items: center; + + .header-logo { + display: inline-block; + width: auto; + height: 60px; + vertical-align: top; + font-size: 30px; + } + .header-dot { + display: inline-block; + position: relative; + margin: 0 10px; + width: 7px; + height: 7px; + background: rgba(181, 215, 255, 0.4); + border-radius: 50%; + &::after { + content: ''; + display: block; + position: absolute; + width: 3px; + height: 3px; + background: #6a9cfa; + border-radius: 50%; + left: 2px; + top: 2px; + } + } + .header-txt { + line-height: 60px; + display: inline-block; + margin: 0; + font-size: 16px; + max-width: 150px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; + } + } + .options { + width: 320px; + justify-content: flex-end; + } + .header-steps { + height: 40px; + background: rgba(255, 255, 255, 0.4); + border-radius: 20px; + padding-top: 0 !important; + overflow: hidden; + &.ant-steps { + width: auto; + &.tab-steps { + .ant-steps-item { + margin: 0; + .ant-steps-item-icon { + display: none; + } + .ant-steps-item-container { + padding: 0 20px; + } + &::after { + display: none; + } + } + } + .ant-steps-item { + width: auto; + padding-inline-start: 0; + margin: 0 16px; + &:first-child { + margin-left: 0; + } + &:last-child { + margin-right: 0; + } + &::after { + top: 20px; + inset-inline-start: 110%; + } + &.ant-steps-item-active { + &::before { + display: none; + } + .ant-steps-item-container { + background-color: #fff; + border-radius: 20px; + } + } + .ant-steps-item-container { + margin-inline-start: 0; + padding-bottom: 0; + display: flex; + align-items: center; + padding: 0 15px; + } + } + } + } + } + } + .ant-modal-body { + overflow: hidden; + background-color: @app-main-background; + & > .scrollbar { + padding: 10px; + background-color: @app-main-background; + & > .scrollbar__wrap { + & > .scrollbar__view { + height: 100%; + overflow: hidden; + & > div { + height: 100% !important; + } + } + } + } + .basic-content { + height: 100%; + overflow: hidden; + .basic-form { + height: 100%; + padding: 20px; + border-radius: 8px; + background-color: @component-background; + overflow-y: auto; + } + } + .@{namespace}-basic-table { + height: auto; + } + } +} + +.ant-modal.yunzhupaas-list-modal { + .ant-modal-body { + height: 70vh; + overflow: hidden; + & > .scrollbar { + padding: 0; + & > .scrollbar__bar { + display: none !important; + } + .scrollbar__wrap { + .scrollbar__view { + height: 100%; + overflow: hidden; + & > div { + height: 100% !important; + max-height: 100% !important; + } + } + } + } + } +} +.ant-modal.yunzhupaas-add-modal { + &.yunzhupaas-preview-modal { + .add-main { + .add-item { + background: #f0fff7; + &.add-item-left { + background: #edfbfd; + .add-icon { + background: #d6f0ff; + color: #3399fa; + } + } + .add-icon { + background: #ccf7e0; + color: #36ac6c; + } + .add-txt { + height: auto; + } + } + } + } + .ant-modal-body { + overflow: hidden; + & > .scrollbar { + padding: 20px; + .scrollbar__bar { + display: none !important; + } + } + } + .add-main { + display: flex; + align-items: center; + justify-content: space-between; + .add-item { + width: 270px; + height: 136px; + background: #fef3e6; + display: flex; + align-items: center; + cursor: pointer; + padding-left: 20px; + &:hover { + opacity: 0.9; + } + &.add-item-left { + background: #f1f5ff; + .add-icon { + background: #ccd9ff; + color: #537eff; + } + } + .add-icon { + width: 56px; + height: 56px; + margin-right: 10px; + background: #fce1bf; + border-radius: 10px; + color: #ea986c; + flex-shrink: 0; + font-size: 30px; + line-height: 56px; + text-align: center; + } + .add-txt { + height: 56px; + P { + line-height: 28px; + } + .add-title { + font-size: 18px; + } + .add-desc { + color: @text-color-secondary; + font-size: 12px; + } + } + } + } +} +.ant-modal.fixed-height-modal { + .ant-modal-body { + height: 70vh; + } +} +.ant-modal.yunzhupaas-flow-list-modal { + .ant-modal-body > .scrollbar { + padding: 15px 0; + } + .template-search { + padding: 0 40px 15px; + } + .template-list { + height: 260px; + .template-item { + margin: 0 40px; + height: 40px; + border-radius: 4px; + margin-bottom: 10px; + line-height: 40px; + padding: 0 20px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + word-break: break-all; + background-color: @app-main-background; + cursor: pointer; + &:hover { + color: @primary-color; + background-color: @primary-2; + } + &:last-child { + margin-bottom: 0; + } + } + } +} +.ant-modal.yunzhupaas-flow-user-list-modal { + .ant-modal-body > .scrollbar { + padding: 20px 0; + } + .flow-user-list { + height: 360px; + .user-item-main { + margin: 0 100px 15px; + cursor: pointer; + height: 70px; + position: relative; + border-radius: 4px; + border: 1px solid @border-color-base1; + display: flex; + align-items: center; + padding: 0 20px; + cursor: pointer; + &.active { + border: 1px solid @primary-color; + box-shadow: 0 0 6px rgba(6, 58, 108, 0.26); + .icon-checked { + display: block; + } + } + &:last-child { + margin-bottom: 0; + } + .user-avatar { + margin-right: 20px; + flex-shrink: 0; + } + .user-text { + min-width: 0; + flex: 1; + line-height: 24px; + font-size: 14px; + .user-organize { + font-size: 12px; + color: #999999; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-break: break-all; + } + } + .icon-checked { + display: none; + width: 18px; + height: 18px; + border: 18px solid @primary-color; + border-left: 18px solid transparent !important; + border-top: 18px solid transparent !important; + border-bottom-right-radius: 4px; + position: absolute; + right: -1px; + bottom: -1px; + .anticon { + position: absolute; + top: 1px; + left: 0; + font-size: 14px; + color: #fff; + } + } + } + } +} +.ant-modal.icon-modal { + .icon-modal-title { + display: flex; + align-items: center; + font-weight: normal; + font-size: 18px; + .ant-input-search { + width: 300px; + margin-left: 10px; + } + } + .ant-modal-body { + padding: 0 10px !important; + } + .main { + height: 70vh; + overflow: hidden; + .ant-tabs, + .ant-tabs-content { + height: 100%; + } + .ant-tabs-nav { + margin-bottom: 0 !important; + } + .icon-box-list { + padding-bottom: 8px; + > .ant-btn { + margin: 8px 0 0 8px; + width: 60px; + height: 60px; + padding: 0; + line-height: 60px; + text-align: center; + transition: transform 300ms; + i { + display: inline-block; + font-size: 24px; + transition: 300ms; + } + &.is-active { + color: @primary-color; + border-color: @primary-color; + } + &:hover { + i { + transform: scale(1.8); + } + } + } + } + } +} + +.table-add-action { + margin-top: 10px; + border: 1px dashed @border-color-base; + text-align: center; + cursor: pointer; +} +.yunzhupaas-sub-table.yunzhupaas-basic-table-form-container { + &.yunzhupaas-sub-table-full { + .ant-form { + width: 100% !important; + } + } + position: relative; + .ant-form { + position: absolute; + left: 0; + top: 4px; + z-index: 1; + width: calc(100% - 80px) !important; + } +} +.yunzhupaas-task-table.yunzhupaas-basic-table-form-container { + .ant-form { + width: calc(100% - 150px) !important; + } +} +.ant-table { + .ant-table-expanded-row-fixed { + padding: 10px !important; + } + .ant-select { + width: 100%; + } + .ant-btn.action-btn { + padding: 0; + } + .ant-table__empty-text { + line-height: 30px; + padding: 30px 0; + } +} + +.yunzhupaas-sign, +.yunzhupaas-signature { + .sign-tip { + color: @primary-color; + } +} + +.average-tabs { + &.ant-tabs { + .ant-tabs-nav { + margin-bottom: 0; + } + .ant-tabs-nav-list { + width: 100%; + } + .ant-tabs-tab { + flex: auto; + padding: 10px 0; + .ant-tabs-tab-btn { + width: 100%; + text-align: center; + } + } + } + &.flow-average-tabs { + .ant-tabs-nav-operations { + display: none !important; + } + } +} + +.common-container-modal { + .ant-modal-body { + height: 70vh; + overflow: hidden; + .yunzhupaas-content-wrapper-left { + margin-right: 0; + border-right: 1px solid @border-color-base1; + } + } +} +.common-container { + .disabled-select { + .ant-select-selection-item { + color: @primary-color !important; + text-decoration: underline; + } + } +} +.required-sign { + color: @error-color; +} +.common-container-drawer { + .common-container-drawer-body { + height: calc(100% - 60px); + } +} +.ant-drawer { + .common-container-drawer { + .ant-drawer-body { + padding: 0; + } + } +} +.dynamic-form { + & > .ant-form { + width: 100%; + } +} +.word-form { + margin-bottom: 20px; + border-top: 1px solid @border-color-base; + border-left: 1px solid @border-color-base; + &.word-form-detail { + .ant-col-item { + & > .ant-form-item { + .ant-form-item-label + .ant-form-item-control { + padding: 8px 10px; + } + } + } + } + .table-grid-box { + margin-bottom: 0; + td { + padding-top: 0; + } + } + .ant-row { + margin: 0 !important; + } + .ant-col-item { + padding: 0 !important; + border-right: 1px solid @border-color-base; + border-bottom: 1px solid @border-color-base; + & > .ant-form-item { + margin-bottom: 0; + .ant-form-item-label { + border-right: 1px solid @border-color-base; + padding: 5px 0; + } + .ant-form-item-label + .ant-form-item-control { + padding: 5px 0; + } + .ant-input, + .ant-input-number, + .ant-select, + .ant-select-selector, + .ant-input-affix-wrapper, + .ant-picker { + border: 0 !important; + &:focus, + &-focused { + box-shadow: unset !important; + } + } + .ant-select-focused { + .ant-select-selector { + box-shadow: unset !important; + } + } + .tox-tinymce { + border: none !important; + } + } + } + .yunzhupaas-basic-caption { + border-bottom: 0 !important; + } + .ant-collapse { + .ant-collapse-header { + border-right: 1px solid @border-color-base; + border-bottom: 1px solid @border-color-base; + } + .ant-collapse-content-box { + padding: 0 !important; + } + } + + .ant-card { + border: none !important; + &:hover { + box-shadow: unset !important; + } + .ant-card-head { + border-right: 1px solid @border-color-base; + } + .ant-card-body { + padding: 0; + } + } + .ant-tabs { + .ant-tabs-nav { + margin-bottom: 0; + border-right: 1px solid @border-color-base; + } + } + .ant-steps { + border-right: 1px solid @border-color-base; + } + .ant-rate, + .ant-radio-group, + .ant-checkbox-group, + .upload-file-container, + .upload-img-container { + padding: 0 11px; + } + .ant-switch, + .yunzhupaas-color-picker, + .ant-slider { + margin: 0 11px; + } + + .ant-table { + td { + background-color: @component-background !important; + } + .ant-switch, + .yunzhupaas-color-picker, + .ant-slider { + margin: 0; + } + .ant-table-tbody { + .ant-table-placeholder, + .ant-table-placeholder .ant-table-cell { + border-right: none !important; + } + } + } + .table-add-action { + border: none; + margin-top: 0; + // border-top: 1px solid @border-color-base1; + } +} +.table-grid-box { + width: 100%; + border-collapse: collapse; + table-layout: fixed; + margin-bottom: 18px; + & > tbody { + & > tr { + & > td { + border: var(--borderWidth) var(--borderType) var(--borderColor); + background-color: var(--backgroundColor); + overflow: hidden; + height: 50px; + padding: 18px 18px 0; + } + } + } +} +.export-modal { + &.ant-modal .ant-modal-body > .scrollbar { + padding: 20px; + } + .ant-form-item { + margin-bottom: 20px; + } + .export-line { + line-height: 32px; + border-bottom: 1px solid @border-color-base1; + margin-bottom: 5px; + .export-label { + font-size: 18px; + font-weight: bold; + width: 100%; + span { + margin-left: 10px; + font-size: 14px; + font-weight: normal; + } + } + } + .ant-checkbox-wrapper { + line-height: 32px; + } + .options-list { + width: 100%; + .ant-checkbox-wrapper { + width: calc(33.33% - 8px); + .ant-checkbox + span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + & + .ant-checkbox-wrapper { + margin-left: 0; + } + } + } + .footer-tip { + float: left; + line-height: 32px; + color: @text-color-secondary; + } +} +.ant-tabs.common-left-tabs { + height: 100%; + flex-shrink: 0; + margin-right: 10px; + & > .ant-tabs-nav > .ant-tabs-nav-wrap > .ant-tabs-nav-list { + padding-top: 10px; + width: 160px; + & > .ant-tabs-tab { + padding: 12px 24px; + .icon-ym { + font-size: 14px; + margin-right: 8px; + } + & + .ant-tabs-tab { + margin-top: 2px; + } + &.ant-tabs-tab-active { + background: @primary-1; + } + } + } + .ant-tabs-content-holder { + width: 0; + } +} +.drag-handler { + cursor: move; + font-size: 20px; +} +.yunzhupaas-common-search-box { + padding-top: 10px; + flex-shrink: 0; + position: relative; + &.yunzhupaas-common-search-box-modal { + padding: 10px 10px 0; + } + .yunzhupaas-common-search-box-right { + position: absolute; + right: 10px; + top: 15px; + .yunzhupaas-common-search-box-right-icon { + margin-left: 10px; + svg { + width: 1.3em; + height: 1.3em; + } + } + } +} +.flow-com-title { + height: 60px; + line-height: 60px; + text-align: center; + position: relative; + margin-bottom: 10px; + + h1 { + font-size: 18px; + margin: 0; + font-weight: 700; + } + + .number { + position: absolute; + right: 0; + bottom: 0; + height: 30px; + line-height: 30px; + font-size: 14px; + } +} +.ant-modal.yunzhupaas-cron-modal { + .ant-modal-body { + padding: 0 10px; + } +} +.yunzhupaas-import-modal { + .import-main { + margin: 20px 0; + height: 480px; + position: relative; + .import-preview-table { + .child-table-column .child-table__row td { + flex: unset !important; + } + } + .upload { + display: flex; + border: 1px solid @border-color-base; + margin-bottom: 25px; + &.error-show { + margin-top: 10px; + margin-bottom: 15px; + .up_left { + height: 120px; + } + .up_right { + padding-top: 20px; + font-size: 16px; + } + } + .up_left { + width: 126px; + height: 140px; + background: #f9f9f9; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + img { + width: 80px; + height: 80px; + } + } + .up_right { + margin-left: 30px; + font-size: 14px; + padding-top: 30px; + flex: 1; + .title { + font-size: 18px; + font-weight: bold; + } + .tip { + margin: 15px 0; + line-height: 16px; + &.success-tip span { + color: #67c23a; + } + &.error-tip span { + color: @error-color; + } + } + .ant-btn-link { + padding: 0 !important; + } + } + .upload-area { + display: flex; + padding-right: 200px; + .ant-upload-select { + margin-right: 50px; + flex-shrink: 0; + } + .ant-upload-list { + flex: 1; + } + .ant-upload-list-item:first-child { + margin-top: 5px; + } + } + } + .success { + display: flex; + flex-direction: column; + align-items: center; + padding-top: 110px; + .success-title { + margin: 20px 0; + font-size: 18px; + font-weight: bold; + } + } + .conTips { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 15px; + .ant-btn-link { + padding: 0 !important; + } + } + } +} +.yunzhupaas-sso-modal { + .scrollbar { + padding: 0 !important; + overflow: hidden; + .scrollbar__view { + height: 600px !important; + & > div { + max-height: 600px !important; + height: 600px !important; + } + } + } +} +.yunzhupaas-tenant-social-modal { + .ant-modal-header { + display: none; + } + .scrollbar { + padding: 0 !important; + } + .other-main { + width: 100%; + padding-top: 10px; + height: 500px; + overflow: hidden; + background: url('../assets/images/other-login-bg.png') no-repeat center; + background-size: auto 100%; + .other-title { + display: flex; + height: 50px; + line-height: 50px; + justify-content: center; + align-items: center; + .other-icon { + width: 24px; + height: 24px; + line-height: 24px; + text-align: center; + border-radius: 50%; + border: 2px solid @primary-color; + i { + font-size: 16px; + color: @primary-color; + } + } + .other-text { + height: 24px; + line-height: 24px; + font-size: 18px; + font-weight: bold; + margin: 0 5px; + } + } + .other-body { + padding: 20px; + width: 100%; + height: 440px; + overflow-x: hidden; + overflow-y: auto; + .other-login-card { + border-radius: 5px; + border-left: 5px solid #9dc8fa; + font-size: 12px; + margin-bottom: 20px; + background-color: @component-background; + cursor: pointer; + &:hover { + border-color: @primary-color; + i { + color: #fff; + } + } + } + .other-login-des { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-top: 12px; + font-size: 14px; + line-height: 20px; + &.other-login-title { + margin-top: 0; + font-size: 16px; + font-weight: 600; + margin-bottom: 20px; + } + } + } + } +} +.yunzhupaas-release-modal { + .ant-modal-body > .scrollbar { + padding: 12px 55px !important; + } + .release-main { + margin-top: 20px; + display: flex; + justify-content: space-between; + .release-item { + width: 220px; + } + .report-item-left { + margin-left: 120px; + } + .top-item { + position: relative; + width: 220px; + height: 70px; + cursor: pointer; + border: 1px solid @border-color-base; + border-radius: 6px; + text-align: center; + color: #606266; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + &.active { + border-color: @primary-color; + color: @primary-color; + box-shadow: 0 0 6px rgba(6, 58, 108, 0.1); + .item-icon { + border-color: @primary-color; + } + .icon-checked { + display: block; + } + } + .item-icon { + display: inline-block; + border: 1px solid #606266; + text-align: center; + border-radius: 50%; + width: 28px; + height: 28px; + font-size: 16px; + margin-right: 10px; + line-height: 26px; + border-width: 1px; + } + .item-title { + font-size: 16px; + font-weight: 400; + } + .icon-checked { + display: none; + width: 18px; + height: 18px; + border: 18px solid @primary-color; + border-left: 18px solid transparent !important; + border-top: 18px solid transparent !important; + border-bottom-right-radius: 4px; + position: absolute; + right: 0px; + bottom: 0px; + + .anticon { + position: absolute; + top: 1px; + left: 0; + font-size: 14px; + color: #fff; + } + } + } + .released { + padding: 5px 10px; + width: 220px; + line-height: 30px; + overflow: auto; + border-radius: 4px; + background: @app-main-background; + max-height: 120px; + min-height: 30px; + } + } +} +.link-text { + color: @primary-color; + cursor: pointer; + user-select: none; +} +.yunzhupaas-basic-table { + .link-text { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} +.child-table-box { + padding: 0 !important; + vertical-align: top !important; +} +.child-table-column { + .child-table__row { + background: transparent; + border-bottom: 1px solid @border-color-base1; + display: flex; + align-items: center; + min-height: 39px; + + td { + border: none !important; + flex-shrink: 0; + flex: 1; + &.td-flex-1 { + flex: 1; + } + .cell { + min-height: 23px !important; + padding: 8px; + white-space: pre-wrap; + &.ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + &:last-child { + border-bottom: none !important; + } + } + .expand-more-btn { + height: 39px; + text-align: center; + padding-top: 4px; + } +} +.yunzhupaas-super-query-modal { + .super-query-main { + .query-noData { + text-align: center; + padding: 20px 0; + .noData-img { + width: 160px; + margin-bottom: 10px; + display: inline-block; + } + .noData-txt { + color: @text-color-secondary; + } + } + } +} +.yunzhupaas-condition-modal { + .ant-modal-body > .scrollbar { + padding: 20px !important; + } +} +.condition-main { + &.condition-main-bordered { + border-radius: var(--border-radius); + border: 1px solid @border-color-base; + padding: 8px; + } + &.condition-main-compact { + .ant-select-selector { + padding: 0 5px; + } + .ant-select-selection-search { + inset-inline-start: 5px; + inset-inline-end: 5px; + } + } + .condition-item { + background-color: @app-content-background; + border-radius: var(--border-radius); + margin-bottom: 10px; + overflow: hidden; + .condition-item-title { + font-size: 14px; + padding: 0 10px; + line-height: 40px; + border-bottom: 1px solid @border-color-base; + display: flex; + align-items: center; + justify-content: space-between; + .icon-ym { + font-size: 14px; + cursor: pointer; + } + } + .condition-item-content { + padding: 0 18px 10px; + .condition-item-cap { + height: 40px; + display: flex; + align-items: center; + } + } + } + .condition-list { + margin-bottom: 10px; + overflow: hidden; + .ant-row { + width: 100%; + } + } + .icon-ym-btn-clearn { + cursor: pointer; + font-size: 18px; + line-height: 32px; + color: @error-color; + } + .ant-select, + .ant-picker { + width: 100%; + } + .yunzhupaas-color-picker { + display: block !important; + } +} +.plan-popover { + .ant-popover-inner-content { + padding: 0; + width: 240px; + } + .plan-list { + padding: 6px 0; + max-height: 182px; + overflow: auto; + &-item { + height: 34px; + display: flex; + align-items: center; + justify-content: space-between; + color: @text-color-label; + font-size: 14px; + cursor: pointer; + padding: 0 20px; + .icon-ym-nav-close { + font-size: 12px; + } + &:hover { + background-color: @tree-hover-font-color; + } + } + .plan-list-name { + width: 160px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: @primary-color; + cursor: pointer; + } + .icon-ym-nav-close:hover { + color: @error-color; + } + } + .noData-txt { + height: 34px; + color: @text-color-secondary; + font-size: 14px; + line-height: 34px; + text-align: center; + } +} +.edit-row-action { + display: flex; + justify-content: center; + align-items: center; + height: 24px; + &:hover { + .edit-row-index { + display: none; + } + .ym-custom { + display: block; + } + } + .ym-custom { + display: none; + cursor: pointer; + } +} +.short-link-wrapper { + padding-bottom: 20px; + &.short-link-wrapper-list { + padding-bottom: 0; + } + .short-link-main { + position: relative; + width: 80%; + height: 100%; + margin: 0 auto; + + display: flex; + flex-direction: column; + } + .short-link-header { + height: 60px; + line-height: 60px; + text-align: center; + background-color: @primary-color; + color: #fff; + font-size: 16px; + flex-shrink: 0; + } + .icon-qrcode { + cursor: pointer; + position: absolute; + right: -50px; + top: 5px; + width: 50px; + height: 50px; + font-size: 50px; + line-height: 50px; + color: @text-color-base; + } + .short-link-content { + flex: 1; + overflow: hidden; + &.short-link-form { + padding: 10px; + overflow: auto; + background-color: @component-background; + } + } + .short-link-footer { + flex-shrink: 0; + height: 60px; + display: flex; + align-items: center; + justify-content: flex-end; + padding: 0 10px; + background-color: @component-background; + } + .short-link-lock-wrapper { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + } + .short-link-lock-form { + .ant-input-affix-wrapper { + width: 220px; + } + } +} +.add-rules-modal { + .ant-modal-body { + & > .scrollbar { + padding: 0 20px 20px !important; + } + } +} +.parameter-box { + display: flex; + .icon-ym-btn-edit { + color: @primary-color; + cursor: pointer; + font-size: 16px; + } + .icon-ym-delete { + color: @error-color; + cursor: pointer; + font-size: 16px; + } + .left-pane { + width: 350px; + height: 420px; + flex-shrink: 0; + display: flex; + flex-direction: column; + overflow: hidden; + margin: 0 10px 18px 20px; + .left-pane-list { + border: 1px solid @border-color-base; + border-radius: 4px; + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + .list { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + .header { + background-color: @app-content-background; + display: flex; + &.detail-header { + span { + width: 170px; + } + } + span { + font-size: 14px; + color: @text-color-label; + padding: 8px; + display: inline-block; + line-height: 23px; + width: 134px; + } + .operation { + flex: 1; + } + } + .search-box { + border-bottom: 1px solid @border-color-base1; + .search { + margin: 10px; + width: calc(100% - 20px); + } + } + } + } + .table-add-action { + margin-top: 0; + border-width: 1px 0 0; + } + } + .right-pane { + flex: 1; + display: flex; + flex-direction: column; + .msg-pane { + margin: 0 0 18px 10px; + flex: 1; + display: flex; + flex-direction: column; + .list { + flex: 1; + } + } + .tox-tinymce { + height: 370px !important; + } + } +} +.result-modal { + .ant-modal-body > .scrollbar { + padding: 0 !important; + } +} +.text-primary { + color: #188ae2 !important; +} +.text-success { + color: #0eac5c !important; +} +.text-info { + color: #35b8e0 !important; +} +.text-warning { + color: #f9c851 !important; +} +.text-danger { + color: #ff5b5b !important; +} +.text-pink { + color: #ff8acc !important; +} +.text-purple { + color: #5b69bc !important; +} +.text-inverse { + color: #3b3e47 !important; +} +.text-dark { + color: #282828 !important; +} +.text-white { + color: #ffffff !important; +} +.text-color { + color: #6a6c6f !important; +} +.text-grey { + color: #999 !important; +} +.i-default { + color: #6b7a99 !important; +} +.title-color { + color: #475059 !important; +} +.ant-form-item-control { + .yunzhupaas-color-picker { + display: block !important; + } +} +.ant-modal.yunzhupaas-modal-portal { + .ant-modal-body { + height: 60vh; + > .scrollbar { + padding: 0 !important; + } + } +} +.socials-list-justAuth { + padding: 0 40px; + .socials-item { + padding: 10px 0; + border-bottom: 1px solid @border-color-base; + } + .socials-item-main { + display: flex; + align-items: center; + padding: 10px; + height: 100px; + &:hover { + background-color: @selected-hover-bg; + } + .item-img { + width: 80px; + height: 80px; + display: block; + margin-right: 14px; + flex-shrink: 0; + } + .item-txt { + height: 80px; + flex: 1; + .item-name { + line-height: 22px; + font-size: 16px; + margin-bottom: 16px; + font-weight: 600; + } + .item-desc { + color: @text-color-label; + font-size: 12px; + line-height: 18px; + } + } + .item-btn { + width: 70px; + text-align: right; + flex-shrink: 0; + } + } +} +.yunzhupaas-log-detail-modal { + .scrollbar { + padding: 0 !important; + } +} +.portal-toggle-drawer { + &.common-menus-drawer { + .main .item .item-list { + .item-list-item { + height: 50px; + line-height: 50px; + padding: 0 30px; + border-radius: 8px; + overflow: hidden; + color: @text-color-base; + .icon-ym-header-star-fill { + visibility: hidden; + font-size: 14px; + color: #f8af4b; + } + &:hover { + background-color: @content-bg; + .icon-ym-header-star-fill { + visibility: visible; + } + } + } + } + } + .tool { + height: 40px; + display: flex; + align-items: center; + justify-content: center; + border-bottom: 1px solid @border-color-base1; + .ant-input-search { + .ant-input-affix-wrapper { + border-radius: 0; + border: none !important; + &.ant-input-affix-wrapper-focused { + box-shadow: unset; + } + } + .ant-btn { + border-radius: 0; + border: none !important; + height: 31px; + } + } + } + .main { + padding: 10px 20px; + height: calc(100% - 40px); + overflow: auto; + overflow-x: hidden; + .item { + .item-title { + font-size: 12px; + line-height: 30px; + color: #999; + } + .item-list { + font-size: 14px; + color: #707070; + .item-list-item { + display: flex; + justify-content: space-between; + align-items: center; + height: 45px; + cursor: pointer; + .icon-left { + font-size: 16px; + padding-right: 10px; + } + .icon-right { + font-size: 18px; + color: #bdbdbd; + } + .item-list-item-name { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + margin-right: 10px; + flex: 1; + .icon-ym { + vertical-align: 0; + margin-right: 10px; + font-size: 14px; + } + } + &.active .icon-right { + color: @primary-color; + } + } + } + } + .noData-txt { + font-size: 14px; + color: #909399; + line-height: 20px; + text-align: center; + padding-top: 10px; + } + } +} +.input-table-footer-btn { + padding-top: 10px; + display: flex; + flex-wrap: wrap; +} + +.login-type-box { + display: flex; + align-items: center; + .circle-box { + width: 8px; + height: 8px; + border-radius: 50%; + display: inline-block; + margin-right: 6px; + } + .circle-box-primary { + background-color: @primary-color; + } + .circle-box-error { + background-color: @error-color; + } +} +.yunzhupaas-transfer-modal { + .ant-modal-body { + height: 320px; + } +} +.custom-draggable-list { + .custom-draggable-item { + display: flex; + align-items: center; + border: 1px dashed @component-background; + box-sizing: border-box; + & + .custom-draggable-item { + margin-top: 4px; + } + &.sortable-chosen { + border: 1px dashed @primary-color; + } + .ant-input + .ant-input { + margin-left: 4px; + } + .ant-input-group-addon { + cursor: pointer; + padding: 0; + span { + display: inline-block; + line-height: 30px; + padding: 0 11px; + } + } + .custom-line-icon { + line-height: 32px; + font-size: 22px; + padding: 0 4px; + color: #606266; + .icon-ym-btn-clearn { + font-size: 18px; + } + .icon-ym-darg { + font-size: 20px; + line-height: 31px; + display: inline-block; + cursor: move; + } + &.option-drag { + padding-left: 0; + } + &.close-btn { + padding-right: 0; + } + } + .custom-line-value { + flex: 1; + flex-shrink: 0; + line-height: 32px; + font-size: 14px; + user-select: none; + cursor: pointer; + } + .close-btn { + cursor: pointer; + color: @error-color; + } + .edit-btn { + cursor: pointer; + color: @primary-color; + } + } + .add-btn .ant-btn { + padding: 0; + } +} +.custom-draggable-dropdown-menu { + max-height: 400px; + overflow: auto; +} +.interface-template-json-modal { + .ant-modal-body { + height: 40vh; + } +} +.setting-drawer { + .setting-drawer-item { + margin-bottom: 32px; + &:last-child { + margin-bottom: 0; + } + } + .setting-drawer-cap { + font-weight: 600; + font-size: 16px; + line-height: 22px; + margin-bottom: 12px; + } + .setting-drawer-content { + padding: 0 10px; + &.bg-content { + padding: 1px 16px; + border-radius: var(--border-radius); + } + } + .setting-type-picker { + display: flex; + justify-content: space-between; + &.sysBg-type-picker { + .type-picker__item { + width: 77px; + .type-picker__item-img { + width: 77px; + } + } + } + .type-picker__item { + width: 92px; + cursor: pointer; + &.type-picker__item--active { + .type-picker__item-img { + border-color: @primary-color; + } + } + .type-picker__item-img { + position: relative; + border-radius: 9px; + width: 92px; + height: 57px; + border: 1px solid #e5ebf5; + box-shadow: 0px 5px 5px rgba(0, 0, 0, 0.16); + } + .type-picker__item-title { + text-align: center; + margin-top: 10px; + font-size: 12px; + } + .icon-checked { + position: absolute; + width: 20px; + height: 20px; + right: -9px; + bottom: -1px; + background: @primary-color; + border-radius: 50%; + text-align: center; + line-height: 20px; + color: #fff; + } + } + } +} +.yunzhupaas-device-switch { + display: flex; + align-items: center; + height: 32px; + border-radius: 16px; + background: rgba(255, 255, 255, 0.24); + padding: 2px; + overflow: hidden; + .yunzhupaas-device-switch-item { + height: 28px; + line-height: 28px; + padding: 0 16px; + cursor: pointer; + border-radius: 14px; + &.yunzhupaas-device-switch-item--active { + background-color: @component-background; + .icon-ym { + color: @primary-color; + } + } + .icon-ym { + font-size: 20px; + color: @text-color-secondary; + } + } +} +.action-bar { + position: relative; + height: 42px; + text-align: center; + padding: 0 15px; + box-sizing: border-box; + border-bottom: 1px solid @border-color-base1; + display: flex; + align-items: center; + justify-content: space-between; + .action-bar-left, + .action-bar-right { + display: flex; + align-items: center; + } + .action-bar-btn { + margin-left: 10px; + width: 30px !important; + padding: 0 !important; + text-align: center; + i { + font-size: 20px; + &.icon-ym-ai-form, + &.icon-ym-save, + &.icon-ym-redo, + &.icon-ym-undo { + font-size: 14px; + } + } + } + .action-bar-divider { + height: 16px; + margin: 0 6px; + top: 1px; + & + .action-bar-btn { + margin-left: 0; + } + } +} +.yunzhupaas-version-popover { + .ant-popover-inner-content { + padding: 0; + .version-list { + height: 250px; + overflow: auto; + .version-item { + display: flex; + align-items: center; + margin: 4px 6px; + height: 36px; + padding: 0 8px 0 18px; + border-radius: 6px; + cursor: pointer; + &:hover { + background-color: @selected-hover-bg; + .version-delete i { + display: block; + } + } + .version-name { + flex: 1; + min-width: 0; + } + .version-state { + width: 52px; + height: 20px; + border-radius: 10px; + color: #fff; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + } + .version-delete { + width: 14px; + margin-left: 32px; + i { + display: none; + font-size: 14px; + } + } + } + } + } + .add-btn { + border-top: 1px solid @border-color-base1; + height: 44px; + line-height: 44px; + cursor: pointer; + text-align: center; + } +} +.version-tip { + display: flex; + align-items: center; + flex-shrink: 0; + border-radius: 10px; + padding: 0 18px; + margin-left: 20px; + background-color: @component-background; + box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.1); + font-size: 14px; + line-height: 32px; + .icon { + color: #fcaa28; + padding-right: 5px; + } +} +.current-version { + display: flex; + align-items: center; + padding: 4px 10px; +} +.version-badge { + width: 8px; + height: 8px; + border-radius: 50%; + margin-right: 4px; +} +.yunzhupaas-child-list { + .ant-collapse { + background-color: @app-content-background; + } + .ant-collapse-borderless > .ant-collapse-item { + border-bottom: unset; + } + .outer-collapse { + & > .ant-collapse-item { + & > .ant-collapse-header { + border-bottom: 1px solid @border-color-base !important; + } + & > .ant-collapse-content > .ant-collapse-content-box { + padding: 4px 0; + } + } + } + .ant-collapse-content-box { + padding: 4px 10px; + } + .input-table-footer-btn { + margin-bottom: 10px; + padding-left: 16px; + } +} +.field-table-box { + border: 1px solid @border-color-base; + border-radius: 4px; + flex: 1; + display: flex; + flex-direction: column; + margin-bottom: 10px; + overflow: hidden; + .title { + height: 38px; + line-height: 38px; + display: flex; + color: @text-color-label; + font-size: 14px; + padding: 0 10px; + flex-shrink: 0; + justify-content: space-between; + align-items: center; + } + .table-actions { + flex-shrink: 0; + border-top: 1px dashed @border-color-base; + text-align: center; + } + .list { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + .icon-ym-btn-edit { + color: @primary-color; + cursor: pointer; + font-size: 16px; + } + .icon-ym-delete { + color: @error-color; + cursor: pointer; + font-size: 16px; + } + } +} +.yunzhupaas-common-history-popover { + .ant-popover-inner { + border-radius: 8px; + overflow: hidden; + .ant-popover-inner-content { + padding: unset !important; + } + } + .history-popover-content { + width: 250px; + height: 320px; + display: flex; + flex-direction: column; + padding: 20px 10px; + .title { + flex-shrink: 0; + font-size: 16px; + font-weight: bold; + color: #303133; + margin-bottom: 10px; + i { + font-size: 16px; + margin: 0 8px 0 10px; + } + } + .item { + display: flex; + align-items: center; + line-height: 36px; + border-radius: 7px; + padding: 0 10px; + cursor: pointer; + &:hover { + background: rgba(237, 240, 244, 0.39); + } + &.current-item { + color: @primary-color; + } + &.past-item { + color: #a5a5a5; + } + i { + margin-right: 8px; + font-size: 14px; + } + } + .contain { + flex: 1; + } + } +} +.yunzhupaas-history-btn { + padding: 0 4px; + i { + font-size: 14px; + line-height: 32px; + } +} +.downFlow-confirm { + & > div { + margin-bottom: 0 !important; + } + .downFlow-label { + & label { + font-size: 14px; + color: #909399 !important; + & span { + color: #606266; + } + } + } +} +.yunzhupaas-content-detail-extra { + width: 100%; + height: calc(100% - 46px); + overflow-y: auto; + overflow-x: hidden; + padding-top: 10px; + .extra-empty { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + margin-block: unset !important; + } +} diff --git a/src/design/commonFormWrapper.less b/src/design/commonFormWrapper.less new file mode 100644 index 0000000..d137e55 --- /dev/null +++ b/src/design/commonFormWrapper.less @@ -0,0 +1,395 @@ +.yunzhupaas-common-form-wrapper { + height: 100%; + overflow: hidden; + display: flex; + .yunzhupaas-common-form-wrapper__main { + flex: 1; + flex-shrink: 0; + overflow: auto; + position: relative; + } +} +.form-extra-panel { + width: 361px; + height: 100%; + flex-shrink: 1; + border-left: 1px solid @border-color-base; + position: relative; + display: flex; + flex-direction: column; + &.form-extra-panel-unfold { + width: 0; + border-left: unset; + .trigger-btn { + border-right: unset; + } + } + & > .ant-tabs { + flex-shrink: 0; + &.average-tabs-single { + .ant-tabs-tab { + &:hover, + &.ant-tabs-tab-active .ant-tabs-tab-btn { + color: inherit !important; + } + } + .ant-tabs-ink-bar { + display: none; + } + } + } + .trigger-btn { + width: 20px; + height: 42px; + border-radius: 4px 0px 0px 4px; + box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.1); + background: @component-background; + border: 1px solid @border-color-base; + z-index: 10; + position: absolute; + left: -20px; + top: calc(50% - 21px); + text-align: center; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + } + .form-extra-panel-main { + flex: 1; + overflow: hidden; + } + .form-extra-comment { + height: 100%; + display: flex; + flex-direction: column; + .form-extra-comment-main { + flex: 1; + overflow: hidden; + } + .form-extra-comment-list { + padding: 0 20px; + .form-extra-comment-item { + padding: 20px 0; + border-bottom: 1px solid @border-color-base; + + &:last-child { + border-bottom: unset; + } + .form-extra-comment-item-main { + display: flex; + .comment-avatar { + flex-shrink: 0; + margin-right: 12px; + } + .comment-content { + flex: 1; + min-width: 0; + .comment-head { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 12px; + line-height: 16px; + margin-bottom: 10px; + .username { + flex: 1; + min-width: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + .replay-separate { + margin: 0 5px; + color: @text-color-label; + } + i { + margin-left: 5px; + line-height: 16px; + vertical-align: 0; + font-size: 14px; + color: @text-color-label; + cursor: pointer; + } + } + .time { + flex-shrink: 0; + color: @text-color-label; + margin-left: 10px; + } + } + .comment-text { + font-size: 12px; + line-height: 24px; + color: @text-color-label; + vertical-align: middle; + word-break: break-all; + .comment-text-emoji { + display: inline-block; + vertical-align: middle; + } + } + .comment-other { + padding: 8px 4px 2px 4px; + background-color: #f4f4f4; + margin-top: 12px; + border-radius: 4px; + } + .comment-img-list { + .comment-img-item { + display: inline-block; + width: 40px; + height: 40px; + cursor: pointer; + overflow: hidden; + margin: 0 6px 6px 0; + object-fit: cover; + } + } + .comment-file-List { + margin-bottom: 8px; + .anticon-download { + right: 5px; + } + .anticon-eye { + right: 25px; + } + } + .comment-actions { + margin-top: 4px; + display: flex; + align-items: center; + justify-content: space-between; + + .ant-btn { + padding: 0; + font-size: 12px; + } + } + } + } + } + } + .form-extra-comment-list-footer { + flex-shrink: 0; + border-top: 1px solid @border-color-base; + } + } + .form-extra-log { + height: 100%; + .form-extra-log-list { + padding: 24px 12px 0; + overflow: auto; + height: 100%; + .tag { + display: block; + width: 10px; + height: 10px; + border-radius: 50%; + } + .time-item-container { + margin-top: 8px; + padding: 0 10px; + border-radius: 4px; + background-color: @app-content-background; + .time-item-head { + height: 40px; + display: flex; + align-items: center; + + .head-avatar { + margin-right: 6px; + } + .head-name { + line-height: 24px; + flex: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .head-status { + border-radius: 10px; + padding-inline: 10px; + margin-inline-end: 0; + } + } + .time-item-log { + border-top: 1px solid @border-color-base; + padding: 10px 0 10px 30px; + .time-item-log-total { + display: flex; + margin-bottom: 4px; + span { + color: @error-color; + } + } + .time-item-log-item { + margin-bottom: 8px; + &:last-child { + margin-bottom: 0; + } + &-label { + font-weight: 600; + } + &-value { + word-break: break-all; + color: @text-color-label; + &-old { + text-decoration: line-through; + } + &-new { + color: @text-color-base; + } + &-more { + color: @primary-color; + cursor: pointer; + } + &-modify { + color: @warning-color; + } + } + } + } + } + } + } +} +.comment-input-wrapper { + &.comment-input-wrapper-inner { + border: 1px solid @border-color-base; + border-radius: 4px; + &.comment-input-wrapper-active { + border: 1px solid @primary-color; + } + .comment-input-placeholder { + color: #bfbfbf; + line-height: 30px; + height: 96px; + padding: 0 11px; + } + } + .comment-input-placeholder { + color: #bfbfbf; + line-height: 50px; + padding: 0 10px; + } + .comment-input-wrapper-content { + margin-bottom: 22px; + textarea { + border: unset !important; + box-shadow: unset !important; + } + } + .ant-input-textarea-show-count::after { + padding-right: 10px; + } + .comment-input-wrapper-actions { + padding: 0 10px; + height: 50px; + display: flex; + justify-content: space-between; + align-items: center; + .actions-left { + display: flex; + align-items: center; + .ym-custom, + .icon-ym { + font-size: 18px; + margin-right: 15px; + color: #bfbfbf; + cursor: pointer; + } + } + } + .comment-img-list { + margin-top: 10px; + display: flex; + flex-wrap: wrap; + padding-left: 10px; + .img-item { + width: 40px; + height: 40px; + position: relative; + margin-right: 10px; + cursor: pointer; + object-fit: cover; + flex-shrink: 0; + margin-bottom: 10px; + + .badge { + background-color: @error-color; + border-radius: 10px; + color: #fff; + font-size: 12px; + height: 18px; + width: 18px; + line-height: 18px; + border: 1px solid #fff; + position: absolute; + right: -9px; + top: -9px; + cursor: pointer; + z-index: 100; + display: flex; + justify-content: center; + align-items: center; + .icon-ym { + font-size: 12px; + transform: scale(0.7); + display: inline-block; + } + } + } + } + .comment-upload-file { + padding: 0 10px; + .anticon-close { + display: block !important; + } + .upload-file-list__item { + margin-top: 5px !important; + } + } +} + +.emojiBox { + height: 150px; + width: 300px; + overflow: auto; + text-align: left; +} +.emojiBox .emoji { + padding: 0; +} +.emojiBox li { + display: inline-block; + width: 28px; + height: 28px; + line-height: 28px; + text-align: center; + cursor: pointer; +} +.emoji-popover { + z-index: 30000 !important; + .ant-popover-inner-content { + padding: 10px; + } +} + +[data-theme='dark'] { + .form-extra-panel .form-extra-comment-list .form-extra-comment-item .form-extra-comment-item-main .comment-content .comment-other { + background-color: #333 !important; + } + .comment-input-wrapper { + .comment-input-placeholder { + color: rgba(255, 255, 255, 0.3); + } + .comment-input-wrapper-actions { + .actions-left { + .ym-custom, + .icon-ym { + color: rgba(255, 255, 255, 0.3); + } + } + } + } +} diff --git a/src/design/config.less b/src/design/config.less new file mode 100644 index 0000000..64c33f6 --- /dev/null +++ b/src/design/config.less @@ -0,0 +1,2 @@ +@import (reference) 'color.less'; +@import (reference) 'var/index.less'; diff --git a/src/design/index.less b/src/design/index.less new file mode 100644 index 0000000..9828289 --- /dev/null +++ b/src/design/index.less @@ -0,0 +1,54 @@ +@import 'transition/index.less'; +@import 'var/index.less'; +@import 'public.less'; +@import 'common.less'; +@import 'commonFormWrapper.less'; +@import 'ant/index.less'; +@import './theme.less'; +@import './themeColor.less'; +@import './sysBg.less'; + +input:-webkit-autofill { + box-shadow: 0 0 0 1000px white inset !important; +} + +:-webkit-autofill { + transition: background-color 5000s ease-in-out 0s !important; +} + +html { + text-size-adjust: 100%; +} + +html, +body { + width: 100%; + height: 100%; + line-height: 1.5715; + overflow: visible; + + &.color-weak { + filter: invert(80%); + } + + &.gray-mode { + filter: grayscale(100%); + filter: progid:dximagetransform.microsoft.basicimage(grayscale=1); + } +} + +body { + color: rgba(0, 0, 0, 0.85); +} +[data-theme='dark'] body { + color: #c9d1d9; +} + +a:focus, +a:active, +button, +div, +svg, +span { + outline: none; +} diff --git a/src/design/public.less b/src/design/public.less new file mode 100644 index 0000000..cb27bbd --- /dev/null +++ b/src/design/public.less @@ -0,0 +1,54 @@ +#app { + width: 100%; + height: 100%; +} + +// ================================= +// ==============scrollbar========== +// ================================= + +::-webkit-scrollbar { + width: 7px; + height: 8px; +} + +// ::-webkit-scrollbar-track { +// background: transparent; +// } + +::-webkit-scrollbar-track { + // background-color: rgb(0 0 0 / 5%); +} + +::-webkit-scrollbar-thumb { + // background: rgba(0, 0, 0, 0.6); + background-color: rgb(144 147 153 / 30%); + // background-color: rgba(144, 147, 153, 0.3); + border-radius: 4px; + box-shadow: inset 0 0 6px rgb(0 0 0 / 20%); +} + +::-webkit-scrollbar-thumb:hover { + background-color: @border-color-dark; +} + +// ================================= +// ==============nprogress========== +// ================================= +#nprogress { + pointer-events: none; + + .bar { + position: fixed; + top: 0; + left: 0; + z-index: 99999; + width: 100%; + height: 2px; + background-color: @primary-color; + opacity: 0.75; + } +} +html p { + margin-bottom: 0; +} diff --git a/src/design/sysBg.less b/src/design/sysBg.less new file mode 100644 index 0000000..9332c57 --- /dev/null +++ b/src/design/sysBg.less @@ -0,0 +1,50 @@ +html[data-theme='light'] { + .ant-modal.designer-modal { + background-color: @app-base-background; + position: relative; + &.process-designer-modal { + &::before { + content: ''; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: url('../assets/images/bg-dot.png') repeat 100% 100%; + z-index: 0; + } + } + + .ant-modal-content { + background-color: transparent !important; + + .ant-modal-header { + background-color: transparent !important; + } + .ant-modal-body { + background-color: transparent !important; + & > .scrollbar { + background-color: transparent !important; + } + } + .process-flow-container { + background-color: transparent !important; + } + } + } +} +html[data-theme='light'][data-bg='blue'] { + .ant-modal.designer-modal { + background-image: url('../assets/images/bg/blueBg.png'); + } +} +html[data-theme='light'][data-bg='purple'] { + .ant-modal.designer-modal { + background-image: url('../assets/images/bg/purpleBg.png'); + } +} +html[data-theme='light'][data-bg='green'] { + .ant-modal.designer-modal { + background-image: url('../assets/images/bg/greenBg.png'); + } +} diff --git a/src/design/theme.less b/src/design/theme.less new file mode 100644 index 0000000..518d2f5 --- /dev/null +++ b/src/design/theme.less @@ -0,0 +1,278 @@ +.bg-white { + background-color: @component-background !important; +} +.bg-content { + background-color: @app-content-background !important; +} + +html[data-theme='light'] { + .text-secondary { + color: rgb(0 0 0 / 45%); + } + + .ant-alert-success { + background-color: #f6ffed; + border: 1px solid #b7eb8f; + } + + .ant-alert-error { + background-color: #fff2f0; + border: 1px solid #ffccc7; + } + + .ant-alert-warning { + background-color: #fffbe6; + border: 1px solid #ffe58f; + } + + :not(:root):fullscreen::backdrop { + background-color: @layout-body-background !important; + } + .action-bar .yunzhupaas-device-switch { + background: #f7f8fa; + } +} + +[data-theme='dark'] { + // 滚动条右下角的三角形颜色 + ::-webkit-scrollbar-corner { + background-color: #151515; + } + + .text-secondary { + color: #8b949e; + } + + .ant-picker-input input { + border: none !important; + box-shadow: unset !important; + } + + .ant-card-grid-hoverable:hover { + box-shadow: 0 3px 6px -4px rgb(0 0 0 / 48%), 0 6px 16px 0 rgb(0 0 0 / 32%), 0 9px 28px 8px rgb(0 0 0 / 20%); + } + + .ant-card-grid { + box-shadow: 1px 0 0 0 #434343, 0 1px 0 0 #434343, 1px 1px 0 0 #434343, 1px 0 0 0 #434343 inset, 0 1px 0 0 #434343 inset; + } + + .ant-calendar-selected-day .ant-calendar-date { + color: rgb(0 0 0 / 80%); + } + + .ant-select-tree li .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected { + color: rgb(0 0 0 / 90%); + } + + .ant-rate-star-half .ant-rate-star-first, + .ant-rate-star-full .ant-rate-star-second { + color: inherit !important; + } + .ant-modal.yunzhupaas-add-modal { + .add-main { + .add-item { + background: rgb(0 0 0 / 90%) !important; + .add-icon { + background: #1f1f1f !important; + color: #fff !important; + } + } + } + } + .template-list { + .template-item { + color: #fff !important; + background-color: rgba(255, 255, 255, 0.08) !important; + } + } + .ant-modal.yunzhupaas-import-modal { + .import-main .upload { + border: 1px solid #303030; + .up_left { + background: #333333; + } + } + } + .uploader-app { + .uploader-file:hover { + background-color: unset; + } + .uploader-file-info:hover { + background-color: rgba(255, 255, 255, 0.08); + } + .uploader-file-progress { + background-color: #333; + } + } + .plan-popover { + .plan-list-item:hover { + background-color: #333; + } + } + .im-container { + background: #333 !important; + box-shadow: 0 0 6px 1px rgba(121, 121, 121, 0.1) !important; + .header { + background: #151515 !important; + border-bottom: 1px solid #303030 !important; + } + .main { + .chatBox { + .chatList, + .writeBox { + background: #151515 !important; + } + } + .historyBox { + background: #151515 !important; + } + } + } + .parameter-box .left-pane .left-pane-list .list .search-box { + border-bottom: 1px solid #303030; + } + .yunzhupaas-login-container .login-content .login-tab .item { + color: #fff; + } + .yunzhupaas-basic-table.yunzhupaas-sub-table { + .ant-table-wrapper { + background: #1f1f1f !important; + } + .ant-form { + background: transparent; + } + } + .yunzhupaas-basic-drawer { + .yunzhupaas-basic-drawer-footer, + .ant-drawer-body { + background-color: #1f1f1f !important; + } + } + .ant-table-summary { + box-shadow: 0 -1px 0 #333333; + } + .popup-select-popover { + .ant-table-body { + background: #1f1f1f; + } + } + .yunzhupaas-tenant-social-modal { + .other-main { + background: url('../assets/images/other-login-bg-dark.png') no-repeat center; + background-size: auto 100%; + .other-body .other-login-card { + background-color: #171b26; + } + } + } + .notice-modal .notice-wrapper { + .info { + border-bottom: 1px solid #303030 !important; + } + .file-list { + border-top: 1px solid #303030 !important; + } + } + .monitor-container { + background-color: #333 !important; + } + .dashboard-container { + background: #333 !important; + } + .tem-container { + background-color: #333 !important; + .tem_list { + background-color: #151515 !important; + .content1 .item, + .online-sig, + .sigbut { + border: 1px solid #303030 !important; + } + } + .ant-table-small .ant-table-thead > tr > th { + background-color: #1d1d1d !important; + } + } + .yunzhupaas-extend-print-data { + .bill, + .record, + .storage { + background-color: #333 !important; + .tem_list { + background-color: #151515 !important; + .content1 .item, + .online-sig, + .sigbut { + border: 1px solid #303030 !important; + } + } + .ant-table-small .ant-table-thead > tr > th { + background-color: #1d1d1d !important; + } + } + } + .yunzhupaas-extend-barCode { + #qrcode, + #barcode { + border: 1px solid #303030 !important; + } + } + .calc-modal { + .calc-box { + .calc-preview { + border: 1px solid #303030 !important; + } + .calc-tip, + .empty-text { + color: #8b949e !important; + } + } + .calc-btn { + background: #333 !important; + } + } + .profile-wrapper { + .profile-left-tabs { + .ant-tabs-tab-disabled { + .ant-tabs-tab-btn { + border-bottom: 1px solid #303030 !important; + } + } + } + } + .yunzhupaas-log-detail { + .ant-collapse { + border-top: 1px solid #303030 !important; + .ant-collapse-item { + border-bottom: 1px solid #303030 !important; + } + } + } + .ant-modal.yunzhupaas-full-modal { + .ant-modal-header { + .yunzhupaas-full-modal-header { + .header-steps.ant-steps { + background: rgba(51, 51, 51, 0.6); + .ant-steps-item { + &.ant-steps-item-active { + .ant-steps-item-container { + background-color: #333333 !important; + } + } + } + } + } + } + } + .configuration-contain { + background-color: #151515 !important; + } + .setting-drawer { + .setting-drawer-cap { + color: #fff !important; + } + } + .portal-toggle-drawer.common-menus-drawer .main .item .item-list .item-list-item:hover { + background-color: #333333 !important; + } +} diff --git a/src/design/themeColor.less b/src/design/themeColor.less new file mode 100644 index 0000000..dd484f7 --- /dev/null +++ b/src/design/themeColor.less @@ -0,0 +1,16 @@ +@link-prefix-cls: ~'@{namespace}-link'; +.@{link-prefix-cls} { + color: @primary-color; +} + +@modal-close-prefix-cls: ~'@{namespace}-basic-modal-close'; +.@{modal-close-prefix-cls} { + & span:nth-child(1) { + &:hover { + color: @primary-color !important; + } + } +} +.http404-container .http404 .bullshit .bullshit__oops { + color: @primary-color; +} diff --git a/src/design/transition/base.less b/src/design/transition/base.less new file mode 100644 index 0000000..7944c8b --- /dev/null +++ b/src/design/transition/base.less @@ -0,0 +1,18 @@ +.transition-default() { + &-enter-active, + &-leave-active { + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1) !important; + } + + &-move { + transition: transform 0.4s; + } +} + +.expand-transition { + .transition-default(); +} + +.expand-x-transition { + .transition-default(); +} diff --git a/src/design/transition/fade.less b/src/design/transition/fade.less new file mode 100644 index 0000000..6ed1771 --- /dev/null +++ b/src/design/transition/fade.less @@ -0,0 +1,93 @@ +.fade-transition { + &-enter-active, + &-leave-active { + transition: opacity 0.2s ease-in-out; + } + + &-enter-from, + &-leave-to { + opacity: 0; + } +} + +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.2s ease-in-out; +} + +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +/* fade-slide */ +.fade-slide-leave-active, +.fade-slide-enter-active { + transition: all 0.3s; +} + +.fade-slide-enter-from { + opacity: 0; + transform: translateX(-30px); +} + +.fade-slide-leave-to { + opacity: 0; + transform: translateX(30px); +} + +// /////////////////////////////////////////////// +// Fade Bottom +// /////////////////////////////////////////////// + +// Speed: 1x +.fade-bottom-enter-active, +.fade-bottom-leave-active { + transition: opacity 0.25s, transform 0.3s; +} + +.fade-bottom-enter-from { + opacity: 0; + transform: translateY(-10%); +} + +.fade-bottom-leave-to { + opacity: 0; + transform: translateY(10%); +} + +// fade-scale +.fade-scale-leave-active, +.fade-scale-enter-active { + transition: all 0.28s; +} + +.fade-scale-enter-from { + opacity: 0; + transform: scale(1.2); +} + +.fade-scale-leave-to { + opacity: 0; + transform: scale(0.8); +} + +// /////////////////////////////////////////////// +// Fade Top +// /////////////////////////////////////////////// + +// Speed: 1x +.fade-top-enter-active, +.fade-top-leave-active { + transition: opacity 0.2s, transform 0.25s; +} + +.fade-top-enter-from { + opacity: 0; + transform: translateY(8%); +} + +.fade-top-leave-to { + opacity: 0; + transform: translateY(-8%); +} diff --git a/src/design/transition/index.less b/src/design/transition/index.less new file mode 100644 index 0000000..e372b25 --- /dev/null +++ b/src/design/transition/index.less @@ -0,0 +1,10 @@ +@import './base.less'; +@import './fade.less'; +@import './scale.less'; +@import './slide.less'; +@import './scroll.less'; +@import './zoom.less'; + +.collapse-transition { + transition: 0.2s height ease-in-out, 0.2s padding-top ease-in-out, 0.2s padding-bottom ease-in-out; +} diff --git a/src/design/transition/scale.less b/src/design/transition/scale.less new file mode 100644 index 0000000..c965493 --- /dev/null +++ b/src/design/transition/scale.less @@ -0,0 +1,21 @@ +.scale-transition { + .transition-default(); + + &-enter-from, + &-leave, + &-leave-to { + opacity: 0; + transform: scale(0); + } +} + +.scale-rotate-transition { + .transition-default(); + + &-enter-from, + &-leave, + &-leave-to { + opacity: 0; + transform: scale(0) rotate(-45deg); + } +} diff --git a/src/design/transition/scroll.less b/src/design/transition/scroll.less new file mode 100644 index 0000000..a5f45e4 --- /dev/null +++ b/src/design/transition/scroll.less @@ -0,0 +1,67 @@ +.scroll-y-transition { + .transition-default(); + + &-enter-from, + &-leave-to { + opacity: 0; + } + + &-enter-from { + transform: translateY(-15px); + } + + &-leave-to { + transform: translateY(15px); + } +} + +.scroll-y-reverse-transition { + .transition-default(); + + &-enter-from, + &-leave-to { + opacity: 0; + } + + &-enter-from { + transform: translateY(15px); + } + + &-leave-to { + transform: translateY(-15px); + } +} + +.scroll-x-transition { + .transition-default(); + + &-enter-from, + &-leave-to { + opacity: 0; + } + + &-enter-from { + transform: translateX(-15px); + } + + &-leave-to { + transform: translateX(15px); + } +} + +.scroll-x-reverse-transition { + .transition-default(); + + &-enter-from, + &-leave-to { + opacity: 0; + } + + &-enter-from { + transform: translateX(15px); + } + + &-leave-to { + transform: translateX(-15px); + } +} diff --git a/src/design/transition/slide.less b/src/design/transition/slide.less new file mode 100644 index 0000000..79b00df --- /dev/null +++ b/src/design/transition/slide.less @@ -0,0 +1,39 @@ +.slide-y-transition { + .transition-default(); + + &-enter-from, + &-leave-to { + opacity: 0; + transform: translateY(-15px); + } +} + +.slide-y-reverse-transition { + .transition-default(); + + &-enter-from, + &-leave-to { + opacity: 0; + transform: translateY(15px); + } +} + +.slide-x-transition { + .transition-default(); + + &-enter-from, + &-leave-to { + opacity: 0; + transform: translateX(-15px); + } +} + +.slide-x-reverse-transition { + .transition-default(); + + &-enter-from, + &-leave-to { + opacity: 0; + transform: translateX(15px); + } +} diff --git a/src/design/transition/zoom.less b/src/design/transition/zoom.less new file mode 100644 index 0000000..2ea378c --- /dev/null +++ b/src/design/transition/zoom.less @@ -0,0 +1,27 @@ +// zoom-out +.zoom-out-enter-active, +.zoom-out-leave-active { + transition: opacity 0.1 ease-in-out, transform 0.15s ease-out; +} + +.zoom-out-enter-from, +.zoom-out-leave-to { + opacity: 0; + transform: scale(0); +} + +// zoom-fade +.zoom-fade-enter-active, +.zoom-fade-leave-active { + transition: transform 0.2s, opacity 0.3s ease-out; +} + +.zoom-fade-enter-from { + opacity: 0; + transform: scale(0.92); +} + +.zoom-fade-leave-to { + opacity: 0; + transform: scale(1.06); +} diff --git a/src/design/var/breakpoint.less b/src/design/var/breakpoint.less new file mode 100644 index 0000000..793e826 --- /dev/null +++ b/src/design/var/breakpoint.less @@ -0,0 +1,33 @@ +// ================================= +// ==============屏幕断点============ +// ================================= + +// Extra small screen / phone +@screen-xs: 480px; +@screen-xs-min: @screen-xs; + +// Small screen / tablet +@screen-sm: 576px; +@screen-sm-min: @screen-sm; + +// Medium screen / desktop +@screen-md: 768px; +@screen-md-min: @screen-md; + +// Large screen / wide desktop +@screen-lg: 992px; +@screen-lg-min: @screen-lg; + +// Extra large screen / full hd +@screen-xl: 1200px; +@screen-xl-min: @screen-xl; + +// Extra extra large screen / large desktop +@screen-2xl: 1600px; +@screen-2xl-min: @screen-2xl; + +@screen-xs-max: (@screen-sm-min - 1px); +@screen-sm-max: (@screen-md-min - 1px); +@screen-md-max: (@screen-lg-min - 1px); +@screen-lg-max: (@screen-xl-min - 1px); +@screen-xl-max: (@screen-2xl-min - 1px); diff --git a/src/design/var/easing.less b/src/design/var/easing.less new file mode 100644 index 0000000..e19735f --- /dev/null +++ b/src/design/var/easing.less @@ -0,0 +1,18 @@ +// ================================= +// ==============动画函数-=========== +// ================================= + +@ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1); +@ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7); +@ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); +@ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19); +@ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1); +@ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46); +@ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6); +@ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46); +@ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1); +@ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34); +@ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86); +@ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1); +@ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06); +@ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1); diff --git a/src/design/var/index.less b/src/design/var/index.less new file mode 100644 index 0000000..6799c66 --- /dev/null +++ b/src/design/var/index.less @@ -0,0 +1,79 @@ +@import (reference) '../color.less'; +@import 'easing'; +@import 'breakpoint'; + +@namespace: yunzhupaas; + +// tabs +@multiple-height: 40px; + +// headers +@header-height: 60px; + +// logo width +@logo-width: 32px; + +// +@side-drag-z-index: 200; + +@page-loading-z-index: 10000; + +@lock-page-z-index: 1000; + +@layout-header-fixed-z-index: 500; + +@multiple-tab-fixed-z-index: 505; + +@layout-sider-fixed-z-index: 510; + +@layout-mix-sider-fixed-z-index: 550; + +@preview-comp-z-index: 1000; + +@page-footer-z-index: 99; + +.bem(@n; @content) { + @{namespace}-@{n} { + @content(); + } +} + +// ===================== +// ant-design v3 less variable compatibility +// ===================== +@primary-color: #1890ff; +@primary-1: #e6f7ff; +@primary-2: #bae7ff; +@primary-3: #91d5ff; +@primary-4: #69c0ff; +@primary-5: #40a9ff; +@primary-6: #1890ff; +@primary-7: #096dd9; +@link-color: @primary-color; +@success-color: #52c41a; +@warning-color: #faad14; +@error-color: #f5222d; +@font-size-base: 14px; +@heading-color: rgba(0, 0, 0, 0.85); +@text-color: rgba(0, 0, 0, 0.85); +@text-color-secondary: rgba(0, 0, 0, 0.45); +@disabled-color: rgba(0, 0, 0, 0.25); +@disabled-bg: #f5f5f5; +@border-radius-base: 2px; +@border-color-base: #d9d9d9; +@border-color-base1: #e8e8e8; +@border-color-split: #f0f0f0; +@component-background: #fff; +@body-background: #fff; +@item-hover-bg: #f5f5f5; +@hover-background: #f5f5f5; +@selected-hover-bg: #e6f7ff; +@app-content-background: #fafafa; +@app-main-background: #f0f2f5; +@app-base-background: #f0f2f5; +@layout-body-background: #f0f2f5; +@tree-node-selected-bg: #e6f7ff; +@modal-mask-bg: rgba(0, 0, 0, 0.45); +@input-height-base: 32px; +@padding-md: 16px; +@btn-info-color: #1890ff; diff --git a/src/design/windi-base.css b/src/design/windi-base.css new file mode 100644 index 0000000..d4083c7 --- /dev/null +++ b/src/design/windi-base.css @@ -0,0 +1,344 @@ +/* windicss layer base */ +*, +::before, +::after { + box-sizing: border-box; +} +* { + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgba(59, 130, 246, 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; +} +* > .enter-x:nth-child(1) { + transform: translateX(50px); +} +* > .-enter-x:nth-child(1) { + transform: translateX(-50px); +} +* > .enter-x:nth-child(1), +* > .-enter-x:nth-child(1) { + z-index: 9; + opacity: 0; + animation: enter-x-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.1s; +} +* > .enter-y:nth-child(1) { + transform: translateY(50px); +} +* > .-enter-y:nth-child(1) { + transform: translateY(-50px); +} +* > .enter-y:nth-child(1), +* > .-enter-y:nth-child(1) { + z-index: 9; + opacity: 0; + animation: enter-y-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.1s; +} +* > .enter-x:nth-child(2) { + transform: translateX(50px); +} +* > .-enter-x:nth-child(2) { + transform: translateX(-50px); +} +* > .enter-x:nth-child(2), +* > .-enter-x:nth-child(2) { + z-index: 8; + opacity: 0; + animation: enter-x-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.2s; +} +* > .enter-y:nth-child(2) { + transform: translateY(50px); +} +* > .-enter-y:nth-child(2) { + transform: translateY(-50px); +} +* > .enter-y:nth-child(2), +* > .-enter-y:nth-child(2) { + z-index: 8; + opacity: 0; + animation: enter-y-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.2s; +} +* > .enter-x:nth-child(3) { + transform: translateX(50px); +} +* > .-enter-x:nth-child(3) { + transform: translateX(-50px); +} +* > .enter-x:nth-child(3), +* > .-enter-x:nth-child(3) { + z-index: 7; + opacity: 0; + animation: enter-x-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.3s; +} +* > .enter-y:nth-child(3) { + transform: translateY(50px); +} +* > .-enter-y:nth-child(3) { + transform: translateY(-50px); +} +* > .enter-y:nth-child(3), +* > .-enter-y:nth-child(3) { + z-index: 7; + opacity: 0; + animation: enter-y-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.3s; +} +* > .enter-x:nth-child(4) { + transform: translateX(50px); +} +* > .-enter-x:nth-child(4) { + transform: translateX(-50px); +} +* > .enter-x:nth-child(4), +* > .-enter-x:nth-child(4) { + z-index: 6; + opacity: 0; + animation: enter-x-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.4s; +} +* > .enter-y:nth-child(4) { + transform: translateY(50px); +} +* > .-enter-y:nth-child(4) { + transform: translateY(-50px); +} +* > .enter-y:nth-child(4), +* > .-enter-y:nth-child(4) { + z-index: 6; + opacity: 0; + animation: enter-y-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.4s; +} +* > .enter-x:nth-child(5) { + transform: translateX(50px); +} +* > .-enter-x:nth-child(5) { + transform: translateX(-50px); +} +* > .enter-x:nth-child(5), +* > .-enter-x:nth-child(5) { + z-index: 5; + opacity: 0; + animation: enter-x-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.5s; +} +* > .enter-y:nth-child(5) { + transform: translateY(50px); +} +* > .-enter-y:nth-child(5) { + transform: translateY(-50px); +} +* > .enter-y:nth-child(5), +* > .-enter-y:nth-child(5) { + z-index: 5; + opacity: 0; + animation: enter-y-animation 0.4s ease-in-out 0.3s; + animation-fill-mode: forwards; + animation-delay: 0.5s; +} +:root { + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; +} +:-moz-focusring { + outline: 1px dotted ButtonText; +} +:-moz-ui-invalid { + box-shadow: none; +} +::moz-focus-inner { + border-style: none; + padding: 0; +} +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} +::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} +[type='search'] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} +a { + color: inherit; + text-decoration: inherit; +} +body { + margin: 0; + font-family: inherit; + line-height: inherit; +} +b { + font-weight: bolder; +} +button { + text-transform: none; + background-color: transparent; + background-image: none; +} +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; +} +button, +[role='button'] { + cursor: pointer; +} +html { + -webkit-text-size-adjust: 100%; + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + line-height: 1.5; +} +h2, +h4, +h1, +h3, +h5 { + font-size: inherit; + font-weight: inherit; +} +input, +textarea, +button { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; + padding: 0; + line-height: inherit; + color: inherit; +} +input::-moz-placeholder { + opacity: 1; + color: #9ca3af; +} +input::placeholder { + opacity: 1; + color: #9ca3af; +} +input::webkit-input-placeholder { + opacity: 1; + color: #9ca3af; +} +input::-moz-placeholder { + opacity: 1; + color: #9ca3af; +} +input:-ms-input-placeholder { + opacity: 1; + color: #9ca3af; +} +input::-ms-input-placeholder { + opacity: 1; + color: #9ca3af; +} +img, +svg, +canvas, +iframe, +embed, +video, +audio { + display: block; + vertical-align: middle; +} +img, +video { + max-width: 100%; + height: auto; +} +pre, +code { + font-size: 1em; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; +} +p, +h2, +h4, +h1, +pre, +h3, +h5 { + margin: 0; +} +table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; +} +textarea { + resize: vertical; +} +textarea::-moz-placeholder { + opacity: 1; + color: #9ca3af; +} +textarea::placeholder { + opacity: 1; + color: #9ca3af; +} +textarea::webkit-input-placeholder { + opacity: 1; + color: #9ca3af; +} +textarea::-moz-placeholder { + opacity: 1; + color: #9ca3af; +} +textarea:-ms-input-placeholder { + opacity: 1; + color: #9ca3af; +} +textarea::-ms-input-placeholder { + opacity: 1; + color: #9ca3af; +} +@keyframes enter-x-animation { + to { + opacity: 1; + transform: translateX(0); + } +} +@keyframes enter-y-animation { + to { + opacity: 1; + transform: translateY(0); + } +} +ul, +ol { + list-style: none; + margin: 0; + padding: 0; +} diff --git a/src/directives/clickOutside.ts b/src/directives/clickOutside.ts new file mode 100644 index 0000000..e036bc6 --- /dev/null +++ b/src/directives/clickOutside.ts @@ -0,0 +1,77 @@ +import { on } from '@/utils/domUtils'; +import { isServer } from '@/utils/is'; +import type { ComponentPublicInstance, DirectiveBinding, ObjectDirective } from 'vue'; + +type DocumentHandler = (mouseup: T, mousedown: T) => void; + +type FlushList = Map< + HTMLElement, + { + documentHandler: DocumentHandler; + bindingFn: (...args: unknown[]) => unknown; + } +>; + +const nodeList: FlushList = new Map(); + +let startClick: MouseEvent; + +if (!isServer) { + on(document, 'mousedown', (e: MouseEvent) => (startClick = e)); + on(document, 'mouseup', (e: MouseEvent) => { + for (const { documentHandler } of nodeList.values()) { + documentHandler(e, startClick); + } + }); +} + +function createDocumentHandler(el: HTMLElement, binding: DirectiveBinding): DocumentHandler { + let excludes: HTMLElement[] = []; + if (Array.isArray(binding.arg)) { + excludes = binding.arg; + } else { + // due to current implementation on binding type is wrong the type casting is necessary here + excludes.push(binding.arg as unknown as HTMLElement); + } + return function (mouseup, mousedown) { + const popperRef = ( + binding.instance as ComponentPublicInstance<{ + popperRef: Nullable; + }> + ).popperRef; + const mouseUpTarget = mouseup.target as Node; + const mouseDownTarget = mousedown.target as Node; + const isBound = !binding || !binding.instance; + const isTargetExists = !mouseUpTarget || !mouseDownTarget; + const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget); + const isSelf = el === mouseUpTarget; + + const isTargetExcluded = + (excludes.length && excludes.some(item => item?.contains(mouseUpTarget))) || (excludes.length && excludes.includes(mouseDownTarget as HTMLElement)); + const isContainedByPopper = popperRef && (popperRef.contains(mouseUpTarget) || popperRef.contains(mouseDownTarget)); + if (isBound || isTargetExists || isContainedByEl || isSelf || isTargetExcluded || isContainedByPopper) { + return; + } + binding.value(); + }; +} + +const ClickOutside: ObjectDirective = { + beforeMount(el, binding) { + nodeList.set(el, { + documentHandler: createDocumentHandler(el, binding), + bindingFn: binding.value, + }); + }, + updated(el, binding) { + nodeList.set(el, { + documentHandler: createDocumentHandler(el, binding), + bindingFn: binding.value, + }); + }, + unmounted(el) { + nodeList.delete(el); + }, +}; + +export default ClickOutside; diff --git a/src/directives/index.ts b/src/directives/index.ts new file mode 100644 index 0000000..0329eb6 --- /dev/null +++ b/src/directives/index.ts @@ -0,0 +1,11 @@ +/** + * Configure and register global directives + */ +import type { App } from 'vue'; +import { setupPermissionDirective } from './permission'; +import { setupLoadingDirective } from './loading'; + +export function setupGlobDirectives(app: App) { + setupPermissionDirective(app); + setupLoadingDirective(app); +} diff --git a/src/directives/loading.ts b/src/directives/loading.ts new file mode 100644 index 0000000..dadb5b7 --- /dev/null +++ b/src/directives/loading.ts @@ -0,0 +1,39 @@ +import { createLoading } from '@/components/Loading'; +import type { Directive, App } from 'vue'; + +const loadingDirective: Directive = { + mounted(el, binding) { + const tip = el.getAttribute('loading-tip'); + const background = el.getAttribute('loading-background'); + const size = el.getAttribute('loading-size'); + const fullscreen = !!binding.modifiers.fullscreen; + const instance = createLoading( + { + tip, + background, + size: size || 'large', + loading: !!binding.value, + absolute: !fullscreen, + }, + fullscreen ? document.body : el, + ); + el.instance = instance; + }, + updated(el, binding) { + const instance = el.instance; + if (!instance) return; + instance.setTip(el.getAttribute('loading-tip')); + if (binding.oldValue !== binding.value) { + instance.setLoading?.(binding.value && !instance.loading); + } + }, + unmounted(el) { + el?.instance?.close(); + }, +}; + +export function setupLoadingDirective(app: App) { + app.directive('loading', loadingDirective); +} + +export default loadingDirective; diff --git a/src/directives/permission.ts b/src/directives/permission.ts new file mode 100644 index 0000000..5d1dc99 --- /dev/null +++ b/src/directives/permission.ts @@ -0,0 +1,44 @@ +/** + * Global authority directive + * Used for fine-grained control of component permissions + * @Example v-auth="'btn-edit'" + */ +import type { App, Directive, DirectiveBinding } from 'vue'; +import { useUserStoreWithOut } from '@/store/modules/user'; + +function hasBtnP(modelId, value?: string): boolean { + if (!value) return true; + if (!modelId) return false; + const userStore = useUserStoreWithOut(); + const permissionList = userStore.getPermissionList; + const list = permissionList.filter(o => o.modelId === modelId); + if (!list.length) return false; + const btnList = list[0] && list[0].button ? list[0].button : []; + if (!btnList.length) return false; + const hasPermission = btnList.some(btn => btn.enCode === value); + if (hasPermission) return true; + return false; +} + +function isAuth(el: Element, binding: any, VNode) { + const value = binding.value; + const modelId = VNode.ctx.proxy.$route.meta.modelId || ''; + if (!value) return; + if (!hasBtnP(modelId, value)) { + el.parentNode?.removeChild(el); + } +} + +const mounted = (el: Element, binding: DirectiveBinding, VNode) => { + isAuth(el, binding, VNode); +}; + +const authDirective: Directive = { + mounted, +}; + +export function setupPermissionDirective(app: App) { + app.directive('auth', authDirective); +} + +export default authDirective; diff --git a/src/directives/repeatClick.ts b/src/directives/repeatClick.ts new file mode 100644 index 0000000..054a6b2 --- /dev/null +++ b/src/directives/repeatClick.ts @@ -0,0 +1,31 @@ +/** + * Prevent repeated clicks + * @Example v-repeat-click="()=>{}" + */ +import { on, once } from '@/utils/domUtils'; +import type { Directive, DirectiveBinding } from 'vue'; + +const repeatDirective: Directive = { + beforeMount(el: Element, binding: DirectiveBinding) { + let interval: Nullable = null; + let startTime = 0; + const handler = (): void => binding?.value(); + const clear = (): void => { + if (Date.now() - startTime < 100) { + handler(); + } + interval && clearInterval(interval); + interval = null; + }; + + on(el, 'mousedown', (e: MouseEvent): void => { + if ((e as any).button !== 0) return; + startTime = Date.now(); + once(document as any, 'mouseup', clear); + interval && clearInterval(interval); + interval = setInterval(handler, 100); + }); + }, +}; + +export default repeatDirective; diff --git a/src/directives/ripple/index.less b/src/directives/ripple/index.less new file mode 100644 index 0000000..9c0718e --- /dev/null +++ b/src/directives/ripple/index.less @@ -0,0 +1,21 @@ +.ripple-container { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + overflow: hidden; + pointer-events: none; +} + +.ripple-effect { + position: relative; + z-index: 9999; + width: 1px; + height: 1px; + margin-top: 0; + margin-left: 0; + pointer-events: none; + border-radius: 50%; + transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1); +} diff --git a/src/directives/ripple/index.ts b/src/directives/ripple/index.ts new file mode 100644 index 0000000..85a80e8 --- /dev/null +++ b/src/directives/ripple/index.ts @@ -0,0 +1,191 @@ +import type { Directive } from 'vue'; +import './index.less'; +export interface RippleOptions { + event: string; + transition: number; +} + +export interface RippleProto { + background?: string; + zIndex?: string; +} + +export type EventType = Event & MouseEvent & TouchEvent; + +const options: RippleOptions = { + event: 'mousedown', + transition: 400, +}; + +const RippleDirective: Directive & RippleProto = { + beforeMount: (el: HTMLElement, binding) => { + if (binding.value === false) return; + + const bg = el.getAttribute('ripple-background'); + setProps(Object.keys(binding.modifiers), options); + + const background = bg || RippleDirective.background; + const zIndex = RippleDirective.zIndex; + + el.addEventListener(options.event, (event: EventType) => { + rippler({ + event, + el, + background, + zIndex, + }); + }); + }, + updated(el, binding) { + if (!binding.value) { + el?.clearRipple?.(); + return; + } + const bg = el.getAttribute('ripple-background'); + el?.setBackground?.(bg); + }, +}; + +function rippler({ + event, + el, + zIndex, + background, +}: { event: EventType; el: HTMLElement } & RippleProto) { + const targetBorder = parseInt(getComputedStyle(el).borderWidth.replace('px', '')); + const clientX = event.clientX || event.touches[0].clientX; + const clientY = event.clientY || event.touches[0].clientY; + + const rect = el.getBoundingClientRect(); + const { left, top } = rect; + const { offsetWidth: width, offsetHeight: height } = el; + const { transition } = options; + const dx = clientX - left; + const dy = clientY - top; + const maxX = Math.max(dx, width - dx); + const maxY = Math.max(dy, height - dy); + const style = window.getComputedStyle(el); + const radius = Math.sqrt(maxX * maxX + maxY * maxY); + const border = targetBorder > 0 ? targetBorder : 0; + + const ripple = document.createElement('div'); + const rippleContainer = document.createElement('div'); + + // Styles for ripple + ripple.className = 'ripple'; + + Object.assign(ripple.style ?? {}, { + marginTop: '0px', + marginLeft: '0px', + width: '1px', + height: '1px', + transition: `all ${transition}ms cubic-bezier(0.4, 0, 0.2, 1)`, + borderRadius: '50%', + pointerEvents: 'none', + position: 'relative', + zIndex: zIndex ?? '9999', + backgroundColor: background ?? 'rgba(0, 0, 0, 0.12)', + }); + + // Styles for rippleContainer + rippleContainer.className = 'ripple-container'; + Object.assign(rippleContainer.style ?? {}, { + position: 'absolute', + left: `${0 - border}px`, + top: `${0 - border}px`, + height: '0', + width: '0', + pointerEvents: 'none', + overflow: 'hidden', + }); + + const storedTargetPosition = + el.style.position.length > 0 ? el.style.position : getComputedStyle(el).position; + + if (storedTargetPosition !== 'relative') { + el.style.position = 'relative'; + } + + rippleContainer.appendChild(ripple); + el.appendChild(rippleContainer); + + Object.assign(ripple.style, { + marginTop: `${dy}px`, + marginLeft: `${dx}px`, + }); + + const { + borderTopLeftRadius, + borderTopRightRadius, + borderBottomLeftRadius, + borderBottomRightRadius, + } = style; + Object.assign(rippleContainer.style, { + width: `${width}px`, + height: `${height}px`, + direction: 'ltr', + borderTopLeftRadius, + borderTopRightRadius, + borderBottomLeftRadius, + borderBottomRightRadius, + }); + + setTimeout(() => { + const wh = `${radius * 2}px`; + Object.assign(ripple.style ?? {}, { + width: wh, + height: wh, + marginLeft: `${dx - radius}px`, + marginTop: `${dy - radius}px`, + }); + }, 0); + + function clearRipple() { + setTimeout(() => { + ripple.style.backgroundColor = 'rgba(0, 0, 0, 0)'; + }, 250); + + setTimeout(() => { + rippleContainer?.parentNode?.removeChild(rippleContainer); + }, 850); + el.removeEventListener('mouseup', clearRipple, false); + el.removeEventListener('mouseleave', clearRipple, false); + el.removeEventListener('dragstart', clearRipple, false); + setTimeout(() => { + let clearPosition = true; + for (let i = 0; i < el.childNodes.length; i++) { + if ((el.childNodes[i] as Recordable).className === 'ripple-container') { + clearPosition = false; + } + } + + if (clearPosition) { + el.style.position = storedTargetPosition !== 'static' ? storedTargetPosition : ''; + } + }, options.transition + 260); + } + + if (event.type === 'mousedown') { + el.addEventListener('mouseup', clearRipple, false); + el.addEventListener('mouseleave', clearRipple, false); + el.addEventListener('dragstart', clearRipple, false); + } else { + clearRipple(); + } + + (el as Recordable).setBackground = (bgColor: string) => { + if (!bgColor) { + return; + } + ripple.style.backgroundColor = bgColor; + }; +} + +function setProps(modifiers: Recordable, props: Recordable) { + modifiers.forEach((item: Recordable) => { + if (isNaN(Number(item))) props.event = item; + else props.transition = item; + }); +} + +export default RippleDirective; diff --git a/src/enums/appEnum.ts b/src/enums/appEnum.ts new file mode 100644 index 0000000..0b8b04b --- /dev/null +++ b/src/enums/appEnum.ts @@ -0,0 +1,37 @@ +export const SIDE_BAR_MINI_WIDTH = 60; +export const SIDE_BAR_SHOW_TIT_MINI_WIDTH = 80; + +export enum ContentEnum { + // auto width + FULL = 'full', + // fixed width + FIXED = 'fixed', +} + +// menu theme enum +export enum ThemeEnum { + DARK = 'dark', + LIGHT = 'light', +} + +export enum SettingButtonPositionEnum { + AUTO = 'auto', + HEADER = 'header', + FIXED = 'fixed', +} + +export enum SessionTimeoutProcessingEnum { + ROUTE_JUMP, + PAGE_COVERAGE, +} + +// Route switching animation +// 路由切换动画 +export enum RouterTransitionEnum { + ZOOM_FADE = 'zoom-fade', + ZOOM_OUT = 'zoom-out', + FADE_SIDE = 'fade-slide', + FADE = 'fade', + FADE_BOTTOM = 'fade-bottom', + FADE_SCALE = 'fade-scale', +} diff --git a/src/enums/breakpointEnum.ts b/src/enums/breakpointEnum.ts new file mode 100644 index 0000000..93acc1a --- /dev/null +++ b/src/enums/breakpointEnum.ts @@ -0,0 +1,28 @@ +export enum sizeEnum { + XS = 'XS', + SM = 'SM', + MD = 'MD', + LG = 'LG', + XL = 'XL', + XXL = 'XXL', +} + +export enum screenEnum { + XS = 480, + SM = 576, + MD = 768, + LG = 992, + XL = 1200, + XXL = 1600, +} + +const screenMap = new Map(); + +screenMap.set(sizeEnum.XS, screenEnum.XS); +screenMap.set(sizeEnum.SM, screenEnum.SM); +screenMap.set(sizeEnum.MD, screenEnum.MD); +screenMap.set(sizeEnum.LG, screenEnum.LG); +screenMap.set(sizeEnum.XL, screenEnum.XL); +screenMap.set(sizeEnum.XXL, screenEnum.XXL); + +export { screenMap }; diff --git a/src/enums/cacheEnum.ts b/src/enums/cacheEnum.ts new file mode 100644 index 0000000..3b46fd8 --- /dev/null +++ b/src/enums/cacheEnum.ts @@ -0,0 +1,34 @@ +// token key +export const TOKEN_KEY = 'TOKEN__'; + +export const LOCALE_KEY = 'LOCALE__'; + +// user info key +export const USER_INFO_KEY = 'USER__INFO__'; + +// 用户权限 +export const PERMISSIONS_KEY = 'PERMISSIONS__INFO__'; + +// role info key +export const ROLES_KEY = 'ROLES__KEY__'; + +// project config key +export const PROJ_CFG_KEY = 'PROJ__CFG__KEY__'; + +// lock info +export const LOCK_INFO_KEY = 'LOCK__INFO__KEY__'; + +export const MULTIPLE_TABS_KEY = 'MULTIPLE_TABS__KEY__'; + +export const APP_DARK_MODE_KEY_ = '__APP__DARK__MODE__'; + +// base global local key +export const APP_LOCAL_CACHE_KEY = 'COMMON__LOCAL__KEY__'; + +// base global session key +export const APP_SESSION_CACHE_KEY = 'COMMON__SESSION__KEY__'; + +export enum CacheTypeEnum { + SESSION, + LOCAL, +} diff --git a/src/enums/exceptionEnum.ts b/src/enums/exceptionEnum.ts new file mode 100644 index 0000000..d28f4d0 --- /dev/null +++ b/src/enums/exceptionEnum.ts @@ -0,0 +1,27 @@ +/** + * @description: Exception related enumeration + */ +export enum ExceptionEnum { + // page not access + PAGE_NOT_ACCESS = 403, + + // page not found + PAGE_NOT_FOUND = 404, + + // error + ERROR = 500, + + // net work error + NET_WORK_ERROR = 10000, + + // No data on the page. In fact, it is not an exception page + PAGE_NOT_DATA = 10100, +} + +export enum ErrorTypeEnum { + VUE = 'vue', + SCRIPT = 'script', + RESOURCE = 'resource', + AJAX = 'ajax', + PROMISE = 'promise', +} diff --git a/src/enums/httpEnum.ts b/src/enums/httpEnum.ts new file mode 100644 index 0000000..c9c1d63 --- /dev/null +++ b/src/enums/httpEnum.ts @@ -0,0 +1,31 @@ +/** + * @description: Request result set + */ +export enum ResultEnum { + SUCCESS = 200, + TOKEN_TIMEOUT = 600, + TOKEN_LOGGED = 601, + TOKEN_ERROR = 602, +} + +/** + * @description: request method + */ +export enum RequestEnum { + GET = 'GET', + POST = 'POST', + PUT = 'PUT', + DELETE = 'DELETE', +} + +/** + * @description: contentType + */ +export enum ContentTypeEnum { + // json + JSON = 'application/json;charset=UTF-8', + // form-data qs + FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8', + // form-data upload + FORM_DATA = 'multipart/form-data;charset=UTF-8', +} diff --git a/src/enums/menuEnum.ts b/src/enums/menuEnum.ts new file mode 100644 index 0000000..ae9aeac --- /dev/null +++ b/src/enums/menuEnum.ts @@ -0,0 +1,59 @@ +/** + * @description: menu type + */ +export enum MenuTypeEnum { + // left menu + SIDEBAR = 'sidebar', + + MIX_SIDEBAR = 'mix-sidebar', + // mixin menu + MIX = 'mix', + // top menu + TOP_MENU = 'top-menu', +} +/** + * @description: 系统背景 + */ +export enum SysBgEnum { + DEFAULT = '', + BLUE = 'blue', + PURPLE = 'purple', + GREEN = 'green', +} + +// 折叠触发器位置 +export enum TriggerEnum { + // 不显示 + NONE = 'NONE', + // 菜单底部 + FOOTER = 'FOOTER', + // 头部 + HEADER = 'HEADER', +} + +export type Mode = 'vertical' | 'vertical-right' | 'horizontal' | 'inline'; + +// menu mode +export enum MenuModeEnum { + VERTICAL = 'vertical', + HORIZONTAL = 'horizontal', + VERTICAL_RIGHT = 'vertical-right', + INLINE = 'inline', +} + +export enum MenuSplitTyeEnum { + NONE, + TOP, + LEFT, +} + +export enum TopMenuAlignEnum { + CENTER = 'center', + START = 'start', + END = 'end', +} + +export enum MixSidebarTriggerEnum { + HOVER = 'hover', + CLICK = 'click', +} diff --git a/src/enums/pageEnum.ts b/src/enums/pageEnum.ts new file mode 100644 index 0000000..045c599 --- /dev/null +++ b/src/enums/pageEnum.ts @@ -0,0 +1,20 @@ +export enum PageEnum { + // basic login path + BASE_LOGIN = '/login', + // basic sso path + BASE_SSO = '/sso', + // basic home path + BASE_HOME = '/home', + // basic formShortLink path + BASE_FORM_SHORT_LINK = '/formShortLink', + // error page path + ERROR_PAGE = '/exception', + // error log page path + ERROR_LOG_PAGE = '/error-log/list', + // 流程图 + FLOW_CHART = '/flowChart', + // 流程归档 + FLOW_FILE = '/flowFile', +} + +export const PageWrapperFixedHeightKey = 'PageWrapperFixedHeight'; diff --git a/src/enums/sizeEnum.ts b/src/enums/sizeEnum.ts new file mode 100644 index 0000000..9bac184 --- /dev/null +++ b/src/enums/sizeEnum.ts @@ -0,0 +1,19 @@ +export enum SizeEnum { + DEFAULT = 'default', + SMALL = 'small', + LARGE = 'large', +} + +export enum SizeNumberEnum { + DEFAULT = 48, + SMALL = 16, + LARGE = 64, +} + +export const sizeMap: Map = (() => { + const map = new Map(); + map.set(SizeEnum.DEFAULT, SizeNumberEnum.DEFAULT); + map.set(SizeEnum.SMALL, SizeNumberEnum.SMALL); + map.set(SizeEnum.LARGE, SizeNumberEnum.LARGE); + return map; +})(); diff --git a/src/hooks/component/useFormItem.ts b/src/hooks/component/useFormItem.ts new file mode 100644 index 0000000..84a2122 --- /dev/null +++ b/src/hooks/component/useFormItem.ts @@ -0,0 +1,46 @@ +import type { UnwrapRef, Ref, WritableComputedRef, DeepReadonly } from 'vue'; +import { reactive, readonly, computed, getCurrentInstance, watchEffect, unref, toRaw } from 'vue'; + +import { isEqual } from 'lodash-es'; + +export function useRuleFormItem>( + props: T, + key?: K, + changeEvent?, + emitData?: Ref, +): [WritableComputedRef, (val: V) => void, DeepReadonly]; + +export function useRuleFormItem(props: T, key: keyof T = 'value', changeEvent = 'change', emitData?: Ref) { + const instance = getCurrentInstance(); + const emit = instance?.emit; + + const innerState = reactive({ + value: props[key], + }); + + const defaultState = readonly(innerState); + + const setState = (val: UnwrapRef): void => { + innerState.value = val as T[keyof T]; + }; + + watchEffect(() => { + innerState.value = props[key]; + }); + + const state: any = computed({ + get() { + return innerState.value; + }, + set(value) { + if (isEqual(value, defaultState.value)) return; + + innerState.value = value as T[keyof T]; + setTimeout(() => { + emit?.(changeEvent, value, ...(toRaw(unref(emitData)) || [])); + }); + }, + }); + + return [state, setState, defaultState]; +} diff --git a/src/hooks/component/usePageContext.ts b/src/hooks/component/usePageContext.ts new file mode 100644 index 0000000..1e2e715 --- /dev/null +++ b/src/hooks/component/usePageContext.ts @@ -0,0 +1,18 @@ +import type { InjectionKey, ComputedRef, Ref } from 'vue'; +import { createContext, useContext } from '@/hooks/core/useContext'; + +export interface PageContextProps { + contentHeight: ComputedRef; + pageHeight: Ref; + setPageHeight: (height: number) => Promise; +} + +const key: InjectionKey = Symbol(); + +export function createPageContext(context: PageContextProps) { + return createContext(context, key, { native: true }); +} + +export function usePageContext() { + return useContext(key); +} diff --git a/src/hooks/core/onMountedOrActivated.ts b/src/hooks/core/onMountedOrActivated.ts new file mode 100644 index 0000000..ffabf18 --- /dev/null +++ b/src/hooks/core/onMountedOrActivated.ts @@ -0,0 +1,18 @@ +import { nextTick, onMounted, onActivated } from 'vue'; + +export function onMountedOrActivated(hook: Fn) { + let mounted: boolean; + + onMounted(() => { + hook(); + nextTick(() => { + mounted = true; + }); + }); + + onActivated(() => { + if (mounted) { + hook(); + } + }); +} diff --git a/src/hooks/core/useAttrs.ts b/src/hooks/core/useAttrs.ts new file mode 100644 index 0000000..a7c5bd7 --- /dev/null +++ b/src/hooks/core/useAttrs.ts @@ -0,0 +1,40 @@ +import { getCurrentInstance, reactive, shallowRef, watchEffect } from 'vue'; +import type { Ref } from 'vue'; +interface Params { + excludeListeners?: boolean; + excludeKeys?: string[]; + excludeDefaultKeys?: boolean; +} + +const DEFAULT_EXCLUDE_KEYS = ['class', 'style']; +const LISTENER_PREFIX = /^on[A-Z]/; + +export function entries(obj: Recordable): [string, T][] { + return Object.keys(obj).map((key: string) => [key, obj[key]]); +} + +export function useAttrs(params: Params = {}): Ref | {} { + const instance = getCurrentInstance(); + if (!instance) return {}; + + const { excludeListeners = false, excludeKeys = [], excludeDefaultKeys = true } = params; + const attrs = shallowRef({}); + const allExcludeKeys = excludeKeys.concat(excludeDefaultKeys ? DEFAULT_EXCLUDE_KEYS : []); + + // Since attrs are not reactive, make it reactive instead of doing in `onUpdated` hook for better performance + instance.attrs = reactive(instance.attrs); + + watchEffect(() => { + const res = entries(instance.attrs).reduce((acm, [key, val]) => { + if (!allExcludeKeys.includes(key) && !(excludeListeners && LISTENER_PREFIX.test(key))) { + acm[key] = val; + } + + return acm; + }, {} as Recordable); + + attrs.value = res; + }); + + return attrs; +} diff --git a/src/hooks/core/useContext.ts b/src/hooks/core/useContext.ts new file mode 100644 index 0000000..c686187 --- /dev/null +++ b/src/hooks/core/useContext.ts @@ -0,0 +1,44 @@ +import { + InjectionKey, + provide, + inject, + reactive, + readonly as defineReadonly, + // defineComponent, + UnwrapRef, +} from 'vue'; + +export interface CreateContextOptions { + readonly?: boolean; + createProvider?: boolean; + native?: boolean; +} + +type ShallowUnwrap = { + [P in keyof T]: UnwrapRef; +}; + +export function createContext( + context: any, + key: InjectionKey = Symbol(), + options: CreateContextOptions = {}, +) { + const { readonly = true, createProvider = false, native = false } = options; + + const state = reactive(context); + const provideData = readonly ? defineReadonly(state) : state; + !createProvider && provide(key, native ? context : provideData); + + return { + state, + }; +} + +export function useContext(key: InjectionKey, native?: boolean): T; + +export function useContext( + key: InjectionKey = Symbol(), + defaultValue?: any, +): ShallowUnwrap { + return inject(key, defaultValue || {}); +} diff --git a/src/hooks/core/useLockFn.ts b/src/hooks/core/useLockFn.ts new file mode 100644 index 0000000..0a8b3a7 --- /dev/null +++ b/src/hooks/core/useLockFn.ts @@ -0,0 +1,17 @@ +import { ref, unref } from 'vue'; + +export function useLockFn

(fn: (...args: P) => Promise) { + const lockRef = ref(false); + return async function (...args: P) { + if (unref(lockRef)) return; + lockRef.value = true; + try { + const ret = await fn(...args); + lockRef.value = false; + return ret; + } catch (e) { + lockRef.value = false; + throw e; + } + }; +} diff --git a/src/hooks/core/useRefs.ts b/src/hooks/core/useRefs.ts new file mode 100644 index 0000000..180bb14 --- /dev/null +++ b/src/hooks/core/useRefs.ts @@ -0,0 +1,16 @@ +import type { Ref } from 'vue'; +import { ref, onBeforeUpdate } from 'vue'; + +export function useRefs(): [Ref, (index: number) => (el: HTMLElement) => void] { + const refs = ref([]) as Ref; + + onBeforeUpdate(() => { + refs.value = []; + }); + + const setRefs = (index: number) => (el: HTMLElement) => { + refs.value[index] = el; + }; + + return [refs, setRefs]; +} diff --git a/src/hooks/core/useTimeout.ts b/src/hooks/core/useTimeout.ts new file mode 100644 index 0000000..47f1dc4 --- /dev/null +++ b/src/hooks/core/useTimeout.ts @@ -0,0 +1,45 @@ +import { ref, watch } from 'vue'; +import { tryOnUnmounted } from '@vueuse/core'; +import { isFunction } from '@/utils/is'; + +export function useTimeoutFn(handle: Fn, wait: number, native = false) { + if (!isFunction(handle)) { + throw new Error('handle is not Function!'); + } + + const { readyRef, stop, start } = useTimeoutRef(wait); + if (native) { + handle(); + } else { + watch( + readyRef, + maturity => { + maturity && handle(); + }, + { immediate: false }, + ); + } + return { readyRef, stop, start }; +} + +export function useTimeoutRef(wait: number) { + const readyRef = ref(false); + + let timer: TimeoutHandle; + function stop(): void { + readyRef.value = false; + timer && window.clearTimeout(timer); + } + function start(): void { + stop(); + timer = setTimeout(() => { + readyRef.value = true; + }, wait); + } + + start(); + + tryOnUnmounted(stop); + + return { readyRef, stop, start }; +} diff --git a/src/hooks/event/useBreakpoint.ts b/src/hooks/event/useBreakpoint.ts new file mode 100644 index 0000000..b51b03e --- /dev/null +++ b/src/hooks/event/useBreakpoint.ts @@ -0,0 +1,93 @@ +import { ref, computed, ComputedRef, unref } from 'vue'; +import { useEventListener } from '@/hooks/event/useEventListener'; +import { screenMap, sizeEnum, screenEnum } from '@/enums/breakpointEnum'; + +// 可以用这个替换,优化项 +// import { Grid } from 'ant-design-vue'; +// const { useBreakpoint } = Grid; + +let globalScreenRef: ComputedRef; +let globalWidthRef: ComputedRef; +let globalRealWidthRef: ComputedRef; + +export interface CreateCallbackParams { + screen: ComputedRef; + width: ComputedRef; + realWidth: ComputedRef; + screenEnum: typeof screenEnum; + screenMap: Map; + sizeEnum: typeof sizeEnum; +} + +export function useBreakpoint() { + return { + screenRef: computed(() => unref(globalScreenRef)), + widthRef: globalWidthRef, + screenEnum, + realWidthRef: globalRealWidthRef, + }; +} + +// Just call it once +export function createBreakpointListen(fn?: (opt: CreateCallbackParams) => void) { + const screenRef = ref(sizeEnum.XL); + const realWidthRef = ref(window.innerWidth); + + function getWindowWidth() { + const width = document.body.clientWidth; + const xs = screenMap.get(sizeEnum.XS)!; + const sm = screenMap.get(sizeEnum.SM)!; + const md = screenMap.get(sizeEnum.MD)!; + const lg = screenMap.get(sizeEnum.LG)!; + const xl = screenMap.get(sizeEnum.XL)!; + if (width < xs) { + screenRef.value = sizeEnum.XS; + } else if (width < sm) { + screenRef.value = sizeEnum.SM; + } else if (width < md) { + screenRef.value = sizeEnum.MD; + } else if (width < lg) { + screenRef.value = sizeEnum.LG; + } else if (width < xl) { + screenRef.value = sizeEnum.XL; + } else { + screenRef.value = sizeEnum.XXL; + } + realWidthRef.value = width; + } + + useEventListener({ + el: window, + name: 'resize', + + listener: () => { + getWindowWidth(); + resizeFn(); + }, + // wait: 100, + }); + + getWindowWidth(); + globalScreenRef = computed(() => unref(screenRef)); + globalWidthRef = computed((): number => screenMap.get(unref(screenRef)!)!); + globalRealWidthRef = computed((): number => unref(realWidthRef)); + + function resizeFn() { + fn?.({ + screen: globalScreenRef, + width: globalWidthRef, + realWidth: globalRealWidthRef, + screenEnum, + screenMap, + sizeEnum, + }); + } + + resizeFn(); + return { + screenRef: globalScreenRef, + screenEnum, + widthRef: globalWidthRef, + realWidthRef: globalRealWidthRef, + }; +} diff --git a/src/hooks/event/useEventListener.ts b/src/hooks/event/useEventListener.ts new file mode 100644 index 0000000..892cd92 --- /dev/null +++ b/src/hooks/event/useEventListener.ts @@ -0,0 +1,58 @@ +import type { Ref } from 'vue'; +import { ref, watch, unref } from 'vue'; +import { useThrottleFn, useDebounceFn } from '@vueuse/core'; + +export type RemoveEventFn = () => void; +export interface UseEventParams { + el?: Element | Ref | Window | any; + name: string; + listener: EventListener; + options?: boolean | AddEventListenerOptions; + autoRemove?: boolean; + isDebounce?: boolean; + wait?: number; +} +export function useEventListener({ + el = window, + name, + listener, + options, + autoRemove = true, + isDebounce = true, + wait = 80, +}: UseEventParams): { removeEvent: RemoveEventFn } { + /* eslint-disable-next-line */ + let remove: RemoveEventFn = () => {}; + const isAddRef = ref(false); + + if (el) { + const element = ref(el as Element) as Ref; + + const handler = isDebounce ? useDebounceFn(listener, wait) : useThrottleFn(listener, wait); + const realHandler = wait ? handler : listener; + const removeEventListener = (e: Element) => { + isAddRef.value = true; + e.removeEventListener(name, realHandler, options); + }; + const addEventListener = (e: Element) => e.addEventListener(name, realHandler, options); + + const removeWatch = watch( + element, + (v, _ov, cleanUp) => { + if (v) { + !unref(isAddRef) && addEventListener(v); + cleanUp(() => { + autoRemove && removeEventListener(v); + }); + } + }, + { immediate: true }, + ); + + remove = () => { + removeEventListener(element.value); + removeWatch(); + }; + } + return { removeEvent: remove }; +} diff --git a/src/hooks/event/useIntersectionObserver.ts b/src/hooks/event/useIntersectionObserver.ts new file mode 100644 index 0000000..b9badca --- /dev/null +++ b/src/hooks/event/useIntersectionObserver.ts @@ -0,0 +1,48 @@ +import { Ref, watchEffect, ref } from 'vue'; + +interface IntersectionObserverProps { + target: Ref; + root?: Ref; + onIntersect: IntersectionObserverCallback; + rootMargin?: string; + threshold?: number; +} + +export function useIntersectionObserver({ + target, + root, + onIntersect, + rootMargin = '0px', + threshold = 0.1, +}: IntersectionObserverProps) { + let cleanup = () => {}; + const observer: Ref> = ref(null); + const stopEffect = watchEffect(() => { + cleanup(); + + observer.value = new IntersectionObserver(onIntersect, { + root: root ? root.value : null, + rootMargin, + threshold, + }); + + const current = target.value; + + current && observer.value.observe(current); + + cleanup = () => { + if (observer.value) { + observer.value.disconnect(); + target.value && observer.value.unobserve(target.value); + } + }; + }); + + return { + observer, + stop: () => { + cleanup(); + stopEffect(); + }, + }; +} diff --git a/src/hooks/event/useScroll.ts b/src/hooks/event/useScroll.ts new file mode 100644 index 0000000..0827120 --- /dev/null +++ b/src/hooks/event/useScroll.ts @@ -0,0 +1,65 @@ +import type { Ref } from 'vue'; + +import { ref, onMounted, watch, onUnmounted } from 'vue'; +import { isWindow, isObject } from '@/utils/is'; +import { useThrottleFn } from '@vueuse/core'; + +export function useScroll( + refEl: Ref, + options?: { + wait?: number; + leading?: boolean; + trailing?: boolean; + }, +) { + const refX = ref(0); + const refY = ref(0); + let handler = () => { + if (isWindow(refEl.value)) { + refX.value = refEl.value.scrollX; + refY.value = refEl.value.scrollY; + } else if (refEl.value) { + refX.value = (refEl.value as Element).scrollLeft; + refY.value = (refEl.value as Element).scrollTop; + } + }; + + if (isObject(options)) { + let wait = 0; + if (options.wait && options.wait > 0) { + wait = options.wait; + Reflect.deleteProperty(options, 'wait'); + } + + handler = useThrottleFn(handler, wait); + } + + let stopWatch: () => void; + onMounted(() => { + stopWatch = watch( + refEl, + (el, prevEl, onCleanup) => { + if (el) { + el.addEventListener('scroll', handler); + } else if (prevEl) { + prevEl.removeEventListener('scroll', handler); + } + onCleanup(() => { + refX.value = refY.value = 0; + el && el.removeEventListener('scroll', handler); + }); + }, + { immediate: true }, + ); + }); + + onUnmounted(() => { + refEl.value && refEl.value.removeEventListener('scroll', handler); + }); + + function stop() { + stopWatch && stopWatch(); + } + + return { refX, refY, stop }; +} diff --git a/src/hooks/event/useScrollTo.ts b/src/hooks/event/useScrollTo.ts new file mode 100644 index 0000000..f3442a5 --- /dev/null +++ b/src/hooks/event/useScrollTo.ts @@ -0,0 +1,59 @@ +import { isFunction, isUnDef } from '@/utils/is'; +import { ref, unref } from 'vue'; + +export interface ScrollToParams { + el: any; + to: number; + duration?: number; + callback?: () => any; +} + +const easeInOutQuad = (t: number, b: number, c: number, d: number) => { + t /= d / 2; + if (t < 1) { + return (c / 2) * t * t + b; + } + t--; + return (-c / 2) * (t * (t - 2) - 1) + b; +}; +const move = (el: HTMLElement, amount: number) => { + el.scrollTop = amount; +}; + +const position = (el: HTMLElement) => { + return el.scrollTop; +}; +export function useScrollTo({ el, to, duration = 500, callback }: ScrollToParams) { + const isActiveRef = ref(false); + const start = position(el); + const change = to - start; + const increment = 20; + let currentTime = 0; + duration = isUnDef(duration) ? 500 : duration; + + const animateScroll = function () { + if (!unref(isActiveRef)) { + return; + } + currentTime += increment; + const val = easeInOutQuad(currentTime, start, change, duration); + move(el, val); + if (currentTime < duration && unref(isActiveRef)) { + requestAnimationFrame(animateScroll); + } else { + if (callback && isFunction(callback)) { + callback(); + } + } + }; + const run = () => { + isActiveRef.value = true; + animateScroll(); + }; + + const stop = () => { + isActiveRef.value = false; + }; + + return { start: run, stop }; +} diff --git a/src/hooks/event/useWindowSizeFn.ts b/src/hooks/event/useWindowSizeFn.ts new file mode 100644 index 0000000..01cdc75 --- /dev/null +++ b/src/hooks/event/useWindowSizeFn.ts @@ -0,0 +1,35 @@ +import { tryOnMounted, tryOnUnmounted, useDebounceFn } from '@vueuse/core'; + +interface WindowSizeOptions { + once?: boolean; + immediate?: boolean; + listenerOptions?: AddEventListenerOptions | boolean; +} + +export function useWindowSizeFn(fn: Fn, wait = 150, options?: WindowSizeOptions) { + let handler = () => { + fn(); + }; + const handleSize = useDebounceFn(handler, wait); + handler = handleSize; + + const start = () => { + if (options && options.immediate) { + handler(); + } + window.addEventListener('resize', handler); + }; + + const stop = () => { + window.removeEventListener('resize', handler); + }; + + tryOnMounted(() => { + start(); + }); + + tryOnUnmounted(() => { + stop(); + }); + return [start, stop]; +} diff --git a/src/hooks/setting/index.ts b/src/hooks/setting/index.ts new file mode 100644 index 0000000..2f69f30 --- /dev/null +++ b/src/hooks/setting/index.ts @@ -0,0 +1,39 @@ +import type { GlobConfig } from '#/config'; + +import { warn } from '@/utils/log'; +import { getAppEnvConfig, isDevMode } from '@/utils/env'; + +export const useGlobSetting = (): Readonly => { + const { VITE_GLOB_APP_TITLE, VITE_GLOB_API_URL, VITE_GLOB_REPORT_API_URL, VITE_GLOB_APP_SHORT_NAME, VITE_GLOB_API_URL_PREFIX, VITE_GLOB_WEBSOCKET_URL } = + getAppEnvConfig(); + + if (!/[a-zA-Z\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) { + warn(`VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`); + } + + const prodUrlPrefix = VITE_GLOB_API_URL && /https?:\/\//.test(VITE_GLOB_API_URL) ? VITE_GLOB_API_URL : window.location.origin + VITE_GLOB_API_URL; + + // Take global configuration + const glob: Readonly = { + title: VITE_GLOB_APP_TITLE, + apiUrl: VITE_GLOB_API_URL, + reportApiUrl: VITE_GLOB_REPORT_API_URL, + shortName: VITE_GLOB_APP_SHORT_NAME, + urlPrefix: VITE_GLOB_API_URL_PREFIX, + uploadUrl: VITE_GLOB_API_URL + '/api/file/Uploader', + webSocketUrl: VITE_GLOB_WEBSOCKET_URL, + cipherKey: 'EY8WePvjM5GGwQzn', // 加密key + aMapJsKey: '26a65601349a5ec88318721884ef81b5', + aMapWebKey: '09485f01587712b3c04e5a9abf324237', + aMapSecurityJsCode: '243e837c2ba077b4143b9a9dd2893992', + // 本地文件预览 + filePreviewServer: isDevMode() ? 'http://localhost:30090/FileServer' : VITE_GLOB_API_URL + '/FileServer', + // 大屏应用前端路径 + dataVUrl: isDevMode() ? 'http://localhost:8100/DataV/' : prodUrlPrefix + '/DataV/', + // 数据报表接口(旧) + reportServer: isDevMode() ? 'http://localhost:30007' : VITE_GLOB_API_URL + '/ReportServer', + // 报表前端路径(旧) + report: isDevMode() ? 'http://localhost:8200' : VITE_GLOB_API_URL + '/Report', + }; + return glob as Readonly; +}; diff --git a/src/hooks/setting/useDefineSetting.ts b/src/hooks/setting/useDefineSetting.ts new file mode 100644 index 0000000..f86b0aa --- /dev/null +++ b/src/hooks/setting/useDefineSetting.ts @@ -0,0 +1,148 @@ +export const useDefineSetting = () => { + const flowStatusList = [ + { id: 0, fullName: '待提交' }, + { id: 1, fullName: '进行中' }, + { id: 2, fullName: '已通过' }, + { id: 3, fullName: '已拒绝' }, + { id: 4, fullName: '已终止' }, + { id: 5, fullName: '已暂停' }, + { id: 6, fullName: '撤销中' }, + { id: 7, fullName: '已撤销' }, + { id: 8, fullName: '已退回' }, + { id: 9, fullName: '已撤回' }, + ]; + const flowUrgentList = [ + { id: 1, fullName: '普通' }, + { id: 2, fullName: '重要' }, + { id: 3, fullName: '紧急' }, + ]; + + function getUrgentText(value) { + if (value == 2) return '重要'; + if (value == 3) return '紧急'; + return '普通'; + } + function getUrgentTextColor(value) { + if (value == 2) return '#E6A23D'; + if (value == 3) return '#FF1818'; + return '#1890FF'; + } + function getFlowStatusContent(value) { + return flowStatusList[value || 0]?.fullName || ''; + } + function getFlowStatusColor(value) { + if (value == 1) return '#0177FF'; + if (value == 2) return 'rgba(35,162,5,0.39)'; + if (value == 3) return 'rgba(242,68,68,0.39)'; + if (value == 4) return 'rgba(241,61,61,0.85)'; + if (value == 5) return 'rgba(185,123,6,0.39)'; + if (value == 6) return 'rgba(215,149,77,0.39)'; + if (value == 7) return 'rgba(245,127,0,0.39)'; + if (value == 8) return 'rgba(21,21,157,0.39)'; + if (value == 9) return 'rgba(186,33,33,0.39)'; + return '#F09437'; + } + function getHandlingStatusContent(value) { + if (value == 1) return '流转'; + if (value == 2) return '加签'; + if (value == 3) return '转审'; + if (value == 4) return '指派'; + if (value == 5) return '退回'; + if (value == 6) return '撤回'; + if (value == 7) return '协办'; + if (value == 8) return '撤销'; + if (value == 9) return '转办'; + return '待签收'; + } + function getHandlingStatusColor(value) { + if (value == 1) return '#3DC60A'; + if (value == 2) return 'rgba(25,185,185,0.39)'; + if (value == 3) return 'rgba(49,151,214,0.39)'; + if (value == 4) return 'rgba(255,0,0,0.39)'; + if (value == 5) return 'rgba(21,21,157,0.39)'; + if (value == 6) return 'rgba(186,33,33,0.39)'; + if (value == 7) return 'rgba(172,214,58,0.39)'; + if (value == 8) return 'rgba(245,127,0,0.39)'; + return '#2B6EF2'; + } + function getFlowStateContent(value) { + const stateList = [ + '拒绝', + '同意', + '发起', + '退回', + '撤回', + '加签', + '减签', + '转审', + '暂停', + '恢复', + '复活', + '指派', + '催办', + '协办', + '撤销申请', + '终止', + '同意撤销', + '拒绝撤销', + '转办', + ]; + if (value == -1) return '待审批'; + if (value == -2) return '未审批'; + if (value == -3) return '待办理'; + if (value == -4) return '未办理'; + return stateList[value] || ''; + } + function getFlowStateColor(value) { + const colorList = [ + 'rgba(242,68,68,0.39)', + 'rgba(35,162,5,0.39)', + 'rgba(0,0,255,0.39)', + 'rgba(21,21,157,0.39)', + 'rgba(186,33,33,0.39)', + 'rgba(25,185,185,0.39)', + 'rgba(50,191,61,0.39)', + 'rgba(49,151,214,0.39)', + 'rgba(185,123,6,0.39)', + 'rgba(45,94,186,0.39)', + 'rgba(50,191,61,0.39)', + 'rgba(255,0,0,0.39)', + 'rgba(0,128,0,0.39)', + 'rgba(172,214,58,0.39)', + 'rgba(245,127,0,0.39)', + 'rgba(241,61,61,0.85)', + 'rgba(35,162,5,0.39)', + 'rgba(242,68,68,0.39)', + 'rgba(49,151,214,0.39)', + ]; + let set = new Set([-1, -2, -3, -4]); + if (set.has(value)) return 'rgba(165,168,172,1)'; + return colorList[value] || ''; + } + function getHexColor(color) { + let values = color + .replace(/rgba?\(/, '') + .replace(/\)/, '') + .replace(/[\s+]/g, '') + .split(','); + let a = parseFloat(values[3] || 1), + r = Math.floor(a * parseInt(values[0]) + (1 - a) * 255), + g = Math.floor(a * parseInt(values[1]) + (1 - a) * 255), + b = Math.floor(a * parseInt(values[2]) + (1 - a) * 255); + return '#' + ('0' + r.toString(16)).slice(-2) + ('0' + g.toString(16)).slice(-2) + ('0' + b.toString(16)).slice(-2); + } + + return { + flowStatusList, + flowUrgentList, + getUrgentText, + getUrgentTextColor, + getFlowStatusContent, + getFlowStatusColor, + getHandlingStatusContent, + getHandlingStatusColor, + getFlowStateContent, + getFlowStateColor, + getHexColor, + }; +}; diff --git a/src/hooks/setting/useHeaderSetting.ts b/src/hooks/setting/useHeaderSetting.ts new file mode 100644 index 0000000..966c017 --- /dev/null +++ b/src/hooks/setting/useHeaderSetting.ts @@ -0,0 +1,88 @@ +import type { HeaderSetting } from '#/config'; + +import { computed, unref } from 'vue'; + +import { useAppStore } from '@/store/modules/app'; + +import { useMenuSetting } from '@/hooks/setting/useMenuSetting'; +import { useRootSetting } from '@/hooks/setting/useRootSetting'; +import { useFullContent } from '@/hooks/web/useFullContent'; +import { MenuModeEnum } from '@/enums/menuEnum'; + +export function useHeaderSetting() { + const { getFullContent } = useFullContent(); + const appStore = useAppStore(); + + const getShowFullHeaderRef = computed(() => { + return true; + // return !unref(getFullContent) && unref(getShowMixHeaderRef) && unref(getShowHeader) && !unref(getIsTopMenu) && !unref(getIsMixSidebar); + }); + + const getUnFixedAndFull = computed(() => !unref(getFixed) && !unref(getShowFullHeaderRef)); + + const getShowInsetHeaderRef = computed(() => { + return false; + // const need = !unref(getFullContent) && unref(getShowHeader); + // return (need && !unref(getShowMixHeaderRef)) || (need && unref(getIsTopMenu)) || (need && unref(getIsMixSidebar)); + }); + + const { getMenuMode, getSplit, getShowHeaderTrigger, getIsSidebarType, getIsMixSidebar, getIsTopMenu } = useMenuSetting(); + const { getShowBreadCrumb, getShowLogo } = useRootSetting(); + + const getShowMixHeaderRef = computed(() => !unref(getIsSidebarType) && unref(getShowHeader)); + + const getShowDoc = computed(() => appStore.getHeaderSetting.showDoc); + + const getHeaderTheme = computed(() => appStore.getHeaderSetting.theme); + + const getShowHeader = computed(() => appStore.getHeaderSetting.show); + + const getFixed = computed(() => appStore.getHeaderSetting.fixed); + + const getHeaderBgColor = computed(() => appStore.getHeaderSetting.bgColor); + + const getShowSearch = computed(() => appStore.getHeaderSetting.showSearch); + + const getUseLockPage = computed(() => appStore.getHeaderSetting.useLockPage); + + const getShowFullScreen = computed(() => appStore.getHeaderSetting.showFullScreen); + + const getShowNotice = computed(() => appStore.getHeaderSetting.showNotice); + + const getShowBread = computed(() => { + return unref(getMenuMode) !== MenuModeEnum.HORIZONTAL && unref(getShowBreadCrumb) && !unref(getSplit); + }); + + const getShowHeaderLogo = computed(() => { + return unref(getShowLogo) && !unref(getIsSidebarType) && !unref(getIsMixSidebar); + }); + + const getShowContent = computed(() => { + return unref(getShowBread) || unref(getShowHeaderTrigger); + }); + + // Set header configuration + function setHeaderSetting(headerSetting: Partial) { + appStore.setProjectConfig({ headerSetting }); + } + return { + setHeaderSetting, + + getShowDoc, + getShowSearch, + getHeaderTheme, + getUseLockPage, + getShowFullScreen, + getShowNotice, + getShowBread, + getShowContent, + getShowHeaderLogo, + getShowHeader, + getFixed, + getShowMixHeaderRef, + getShowFullHeaderRef, + getShowInsetHeaderRef, + getUnFixedAndFull, + getHeaderBgColor, + }; +} diff --git a/src/hooks/setting/useMenuSetting.ts b/src/hooks/setting/useMenuSetting.ts new file mode 100644 index 0000000..edb82ad --- /dev/null +++ b/src/hooks/setting/useMenuSetting.ts @@ -0,0 +1,155 @@ +import type { MenuSetting } from '#/config'; + +import { computed, unref, ref } from 'vue'; + +import { useAppStore } from '@/store/modules/app'; + +import { SIDE_BAR_MINI_WIDTH, SIDE_BAR_SHOW_TIT_MINI_WIDTH } from '@/enums/appEnum'; +import { MenuModeEnum, MenuTypeEnum, TriggerEnum } from '@/enums/menuEnum'; +import { useFullContent } from '@/hooks/web/useFullContent'; + +const mixSideHasChildren = ref(false); + +export function useMenuSetting() { + const { getFullContent: fullContent } = useFullContent(); + const appStore = useAppStore(); + + const getShowSidebar = computed(() => { + return unref(getSplit) || (unref(getShowMenu) && unref(getMenuMode) !== MenuModeEnum.HORIZONTAL && !unref(fullContent)); + }); + + const getCollapsed = computed(() => appStore.getMenuSetting.collapsed); + + const getMenuType = computed(() => appStore.getMenuSetting.type); + + const getMenuMode = computed(() => appStore.getMenuSetting.mode); + + const getMenuFixed = computed(() => appStore.getMenuSetting.fixed); + + const getShowMenu = computed(() => appStore.getMenuSetting.show); + + const getMenuHidden = computed(() => appStore.getMenuSetting.hidden); + + const getMenuWidth = computed(() => appStore.getMenuSetting.menuWidth); + + const getTrigger = computed(() => appStore.getMenuSetting.trigger); + + const getMenuTheme = computed(() => appStore.getMenuSetting.theme); + + const getSplit = computed(() => appStore.getMenuSetting.split); + + const getMenuBgColor = computed(() => appStore.getMenuSetting.bgColor); + + const getMixSideTrigger = computed(() => appStore.getMenuSetting.mixSideTrigger); + + const getCanDrag = computed(() => appStore.getMenuSetting.canDrag); + + const getAccordion = computed(() => appStore.getMenuSetting.accordion); + + const getMixSideFixed = computed(() => appStore.getMenuSetting.mixSideFixed); + + const getTopMenuAlign = computed(() => appStore.getMenuSetting.topMenuAlign); + + const getCloseMixSidebarOnChange = computed(() => appStore.getMenuSetting.closeMixSidebarOnChange); + + const getIsSidebarType = computed(() => unref(getMenuType) === MenuTypeEnum.SIDEBAR); + + const getIsTopMenu = computed(() => unref(getMenuType) === MenuTypeEnum.TOP_MENU); + + const getCollapsedShowTitle = computed(() => appStore.getMenuSetting.collapsedShowTitle); + + const getShowTopMenu = computed(() => { + return unref(getMenuMode) === MenuModeEnum.HORIZONTAL || unref(getSplit); + }); + + const getShowHeaderTrigger = computed(() => { + if (unref(getMenuType) === MenuTypeEnum.TOP_MENU || !unref(getShowMenu) || unref(getMenuHidden)) { + return false; + } + + return unref(getTrigger) === TriggerEnum.HEADER; + }); + + const getIsHorizontal = computed(() => { + return unref(getMenuMode) === MenuModeEnum.HORIZONTAL; + }); + + const getIsMixSidebar = computed(() => { + return unref(getMenuType) === MenuTypeEnum.MIX_SIDEBAR; + }); + + const getIsMixMode = computed(() => { + return unref(getMenuMode) === MenuModeEnum.INLINE && unref(getMenuType) === MenuTypeEnum.MIX; + }); + + const getRealWidth = computed(() => { + if (unref(getIsMixSidebar)) { + return unref(getCollapsed) && !unref(getMixSideFixed) ? unref(getMiniWidthNumber) : unref(getMenuWidth); + } + return unref(getCollapsed) ? unref(getMiniWidthNumber) : unref(getMenuWidth); + }); + + const getMiniWidthNumber = computed(() => { + const { collapsedShowTitle, siderHidden } = appStore.getMenuSetting; + return siderHidden ? 0 : collapsedShowTitle ? SIDE_BAR_SHOW_TIT_MINI_WIDTH : SIDE_BAR_MINI_WIDTH; + }); + + const getCalcContentWidth = computed(() => { + const width = + unref(getIsTopMenu) || !unref(getShowMenu) || (unref(getSplit) && unref(getMenuHidden)) + ? 0 + : unref(getIsMixSidebar) + ? (unref(getCollapsed) ? SIDE_BAR_MINI_WIDTH : SIDE_BAR_SHOW_TIT_MINI_WIDTH) + + (unref(getMixSideFixed) && unref(mixSideHasChildren) ? unref(getRealWidth) : 0) + : unref(getRealWidth); + + return `calc(100% - ${unref(width)}px - ${unref(getIsTopMenu) ? '0px' : '10px'})`; + }); + + // Set menu configuration + function setMenuSetting(menuSetting: Partial): void { + appStore.setProjectConfig({ menuSetting }); + } + + function toggleCollapsed() { + setMenuSetting({ + collapsed: !unref(getCollapsed), + }); + } + return { + setMenuSetting, + + toggleCollapsed, + + getMenuFixed, + getRealWidth, + getMenuType, + getMenuMode, + getShowMenu, + getCollapsed, + getMiniWidthNumber, + getCalcContentWidth, + getMenuWidth, + getTrigger, + getSplit, + getMenuTheme, + getCanDrag, + getCollapsedShowTitle, + getIsHorizontal, + getIsSidebarType, + getAccordion, + getShowTopMenu, + getShowHeaderTrigger, + getTopMenuAlign, + getMenuHidden, + getIsTopMenu, + getMenuBgColor, + getShowSidebar, + getIsMixMode, + getIsMixSidebar, + getCloseMixSidebarOnChange, + getMixSideTrigger, + getMixSideFixed, + mixSideHasChildren, + }; +} diff --git a/src/hooks/setting/useMultipleTabSetting.ts b/src/hooks/setting/useMultipleTabSetting.ts new file mode 100644 index 0000000..d30aad7 --- /dev/null +++ b/src/hooks/setting/useMultipleTabSetting.ts @@ -0,0 +1,31 @@ +import type { MultiTabsSetting } from '#/config'; + +import { computed } from 'vue'; + +import { useAppStore } from '@/store/modules/app'; + +export function useMultipleTabSetting() { + const appStore = useAppStore(); + + const getShowMultipleTab = computed(() => appStore.getMultiTabsSetting.show); + + const getShowQuick = computed(() => appStore.getMultiTabsSetting.showQuick); + + const getShowRedo = computed(() => appStore.getMultiTabsSetting.showRedo); + + const getShowFold = computed(() => appStore.getMultiTabsSetting.showFold); + + const getShowIcon = computed(() => appStore.getMultiTabsSetting.showIcon); + + function setMultipleTabSetting(multiTabsSetting: Partial) { + appStore.setProjectConfig({ multiTabsSetting }); + } + return { + setMultipleTabSetting, + getShowMultipleTab, + getShowQuick, + getShowRedo, + getShowFold, + getShowIcon, + }; +} diff --git a/src/hooks/setting/useRootSetting.ts b/src/hooks/setting/useRootSetting.ts new file mode 100644 index 0000000..7baa732 --- /dev/null +++ b/src/hooks/setting/useRootSetting.ts @@ -0,0 +1,88 @@ +import type { ProjectConfig } from '#/config'; + +import { computed } from 'vue'; + +import { useAppStore } from '@/store/modules/app'; +import { ContentEnum, ThemeEnum } from '@/enums/appEnum'; + +type RootSetting = Omit; + +export function useRootSetting() { + const appStore = useAppStore(); + + const getPageLoading = computed(() => appStore.getPageLoading); + + const getOpenKeepAlive = computed(() => appStore.getProjectConfig.openKeepAlive); + + const getSettingButtonPosition = computed(() => appStore.getProjectConfig.settingButtonPosition); + + const getCanEmbedIFramePage = computed(() => appStore.getProjectConfig.canEmbedIFramePage); + + const getShowLogo = computed(() => appStore.getProjectConfig.showLogo); + + const getContentMode = computed(() => appStore.getProjectConfig.contentMode); + + const getUseOpenBackTop = computed(() => appStore.getProjectConfig.useOpenBackTop); + + const getShowSettingButton = computed(() => appStore.getProjectConfig.showSettingButton); + + const getUseErrorHandle = computed(() => appStore.getProjectConfig.useErrorHandle); + + const getShowFooter = computed(() => appStore.getProjectConfig.showFooter); + + const getShowBreadCrumb = computed(() => appStore.getProjectConfig.showBreadCrumb); + + const getThemeColor = computed(() => appStore.getProjectConfig.themeColor); + + const getSysBg = computed(() => appStore.getProjectConfig.sysBg); + + const getShowBreadCrumbIcon = computed(() => appStore.getProjectConfig.showBreadCrumbIcon); + + const getFullContent = computed(() => appStore.getProjectConfig.fullContent); + + const getColorWeak = computed(() => appStore.getProjectConfig.colorWeak); + + const getGrayMode = computed(() => appStore.getProjectConfig.grayMode); + + const getLockTime = computed(() => appStore.getProjectConfig.lockTime); + + const getShowDarkModeToggle = computed(() => appStore.getProjectConfig.showDarkModeToggle); + + const getDarkMode = computed(() => appStore.getDarkMode); + + const getLayoutContentMode = computed(() => (appStore.getProjectConfig.contentMode === ContentEnum.FULL ? ContentEnum.FULL : ContentEnum.FIXED)); + + function setRootSetting(setting: Partial) { + appStore.setProjectConfig(setting); + } + + function setDarkMode(mode: ThemeEnum) { + appStore.setDarkMode(mode); + } + return { + setRootSetting, + + getSettingButtonPosition, + getFullContent, + getColorWeak, + getGrayMode, + getLayoutContentMode, + getPageLoading, + getOpenKeepAlive, + getCanEmbedIFramePage, + getShowLogo, + getUseErrorHandle, + getShowBreadCrumb, + getShowBreadCrumbIcon, + getUseOpenBackTop, + getShowSettingButton, + getShowFooter, + getContentMode, + getLockTime, + getThemeColor, + getSysBg, + getDarkMode, + setDarkMode, + getShowDarkModeToggle, + }; +} diff --git a/src/hooks/setting/useTransitionSetting.ts b/src/hooks/setting/useTransitionSetting.ts new file mode 100644 index 0000000..61b3695 --- /dev/null +++ b/src/hooks/setting/useTransitionSetting.ts @@ -0,0 +1,31 @@ +import type { TransitionSetting } from '#/config'; + +import { computed } from 'vue'; + +import { useAppStore } from '@/store/modules/app'; + +export function useTransitionSetting() { + const appStore = useAppStore(); + + const getEnableTransition = computed(() => appStore.getTransitionSetting?.enable); + + const getOpenNProgress = computed(() => appStore.getTransitionSetting?.openNProgress); + + const getOpenPageLoading = computed((): boolean => { + return !!appStore.getTransitionSetting?.openPageLoading; + }); + + const getBasicTransition = computed(() => appStore.getTransitionSetting?.basicTransition); + + function setTransitionSetting(transitionSetting: Partial) { + appStore.setProjectConfig({ transitionSetting }); + } + return { + setTransitionSetting, + + getEnableTransition, + getOpenNProgress, + getOpenPageLoading, + getBasicTransition, + }; +} diff --git a/src/hooks/web/useAppInject.ts b/src/hooks/web/useAppInject.ts new file mode 100644 index 0000000..cc3cc1f --- /dev/null +++ b/src/hooks/web/useAppInject.ts @@ -0,0 +1,10 @@ +import { useAppProviderContext } from '@/components/Application'; +import { computed, unref } from 'vue'; + +export function useAppInject() { + const values = useAppProviderContext(); + + return { + getIsMobile: computed(() => unref(values.isMobile)), + }; +} diff --git a/src/hooks/web/useContentHeight.ts b/src/hooks/web/useContentHeight.ts new file mode 100644 index 0000000..e65f472 --- /dev/null +++ b/src/hooks/web/useContentHeight.ts @@ -0,0 +1,182 @@ +import { ComputedRef, isRef, nextTick, Ref, ref, unref, watch } from 'vue'; +import { onMountedOrActivated } from '@/hooks/core/onMountedOrActivated'; +import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'; +import { useLayoutHeight } from '@/layouts/default/content/useContentViewHeight'; +import { getViewportOffset } from '@/utils/domUtils'; +import { isNumber, isString } from '@/utils/is'; + +export interface CompensationHeight { + // 使用 layout Footer 高度作为判断补偿高度的条件 + useLayoutFooter: boolean; + // refs HTMLElement + elements?: Ref[]; +} + +type Upward = number | string | null | undefined; + +/** + * 动态计算内容高度,根据锚点dom最下坐标到屏幕最下坐标,根据传入dom的高度、padding、margin等值进行动态计算 + * 最终获取合适的内容高度 + * + * @param flag 用于开启计算的响应式标识 + * @param anchorRef 锚点组件 Ref + * @param subtractHeightRefs 待减去高度的组件列表 Ref + * @param substractSpaceRefs 待减去空闲空间(margins/paddings)的组件列表 Ref + * @param offsetHeightRef 计算偏移的响应式高度,计算高度时将直接减去此值 + * @param upwardSpace 向上递归减去空闲空间的 层级 或 直到指定class为止 数值为2代表向上递归两次|数值为ant-layout表示向上递归直到碰见.ant-layout为止 + * @returns 响应式高度 + */ +export function useContentHeight( + flag: ComputedRef, + anchorRef: Ref, + subtractHeightRefs: Ref[], + substractSpaceRefs: Ref[], + upwardSpace: Ref | ComputedRef | Upward = 0, + offsetHeightRef: Ref = ref(0), +) { + const contentHeight: Ref> = ref(null); + const { footerHeightRef: layoutFooterHeightRef } = useLayoutHeight(); + let compensationHeight: CompensationHeight = { + useLayoutFooter: true, + }; + + const setCompensation = (params: CompensationHeight) => { + compensationHeight = params; + }; + + function redoHeight() { + nextTick(() => { + calcContentHeight(); + }); + } + + function calcSubtractSpace(element: Element | null | undefined, direction: 'all' | 'top' | 'bottom' = 'all'): number { + function numberPx(px: string) { + return Number(px.replace(/[^\d]/g, '')); + } + let subtractHeight = 0; + const YUNZHUPAAS_PX = '0px'; + if (element) { + const cssStyle = getComputedStyle(element); + const marginTop = numberPx(cssStyle?.marginTop ?? YUNZHUPAAS_PX); + const marginBottom = numberPx(cssStyle?.marginBottom ?? YUNZHUPAAS_PX); + const paddingTop = numberPx(cssStyle?.paddingTop ?? YUNZHUPAAS_PX); + const paddingBottom = numberPx(cssStyle?.paddingBottom ?? YUNZHUPAAS_PX); + if (direction === 'all') { + subtractHeight += marginTop; + subtractHeight += marginBottom; + subtractHeight += paddingTop; + subtractHeight += paddingBottom; + } else if (direction === 'top') { + subtractHeight += marginTop; + subtractHeight += paddingTop; + } else { + subtractHeight += marginBottom; + subtractHeight += paddingBottom; + } + } + return subtractHeight; + } + + function getEl(element: any): Nullable { + if (element == null) { + return null; + } + return (element instanceof HTMLDivElement ? element : element.$el) as HTMLDivElement; + } + + async function calcContentHeight() { + if (!flag.value) { + return; + } + // Add a delay to get the correct height + await nextTick(); + + const anchorEl = getEl(unref(anchorRef)); + if (!anchorEl) { + return; + } + const { bottomIncludeBody } = getViewportOffset(anchorEl); + + // substract elements height + let substractHeight = 0; + subtractHeightRefs.forEach(item => { + substractHeight += getEl(unref(item))?.offsetHeight ?? 0; + }); + + // subtract margins / paddings + let substractSpaceHeight = calcSubtractSpace(anchorEl) ?? 0; + substractSpaceRefs.forEach(item => { + substractSpaceHeight += calcSubtractSpace(getEl(unref(item))); + }); + + // upwardSpace + let upwardSpaceHeight = 0; + function upward(element: Element | null, upwardLvlOrClass: number | string | null | undefined) { + if (element && upwardLvlOrClass) { + const parent = element.parentElement; + if (parent) { + if (isString(upwardLvlOrClass)) { + if (!parent.classList.contains(upwardLvlOrClass)) { + upwardSpaceHeight += calcSubtractSpace(parent, 'bottom'); + upward(parent, upwardLvlOrClass); + } else { + upwardSpaceHeight += calcSubtractSpace(parent, 'bottom'); + } + } else if (isNumber(upwardLvlOrClass)) { + if (upwardLvlOrClass > 0) { + upwardSpaceHeight += calcSubtractSpace(parent, 'bottom'); + upward(parent, --upwardLvlOrClass); + } + } + } + } + } + if (isRef(upwardSpace)) { + upward(anchorEl, unref(upwardSpace)); + } else { + upward(anchorEl, upwardSpace); + } + + let height = bottomIncludeBody - unref(layoutFooterHeightRef) - unref(offsetHeightRef) - substractHeight - substractSpaceHeight - upwardSpaceHeight; + + // compensation height + const calcCompensationHeight = () => { + compensationHeight.elements?.forEach(item => { + height += getEl(unref(item))?.offsetHeight ?? 0; + }); + }; + if (compensationHeight.useLayoutFooter && unref(layoutFooterHeightRef) > 0) { + calcCompensationHeight(); + } else { + calcCompensationHeight(); + } + + contentHeight.value = height; + } + + onMountedOrActivated(() => { + nextTick(() => { + calcContentHeight(); + }); + }); + useWindowSizeFn( + () => { + calcContentHeight(); + }, + 50, + { immediate: true }, + ); + watch( + () => [layoutFooterHeightRef.value], + () => { + calcContentHeight(); + }, + { + flush: 'post', + immediate: true, + }, + ); + + return { redoHeight, setCompensation, contentHeight }; +} diff --git a/src/hooks/web/useContextMenu.ts b/src/hooks/web/useContextMenu.ts new file mode 100644 index 0000000..c56cf17 --- /dev/null +++ b/src/hooks/web/useContextMenu.ts @@ -0,0 +1,12 @@ +import { onUnmounted, getCurrentInstance } from 'vue'; +import { createContextMenu, destroyContextMenu } from '@/components/ContextMenu'; +import type { ContextMenuItem } from '@/components/ContextMenu'; +export type { ContextMenuItem }; +export function useContextMenu(authRemove = true) { + if (getCurrentInstance() && authRemove) { + onUnmounted(() => { + destroyContextMenu(); + }); + } + return [createContextMenu, destroyContextMenu]; +} diff --git a/src/hooks/web/useCopyToClipboard.ts b/src/hooks/web/useCopyToClipboard.ts new file mode 100644 index 0000000..0837696 --- /dev/null +++ b/src/hooks/web/useCopyToClipboard.ts @@ -0,0 +1,69 @@ +import { ref, watch } from 'vue'; + +import { isDef } from '@/utils/is'; +interface Options { + target?: HTMLElement; +} +export function useCopyToClipboard(initial?: string) { + const clipboardRef = ref(initial || ''); + const isSuccessRef = ref(false); + const copiedRef = ref(false); + + watch( + clipboardRef, + (str?: string) => { + if (isDef(str)) { + copiedRef.value = true; + isSuccessRef.value = copyTextToClipboard(str); + } + }, + { immediate: !!initial, flush: 'sync' }, + ); + + return { clipboardRef, isSuccessRef, copiedRef }; +} + +export function copyTextToClipboard(input: string, { target = document.body }: Options = {}) { + const element = document.createElement('textarea'); + const previouslyFocusedElement = document.activeElement; + + element.value = input; + + element.setAttribute('readonly', ''); + + (element.style as any).contain = 'strict'; + element.style.position = 'absolute'; + element.style.left = '-9999px'; + element.style.fontSize = '12pt'; + + const selection = document.getSelection(); + let originalRange; + if (selection && selection.rangeCount > 0) { + originalRange = selection.getRangeAt(0); + } + + target.append(element); + element.select(); + + element.selectionStart = 0; + element.selectionEnd = input.length; + + let isSuccess = false; + try { + isSuccess = document.execCommand('copy'); + } catch (e: any) { + throw new Error(e); + } + + element.remove(); + + if (originalRange && selection) { + selection.removeAllRanges(); + selection.addRange(originalRange); + } + + if (previouslyFocusedElement) { + (previouslyFocusedElement as HTMLElement).focus(); + } + return isSuccess; +} diff --git a/src/hooks/web/useDesign.ts b/src/hooks/web/useDesign.ts new file mode 100644 index 0000000..9f1e5b1 --- /dev/null +++ b/src/hooks/web/useDesign.ts @@ -0,0 +1,22 @@ +import { useAppProviderContext } from '@/components/Application'; +// import { computed } from 'vue'; +// import { lowerFirst } from 'lodash-es'; +export function useDesign(scope: string) { + const values = useAppProviderContext(); + // const $style = cssModule ? useCssModule() : {}; + + // const style: Record = {}; + // if (cssModule) { + // Object.keys($style).forEach((key) => { + // // const moduleCls = $style[key]; + // const k = key.replace(new RegExp(`^${values.prefixCls}-?`, 'ig'), ''); + // style[lowerFirst(k)] = $style[key]; + // }); + // } + return { + // prefixCls: computed(() => `${values.prefixCls}-${scope}`), + prefixCls: `${values.prefixCls}-${scope}`, + prefixVar: values.prefixCls, + // style, + }; +} diff --git a/src/hooks/web/useECharts.ts b/src/hooks/web/useECharts.ts new file mode 100644 index 0000000..4f4a158 --- /dev/null +++ b/src/hooks/web/useECharts.ts @@ -0,0 +1,130 @@ +import type { EChartsOption } from 'echarts'; +import type { Ref } from 'vue'; +import { useTimeoutFn } from '@/hooks/core/useTimeout'; +import { tryOnUnmounted } from '@vueuse/core'; +import { unref, nextTick, watch, computed, ref } from 'vue'; +import { useDebounceFn } from '@vueuse/core'; +import { useEventListener } from '@/hooks/event/useEventListener'; +import { useBreakpoint } from '@/hooks/event/useBreakpoint'; +import * as echarts from 'echarts'; +import { useRootSetting } from '@/hooks/setting/useRootSetting'; +import { useMenuSetting } from '@/hooks/setting/useMenuSetting'; + +export function useECharts(elRef: Ref, theme: 'light' | 'dark' | 'default' = 'default', handleClick?) { + const { getDarkMode: getSysDarkMode } = useRootSetting(); + const { getCollapsed } = useMenuSetting(); + + const getDarkMode = computed(() => { + return theme === 'default' ? getSysDarkMode.value : theme; + }); + let chartInstance: echarts.ECharts | null = null; + let resizeFn: Fn = resize; + const cacheOptions = ref({}) as Ref; + let removeResizeFn: Fn = () => {}; + + resizeFn = useDebounceFn(resize, 200); + + const getOptions = computed(() => { + if (getDarkMode.value !== 'dark') { + return cacheOptions.value as EChartsOption; + } + return { + backgroundColor: 'transparent', + ...cacheOptions.value, + } as EChartsOption; + }); + + function initCharts(t = theme) { + const el = unref(elRef); + if (!el || !unref(el)) { + return; + } + + chartInstance = echarts.init(el, t); + const { removeEvent } = useEventListener({ + el: window, + name: 'resize', + listener: resizeFn, + }); + removeResizeFn = removeEvent; + const { widthRef, screenEnum } = useBreakpoint(); + if (unref(widthRef) <= screenEnum.MD || el.offsetHeight === 0) { + useTimeoutFn(() => { + resizeFn(); + }, 30); + } + if (handleClick && typeof handleClick === 'function') chartInstance.on('click', handleClick); + } + + function setOptions(options: EChartsOption, clear = true) { + cacheOptions.value = options; + return new Promise(resolve => { + if (unref(elRef)?.offsetHeight === 0) { + useTimeoutFn(() => { + setOptions(unref(getOptions)); + resolve(null); + }, 30); + } + nextTick(() => { + useTimeoutFn(() => { + if (!chartInstance) { + initCharts(getDarkMode.value as 'default'); + + if (!chartInstance) return; + } + clear && chartInstance?.clear(); + + chartInstance?.setOption(unref(getOptions)); + resolve(null); + }, 30); + }); + }); + } + + function resize() { + chartInstance?.resize({ + animation: { + duration: 300, + easing: 'quadraticIn', + }, + }); + } + + watch( + () => getDarkMode.value, + theme => { + if (chartInstance) { + chartInstance.dispose(); + initCharts(theme as 'default'); + setOptions(cacheOptions.value); + } + }, + ); + + watch(getCollapsed, _ => { + useTimeoutFn(() => { + resizeFn(); + }, 300); + }); + + tryOnUnmounted(() => { + if (!chartInstance) return; + removeResizeFn(); + chartInstance.dispose(); + chartInstance = null; + }); + + function getInstance(): echarts.ECharts | null { + if (!chartInstance) { + initCharts(getDarkMode.value as 'default'); + } + return chartInstance; + } + + return { + setOptions, + resize, + echarts, + getInstance, + }; +} diff --git a/src/hooks/web/useFullContent.ts b/src/hooks/web/useFullContent.ts new file mode 100644 index 0000000..05285e7 --- /dev/null +++ b/src/hooks/web/useFullContent.ts @@ -0,0 +1,28 @@ +import { computed, unref } from 'vue'; + +import { useAppStore } from '@/store/modules/app'; + +import { useRouter } from 'vue-router'; + +/** + * @description: Full screen display content + */ +export const useFullContent = () => { + const appStore = useAppStore(); + const router = useRouter(); + const { currentRoute } = router; + + // Whether to display the content in full screen without displaying the menu + const getFullContent = computed(() => { + // Query parameters, the full screen is displayed when the address bar has a full parameter + const route = unref(currentRoute); + const query = route.query; + if (query && Reflect.has(query, '__full__')) { + return true; + } + // Return to the configuration in the configuration file + return appStore.getProjectConfig.fullContent; + }); + + return { getFullContent }; +}; diff --git a/src/hooks/web/useI18n.ts b/src/hooks/web/useI18n.ts new file mode 100644 index 0000000..5c1bc28 --- /dev/null +++ b/src/hooks/web/useI18n.ts @@ -0,0 +1,55 @@ +import { i18n } from '@/locales/setupI18n'; + +type I18nGlobalTranslation = { + (key: string): string; + (key: string, locale: string): string; + (key: string, locale: string, list: unknown[]): string; + (key: string, locale: string, named: Record): string; + (key: string, list: unknown[]): string; + (key: string, named: Record): string; +}; + +type I18nTranslationRestParameters = [string, any]; + +function getKey(namespace: string | undefined, key: string) { + if (!namespace) { + return key; + } + if (key.startsWith(namespace)) { + return key; + } + return `${namespace}.${key}`; +} + +export function useI18n(namespace?: string): { + t: I18nGlobalTranslation; +} { + const normalFn = { + t: (key: string) => { + return getKey(namespace, key); + }, + }; + + if (!i18n) { + return normalFn; + } + + const { t, ...methods } = i18n.global; + + const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => { + if (!key) return ''; + // if (!key.includes('.') && !namespace) return key; + return t(getKey(namespace, key), ...(arg as I18nTranslationRestParameters)); + }; + return { + ...methods, + t: tFn, + }; +} + +// Why write this function? +// Mainly to configure the vscode i18nn ally plugin. This function is only used for routing and menus. Please use useI18n for other places + +// 为什么要编写此函数? +// 主要用于配合vscode i18nn ally插件。此功能仅用于路由和菜单。请在其他地方使用useI18n +export const t = (key: string) => key; diff --git a/src/hooks/web/useLockPage.ts b/src/hooks/web/useLockPage.ts new file mode 100644 index 0000000..3c1a976 --- /dev/null +++ b/src/hooks/web/useLockPage.ts @@ -0,0 +1,71 @@ +import { computed, onUnmounted, unref, watchEffect } from 'vue'; +import { useThrottleFn } from '@vueuse/core'; + +import { useAppStore } from '@/store/modules/app'; +import { useLockStore } from '@/store/modules/lock'; + +import { useUserStore } from '@/store/modules/user'; +import { useRootSetting } from '../setting/useRootSetting'; + +export function useLockPage() { + const { getLockTime } = useRootSetting(); + const lockStore = useLockStore(); + const userStore = useUserStore(); + const appStore = useAppStore(); + + let timeId: TimeoutHandle; + + function clear(): void { + window.clearTimeout(timeId); + } + + function resetCalcLockTimeout(): void { + // not login + if (!userStore.getToken) { + clear(); + return; + } + const lockTime = appStore.getProjectConfig.lockTime; + if (!lockTime || lockTime < 1) { + clear(); + return; + } + clear(); + + timeId = setTimeout(() => { + lockPage(); + }, lockTime * 60 * 1000); + } + + function lockPage(): void { + lockStore.setLockInfo({ + isLock: true, + }); + } + + watchEffect(onClean => { + if (userStore.getToken) { + resetCalcLockTimeout(); + } else { + clear(); + } + onClean(() => { + clear(); + }); + }); + + onUnmounted(() => { + clear(); + }); + + const keyupFn = useThrottleFn(resetCalcLockTimeout, 2000); + + return computed(() => { + if (unref(getLockTime)) { + return { onKeyup: keyupFn, onMousemove: keyupFn }; + } else { + clear(); + return {}; + } + }); +} diff --git a/src/hooks/web/useMessage.tsx b/src/hooks/web/useMessage.tsx new file mode 100644 index 0000000..666a9f1 --- /dev/null +++ b/src/hooks/web/useMessage.tsx @@ -0,0 +1,128 @@ +import type { ModalFunc, ModalFuncProps } from 'ant-design-vue/lib/modal/Modal'; + +import { Modal, message as Message, notification } from 'ant-design-vue'; +import { InfoCircleFilled, CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons-vue'; + +import { NotificationArgsProps, ConfigProps } from 'ant-design-vue/lib/notification'; +import { useI18n } from './useI18n'; +import { isString } from '@/utils/is'; + +export interface NotifyApi { + info(config: NotificationArgsProps): void; + success(config: NotificationArgsProps): void; + error(config: NotificationArgsProps): void; + warn(config: NotificationArgsProps): void; + warning(config: NotificationArgsProps): void; + open(args: NotificationArgsProps): void; + close(key: String): void; + config(options: ConfigProps): void; + destroy(): void; +} + +export declare type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'; +export declare type IconType = 'success' | 'info' | 'error' | 'warning'; +export interface ModalOptionsEx extends Omit { + iconType: 'warning' | 'success' | 'error' | 'info'; +} +export type ModalOptionsPartial = Partial & Pick; + +interface ConfirmOptions { + info: ModalFunc; + success: ModalFunc; + error: ModalFunc; + warn: ModalFunc; + warning: ModalFunc; +} + +function getIcon(iconType: string) { + if (iconType === 'warning') { + return ; + } else if (iconType === 'success') { + return ; + } else if (iconType === 'info') { + return ; + } else { + return ; + } +} + +function renderContent({ content }: Pick) { + if (isString(content)) { + return

${content as string}
`}>; + } else { + return content; + } +} + +/** + * @description: Create confirmation box + */ +function createConfirm(options: ModalOptionsEx): ConfirmOptions { + const iconType = options.iconType || 'warning'; + Reflect.deleteProperty(options, 'iconType'); + const opt: ModalFuncProps = { + centered: true, + icon: getIcon(iconType), + ...options, + content: renderContent(options), + }; + return Modal.confirm(opt) as unknown as ConfirmOptions; +} + +const getBaseOptions = () => { + const { t } = useI18n(); + return { + okText: t('common.okText'), + centered: true, + }; +}; + +function createModalOptions(options: ModalOptionsPartial, icon: string): ModalOptionsPartial { + return { + ...getBaseOptions(), + ...options, + content: renderContent(options), + icon: getIcon(icon), + }; +} + +function createSuccessModal(options: ModalOptionsPartial) { + return Modal.success(createModalOptions(options, 'success')); +} + +function createErrorModal(options: ModalOptionsPartial) { + return Modal.error(createModalOptions(options, 'error')); +} + +function createInfoModal(options: ModalOptionsPartial) { + return Modal.info(createModalOptions(options, 'info')); +} + +function createWarningModal(options: ModalOptionsPartial) { + return Modal.warning(createModalOptions(options, 'warning')); +} + +Message.config({ + duration: 1.5, + maxCount: 3, +}); + +notification.config({ + placement: 'topRight', + duration: 3, +}); + +/** + * @description: message + */ +export function useMessage() { + return { + createMessage: Message, + notification: notification as NotifyApi, + createConfirm: createConfirm, + createSuccessModal, + createErrorModal, + createInfoModal, + createWarningModal, + }; +} diff --git a/src/hooks/web/usePage.ts b/src/hooks/web/usePage.ts new file mode 100644 index 0000000..d124c81 --- /dev/null +++ b/src/hooks/web/usePage.ts @@ -0,0 +1,54 @@ +import type { RouteLocationRaw, Router } from 'vue-router'; + +import { PageEnum } from '@/enums/pageEnum'; +import { unref } from 'vue'; + +import { useRouter } from 'vue-router'; +import { REDIRECT_NAME } from '@/router/constant'; + +export type PathAsPageEnum = T extends { path: string } ? T & { path: PageEnum } : T; +export type RouteLocationRawEx = PathAsPageEnum; + +function handleError(e: Error) { + console.error(e); +} + +/** + * page switch + */ +export function useGo(_router?: Router) { + const { push, replace } = _router || useRouter(); + function go(opt: RouteLocationRawEx = PageEnum.BASE_HOME, isReplace = false) { + if (!opt) { + return; + } + isReplace ? replace(opt).catch(handleError) : push(opt).catch(handleError); + } + return go; +} + +/** + * @description: redo current page + */ +export const useRedo = (_router?: Router) => { + const { replace, currentRoute } = _router || useRouter(); + const { query, params = {}, name, fullPath } = unref(currentRoute.value); + function redo(): Promise { + return new Promise(resolve => { + if (name === REDIRECT_NAME) { + resolve(false); + return; + } + if (name && Object.keys(params).length > 0) { + params['_origin_params'] = JSON.stringify(params ?? {}); + params['_redirect_type'] = 'name'; + params['path'] = String(name); + } else { + params['_redirect_type'] = 'path'; + params['path'] = fullPath; + } + replace({ name: REDIRECT_NAME, params, query }).then(() => resolve(true)); + }); + } + return redo; +}; diff --git a/src/hooks/web/usePagination.ts b/src/hooks/web/usePagination.ts new file mode 100644 index 0000000..1e19913 --- /dev/null +++ b/src/hooks/web/usePagination.ts @@ -0,0 +1,34 @@ +import type { Ref } from 'vue'; +import { ref, unref, computed } from 'vue'; + +function pagination(list: T[], pageNo: number, pageSize: number): T[] { + const offset = (pageNo - 1) * Number(pageSize); + const ret = + offset + Number(pageSize) >= list.length + ? list.slice(offset, list.length) + : list.slice(offset, offset + Number(pageSize)); + return ret; +} + +export function usePagination(list: Ref, pageSize: number) { + const currentPage = ref(1); + const pageSizeRef = ref(pageSize); + + const getPaginationList = computed(() => { + return pagination(unref(list), unref(currentPage), unref(pageSizeRef)); + }); + + const getTotal = computed(() => { + return unref(list).length; + }); + + function setCurrentPage(page: number) { + currentPage.value = page; + } + + function setPageSize(pageSize: number) { + pageSizeRef.value = pageSize; + } + + return { setCurrentPage, getTotal, setPageSize, getPaginationList }; +} diff --git a/src/hooks/web/usePermission.ts b/src/hooks/web/usePermission.ts new file mode 100644 index 0000000..35f435a --- /dev/null +++ b/src/hooks/web/usePermission.ts @@ -0,0 +1,85 @@ +import type { RouteRecordRaw } from 'vue-router'; +import { usePermissionStore } from '@/store/modules/permission'; +import { useUserStore } from '@/store/modules/user'; +import { useRoute } from 'vue-router'; +import { useTabs } from './useTabs'; +import { router, resetRouter } from '@/router'; +import { useMultipleTabStore } from '@/store/modules/multipleTab'; + +// User permissions related operations +export function usePermission() { + const userStore = useUserStore(); + const permissionStore = usePermissionStore(); + const { closeAll } = useTabs(router); + + const permissionList = userStore.getPermissionList; + const route = useRoute(); + + /** + * Reset and regain authority resource information + * 重置和重新获得权限资源信息 + * @param id + */ + async function resume() { + const tabStore = useMultipleTabStore(); + tabStore.clearCacheTabs(); + resetRouter(); + const routes = await permissionStore.buildRoutesAction(); + routes.forEach(route => { + router.addRoute(route as unknown as RouteRecordRaw); + }); + permissionStore.setLastBuildMenuTime(); + closeAll(); + } + + // 确定是否有列表权限 + function hasColumnPermission(value?: string, def = true, modelId?: string): boolean { + if (!value) return def; + const currentModelId = modelId || route.meta.modelId || ''; + if (!currentModelId) return false; + const list = permissionList.filter(o => o.modelId === currentModelId); + if (!list.length) return false; + const columnList = list[0] && list[0].column ? list[0].column : []; + if (!columnList.length) return false; + const hasPermission = columnList.some(column => column.enCode === value); + if (hasPermission) return true; + return false; + } + + // 确定是否有表单权限 + function hasFormPermission(value?: string, def = true, modelId?: string): boolean { + if (!value) return def; + const currentModelId = modelId || route.meta.modelId || ''; + if (!currentModelId) return false; + const list = permissionList.filter(o => o.modelId === currentModelId); + if (!list.length) return false; + const formList = list[0] && list[0].form ? list[0].form : []; + if (!formList.length) return false; + const hasPermission = formList.some(form => form.enCode === value); + if (hasPermission) return true; + return false; + } + + // 确定是否有按钮权限 + function hasBtnPermission(value?: string, def = true, modelId?: string): boolean { + if (!value) return def; + const currentModelId = modelId || route.meta.modelId || ''; + if (!currentModelId) return false; + const list = permissionList.filter(o => o.modelId === currentModelId); + if (!list.length) return false; + const btnList = list[0] && list[0].button ? list[0].button : []; + if (!btnList.length) return false; + const hasPermission = btnList.some(btn => btn.enCode === value); + if (hasPermission) return true; + return false; + } + + /** + * refresh menu data + */ + async function refreshMenu() { + resume(); + } + + return { hasColumnP: hasColumnPermission, hasFormP: hasFormPermission, hasBtnP: hasBtnPermission, refreshMenu }; +} diff --git a/src/hooks/web/useScript.ts b/src/hooks/web/useScript.ts new file mode 100644 index 0000000..9707116 --- /dev/null +++ b/src/hooks/web/useScript.ts @@ -0,0 +1,46 @@ +import { onMounted, onUnmounted, ref } from 'vue'; + +interface ScriptOptions { + src: string; +} + +export function useScript(opts: ScriptOptions) { + const isLoading = ref(false); + const error = ref(false); + const success = ref(false); + let script: HTMLScriptElement; + + const promise = new Promise((resolve, reject) => { + onMounted(() => { + script = document.createElement('script'); + script.type = 'text/javascript'; + script.onload = function () { + isLoading.value = false; + success.value = true; + error.value = false; + resolve(''); + }; + + script.onerror = function (err) { + isLoading.value = false; + success.value = false; + error.value = true; + reject(err); + }; + + script.src = opts.src; + document.head.appendChild(script); + }); + }); + + onUnmounted(() => { + script && script.remove(); + }); + + return { + isLoading, + error, + success, + toPromise: () => promise, + }; +} diff --git a/src/hooks/web/useSortable.ts b/src/hooks/web/useSortable.ts new file mode 100644 index 0000000..4c66b6a --- /dev/null +++ b/src/hooks/web/useSortable.ts @@ -0,0 +1,21 @@ +import { nextTick, unref } from 'vue'; +import type { Ref } from 'vue'; +import type { Options } from 'sortablejs'; + +export function useSortable(el: HTMLElement | Ref, options?: Options) { + function initSortable() { + nextTick(async () => { + if (!el) return; + + const Sortable = (await import('sortablejs')).default; + Sortable.create(unref(el), { + animation: 500, + delay: 400, + delayOnTouchOnly: true, + ...options, + }); + }); + } + + return { initSortable }; +} diff --git a/src/hooks/web/useTabs.ts b/src/hooks/web/useTabs.ts new file mode 100644 index 0000000..1f115f1 --- /dev/null +++ b/src/hooks/web/useTabs.ts @@ -0,0 +1,103 @@ +import type { RouteLocationNormalized, Router } from 'vue-router'; + +import { useRouter } from 'vue-router'; +import { unref } from 'vue'; + +import { useMultipleTabStore } from '@/store/modules/multipleTab'; +import { useAppStore } from '@/store/modules/app'; + +enum TableActionEnum { + REFRESH, + CLOSE_ALL, + CLOSE_LEFT, + CLOSE_RIGHT, + CLOSE_OTHER, + CLOSE_CURRENT, + CLOSE, +} + +export function useTabs(_router?: Router) { + const appStore = useAppStore(); + + function canIUseTabs(): boolean { + const { show } = appStore.getMultiTabsSetting; + if (!show) { + throw new Error('The multi-tab page is currently not open, please open it in the settings!'); + } + return !!show; + } + + const tabStore = useMultipleTabStore(); + const router = _router || useRouter(); + + const { currentRoute } = router; + + function getCurrentTab() { + const route = unref(currentRoute); + return tabStore.getTabList.find(item => item.fullPath === route.fullPath)!; + } + + async function updateTabTitle(title: string, tab?: RouteLocationNormalized) { + const canIUse = canIUseTabs; + if (!canIUse) { + return; + } + const targetTab = tab || getCurrentTab(); + await tabStore.setTabTitle(title, targetTab); + } + + async function updateTabPath(path: string, tab?: RouteLocationNormalized) { + const canIUse = canIUseTabs; + if (!canIUse) { + return; + } + const targetTab = tab || getCurrentTab(); + await tabStore.updateTabPath(path, targetTab); + } + + async function handleTabAction(action: TableActionEnum, tab?: RouteLocationNormalized) { + const canIUse = canIUseTabs; + if (!canIUse) { + return; + } + const currentTab = getCurrentTab(); + switch (action) { + case TableActionEnum.REFRESH: + await tabStore.refreshPage(router); + break; + + case TableActionEnum.CLOSE_ALL: + await tabStore.closeAllTab(router); + break; + + case TableActionEnum.CLOSE_LEFT: + await tabStore.closeLeftTabs(currentTab, router); + break; + + case TableActionEnum.CLOSE_RIGHT: + await tabStore.closeRightTabs(currentTab, router); + break; + + case TableActionEnum.CLOSE_OTHER: + await tabStore.closeOtherTabs(currentTab, router); + break; + + case TableActionEnum.CLOSE_CURRENT: + case TableActionEnum.CLOSE: + await tabStore.closeTab(tab || currentTab, router); + break; + } + } + + return { + refreshPage: () => handleTabAction(TableActionEnum.REFRESH), + closeAll: () => handleTabAction(TableActionEnum.CLOSE_ALL), + closeLeft: () => handleTabAction(TableActionEnum.CLOSE_LEFT), + closeRight: () => handleTabAction(TableActionEnum.CLOSE_RIGHT), + closeOther: () => handleTabAction(TableActionEnum.CLOSE_OTHER), + closeCurrent: () => handleTabAction(TableActionEnum.CLOSE_CURRENT), + close: (tab?: RouteLocationNormalized) => handleTabAction(TableActionEnum.CLOSE, tab), + setTitle: (title: string, tab?: RouteLocationNormalized) => updateTabTitle(title, tab), + updatePath: (fullPath: string, tab?: RouteLocationNormalized) => updateTabPath(fullPath, tab), + }; +} diff --git a/src/hooks/web/useTextMask.ts b/src/hooks/web/useTextMask.ts new file mode 100644 index 0000000..5546df0 --- /dev/null +++ b/src/hooks/web/useTextMask.ts @@ -0,0 +1,169 @@ +import { ref, unref } from 'vue'; + +export interface MaskOptions { + filler: string; + maskType: number; + prefixType: number; + prefixLimit: number; + prefixSpecifyChar: string; + suffixType: number; + suffixLimit: number; + suffixSpecifyChar: string; + ignoreChar: string; + useUnrealMask: boolean; + unrealMaskLength: number; +} + +/** + * maskType + * 1 - 全掩盖 + * 2 - 姓名-显示前1个字,后1个字 + * 3 - 手机号-显示前3位,后4位 + * 4 - 邮箱-显示前3个字,@和之后的字 + * 5 - 身份证-显示前6位,后3位,虚拟为4位 + * 6 - IP地址-显示第1段IP + * 7 - 车牌号-显示前1个字,后2位 + * 8 - 银行卡号-显示前6位,后4位 + * 0 - 自定义规则 + */ +export const defaultMaskOptions: MaskOptions = { + filler: '*', // 填充符号 + maskType: 1, // 掩码规则 + prefixType: 1, // 开头显示 + prefixLimit: 0, // 开头字数 + prefixSpecifyChar: '', // 开头字符 + suffixType: 1, // 结尾显示 + suffixLimit: 0, // 结尾字数 + suffixSpecifyChar: '', // 结尾字符 + ignoreChar: '', // 显示字符 + useUnrealMask: false, // 虚拟掩码 + unrealMaskLength: 1, // 虚拟掩码长度 +}; + +export function useTextMask(options?: Nullable>) { + const config = ref({ ...defaultMaskOptions, ...(options || {}) }); + + // 全掩盖 + function maskAll(str: string): string { + return unref(config).filler.repeat(str.length); + } + //姓名 显示前1个字,后1个字 + function maskName(str: string): string { + if (str.length <= 1) return str; + const prefix = str[0]; + if (str.length === 2) return prefix + unref(config).filler; + const suffix = str.slice(-1); + const maskedChars = unref(config).filler.repeat(str.length - 2); + return prefix + maskedChars + suffix; + } + // 手机号 - 显示前3位,后4位 + function maskPhoneNumber(str: string): string { + if (str.length <= 7) return str; + const prefix = str.slice(0, 3); + const suffix = str.slice(-4); + const maskedChars = unref(config).filler.repeat(str.length - 7); + return prefix + maskedChars + suffix; + } + // 邮箱 - 显示前3个字,@和之后的字 + function maskEmailAddress(str: string): string { + const atIndex = str.indexOf('@'); + if (str.length <= 3 || (atIndex > -1 && atIndex < 3)) return str; + let suffixLength = 0; + let maskedCharsLength = str.length - 3; + if (atIndex > 0) { + suffixLength = atIndex; + maskedCharsLength = atIndex - 3; + } + const prefix = str.slice(0, 3); + const suffix = suffixLength ? str.slice(suffixLength) : ''; + const maskedChars = unref(config).filler.repeat(maskedCharsLength); + return prefix + maskedChars + suffix; + } + // 身份证 - 显示前6位,后3位,虚拟为4位 + function maskIdNumber(str: string): string { + if (str.length <= 9) return str; + const prefix = str.slice(0, 6); + const suffix = str.slice(-3); + const maskedChars = unref(config).filler.repeat(4); + return prefix + maskedChars + suffix; + } + // IP地址-显示第1段IP + function maskIPAddress(str: string): string { + const segments = str.split('.'); + if (segments.length < 1) return str; + const maskedChars = ('.' + unref(config).filler.repeat(3)).repeat(3); + return segments[0] + maskedChars; + } + // 车牌号-显示前1个字,后2位 + function maskLicensePlate(str: string): string { + if (str.length <= 3) return str; + const prefix = str[0]; + const suffix = str.slice(-2); + const maskedChars = unref(config).filler.repeat(str.length - 3); + return prefix + maskedChars + suffix; + } + // 银行卡号-显示前6位,后4位 + function maskBankCard(str: string): string { + if (str.length <= 10) return str; + const prefix = str.slice(0, 6); + const suffix = str.slice(-4); + const maskedChars = unref(config).filler.repeat(str.length - 10); + return prefix + maskedChars + suffix; + } + // 自定义掩码规则 + function maskCustom(str: string): string { + let prefixLength = 0, + suffixLength = 0; + if (unref(config).prefixType === 2) prefixLength = unref(config).prefixLimit || 0; + if ((unref(config).prefixType === 3 || unref(config).prefixType === 4) && unref(config).prefixSpecifyChar) { + let specifyCharIndex = str.indexOf(unref(config).prefixSpecifyChar); + if (specifyCharIndex > -1) prefixLength = unref(config).prefixType === 3 ? specifyCharIndex : specifyCharIndex + unref(config).prefixSpecifyChar.length; + } + if (unref(config).suffixType === 2) suffixLength = unref(config).suffixLimit || 0; + if ((unref(config).suffixType === 3 || unref(config).suffixType === 4) && unref(config).suffixSpecifyChar) { + let specifyCharIndex = str.indexOf(unref(config).suffixSpecifyChar); + if (specifyCharIndex > -1) + suffixLength = unref(config).suffixType === 3 ? str.length - specifyCharIndex - unref(config).suffixSpecifyChar.length : str.length - specifyCharIndex; + } + if (prefixLength + suffixLength >= str.length) return str; + const prefix = prefixLength ? str.slice(0, prefixLength) : ''; + const suffix = suffixLength ? str.slice(-suffixLength) : ''; + let middleChar = ''; + if (!unref(config).ignoreChar) { + const maskedLength = unref(config).useUnrealMask ? unref(config).unrealMaskLength || 1 : str.length - prefixLength - suffixLength; + middleChar = unref(config).filler.repeat(maskedLength); + } else { + const ignoreCharList = unref(config).ignoreChar.split(','); + const middleStr = str.slice(prefixLength, str.length - suffixLength); + const reg = new RegExp('(' + ignoreCharList.map(o => o.replace(/\*/g, '\\*')).join('|') + ')', 'g'); + let list = middleStr.split(reg); + list = list.map(o => { + if (o && !ignoreCharList.includes(o)) { + const maskedLength = unref(config).useUnrealMask ? unref(config).unrealMaskLength || 1 : o.length; + o = unref(config).filler.repeat(maskedLength); + } + return o; + }); + middleChar = list.join(''); + } + + return prefix + middleChar + suffix; + } + + // 获取掩码后文本 + function getMaskedText(str: string): string { + if (!str) return ''; + if (unref(config).maskType === 1) return maskAll(str); + if (unref(config).maskType === 2) return maskName(str); + if (unref(config).maskType === 3) return maskPhoneNumber(str); + if (unref(config).maskType === 4) return maskEmailAddress(str); + if (unref(config).maskType === 5) return maskIdNumber(str); + if (unref(config).maskType === 6) return maskIPAddress(str); + if (unref(config).maskType === 7) return maskLicensePlate(str); + if (unref(config).maskType === 8) return maskBankCard(str); + if (unref(config).maskType === 0) return maskCustom(str); + return str; + } + + return { maskAll, maskName, maskPhoneNumber, maskEmailAddress, maskIdNumber, maskIPAddress, maskLicensePlate, maskBankCard, maskCustom, getMaskedText }; +} diff --git a/src/hooks/web/useTitle.ts b/src/hooks/web/useTitle.ts new file mode 100644 index 0000000..0a911fb --- /dev/null +++ b/src/hooks/web/useTitle.ts @@ -0,0 +1,46 @@ +import { watch, ref, unref, computed } from 'vue'; +import { useI18n } from '@/hooks/web/useI18n'; +import { useTitle as usePageTitle } from '@vueuse/core'; +import { useGlobSetting } from '@/hooks/setting'; +import { useRouter } from 'vue-router'; +import { useLocaleStore } from '@/store/modules/locale'; +import { useAppStore } from '@/store/modules/app'; +import { REDIRECT_NAME } from '@/router/constant'; + +/** + * Listening to page changes and dynamically changing site titles + */ +export function useTitle() { + const { title } = useGlobSetting(); + const { t } = useI18n(); + const { currentRoute } = useRouter(); + const localeStore = useLocaleStore(); + const appStore = useAppStore(); + const pageTitle = usePageTitle(); + const customPageTitle = ref(appStore.getSysConfigInfo.title); + + const getTitle = computed(() => + localeStore.getLocale === 'en' ? 'YUNZHUPAAS' : localeStore.getLocale === 'zh_TW' ? 'YUNZHUPAAS軟件開發平臺' : customPageTitle.value || title, + ); + + watch( + () => appStore.getSysConfigInfo, + (val, oldVal) => { + if (oldVal?.title === val.title) return; + }, + ); + watch( + [() => currentRoute.value.path, () => localeStore.getLocale], + () => { + const route = unref(currentRoute); + + if (route.name === REDIRECT_NAME) { + return; + } + + const tTitle = t(route?.meta?.title as string, route?.meta?.defaultTitle as string); + pageTitle.value = tTitle ? ` ${tTitle} - ${unref(getTitle)} ` : `${unref(getTitle)}`; + }, + { immediate: true }, + ); +} diff --git a/src/hooks/web/useWatermark.ts b/src/hooks/web/useWatermark.ts new file mode 100644 index 0000000..9305d5a --- /dev/null +++ b/src/hooks/web/useWatermark.ts @@ -0,0 +1,166 @@ +import { getCurrentInstance, onBeforeUnmount, ref, Ref, shallowRef, unref } from 'vue'; +import { useRafThrottle } from '@/utils/domUtils'; +import { addResizeListener, removeResizeListener } from '@/utils/event'; +import { isDef } from '@/utils/is'; + +const watermarkSymbol = 'watermark-dom'; +const updateWatermarkText = ref(null); + +type UseWatermarkRes = { + setWatermark: (str: string) => void; + clear: () => void; + clearAll: () => void; + obInstance?: MutationObserver; + targetElement?: HTMLElement; + parentElement?: HTMLElement; +}; + +const sourceMap = new Map>(); + +function createBase64(str: string) { + const can = document.createElement('canvas'); + const width = 300; + const height = 240; + Object.assign(can, { width, height }); + + const cans = can.getContext('2d'); + if (cans) { + cans.rotate((-20 * Math.PI) / 180); + cans.font = '15px Vedana'; + cans.fillStyle = 'rgba(0, 0, 0, 0.15)'; + cans.textAlign = 'left'; + cans.textBaseline = 'middle'; + cans.fillText(str, width / 20, height); + // todo 自定义水印样式 + } + return can.toDataURL('image/png'); +} +const resetWatermarkStyle = (element: HTMLElement, watermarkText: string) => { + element.className = '__' + watermarkSymbol; + element.style.pointerEvents = 'none'; + element.style.top = '0px'; + element.style.left = '0px'; + element.style.position = 'absolute'; + element.style.zIndex = '100000'; + element.style.height = '100%'; + element.style.width = '100%'; + element.style.background = `url(${createBase64(unref(updateWatermarkText) || watermarkText)}) left top repeat`; +}; + +const obFn = () => { + const obInstance = new MutationObserver(mutationRecords => { + for (const mutation of mutationRecords) { + for (const node of Array.from(mutation.removedNodes)) { + const target = Array.from(sourceMap.values()).find(item => item.targetElement === node); + if (!target) return; + const { targetElement, parentElement } = target; + // 父元素的子元素水印如果被删除 重新插入被删除的水印(防篡改,插入通过控制台删除的水印) + if (!parentElement?.contains(targetElement as Node | null)) { + target?.parentElement?.appendChild(node as HTMLElement); + } + } + if (mutation.attributeName === 'style' && mutation.target) { + const _target = mutation.target as HTMLElement; + if (_target.className === '__' + watermarkSymbol) { + resetWatermarkStyle(_target as HTMLElement, _target?.['data-watermark-text']); + } + } + } + }); + return obInstance; +}; + +export function useWatermark(appendEl: Ref = ref(document.body) as Ref): UseWatermarkRes { + const domSymbol = Symbol(watermarkSymbol); + const appendElRaw = unref(appendEl); + if (appendElRaw && sourceMap.has(domSymbol)) { + const { setWatermark, clear } = sourceMap.get(domSymbol) as UseWatermarkRes; + return { setWatermark, clear, clearAll }; + } + const func = useRafThrottle(function () { + const el = unref(appendEl); + if (!el) return; + const { clientHeight: height, clientWidth: width } = el; + updateWatermark({ height, width }); + }); + const watermarkEl = shallowRef(); + const clear = () => { + const domId = unref(watermarkEl); + watermarkEl.value = undefined; + const el = unref(appendEl); + sourceMap.has(domSymbol) && sourceMap.get(domSymbol)?.obInstance?.disconnect(); + sourceMap.delete(domSymbol); + if (!el) return; + domId && el.removeChild(domId); + removeResizeListener(el, func); + }; + + function updateWatermark( + options: { + width?: number; + height?: number; + str?: string; + } = {}, + ) { + const el = unref(watermarkEl); + if (!el) return; + if (isDef(options.width)) { + el.style.width = `${options.width}px`; + } + if (isDef(options.height)) { + el.style.height = `${options.height}px`; + } + if (isDef(options.str)) { + el.style.background = `url(${createBase64(options.str)}) left top repeat`; + } + } + + const createWatermark = (str: string) => { + if (unref(watermarkEl) && sourceMap.has(domSymbol)) { + updateWatermarkText.value = str; + updateWatermark({ str }); + return; + } + const div = document.createElement('div'); + div['data-watermark-text'] = str; //自定义属性 用于恢复水印 + updateWatermarkText.value = str; + watermarkEl.value = div; + resetWatermarkStyle(div, str); + const el = unref(appendEl); + if (!el) return; + const { clientHeight: height, clientWidth: width } = el; + updateWatermark({ str, width, height }); + el.appendChild(div); + sourceMap.set(domSymbol, { + setWatermark, + clear, + parentElement: el, + targetElement: div, + obInstance: obFn(), + }); + sourceMap.get(domSymbol)?.obInstance?.observe(el, { + childList: true, // 子节点的变动(指新增,删除或者更改) + subtree: true, // 该观察器应用于该节点的所有后代节点 + attributes: true, // 属性的变动 + }); + }; + + function setWatermark(str: string) { + createWatermark(str); + addResizeListener(document.documentElement, func); + const instance = getCurrentInstance(); + if (instance) { + onBeforeUnmount(() => { + clear(); + }); + } + } + return { setWatermark, clear, clearAll }; +} + +function clearAll() { + Array.from(sourceMap.values()).forEach(item => { + item?.obInstance?.disconnect(); + item.clear(); + }); +} diff --git a/src/hooks/web/useWebSocket.ts b/src/hooks/web/useWebSocket.ts new file mode 100644 index 0000000..3bc4d0d --- /dev/null +++ b/src/hooks/web/useWebSocket.ts @@ -0,0 +1,156 @@ +import { ref } from 'vue'; +import { useMessage } from '@/hooks/web/useMessage'; +import { useUserStore } from '@/store/modules/user'; +import { useGlobSetting } from '@/hooks/setting'; +import { getToken } from '@/utils/auth'; +import { isDevMode } from '@/utils/env'; +import ReconnectingWebSocket from 'reconnecting-websocket'; +import { getYunzhupaasAppId } from '@/utils/yunzhupaas'; + +const userStore = useUserStore(); +const userInfo = userStore.getUserInfo; +const { createMessage } = useMessage(); +const globSetting = useGlobSetting(); +const url = isDevMode() + ? globSetting.webSocketUrl + '/api/message/websocket/' + : globSetting.webSocketUrl + ? globSetting.webSocketUrl + '/websocket/' + : window.location.origin + '/websocket/'; +const webSocketUrl = url.replace('https://', 'wss://').replace('http://', 'ws://'); + +let ws: any; +const listeners = new Map(); + +export function useWebSocket() { + const token = getToken(); + const server = ref(webSocketUrl + encodeURIComponent(token as string)); + /** 初始化WebSocket */ + function initWebSocket() { + if (ws) { + ws.close(); + ws = null; + } + ws = new ReconnectingWebSocket(server.value); + + ws.onopen = onOpen; + ws.onerror = onError; + ws.onmessage = onMessage; + + function onOpen() { + const onConnection = { method: 'OnConnection', mobileDevice: false, systemId: userInfo.systemId, isSeparate: !!getYunzhupaasAppId() }; + sendWsMsg(JSON.stringify(onConnection)); + } + + function onError(e) { + console.log('[WebSocket] 连接发生错误: ', e); + } + + function onMessage(res) { + if (res.data) { + try { + let dataStr = res.data; + const data = JSON.parse(dataStr); + for (const callback of listeners.keys()) { + try { + callback(data); + } catch (err) { + console.error(err); + } + } + // initMessage: //初始化 + // sendMessage: //发送消息 + // receiveMessage: //接收消息 + // messageList: //消息列表 + // messagePush: //消息推送 + switch (data.method) { + //刷新页面 + case 'refresh': + if (data.msg) { + createMessage.error(data.msg); + setTimeout(() => { + location.reload(); + }, 2000); + } else { + location.reload(); + } + break; + //断开websocket连接 + case 'closeSocket': + if (ws) { + ws.close(); + ws = null; + } + break; + //用户过期 + case 'logout': + if (data.token && data.token !== token) return location.reload(); + if (ws) { + ws.close(); + ws = null; + } + createMessage.error(data.msg || '登录过期,请重新登录').then(() => { + userStore.resetToken(); + }); + break; + default: + break; + } + } catch (err) { + console.error('[WebSocket] data解析失败:', err); + } + } + } + } + /** + * 添加 WebSocket 消息监听 + * @param callback + */ + function onWebSocket(callback: (data: object) => any) { + if (!listeners.has(callback)) { + if (typeof callback === 'function') { + listeners.set(callback, null); + } else { + console.debug('[WebSocket] 添加 WebSocket 消息监听失败:传入的参数不是一个方法'); + } + } + } + + /** + * 解除 WebSocket 消息监听 + * + * @param callback + */ + function offWebSocket(callback: (data: object) => any) { + listeners.delete(callback); + } + + function getWebSocket() { + return ws; + } + + function sendWsMsg(msg: string) { + try { + const msgObj = JSON.parse(msg); + msgObj.token = token; + let content = JSON.stringify(msgObj); + ws.send(content); + } catch (_) {} + return; + } + + function closeWebSocket() { + if (ws) { + ws.close(); + ws = null; + } + } + + return { + initWebSocket, + sendWsMsg, + onWebSocket, + offWebSocket, + getWebSocket, + closeWebSocket, + }; +} diff --git a/src/layouts/default/content/index.vue b/src/layouts/default/content/index.vue new file mode 100644 index 0000000..d989cd4 --- /dev/null +++ b/src/layouts/default/content/index.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/layouts/default/content/useContentContext.ts b/src/layouts/default/content/useContentContext.ts new file mode 100644 index 0000000..133c4cf --- /dev/null +++ b/src/layouts/default/content/useContentContext.ts @@ -0,0 +1,17 @@ +import type { InjectionKey, ComputedRef } from 'vue'; +import { createContext, useContext } from '@/hooks/core/useContext'; + +export interface ContentContextProps { + contentHeight: ComputedRef; + setPageHeight: (height: number) => Promise; +} + +const key: InjectionKey = Symbol(); + +export function createContentContext(context: ContentContextProps) { + return createContext(context, key, { native: true }); +} + +export function useContentContext() { + return useContext(key); +} diff --git a/src/layouts/default/content/useContentViewHeight.ts b/src/layouts/default/content/useContentViewHeight.ts new file mode 100644 index 0000000..fcea1e3 --- /dev/null +++ b/src/layouts/default/content/useContentViewHeight.ts @@ -0,0 +1,42 @@ +import { ref, computed, unref } from 'vue'; +import { createPageContext } from '@/hooks/component/usePageContext'; +import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'; + +const headerHeightRef = ref(0); +const footerHeightRef = ref(0); + +export function useLayoutHeight() { + function setHeaderHeight(val) { + headerHeightRef.value = val; + } + function setFooterHeight(val) { + footerHeightRef.value = val; + } + return { headerHeightRef, footerHeightRef, setHeaderHeight, setFooterHeight }; +} + +export function useContentViewHeight() { + const contentHeight = ref(window.innerHeight); + const pageHeight = ref(window.innerHeight); + const getViewHeight = computed(() => { + return unref(contentHeight) - unref(headerHeightRef) - unref(footerHeightRef) || 0; + }); + + useWindowSizeFn( + () => { + contentHeight.value = window.innerHeight; + }, + 100, + { immediate: true }, + ); + + async function setPageHeight(height: number) { + pageHeight.value = height; + } + + createPageContext({ + contentHeight: getViewHeight, + setPageHeight, + pageHeight, + }); +} diff --git a/src/layouts/default/feature/index.vue b/src/layouts/default/feature/index.vue new file mode 100644 index 0000000..dc49195 --- /dev/null +++ b/src/layouts/default/feature/index.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/layouts/default/footer/index.vue b/src/layouts/default/footer/index.vue new file mode 100644 index 0000000..f10bd82 --- /dev/null +++ b/src/layouts/default/footer/index.vue @@ -0,0 +1,91 @@ + + + + diff --git a/src/layouts/default/header/MultipleHeader.vue b/src/layouts/default/header/MultipleHeader.vue new file mode 100644 index 0000000..78a3455 --- /dev/null +++ b/src/layouts/default/header/MultipleHeader.vue @@ -0,0 +1,112 @@ + + + diff --git a/src/layouts/default/header/components/AIChatModal.vue b/src/layouts/default/header/components/AIChatModal.vue new file mode 100644 index 0000000..f6c988c --- /dev/null +++ b/src/layouts/default/header/components/AIChatModal.vue @@ -0,0 +1,599 @@ + + + + + diff --git a/src/layouts/default/header/components/AboutModal.vue b/src/layouts/default/header/components/AboutModal.vue new file mode 100644 index 0000000..7005c6e --- /dev/null +++ b/src/layouts/default/header/components/AboutModal.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/layouts/default/header/components/Breadcrumb.vue b/src/layouts/default/header/components/Breadcrumb.vue new file mode 100644 index 0000000..9288c68 --- /dev/null +++ b/src/layouts/default/header/components/Breadcrumb.vue @@ -0,0 +1,204 @@ + + + diff --git a/src/layouts/default/header/components/CommonMenusDrawer.vue b/src/layouts/default/header/components/CommonMenusDrawer.vue new file mode 100644 index 0000000..b593526 --- /dev/null +++ b/src/layouts/default/header/components/CommonMenusDrawer.vue @@ -0,0 +1,88 @@ + + diff --git a/src/layouts/default/header/components/ErrorAction.vue b/src/layouts/default/header/components/ErrorAction.vue new file mode 100644 index 0000000..b9ba653 --- /dev/null +++ b/src/layouts/default/header/components/ErrorAction.vue @@ -0,0 +1,43 @@ + + diff --git a/src/layouts/default/header/components/FullScreen.vue b/src/layouts/default/header/components/FullScreen.vue new file mode 100644 index 0000000..b9c8930 --- /dev/null +++ b/src/layouts/default/header/components/FullScreen.vue @@ -0,0 +1,42 @@ + + diff --git a/src/layouts/default/header/components/MessageDrawer.vue b/src/layouts/default/header/components/MessageDrawer.vue new file mode 100644 index 0000000..5f08e48 --- /dev/null +++ b/src/layouts/default/header/components/MessageDrawer.vue @@ -0,0 +1,400 @@ + + + diff --git a/src/layouts/default/header/components/Notify.vue b/src/layouts/default/header/components/Notify.vue new file mode 100644 index 0000000..3966362 --- /dev/null +++ b/src/layouts/default/header/components/Notify.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/layouts/default/header/components/ResetPwdForm.vue b/src/layouts/default/header/components/ResetPwdForm.vue new file mode 100644 index 0000000..a06871a --- /dev/null +++ b/src/layouts/default/header/components/ResetPwdForm.vue @@ -0,0 +1,154 @@ + + diff --git a/src/layouts/default/header/components/StatementModal.vue b/src/layouts/default/header/components/StatementModal.vue new file mode 100644 index 0000000..5b34131 --- /dev/null +++ b/src/layouts/default/header/components/StatementModal.vue @@ -0,0 +1,12 @@ + + diff --git a/src/layouts/default/header/components/SystemTriggerDrawer.vue b/src/layouts/default/header/components/SystemTriggerDrawer.vue new file mode 100644 index 0000000..13c1851 --- /dev/null +++ b/src/layouts/default/header/components/SystemTriggerDrawer.vue @@ -0,0 +1,79 @@ + + diff --git a/src/layouts/default/header/components/chat/ChatDrawer.vue b/src/layouts/default/header/components/chat/ChatDrawer.vue new file mode 100644 index 0000000..caebdc0 --- /dev/null +++ b/src/layouts/default/header/components/chat/ChatDrawer.vue @@ -0,0 +1,397 @@ + + + diff --git a/src/layouts/default/header/components/chat/Im.vue b/src/layouts/default/header/components/chat/Im.vue new file mode 100644 index 0000000..b980d4b --- /dev/null +++ b/src/layouts/default/header/components/chat/Im.vue @@ -0,0 +1,715 @@ + + + + + + diff --git a/src/layouts/default/header/components/chat/emoji.json b/src/layouts/default/header/components/chat/emoji.json new file mode 100644 index 0000000..af9965e --- /dev/null +++ b/src/layouts/default/header/components/chat/emoji.json @@ -0,0 +1,482 @@ +[ + { + "url": "100.gif", + "alt": "[微笑]" + }, + { + "url": "101.gif", + "alt": "[伤心]" + }, + { + "url": "102.gif", + "alt": "[美女]" + }, + { + "url": "103.gif", + "alt": "[发呆]" + }, + { + "url": "104.gif", + "alt": "[墨镜]" + }, + { + "url": "105.gif", + "alt": "[哭]" + }, + { + "url": "106.gif", + "alt": "[羞]" + }, + { + "url": "107.gif", + "alt": "[哑]" + }, + { + "url": "108.gif", + "alt": "[睡]" + }, + { + "url": "109.gif", + "alt": "[大哭]" + }, + { + "url": "110.gif", + "alt": "[囧]" + }, + { + "url": "111.gif", + "alt": "[怒]" + }, + { + "url": "112.gif", + "alt": "[调皮]" + }, + { + "url": "113.gif", + "alt": "[呲牙]" + }, + { + "url": "114.gif", + "alt": "[惊讶]" + }, + { + "url": "115.gif", + "alt": "[难过]" + }, + { + "url": "116.gif", + "alt": "[酷]" + }, + { + "url": "117.gif", + "alt": "[汗]" + }, + { + "url": "118.gif", + "alt": "[抓狂]" + }, + { + "url": "119.gif", + "alt": "[吐]" + }, + { + "url": "120.gif", + "alt": "[笑]" + }, + { + "url": "121.gif", + "alt": "[快乐]" + }, + { + "url": "122.gif", + "alt": "[疑惑]" + }, + { + "url": "123.gif", + "alt": "[傲]" + }, + { + "url": "124.gif", + "alt": "[饿]" + }, + { + "url": "125.gif", + "alt": "[累]" + }, + { + "url": "126.gif", + "alt": "[惊恐]" + }, + { + "url": "127.gif", + "alt": "[汗1]" + }, + { + "url": "128.gif", + "alt": "[高兴]" + }, + { + "url": "129.gif", + "alt": "[闲]" + }, + { + "url": "130.gif", + "alt": "[努力]" + }, + { + "url": "131.gif", + "alt": "[骂]" + }, + { + "url": "132.gif", + "alt": "[疑问]" + }, + { + "url": "133.gif", + "alt": "[秘密]" + }, + { + "url": "134.gif", + "alt": "[乱]" + }, + { + "url": "135.gif", + "alt": "[疯]" + }, + { + "url": "136.gif", + "alt": "[哀]" + }, + { + "url": "137.gif", + "alt": "[鬼]" + }, + { + "url": "138.gif", + "alt": "[打击]" + }, + { + "url": "139.gif", + "alt": "[bye]" + }, + { + "url": "140.gif", + "alt": "[擦汗]" + }, + { + "url": "141.gif", + "alt": "[抠]" + }, + { + "url": "142.gif", + "alt": "[鼓掌]" + }, + { + "url": "143.gif", + "alt": "[糟糕]" + }, + { + "url": "144.gif", + "alt": "[恶搞]" + }, + { + "url": "145.gif", + "alt": "[左哼哼]" + }, + { + "url": "146.gif", + "alt": "[右哼哼]" + }, + { + "url": "147.gif", + "alt": "[哈欠]" + }, + { + "url": "148.gif", + "alt": "[看]" + }, + { + "url": "149.gif", + "alt": "[委屈]" + }, + { + "url": "150.gif", + "alt": "[难过1]" + }, + { + "url": "151.gif", + "alt": "[坏]" + }, + { + "url": "152.gif", + "alt": "[亲]" + }, + { + "url": "153.gif", + "alt": "[吓]" + }, + { + "url": "154.gif", + "alt": "[可怜]" + }, + { + "url": "155.gif", + "alt": "[刀]" + }, + { + "url": "156.gif", + "alt": "[水果]" + }, + { + "url": "157.gif", + "alt": "[酒]" + }, + { + "url": "158.gif", + "alt": "[篮球]" + }, + { + "url": "159.gif", + "alt": "[乒乓]" + }, + { + "url": "160.gif", + "alt": "[咖啡]" + }, + { + "url": "161.gif", + "alt": "[美食]" + }, + { + "url": "162.gif", + "alt": "[动物]" + }, + { + "url": "163.gif", + "alt": "[鲜花]" + }, + { + "url": "164.gif", + "alt": "[枯]" + }, + { + "url": "165.gif", + "alt": "[唇]" + }, + { + "url": "166.gif", + "alt": "[爱]" + }, + { + "url": "167.gif", + "alt": "[分手]" + }, + { + "url": "168.gif", + "alt": "[生日]" + }, + { + "url": "169.gif", + "alt": "[电]" + }, + { + "url": "170.gif", + "alt": "[炸弹]" + }, + { + "url": "171.gif", + "alt": "[刀子]" + }, + { + "url": "172.gif", + "alt": "[足球]" + }, + { + "url": "173.gif", + "alt": "[瓢虫]" + }, + { + "url": "174.gif", + "alt": "[翔]" + }, + { + "url": "175.gif", + "alt": "[月亮]" + }, + { + "url": "176.gif", + "alt": "[太阳]" + }, + { + "url": "177.gif", + "alt": "[礼物]" + }, + { + "url": "178.gif", + "alt": "[抱抱]" + }, + { + "url": "179.gif", + "alt": "[拇指]" + }, + { + "url": "180.gif", + "alt": "[贬低]" + }, + { + "url": "181.gif", + "alt": "[握手]" + }, + { + "url": "182.gif", + "alt": "[剪刀手]" + }, + { + "url": "183.gif", + "alt": "[抱拳]" + }, + { + "url": "184.gif", + "alt": "[勾引]" + }, + { + "url": "185.gif", + "alt": "[拳头]" + }, + { + "url": "186.gif", + "alt": "[小拇指]" + }, + { + "url": "187.gif", + "alt": "[拇指八]" + }, + { + "url": "188.gif", + "alt": "[食指]" + }, + { + "url": "189.gif", + "alt": "[ok]" + }, + { + "url": "190.gif", + "alt": "[情侣]" + }, + { + "url": "191.gif", + "alt": "[爱心]" + }, + { + "url": "192.gif", + "alt": "[蹦哒]" + }, + { + "url": "193.gif", + "alt": "[颤抖]" + }, + { + "url": "194.gif", + "alt": "[怄气]" + }, + { + "url": "195.gif", + "alt": "[跳舞]" + }, + { + "url": "196.gif", + "alt": "[拜]" + }, + { + "url": "197.gif", + "alt": "[背着]" + }, + { + "url": "198.gif", + "alt": "[伸手]" + }, + { + "url": "199.gif", + "alt": "[耍帅]" + }, + { + "url": "200.png", + "alt": "[微笑1]" + }, + { + "url": "201.png", + "alt": "[生病]" + }, + { + "url": "202.png", + "alt": "[哭泣]" + }, + { + "url": "203.png", + "alt": "[吐舌]" + }, + { + "url": "204.png", + "alt": "[迷糊]" + }, + { + "url": "205.png", + "alt": "[瞪眼]" + }, + { + "url": "206.png", + "alt": "[恐怖]" + }, + { + "url": "207.png", + "alt": "[忧愁]" + }, + { + "url": "208.png", + "alt": "[眨眉]" + }, + { + "url": "209.png", + "alt": "[闭眼]" + }, + { + "url": "210.png", + "alt": "[鄙视]" + }, + { + "url": "211.png", + "alt": "[阴暗]" + }, + { + "url": "212.png", + "alt": "[小鬼]" + }, + { + "url": "213.png", + "alt": "[爱心1]" + }, + { + "url": "214.png", + "alt": "[拜佛]" + }, + { + "url": "215.png", + "alt": "[力量]" + }, + { + "url": "216.png", + "alt": "[金钱]" + }, + { + "url": "217.png", + "alt": "[蛋糕]" + }, + { + "url": "218.png", + "alt": "[彩带]" + }, + { + "url": "219.png", + "alt": "[礼物1]" + } +] diff --git a/src/layouts/default/header/components/index.ts b/src/layouts/default/header/components/index.ts new file mode 100644 index 0000000..b05bb09 --- /dev/null +++ b/src/layouts/default/header/components/index.ts @@ -0,0 +1,13 @@ +import { createAsyncComponent } from '@/utils/factory/createAsyncComponent'; +import FullScreen from './FullScreen.vue'; +import Notify from './Notify.vue'; + +export const UserDropDown = createAsyncComponent(() => import('./user-dropdown/index.vue'), { + loading: true, +}); + +export const LayoutBreadcrumb = createAsyncComponent(() => import('./Breadcrumb.vue')); + +export const ErrorAction = createAsyncComponent(() => import('./ErrorAction.vue')); + +export { FullScreen, Notify }; diff --git a/src/layouts/default/header/components/user-dropdown/DropMenuItem.vue b/src/layouts/default/header/components/user-dropdown/DropMenuItem.vue new file mode 100644 index 0000000..fd33e84 --- /dev/null +++ b/src/layouts/default/header/components/user-dropdown/DropMenuItem.vue @@ -0,0 +1,25 @@ + + diff --git a/src/layouts/default/header/components/user-dropdown/index.vue b/src/layouts/default/header/components/user-dropdown/index.vue new file mode 100644 index 0000000..892cc51 --- /dev/null +++ b/src/layouts/default/header/components/user-dropdown/index.vue @@ -0,0 +1,201 @@ + + + diff --git a/src/layouts/default/header/index.less b/src/layouts/default/header/index.less new file mode 100644 index 0000000..18764bf --- /dev/null +++ b/src/layouts/default/header/index.less @@ -0,0 +1,200 @@ +@header-trigger-prefix-cls: ~'@{namespace}-layout-header-trigger'; +@header-prefix-cls: ~'@{namespace}-layout-header'; +@breadcrumb-prefix-cls: ~'@{namespace}-layout-breadcrumb'; +@logo-prefix-cls: ~'@{namespace}-app-logo'; +@header-user-dropdown-prefix-cls: ~'@{namespace}-header-user-dropdown'; + +.@{header-prefix-cls} { + display: flex; + height: @header-height !important; + padding: 0; + line-height: @header-height !important; + background-color: transparent !important; + align-items: center; + justify-content: space-between; + padding-inline: 0 !important; + + &--mobile { + .@{breadcrumb-prefix-cls}, + .error-action, + .notify-item, + .fullscreen-item { + display: none; + } + + .@{logo-prefix-cls} { + min-width: unset; + padding-right: 0; + + &__title { + display: none; + } + } + .@{header-trigger-prefix-cls} { + padding: 0 4px 0 8px !important; + } + .@{header-prefix-cls}-action { + padding-right: 4px; + } + } + + &--fixed { + position: fixed; + top: 0; + left: 0; + z-index: @layout-header-fixed-z-index; + width: 100%; + } + + &-logo { + height: @header-height; + min-width: 210px; + font-size: 14px; + + img { + width: 100%; + height: 100%; + // margin-right: 2px; + } + } + + &-left { + display: flex; + height: 100%; + align-items: center; + + .@{header-trigger-prefix-cls} { + display: flex; + height: 100%; + padding: 1px 10px 0; + cursor: pointer; + align-items: center; + + .anticon { + font-size: 16px; + } + + // &.light { + // &:hover { + // background-color: @header-light-bg-hover-color; + // } + + // svg { + // fill: #000; + // } + // } + + // &.dark { + // &:hover { + // background-color: @header-dark-bg-hover-color; + // } + // } + } + } + + &-menu { + height: 100%; + min-width: 0; + flex: 1; + align-items: center; + } + + &-action { + display: flex; + min-width: 180px; + align-items: center; + padding-right: 10px; + + &__item { + display: flex !important; + height: 36px; + padding: 0 2px; + font-size: 1.2em; + cursor: pointer; + align-items: center; + border-radius: var(--border-radius); + &:hover { + background: rgba(247, 247, 247, 0.4); + } + /* 定义keyframe动画,命名为twinkle */ + @keyframes twinkle { + 0% { + opacity: 1; + } + 50% { + opacity: 1; + } + 50.01% { + opacity: 0; + } + 100% { + opacity: 0; + } + } + .twinkle { + animation: twinkle 0.5s linear infinite; + } + } + + .icon-ym { + font-size: 18px; + padding: 0 10px; + } + } + + &--light { + .@{header-prefix-cls}-logo { + color: @text-color-base; + } + + .@{header-prefix-cls}-action { + &__item { + color: @text-color-base; + + .app-iconify { + padding: 0 10px; + font-size: 16px !important; + } + } + + &-icon, + span[role='img'] { + color: @text-color-base; + } + } + } + + &--dark { + background-color: @header-dark-bg-color !important; + border-left: 1px solid @border-color-base; + .@{header-prefix-cls}-logo { + &:hover { + background-color: @header-dark-bg-hover-color; + } + } + + .@{header-prefix-cls}-action { + &__item { + .app-iconify { + padding: 0 10px; + font-size: 16px !important; + } + + .ant-badge { + span { + color: @white; + } + } + + &:hover { + background-color: @header-dark-bg-hover-color; + } + } + .@{header-user-dropdown-prefix-cls}{ + &:hover { + background-color: @header-dark-bg-hover-color; + } + } + } + } +} diff --git a/src/layouts/default/header/index.vue b/src/layouts/default/header/index.vue new file mode 100644 index 0000000..f2e9849 --- /dev/null +++ b/src/layouts/default/header/index.vue @@ -0,0 +1,299 @@ + + + diff --git a/src/layouts/default/index.vue b/src/layouts/default/index.vue new file mode 100644 index 0000000..31f2759 --- /dev/null +++ b/src/layouts/default/index.vue @@ -0,0 +1,148 @@ + + + + diff --git a/src/layouts/default/menu/index.vue b/src/layouts/default/menu/index.vue new file mode 100644 index 0000000..3ad4d42 --- /dev/null +++ b/src/layouts/default/menu/index.vue @@ -0,0 +1,166 @@ + + diff --git a/src/layouts/default/menu/useLayoutMenu.ts b/src/layouts/default/menu/useLayoutMenu.ts new file mode 100644 index 0000000..47a6364 --- /dev/null +++ b/src/layouts/default/menu/useLayoutMenu.ts @@ -0,0 +1,107 @@ +import type { Menu } from '@/router/types'; +import type { Ref } from 'vue'; +import { watch, unref, ref, computed } from 'vue'; +import { useRouter } from 'vue-router'; +import { MenuSplitTyeEnum } from '@/enums/menuEnum'; +import { useThrottleFn } from '@vueuse/core'; +import { useMenuSetting } from '@/hooks/setting/useMenuSetting'; +import { getChildrenMenus, getCurrentParentPath, getMenus, getShallowMenus } from '@/router/menus'; +import { usePermissionStore } from '@/store/modules/permission'; +import { useAppInject } from '@/hooks/web/useAppInject'; + +export function useSplitMenu(splitType: Ref) { + // Menu array + const menusRef = ref([]); + const { currentRoute } = useRouter(); + const { getIsMobile } = useAppInject(); + const permissionStore = usePermissionStore(); + const { setMenuSetting, getIsHorizontal, getSplit } = useMenuSetting(); + + const throttleHandleSplitLeftMenu = useThrottleFn(handleSplitLeftMenu, 50); + + const splitNotLeft = computed(() => unref(splitType) !== MenuSplitTyeEnum.LEFT && !unref(getIsHorizontal)); + + const getSplitLeft = computed(() => !unref(getSplit) || unref(splitType) !== MenuSplitTyeEnum.LEFT); + + const getSpiltTop = computed(() => unref(splitType) === MenuSplitTyeEnum.TOP); + + const normalType = computed(() => { + return unref(splitType) === MenuSplitTyeEnum.NONE || !unref(getSplit); + }); + + watch( + [() => unref(currentRoute).path, () => unref(splitType)], + async ([path]: [string, MenuSplitTyeEnum]) => { + if (unref(splitNotLeft) || unref(getIsMobile)) return; + + const { meta } = unref(currentRoute); + const currentActiveMenu = meta.currentActiveMenu as string; + let parentPath = await getCurrentParentPath(path); + if (!parentPath) { + parentPath = await getCurrentParentPath(currentActiveMenu); + } + parentPath && throttleHandleSplitLeftMenu(parentPath); + }, + { immediate: true }, + ); + + // Menu changes + watch( + [() => permissionStore.getLastBuildMenuTime, () => permissionStore.getMenuList], + () => { + genMenus(); + }, + { immediate: true }, + ); + + // split Menu changes + watch( + () => getSplit.value, + () => { + if (unref(splitNotLeft)) return; + genMenus(); + }, + ); + watch( + () => splitType.value, + () => { + genMenus(); + }, + ); + + // Handle left menu split + async function handleSplitLeftMenu(parentPath: string) { + if (unref(getSplitLeft) || unref(getIsMobile)) return; + + // spilt mode left + const children = await getChildrenMenus(parentPath); + + if (!children || !children.length) { + setMenuSetting({ hidden: true }); + menusRef.value = []; + return; + } + + setMenuSetting({ hidden: false }); + menusRef.value = children; + } + + // get menus + async function genMenus() { + // normal mode + if (unref(normalType) || unref(getIsMobile)) { + menusRef.value = await getMenus(); + return; + } + + // split-top + if (unref(getSpiltTop)) { + const shallowMenus = await getShallowMenus(); + + menusRef.value = shallowMenus; + return; + } + } + + return { menusRef }; +} diff --git a/src/layouts/default/setting/SettingDrawer.tsx b/src/layouts/default/setting/SettingDrawer.tsx new file mode 100644 index 0000000..3af9a65 --- /dev/null +++ b/src/layouts/default/setting/SettingDrawer.tsx @@ -0,0 +1,217 @@ +import { defineComponent, computed, unref } from 'vue'; +import { BasicDrawer } from '@/components/Drawer/index'; +import { TypePicker, ThemeColorPicker, MainThemeColorPicker, SwitchItem, SelectItem, InputNumberItem } from './components'; +import { AppDarkModeToggle } from '@/components/Application'; +import { TriggerEnum } from '@/enums/menuEnum'; +import { useRootSetting } from '@/hooks/setting/useRootSetting'; +import { useMenuSetting } from '@/hooks/setting/useMenuSetting'; +import { useHeaderSetting } from '@/hooks/setting/useHeaderSetting'; +import { useMultipleTabSetting } from '@/hooks/setting/useMultipleTabSetting'; +import { useTransitionSetting } from '@/hooks/setting/useTransitionSetting'; +import { useLocale } from '@/locales/useLocale'; +import { useI18n } from '@/hooks/web/useI18n'; + +import { baseHandler } from './handler'; + +import { + HandlerEnum, + contentModeOptions, + topMenuAlignOptions, + getMenuTriggerOptions, + routerTransitionOptions, + menuTypeList, + sysBgList, + mixSidebarTriggerOptions, +} from './enum'; + +import { HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST, APP_PRESET_COLOR_LIST } from '@/settings/designSetting'; + +const { t } = useI18n(); + +export default defineComponent({ + name: 'SettingDrawer', + setup(_, { attrs }) { + const { + getContentMode, + getShowFooter, + getShowBreadCrumb, + getShowBreadCrumbIcon, + getShowLogo, + getFullContent, + getColorWeak, + getGrayMode, + getLockTime, + getShowDarkModeToggle, + getThemeColor, + getSysBg, + getOpenKeepAlive, + } = useRootSetting(); + + const { getOpenPageLoading, getBasicTransition, getEnableTransition, getOpenNProgress } = useTransitionSetting(); + + const { + getIsHorizontal, + getShowMenu, + getMenuType, + getTrigger, + getCollapsedShowTitle, + getMenuFixed, + getCollapsed, + getCanDrag, + getTopMenuAlign, + getAccordion, + getMenuWidth, + getMenuBgColor, + getIsTopMenu, + getSplit, + getIsMixSidebar, + getCloseMixSidebarOnChange, + getMixSideTrigger, + getMixSideFixed, + } = useMenuSetting(); + + const { getShowHeader, getFixed: getHeaderFixed, getHeaderBgColor, getShowSearch } = useHeaderSetting(); + + const { getShowMultipleTab, getShowIcon, getShowQuick, getShowRedo, getShowFold } = useMultipleTabSetting(); + + const { getShowLocalePicker } = useLocale(); + + const getShowMenuRef = computed(() => { + return unref(getShowMenu) && !unref(getIsHorizontal); + }); + + function renderSidebar() { + return ( + <> + { + baseHandler(HandlerEnum.CHANGE_LAYOUT, { + mode: item.mode, + type: item.type, + split: unref(getIsHorizontal) ? false : undefined, + }); + }} + def={unref(getMenuType)} + /> + + ); + } + + function renderSystemBackground() { + return ( + <> + { + baseHandler(HandlerEnum.CHANGE_SYS_BG, item.type); + }} + def={unref(getSysBg)} + /> + + ); + } + + function renderHeaderTheme() { + return ; + } + + function renderSiderTheme() { + return ; + } + + function renderMainTheme() { + return ; + } + + /** + * @description: + */ + function renderFeatures() { + let triggerDef = unref(getTrigger); + + const triggerOptions = getMenuTriggerOptions(unref(getSplit)); + const some = triggerOptions.some(item => item.value === triggerDef); + if (!some) { + triggerDef = TriggerEnum.FOOTER; + } + + return ( + <> + + + + ); + } + + function renderContent() { + return ( + <> + + + + + + + ); + } + + function renderTransition() { + return ( + <> + + + + ); + } + function renderDarkMode() { + if (!unref(getShowDarkModeToggle)) return null; + return ( +
+

{t('layout.setting.darkMode')}

+
+ +
+
+ ); + } + + return () => ( + +
+ {renderDarkMode()} +
+

{t('layout.setting.navMode')}

+
{renderSidebar()}
+
+
+

{t('layout.setting.sysTheme')}

+
{renderMainTheme()}
+
+
+

{t('layout.setting.systemBackground')}

+
{renderSystemBackground()}
+
+
+

{t('layout.setting.interfaceFunction')}

+
{renderFeatures()}
+
+
+

{t('layout.setting.interfaceDisplay')}

+
{renderContent()}
+
+
+

{t('layout.setting.animation')}

+
{renderTransition()}
+
+
+
+ ); + }, +}); diff --git a/src/layouts/default/setting/components/InputNumberItem.vue b/src/layouts/default/setting/components/InputNumberItem.vue new file mode 100644 index 0000000..42297e2 --- /dev/null +++ b/src/layouts/default/setting/components/InputNumberItem.vue @@ -0,0 +1,56 @@ + + + diff --git a/src/layouts/default/setting/components/MainThemeColorPicker.vue b/src/layouts/default/setting/components/MainThemeColorPicker.vue new file mode 100644 index 0000000..0d6c930 --- /dev/null +++ b/src/layouts/default/setting/components/MainThemeColorPicker.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/layouts/default/setting/components/SelectItem.vue b/src/layouts/default/setting/components/SelectItem.vue new file mode 100644 index 0000000..9cfce72 --- /dev/null +++ b/src/layouts/default/setting/components/SelectItem.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/layouts/default/setting/components/SettingFooter.vue b/src/layouts/default/setting/components/SettingFooter.vue new file mode 100644 index 0000000..b8c01dc --- /dev/null +++ b/src/layouts/default/setting/components/SettingFooter.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/layouts/default/setting/components/SwitchItem.vue b/src/layouts/default/setting/components/SwitchItem.vue new file mode 100644 index 0000000..dce5efa --- /dev/null +++ b/src/layouts/default/setting/components/SwitchItem.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/layouts/default/setting/components/ThemeColorPicker.vue b/src/layouts/default/setting/components/ThemeColorPicker.vue new file mode 100644 index 0000000..987b106 --- /dev/null +++ b/src/layouts/default/setting/components/ThemeColorPicker.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/layouts/default/setting/components/TypePicker.vue b/src/layouts/default/setting/components/TypePicker.vue new file mode 100644 index 0000000..3c16ebd --- /dev/null +++ b/src/layouts/default/setting/components/TypePicker.vue @@ -0,0 +1,39 @@ + + diff --git a/src/layouts/default/setting/components/index.ts b/src/layouts/default/setting/components/index.ts new file mode 100644 index 0000000..7548db4 --- /dev/null +++ b/src/layouts/default/setting/components/index.ts @@ -0,0 +1,9 @@ +import { createAsyncComponent } from '@/utils/factory/createAsyncComponent'; + +export const TypePicker = createAsyncComponent(() => import('./TypePicker.vue')); +export const ThemeColorPicker = createAsyncComponent(() => import('./ThemeColorPicker.vue')); +export const MainThemeColorPicker = createAsyncComponent(() => import('./MainThemeColorPicker.vue')); +export const SettingFooter = createAsyncComponent(() => import('./SettingFooter.vue')); +export const SwitchItem = createAsyncComponent(() => import('./SwitchItem.vue')); +export const SelectItem = createAsyncComponent(() => import('./SelectItem.vue')); +export const InputNumberItem = createAsyncComponent(() => import('./InputNumberItem.vue')); diff --git a/src/layouts/default/setting/enum.ts b/src/layouts/default/setting/enum.ts new file mode 100644 index 0000000..8d1cdf3 --- /dev/null +++ b/src/layouts/default/setting/enum.ts @@ -0,0 +1,191 @@ +import sidebarImg from '@/assets/images/settings/sidebar.png'; +import topMenuImg from '@/assets/images/settings/topMenu.png'; +import mixSidebarImg from '@/assets/images/settings/mixSidebar.png'; +import sidebarHLImg from '@/assets/images/settings/sidebarHL.png'; +import topMenuHLImg from '@/assets/images/settings/topMenuHL.png'; +import mixSidebarHLImg from '@/assets/images/settings/mixSidebarHL.png'; +import defaultBg from '@/assets/images/settings/defaultBg.png'; +import blueBg from '@/assets/images/settings/blueBg.png'; +import purpleBg from '@/assets/images/settings/purpleBg.png'; +import greenBg from '@/assets/images/settings/greenBg.png'; +import { ContentEnum, RouterTransitionEnum } from '@/enums/appEnum'; +import { MenuModeEnum, MenuTypeEnum, TopMenuAlignEnum, TriggerEnum, MixSidebarTriggerEnum, SysBgEnum } from '@/enums/menuEnum'; + +import { useI18n } from '@/hooks/web/useI18n'; + +const { t } = useI18n(); + +export enum HandlerEnum { + CHANGE_LAYOUT, + CHANGE_THEME_COLOR, + CHANGE_THEME, + CHANGE_SYS_BG, + // menu + MENU_HAS_DRAG, + MENU_ACCORDION, + MENU_TRIGGER, + MENU_TOP_ALIGN, + MENU_COLLAPSED, + MENU_COLLAPSED_SHOW_TITLE, + MENU_WIDTH, + MENU_SHOW_SIDEBAR, + MENU_THEME, + MENU_SPLIT, + MENU_FIXED, + MENU_CLOSE_MIX_SIDEBAR_ON_CHANGE, + MENU_TRIGGER_MIX_SIDEBAR, + MENU_FIXED_MIX_SIDEBAR, + + // header + HEADER_SHOW, + HEADER_THEME, + HEADER_FIXED, + + HEADER_SEARCH, + HEADER_LOCALE, + + TABS_SHOW_QUICK, + TABS_SHOW_REDO, + TABS_SHOW, + TABS_SHOW_ICON, + TABS_SHOW_FOLD, + + LOCK_TIME, + FULL_CONTENT, + CONTENT_MODE, + SHOW_BREADCRUMB, + SHOW_BREADCRUMB_ICON, + GRAY_MODE, + COLOR_WEAK, + SHOW_LOGO, + SHOW_FOOTER, + + ROUTER_TRANSITION, + OPEN_PROGRESS, + OPEN_PAGE_LOADING, + OPEN_ROUTE_TRANSITION, + OPEN_KEEP_ALIVE, +} + +export const contentModeOptions = [ + { + value: ContentEnum.FULL, + label: t('layout.setting.contentModeFull'), + }, + { + value: ContentEnum.FIXED, + label: t('layout.setting.contentModeFixed'), + }, +]; + +export const topMenuAlignOptions = [ + { + value: TopMenuAlignEnum.CENTER, + label: t('layout.setting.topMenuAlignRight'), + }, + { + value: TopMenuAlignEnum.START, + label: t('layout.setting.topMenuAlignLeft'), + }, + { + value: TopMenuAlignEnum.END, + label: t('layout.setting.topMenuAlignCenter'), + }, +]; + +export const getMenuTriggerOptions = (hideTop: boolean) => { + return [ + { + value: TriggerEnum.NONE, + label: t('layout.setting.menuTriggerNone'), + }, + { + value: TriggerEnum.FOOTER, + label: t('layout.setting.menuTriggerBottom'), + }, + ...(hideTop + ? [] + : [ + { + value: TriggerEnum.HEADER, + label: t('layout.setting.menuTriggerTop'), + }, + ]), + ]; +}; + +export const routerTransitionOptions = [ + RouterTransitionEnum.ZOOM_FADE, + RouterTransitionEnum.FADE, + RouterTransitionEnum.ZOOM_OUT, + RouterTransitionEnum.FADE_SIDE, + RouterTransitionEnum.FADE_BOTTOM, + RouterTransitionEnum.FADE_SCALE, +].map(item => { + return { + label: item, + value: item, + }; +}); + +export const menuTypeList = [ + { + title: t('layout.setting.menuTypeSidebar'), + mode: MenuModeEnum.INLINE, + type: MenuTypeEnum.SIDEBAR, + img: sidebarImg, + activeImg: sidebarHLImg, + }, + { + title: t('layout.setting.menuTypeTopMenu'), + mode: MenuModeEnum.HORIZONTAL, + type: MenuTypeEnum.TOP_MENU, + img: topMenuImg, + activeImg: topMenuHLImg, + }, + { + title: t('layout.setting.menuTypeMixSidebar'), + mode: MenuModeEnum.INLINE, + type: MenuTypeEnum.MIX_SIDEBAR, + img: mixSidebarImg, + activeImg: mixSidebarHLImg, + }, +]; + +export const sysBgList = [ + { + title: t('layout.setting.defaultBg'), + type: SysBgEnum.DEFAULT, + img: defaultBg, + activeImg: defaultBg, + }, + { + title: t('layout.setting.blueBg'), + type: SysBgEnum.BLUE, + img: blueBg, + activeImg: blueBg, + }, + { + title: t('layout.setting.purpleBg'), + type: SysBgEnum.PURPLE, + img: purpleBg, + activeImg: purpleBg, + }, + { + title: t('layout.setting.greenBg'), + type: SysBgEnum.GREEN, + img: greenBg, + activeImg: greenBg, + }, +]; + +export const mixSidebarTriggerOptions = [ + { + value: MixSidebarTriggerEnum.HOVER, + label: t('layout.setting.triggerHover'), + }, + { + value: MixSidebarTriggerEnum.CLICK, + label: t('layout.setting.triggerClick'), + }, +]; diff --git a/src/layouts/default/setting/handler.ts b/src/layouts/default/setting/handler.ts new file mode 100644 index 0000000..277302e --- /dev/null +++ b/src/layouts/default/setting/handler.ts @@ -0,0 +1,194 @@ +import { HandlerEnum } from './enum'; +import { MenuTypeEnum } from '@/enums/menuEnum'; +import { updateHeaderBgColor, updateSidebarBgColor } from '@/logics/theme/updateBackground'; +import { updateColorWeak } from '@/logics/theme/updateColorWeak'; +import { updateGrayMode } from '@/logics/theme/updateGrayMode'; + +import { useAppStore } from '@/store/modules/app'; +import { useLocaleStore } from '@/store/modules/locale'; +import { ProjectConfig } from '#/config'; +import { changeTheme } from '@/logics/theme'; +import { updateDarkTheme } from '@/logics/theme/dark'; +import { useRootSetting } from '@/hooks/setting/useRootSetting'; + +export function baseHandler(event: HandlerEnum, value: any) { + const appStore = useAppStore(); + const config = handler(event, value); + appStore.setProjectConfig(config); + if (event === HandlerEnum.CHANGE_THEME) { + updateHeaderBgColor(); + updateSidebarBgColor(); + } + // 多语言切换开关 + if (event === HandlerEnum.HEADER_LOCALE) { + const localeStore = useLocaleStore(); + localeStore.setLocaleInfo({ showPicker: value }); + } +} + +export function handler(event: HandlerEnum, value: any): DeepPartial { + const appStore = useAppStore(); + + const { getThemeColor, getDarkMode } = useRootSetting(); + switch (event) { + case HandlerEnum.CHANGE_LAYOUT: + const { mode, type, split } = value; + let splitOpt = split === undefined ? { split } : {}; + if (type === MenuTypeEnum.MIX) { + splitOpt = { split: true }; + } else { + splitOpt = { split: false }; + } + + return { + menuSetting: { + mode, + type, + collapsed: false, + show: true, + hidden: false, + ...splitOpt, + }, + }; + + case HandlerEnum.CHANGE_THEME_COLOR: + if (getThemeColor.value === value) { + return {}; + } + changeTheme(value); + + return { themeColor: value }; + + case HandlerEnum.CHANGE_THEME: + if (getDarkMode.value === value) { + return {}; + } + updateDarkTheme(value); + + return {}; + + case HandlerEnum.CHANGE_SYS_BG: + return { sysBg: value }; + + case HandlerEnum.MENU_HAS_DRAG: + return { menuSetting: { canDrag: value } }; + + case HandlerEnum.MENU_ACCORDION: + return { menuSetting: { accordion: value } }; + + case HandlerEnum.MENU_TRIGGER: + return { menuSetting: { trigger: value } }; + + case HandlerEnum.MENU_TOP_ALIGN: + return { menuSetting: { topMenuAlign: value } }; + + case HandlerEnum.MENU_COLLAPSED: + return { menuSetting: { collapsed: value } }; + + case HandlerEnum.MENU_WIDTH: + return { menuSetting: { menuWidth: value } }; + + case HandlerEnum.MENU_SHOW_SIDEBAR: + return { menuSetting: { show: value } }; + + case HandlerEnum.MENU_COLLAPSED_SHOW_TITLE: + return { menuSetting: { collapsedShowTitle: value } }; + + case HandlerEnum.MENU_THEME: + updateSidebarBgColor(value); + return { menuSetting: { bgColor: value } }; + + case HandlerEnum.MENU_SPLIT: + return { menuSetting: { split: value } }; + + case HandlerEnum.MENU_CLOSE_MIX_SIDEBAR_ON_CHANGE: + return { menuSetting: { closeMixSidebarOnChange: value } }; + + case HandlerEnum.MENU_FIXED: + return { menuSetting: { fixed: value } }; + + case HandlerEnum.MENU_TRIGGER_MIX_SIDEBAR: + return { menuSetting: { mixSideTrigger: value } }; + + case HandlerEnum.MENU_FIXED_MIX_SIDEBAR: + return { menuSetting: { mixSideFixed: value } }; + + // ============transition================== + case HandlerEnum.OPEN_PAGE_LOADING: + appStore.setPageLoading(false); + return { transitionSetting: { openPageLoading: value } }; + + case HandlerEnum.ROUTER_TRANSITION: + return { transitionSetting: { basicTransition: value } }; + + case HandlerEnum.OPEN_ROUTE_TRANSITION: + return { transitionSetting: { enable: value } }; + + case HandlerEnum.OPEN_PROGRESS: + return { transitionSetting: { openNProgress: value } }; + // ============root================== + + case HandlerEnum.LOCK_TIME: + return { lockTime: value }; + + case HandlerEnum.FULL_CONTENT: + return { fullContent: value }; + + case HandlerEnum.CONTENT_MODE: + return { contentMode: value }; + + case HandlerEnum.SHOW_BREADCRUMB: + return { showBreadCrumb: value }; + + case HandlerEnum.SHOW_BREADCRUMB_ICON: + return { showBreadCrumbIcon: value }; + + case HandlerEnum.GRAY_MODE: + updateGrayMode(value); + return { grayMode: value }; + + case HandlerEnum.SHOW_FOOTER: + return { showFooter: value }; + + case HandlerEnum.COLOR_WEAK: + updateColorWeak(value); + return { colorWeak: value }; + // 页面缓存 + case HandlerEnum.OPEN_KEEP_ALIVE: + return { openKeepAlive: value }; + + case HandlerEnum.SHOW_LOGO: + return { showLogo: value }; + + // ============tabs================== + case HandlerEnum.TABS_SHOW_QUICK: + return { multiTabsSetting: { showQuick: value } }; + + case HandlerEnum.TABS_SHOW: + return { multiTabsSetting: { show: value } }; + case HandlerEnum.TABS_SHOW_ICON: + return { multiTabsSetting: { showIcon: value } }; + + case HandlerEnum.TABS_SHOW_REDO: + return { multiTabsSetting: { showRedo: value } }; + + case HandlerEnum.TABS_SHOW_FOLD: + return { multiTabsSetting: { showFold: value } }; + + // ============header================== + case HandlerEnum.HEADER_THEME: + updateHeaderBgColor(value); + return { headerSetting: { bgColor: value } }; + + case HandlerEnum.HEADER_SEARCH: + return { headerSetting: { showSearch: value } }; + + case HandlerEnum.HEADER_FIXED: + return { headerSetting: { fixed: value } }; + + case HandlerEnum.HEADER_SHOW: + return { headerSetting: { show: value } }; + default: + return {}; + } +} diff --git a/src/layouts/default/setting/index.vue b/src/layouts/default/setting/index.vue new file mode 100644 index 0000000..eceab0f --- /dev/null +++ b/src/layouts/default/setting/index.vue @@ -0,0 +1,24 @@ + + diff --git a/src/layouts/default/sider/DragBar.vue b/src/layouts/default/sider/DragBar.vue new file mode 100644 index 0000000..c581ba5 --- /dev/null +++ b/src/layouts/default/sider/DragBar.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/layouts/default/sider/LayoutSider.vue b/src/layouts/default/sider/LayoutSider.vue new file mode 100644 index 0000000..f6e8bc7 --- /dev/null +++ b/src/layouts/default/sider/LayoutSider.vue @@ -0,0 +1,192 @@ + + + diff --git a/src/layouts/default/sider/MixSider.vue b/src/layouts/default/sider/MixSider.vue new file mode 100644 index 0000000..332817d --- /dev/null +++ b/src/layouts/default/sider/MixSider.vue @@ -0,0 +1,562 @@ + + + diff --git a/src/layouts/default/sider/index.vue b/src/layouts/default/sider/index.vue new file mode 100644 index 0000000..1e5a521 --- /dev/null +++ b/src/layouts/default/sider/index.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/layouts/default/sider/useLayoutSider.ts b/src/layouts/default/sider/useLayoutSider.ts new file mode 100644 index 0000000..86300bd --- /dev/null +++ b/src/layouts/default/sider/useLayoutSider.ts @@ -0,0 +1,137 @@ +import type { Ref } from 'vue'; + +import { computed, unref, onMounted, nextTick } from 'vue'; + +import { TriggerEnum } from '@/enums/menuEnum'; + +import { useMenuSetting } from '@/hooks/setting/useMenuSetting'; +import { useDebounceFn } from '@vueuse/core'; +import { useAppStore } from '@/store/modules/app'; + +/** + * Handle related operations of menu events + */ +export function useSiderEvent() { + const appStore = useAppStore(); + const { getMiniWidthNumber } = useMenuSetting(); + + const getCollapsedWidth = computed(() => { + return unref(getMiniWidthNumber); + }); + + function onBreakpointChange(broken: boolean) { + appStore.setProjectConfig({ + menuSetting: { + siderHidden: broken, + }, + }); + } + + return { getCollapsedWidth, onBreakpointChange }; +} + +/** + * Handle related operations of menu folding + */ +export function useTrigger(getIsMobile: Ref) { + const { getTrigger, getSplit } = useMenuSetting(); + + const getShowTrigger = computed(() => { + const trigger = unref(getTrigger); + + return trigger !== TriggerEnum.NONE && !unref(getIsMobile) && (trigger === TriggerEnum.FOOTER || unref(getSplit)); + }); + + const getTriggerAttr = computed(() => { + if (unref(getShowTrigger)) { + return {}; + } + return { + trigger: null, + }; + }); + + return { getTriggerAttr, getShowTrigger }; +} + +/** + * Handle menu drag and drop related operations + * @param siderRef + * @param dragBarRef + */ +export function useDragLine(siderRef: Ref, dragBarRef: Ref, mix = false) { + const { getMiniWidthNumber, getCollapsed, setMenuSetting } = useMenuSetting(); + + onMounted(() => { + nextTick(() => { + const exec = useDebounceFn(changeWrapWidth, 80); + exec(); + }); + }); + + function getEl(elRef: Ref): any { + const el = unref(elRef); + if (!el) return null; + if (Reflect.has(el, '$el')) { + return (unref(elRef) as ComponentRef)?.$el; + } + return unref(elRef); + } + + function handleMouseMove(ele: HTMLElement, wrap: HTMLElement, clientX: number) { + document.onmousemove = function (innerE) { + let iT = (ele as any).left + (innerE.clientX - clientX); + innerE = innerE || window.event; + const maxT = 800; + const minT = unref(getMiniWidthNumber); + iT < 0 && (iT = 0); + iT > maxT && (iT = maxT); + iT < minT && (iT = minT); + ele.style.left = wrap.style.width = iT + 'px'; + return false; + }; + } + + // Drag and drop in the menu area-release the mouse + function removeMouseup(ele: any) { + const wrap = getEl(siderRef); + document.onmouseup = function () { + document.onmousemove = null; + document.onmouseup = null; + wrap.style.transition = 'width 0.2s'; + const width = parseInt(wrap.style.width); + + if (!mix) { + const miniWidth = unref(getMiniWidthNumber); + if (!unref(getCollapsed)) { + width > miniWidth + 20 ? setMenuSetting({ menuWidth: width }) : setMenuSetting({ collapsed: true }); + } else { + width > miniWidth && setMenuSetting({ collapsed: false, menuWidth: width }); + } + } else { + setMenuSetting({ menuWidth: width }); + } + + ele.releaseCapture?.(); + }; + } + + function changeWrapWidth() { + const ele = getEl(dragBarRef); + if (!ele) return; + const wrap = getEl(siderRef); + if (!wrap) return; + + ele.onmousedown = (e: any) => { + wrap.style.transition = 'unset'; + const clientX = e?.clientX; + ele.left = ele.offsetLeft; + handleMouseMove(ele, wrap, clientX); + removeMouseup(ele); + ele.setCapture?.(); + return false; + }; + } + + return {}; +} diff --git a/src/layouts/default/tabs/components/FoldButton.vue b/src/layouts/default/tabs/components/FoldButton.vue new file mode 100644 index 0000000..3107e9c --- /dev/null +++ b/src/layouts/default/tabs/components/FoldButton.vue @@ -0,0 +1,40 @@ + + diff --git a/src/layouts/default/tabs/components/TabContent.vue b/src/layouts/default/tabs/components/TabContent.vue new file mode 100644 index 0000000..c72c9aa --- /dev/null +++ b/src/layouts/default/tabs/components/TabContent.vue @@ -0,0 +1,72 @@ + + diff --git a/src/layouts/default/tabs/components/TabRedo.vue b/src/layouts/default/tabs/components/TabRedo.vue new file mode 100644 index 0000000..86ff04a --- /dev/null +++ b/src/layouts/default/tabs/components/TabRedo.vue @@ -0,0 +1,33 @@ + + diff --git a/src/layouts/default/tabs/index.less b/src/layouts/default/tabs/index.less new file mode 100644 index 0000000..538cd5e --- /dev/null +++ b/src/layouts/default/tabs/index.less @@ -0,0 +1,202 @@ +@prefix-cls: ~'@{namespace}-multiple-tabs'; + +html[data-theme='dark'] { + .@{prefix-cls} { + background-color: transparent; + .ant-tabs-nav-list { + background-color: #2c2c2c !important; + } + + .ant-tabs-tab { + background-color: #2c2c2c; + } + .ant-tabs-tab-active { + background-color: #000 !important; + } + .ant-tabs-nav-operations, + .ant-tabs-extra-content { + background-color: #2c2c2c !important; + } + } +} + +.@{prefix-cls} { + z-index: 10; + height: @multiple-height; + line-height: @multiple-height; + padding: 0 10px; + + .ant-tabs-small { + height: @multiple-height; + } + + .ant-tabs.ant-tabs-card { + .ant-tabs-nav { + height: @multiple-height; + margin: 0; + border: 0; + box-shadow: none; + &::before { + display: none; + } + .ant-tabs-nav-wrap { + border-radius: calc(@multiple-height / 2); + &.ant-tabs-nav-wrap-ping-left, + &.ant-tabs-nav-wrap-ping-right { + border-radius: calc(@multiple-height / 2) 0 0 calc(@multiple-height / 2); + .ant-tabs-nav-list { + border-radius: calc(@multiple-height / 2) 0 0 calc(@multiple-height / 2); + } + } + .ant-tabs-nav-list { + background: rgba(255, 255, 255, 0.4); + border-radius: calc(@multiple-height / 2); + } + } + + .ant-tabs-nav-container { + height: @multiple-height; + padding-top: 2px; + } + .ant-tabs-nav-operations { + border-radius: 0 calc(@multiple-height / 2) calc(@multiple-height / 2) 0; + background: rgba(255, 255, 255, 0.4); + } + .ant-tabs-extra-content { + margin-left: 10px; + border-radius: 0 calc(@multiple-height / 2) calc(@multiple-height / 2) 0; + border-radius: calc(@multiple-height / 2); + background: rgba(255, 255, 255, 0.4); + } + + .ant-tabs-tab { + height: @multiple-height; + padding: 0 18px; + line-height: @multiple-height; + color: @text-color-base; + background-color: transparent; + border: none; + transition: none; + font-size: 14px; + border-radius: 20px; + overflow: hidden; + svg { + width: 0.8em; + } + .ant-tabs-tab-remove { + margin: 0 0 0 4px; + } + &.ant-tabs-tab-active { + position: relative; + padding-left: 18px; + background-color: rgba(255, 255, 255, 0.4); + border: none; + transition: none; + svg { + fill: @primary-color; + } + .ant-tabs-tab-remove { + opacity: 1; + } + } + } + + .ant-tabs-tab:not(.ant-tabs-tab-active) { + &:hover { + color: @primary-color; + svg { + fill: @primary-color; + } + } + } + } + } + + .ant-dropdown-trigger { + display: inline-flex; + } + + &--hide-close { + .ant-tabs-tab-remove { + opacity: 0 !important; + } + } + + &-content { + &__extra-quick, + &__extra-redo, + &__extra-fold { + display: inline-block; + width: 40px; + font-size: 16px; + height: @multiple-height; + line-height: @multiple-height; + text-align: center; + cursor: pointer; + + &:hover { + color: @text-color-base; + } + + span[role='img'] { + transform: rotate(90deg); + } + } + &__extra-quick { + padding-right: 8px; + font-weight: 600; + } + + &__extra-redo { + padding-left: 8px; + span[role='img'] { + transform: rotate(0deg); + } + } + + &__info { + display: inline-block; + width: 100%; + height: @multiple-height; + font-size: 14px; + cursor: pointer; + user-select: none; + } + &__icon { + display: inline-block; + font-size: 16px; + } + } +} + +.ant-tabs-dropdown-menu { + &-title-content { + display: flex; + align-items: center; + + .@{prefix-cls} { + &-content__info { + width: auto; + margin-left: 0; + line-height: 28px; + height: 28px; + } + } + .anticon-close { + margin-left: 4px; + svg { + width: 0.8em; + } + } + } + + &-item-remove { + margin-left: auto; + } +} + +.multiple-tabs__dropdown { + .ant-dropdown-content { + width: 172px; + } +} diff --git a/src/layouts/default/tabs/index.vue b/src/layouts/default/tabs/index.vue new file mode 100644 index 0000000..468cf3c --- /dev/null +++ b/src/layouts/default/tabs/index.vue @@ -0,0 +1,137 @@ + + + diff --git a/src/layouts/default/tabs/types.ts b/src/layouts/default/tabs/types.ts new file mode 100644 index 0000000..f692869 --- /dev/null +++ b/src/layouts/default/tabs/types.ts @@ -0,0 +1,26 @@ +import type { DropMenu } from '@/components/Dropdown/index'; +import type { RouteLocationNormalized } from 'vue-router'; + +export enum TabContentEnum { + TAB_TYPE, + EXTRA_TYPE, +} + +export type { DropMenu }; + +export interface TabContentProps { + tabItem: RouteLocationNormalized; + type?: TabContentEnum; + trigger?: ('click' | 'hover' | 'contextmenu')[]; +} + +export enum MenuEventEnum { + REFRESH_PAGE, + CLOSE_CURRENT, + CLOSE_LEFT, + CLOSE_RIGHT, + CLOSE_OTHER, + CLOSE_ALL, + SCALE, + SET_COMMON, +} diff --git a/src/layouts/default/tabs/useMultipleTabs.ts b/src/layouts/default/tabs/useMultipleTabs.ts new file mode 100644 index 0000000..4b67dd7 --- /dev/null +++ b/src/layouts/default/tabs/useMultipleTabs.ts @@ -0,0 +1,79 @@ +import { toRaw, ref, nextTick } from 'vue'; +import type { RouteLocationNormalized } from 'vue-router'; +import { useDesign } from '@/hooks/web/useDesign'; +import { useSortable } from '@/hooks/web/useSortable'; +import { useMultipleTabStore } from '@/store/modules/multipleTab'; +import { isNullAndUnDef } from '@/utils/is'; +import projectSetting from '@/settings/projectSetting'; +import { useRouter } from 'vue-router'; + +export function initAffixTabs(): string[] { + const affixList = ref([]); + + const tabStore = useMultipleTabStore(); + const router = useRouter(); + /** + * @description: Filter all fixed routes + */ + function filterAffixTabs(routes: RouteLocationNormalized[]) { + const tabs: RouteLocationNormalized[] = []; + routes && + routes.forEach(route => { + if (route.meta && route.meta.affix) { + tabs.push(toRaw(route)); + } + }); + return tabs; + } + + /** + * @description: Set fixed tabs + */ + function addAffixTabs(): void { + const affixTabs = filterAffixTabs(router.getRoutes() as unknown as RouteLocationNormalized[]); + affixList.value = affixTabs; + for (const tab of affixTabs) { + tabStore.addTab({ + meta: tab.meta, + name: tab.name, + path: tab.path, + } as unknown as RouteLocationNormalized); + } + } + + let isAddAffix = false; + + if (!isAddAffix) { + addAffixTabs(); + isAddAffix = true; + } + return affixList.value.map(item => item.meta?.title).filter(Boolean) as string[]; +} + +export function useTabsDrag(affixTextList: string[]) { + return; + const tabStore = useMultipleTabStore(); + const { multiTabsSetting } = projectSetting; + const { prefixCls } = useDesign('multiple-tabs'); + nextTick(() => { + if (!multiTabsSetting.canDrag) return; + const el = document.querySelectorAll(`.${prefixCls} .ant-tabs-nav-wrap > div`)?.[0] as HTMLElement; + const { initSortable } = useSortable(el, { + filter: (e: ChangeEvent) => { + const text = e?.target?.innerText; + if (!text) return false; + return affixTextList.includes(text); + }, + onEnd: evt => { + const { oldIndex, newIndex } = evt; + + if (isNullAndUnDef(oldIndex) || isNullAndUnDef(newIndex) || oldIndex === newIndex) { + return; + } + + tabStore.sortTabs(oldIndex, newIndex); + }, + }); + initSortable(); + }); +} diff --git a/src/layouts/default/tabs/useTabDropdown.ts b/src/layouts/default/tabs/useTabDropdown.ts new file mode 100644 index 0000000..388f443 --- /dev/null +++ b/src/layouts/default/tabs/useTabDropdown.ts @@ -0,0 +1,162 @@ +import type { TabContentProps } from './types'; +import type { DropMenu } from '@/components/Dropdown'; +import type { ComputedRef } from 'vue'; + +import { computed, unref, reactive } from 'vue'; +import { MenuEventEnum } from './types'; +import { useMultipleTabStore } from '@/store/modules/multipleTab'; +import { RouteLocationNormalized, useRouter } from 'vue-router'; +import { useTabs } from '@/hooks/web/useTabs'; +import { useI18n } from '@/hooks/web/useI18n'; +import { useMessage } from '@/hooks/web/useMessage'; +import { create } from '@/api/system/commonMenu'; + +const { createMessage } = useMessage(); + +export function useTabDropdown(tabContentProps: TabContentProps, getIsTabs: ComputedRef) { + const state = reactive({ + current: null as Nullable, + currentIndex: 0, + }); + + const { t } = useI18n(); + const tabStore = useMultipleTabStore(); + const { currentRoute } = useRouter(); + const { refreshPage, closeAll, close, closeLeft, closeOther, closeRight } = useTabs(); + + const getTargetTab = computed((): RouteLocationNormalized => { + return unref(getIsTabs) ? tabContentProps.tabItem : unref(currentRoute); + }); + + /** + * @description: drop-down list + */ + const getDropMenuList = computed(() => { + if (!unref(getTargetTab)) { + return; + } + const { meta } = unref(getTargetTab); + const { path } = unref(currentRoute); + + const curItem = state.current; + + const isCurItem = curItem ? curItem.path === path : false; + + // Refresh button + const index = state.currentIndex; + const refreshDisabled = !isCurItem; + // Close left + const closeLeftDisabled = index === 0 || !isCurItem; + + const disabled = tabStore.getTabList.length === 1; + + // Close right + const closeRightDisabled = !isCurItem || (index === tabStore.getTabList.length - 1 && tabStore.getLastDragEndIndex >= 0); + const dropMenuList: DropMenu[] = [ + { + icon: 'ion:reload-sharp', + event: MenuEventEnum.REFRESH_PAGE, + text: t('layout.multipleTab.reload'), + disabled: refreshDisabled, + }, + { + icon: 'clarity:close-line', + event: MenuEventEnum.CLOSE_CURRENT, + text: t('layout.multipleTab.close'), + disabled: !!meta?.affix || disabled, + divider: true, + }, + { + icon: 'line-md:arrow-close-left', + event: MenuEventEnum.CLOSE_LEFT, + text: t('layout.multipleTab.closeLeft'), + disabled: closeLeftDisabled, + divider: false, + }, + { + icon: 'line-md:arrow-close-right', + event: MenuEventEnum.CLOSE_RIGHT, + text: t('layout.multipleTab.closeRight'), + disabled: closeRightDisabled, + divider: true, + }, + { + icon: 'dashicons:align-center', + event: MenuEventEnum.CLOSE_OTHER, + text: t('layout.multipleTab.closeOther'), + disabled: disabled || !isCurItem, + }, + { + icon: 'clarity:minus-line', + event: MenuEventEnum.CLOSE_ALL, + text: t('layout.multipleTab.closeAll'), + disabled: disabled, + divider: true, + }, + { + icon: '', + event: MenuEventEnum.SET_COMMON, + text: t('layout.multipleTab.setCommon'), + disabled: !meta?.modelId, + }, + ]; + + return dropMenuList; + }); + + function handleContextMenu(tabItem: RouteLocationNormalized) { + return (e: Event) => { + if (!tabItem) { + return; + } + e?.preventDefault(); + const index = tabStore.getTabList.findIndex(tab => tab.path === tabItem.path); + state.current = tabItem; + state.currentIndex = index; + }; + } + + function setCommonMenu() { + const modelId = tabContentProps.tabItem?.meta?.modelId || ''; + if (!modelId) return; + create(modelId).then(res => { + createMessage.success(res.msg); + }); + } + + // Handle right click event + function handleMenuEvent(menu: DropMenu): void { + const { event } = menu; + switch (event) { + case MenuEventEnum.SET_COMMON: + // 设为常用 + setCommonMenu(); + break; + case MenuEventEnum.REFRESH_PAGE: + // refresh page + refreshPage(); + break; + // Close current + case MenuEventEnum.CLOSE_CURRENT: + close(tabContentProps.tabItem); + break; + // Close left + case MenuEventEnum.CLOSE_LEFT: + closeLeft(); + break; + // Close right + case MenuEventEnum.CLOSE_RIGHT: + closeRight(); + break; + // Close other + case MenuEventEnum.CLOSE_OTHER: + closeOther(); + break; + // Close all + case MenuEventEnum.CLOSE_ALL: + closeAll(); + break; + } + } + return { getDropMenuList, handleMenuEvent, handleContextMenu }; +} diff --git a/src/layouts/default/trigger/HeaderTrigger.vue b/src/layouts/default/trigger/HeaderTrigger.vue new file mode 100644 index 0000000..8741c84 --- /dev/null +++ b/src/layouts/default/trigger/HeaderTrigger.vue @@ -0,0 +1,19 @@ + + diff --git a/src/layouts/default/trigger/SiderTrigger.vue b/src/layouts/default/trigger/SiderTrigger.vue new file mode 100644 index 0000000..fafcadc --- /dev/null +++ b/src/layouts/default/trigger/SiderTrigger.vue @@ -0,0 +1,21 @@ + + diff --git a/src/layouts/default/trigger/index.vue b/src/layouts/default/trigger/index.vue new file mode 100644 index 0000000..759ae76 --- /dev/null +++ b/src/layouts/default/trigger/index.vue @@ -0,0 +1,15 @@ + + diff --git a/src/layouts/iframe/index.vue b/src/layouts/iframe/index.vue new file mode 100644 index 0000000..247168b --- /dev/null +++ b/src/layouts/iframe/index.vue @@ -0,0 +1,25 @@ + + diff --git a/src/layouts/iframe/useFrameKeepAlive.ts b/src/layouts/iframe/useFrameKeepAlive.ts new file mode 100644 index 0000000..2c295cc --- /dev/null +++ b/src/layouts/iframe/useFrameKeepAlive.ts @@ -0,0 +1,59 @@ +import type { AppRouteRecordRaw } from '@/router/types'; + +import { computed, toRaw, unref } from 'vue'; + +import { useMultipleTabStore } from '@/store/modules/multipleTab'; + +import { uniqBy } from 'lodash-es'; + +import { useMultipleTabSetting } from '@/hooks/setting/useMultipleTabSetting'; + +import { useRouter } from 'vue-router'; + +export function useFrameKeepAlive() { + const router = useRouter(); + const { currentRoute } = router; + const { getShowMultipleTab } = useMultipleTabSetting(); + const tabStore = useMultipleTabStore(); + const getFramePages = computed(() => { + const ret = getAllFramePages(toRaw(router.getRoutes()) as unknown as AppRouteRecordRaw[]) || []; + return ret; + }); + + const getOpenTabList = computed((): string[] => { + return tabStore.getTabList.reduce((prev: string[], next) => { + if (next.meta && Reflect.has(next.meta, 'frameSrc')) { + prev.push(next.name as string); + } + return prev; + }, []); + }); + + function getAllFramePages(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[] { + let res: AppRouteRecordRaw[] = []; + for (const route of routes) { + const { meta: { frameSrc } = {}, children } = route; + if (frameSrc) { + res.push(route); + } + if (children && children.length) { + res.push(...getAllFramePages(children)); + } + } + res = uniqBy(res, 'name'); + return res; + } + + function showIframe(item: AppRouteRecordRaw) { + return item.name === unref(currentRoute).name; + } + + function hasRenderFrame(name: string) { + if (!unref(getShowMultipleTab)) { + return router.currentRoute.value.name === name; + } + return unref(getOpenTabList).includes(name); + } + + return { hasRenderFrame, getFramePages, showIframe, getAllFramePages }; +} diff --git a/src/layouts/page/index.vue b/src/layouts/page/index.vue new file mode 100644 index 0000000..8436ef0 --- /dev/null +++ b/src/layouts/page/index.vue @@ -0,0 +1,56 @@ + + + diff --git a/src/layouts/page/transition.ts b/src/layouts/page/transition.ts new file mode 100644 index 0000000..9e93009 --- /dev/null +++ b/src/layouts/page/transition.ts @@ -0,0 +1,33 @@ +import type { FunctionalComponent } from 'vue'; +import type { RouteLocation } from 'vue-router'; + +export interface DefaultContext { + Component: FunctionalComponent & { type: Recordable }; + route: RouteLocation; +} + +export function getTransitionName({ + route, + openCache, + cacheTabs, + enableTransition, + def, +}: Pick & { + enableTransition: boolean; + openCache: boolean; + def: string; + cacheTabs: string[]; +}): string | undefined { + if (!enableTransition) { + return undefined; + } + + const isInCache = cacheTabs.includes(route.name as string); + const transitionName = 'fade-slide'; + let name: string | undefined = transitionName; + + if (openCache) { + name = isInCache && route.meta.loaded ? transitionName : undefined; + } + return name || (route.meta.transitionName as string) || def; +} diff --git a/src/locales/helper.ts b/src/locales/helper.ts new file mode 100644 index 0000000..d72bbfc --- /dev/null +++ b/src/locales/helper.ts @@ -0,0 +1,50 @@ +import type { LocaleType } from '#/config'; + +import { set } from 'lodash-es'; + +export const loadLocalePool: LocaleType[] = []; + +export function setHtmlPageLang(locale: LocaleType) { + document.querySelector('html')?.setAttribute('lang', locale); +} + +export function setLoadLocalePool(cb: (loadLocalePool: LocaleType[]) => void) { + cb(loadLocalePool); +} + +export function genMessage(langs: Record>, prefix = 'lang') { + const obj: Recordable = {}; + + Object.keys(langs).forEach(key => { + const langFileModule = langs[key].default; + let fileName = key.replace(`./${prefix}/`, '').replace(/^\.\//, ''); + const lastIndex = fileName.lastIndexOf('.'); + fileName = fileName.substring(0, lastIndex); + const keyList = fileName.split('/'); + const moduleName = keyList.shift(); + const objKey = keyList.join('.'); + + if (moduleName) { + if (objKey) { + set(obj, moduleName, obj[moduleName] || {}); + set(obj[moduleName], objKey, langFileModule); + } else { + set(obj, moduleName, langFileModule || {}); + } + } + }); + return obj; +} +export function flattenObject(obj, prefix = '') { + return Object.keys(obj).reduce((acc, key) => { + const fullPath = prefix ? `${prefix}.${key}` : key; // 构建新的路径 + if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) { + // 如果当前属性是对象,且不是数组,继续递归 + Object.assign(acc, flattenObject(obj[key], fullPath)); + } else { + // 否则,直接设置路径和值 + acc[fullPath] = obj[key]; + } + return acc; + }, {}); +} diff --git a/src/locales/lang/en_US.json b/src/locales/lang/en_US.json new file mode 100644 index 0000000..fc146d2 --- /dev/null +++ b/src/locales/lang/en_US.json @@ -0,0 +1,774 @@ +{ + "common": { + "okText": "OK", + "continueText": "OK & Continue", + "continueAndAddText": "OK & Add", + "closeText": "Close", + "cancelText": "Cancel", + "loadingText": "Loading...", + "saveText": "Save", + "delText": "Delete", + "resetText": "Reset", + "searchText": "Search", + "queryText": "Search", + "addText": "Add", + "add1Text": "Add", + "add2Text": "Add", + "editText": "Edit", + "detailText": "Detail", + "moreText": "More", + "exportText": "Export", + "importText": "Import", + "copyText": "Copy", + "printText": "Print", + "batchPrintText": "Batch Print", + "batchDelText": "Batch Delete", + "previewText": "Preview", + "submitText": "Submit", + "syncText": "Sync", + "cleanText": "Clean Up", + "closeList": "Close List", + "inputText": "Please enter", + "chooseText": "Please select", + "inputTextPrefix": "Please enter ", + "chooseTextPrefix": "Please select ", + "redo": "Refresh", + "back": "Back", + "expandAll": "Expand All", + "collapseAll": "Collapse All", + "superQuery": "Super Query", + "light": "Light", + "dark": "Dark", + "tipTitle": "Tips", + "delTip": "This operation will permanently delete the data. Do you want to continue?", + "batchDelTip": "Are you sure you want to delete these data? Do you want to continue?", + "selectDataTip": "Please select a piece of data", + "prev": "Prev", + "next": "Next", + "prevRecord": "Prev", + "nextRecord": "Next", + "keyword": "Keyword", + "enterKeyword": "Please Enter", + "leftTreeSearchText": "Enter Keyword", + "drawerSearchText": "Please Enter Keyword", + "inputPlaceholder": "Please enter", + "selectPlaceholder": "Please select", + "selectI18nCode": "Select translation markers", + "undoText": "undo", + "redoText": "redo", + "noData": "No Data", + "updateView": "Update View", + "addView": "Add View" + }, + "component": { + "app": { + "searchNotData": "No search results yet", + "toSearch": "to search", + "toNavigate": "to navigate" + }, + "countdown": { + "normalText": "Get SMS code", + "sendText": "Reacquire in {0}s" + }, + "cropper": { + "selectImage": "Select Image", + "uploadSuccess": "Uploaded success!", + "modalTitle": "Avatar upload", + "okText": "Confirm and upload", + "btn_reset": "Reset", + "btn_rotate_left": "Counterclockwise rotation", + "btn_rotate_right": "Clockwise rotation", + "btn_scale_x": "Flip horizontal", + "btn_scale_y": "Flip vertical", + "btn_zoom_in": "Zoom in", + "btn_zoom_out": "Zoom out", + "preview": "Preivew" + }, + "drawer": { + "loadingText": "Loading...", + "cancelText": "Close", + "okText": "Confirm" + }, + "excel": { + "exportModalTitle": "Export data", + "fileType": "File type", + "fileName": "File name" + }, + "form": { + "fold": "Fold", + "unfold": "Unfold", + "maxTip": "The number of characters should be less than {0}", + "apiSelectNotFound": "Wait for data loading to complete..." + }, + "icon": { + "placeholder": "Click the select icon", + "search": "Search icon", + "copy": "Copy icon successfully!" + }, + "menu": { + "search": "Menu search" + }, + "modal": { + "cancelText": "Close", + "okText": "Confirm", + "close": "Close", + "maximize": "Maximize", + "restore": "Restore" + }, + "table": { + "settingDens": "Density", + "settingDensDefault": "Default", + "settingDensMiddle": "Middle", + "settingDensSmall": "Compact", + "viewList": "View", + "viewSetting": "View settings", + "settingColumn": "Column settings", + "settingColumnShow": "Column display", + "settingIndexColumnShow": "Index Column", + "settingSelectColumnShow": "Selection Column", + "settingFixedLeft": "Fixed Left", + "settingFixedRight": "Fixed Right", + "settingFullScreen": "Full Screen", + "index": "No.", + "status": "Status", + "action": "Action", + "summary": "Total", + "total": "total of {total}" + }, + "time": { + "before": " ago", + "after": " after", + "just": "just now", + "seconds": " seconds", + "minutes": " minutes", + "hours": " hours", + "days": " days" + }, + "tree": { + "reload": "Reload", + "selectAll": "Select All", + "unSelectAll": "Cancel Select", + "expandAll": "Expand All", + "unExpandAll": "Collapse all", + "checkStrictly": "Hierarchical association", + "checkUnStrictly": "Hierarchical independence" + }, + "upload": { + "save": "Save", + "upload": "Upload", + "buttonText": "Upload", + "imgUpload": "ImageUpload", + "imgDragger": "Click or drag image to this area to upload", + "uploaded": "Uploaded", + "operating": "Operating", + "del": "Delete", + "download": "Download", + "downloadAll": "Download all", + "saveWarn": "Please wait for the file to upload and save!", + "saveError": "There is no file successfully uploaded and cannot be saved!", + "preview": "Preview", + "choose": "Select the file", + "accept": "Support {0} format", + "acceptUpload": "Only upload files in {0} format", + "maxSize": "A single file does not exceed {0}MB ", + "maxSizeMultiple": "Only upload files up to {0}MB!", + "maxNumber": "Only upload up to {0} files", + "legend": "Legend", + "fileName": "File name", + "fileSize": "File size", + "fileStatue": "File status", + "startUpload": "Start upload", + "uploadSuccess": "Upload successfully", + "uploadError": "Upload failed", + "uploading": "Uploading", + "paused": "Paused", + "waiting": "Waiting", + "checking": "Checking", + "uploadWait": "Please wait for the file upload to finish", + "reUploadFailed": "Re-upload failed files", + "uploadImg": "Please upload Image", + "viewImage": "View Image", + "view": "View", + "imageMaxNumber": "Up to {0} images can be uploaded", + "imageMaxSize": "Image size exceeds {size}{unit}", + "fileMaxNumber": "Up to {0} files can be uploaded", + "fileMaxSize": "File size exceeds {size}{unit}", + "fileTypeCheck": "Please select a file of {0} type", + "fileReadError": "File {0} reading error, please check the file", + "videoNoPreview": "Audio and video files cannot be previewed", + "zipNoPreview": "Compressed package cannot be previewed", + "image": "image", + "video": "video", + "audio": "audio" + }, + "verify": { + "error": "verification failed!", + "time": "The verification is successful and it takes {time} seconds!", + "redoTip": "Click the picture to refresh", + "dragText": "Hold down the slider and drag", + "successText": "Verified" + }, + "yunzhupaas": { + "common": { + "allData": "All data", + "selected": "Selected", + "clearAll": "Clear all", + "autoGenerate": "Automatically generated by the system" + }, + "areaSelect": { + "modalTitle": "Select area" + }, + "calculate": { + "storage": "The data will also be saved and stored in the database", + "unStorage": "The data will not be saved" + }, + "dateRange": { + "startPlaceholder": "Start date", + "endPlaceholder": "End date" + }, + "timeRange": { + "startPlaceholder": "Start time", + "endPlaceholder": "End time" + }, + "iconPicker": { + "select": "Select", + "modalTitle": "Select icon", + "searchPlaceholder": "Please Enter Keyword", + "ymIcon": "ymIcon icon", + "ymCustom": "ymCustom icon" + }, + "location": { + "modalTitle": "Select position", + "searchPlaceholder": "Enter or click to select on the map", + "relocation": "Relocation", + "location": "Location" + }, + "numberRange": { + "min": "Min", + "max": "Max" + }, + "organizeSelect": { + "modalTitle": "Select organize" + }, + "depSelect": { + "modalTitle": "Select department" + }, + "posSelect": { + "modalTitle": "Select position" + }, + "roleSelect": { + "modalTitle": "Select role" + }, + "groupSelect": { + "modalTitle": "Select group" + }, + "userSelect": { + "modalTitle": "Select user" + }, + "popupAttr": { + "storage": "The data will also be saved and stored in the database", + "unStorage": "The data will not be saved" + }, + "popupSelect": { + "modalTitle": "Select data" + }, + "relationFormAttr": { + "storage": "The data will also be saved and stored in the database", + "unStorage": "The data will not be saved" + }, + "sign": { + "signTip": "signature", + "signPlaceholder": "Please signature", + "operateTip": "Please use the mouse to handwrite your signature in this area" + } + } + }, + "layout": { + "footer": { + "onlinePreview": "Preview", + "onlineDocument": "Document" + }, + "header": { + "dropdownItemDoc": "Document", + "dropdownItemLoginOut": "Login Out", + "systemChange": "Toggle App", + "standingChange": "Toggle Standing", + "profile": "Profile", + "feedback": "Feedback", + "about": "About", + "statement": "Statement", + "commonMenus": "Common Menus", + "tooltipErrorLog": "Error log", + "tooltipLock": "Lock screen", + "tooltipNotify": "Notification", + "tooltipChat": "Chat", + "tooltipEntryFull": "Full Screen", + "tooltipExitFull": "Exit Full Screen", + "setting": "Setting", + "lockScreenPassword": "Lock screen password", + "lockScreen": "Lock screen", + "lockScreenBtn": "Locking", + "home": "Home" + }, + "multipleTab": { + "setCommon": "Set Common", + "reload": "Refresh current", + "close": "Close current", + "closeLeft": "Close Left", + "closeRight": "Close Right", + "closeOther": "Close Other", + "closeAll": "Close All" + }, + "setting": { + "contentModeFull": "Full", + "contentModeFixed": "Fixed width", + "topMenuAlignLeft": "Left", + "topMenuAlignRight": "Center", + "topMenuAlignCenter": "Right", + "menuTriggerNone": "Not Show", + "menuTriggerBottom": "Bottom", + "menuTriggerTop": "Top", + "menuTypeSidebar": "Left menu mode", + "menuTypeMixSidebar": "Left mixed mode", + "menuTypeMix": "Top Mix mode", + "menuTypeTopMenu": "Top menu mode", + "defaultBg": "Default", + "blueBg": "Blue", + "purpleBg": "Purple", + "greenBg": "Green", + "on": "On", + "off": "Off", + "minute": "Minute", + "operatingTitle": "Successful!", + "operatingContent": "The copy is successful, please go to src/settings/projectSetting.ts to modify the configuration!", + "resetSuccess": "Successfully reset!", + "copyBtn": "Copy", + "clearBtn": "Clear cache and to the login page", + "drawerTitle": "Configuration", + "darkMode": "Dark mode", + "navMode": "Navigation mode", + "systemBackground": "System background", + "interfaceFunction": "Interface function", + "interfaceDisplay": "Interface display", + "animation": "Animation", + "splitMenu": "Split menu", + "closeMixSidebarOnChange": "Switch page to close menu", + "sysTheme": "System theme", + "headerTheme": "Header theme", + "sidebarTheme": "Menu theme", + "menuDrag": "Drag Sidebar", + "menuSearch": "Menu search", + "toggleLocale": "Locale Toggle", + "menuAccordion": "Sidebar accordion", + "menuCollapse": "Collapse menu", + "collapseMenuDisplayName": "Collapse menu display name", + "topMenuLayout": "Top menu layout", + "menuCollapseButton": "Menu collapse button", + "contentMode": "Content area width", + "expandedMenuWidth": "Expanded menu width", + "breadcrumb": "Breadcrumbs", + "breadcrumbIcon": "Breadcrumbs Icon", + "tabs": "Tabs", + "tabsIcon": "Tabs Icon", + "tabDetail": "Tab Detail", + "tabsQuickBtn": "Tabs quick button", + "tabsRedoBtn": "Tabs redo button", + "tabsFoldBtn": "Tabs flod button", + "sidebar": "Sidebar", + "header": "Header", + "footer": "Footer", + "fullContent": "Full content", + "grayMode": "Gray mode", + "colorWeak": "Color Weak Mode", + "cachePage": "Cache Page", + "progress": "Progress", + "switchLoading": "Switch Loading", + "switchAnimation": "Switch animation", + "animationType": "Animation type", + "autoScreenLock": "Auto screen lock", + "notAutoScreenLock": "Not auto lock", + "fixedHeader": "Fixed header", + "fixedSideBar": "Fixed Sidebar", + "mixSidebarTrigger": "Mixed menu Trigger", + "triggerHover": "Hover", + "triggerClick": "Click", + "mixSidebarFixed": "Fixed expanded menu" + } + }, + "routes": { + "basic": { + "login": "Login", + "errorLogList": "Error Log", + "home": "Home", + "externalLink": "ExternalLink", + "workFlowDetail": "WorkFlow Detail", + "emailDetail": "Email Detail", + "previewModel": "Model Preview", + "dataManage": "Data Management" + }, + "mainSystem": "MainSystem", + "workSystem": "WorkSystem", + "onlineDev": "OnlineDev", + "onlineDev-webDesign": "FormDesign", + "onlineDev-appDesign": "APPDesign", + "onlineDev-report": "Report", + "onlineDev-dataReport": "DataReport(past)", + "onlineDev-dataScreen": "DataScreen", + "onlineDev-visualPortal": "VisualPortal", + "onlineDev-integration": "Integration", + "onlineDev-printDev": "PrintDesign", + "generator": "Generator", + "generator-webForm": "WebForm", + "generator-appForm": "AppForm", + "generator-flowForm": "FlowForm", + "system": "System", + "system-sysConfig": "SysConfig", + "system-notice": "Notice", + "system-task": "Task", + "system-cache": "CacheManage", + "system-log": "Log", + "system-monitor": "Monitor", + "system-icons": "Icons", + "system-language": "Language", + "system-menu": "Menu", + "system-area": "Area", + "system-billRule": "BillRule", + "system-systemTemplate": "SystemTemplate", + "system-smsTemplate": "SmsTemplate", + "system-messageTemplate": "MessageTemplate", + "system-signature": "Signature", + "system-kit": "Kit", + "systemData": "SystemData", + "systemData-dataSource": "DataSource", + "systemData-dataModel": "DataModel", + "systemData-dataSync": "DataSync", + "systemData-dataBackup": "DataBackup", + "systemData-dataInterface": "DataInterface", + "systemData-interfaceAuth": "InterfaceAuth", + "systemData-dictionary": "Dictionary", + "systemData-map": "Map", + "commonWords": "CommonWords", + "weChat": "WeChat", + "weChat-mpConfig": "MPConfig", + "weChat-mpMenu": "MPMenu", + "weChat-mpUser": "MPUser", + "weChat-mpMessage": "MPMessage", + "weChat-mpMaterial": "MPMaterial", + "weChat-qyhConfig": "QYHConfig", + "weChat-qyDepartment": "QYDepartment", + "weChat-qyUser": "QYUser", + "weChat-qyMessage": "QYMessage", + "permission": "Permission", + "permission-grade": "Grade", + "permission-organize": "Organize", + "permission-department": "Department", + "permission-position": "Position", + "permission-user": "User", + "permission-role": "Role", + "permission-group": "Group", + "permission-authorize": "AuthGroup", + "permission-auth": "Authorize", + "permission-userOnline": "UserOnline", + "flowEngine": "FlowEngine", + "formDesign": "SystemForm", + "workFlow": "WorkFlow", + "workFlow-form": "Form", + "workFlow-flowEngine": "FlowDesign", + "workFlow-addFlow": "AddFlow", + "workFlow-flowLaunch": "FlowLaunch", + "workFlow-flowToSign": "FlowToSign", + "workFlow-flowTodo": "FlowTodo", + "workFlow-flowDoing": "FlowDoing", + "workFlow-flowDone": "FlowDone", + "workFlow-flowCirculate": "FlowCirculate", + "workFlow-entrust": "Entrust", + "workFlow-flowMonitor": "FlowMonitor", + "workFlow-schedule": "Schedule", + "workFlow-printTemplate": "PrintTemplate", + "workFlow-document": "Document", + "msgCenter": "MsgCenter", + "msgCenter-accountConfig": "AccountConfig", + "msgCenter-accountConfig-mail": "Mail", + "msgCenter-accountConfig-shortMsg": "ShortMsg", + "msgCenter-accountConfig-weCom": "WeCom", + "msgCenter-accountConfig-ding": "DingTalk", + "msgCenter-accountConfig-webhook": "Webhook", + "msgCenter-accountConfig-mp": "MP", + "msgCenter-msgTemplate": "MsgTemplate", + "msgCenter-sendConfig": "SendConfig", + "msgCenter-msgMonitor": "MsgMonitor", + "extend-graphDemo": "Graph Demo", + "extend-graphDemo-echartsBar": "E-Bar", + "extend-graphDemo-echartsPie": "E-Pie", + "extend-graphDemo-echartsBarAcross": "E-BarAcross", + "extend-graphDemo-echartsGauge": "E-Gauge", + "extend-graphDemo-echartsLineArea": "E-LineArea", + "extend-graphDemo-echartsScatter": "E-Scatter", + "extend-graphDemo-echartsCandlestick": "E-Candlestick", + "extend-graphDemo-echartsLineBar": "E-LineBar", + "extend-graphDemo-echartsTree": "E-Tree", + "extend-graphDemo-echartsFunnel": "E-Funnel", + "extend-graphDemo-highchartsScatter": "H-Scatter", + "extend-graphDemo-highchartsWordcloud": "H-Wordcloud", + "extend-graphDemo-highchartsLine": "H-Line", + "extend-graphDemo-highchartsArea": "H-Area", + "extend-graphDemo-highchartsGauge": "H-Gauge", + "extend-graphDemo-highchartsBellcurve": "H-Bellcurve", + "extend-graphDemo-highchartsFunnel": "H-Funnel", + "extend-graphDemo-highchartsBullet": "H-Bullet", + "extend-graphDemo-highchartsColumn": "H-Column", + "extend-graphDemo-highchartsPie": "H-Pie", + "extend-tableDemo": "Table Demo", + "extend-tableDemo-commonTable": "CommonTable", + "extend-tableDemo-statisticsTable": "StatisticsTable", + "extend-tableDemo-lockTable": "LockTable", + "extend-tableDemo-groupingTable": "GroupingTable", + "extend-tableDemo-redactTable": "RedactTable", + "extend-tableDemo-complexHeader": "ComplexHeader", + "extend-tableDemo-mergeTable": "MergeTable", + "extend-tableDemo-printTable": "PrintTable", + "extend-tableDemo-extension": "Extension", + "extend-tableDemo-treeTable": "TreeTable", + "extend-tableDemo-postilTable": "PostilTable", + "extend-tableDemo-tableTree": "TableTree", + "extend-tableDemo-signTable": "SignTable", + "extend-formDemo": "Form Demo", + "extend-formDemo-verifyForm": "VerifyForm", + "extend-formDemo-verifyForm1": "VerifyForm1", + "extend-formDemo-fieldForm1": "FieldForm1", + "extend-formDemo-fieldForm2": "FieldForm2", + "extend-formDemo-fieldForm3": "FieldForm3", + "extend-formDemo-fieldForm4": "FieldForm4", + "extend-formDemo-fieldForm5": "FieldForm5", + "extend-formDemo-fieldForm6": "FieldForm6", + "extend": "Examples", + "extend-functionDemo": "Function Demo", + "extend-portalDemo": "Portal Demo", + "extend-orderDemo": "Order Demo", + "extend-bigData": "BigData", + "extend-importAndExport": "ImportAndExport", + "extend-signet": "Signet", + "extend-signature": "Signature", + "extend-schedule": "Schedule", + "extend-email": "Email", + "extend-documentPreview": "Document Demo", + "extend-barCode": "BarCode", + "extend-printData": "PrintData", + "extend-map": "Map", + "extend-order": "Order", + "extend-projectGantt": "ProjectGantt", + "moreMenu": "More...", + "dataReport": "DataReport Demo(past)", + "report": "DataReport Demo", + "printDemo": "Print Demo", + "lioui": "WorkFlow Demo", + "reportBI": "ReportBI Demo" + }, + "sys": { + "api": { + "operationFailed": "Operation failed", + "errorTip": "Error Tip", + "errorMessage": "The operation failed, the system is abnormal!", + "timeoutMessage": "Login timed out, please log in again!", + "apiTimeoutMessage": "The interface request timed out, please refresh the page and try again!", + "apiRequestFailed": "The interface request failed, please try again later!", + "networkException": "network anomaly", + "networkExceptionMsg": "Please check if your network connection is normal! The network is abnormal", + "errMsg401": "The user does not have permission (token, user name, password error)!", + "errMsg403": "The user is authorized, but access is forbidden!", + "errMsg404": "Network request error, the resource was not found!", + "errMsg405": "Network request error, request method not allowed!", + "errMsg408": "Network request timed out!", + "errMsg500": "Server error, please contact the administrator!", + "errMsg501": "The network is not implemented!", + "errMsg502": "Network Error!", + "errMsg503": "The service is unavailable, the server is temporarily overloaded or maintained!", + "errMsg504": "Network timeout!", + "errMsg505": "The http version does not support the request!" + }, + "app": { + "logoutTip": "Reminder", + "logoutMessage": "Confirm to exit the system?", + "menuLoading": "Menu loading..." + }, + "validate": { + "textRequiredSuffix": " cannot be empty", + "arrayRequiredPrefix": "Please select at least one ", + "number": "Please enter the correct number", + "money": "Please enter the correct amount", + "telephone": "Please enter the correct telephone number", + "mobilePhone": "Please enter the correct mobile phone number", + "phone": "Please enter the correct phone number", + "email": "Please enter the correct email address", + "url": "Please enter the correct website address", + "date": "Please enter the correct date", + "idCard": "Please enter the correct ID number" + }, + "errorLog": { + "tableTitle": "Error log list", + "tableColumnType": "Type", + "tableColumnDate": "Time", + "tableColumnFile": "File", + "tableColumnMsg": "Error message", + "tableColumnStackMsg": "Stack info", + "tableActionDesc": "Details", + "modalTitle": "Error details", + "fireVueError": "Fire vue error", + "fireResourceError": "Fire resource error", + "fireAjaxError": "Fire ajax error", + "enableMessage": "Only effective when useErrorHandle=true in `/src/settings/projectSetting.ts`." + }, + "exception": { + "backLogin": "Back Login", + "backHome": "Back Home", + "subTitle403": "Sorry, you don't have access to this page.", + "subTitle404": "Sorry, the page you visited does not exist.", + "subTitle500": "Sorry, the server is reporting an error.", + "noDataTitle": "No data on the current page.", + "networkErrorTitle": "Network Error", + "networkErrorSubTitle": "Sorry,Your network connection has been disconnected, please check your network!" + }, + "lock": { + "unlock": "Click to unlock", + "alert": "Lock screen password error", + "backToLogin": "Back to login", + "entry": "Enter the system", + "placeholder": "Please enter the user password" + }, + "login": { + "welcome": "Welcome", + "subTitle": "Login with account password", + "subTitle1": "Login with mobile verify code, or switch to ", + "subTitle2": "Login with account, or switch to ", + "subTitle3": "Login with scan code, or switch to ", + "otherLogin": "Other login", + "backSignIn": "Back sign in", + "signInFormTitle": "Account Login", + "mobileSignInFormTitle": "Verify Code Login", + "qrSignInFormTitle": "APP Scan Login", + "signUpFormTitle": "Sign up", + "forgetFormTitle": "Reset password", + "qrCodeTip": "Please use the app to scan the code to login. The code will expire after 180 seconds.", + "signInTitle": "Backstage management system", + "signInDesc": "Enter your personal details and get started!", + "policy": "I agree to the xxx Privacy Policy", + "scanSign": "scanning the code to complete the login", + "loginButton": "Login", + "registerButton": "Sign up", + "rememberMe": "Remember me", + "forgetPassword": "Forget Password?", + "otherSignIn": "Sign in with", + "lastLoginInfo": "Last login information", + "accountPlaceholder": "Please input username", + "passwordPlaceholder": "Please input password", + "smsPlaceholder": "Please input sms code", + "mobilePlaceholder": "Please input mobile", + "policyPlaceholder": "Register after checking", + "diffPwd": "The two passwords are inconsistent", + "confirmPassword": "Confirm Password", + "email": "Email", + "title": "Account Login", + "scanTitle": "APP Scan Login", + "codeTitle": "Verify Code Login", + "logIn": "Login", + "username": "Username", + "password": "Password", + "version": "V", + "upper": "Caps locked", + "scanTip": "APP Scan code login", + "accountTip": "Please enter the account number", + "passwordTip": "Please enter your password", + "codeTip": "Please enter your verification code", + "changeCode": "Click to switch verification code", + "mobile": "Please enter mobile number", + "rightMobile": "Please enter the correct mobile number", + "smsCode": "Please enter the verification code", + "getCode": "Get code", + "reSend": "Resend", + "company": "Please enter company name", + "contacts": "Please enter contact", + "rule": "Sub Account: mobile{'@'}account example:18577778888{'@'}101001", + "scanSuccessful": "Scanned", + "confirmLogin": "Confirm login on phone", + "refreshCode": "Refresh", + "recoverCode": "Cancel", + "expired": "Qrcode has expired" + } + }, + "formGenerator": { + "component": { + "input": "Input", + "textarea": "Textarea", + "inputNumber": "InputNumber", + "switch": "Switch", + "radio": "Radio", + "checkbox": "Checkbox", + "select": "Select", + "cascader": "Cascader", + "datePicker": "DatePicker", + "timePicker": "TimePicker", + "uploadFile": "UploadFile", + "uploadImg": "UploadImage", + "colorPicker": "ColorPicker", + "rate": "Rate", + "slider": "Slider", + "editor": "Editor", + "link": "Link", + "button": "Button", + "text": "Text", + "alert": "Alert", + "iframe": "Iframe", + "qrcode": "Qrcode", + "barcode": "Barcode", + "organizeSelect": "OrganizeSelect", + "depSelect": "DepartmentSelect", + "posSelect": "PositionSelect", + "userSelect": "UserSelect", + "roleSelect": "RoleSelect", + "groupSelect": "GroupSelect", + "usersSelect": "UsersSelect", + "table": "Table", + "treeSelect": "TreeSelect", + "popupTableSelect": "PopupTableSelect", + "autoComplete": "AutoComplete", + "areaSelect": "AreaSelect", + "billRule": "BillRule", + "relationForm": "RelationForm", + "popupSelect": "PopupSelect", + "relationFormAttr": "RelationFormAttr", + "popupAttr": "PopupAttr", + "sign": "Sign", + "location": "Location", + "calculate": "Calculate", + "createUser": "CreateUser", + "createTime": "CreateTime", + "modifyUser": "ModifyUser", + "modifyTime": "ModifyTime", + "currOrganize": "CurrentOrganize", + "currPosition": "CurrentPosition", + "groupTitle": "GroupTitle", + "divider": "Divider", + "collapse": "Collapse", + "tab": "Tab", + "row": "Row", + "card": "Card", + "tableGrid": "TableGrid" + }, + "delComponentTip": "Delete this component?", + "cleanComponentTip": "Clear all components?", + "copyComponentTip": "Copy this component?" + }, + "views": { + "http404": { + "tips": "Sorry, the page you visited does not exist or you do not have permission to access it!", + "subTips": "Please check if the URL you entered is correct, or click the button to return to the homepage.", + "goBackBtn": "Go homepage" + }, + "dynamicModel": { + "passwordPlaceholder": "Please enter your password", + "scanAndShare": "Scan & Share", + "showMore": "Show more", + "hideSome": "Hide some" + } + } +} diff --git a/src/locales/lang/en_US.ts b/src/locales/lang/en_US.ts new file mode 100644 index 0000000..c97bf13 --- /dev/null +++ b/src/locales/lang/en_US.ts @@ -0,0 +1,14 @@ +import antdLocale from 'ant-design-vue/es/locale/en_US'; +import enCustomLocale from './en_US.json'; +import { flattenObject } from '../helper'; + +const customLocale = flattenObject(enCustomLocale); + +export default { + message: { + ...customLocale, + antdLocale, + }, + dateLocale: null, + dateLocaleName: 'en_US', +}; diff --git a/src/locales/lang/zh_CN.json b/src/locales/lang/zh_CN.json new file mode 100644 index 0000000..68bdde6 --- /dev/null +++ b/src/locales/lang/zh_CN.json @@ -0,0 +1,774 @@ +{ + "common": { + "okText": "确定", + "continueText": "确定并继续", + "continueAndAddText": "确定并新增", + "closeText": "关闭", + "cancelText": "取消", + "loadingText": "加载中...", + "saveText": "保存", + "delText": "删除", + "resetText": "重置", + "searchText": "搜索", + "queryText": "查询", + "addText": "新建", + "add1Text": "添加", + "add2Text": "新增", + "editText": "编辑", + "detailText": "详情", + "moreText": "更多", + "exportText": "导出", + "importText": "导入", + "copyText": "复制", + "printText": "打印", + "batchPrintText": "批量打印", + "batchDelText": "批量删除", + "previewText": "预览", + "submitText": "提交", + "syncText": "第三方同步", + "cleanText": "清空", + "closeList": "关闭列表", + "inputText": "请输入", + "chooseText": "请选择", + "inputTextPrefix": "请输入", + "chooseTextPrefix": "请选择", + "redo": "刷新", + "back": "返回", + "expandAll": "展开", + "collapseAll": "折叠", + "superQuery": "高级查询", + "light": "亮色主题", + "dark": "黑暗主题", + "tipTitle": "提示", + "delTip": "此操作将永久删除该数据, 是否继续?", + "batchDelTip": "您确定要删除这些数据吗, 是否继续?", + "selectDataTip": "请选择一条数据", + "prev": "上一步", + "next": "下一步", + "prevRecord": "上一条", + "nextRecord": "下一条", + "keyword": "关键词", + "enterKeyword": "请输入关键词", + "leftTreeSearchText": "请输入关键词", + "drawerSearchText": "请输入关键词", + "inputPlaceholder": "请输入", + "selectPlaceholder": "请选择", + "selectI18nCode": "选择翻译标记", + "undoText": "撤销", + "redoText": "重做", + "noData": "暂无数据", + "updateView": "更新视图", + "addView": "存为新视图" + }, + "component": { + "app": { + "searchNotData": "暂无搜索结果", + "toSearch": "确认", + "toNavigate": "切换" + }, + "countdown": { + "normalText": "获取验证码", + "sendText": "{0}秒后重新获取" + }, + "cropper": { + "selectImage": "选择图片", + "uploadSuccess": "上传成功", + "modalTitle": "头像上传", + "okText": "确认并上传", + "btn_reset": "重置", + "btn_rotate_left": "逆时针旋转", + "btn_rotate_right": "顺时针旋转", + "btn_scale_x": "水平翻转", + "btn_scale_y": "垂直翻转", + "btn_zoom_in": "放大", + "btn_zoom_out": "缩小", + "preview": "预览" + }, + "drawer": { + "loadingText": "加载中...", + "cancelText": "关闭", + "okText": "确认" + }, + "excel": { + "exportModalTitle": "导出数据", + "fileType": "文件类型", + "fileName": "文件名" + }, + "form": { + "fold": "收起", + "unfold": "展开", + "maxTip": "字符数应小于{0}位", + "apiSelectNotFound": "请等待数据加载完成..." + }, + "icon": { + "placeholder": "点击选择图标", + "search": "搜索图标", + "copy": "复制图标成功!" + }, + "menu": { + "search": "菜单搜索" + }, + "modal": { + "cancelText": "关闭", + "okText": "确认", + "close": "关闭", + "maximize": "最大化", + "restore": "还原" + }, + "table": { + "settingDens": "密度", + "settingDensDefault": "默认", + "settingDensMiddle": "中等", + "settingDensSmall": "紧凑", + "viewList": "视图切换", + "viewSetting": "视图设置", + "settingColumn": "列设置", + "settingColumnShow": "列展示", + "settingIndexColumnShow": "序号列", + "settingSelectColumnShow": "勾选列", + "settingFixedLeft": "固定到左侧", + "settingFixedRight": "固定到右侧", + "settingFullScreen": "全屏", + "index": "序号", + "status": "状态", + "action": "操作", + "summary": "合计", + "total": "共 {total} 条数据" + }, + "time": { + "before": "前", + "after": "后", + "just": "刚刚", + "seconds": "秒", + "minutes": "分钟", + "hours": "小时", + "days": "天" + }, + "tree": { + "reload": "刷新数据", + "selectAll": "选择全部", + "unSelectAll": "取消选择", + "expandAll": "展开全部", + "unExpandAll": "折叠全部", + "checkStrictly": "层级关联", + "checkUnStrictly": "层级独立" + }, + "upload": { + "save": "保存", + "upload": "上传", + "buttonText": "点击上传", + "imgUpload": "图片上传", + "imgDragger": "单击或拖动图片到此区域上传", + "uploaded": "已上传", + "operating": "操作", + "del": "删除", + "download": "下载", + "downloadAll": "全部下载", + "saveWarn": "请等待文件上传后,保存!", + "saveError": "没有上传成功的文件,无法保存!", + "preview": "预览", + "choose": "选择文件", + "accept": "支持{0}格式", + "acceptUpload": "只能上传{0}格式文件", + "maxSize": "单个文件不超过{0}MB", + "maxSizeMultiple": "只能上传不超过{0}MB的文件!", + "maxNumber": "最多只能上传{0}个文件", + "legend": "略缩图", + "fileName": "文件名", + "fileSize": "文件大小", + "fileStatue": "状态", + "startUpload": "开始上传", + "uploadSuccess": "上传成功", + "uploadError": "上传失败", + "uploading": "上传中", + "paused": "暂停中", + "waiting": "等待中", + "checking": "文件校验中", + "uploadWait": "请等待文件上传结束后操作", + "reUploadFailed": "重新上传失败文件", + "uploadImg": "请上传图片", + "viewImage": "查看图片", + "view": "查看", + "imageMaxNumber": "最多可以上传{0}张图片", + "imageMaxSize": "图片大小超过{size}{unit}", + "fileMaxNumber": "最多可以上传{0}个文件", + "fileMaxSize": "文件大小超过{size}{unit}", + "fileTypeCheck": "请选择{0}类型的文件", + "fileReadError": "文件{0}读取出错,请检查该文件", + "videoNoPreview": "音视频文件不能预览", + "zipNoPreview": "压缩包不能预览", + "image": "图片", + "video": "视频", + "audio": "音频" + }, + "verify": { + "error": "验证失败!", + "time": "验证校验成功,耗时{time}秒!", + "redoTip": "点击图片可刷新", + "dragText": "请按住滑块拖动", + "successText": "验证通过" + }, + "yunzhupaas": { + "common": { + "allData": "全部数据", + "selected": "已选择", + "clearAll": "清空列表", + "autoGenerate": "系统自动生成" + }, + "areaSelect": { + "modalTitle": "省市区" + }, + "calculate": { + "storage": "用于展示计算结果,且数据同时会保存入库", + "unStorage": "用于展示计算结果,且数据不会保存" + }, + "dateRange": { + "startPlaceholder": "开始日期", + "endPlaceholder": "结束日期" + }, + "timeRange": { + "startPlaceholder": "开始时间", + "endPlaceholder": "结束时间" + }, + "iconPicker": { + "select": "选择", + "modalTitle": "图标选择", + "searchPlaceholder": "请输入关键词", + "ymIcon": "ymIcon图标", + "ymCustom": "ymCustom图标" + }, + "location": { + "modalTitle": "选择位置", + "searchPlaceholder": "搜索或直接在地图上点选", + "relocation": "重新定位", + "location": "添加定位" + }, + "numberRange": { + "min": "最小值", + "max": "最大值" + }, + "organizeSelect": { + "modalTitle": "选择组织" + }, + "depSelect": { + "modalTitle": "选择部门" + }, + "posSelect": { + "modalTitle": "选择岗位" + }, + "roleSelect": { + "modalTitle": "选择角色" + }, + "groupSelect": { + "modalTitle": "选择分组" + }, + "userSelect": { + "modalTitle": "选择用户" + }, + "popupAttr": { + "storage": "用于展示关联弹窗的属性,且数据同时会保存入库", + "unStorage": "用于展示关联弹窗的属性,且数据不会保存" + }, + "popupSelect": { + "modalTitle": "选择数据" + }, + "relationFormAttr": { + "storage": "用于展示关联表单的属性,且数据同时会保存入库", + "unStorage": "用于展示关联表单的属性,且数据不会保存" + }, + "sign": { + "signTip": "手写签名", + "signPlaceholder": "请签名", + "operateTip": "请在此区域使用鼠标手写签名" + } + } + }, + "layout": { + "footer": { + "onlinePreview": "在线预览", + "onlineDocument": "在线文档" + }, + "header": { + "dropdownItemDoc": "文档", + "dropdownItemLoginOut": "退出系统", + "systemChange": "应用切换", + "standingChange": "切换身份", + "profile": "个人信息", + "feedback": "反馈问题", + "about": "关于平台", + "statement": "官方声明", + "commonMenus": "常用菜单", + "tooltipErrorLog": "错误日志", + "tooltipLock": "锁定屏幕", + "tooltipNotify": "消息", + "tooltipChat": "聊天", + "tooltipEntryFull": "全屏", + "tooltipExitFull": "退出全屏", + "setting": "设置", + "lockScreenPassword": "锁屏密码", + "lockScreen": "锁定屏幕", + "lockScreenBtn": "锁定", + "home": "首页" + }, + "multipleTab": { + "setCommon": "设为常用菜单", + "reload": "重新加载", + "close": "关闭标签页", + "closeLeft": "关闭左侧标签页", + "closeRight": "关闭右侧标签页", + "closeOther": "关闭其它标签页", + "closeAll": "关闭全部标签页" + }, + "setting": { + "contentModeFull": "流式", + "contentModeFixed": "定宽", + "topMenuAlignLeft": "居左", + "topMenuAlignRight": "居中", + "topMenuAlignCenter": "居右", + "menuTriggerNone": "不显示", + "menuTriggerBottom": "底部", + "menuTriggerTop": "顶部", + "menuTypeSidebar": "左侧菜单模式", + "menuTypeMixSidebar": "左侧混合模式", + "menuTypeMix": "顶部混合模式", + "menuTypeTopMenu": "顶部菜单模式", + "defaultBg": "经典主题", + "blueBg": "蔚蓝星辰", + "purpleBg": "紫藤萝兰", + "greenBg": "碧绿翠风", + "on": "开", + "off": "关", + "minute": "分钟", + "operatingTitle": "操作成功", + "operatingContent": "复制成功,请到 src/settings/projectSetting.ts 中修改配置!", + "resetSuccess": "重置成功!", + "copyBtn": "拷贝", + "clearBtn": "清空缓存并返回登录页", + "drawerTitle": "配置", + "darkMode": "主题", + "navMode": "导航栏模式", + "systemBackground": "系统背景", + "interfaceFunction": "界面功能", + "interfaceDisplay": "界面显示", + "animation": "动画", + "splitMenu": "分割菜单", + "closeMixSidebarOnChange": "切换页面关闭菜单", + "sysTheme": "系统主题", + "headerTheme": "顶栏主题", + "sidebarTheme": "菜单主题", + "menuDrag": "侧边菜单拖拽", + "menuSearch": "菜单搜索", + "toggleLocale": "语言切换", + "menuAccordion": "侧边菜单手风琴模式", + "menuCollapse": "折叠菜单", + "collapseMenuDisplayName": "折叠菜单显示名称", + "topMenuLayout": "顶部菜单布局", + "menuCollapseButton": "菜单折叠按钮", + "contentMode": "内容区域宽度", + "expandedMenuWidth": "菜单展开宽度", + "breadcrumb": "面包屑", + "breadcrumbIcon": "面包屑图标", + "tabs": "标签页", + "tabsIcon": "标签图标", + "tabDetail": "标签详情页", + "tabsQuickBtn": "标签页快捷按钮", + "tabsRedoBtn": "标签页刷新按钮", + "tabsFoldBtn": "标签页折叠按钮", + "sidebar": "左侧菜单", + "header": "顶栏", + "footer": "页脚", + "fullContent": "全屏内容", + "grayMode": "灰色模式", + "colorWeak": "色弱模式", + "cachePage": "缓存页面", + "progress": "顶部进度条", + "switchLoading": "切换loading", + "switchAnimation": "切换动画", + "animationType": "动画类型", + "autoScreenLock": "自动锁屏", + "notAutoScreenLock": "不自动锁屏", + "fixedHeader": "固定header", + "fixedSideBar": "固定Sidebar", + "mixSidebarTrigger": "混合菜单触发方式", + "triggerHover": "悬停", + "triggerClick": "点击", + "mixSidebarFixed": "固定展开菜单" + } + }, + "routes": { + "basic": { + "login": "登录", + "errorLogList": "错误日志列表", + "home": "首页", + "externalLink": "链接", + "workFlowDetail": "流程详情", + "emailDetail": "查看邮件", + "previewModel": "功能预览", + "dataManage": "数据管理" + }, + "mainSystem": "开发平台", + "workSystem": "业务平台", + "onlineDev": "在线开发", + "onlineDev-webDesign": "表单设计", + "onlineDev-appDesign": "移动设计", + "onlineDev-report": "报表设计", + "onlineDev-dataReport": "报表设计(原)", + "onlineDev-dataScreen": "大屏设计", + "onlineDev-visualPortal": "门户设计", + "onlineDev-integration": "集成助手", + "onlineDev-printDev": "打印设计", + "generator": "代码生成", + "generator-webForm": "功能表单", + "generator-appForm": "移动表单", + "generator-flowForm": "发起表单", + "system": "系统管理", + "system-sysConfig": "系统配置", + "system-notice": "系统公告", + "system-task": "系统调度", + "system-cache": "系统缓存", + "system-log": "系统日志", + "system-monitor": "系统监控", + "system-icons": "系统图标", + "system-language": "翻译管理", + "system-menu": "应用菜单", + "system-area": "行政区划", + "system-billRule": "单据模板", + "system-systemTemplate": "系统模板", + "system-smsTemplate": "短信模板", + "system-messageTemplate": "消息模板", + "system-signature": "签章管理", + "system-kit": "表单模板", + "systemData": "数据应用", + "systemData-dataSource": "数据连接", + "systemData-dataModel": "数据建模", + "systemData-dataSync": "数据同步", + "systemData-dataBackup": "数据备份", + "systemData-dataInterface": "数据接口", + "systemData-interfaceAuth": "接口认证", + "systemData-dictionary": "数据字典", + "systemData-map": "数据地图", + "commonWords": "审批常用语", + "weChat": "微信配置", + "weChat-mpConfig": "公众号配置", + "weChat-mpMenu": "公众号菜单", + "weChat-mpUser": "公众号用户", + "weChat-mpMessage": "公众号消息", + "weChat-mpMaterial": "公众号素材", + "weChat-qyhConfig": "企业号配置", + "weChat-qyDepartment": "企业号组织", + "weChat-qyUser": "企业号用户", + "weChat-qyMessage": "企业号消息", + "permission": "组织权限", + "permission-grade": "管理员", + "permission-organize": "组织管理", + "permission-department": "部门管理", + "permission-position": "岗位管理", + "permission-user": "用户管理", + "permission-role": "角色管理", + "permission-group": "分组管理", + "permission-authorize": "权限组", + "permission-auth": "权限管理", + "permission-userOnline": "在线用户", + "flowEngine": "流程引擎", + "formDesign": "系统表单", + "workFlow": "协同办公", + "workFlow-form": "表单设计", + "workFlow-flowEngine": "流程设计", + "workFlow-addFlow": "发起流程", + "workFlow-flowLaunch": "我发起的", + "workFlow-flowToSign": "我的待签", + "workFlow-flowTodo": "我的待办", + "workFlow-flowDoing": "我的在办", + "workFlow-flowDone": "我的已办", + "workFlow-flowCirculate": "抄送我的", + "workFlow-entrust": "流程委托", + "workFlow-flowMonitor": "流程监控", + "workFlow-schedule": "日程安排", + "workFlow-printTemplate": "打印模板", + "workFlow-document": "文档中心", + "msgCenter": "消息中心", + "msgCenter-accountConfig": "账号配置", + "msgCenter-accountConfig-mail": "邮箱配置", + "msgCenter-accountConfig-shortMsg": "短信配置", + "msgCenter-accountConfig-weCom": "企业微信配置", + "msgCenter-accountConfig-ding": "钉钉配置", + "msgCenter-accountConfig-webhook": "webhook配置", + "msgCenter-accountConfig-mp": "微信公众号配置", + "msgCenter-msgTemplate": "消息模板", + "msgCenter-sendConfig": "发送配置", + "msgCenter-msgMonitor": "消息监控", + "extend-graphDemo": "图表示例", + "extend-graphDemo-echartsBar": "E-柱状图", + "extend-graphDemo-echartsPie": "E-饼状图", + "extend-graphDemo-echartsBarAcross": "E-横状条形图", + "extend-graphDemo-echartsGauge": "E-仪表图", + "extend-graphDemo-echartsLineArea": "E-线形图", + "extend-graphDemo-echartsScatter": "E-散点图", + "extend-graphDemo-echartsCandlestick": "E-K线图", + "extend-graphDemo-echartsLineBar": "E-折柱混合图", + "extend-graphDemo-echartsTree": "E-树形图", + "extend-graphDemo-echartsFunnel": "E-漏斗图", + "extend-graphDemo-highchartsScatter": "H-散点图", + "extend-graphDemo-highchartsWordcloud": "H-词云图", + "extend-graphDemo-highchartsLine": "H-线性图", + "extend-graphDemo-highchartsArea": "H-面积图", + "extend-graphDemo-highchartsGauge": "H-仪表图", + "extend-graphDemo-highchartsBellcurve": "H-贝尔曲线", + "extend-graphDemo-highchartsFunnel": "H-漏斗图", + "extend-graphDemo-highchartsBullet": "H-子弹图", + "extend-graphDemo-highchartsColumn": "H-柱状图", + "extend-graphDemo-highchartsPie": "H-饼状图", + "extend-tableDemo": "表格示例", + "extend-tableDemo-commonTable": "普通表格", + "extend-tableDemo-statisticsTable": "表格统计", + "extend-tableDemo-lockTable": "表格锁定", + "extend-tableDemo-groupingTable": "表格分组", + "extend-tableDemo-redactTable": "表格编辑", + "extend-tableDemo-complexHeader": "复杂表头", + "extend-tableDemo-mergeTable": "表格合并", + "extend-tableDemo-printTable": "表格打印", + "extend-tableDemo-extension": "延伸扩展", + "extend-tableDemo-treeTable": "树形表格", + "extend-tableDemo-postilTable": "表格批注", + "extend-tableDemo-tableTree": "表格树形", + "extend-tableDemo-signTable": "表格标记", + "extend-formDemo": "表单示例", + "extend-formDemo-verifyForm": "表单验证", + "extend-formDemo-verifyForm1": "表单验证1", + "extend-formDemo-fieldForm1": "表单字段1", + "extend-formDemo-fieldForm2": "表单字段2", + "extend-formDemo-fieldForm3": "表单字段3", + "extend-formDemo-fieldForm4": "表单字段4", + "extend-formDemo-fieldForm5": "表单字段5", + "extend-formDemo-fieldForm6": "表单字段6", + "extend": "开发示例", + "extend-bigData": "百万数据", + "extend-functionDemo": "功能示例", + "extend-portalDemo": "门户示例", + "extend-orderDemo": "订单示例", + "extend-importAndExport": "导入导出", + "extend-signet": "电子签章", + "extend-signature": "电子签名", + "extend-schedule": "日程安排", + "extend-email": "邮件收发", + "extend-documentPreview": "文档示例", + "extend-barCode": "条码示例", + "extend-printData": "打印示例", + "extend-map": "地图示例", + "extend-order": "订单管理", + "extend-projectGantt": "项目管理", + "moreMenu": "更多...", + "dataReport": "报表示例(原)", + "report": "报表示例", + "printDemo": "打印示例", + "lioui": "流程示例", + "reportBI": "大屏示例" + }, + "sys": { + "api": { + "operationFailed": "操作失败", + "errorTip": "错误提示", + "errorMessage": "操作失败,系统异常!", + "timeoutMessage": "登录超时,请重新登录!", + "apiTimeoutMessage": "接口请求超时,请刷新页面重试!", + "apiRequestFailed": "请求出错,请稍候重试", + "networkException": "网络异常", + "networkExceptionMsg": "网络异常,请检查您的网络连接是否正常!", + "errMsg401": "用户没有权限(令牌、用户名、密码错误)!", + "errMsg403": "用户得到授权,但是访问是被禁止的。!", + "errMsg404": "网络请求错误,未找到该资源!", + "errMsg405": "网络请求错误,请求方法未允许!", + "errMsg408": "网络请求超时!", + "errMsg500": "服务器错误,请联系管理员!", + "errMsg501": "网络未实现!", + "errMsg502": "网络错误!", + "errMsg503": "服务不可用,服务器暂时过载或维护!", + "errMsg504": "网络超时!", + "errMsg505": "http版本不支持该请求!" + }, + "app": { + "logoutTip": "温馨提醒", + "logoutMessage": "是否确认退出系统?", + "menuLoading": "菜单加载中..." + }, + "validate": { + "textRequiredSuffix": "不能为空", + "arrayRequiredPrefix": "请至少选择一个", + "number": "请输入正确的数字", + "money": "请输入正确的金额", + "telephone": "请输入正确的电话号码", + "mobilePhone": "请输入正确的手机号码", + "phone": "请输入正确的联系方式", + "email": "请输入正确的邮箱", + "url": "请输入正确的网址", + "date": "请输入正确的日期", + "idCard": "请输入正确的身份证号码" + }, + "errorLog": { + "tableTitle": "错误日志列表", + "tableColumnType": "类型", + "tableColumnDate": "时间", + "tableColumnFile": "文件", + "tableColumnMsg": "错误信息", + "tableColumnStackMsg": "stack信息", + "tableActionDesc": "详情", + "modalTitle": "错误详情", + "fireVueError": "点击触发vue错误", + "fireResourceError": "点击触发资源加载错误", + "fireAjaxError": "点击触发ajax错误", + "enableMessage": "只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效." + }, + "exception": { + "backLogin": "返回登录", + "backHome": "返回首页", + "subTitle403": "抱歉,您无权访问此页面。", + "subTitle404": "抱歉,您访问的页面不存在。", + "subTitle500": "抱歉,服务器报告错误。", + "noDataTitle": "当前页无数据", + "networkErrorTitle": "网络错误", + "networkErrorSubTitle": "抱歉,您的网络连接已断开,请检查您的网络!" + }, + "lock": { + "unlock": "点击解锁", + "alert": "锁屏密码错误", + "backToLogin": "返回登录", + "entry": "进入系统", + "placeholder": "请输入登录密码" + }, + "login": { + "welcome": "欢迎使用", + "subTitle": "通过账号密码登录", + "subTitle1": "通过手机验证码登录,或者切换为", + "subTitle2": "通过账号密码登录,或者切换为", + "subTitle3": "通过扫码登录,或者切换为", + "otherLogin": "其他登录方式", + "backSignIn": "返回", + "signInFormTitle": "账号密码登录", + "mobileSignInFormTitle": "手机验证码登录", + "qrSignInFormTitle": "扫码登录", + "signUpFormTitle": "注册", + "forgetFormTitle": "重置密码", + "qrCodeTip": "请使用APP扫描二维码登录,180秒后二维码失效", + "signInTitle": "开箱即用的中后台管理系统", + "signInDesc": "输入您的个人详细信息开始使用!", + "policy": "我同意xxx隐私政策", + "scanSign": "扫码后点击\"确认\",即可完成登录", + "loginButton": "登录", + "registerButton": "注册", + "rememberMe": "记住我", + "forgetPassword": "忘记密码?", + "otherSignIn": "其他登录方式", + "lastLoginInfo": "上次登录信息", + "accountPlaceholder": "请输入账号", + "passwordPlaceholder": "请输入密码", + "smsPlaceholder": "请输入验证码", + "mobilePlaceholder": "请输入手机号码", + "policyPlaceholder": "勾选后才能注册", + "diffPwd": "两次输入密码不一致", + "confirmPassword": "确认密码", + "email": "邮箱", + "title": "账户密码登录", + "scanTitle": "扫码登录", + "codeTitle": "手机验证登录", + "logIn": "登录", + "username": "请输入账号", + "password": "请输入密码", + "version": "版本", + "upper": "大写已锁定", + "scanTip": "扫码登录", + "accountTip": "请输入账号", + "passwordTip": "请输入密码", + "codeTip": "请输入验证码", + "changeCode": "点击切换验证码", + "mobile": "请输入手机号", + "rightMobile": "请输入正确的手机号", + "smsCode": "请输入验证码", + "getCode": "获取验证码", + "reSend": "重新发送", + "company": "请输入公司名", + "contacts": "请输入联系人", + "rule": "租户子账户规则:租户号{'@'}账户 例:18577778888{'@'}101001", + "scanSuccessful": "扫码成功", + "confirmLogin": "请在手机端确认登录", + "refreshCode": "点击刷新", + "recoverCode": "取消登录", + "expired": "二维码已失效" + } + }, + "formGenerator": { + "component": { + "input": "单行输入", + "textarea": "多行输入", + "inputNumber": "数字输入", + "switch": "开关", + "radio": "单选框组", + "checkbox": "多选框组", + "select": "下拉选择", + "cascader": "级联选择", + "datePicker": "日期选择", + "timePicker": "时间选择", + "uploadFile": "文件上传", + "uploadImg": "图片上传", + "colorPicker": "颜色选择", + "rate": "评分", + "slider": "滑块", + "editor": "富文本", + "link": "链接", + "button": "按钮", + "text": "文本", + "alert": "提示", + "iframe": "Iframe", + "qrcode": "二维码", + "barcode": "条形码", + "organizeSelect": "组织选择", + "depSelect": "部门选择", + "posSelect": "岗位选择", + "userSelect": "用户选择", + "roleSelect": "角色选择", + "groupSelect": "分组选择", + "usersSelect": "用户组件", + "table": "设计子表", + "treeSelect": "下拉树形", + "popupTableSelect": "下拉表格", + "autoComplete": "下拉补全", + "areaSelect": "省市区域", + "billRule": "单据组件", + "relationForm": "关联表单", + "popupSelect": "弹窗选择", + "relationFormAttr": "关联表单属性", + "popupAttr": "弹窗选择属性", + "sign": "手写签名", + "location": "定位", + "calculate": "计算公式", + "createUser": "创建人员", + "createTime": "创建时间", + "modifyUser": "修改人员", + "modifyTime": "修改时间", + "currOrganize": "所属组织", + "currPosition": "所属岗位", + "groupTitle": "分组标题", + "divider": "分割线", + "collapse": "折叠面板", + "tab": "标签面板", + "row": "栅格容器", + "card": "卡片容器", + "tableGrid": "表格容器" + }, + "delComponentTip": "确定删除该组件?", + "cleanComponentTip": "确定要清空所有组件吗?", + "copyComponentTip": "确定复制该组件?" + }, + "views": { + "http404": { + "tips": "抱歉,你访问的页面不存在或无权访问!", + "subTips": "请检查您输入的URL是否正确,或单击按钮返回首页。", + "goBackBtn": "返回首页" + }, + "dynamicModel": { + "passwordPlaceholder": "请输入密码", + "scanAndShare": "扫描二维码,分享此链接", + "showMore": "加载更多", + "hideSome": "隐藏部分" + } + } +} diff --git a/src/locales/lang/zh_CN.ts b/src/locales/lang/zh_CN.ts new file mode 100644 index 0000000..b053f3c --- /dev/null +++ b/src/locales/lang/zh_CN.ts @@ -0,0 +1,12 @@ +import antdLocale from 'ant-design-vue/es/locale/zh_CN'; +import zhCNCustomLocale from './zh_CN.json'; +import { flattenObject } from '../helper'; + +const customLocale = flattenObject(zhCNCustomLocale); + +export default { + message: { + ...customLocale, + antdLocale, + }, +}; diff --git a/src/locales/lang/zh_TW.json b/src/locales/lang/zh_TW.json new file mode 100644 index 0000000..6386917 --- /dev/null +++ b/src/locales/lang/zh_TW.json @@ -0,0 +1,774 @@ +{ + "common": { + "okText": "確定", + "continueText": "確定並繼續", + "continueAndAddText": "確定並新增", + "closeText": "關閉", + "cancelText": "取消", + "loadingText": "加載中...", + "saveText": "保存", + "delText": "刪除", + "resetText": "重置", + "searchText": "搜索", + "queryText": "查詢", + "addText": "新建", + "add1Text": "添加", + "add2Text": "新增", + "editText": "編輯", + "detailText": "詳情", + "moreText": "更多", + "exportText": "導出", + "importText": "導入", + "copyText": "復製", + "printText": "打印", + "batchPrintText": "批量打印", + "batchDelText": "批量刪除", + "previewText": "預覽", + "submitText": "提交", + "syncText": "第三方同步", + "cleanText": "清空", + "closeList": "關閉列表", + "inputText": "請輸入", + "chooseText": "請選擇", + "inputTextPrefix": "請輸入", + "chooseTextPrefix": "請選擇", + "redo": "刷新", + "back": "返回", + "expandAll": "展開", + "collapseAll": "折疊", + "superQuery": "高級查詢", + "light": "亮色主題", + "dark": "黑暗主題", + "tipTitle": "提示", + "delTip": "此操作將永久刪除該數據, 是否繼續?", + "batchDelTip": "您確定要刪除這些數據嗎, 是否繼續?", + "selectDataTip": "請選擇一條數據", + "prev": "上一步", + "next": "下一步", + "prevRecord": "上一條", + "nextRecord": "下一條", + "keyword": "關鍵詞", + "enterKeyword": "請輸入關鍵詞", + "leftTreeSearchText": "請輸入關鍵詞", + "drawerSearchText": "請輸入關鍵詞", + "inputPlaceholder": "請輸入", + "selectPlaceholder": "請選擇", + "selectI18nCode": "選擇翻譯標記", + "undoText": "撤銷", + "redoText": "重做", + "noData": "暫無數據", + "updateView": "更新視圖", + "addView": "存爲新視圖" + }, + "component": { + "app": { + "searchNotData": "暫無搜索結果", + "toSearch": "確認", + "toNavigate": "切換" + }, + "countdown": { + "normalText": "獲取驗證碼", + "sendText": "{0}秒後重新獲取" + }, + "cropper": { + "selectImage": "選擇圖片", + "uploadSuccess": "上傳成功", + "modalTitle": "頭像上傳", + "okText": "確認並上傳", + "btn_reset": "重置", + "btn_rotate_left": "逆時針旋轉", + "btn_rotate_right": "順時針旋轉", + "btn_scale_x": "水平翻轉", + "btn_scale_y": "垂直翻轉", + "btn_zoom_in": "放大", + "btn_zoom_out": "縮小", + "preview": "預覽" + }, + "drawer": { + "loadingText": "加載中...", + "cancelText": "關閉", + "okText": "確認" + }, + "excel": { + "exportModalTitle": "導出數據", + "fileType": "文件類型", + "fileName": "文件名" + }, + "form": { + "fold": "收起", + "unfold": "展開", + "maxTip": "字符數應小於{0}位", + "apiSelectNotFound": "請等待數據加載完成..." + }, + "icon": { + "placeholder": "點擊選擇圖標", + "search": "搜索圖標", + "copy": "復製圖標成功!" + }, + "menu": { + "search": "菜單搜索" + }, + "modal": { + "cancelText": "關閉", + "okText": "確認", + "close": "關閉", + "maximize": "最大化", + "restore": "還原" + }, + "table": { + "settingDens": "密度", + "settingDensDefault": "默認", + "settingDensMiddle": "中等", + "settingDensSmall": "緊湊", + "viewList": "視圖切換", + "viewSetting": "視圖設置", + "settingColumn": "列設置", + "settingColumnShow": "列展示", + "settingIndexColumnShow": "序號列", + "settingSelectColumnShow": "勾選列", + "settingFixedLeft": "固定到左側", + "settingFixedRight": "固定到右側", + "settingFullScreen": "全屏", + "index": "序號", + "status": "狀態", + "action": "操作", + "summary": "合計", + "total": "共 {total} 條數據" + }, + "time": { + "before": "前", + "after": "後", + "just": "剛剛", + "seconds": "秒", + "minutes": "分鐘", + "hours": "小時", + "days": "天" + }, + "tree": { + "reload": "刷新數據", + "selectAll": "選擇全部", + "unSelectAll": "取消選擇", + "expandAll": "展開全部", + "unExpandAll": "折疊全部", + "checkStrictly": "層級關聯", + "checkUnStrictly": "層級獨立" + }, + "upload": { + "save": "保存", + "upload": "上傳", + "buttonText": "點擊上傳", + "imgUpload": "圖片上傳", + "imgDragger": "單擊或拖動圖片到此區域上傳", + "uploaded": "已上傳", + "operating": "操作", + "del": "刪除", + "download": "下載", + "downloadAll": "全部下載", + "saveWarn": "請等待文件上傳後,保存!", + "saveError": "沒有上傳成功的文件,無法保存!", + "preview": "預覽", + "choose": "選擇文件", + "accept": "支持{0}格式", + "acceptUpload": "只能上傳{0}格式文件", + "maxSize": "單個文件不超過{0}MB", + "maxSizeMultiple": "只能上傳不超過{0}MB的文件!", + "maxNumber": "最多只能上傳{0}個文件", + "legend": "略縮圖", + "fileName": "文件名", + "fileSize": "文件大小", + "fileStatue": "狀態", + "startUpload": "開始上傳", + "uploadSuccess": "上傳成功", + "uploadError": "上傳失敗", + "uploading": "上傳中", + "paused": "暫停中", + "waiting": "等待中", + "checking": "文件校驗中", + "uploadWait": "請等待文件上傳結束後操作", + "reUploadFailed": "重新上傳失敗文件", + "uploadImg": "請上傳圖片", + "viewImage": "查看圖片", + "view": "查看", + "imageMaxNumber": "最多可以上傳{0}張圖片", + "imageMaxSize": "圖片大小超過{size}{unit}", + "fileMaxNumber": "最多可以上傳{0}個文件", + "fileMaxSize": "文件大小超過{size}{unit}", + "fileTypeCheck": "請選擇{0}類型的文件", + "fileReadError": "文件{0}讀取出錯,請檢查該文件", + "videoNoPreview": "音視頻文件不能預覽", + "zipNoPreview": "壓縮包不能預覽", + "image": "圖片", + "video": "視頻", + "audio": "音頻" + }, + "verify": { + "error": "驗證失敗!", + "time": "驗證校驗成功,耗時{time}秒!", + "redoTip": "點擊圖片可刷新", + "dragText": "請按住滑塊拖動", + "successText": "驗證通過" + }, + "yunzhupaas": { + "common": { + "allData": "全部數據", + "selected": "已選擇", + "clearAll": "清空列表", + "autoGenerate": "系統自動生成" + }, + "areaSelect": { + "modalTitle": "省市區" + }, + "calculate": { + "storage": "用於展示計算結果,且數據同時會保存入庫", + "unStorage": "用於展示計算結果,且數據不會保存" + }, + "dateRange": { + "startPlaceholder": "開始日期", + "endPlaceholder": "結束日期" + }, + "timeRange": { + "startPlaceholder": "開始時間", + "endPlaceholder": "結束時間" + }, + "iconPicker": { + "select": "選擇", + "modalTitle": "圖標選擇", + "searchPlaceholder": "請輸入關鍵詞", + "ymIcon": "ymIcon圖標", + "ymCustom": "ymCustom圖標" + }, + "location": { + "modalTitle": "選擇位置", + "searchPlaceholder": "搜索或直接在地圖上點選", + "relocation": "重新定位", + "location": "添加定位" + }, + "numberRange": { + "min": "最小值", + "max": "最大值" + }, + "organizeSelect": { + "modalTitle": "選擇組織" + }, + "depSelect": { + "modalTitle": "選擇部門" + }, + "posSelect": { + "modalTitle": "選擇崗位" + }, + "roleSelect": { + "modalTitle": "選擇角色" + }, + "groupSelect": { + "modalTitle": "選擇分組" + }, + "userSelect": { + "modalTitle": "選擇用戶" + }, + "popupAttr": { + "storage": "用於展示關聯彈窗的屬性,且數據同時會保存入庫", + "unStorage": "用於展示關聯彈窗的屬性,且數據不會保存" + }, + "popupSelect": { + "modalTitle": "選擇數據" + }, + "relationFormAttr": { + "storage": "用於展示關聯表單的屬性,且數據同時會保存入庫", + "unStorage": "用於展示關聯表單的屬性,且數據不會保存" + }, + "sign": { + "signTip": "手寫簽名", + "signPlaceholder": "請簽名", + "operateTip": "請在此區域使用鼠標手寫簽名" + } + } + }, + "layout": { + "footer": { + "onlinePreview": "在線預覽", + "onlineDocument": "在線文檔" + }, + "header": { + "dropdownItemDoc": "文檔", + "dropdownItemLoginOut": "退出系統", + "systemChange": "應用切換", + "standingChange": "切換身份", + "profile": "個人信息", + "feedback": "反饋問題", + "about": "關於平臺", + "statement": "官方聲明", + "commonMenus": "常用菜單", + "tooltipErrorLog": "錯誤日誌", + "tooltipLock": "鎖定屏幕", + "tooltipNotify": "消息", + "tooltipChat": "聊天", + "tooltipEntryFull": "全屏", + "tooltipExitFull": "退出全屏", + "setting": "設置", + "lockScreenPassword": "鎖屏密碼", + "lockScreen": "鎖定屏幕", + "lockScreenBtn": "鎖定", + "home": "首頁" + }, + "multipleTab": { + "setCommon": "設為常用菜單", + "reload": "重新加載", + "close": "關閉標簽頁", + "closeLeft": "關閉左側標簽頁", + "closeRight": "關閉右側標簽頁", + "closeOther": "關閉其它標簽頁", + "closeAll": "關閉全部標簽頁" + }, + "setting": { + "contentModeFull": "流式", + "contentModeFixed": "定寬", + "topMenuAlignLeft": "居左", + "topMenuAlignRight": "居中", + "topMenuAlignCenter": "居右", + "menuTriggerNone": "不顯示", + "menuTriggerBottom": "底部", + "menuTriggerTop": "頂部", + "menuTypeSidebar": "左側菜單模式", + "menuTypeMixSidebar": "左側混合模式", + "menuTypeMix": "頂部混合模式", + "menuTypeTopMenu": "頂部菜單模式", + "defaultBg": "經典主題", + "blueBg": "蔚藍星辰", + "purpleBg": "紫藤蘿蘭", + "greenBg": "碧綠翠風", + "on": "開", + "off": "關", + "minute": "分鐘", + "operatingTitle": "操作成功", + "operatingContent": "復製成功,請到 src/settings/projectSetting.ts 中修改配置!", + "resetSuccess": "重置成功!", + "copyBtn": "拷貝", + "clearBtn": "清空緩存並返回登錄頁", + "drawerTitle": "配置", + "darkMode": "主題", + "navMode": "導航欄模式", + "systemBackground": "系統背景", + "interfaceFunction": "界面功能", + "interfaceDisplay": "界面顯示", + "animation": "動畫", + "splitMenu": "分割菜單", + "closeMixSidebarOnChange": "切換頁面關閉菜單", + "sysTheme": "系統主題", + "headerTheme": "頂欄主題", + "sidebarTheme": "菜單主題", + "menuDrag": "側邊菜單拖拽", + "menuSearch": "菜單搜索", + "toggleLocale": "語言切換", + "menuAccordion": "側邊菜單手風琴模式", + "menuCollapse": "折疊菜單", + "collapseMenuDisplayName": "折疊菜單顯示名稱", + "topMenuLayout": "頂部菜單布局", + "menuCollapseButton": "菜單折疊按鈕", + "contentMode": "內容區域寬度", + "expandedMenuWidth": "菜單展開寬度", + "breadcrumb": "面包屑", + "breadcrumbIcon": "面包屑圖標", + "tabs": "標簽頁", + "tabsIcon": "標簽圖標", + "tabDetail": "標簽詳情頁", + "tabsQuickBtn": "標簽頁快捷按鈕", + "tabsRedoBtn": "標簽頁刷新按鈕", + "tabsFoldBtn": "標簽頁折疊按鈕", + "sidebar": "左側菜單", + "header": "頂欄", + "footer": "頁腳", + "fullContent": "全屏內容", + "grayMode": "灰色模式", + "colorWeak": "色弱模式", + "cachePage": "緩存頁面", + "progress": "頂部進度條", + "switchLoading": "切換loading", + "switchAnimation": "切換動畫", + "animationType": "動畫類型", + "autoScreenLock": "自動鎖屏", + "notAutoScreenLock": "不自動鎖屏", + "fixedHeader": "固定header", + "fixedSideBar": "固定Sidebar", + "mixSidebarTrigger": "混合菜單觸發方式", + "triggerHover": "懸停", + "triggerClick": "點擊", + "mixSidebarFixed": "固定展開菜單" + } + }, + "routes": { + "basic": { + "login": "登錄", + "errorLogList": "錯誤日誌列表", + "home": "首頁", + "externalLink": "鏈接", + "workFlowDetail": "流程詳情", + "emailDetail": "查看郵件", + "previewModel": "功能預覽", + "dataManage": "數據管理" + }, + "mainSystem": "開發平臺", + "workSystem": "業務平臺", + "onlineDev": "在線開發", + "onlineDev-webDesign": "表單設計", + "onlineDev-appDesign": "移動設計", + "onlineDev-report": "報表設計", + "onlineDev-dataReport": "報表設計(原)", + "onlineDev-dataScreen": "大屏設計", + "onlineDev-visualPortal": "門戶設計", + "onlineDev-integration": "集成助手", + "onlineDev-printDev": "打印設計", + "generator": "代碼生成", + "generator-webForm": "功能表單", + "generator-appForm": "移動表單", + "generator-flowForm": "發起表單", + "system": "系統管理", + "system-sysConfig": "系統配置", + "system-notice": "系統公告", + "system-task": "系統調度", + "system-cache": "系統緩存", + "system-log": "系統日誌", + "system-monitor": "系統監控", + "system-icons": "系統圖標", + "system-language": "翻譯管理", + "system-menu": "應用菜單", + "system-area": "行政區劃", + "system-billRule": "單據模板", + "system-systemTemplate": "系統模板", + "system-smsTemplate": "短信模板", + "system-messageTemplate": "消息模板", + "system-signature": "簽章管理", + "system-kit": "表單範本", + "systemData": "數據應用", + "systemData-dataSource": "數據連接", + "systemData-dataModel": "數據建模", + "systemData-dataSync": "數據同步", + "systemData-dataBackup": "數據備份", + "systemData-dataInterface": "數據接口", + "systemData-interfaceAuth": "接口認證", + "systemData-dictionary": "數據字典", + "systemData-map": "數據地圖", + "commonWords": "審批常用語", + "weChat": "微信配置", + "weChat-mpConfig": "公眾號配置", + "weChat-mpMenu": "公眾號菜單", + "weChat-mpUser": "公眾號用戶", + "weChat-mpMessage": "公眾號消息", + "weChat-mpMaterial": "公眾號素材", + "weChat-qyhConfig": "企業號配置", + "weChat-qyDepartment": "企業號組織", + "weChat-qyUser": "企業號用戶", + "weChat-qyMessage": "企業號消息", + "permission": "組織權限", + "permission-grade": "管理員", + "permission-organize": "組織管理", + "permission-department": "部門管理", + "permission-position": "崗位管理", + "permission-user": "用戶管理", + "permission-role": "角色管理", + "permission-group": "分組管理", + "permission-authorize": "權限組", + "permission-auth": "權限管理", + "permission-userOnline": "在線用戶", + "flowEngine": "流程引擎", + "formDesign": "系統表單", + "workFlow": "協同辦公", + "workFlow-form": "表單設計", + "workFlow-flowEngine": "流程設計", + "workFlow-addFlow": "發起流程", + "workFlow-flowLaunch": "我發起的", + "workFlow-flowToSign": "我的待簽", + "workFlow-flowTodo": "我的待辦", + "workFlow-flowDoing": "我的在辦", + "workFlow-flowDone": "我的已辦", + "workFlow-flowCirculate": "抄送我的", + "workFlow-entrust": "流程委托", + "workFlow-flowMonitor": "流程監控", + "workFlow-schedule": "日程安排", + "workFlow-printTemplate": "打印模板", + "workFlow-document": "文檔中心", + "msgCenter": "消息中心", + "msgCenter-accountConfig": "賬號配置", + "msgCenter-accountConfig-mail": "郵箱配置", + "msgCenter-accountConfig-shortMsg": "短信配置", + "msgCenter-accountConfig-weCom": "企業微信配置", + "msgCenter-accountConfig-ding": "釘釘配置", + "msgCenter-accountConfig-webhook": "webhook配置", + "msgCenter-accountConfig-mp": "微信公眾號配置", + "msgCenter-msgTemplate": "消息模板", + "msgCenter-sendConfig": "發送配置", + "msgCenter-msgMonitor": "消息監控", + "extend-graphDemo": "圖表示例", + "extend-graphDemo-echartsBar": "E-柱狀圖", + "extend-graphDemo-echartsPie": "E-餅狀圖", + "extend-graphDemo-echartsBarAcross": "E-橫狀條形圖", + "extend-graphDemo-echartsGauge": "E-儀表圖", + "extend-graphDemo-echartsLineArea": "E-線形圖", + "extend-graphDemo-echartsScatter": "E-散點圖", + "extend-graphDemo-echartsCandlestick": "E-K線圖", + "extend-graphDemo-echartsLineBar": "E-折柱混合圖", + "extend-graphDemo-echartsTree": "E-樹形圖", + "extend-graphDemo-echartsFunnel": "E-漏鬥圖", + "extend-graphDemo-highchartsScatter": "H-散點圖", + "extend-graphDemo-highchartsWordcloud": "H-詞雲圖", + "extend-graphDemo-highchartsLine": "H-線性圖", + "extend-graphDemo-highchartsArea": "H-面積圖", + "extend-graphDemo-highchartsGauge": "H-儀表圖", + "extend-graphDemo-highchartsBellcurve": "H-貝爾曲線", + "extend-graphDemo-highchartsFunnel": "H-漏鬥圖", + "extend-graphDemo-highchartsBullet": "H-子彈圖", + "extend-graphDemo-highchartsColumn": "H-柱狀圖", + "extend-graphDemo-highchartsPie": "H-餅狀圖", + "extend-tableDemo": "表格示例", + "extend-tableDemo-commonTable": "普通表格", + "extend-tableDemo-statisticsTable": "表格統計", + "extend-tableDemo-lockTable": "表格鎖定", + "extend-tableDemo-groupingTable": "表格分組", + "extend-tableDemo-redactTable": "表格編輯", + "extend-tableDemo-complexHeader": "復雜表頭", + "extend-tableDemo-mergeTable": "表格合並", + "extend-tableDemo-printTable": "表格打印", + "extend-tableDemo-extension": "延伸擴展", + "extend-tableDemo-treeTable": "樹形表格", + "extend-tableDemo-postilTable": "表格批註", + "extend-tableDemo-tableTree": "表格樹形", + "extend-tableDemo-signTable": "表格標記", + "extend-formDemo": "表單示例", + "extend-formDemo-verifyForm": "表單驗證", + "extend-formDemo-verifyForm1": "表單驗證1", + "extend-formDemo-fieldForm1": "表單字段1", + "extend-formDemo-fieldForm2": "表單字段2", + "extend-formDemo-fieldForm3": "表單字段3", + "extend-formDemo-fieldForm4": "表單字段4", + "extend-formDemo-fieldForm5": "表單字段5", + "extend-formDemo-fieldForm6": "表單字段6", + "extend": "開發示例", + "extend-bigData": "百萬數據", + "extend-functionDemo": "功能示例", + "extend-portalDemo": "門戶示例", + "extend-orderDemo": "訂單示例", + "extend-importAndExport": "導入導出", + "extend-signet": "電子簽章", + "extend-signature": "電子簽名", + "extend-schedule": "日程安排", + "extend-email": "郵件收發", + "extend-documentPreview": "文檔示例", + "extend-barCode": "條碼示例", + "extend-printData": "打印示例", + "extend-map": "地圖示例", + "extend-order": "訂單管理", + "extend-projectGantt": "項目管理", + "moreMenu": "更多...", + "dataReport": "報表示例(原)", + "report": "報表示例", + "printDemo": "打印示例", + "lioui": "流程示例", + "reportBI": "大屏示例" + }, + "sys": { + "api": { + "operationFailed": "操作失敗", + "errorTip": "錯誤提示", + "errorMessage": "操作失敗,系統異常!", + "timeoutMessage": "登錄超時,請重新登錄!", + "apiTimeoutMessage": "接口請求超時,請刷新頁面重試!", + "apiRequestFailed": "請求出錯,請稍候重試", + "networkException": "網絡異常", + "networkExceptionMsg": "網絡異常,請檢查您的網絡連接是否正常!", + "errMsg401": "用戶沒有權限(令牌、用戶名、密碼錯誤)!", + "errMsg403": "用戶得到授權,但是訪問是被禁止的。!", + "errMsg404": "網絡請求錯誤,未找到該資源!", + "errMsg405": "網絡請求錯誤,請求方法未允許!", + "errMsg408": "網絡請求超時!", + "errMsg500": "服務器錯誤,請聯系管理員!", + "errMsg501": "網絡未實現!", + "errMsg502": "網絡錯誤!", + "errMsg503": "服務不可用,服務器暫時過載或維護!", + "errMsg504": "網絡超時!", + "errMsg505": "http版本不支持該請求!" + }, + "app": { + "logoutTip": "溫馨提醒", + "logoutMessage": "是否確認退出系統?", + "menuLoading": "菜單加載中..." + }, + "validate": { + "textRequiredSuffix": "不能為空", + "arrayRequiredPrefix": "請至少選擇一個", + "number": "請輸入正確的數字", + "money": "請輸入正確的金額", + "telephone": "請輸入正確的電話號碼", + "mobilePhone": "請輸入正確的手機號碼", + "phone": "請輸入正確的聯系方式", + "email": "請輸入正確的郵箱", + "url": "請輸入正確的網址", + "date": "請輸入正確的日期", + "idCard": "請輸入正確的身份證號碼" + }, + "errorLog": { + "tableTitle": "錯誤日誌列表", + "tableColumnType": "類型", + "tableColumnDate": "時間", + "tableColumnFile": "文件", + "tableColumnMsg": "錯誤信息", + "tableColumnStackMsg": "stack信息", + "tableActionDesc": "詳情", + "modalTitle": "錯誤詳情", + "fireVueError": "點擊觸發vue錯誤", + "fireResourceError": "點擊觸發資源加載錯誤", + "fireAjaxError": "點擊觸發ajax錯誤", + "enableMessage": "只在`/src/settings/projectSetting.ts` 內的useErrorHandle=true時生效." + }, + "exception": { + "backLogin": "返回登錄", + "backHome": "返回首頁", + "subTitle403": "抱歉,您無權訪問此頁面。", + "subTitle404": "抱歉,您訪問的頁面不存在。", + "subTitle500": "抱歉,服務器報告錯誤。", + "noDataTitle": "當前頁無數據", + "networkErrorTitle": "網絡錯誤", + "networkErrorSubTitle": "抱歉,您的網絡連接已斷開,請檢查您的網絡!" + }, + "lock": { + "unlock": "點擊解鎖", + "alert": "鎖屏密碼錯誤", + "backToLogin": "返回登錄", + "entry": "進入系統", + "placeholder": "請輸入登錄密碼" + }, + "login": { + "welcome": "歡迎使用", + "subTitle": "通過帳號密碼登錄", + "subTitle1": "通過手機驗證碼登錄,或者切換為", + "subTitle2": "通過帳號密碼登錄,或者切換為", + "subTitle3": "通過掃碼登錄,或者切換為", + "otherLogin": "其他登錄方式", + "backSignIn": "返回", + "signInFormTitle": "賬號密碼登錄", + "mobileSignInFormTitle": "手機驗證碼登錄", + "qrSignInFormTitle": "掃碼登錄", + "signUpFormTitle": "註冊", + "forgetFormTitle": "重置密碼", + "qrCodeTip": "請使用APP掃描二維碼登錄,180秒後二維碼失效", + "signInTitle": "開箱即用的中後臺管理系統", + "signInDesc": "輸入您的個人詳細信息開始使用!", + "policy": "我同意xxx隱私政策", + "scanSign": "掃碼後點擊\"確認\",即可完成登錄", + "loginButton": "登錄", + "registerButton": "註冊", + "rememberMe": "記住我", + "forgetPassword": "忘記密碼?", + "otherSignIn": "其他登錄方式", + "lastLoginInfo": "上次登錄信息", + "accountPlaceholder": "請輸入賬號", + "passwordPlaceholder": "請輸入密碼", + "smsPlaceholder": "請輸入驗證碼", + "mobilePlaceholder": "請輸入手機號碼", + "policyPlaceholder": "勾選後才能註冊", + "diffPwd": "兩次輸入密碼不一致", + "confirmPassword": "確認密碼", + "email": "郵箱", + "title": "賬戶密碼登錄", + "scanTitle": "掃碼登錄", + "codeTitle": "手機驗證登錄", + "logIn": "登錄", + "username": "請輸入賬號", + "password": "請輸入密碼", + "version": "版本", + "upper": "大寫已鎖定", + "scanTip": "掃碼登錄", + "accountTip": "請輸入賬號", + "passwordTip": "請輸入密碼", + "codeTip": "請輸入驗證碼", + "changeCode": "點擊切換驗證碼", + "mobile": "請輸入手機號", + "rightMobile": "請輸入正確的手機號", + "smsCode": "請輸入驗證碼", + "getCode": "獲取驗證碼", + "reSend": "重新發送", + "company": "請輸入公司名", + "contacts": "請輸入聯系人", + "rule": "租戶子賬戶規則:租戶號{'@'}賬戶 例:18577778888{'@'}101001", + "scanSuccessful": "掃碼成功", + "confirmLogin": "請在手機端確認登錄", + "refreshCode": "點擊刷新", + "recoverCode": "取消登錄", + "expired": "二維碼已失效" + } + }, + "formGenerator": { + "component": { + "input": "單行輸入", + "textarea": "多行輸入", + "inputNumber": "數字輸入", + "switch": "開關", + "radio": "單選框組", + "checkbox": "多選框組", + "select": "下拉選擇", + "cascader": "級聯選擇", + "datePicker": "日期選擇", + "timePicker": "時間選擇", + "uploadFile": "文件上傳", + "uploadImg": "圖片上傳", + "colorPicker": "顏色選擇", + "rate": "評分", + "slider": "滑塊", + "editor": "富文本", + "link": "鏈接", + "button": "按鈕", + "text": "文本", + "alert": "提示", + "iframe": "Iframe", + "qrcode": "二維碼", + "barcode": "條形碼", + "organizeSelect": "組織選擇", + "depSelect": "部門選擇", + "posSelect": "崗位選擇", + "userSelect": "用戶選擇", + "roleSelect": "角色選擇", + "groupSelect": "分組選擇", + "usersSelect": "用戶組件", + "table": "設計子表", + "treeSelect": "下拉樹形", + "popupTableSelect": "下拉表格", + "autoComplete": "下拉補全", + "areaSelect": "省市區域", + "billRule": "單據組件", + "relationForm": "關聯表單", + "popupSelect": "彈窗選擇", + "relationFormAttr": "關聯表單屬性", + "popupAttr": "彈窗選擇屬性", + "sign": "手寫簽名", + "location": "定位", + "calculate": "計算公式", + "createUser": "創建人員", + "createTime": "創建時間", + "modifyUser": "修改人員", + "modifyTime": "修改時間", + "currOrganize": "所屬組織", + "currPosition": "所屬崗位", + "groupTitle": "分組標題", + "divider": "分割線", + "collapse": "折疊面板", + "tab": "標簽面板", + "row": "柵格容器", + "card": "卡片容器", + "tableGrid": "表格容器" + }, + "delComponentTip": "確定刪除該組件?", + "cleanComponentTip": "確定要清空所有組件嗎?", + "copyComponentTip": "確定復製該組件?" + }, + "views": { + "http404": { + "tips": "抱歉,你訪問的頁面不存在或無權訪問!", + "subTips": "請檢查您輸入的URL是否正確,或單擊按鈕返回首頁。", + "goBackBtn": "返回首頁" + }, + "dynamicModel": { + "passwordPlaceholder": "請輸入密碼", + "scanAndShare": "掃描二維碼,分享此鏈接", + "showMore": "加載更多", + "hideSome": "隱藏部分" + } + } +} diff --git a/src/locales/lang/zh_TW.ts b/src/locales/lang/zh_TW.ts new file mode 100644 index 0000000..9a4f1ec --- /dev/null +++ b/src/locales/lang/zh_TW.ts @@ -0,0 +1,14 @@ +import antdLocale from 'ant-design-vue/es/locale/zh_TW'; +import zhTWCustomLocale from './zh_TW.json'; +import { flattenObject } from '../helper'; + +const customLocale = flattenObject(zhTWCustomLocale); + +(antdLocale as any).Calendar.timePickerLocale.rangePlaceholder = ['開始時間', '結束時間']; + +export default { + message: { + ...customLocale, + antdLocale, + }, +}; diff --git a/src/locales/setupI18n.ts b/src/locales/setupI18n.ts new file mode 100644 index 0000000..580b119 --- /dev/null +++ b/src/locales/setupI18n.ts @@ -0,0 +1,44 @@ +import type { App } from 'vue'; +import type { I18n, I18nOptions } from 'vue-i18n'; + +import { createI18n } from 'vue-i18n'; +import { setHtmlPageLang, setLoadLocalePool } from './helper'; +import { localeSetting } from '@/settings/localeSetting'; +import { useLocaleStoreWithOut } from '@/store/modules/locale'; + +const { fallback, availableLocales } = localeSetting; + +export let i18n: ReturnType; + +async function createI18nOptions(): Promise { + const localeStore = useLocaleStoreWithOut(); + const locale = localeStore.getLocale; + const defaultLocal = await import(`./lang/${locale}.ts`); + const message = defaultLocal.default?.message ?? {}; + + setHtmlPageLang(locale); + setLoadLocalePool(loadLocalePool => { + loadLocalePool.push(locale); + }); + + return { + legacy: false, + locale, + fallbackLocale: fallback, + messages: { + [locale]: message, + }, + availableLocales: availableLocales, + sync: true, //If you don’t want to inherit locale from global scope, you need to set sync of i18n component option to false. + silentTranslationWarn: false, // true - warning off + missingWarn: false, + silentFallbackWarn: true, + }; +} + +// setup i18n instance with glob +export async function setupI18n(app: App) { + const options = await createI18nOptions(); + i18n = createI18n(options) as I18n; + app.use(i18n); +} diff --git a/src/locales/useLocale.ts b/src/locales/useLocale.ts new file mode 100644 index 0000000..f1d2d9e --- /dev/null +++ b/src/locales/useLocale.ts @@ -0,0 +1,91 @@ +/** + * Multi-language related operations + */ +import type { LocaleType } from '#/config'; + +import { i18n } from './setupI18n'; +import { useLocaleStoreWithOut } from '@/store/modules/locale'; +import { unref, computed } from 'vue'; +import { loadLocalePool, setHtmlPageLang } from './helper'; +import { getLangJson } from '@/api/system/baseLang'; +import { localeSetting } from '@/settings/localeSetting'; + +interface LangModule { + message: Recordable; + dateLocale: Recordable; + dateLocaleName: string; +} + +const { availableLocales } = localeSetting; + +function setI18nLanguage(locale: LocaleType) { + const localeStore = useLocaleStoreWithOut(); + + if (i18n.mode === 'legacy') { + i18n.global.locale = locale; + } else { + (i18n.global.locale as any).value = locale; + } + localeStore.setLocaleInfo({ locale }); + setHtmlPageLang(locale); +} + +export function useLocale() { + const localeStore = useLocaleStoreWithOut(); + const getLocale = computed(() => localeStore.getLocale); + const getShowLocalePicker = computed(() => localeStore.getShowPicker); + + const getAntdLocale = computed((): any => { + return (i18n.global.getLocaleMessage(unref(getLocale)) as any)?.antdLocale ?? {}; + }); + + // Switching the language will change the locale of useI18n + // And submit to configuration modification + async function changeLocale(locale: LocaleType) { + const globalI18n = i18n.global; + const currentLocale = unref(globalI18n.locale); + if (currentLocale === locale) { + return locale; + } + + if (loadLocalePool.includes(locale)) { + setI18nLanguage(locale); + return locale; + } + if (!availableLocales.includes(locale)) locale = 'zh_CN'; + const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule; + if (!langModule) return; + + const { message } = langModule; + + globalI18n.setLocaleMessage(locale, message); + loadLocalePool.push(locale); + + setI18nLanguage(locale); + return locale; + } + async function initLocale(locale: LocaleType) { + const res = await getLangJson(); + if (!res || !res.data) return; + const message = JSON.parse(res.data); + if (!availableLocales.includes(locale)) locale = 'zh_CN'; + const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule; + if (!langModule) return setLocale(locale, message); + const { message: defaultMessage } = langModule; + setLocale(locale, { ...defaultMessage, ...message }); + } + function setLocale(locale: LocaleType, message) { + const globalI18n = i18n.global; + globalI18n.setLocaleMessage(locale, message); + loadLocalePool.push(locale); + setI18nLanguage(locale); + } + + return { + getLocale, + getShowLocalePicker, + changeLocale, + initLocale, + getAntdLocale, + }; +} diff --git a/src/logics/error-handle/index.ts b/src/logics/error-handle/index.ts new file mode 100644 index 0000000..2bb8fa3 --- /dev/null +++ b/src/logics/error-handle/index.ts @@ -0,0 +1,178 @@ +/** + * Used to configure the global error handling function, which can monitor vue errors, script errors, static resource errors and Promise errors + */ + +import type { ErrorLogInfo } from '#/store'; + +import { useErrorLogStoreWithOut } from '@/store/modules/errorLog'; + +import { ErrorTypeEnum } from '@/enums/exceptionEnum'; +import { App } from 'vue'; +import projectSetting from '@/settings/projectSetting'; + +/** + * Handling error stack information + * @param error + */ +function processStackMsg(error: Error) { + if (!error.stack) { + return ''; + } + let stack = error.stack + .replace(/\n/gi, '') // Remove line breaks to save the size of the transmitted content + .replace(/\bat\b/gi, '@') // At in chrome, @ in ff + .split('@') // Split information with @ + .slice(0, 9) // The maximum stack length (Error.stackTraceLimit = 10), so only take the first 10 + .map(v => v.replace(/^\s*|\s*$/g, '')) // Remove extra spaces + .join('~') // Manually add separators for later display + .replace(/\?[^:]+/gi, ''); // Remove redundant parameters of js file links (?x=1 and the like) + const msg = error.toString(); + if (stack.indexOf(msg) < 0) { + stack = msg + '@' + stack; + } + return stack; +} + +/** + * get comp name + * @param vm + */ +function formatComponentName(vm: any) { + if (vm.$root === vm) { + return { + name: 'root', + path: 'root', + }; + } + + const options = vm.$options as any; + if (!options) { + return { + name: 'anonymous', + path: 'anonymous', + }; + } + const name = options.name || options._componentTag; + return { + name: name, + path: options.__file, + }; +} + +/** + * Configure Vue error handling function + */ + +function vueErrorHandler(err: Error, vm: any, info: string) { + const errorLogStore = useErrorLogStoreWithOut(); + const { name, path } = formatComponentName(vm); + errorLogStore.addErrorLogInfo({ + type: ErrorTypeEnum.VUE, + name, + file: path, + message: err.message, + stack: processStackMsg(err), + detail: info, + url: window.location.href, + }); +} + +/** + * Configure script error handling function + */ +export function scriptErrorHandler(event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error) { + if (event === 'Script error.' && !source) { + return false; + } + const errorInfo: Partial = {}; + colno = colno || (window.event && (window.event as any).errorCharacter) || 0; + errorInfo.message = event as string; + if (error?.stack) { + errorInfo.stack = error.stack; + } else { + errorInfo.stack = ''; + } + const name = source ? source.substr(source.lastIndexOf('/') + 1) : 'script'; + const errorLogStore = useErrorLogStoreWithOut(); + errorLogStore.addErrorLogInfo({ + type: ErrorTypeEnum.SCRIPT, + name: name, + file: source as string, + detail: 'lineno' + lineno, + url: window.location.href, + ...(errorInfo as Pick), + }); + return true; +} + +/** + * Configure Promise error handling function + */ +function registerPromiseErrorHandler() { + window.addEventListener( + 'unhandledrejection', + function (event) { + const errorLogStore = useErrorLogStoreWithOut(); + errorLogStore.addErrorLogInfo({ + type: ErrorTypeEnum.PROMISE, + name: 'Promise Error!', + file: 'none', + detail: 'promise error!', + url: window.location.href, + stack: 'promise error!', + message: event.reason, + }); + }, + true, + ); +} + +/** + * Configure monitoring resource loading error handling function + */ +function registerResourceErrorHandler() { + // Monitoring resource loading error(img,script,css,and jsonp) + window.addEventListener( + 'error', + function (e: Event) { + const target = e.target ? e.target : (e.srcElement as any); + const errorLogStore = useErrorLogStoreWithOut(); + errorLogStore.addErrorLogInfo({ + type: ErrorTypeEnum.RESOURCE, + name: 'Resource Error!', + file: (e.target || ({} as any)).currentSrc, + detail: JSON.stringify({ + tagName: target.localName, + html: target.outerHTML, + type: e.type, + }), + url: window.location.href, + stack: 'resource is not found', + message: (e.target || ({} as any)).localName + ' is load error', + }); + }, + true, + ); +} + +/** + * Configure global error handling + * @param app + */ +export function setupErrorHandle(app: App) { + const { useErrorHandle } = projectSetting; + if (!useErrorHandle) { + return; + } + // Vue exception monitoring; + app.config.errorHandler = vueErrorHandler; + + // script error + window.onerror = scriptErrorHandler; + + // promise exception + registerPromiseErrorHandler(); + + // Static resource exception + registerResourceErrorHandler(); +} diff --git a/src/logics/initAppConfig.ts b/src/logics/initAppConfig.ts new file mode 100644 index 0000000..e8879cc --- /dev/null +++ b/src/logics/initAppConfig.ts @@ -0,0 +1,84 @@ +/** + * Application configuration + */ +import type { ProjectConfig } from '#/config'; + +import { PROJ_CFG_KEY } from '@/enums/cacheEnum'; +import projectSetting from '@/settings/projectSetting'; + +import { updateHeaderBgColor, updateSidebarBgColor } from '@/logics/theme/updateBackground'; +import { updateColorWeak } from '@/logics/theme/updateColorWeak'; +import { updateGrayMode } from '@/logics/theme/updateGrayMode'; +import { updateDarkTheme } from '@/logics/theme/dark'; +import { changeTheme } from '@/logics/theme'; + +import { useAppStore } from '@/store/modules/app'; +import { useLocaleStore } from '@/store/modules/locale'; + +import { getCommonStoragePrefix, getStorageShortName } from '@/utils/env'; + +import { primaryColor } from '../../build/config/themeConfig'; +import { Persistent } from '@/utils/cache/persistent'; +import { deepMerge } from '@/utils'; +import { ThemeEnum } from '@/enums/appEnum'; + +// Initial project configuration +export function initAppConfigStore() { + const localeStore = useLocaleStore(); + const appStore = useAppStore(); + let projCfg: ProjectConfig = Persistent.getLocal(PROJ_CFG_KEY) as ProjectConfig; + projCfg = deepMerge(projectSetting, projCfg || {}); + const darkMode = appStore.getDarkMode; + const { + colorWeak, + grayMode, + themeColor, + + headerSetting: { bgColor: headerBgColor } = {}, + menuSetting: { bgColor } = {}, + } = projCfg; + try { + if (themeColor && themeColor !== primaryColor) { + changeTheme(themeColor); + } + + grayMode && updateGrayMode(grayMode); + colorWeak && updateColorWeak(colorWeak); + } catch (error) { + console.log(error); + } + appStore.setProjectConfig(projCfg); + + // init dark mode + updateDarkTheme(darkMode); + if (darkMode === ThemeEnum.DARK) { + updateHeaderBgColor(); + updateSidebarBgColor(); + } else { + headerBgColor && updateHeaderBgColor(headerBgColor); + bgColor && updateSidebarBgColor(bgColor); + } + // init store + localeStore.initLocale(); + + setTimeout(() => { + clearObsoleteStorage(); + }, 16); +} + +/** + * As the version continues to iterate, there will be more and more cache keys stored in localStorage. + * This method is used to delete useless keys + */ +export function clearObsoleteStorage() { + const commonPrefix = getCommonStoragePrefix(); + const shortPrefix = getStorageShortName(); + + [localStorage, sessionStorage].forEach((item: Storage) => { + Object.keys(item).forEach(key => { + if (key && key.startsWith(commonPrefix) && !key.startsWith(shortPrefix)) { + item.removeItem(key); + } + }); + }); +} diff --git a/src/logics/mitt/routeChange.ts b/src/logics/mitt/routeChange.ts new file mode 100644 index 0000000..ed553c0 --- /dev/null +++ b/src/logics/mitt/routeChange.ts @@ -0,0 +1,28 @@ +/** + * Used to monitor routing changes to change the status of menus and tabs. There is no need to monitor the route, because the route status change is affected by the page rendering time, which will be slow + */ + +import mitt from '@/utils/mitt'; +import type { RouteLocationNormalized } from 'vue-router'; +import { getRawRoute } from '@/utils'; + +const emitter = mitt(); + +const key = Symbol(); + +let lastChangeTab: RouteLocationNormalized; + +export function setRouteChange(lastChangeRoute: RouteLocationNormalized) { + const r = getRawRoute(lastChangeRoute); + emitter.emit(key, r); + lastChangeTab = r; +} + +export function listenerRouteChange(callback: (route: RouteLocationNormalized) => void, immediate = true) { + emitter.on(key, callback); + immediate && lastChangeTab && callback(lastChangeTab); +} + +export function removeTabChangeListener() { + emitter.clear(); +} diff --git a/src/logics/theme/dark.ts b/src/logics/theme/dark.ts new file mode 100644 index 0000000..cd4df47 --- /dev/null +++ b/src/logics/theme/dark.ts @@ -0,0 +1,24 @@ +import { darkCssIsReady, loadDarkThemeCss } from '@rys-fe/vite-plugin-theme/es/client'; +import { addClass, hasClass, removeClass } from '@/utils/domUtils'; + +export async function updateDarkTheme(mode: string | null = 'light') { + const htmlRoot = document.getElementById('htmlRoot'); + if (!htmlRoot) { + return; + } + const hasDarkClass = hasClass(htmlRoot, 'dark'); + if (mode === 'dark') { + if (import.meta.env.PROD && !darkCssIsReady) { + await loadDarkThemeCss(); + } + htmlRoot.setAttribute('data-theme', 'dark'); + if (!hasDarkClass) { + addClass(htmlRoot, 'dark'); + } + } else { + htmlRoot.setAttribute('data-theme', 'light'); + if (hasDarkClass) { + removeClass(htmlRoot, 'dark'); + } + } +} diff --git a/src/logics/theme/index.ts b/src/logics/theme/index.ts new file mode 100644 index 0000000..1570635 --- /dev/null +++ b/src/logics/theme/index.ts @@ -0,0 +1,20 @@ +import { getThemeColors, generateColors } from '../../../build/config/themeConfig'; + +import { replaceStyleVariables } from '@rys-fe/vite-plugin-theme/es/client'; +import { mixLighten, mixDarken, tinycolor } from '@rys-fe/vite-plugin-theme/es/colorUtils'; +import { useAppStore } from '@/store/modules/app'; + +export async function changeTheme(color: string) { + const appStore = useAppStore(); + appStore.setProjectConfig({ themeColor: color }); + const colors = generateColors({ + mixDarken, + mixLighten, + tinycolor, + color, + }); + + return await replaceStyleVariables({ + colorVariables: [...getThemeColors(color), ...colors], + }); +} diff --git a/src/logics/theme/updateBackground.ts b/src/logics/theme/updateBackground.ts new file mode 100644 index 0000000..cfabb7b --- /dev/null +++ b/src/logics/theme/updateBackground.ts @@ -0,0 +1,75 @@ +import { colorIsDark, lighten, darken } from '@/utils/color'; +import { useAppStore } from '@/store/modules/app'; +import { ThemeEnum } from '@/enums/appEnum'; +import { setCssVar } from './util'; + +const HEADER_BG_COLOR_VAR = '--header-bg-color'; +const HEADER_BG_HOVER_COLOR_VAR = '--header-bg-hover-color'; +const HEADER_MENU_ACTIVE_BG_COLOR_VAR = '--header-active-menu-bg-color'; + +const SIDER_DARK_BG_COLOR = '--sider-dark-bg-color'; +const SIDER_DARK_DARKEN_BG_COLOR = '--sider-dark-darken-bg-color'; +const SIDER_LIGHTEN_BG_COLOR = '--sider-dark-lighten-bg-color'; + +/** + * Change the background color of the top header + * @param color + */ +export function updateHeaderBgColor(color?: string) { + const appStore = useAppStore(); + const darkMode = appStore.getDarkMode === ThemeEnum.DARK; + if (!color) { + if (darkMode) { + color = '#151515'; + } else { + color = appStore.getHeaderSetting.bgColor; + } + } + // bg color + setCssVar(HEADER_BG_COLOR_VAR, color); + + // hover color + const hoverColor = lighten(color!, 6); + setCssVar(HEADER_BG_HOVER_COLOR_VAR, hoverColor); + setCssVar(HEADER_MENU_ACTIVE_BG_COLOR_VAR, hoverColor); + + // Determine the depth of the color value and automatically switch the theme + const isDark = colorIsDark(color!); + + appStore.setProjectConfig({ + headerSetting: { + theme: isDark || darkMode ? ThemeEnum.DARK : ThemeEnum.LIGHT, + }, + }); +} + +/** + * Change the background color of the left menu + * @param color bg color + */ +export function updateSidebarBgColor(color?: string) { + const appStore = useAppStore(); + + // if (!isHexColor(color)) return; + const darkMode = appStore.getDarkMode === ThemeEnum.DARK; + if (!color) { + if (darkMode) { + color = '#212121'; + } else { + color = appStore.getMenuSetting.bgColor; + } + } + setCssVar(SIDER_DARK_BG_COLOR, color); + setCssVar(SIDER_DARK_DARKEN_BG_COLOR, darken(color!, 6)); + setCssVar(SIDER_LIGHTEN_BG_COLOR, lighten(color!, 5)); + + // only #ffffff is light + // Only when the background color is #fff, the theme of the menu will be changed to light + const isLight = ['#fff', '#ffffff'].includes(color!.toLowerCase()); + + appStore.setProjectConfig({ + menuSetting: { + theme: isLight && !darkMode ? ThemeEnum.LIGHT : ThemeEnum.DARK, + }, + }); +} diff --git a/src/logics/theme/updateColorWeak.ts b/src/logics/theme/updateColorWeak.ts new file mode 100644 index 0000000..8a0e64a --- /dev/null +++ b/src/logics/theme/updateColorWeak.ts @@ -0,0 +1,9 @@ +import { toggleClass } from './util'; + +/** + * Change the status of the project's color weakness mode + * @param colorWeak + */ +export function updateColorWeak(colorWeak: boolean) { + toggleClass(colorWeak, 'color-weak', document.documentElement); +} diff --git a/src/logics/theme/updateGrayMode.ts b/src/logics/theme/updateGrayMode.ts new file mode 100644 index 0000000..0fd16fe --- /dev/null +++ b/src/logics/theme/updateGrayMode.ts @@ -0,0 +1,9 @@ +import { toggleClass } from './util'; + +/** + * Change project gray mode status + * @param gray + */ +export function updateGrayMode(gray: boolean) { + toggleClass(gray, 'gray-mode', document.documentElement); +} diff --git a/src/logics/theme/util.ts b/src/logics/theme/util.ts new file mode 100644 index 0000000..30aef37 --- /dev/null +++ b/src/logics/theme/util.ts @@ -0,0 +1,11 @@ +const docEle = document.documentElement; +export function toggleClass(flag: boolean, clsName: string, target?: HTMLElement) { + const targetEl = target || document.body; + let { className } = targetEl; + className = className.replace(clsName, ''); + targetEl.className = flag ? `${className} ${clsName} ` : className; +} + +export function setCssVar(prop: string, val: any, dom = docEle) { + dom.style.setProperty(prop, val); +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..3f7e1c9 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,73 @@ +import 'ant-design-vue/dist/reset.css'; +import 'yunzhupaas-univer/dist/style.css'; // TODO: 需要安装 yunzhupaas-univer 包 +import '@/design/index.less'; +import '@/design/windi-base.css'; +import 'virtual:windi-components.css'; +import 'virtual:windi-utilities.css'; +// Register icon sprite +import 'virtual:svg-icons-register'; +import App from './App.vue'; +import { createApp } from 'vue'; +import { initAppConfigStore } from '@/logics/initAppConfig'; +import { setupErrorHandle } from '@/logics/error-handle'; +import { router, setupRouter } from '@/router'; +import { setupRouterGuard } from '@/router/guard'; +import { setupStore } from '@/store'; +import { setupGlobDirectives } from '@/directives'; +import { setupI18n } from '@/locales/setupI18n'; +import { registerGlobComp } from '@/components/registerGlobComp'; +import gridLayout from 'vue-grid-layout'; +import mitt from '@/utils/mitt'; +// 修复打印插件会一直自动连接websocket的问题 +import { disAutoConnect } from 'vue-plugin-hiprint'; +disAutoConnect(); + +const emitter = mitt(); + +async function bootstrap() { + const app = createApp(App); + + app.provide('emitter', emitter); // 注入provider + + // Configure store + // 配置 store + setupStore(app); + + // Initialize internal system configuration + // 初始化内部系统配置 + initAppConfigStore(); + + // Register global components + // 注册全局组件 + registerGlobComp(app); + + // Multilingual configuration + // 多语言配置 + // Asynchronous case: language files may be obtained from the server side + // 异步案例:语言文件可能从服务器端获取 + await setupI18n(app); + + // Configure routing + // 配置路由 + setupRouter(app); + + // router-guard + // 路由守卫 + setupRouterGuard(router); + + // Register global directive + // 注册全局指令 + setupGlobDirectives(app); + + // Configure global error handling + // 配置全局错误处理 + setupErrorHandle(app); + + // https://next.router.vuejs.org/api/#isready + // await router.isReady(); + app.use(gridLayout); + + app.mount('#app'); +} + +bootstrap(); diff --git a/src/router/constant.ts b/src/router/constant.ts new file mode 100644 index 0000000..7369bd7 --- /dev/null +++ b/src/router/constant.ts @@ -0,0 +1,26 @@ +export const REDIRECT_NAME = 'Redirect'; + +export const PARENT_LAYOUT_NAME = 'ParentLayout'; + +export const PAGE_NOT_FOUND_NAME = 'PageNotFound'; + +export const CHILDREN_PAGE_NOT_FOUND_NAME = 'ChildrenPageNotFound'; + +export const EXCEPTION_COMPONENT = () => import('@/views/basic/exception/Exception.vue'); + +/** + * @description: default layout + */ +export const LAYOUT = () => import('@/layouts/default/index.vue'); + +/** + * @description: parent-layout + */ +export const getParentLayout = (_name?: string) => { + return () => + new Promise(resolve => { + resolve({ + name: _name || PARENT_LAYOUT_NAME, + }); + }); +}; diff --git a/src/router/guard/index.ts b/src/router/guard/index.ts new file mode 100644 index 0000000..3311bfd --- /dev/null +++ b/src/router/guard/index.ts @@ -0,0 +1,147 @@ +import type { Router, RouteLocationNormalized } from 'vue-router'; +import { useAppStoreWithOut } from '@/store/modules/app'; +import { useUserStoreWithOut } from '@/store/modules/user'; +import { useTransitionSetting } from '@/hooks/setting/useTransitionSetting'; +import { AxiosCanceler } from '@/utils/http/axios/axiosCancel'; +import { Modal, notification } from 'ant-design-vue'; +import { warn } from '@/utils/log'; +import { unref } from 'vue'; +import { setRouteChange } from '@/logics/mitt/routeChange'; +import { createPermissionGuard } from './permissionGuard'; +import { createStateGuard } from './stateGuard'; +import nProgress from 'nprogress'; +import projectSetting from '@/settings/projectSetting'; +// import { createParamMenuGuard } from './paramMenuGuard'; + +// Don't change the order of creation +export function setupRouterGuard(router: Router) { + createPageGuard(router); + createPageLoadingGuard(router); + createHttpGuard(router); + createScrollGuard(router); + createMessageGuard(router); + createProgressGuard(router); + createPermissionGuard(router); + // createParamMenuGuard(router); // must after createPermissionGuard (menu has been built.) + createStateGuard(router); +} + +/** + * Hooks for handling page state + */ +function createPageGuard(router: Router) { + const loadedPageMap = new Map(); + + router.beforeEach(async to => { + // The page has already been loaded, it will be faster to open it again, you don’t need to do loading and other processing + to.meta.loaded = !!loadedPageMap.get(to.path); + // Notify routing changes + setRouteChange(to); + + return true; + }); + + router.afterEach(to => { + loadedPageMap.set(to.path, true); + }); +} + +// Used to handle page loading status +function createPageLoadingGuard(router: Router) { + const userStore = useUserStoreWithOut(); + const appStore = useAppStoreWithOut(); + const { getOpenPageLoading } = useTransitionSetting(); + router.beforeEach(async to => { + if (!userStore.getToken) { + return true; + } + if (to.meta.loaded) { + return true; + } + + if (unref(getOpenPageLoading)) { + appStore.setPageLoadingAction(true); + return true; + } + + return true; + }); + router.afterEach(async () => { + if (unref(getOpenPageLoading)) { + // TODO Looking for a better way + // The timer simulates the loading time to prevent flashing too fast, + setTimeout(() => { + appStore.setPageLoading(false); + }, 220); + } + return true; + }); +} + +/** + * The interface used to close the current page to complete the request when the route is switched + * @param router + */ +function createHttpGuard(router: Router) { + const { removeAllHttpPending } = projectSetting; + let axiosCanceler: Nullable; + if (removeAllHttpPending) { + axiosCanceler = new AxiosCanceler(); + } + router.beforeEach(async () => { + // Switching the route will delete the previous request + axiosCanceler?.removeAllPending(); + return true; + }); +} + +// Routing switch back to the top +function createScrollGuard(router: Router) { + const isHash = (href: string) => { + return /^#/.test(href); + }; + + const body = document.body; + + router.afterEach(async to => { + // scroll top + isHash((to as RouteLocationNormalized & { href: string })?.href) && body.scrollTo(0, 0); + return true; + }); +} + +/** + * Used to close the message instance when the route is switched + * @param router + */ +export function createMessageGuard(router: Router) { + const { closeMessageOnSwitch } = projectSetting; + + router.beforeEach(async () => { + try { + if (closeMessageOnSwitch) { + Modal.destroyAll(); + notification.destroy(); + } + } catch (error) { + warn('message guard error:' + error); + } + return true; + }); +} + +export function createProgressGuard(router: Router) { + const { getOpenNProgress } = useTransitionSetting(); + router.beforeEach(async to => { + if (to.meta.loaded) { + return true; + } + unref(getOpenNProgress) && nProgress.start(); + return true; + }); + + router.afterEach(async () => { + unref(getOpenNProgress) && nProgress.done(); + return true; + }); +} diff --git a/src/router/guard/paramMenuGuard.ts b/src/router/guard/paramMenuGuard.ts new file mode 100644 index 0000000..15b35cc --- /dev/null +++ b/src/router/guard/paramMenuGuard.ts @@ -0,0 +1,27 @@ +import type { Router } from 'vue-router'; +import { configureDynamicParamsMenu } from '../helper/menuHelper'; +import { Menu } from '../types'; + +import { usePermissionStoreWithOut } from '@/store/modules/permission'; + +export function createParamMenuGuard(router: Router) { + const permissionStore = usePermissionStoreWithOut(); + router.beforeEach(async (to, _, next) => { + // filter no name route + if (!to.name) { + next(); + return; + } + + // menu has been built. + if (!permissionStore.getIsDynamicAddedRoute) { + next(); + return; + } + + let menus: Menu[] = permissionStore.getMenuList; + menus.forEach(item => configureDynamicParamsMenu(item, to.params)); + + next(); + }); +} diff --git a/src/router/guard/permissionGuard.ts b/src/router/guard/permissionGuard.ts new file mode 100644 index 0000000..0eed350 --- /dev/null +++ b/src/router/guard/permissionGuard.ts @@ -0,0 +1,108 @@ +import type { Router, RouteRecordRaw } from 'vue-router'; + +import { usePermissionStoreWithOut } from '@/store/modules/permission'; + +import { PageEnum } from '@/enums/pageEnum'; +import { useUserStoreWithOut } from '@/store/modules/user'; + +import { PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic'; + +const LOGIN_PATH = PageEnum.BASE_LOGIN; +const SSO_PATH = PageEnum.BASE_SSO; +const BASE_FORM_SHORT_LINK_PATH = PageEnum.BASE_FORM_SHORT_LINK; + +const whitePathList: PageEnum[] = [LOGIN_PATH, SSO_PATH, BASE_FORM_SHORT_LINK_PATH, PageEnum.FLOW_FILE, PageEnum.FLOW_CHART]; + +export function createPermissionGuard(router: Router) { + const userStore = useUserStoreWithOut(); + const permissionStore = usePermissionStoreWithOut(); + router.beforeEach(async (to, from, next) => { + const token = userStore.getToken; + + if (to.path == '/workFlowDetail' && to.query.token && token != to.query.token) { + userStore.updateToken(to.query.token as string); + next({ ...to, replace: true }); + return; + } + + // Whitelist can be directly entered + if (whitePathList.includes(to.path as PageEnum)) { + if (to.path === LOGIN_PATH && token) { + const isSessionTimeout = userStore.getSessionTimeout; + try { + await userStore.afterLoginAction(); + if (!isSessionTimeout) { + next((to.query?.redirect as string) || '/'); + return; + } + } catch {} + } + next(); + return; + } + + // token does not exist + if (!token) { + // You can access without permission. You need to set the routing meta.ignoreAuth to true + if (to.meta.ignoreAuth) { + next(); + return; + } + + // redirect login page + const redirectData: { path: string; replace: boolean; query?: Recordable } = { + path: LOGIN_PATH, + replace: true, + }; + if (to.path) { + redirectData.query = { + ...redirectData.query, + redirect: to.path, + }; + } + next(redirectData); + return; + } + + // Jump to the 404 page after processing the login + if (from.path === LOGIN_PATH && to.name === PAGE_NOT_FOUND_ROUTE.name && to.fullPath !== PageEnum.BASE_HOME) { + next(PageEnum.BASE_HOME); + return; + } + + // get userinfo while last fetch time is empty + if (userStore.getLastUpdateTime === 0) { + try { + await userStore.getUserInfoAction(); + } catch (err) { + next(); + return; + } + } + + if (permissionStore.getIsDynamicAddedRoute) { + next(); + return; + } + + const routes = await permissionStore.buildRoutesAction(); + + routes.forEach(route => { + router.addRoute(route as unknown as RouteRecordRaw); + }); + + router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw); + + permissionStore.setDynamicAddedRoute(true); + + if (to.name === PAGE_NOT_FOUND_ROUTE.name || to.name === (PAGE_NOT_FOUND_ROUTE as any)?.children[0]?.name) { + // 动态添加路由后,此处应当重定向到fullPath,否则会加载404页面内容 + next({ path: to.fullPath, replace: true, query: to.query }); + } else { + const redirectPath = (from.query.redirect || to.path) as string; + const redirect = decodeURIComponent(redirectPath); + const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }; + next(nextData); + } + }); +} diff --git a/src/router/guard/stateGuard.ts b/src/router/guard/stateGuard.ts new file mode 100644 index 0000000..2cf35d0 --- /dev/null +++ b/src/router/guard/stateGuard.ts @@ -0,0 +1,24 @@ +import type { Router } from 'vue-router'; +import { useAppStore } from '@/store/modules/app'; +import { useMultipleTabStore } from '@/store/modules/multipleTab'; +import { useUserStore } from '@/store/modules/user'; +import { usePermissionStore } from '@/store/modules/permission'; +import { PageEnum } from '@/enums/pageEnum'; +import { removeTabChangeListener } from '@/logics/mitt/routeChange'; + +export function createStateGuard(router: Router) { + router.afterEach(to => { + // Just enter the login page and clear the authentication information + if (to.path === PageEnum.BASE_LOGIN) { + const tabStore = useMultipleTabStore(); + const userStore = useUserStore(); + const appStore = useAppStore(); + const permissionStore = usePermissionStore(); + appStore.resetAllState(); + permissionStore.resetState(); + tabStore.resetState(); + userStore.resetState(); + removeTabChangeListener(); + } + }); +} diff --git a/src/router/helper/menuHelper.ts b/src/router/helper/menuHelper.ts new file mode 100644 index 0000000..d36d6ca --- /dev/null +++ b/src/router/helper/menuHelper.ts @@ -0,0 +1,106 @@ +import { AppRouteModule } from '@/router/types'; +import type { MenuModule, Menu, AppRouteRecordRaw } from '@/router/types'; +import { findPath, treeMap } from '@/utils/helper/treeHelper'; +import { cloneDeep } from 'lodash-es'; +import { isUrl } from '@/utils/is'; +import { RouteParams } from 'vue-router'; +import { toRaw } from 'vue'; + +export function getAllParentPath(treeData: T[], path: string) { + const menuList = findPath(treeData, n => n.path === path) as Menu[]; + return (menuList || []).map(item => item.path); +} + +// 路径处理 +function joinParentPath(menus: Menu[], parentPath = '') { + for (let index = 0; index < menus.length; index++) { + const menu = menus[index]; + // https://next.router.vuejs.org/guide/essentials/nested-routes.html + // Note that nested paths that start with / will be treated as a root path. + // 请注意,以 / 开头的嵌套路径将被视为根路径。 + // This allows you to leverage the component nesting without having to use a nested URL. + // 这允许你利用组件嵌套,而无需使用嵌套 URL。 + if (!(menu.path.startsWith('/') || isUrl(menu.path))) { + // path doesn't start with /, nor is it a url, join parent path + // 路径不以 / 开头,也不是 url,加入父路径 + menu.path = `${parentPath}/${menu.path}`; + } + if (menu?.children?.length) { + joinParentPath(menu.children, menu.meta?.hidePathForChildren ? parentPath : menu.path); + } + } +} + +// Parsing the menu module +export function transformMenuModule(menuModule: MenuModule): Menu { + const { menu } = menuModule; + + const menuList = [menu]; + + joinParentPath(menuList); + return menuList[0]; +} + +// 将路由转换成菜单 +export function transformRouteToMenu(routeModList: AppRouteModule[], routerMapping = false) { + // 借助 lodash 深拷贝 + const cloneRouteModList = cloneDeep(routeModList); + const routeList: AppRouteRecordRaw[] = []; + + // 对路由项进行修改 + cloneRouteModList.forEach(item => { + if (routerMapping && item.meta.hideChildrenInMenu && typeof item.redirect === 'string') { + item.path = item.redirect; + } + + if (item.meta?.single) { + const realItem = item?.children?.[0]; + realItem && routeList.push(realItem); + } else { + routeList.push(item); + } + }); + // 提取树指定结构 + const list = treeMap(routeList, { + conversion: (node: AppRouteRecordRaw) => { + const { meta: { title, hideMenu = false } = {} } = node; + + return { + ...(node.meta || {}), + meta: node.meta, + name: title, + hideMenu, + path: node.path, + ...(node.redirect ? { redirect: node.redirect } : {}), + }; + }, + }); + // 路径处理 + joinParentPath(list); + return cloneDeep(list); +} + +/** + * config menu with given params + */ +const menuParamRegex = /(?::)([\s\S]+?)((?=\/)|$)/g; + +export function configureDynamicParamsMenu(menu: Menu, params: RouteParams) { + const { path, paramPath } = toRaw(menu); + let realPath = paramPath ? paramPath : path; + const matchArr = realPath.match(menuParamRegex); + + matchArr?.forEach(it => { + const realIt = it.substr(1); + if (params[realIt]) { + realPath = realPath.replace(`:${realIt}`, params[realIt] as string); + } + }); + // save original param path. + if (!paramPath && matchArr && matchArr.length > 0) { + menu.paramPath = path; + } + menu.path = realPath; + // children + menu.children?.forEach(item => configureDynamicParamsMenu(item, params)); +} diff --git a/src/router/helper/routeHelper.ts b/src/router/helper/routeHelper.ts new file mode 100644 index 0000000..0fa2147 --- /dev/null +++ b/src/router/helper/routeHelper.ts @@ -0,0 +1,311 @@ +import type { AppRouteModule, AppRouteRecordRaw } from '@/router/types'; +import type { Router, RouteRecordNormalized } from 'vue-router'; +import { PageEnum } from '@/enums/pageEnum'; + +import { getParentLayout, LAYOUT, EXCEPTION_COMPONENT } from '@/router/constant'; +import { cloneDeep, omit } from 'lodash-es'; +import { warn } from '@/utils/log'; +import { createRouter, createWebHashHistory } from 'vue-router'; +import { defineComponent, defineAsyncComponent, h } from 'vue'; +import { useGlobSetting } from '@/hooks/setting'; +import { getToken } from '@/utils/auth'; +import { BackMenu } from '@/api/basic/model/userModel'; + +export type LayoutMapKey = 'LAYOUT'; +const IFRAME = () => import('@/views/basic/iframe/FrameBlank.vue'); +const ONLINE_MODEL = () => import('@/views/common/dynamicModel/index.vue'); +const ONLINE_DICT = () => import('@/views/common/dynamicDictionary/index.vue'); +const ONLINE_REPORT = () => import('@/views/common/dynamicReport/index.vue'); +const ONLINE_DATA_REPORT = () => import('@/views/common/dynamicDataReport/index.vue'); +const ONLINE_PORTAL = () => import('@/views/common/dynamicPortal/index.vue'); + +const LayoutMap = new Map Promise>(); + +LayoutMap.set('LAYOUT', LAYOUT); +LayoutMap.set('IFRAME', IFRAME); +LayoutMap.set('ONLINE_MODEL', ONLINE_MODEL); +LayoutMap.set('ONLINE_DICT', ONLINE_DICT); +LayoutMap.set('ONLINE_REPORT', ONLINE_REPORT); +LayoutMap.set('ONLINE_DATA_REPORT', ONLINE_DATA_REPORT); +LayoutMap.set('ONLINE_PORTAL', ONLINE_PORTAL); + +let dynamicViewsModules: Record Promise>; + +/** + * 将指定组件设置自定义名称 + * + * @param {String} name 组件自定义名称 + * @param {AsyncComponent} component + * @return {Component} + */ +function createCustomComponent(customName, asyncComponent) { + return defineComponent({ + name: customName, + setup() { + return () => h(asyncComponent); + }, + }); +} + +// Dynamic introduction +function asyncImportRoute(routes: AppRouteRecordRaw[] | undefined) { + dynamicViewsModules = dynamicViewsModules || import.meta.glob('../../views/**/*.{vue,tsx}'); + if (!routes) return; + routes.forEach(item => { + if (!item.component && item.meta?.frameSrc) { + item.component = 'IFRAME'; + } + const { component, name } = item; + const { children } = item; + if (component) { + const layoutFound = LayoutMap.get(component.toUpperCase()); + if (layoutFound) { + item.component = ['LAYOUT', 'IFRAME'].includes(component) ? layoutFound : createCustomComponent(name, defineAsyncComponent(layoutFound)); + } else { + item.component = dynamicImport(dynamicViewsModules, component as string); + } + } else if (name) { + item.component = getParentLayout(); + } + children && asyncImportRoute(children); + }); +} + +function dynamicImport(dynamicViewsModules: Record Promise>, component: string) { + const keys = Object.keys(dynamicViewsModules); + + const matchKeys = keys.filter(key => { + const k = key.replace('../../views', ''); + const startFlag = component.startsWith('/'); + const endFlag = component.endsWith('.vue') || component.endsWith('.tsx'); + const startIndex = startFlag ? 0 : 1; + const lastIndex = endFlag ? k.length : k.lastIndexOf('.'); + return k.substring(startIndex, lastIndex) === component || k.substring(startIndex, lastIndex) === component + '/index'; + }); + if (matchKeys?.length === 1) { + const matchKey = matchKeys[0]; + return dynamicViewsModules[matchKey]; + } else if (matchKeys?.length > 1) { + warn( + 'Please do not create `.vue` and `.TSX` files with the same file name in the same hierarchical directory under the views folder. This will cause dynamic introduction failure', + ); + return; + } else { + // warn('在src/views/下找不到`' + component + '.vue` 或 `' + component + '.tsx`, 请自行创建!'); + return EXCEPTION_COMPONENT; + } +} + +// Turn background objects into routing objects +// 将背景对象变成路由对象 +export function transformObjToRoute(routerList: BackMenu[]): T[] { + const globSetting = useGlobSetting(); + let routeList: AppRouteModule[] = []; + function getRouteList(routerList: any) { + for (let i = 0; i < routerList.length; i++) { + const e = routerList[i]; + const name = e.enCode.replace(/\./g, '-'); + if (e.type == 0 && e.hasChildren && e.children.length) { + getRouteList(e.children); + } + if (e.type == 1) { + e.path = '/' + e.enCode; + if (e.hasChildren && e.children.length) { + getRouteList(e.children); + } + } + if (e.type == 2) { + let path = e.urlAddress; + if (path.indexOf('?') > -1) path = path.split('?')[0]; + e.path = '/' + e.urlAddress; + const route: AppRouteModule = { + path: '/' + path, + component: path, + name: name, + meta: { + title: 'routes.' + name, + defaultTitle: e.fullName, + icon: e.icon, + modelId: e.id, + }, + }; + routeList.push(route); + } + // 表单、字典、报表、门户、流程 + if ([3, 4, 5, 8, 9, 10].indexOf(e.type) > -1) { + let propertyJson = e.propertyJson ? JSON.parse(e.propertyJson) : null, + relationId = '', + isTree = 0, + component = ''; + if (propertyJson) { + relationId = propertyJson.moduleId || ''; + isTree = propertyJson.isTree || 0; + } + if (e.type == 3 || e.type == 9) { + component = 'ONLINE_MODEL'; + } else if (e.type == 4) { + component = 'ONLINE_DICT'; + } else if (e.type == 5) { + component = 'ONLINE_DATA_REPORT'; + } else if (e.type == 10) { + component = 'ONLINE_REPORT'; + } else { + component = 'ONLINE_PORTAL'; + } + const componentName = component + '_' + name; + e.path = '/' + e.urlAddress; + const route: AppRouteModule = { + path: '/' + e.urlAddress, + component: component, + name: componentName, + meta: { + title: 'routes.' + e.enCode.replaceAll(/\./g, '-'), + defaultTitle: e.fullName, + icon: e.icon, + modelId: e.id, + type: e.type, + relationId, + isTree, + }, + }; + routeList.push(route); + } + // 大屏 + if (e.type == 6) { + let propertyJson = e.propertyJson ? JSON.parse(e.propertyJson) : null, + moduleId = ''; + if (propertyJson) moduleId = propertyJson.moduleId || ''; + e.path = `${globSetting.dataVUrl}view/${moduleId}?token=${getToken()}`; + } + // 外链 + if (e.type == 7) { + const path = e.urlAddress.replace(/\${dataV}/g, globSetting.dataVUrl).replace(/\${yunzhupaasToken}/g, getToken()); + if (e.linkTarget === '_self') { + e.path = '/' + e.enCode; + const route: AppRouteModule = { + path: '/' + e.enCode, + component: 'IFRAME', + name: name, + meta: { + title: 'routes.' + name, + defaultTitle: e.fullName, + icon: e.icon, + modelId: e.id, + frameSrc: path, + }, + }; + routeList.push(route); + } else { + e.path = path; + const route: AppRouteModule = { + path: path, + component: 'IFRAME', + name: name, + meta: { + title: 'routes.' + name, + defaultTitle: e.fullName, + icon: e.icon, + modelId: e.id, + }, + }; + routeList.push(route); + } + } + } + } + getRouteList(routerList); + asyncImportRoute(routeList); + const RootRoute: AppRouteRecordRaw = { + path: '/asyncRoutes', + name: 'asyncRoutes', + redirect: PageEnum.BASE_HOME, + component: LAYOUT, + meta: { + title: 'asyncRoutes', + }, + children: routeList, + }; + const asyncRouteList: AppRouteRecordRaw[] = [RootRoute]; + + return asyncRouteList as unknown as T[]; +} + +/** + * Convert multi-level routing to level 2 routing + * 将多级路由转换为 2 级路由 + */ +export function flatMultiLevelRoutes(routeModules: AppRouteModule[]) { + const modules: AppRouteModule[] = cloneDeep(routeModules); + + for (let index = 0; index < modules.length; index++) { + const routeModule = modules[index]; + // 判断级别是否 多级 路由 + if (!isMultipleRoute(routeModule)) { + // 声明终止当前循环, 即跳过此次循环,进行下一轮 + continue; + } + // 路由等级提升 + promoteRouteLevel(routeModule); + } + return modules; +} + +// Routing level upgrade +// 路由等级提升 +function promoteRouteLevel(routeModule: AppRouteModule) { + // Use vue-router to splice menus + // 使用vue-router拼接菜单 + // createRouter 创建一个可以被 Vue 应用程序使用的路由实例 + let router: Router | null = createRouter({ + routes: [routeModule as unknown as RouteRecordNormalized], + history: createWebHashHistory(), + }); + // getRoutes: 获取所有 路由记录的完整列表。 + const routes = router.getRoutes(); + // 将所有子路由添加到二级路由 + addToChildren(routes, routeModule.children || [], routeModule); + router = null; + + // omit lodash的函数 对传入的item对象的children进行删除 + routeModule.children = routeModule.children?.map(item => omit(item, 'children')); +} + +// Add all sub-routes to the secondary route +// 将所有子路由添加到二级路由 +function addToChildren(routes: RouteRecordNormalized[], children: AppRouteRecordRaw[], routeModule: AppRouteModule) { + for (let index = 0; index < children.length; index++) { + const child = children[index]; + const route = routes.find(item => item.name === child.name); + if (!route) { + continue; + } + routeModule.children = routeModule.children || []; + if (!routeModule.children.find(item => item.name === route.name)) { + routeModule.children?.push(route as unknown as AppRouteModule); + } + if (child.children?.length) { + addToChildren(routes, child.children, routeModule); + } + } +} + +// Determine whether the level exceeds 2 levels +// 判断级别是否超过2级 +function isMultipleRoute(routeModule: AppRouteModule) { + // Reflect.has 与 in 操作符 相同, 用于检查一个对象(包括它原型链上)是否拥有某个属性 + if (!routeModule || !Reflect.has(routeModule, 'children') || !routeModule.children?.length) { + return false; + } + + const children = routeModule.children; + + let flag = false; + for (let index = 0; index < children.length; index++) { + const child = children[index]; + if (child.children?.length) { + flag = true; + break; + } + } + return flag; +} diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..0471bb6 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,49 @@ +import type { RouteRecordRaw } from 'vue-router'; +import type { App } from 'vue'; + +import { createRouter, createWebHistory } from 'vue-router'; +import { basicRoutes } from './routes'; +import { getYunzhupaasAppId } from '@/utils/yunzhupaas'; + +// 白名单应该包含基本静态路由 +const WHITE_NAME_LIST: string[] = []; +const getRouteNames = (array: any[]) => + array.forEach(item => { + WHITE_NAME_LIST.push(item.name); + getRouteNames(item.children || []); + }); +getRouteNames(basicRoutes); + +// app router +// 创建一个可以被 Vue 应用程序使用的路由实例 + +// 取路径上的应用识别码的作为基础路由 +let VITE_PUBLIC_PATH = import.meta.env.VITE_PUBLIC_PATH; +const appId = getYunzhupaasAppId(); +if (appId) VITE_PUBLIC_PATH = '/' + appId; + +export const router = createRouter({ + // 创建一个 hash 历史记录。 + history: createWebHistory(VITE_PUBLIC_PATH), + // 应该添加到路由的初始路由列表。 + routes: basicRoutes as unknown as RouteRecordRaw[], + // 是否应该禁止尾部斜杠。默认为假 + strict: true, + scrollBehavior: () => ({ left: 0, top: 0 }), +}); + +// reset router +export function resetRouter() { + router.getRoutes().forEach(route => { + const { name } = route; + if (name && !WHITE_NAME_LIST.includes(name as string)) { + router.hasRoute(name) && router.removeRoute(name); + } + }); +} + +// config router +// 配置路由器 +export function setupRouter(app: App) { + app.use(router); +} diff --git a/src/router/menus/index.ts b/src/router/menus/index.ts new file mode 100644 index 0000000..561bb82 --- /dev/null +++ b/src/router/menus/index.ts @@ -0,0 +1,46 @@ +import type { Menu } from '@/router/types'; +import { usePermissionStore } from '@/store/modules/permission'; +import { getAllParentPath } from '@/router/helper/menuHelper'; + +async function getAsyncMenus() { + const permissionStore = usePermissionStore(); + //递归过滤所有隐藏的菜单 + const menuFilter = items => { + return items.filter(item => { + const show = !item.meta?.hideMenu && !item.hideMenu; + if (show && item.children) { + item.children = menuFilter(item.children); + } + return show; + }); + }; + return menuFilter(permissionStore.getMenuList); +} + +export const getMenus = async (): Promise => { + const menus = await getAsyncMenus(); + return menus; +}; + +export async function getCurrentParentPath(currentPath: string) { + const menus = await getAsyncMenus(); + const allParentPath = await getAllParentPath(menus, currentPath); + return allParentPath?.[0]; +} + +// Get the level 1 menu, delete children +export async function getShallowMenus(): Promise { + const menus = await getAsyncMenus(); + const shallowMenuList = menus.map(item => ({ ...item, children: undefined })); + return shallowMenuList; +} + +// Get the children of the menu +export async function getChildrenMenus(parentPath: string) { + const menus = await getMenus(); + const parent = menus.find(item => item.path === parentPath); + if (!parent || !parent.children) { + return [] as Menu[]; + } + return parent.children; +} diff --git a/src/router/routes/basic.ts b/src/router/routes/basic.ts new file mode 100644 index 0000000..071cf0f --- /dev/null +++ b/src/router/routes/basic.ts @@ -0,0 +1,167 @@ +import type { AppRouteRecordRaw } from '@/router/types'; +import { t } from '@/hooks/web/useI18n'; +import { REDIRECT_NAME, LAYOUT, EXCEPTION_COMPONENT, PAGE_NOT_FOUND_NAME, CHILDREN_PAGE_NOT_FOUND_NAME } from '@/router/constant'; + +// 404 on a page +export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = { + path: '/:path(.*)*', + name: PAGE_NOT_FOUND_NAME, + component: LAYOUT, + meta: { + title: 'ErrorPage', + hideBreadcrumb: true, + hideMenu: true, + }, + children: [ + { + path: '/:path(.*)*', + name: CHILDREN_PAGE_NOT_FOUND_NAME, + component: EXCEPTION_COMPONENT, + meta: { + title: '', + hideBreadcrumb: true, + hideMenu: true, + }, + }, + ], +}; + +export const REDIRECT_ROUTE: AppRouteRecordRaw = { + path: '/redirect', + component: LAYOUT, + name: 'RedirectTo', + meta: { + title: REDIRECT_NAME, + hideBreadcrumb: true, + hideMenu: true, + }, + children: [ + { + path: '/redirect/:path(.*)/:_redirect_type(.*)/:_origin_params(.*)?', + name: REDIRECT_NAME, + component: () => import('@/views/basic/redirect/index.vue'), + meta: { + title: REDIRECT_NAME, + hideBreadcrumb: true, + }, + }, + ], +}; + +export const ERROR_LOG_ROUTE: AppRouteRecordRaw = { + path: '/error-log', + name: 'ErrorLog', + component: LAYOUT, + redirect: '/error-log/list', + meta: { + title: 'ErrorLog', + hideBreadcrumb: true, + hideChildrenInMenu: true, + }, + children: [ + { + path: 'list', + name: 'ErrorLogList', + component: () => import('@/views/basic/error-log/index.vue'), + meta: { + title: t('routes.basic.errorLogList'), + hideBreadcrumb: true, + currentActiveMenu: '/error-log', + }, + }, + ], +}; +export const COMMON_ROUTE: AppRouteRecordRaw = { + path: '/common-route', + name: 'commonRoute', + component: LAYOUT, + redirect: '/home', + meta: { + title: 'commonRoute', + hideBreadcrumb: true, + hideChildrenInMenu: true, + }, + children: [ + { + path: '/home', + component: () => import('@/views/basic/home/index.vue'), + name: 'home', + meta: { + title: 'routes.basic.home', + defaultTitle: '首页', + icon: 'icon-ym icon-ym-nav-home-fill', + affix: true, + }, + }, + { + path: '/messageRecord', + component: () => import('@/views/basic/messageRecord/index.vue'), + name: 'messageRecord', + meta: { + title: 'routes.basic.messageRecord', + defaultTitle: '站内消息', + icon: 'icon-ym icon-ym-sysNotice', + }, + }, + { + path: '/profile', + component: () => import('@/views/basic/profile/index.vue'), + name: 'profile', + meta: { + title: 'routes.basic.profile', + defaultTitle: '个人信息', + icon: 'icon-ym icon-ym-user', + }, + }, + { + path: '/externalLink', + component: () => import('@/views/common/externalLink/index.vue'), + name: 'externalLink', + meta: { + title: 'routes.basic.externalLink', + defaultTitle: '链接', + icon: 'icon-ym icon-ym-generator-link', + }, + }, + { + path: '/workFlowDetail', + component: () => import('@/views/workFlow/workFlowDetail/index.vue'), + name: 'workFlowDetail', + meta: { + title: 'routes.basic.workFlowDetail', + defaultTitle: '流程详情', + icon: 'icon-ym icon-ym-workFlow', + }, + }, + { + path: '/emailDetail', + component: () => import('@/views/extend/email/DetailPage.vue'), + name: 'emailDetail', + meta: { + title: 'routes.basic.emailDetail', + defaultTitle: '查看邮件', + icon: 'icon-ym icon-ym-emailExample', + }, + }, + { + path: '/previewModel', + component: () => import('@/views/common/dynamicModel/index.vue'), + name: 'previewModel', + meta: { + title: 'routes.basic.previewModel', + defaultTitle: '功能预览', + icon: 'icon-ym icon-ym-btn-preview', + }, + }, + { + path: '/dataManage', + component: () => import('@/views/common/dynamicModel/index.vue'), + name: 'formData', + meta: { + title: 'routes.basic.dataManage', + defaultTitle: '数据管理', + icon: 'icon-ym icon-ym-webForm', + }, + }, + ], +}; diff --git a/src/router/routes/index.ts b/src/router/routes/index.ts new file mode 100644 index 0000000..e1ede5f --- /dev/null +++ b/src/router/routes/index.ts @@ -0,0 +1,39 @@ +import type { AppRouteRecordRaw } from '@/router/types'; + +import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE, COMMON_ROUTE } from '@/router/routes/basic'; + +import { mainOutRoutes } from './mainOut'; +import { PageEnum } from '@/enums/pageEnum'; +import { t } from '@/hooks/web/useI18n'; + +// 根路由 +export const RootRoute: AppRouteRecordRaw = { + path: '/', + name: 'Root', + redirect: PageEnum.BASE_HOME, + meta: { + title: 'Root', + }, +}; + +export const LoginRoute: AppRouteRecordRaw = { + path: '/login', + name: 'Login', + component: () => import('@/views/basic/login/Login.vue'), + meta: { + title: t('routes.basic.login'), + }, +}; +// 表单外链 +export const FormShortLinkRoute: AppRouteRecordRaw = { + path: '/formShortLink', + name: 'FormShortLink', + component: () => import('@/views/common/formShortLink/index.vue'), + meta: { + title: '', + }, +}; + +// Basic routing without permission +// 未经许可的基本路由 +export const basicRoutes = [LoginRoute, FormShortLinkRoute, RootRoute, ...mainOutRoutes, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE, COMMON_ROUTE]; diff --git a/src/router/routes/mainOut.ts b/src/router/routes/mainOut.ts new file mode 100644 index 0000000..25bbc22 --- /dev/null +++ b/src/router/routes/mainOut.ts @@ -0,0 +1,43 @@ +/** +The routing of this file will not show the layout. +It is an independent new page. +the contents of the file still need to log in to access + */ +import type { AppRouteModule } from '@/router/types'; + +// test +// http:ip:port/main-out +export const mainOutRoutes: AppRouteModule[] = [ + { + path: '/sso', + component: () => import('@/views/basic/login/sso-redirect.vue'), + name: 'sso', + meta: { + title: 'sso', + hideMenu: true, + ignoreAuth: true, + }, + }, + { + path: '/flowChat', + name: 'flowChat', + component: () => import('@/views/workFlow/flowChart/index.vue'), + meta: { + title: '', + hideMenu: true, + ignoreAuth: true, + }, + }, + { + path: '/flowFile', + name: 'flowFile', + component: () => import('@/views/workFlow/flowFile/index.vue'), + meta: { + title: '', + hideMenu: true, + ignoreAuth: true, + }, + }, +]; + +export const mainOutRouteNames = mainOutRoutes.map(item => item.name); diff --git a/src/router/types.ts b/src/router/types.ts new file mode 100644 index 0000000..0760359 --- /dev/null +++ b/src/router/types.ts @@ -0,0 +1,46 @@ +import type { RouteRecordRaw, RouteMeta } from 'vue-router'; +import { defineComponent } from 'vue'; + +export type Component = ReturnType | (() => Promise) | (() => Promise); + +// @ts-ignore +export interface AppRouteRecordRaw extends Omit { + name: string; + meta: RouteMeta; + component?: Component | string; + components?: Component; + children?: AppRouteRecordRaw[]; + props?: Recordable; + fullPath?: string; +} + +export interface MenuTag { + type?: 'primary' | 'error' | 'warn' | 'success'; + content?: string; + dot?: boolean; +} + +export interface Menu { + id: string; + enCode: string; + fullName: string; + icon: string; + linkTarget: string; + parentId: string; + hasChildren: boolean; + propertyJson: string; + sortCode: number; + type: number; + urlAddress: string; + path: string; + children?: Nullable; + meta?: RouteMeta; +} + +export interface MenuModule { + orderNo?: number; + menu: Menu; +} + +// export type AppRouteModule = RouteModule | AppRouteRecordRaw; +export type AppRouteModule = AppRouteRecordRaw; diff --git a/src/settings/componentSetting.ts b/src/settings/componentSetting.ts new file mode 100644 index 0000000..a439553 --- /dev/null +++ b/src/settings/componentSetting.ts @@ -0,0 +1,50 @@ +// 用于配置某些组件的常规配置,而无需修改组件 +import type { SorterResult } from '../components/Table'; + +export default { + // 表格配置 + table: { + // 表格接口请求通用配置,可在组件prop覆盖 + // 支持 xxx.xxx.xxx格式 + fetchSetting: { + // 传给后台的当前页字段 + pageField: 'currentPage', + // 传给后台的每页显示多少条的字段 + sizeField: 'pageSize', + // 接口返回表格数据的字段 + listField: 'list', + // 接口返回表格总数的字段 + totalField: 'pagination.total', + }, + // 可选的分页选项 + pageSizeOptions: ['20', '50', '80', '100'], + //默认每页显示多少条 + defaultPageSize: 20, + // 默认尺寸 + defaultSize: 'small', + // 默认排序方法 + defaultSortFn: (sortInfo: SorterResult) => { + const { field, order } = sortInfo; + if (field && order) { + return { + // 排序字段 + sidx: field, + // 排序方式 asc/desc + sort: order === 'ascend' ? 'asc' : 'desc', + }; + } else { + return {}; + } + }, + // 自定义过滤方法 + defaultFilterFn: (data: Partial>) => { + return data; + }, + }, + // 滚动组件配置 + scrollbar: { + // 是否使用原生滚动样式 + // 开启后,菜单,弹窗,抽屉会使用原生滚动条组件 + native: false, + }, +}; diff --git a/src/settings/designSetting.ts b/src/settings/designSetting.ts new file mode 100644 index 0000000..15a230f --- /dev/null +++ b/src/settings/designSetting.ts @@ -0,0 +1,14 @@ +import { ThemeEnum } from '../enums/appEnum'; + +export const prefixCls = 'yunzhupaas'; + +export const darkMode = ThemeEnum.LIGHT; + +// app theme preset color +export const APP_PRESET_COLOR_LIST: string[] = ['#1890ff', '#F03350', '#F5A12F', '#28D988']; + +// header preset color +export const HEADER_PRESET_BG_COLOR_LIST: string[] = ['#ffffff', '#151515', '#1890ff', '#009688', '#536dfe', '#ff5c93', '#ee4f12', '#24292e', '#394664']; + +// sider preset color +export const SIDE_BAR_BG_COLOR_LIST: string[] = ['#001529', '#212121', '#273352', '#ffffff', '#191b24', '#304156', '#001628', '#28333E', '#344058']; diff --git a/src/settings/encryptionSetting.ts b/src/settings/encryptionSetting.ts new file mode 100644 index 0000000..871acf0 --- /dev/null +++ b/src/settings/encryptionSetting.ts @@ -0,0 +1,13 @@ +import { isDevMode } from '@/utils/env'; + +// System default cache time, in seconds +export const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7; + +// aes encryption key +export const cacheCipher = { + key: '_11111000001111@', + iv: '@11111000001111_', +}; + +// Whether the system cache is encrypted using aes +export const enableStorageEncryption = !isDevMode(); diff --git a/src/settings/localeSetting.ts b/src/settings/localeSetting.ts new file mode 100644 index 0000000..98d7e05 --- /dev/null +++ b/src/settings/localeSetting.ts @@ -0,0 +1,35 @@ +import type { DropMenu } from '../components/Dropdown'; +import type { LocaleSetting, LocaleType } from '#/config'; + +export const LOCALE: { [key: string]: LocaleType } = { + ZH_CN: 'zh_CN', + ZH_TW: 'zh_TW', + EN_US: 'en_US', +}; + +export const localeSetting: LocaleSetting = { + // 是否显示语言选择器 + showPicker: true, + // 当前语言 + locale: LOCALE.ZH_CN, + // 默认语言 + fallback: LOCALE.ZH_CN, + // 允许的语言 + availableLocales: [LOCALE.ZH_CN, LOCALE.ZH_TW, LOCALE.EN_US], +}; + +// 语言列表 +export const localeList: DropMenu[] = [ + { + text: '简体中文', + event: LOCALE.ZH_CN, + }, + { + text: '繁体中文', + event: LOCALE.ZH_TW, + }, + { + text: 'English', + event: LOCALE.EN_US, + }, +]; diff --git a/src/settings/projectSetting.ts b/src/settings/projectSetting.ts new file mode 100644 index 0000000..e64ec2a --- /dev/null +++ b/src/settings/projectSetting.ts @@ -0,0 +1,196 @@ +import type { ProjectConfig } from '#/config'; +import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from '@/enums/menuEnum'; +import { CacheTypeEnum } from '@/enums/cacheEnum'; +import { ContentEnum, ThemeEnum, RouterTransitionEnum, SettingButtonPositionEnum, SessionTimeoutProcessingEnum } from '@/enums/appEnum'; +import { HEADER_PRESET_BG_COLOR_LIST } from './designSetting'; +import { primaryColor } from '../../build/config/themeConfig'; + +// ! 改动后需要清空浏览器缓存 +const setting: ProjectConfig = { + // 是否显示SettingButton + showSettingButton: true, + + // 是否显示主题切换按钮 + showDarkModeToggle: true, + + // 设置按钮位置 可选项 + // SettingButtonPositionEnum.AUTO: 自动选择 + // SettingButtonPositionEnum.HEADER: 位于头部 + // SettingButtonPositionEnum.FIXED: 固定在右侧 + settingButtonPosition: SettingButtonPositionEnum.AUTO, + + // 权限缓存存放位置,默认存放于localStorage + permissionCacheType: CacheTypeEnum.LOCAL, + + // 会话超时处理方案 + // SessionTimeoutProcessingEnum.ROUTE_JUMP: 路由跳转到登录页 + // SessionTimeoutProcessingEnum.PAGE_COVERAGE: 生成登录弹窗,覆盖当前页面 + sessionTimeoutProcessing: SessionTimeoutProcessingEnum.ROUTE_JUMP, + + // 项目主题色 + themeColor: primaryColor, + + // 系统背景 + sysBg: '', + + // 网站灰色模式 + grayMode: false, + + // 色弱模式 + colorWeak: false, + + // 是否取消菜单,顶部,多标签页显示, 用于可能内嵌在别的系统内 + fullContent: false, + + // 主题内容宽度 + contentMode: ContentEnum.FULL, + + // 是否显示logo + showLogo: true, + + // 是否显示底部信息 copyright + showFooter: false, + + // 头部配置 + headerSetting: { + // 背景色 + bgColor: HEADER_PRESET_BG_COLOR_LIST[0], + // 固定头部 + fixed: true, + // 是否显示顶部 + show: true, + // 主题 + theme: ThemeEnum.LIGHT, + // 开启锁屏功能 + useLockPage: true, + // 显示全屏按钮 + showFullScreen: true, + // 显示文档按钮 + showDoc: true, + // 显示消息中心按钮 + showNotice: true, + // 显示菜单搜索按钮 + showSearch: true, + }, + + // 菜单配置 + menuSetting: { + // 背景色 + bgColor: '#ffffff', + // 是否固定住菜单 + fixed: true, + // 菜单折叠 + collapsed: false, + // 响应式布局时是否隐藏侧边 + siderHidden: false, + // 折叠菜单时候是否显示菜单名 + collapsedShowTitle: false, + // 是否可拖拽 + // Only limited to the opening of the left menu, the mouse has a drag bar on the right side of the menu + canDrag: false, + // 是否显示 + show: true, + // 是否显示dom + hidden: false, + // 菜单宽度 + menuWidth: 210, + // 菜单模式 + mode: MenuModeEnum.INLINE, + // 菜单类型 + type: MenuTypeEnum.SIDEBAR, + // 菜单主题 + theme: ThemeEnum.DARK, + // 分割菜单 + split: false, + // 顶部菜单布局 + topMenuAlign: 'center', + // 折叠触发器的位置 + trigger: TriggerEnum.FOOTER, + // 手风琴模式,只展示一个菜单 + accordion: true, + // 在路由切换的时候关闭左侧混合菜单展开菜单 + closeMixSidebarOnChange: false, + // 左侧混合菜单模块切换触发方式 'click' |'hover' + mixSideTrigger: MixSidebarTriggerEnum.CLICK, + // 是否固定左侧混合菜单 + mixSideFixed: false, + }, + + // 多标签 + multiTabsSetting: { + // 刷新后是否保留已经打开的标签页 + cache: false, + // 开启 + show: true, + // 是否显示标签图标 + showIcon: true, + // 是否可以拖拽 + canDrag: true, + // 开启快速操作 + showQuick: true, + // 是否显示刷新按钮 + showRedo: true, + // 是否显示折叠按钮 + showFold: true, + }, + + // 动画配置 + transitionSetting: { + // 是否开启切换动画 + // 禁用状态也将禁用页面加载 + enable: true, + + // 动画名 + basicTransition: RouterTransitionEnum.FADE_SIDE, + + // 是否打开页面切换loading + // 仅在以下情况下打开 enable=true + openPageLoading: true, + + //是否打开页面切换顶部进度条 + openNProgress: true, + }, + + // 是否开启KeepAlive缓存 开发时候最好关闭,不然每次都需要清除缓存 + openKeepAlive: false, + + // 自动锁屏时间,为0不锁屏。 单位分钟 默认1个小时 + lockTime: 0, + + // 显示面包屑 + showBreadCrumb: true, + + // 显示面包屑图标 + showBreadCrumbIcon: false, + + // 是否使用全局错误捕获 + useErrorHandle: false, + + // 是否开启回到顶部 + useOpenBackTop: true, + + // 是否可以嵌入iframe页面 + canEmbedIFramePage: true, + + // 切换界面的时候是否删除未关闭的message及notify + closeMessageOnSwitch: true, + + // 切换界面的时候是否取消已经发送但是未响应的http请求。 + // 如果开启,想对单独接口覆盖。可以在单独接口设置 + removeAllHttpPending: false, + // 系统配置 + sysConfigInfo: { + sysVersion: '', + copyright: 'Copyright @ 2025 深圳市乐程软件有限公司版权所有', + navigationIcon: '', + workLogoIcon: '', + logoIcon: '', + loginIcon: '', + sysName: '云筑项目管理平台', + title: '', + }, + // 全局圆角配置 + globalBorderRadius: 4, +}; + +export default setting; diff --git a/src/settings/siteSetting.ts b/src/settings/siteSetting.ts new file mode 100644 index 0000000..86fdc56 --- /dev/null +++ b/src/settings/siteSetting.ts @@ -0,0 +1,3 @@ +export const DOC_URL = 'https://www.yunzhupaas.com'; + +export const SITE_URL = 'https://www.yunzhupaas.com'; diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..efaf6c9 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,10 @@ +import type { App } from 'vue'; +import { createPinia } from 'pinia'; + +const store = createPinia(); + +export function setupStore(app: App) { + app.use(store); +} + +export { store }; diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts new file mode 100644 index 0000000..6037870 --- /dev/null +++ b/src/store/modules/app.ts @@ -0,0 +1,96 @@ +import type { ProjectConfig, HeaderSetting, MenuSetting, TransitionSetting, MultiTabsSetting } from '#/config'; +import type { BeforeMiniState, SysConfigInfo } from '#/store'; +import { defineStore } from 'pinia'; +import { store } from '@/store'; +import { ThemeEnum } from '@/enums/appEnum'; +import { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from '@/enums/cacheEnum'; +import { Persistent } from '@/utils/cache/persistent'; +import { darkMode } from '@/settings/designSetting'; +import { resetRouter } from '@/router'; +import { deepMerge } from '@/utils'; + +interface AppState { + darkMode?: ThemeEnum; + // Page loading status + pageLoading: boolean; + // project config + projectConfig: ProjectConfig | null; + // When the window shrinks, remember some states, and restore these states when the window is restored + beforeMiniInfo: BeforeMiniState; +} +let timeId: TimeoutHandle; +export const useAppStore = defineStore({ + id: 'app', + state: (): AppState => ({ + darkMode: undefined, + pageLoading: false, + projectConfig: Persistent.getLocal(PROJ_CFG_KEY), + beforeMiniInfo: {}, + }), + getters: { + getPageLoading(): boolean { + return this.pageLoading; + }, + getDarkMode(): 'light' | 'dark' | string { + return this.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || darkMode; + }, + getBeforeMiniInfo(): BeforeMiniState { + return this.beforeMiniInfo; + }, + getProjectConfig(): ProjectConfig { + return this.projectConfig || ({} as ProjectConfig); + }, + getHeaderSetting(): HeaderSetting { + return this.getProjectConfig.headerSetting; + }, + getMenuSetting(): MenuSetting { + return this.getProjectConfig.menuSetting; + }, + getTransitionSetting(): TransitionSetting { + return this.getProjectConfig.transitionSetting; + }, + getMultiTabsSetting(): MultiTabsSetting { + return this.getProjectConfig.multiTabsSetting; + }, + getSysConfigInfo(): SysConfigInfo { + return this.getProjectConfig.sysConfigInfo; + }, + }, + actions: { + setPageLoading(loading: boolean): void { + this.pageLoading = loading; + }, + setDarkMode(mode: ThemeEnum): void { + this.darkMode = mode; + localStorage.setItem(APP_DARK_MODE_KEY_, mode); + }, + setBeforeMiniInfo(state: BeforeMiniState): void { + this.beforeMiniInfo = state; + }, + setProjectConfig(config: DeepPartial): void { + this.projectConfig = deepMerge(this.projectConfig || {}, config as any); + Persistent.setLocal(PROJ_CFG_KEY, this.projectConfig); + }, + async resetAllState() { + resetRouter(); + Persistent.clearAll(); + }, + async setPageLoadingAction(loading: boolean): Promise { + if (loading) { + clearTimeout(timeId); + // Prevent flicker + timeId = setTimeout(() => { + this.setPageLoading(loading); + }, 50); + } else { + this.setPageLoading(loading); + clearTimeout(timeId); + } + }, + }, +}); + +// Need to be used outside the setup +export function useAppStoreWithOut() { + return useAppStore(store); +} diff --git a/src/store/modules/base.ts b/src/store/modules/base.ts new file mode 100644 index 0000000..a9f985b --- /dev/null +++ b/src/store/modules/base.ts @@ -0,0 +1,122 @@ +import { defineStore } from 'pinia'; +import { getDictionaryAll } from '@/api/systemData/dictionary'; +interface DicChildItem { + isTree?: number; + id: string; + enCode: string; + fullName: string; +} +interface DicItem extends DicChildItem { + dictionaryList: DicChildItem[]; +} +interface BaseState { + dictionaryList: DicItem[]; +} + +export const useBaseStore = defineStore({ + id: 'app-base', + state: (): BaseState => ({ + dictionaryList: [], + }), + getters: { + getDicList(): DicItem[] { + return this.dictionaryList; + }, + }, + actions: { + resetState() { + this.dictionaryList = []; + }, + setDictionaryList(list: DicItem[] = []) { + this.dictionaryList = list; + }, + async getDictionaryAll(): Promise { + try { + if (this.dictionaryList.length) { + return this.dictionaryList; + } else { + const res = await getDictionaryAll(); + if (!res) return []; + this.dictionaryList = res.data.list; + return res.data.list; + } + } catch (error) { + return []; + } + }, + async getDictionaryData(encode: string, id: string = ''): Promise { + try { + let list: DicItem[] = [], + data: Partial = {}, + json: DicChildItem[] | DicChildItem = []; + if (!this.dictionaryList.length) { + list = await this.getDictionaryAll(); + } else { + list = this.dictionaryList; + } + if (encode) { + let arr = list.filter(o => o.enCode === encode); + if (!arr.length) return []; + data = arr[0]; + if (!id) { + json = data.dictionaryList as DicChildItem[]; + } else { + let rowData: DicChildItem[] = []; + if (!data.isTree) { + rowData = (data.dictionaryList as DicChildItem[]).filter(o => o.id === id); + } else { + function findData(list) { + for (let i = 0; i < list.length; i++) { + const e = list[i]; + if (e.id === id) { + rowData[0] = e; + break; + } + if (e.children && e.children.length) { + findData(e.children); + } + } + } + findData(data.dictionaryList); + } + if (rowData.length) { + json = rowData[0]; + } else { + json = { + id: '', + fullName: '', + enCode: '', + }; + } + } + return json; + } + return json; + } catch (error) { + return []; + } + }, + async getDicDataSelector(value: string, key: string = 'id'): Promise { + try { + let list: DicItem[] = [], + data: Partial = {}, + json: DicChildItem[] = []; + if (!this.dictionaryList.length) { + list = await this.getDictionaryAll(); + } else { + list = this.dictionaryList; + } + if (!value) return []; + let arr = list.filter(o => { + return o[key] === value; + }); + if (!arr.length) return []; + data = arr[0]; + json = data.dictionaryList as DicChildItem[]; + return json; + } catch (error) { + return []; + } + }, + }, +}); diff --git a/src/store/modules/errorLog.ts b/src/store/modules/errorLog.ts new file mode 100644 index 0000000..ecb876b --- /dev/null +++ b/src/store/modules/errorLog.ts @@ -0,0 +1,74 @@ +import type { ErrorLogInfo } from '#/store'; + +import { defineStore } from 'pinia'; +import { store } from '@/store'; + +import { formatToDateTime } from '@/utils/dateUtil'; +import projectSetting from '@/settings/projectSetting'; + +import { ErrorTypeEnum } from '@/enums/exceptionEnum'; + +export interface ErrorLogState { + errorLogInfoList: Nullable; + errorLogListCount: number; +} + +export const useErrorLogStore = defineStore({ + id: 'app-error-log', + state: (): ErrorLogState => ({ + errorLogInfoList: null, + errorLogListCount: 0, + }), + getters: { + getErrorLogInfoList(): ErrorLogInfo[] { + return this.errorLogInfoList || []; + }, + getErrorLogListCount(): number { + return this.errorLogListCount; + }, + }, + actions: { + addErrorLogInfo(info: ErrorLogInfo) { + const item = { + ...info, + time: formatToDateTime(new Date()), + }; + this.errorLogInfoList = [item, ...(this.errorLogInfoList || [])]; + this.errorLogListCount += 1; + }, + + setErrorLogListCount(count: number): void { + this.errorLogListCount = count; + }, + + /** + * Triggered after ajax request error + * @param error + * @returns + */ + addAjaxErrorInfo(error) { + const { useErrorHandle } = projectSetting; + if (!useErrorHandle) { + return; + } + const errInfo: Partial = { + message: error.message, + type: ErrorTypeEnum.AJAX, + }; + if (error.response) { + const { config: { url = '', data: params = '', method = 'get', headers = {} } = {}, data = {} } = error.response; + errInfo.url = url; + errInfo.name = 'Ajax Error!'; + errInfo.file = '-'; + errInfo.stack = JSON.stringify(data); + errInfo.detail = JSON.stringify({ params, method, headers }); + } + this.addErrorLogInfo(errInfo as ErrorLogInfo); + }, + }, +}); + +// Need to be used outside the setup +export function useErrorLogStoreWithOut() { + return useErrorLogStore(store); +} diff --git a/src/store/modules/generator.ts b/src/store/modules/generator.ts new file mode 100644 index 0000000..b5cc9c4 --- /dev/null +++ b/src/store/modules/generator.ts @@ -0,0 +1,62 @@ +import { defineStore } from 'pinia'; + +interface BaseState { + hasTable: boolean; + allTable: any[]; + subTable: any[]; + formItemList: any[]; + relationData: any; + dynamicModelExtra: any; +} + +export const useGeneratorStore = defineStore({ + id: 'app-generator', + state: (): BaseState => ({ + hasTable: false, + subTable: [], + allTable: [], + formItemList: [], + relationData: {}, + dynamicModelExtra: {}, + }), + getters: { + getHasTable(): boolean { + return this.hasTable; + }, + getAllTable(): any[] { + return this.allTable; + }, + getSubTable(): any[] { + return this.subTable; + }, + getFormItemList(): any[] { + return this.formItemList; + }, + getRelationData(): any { + return this.relationData; + }, + getDynamicModelExtra(): any { + return this.dynamicModelExtra; + }, + }, + actions: { + setHasTable(hasTable: boolean = false) { + this.hasTable = hasTable; + }, + setAllTable(val) { + this.allTable = val; + }, + setSubTable(val) { + this.subTable = val; + }, + setFormItemList(val) { + this.formItemList = val; + }, + setRelationData(val) { + this.relationData = val; + }, + setDynamicModelExtra(val) { + this.dynamicModelExtra = val; + }, + }, +}); diff --git a/src/store/modules/locale.ts b/src/store/modules/locale.ts new file mode 100644 index 0000000..d122421 --- /dev/null +++ b/src/store/modules/locale.ts @@ -0,0 +1,60 @@ +import type { LocaleSetting, LocaleType } from '#/config'; + +import { defineStore } from 'pinia'; +import { store } from '@/store'; + +import { LOCALE_KEY } from '@/enums/cacheEnum'; +import { createLocalStorage } from '@/utils/cache'; +import { localeSetting } from '@/settings/localeSetting'; +import dayjs from 'dayjs'; +import 'dayjs/locale/zh-cn'; +import 'dayjs/locale/zh-tw'; + +const ls = createLocalStorage(); + +const lsLocaleSetting = (ls.get(LOCALE_KEY) || localeSetting) as LocaleSetting; + +interface LocaleState { + localInfo: LocaleSetting; +} + +export const useLocaleStore = defineStore({ + id: 'app-locale', + state: (): LocaleState => ({ + localInfo: lsLocaleSetting, + }), + getters: { + getShowPicker(): boolean { + return !!this.localInfo?.showPicker; + }, + getLocale(): LocaleType { + return this.localInfo?.locale ?? 'zh_CN'; + }, + }, + actions: { + /** + * Set up multilingual information and cache + * @param info multilingual info + */ + setLocaleInfo(info: Partial) { + this.localInfo = { ...this.localInfo, ...info }; + ls.set(LOCALE_KEY, this.localInfo); + }, + /** + * Initialize multilingual information and load the existing configuration from the local cache + */ + initLocale() { + const dayjsLocale = this.getLocale.replace('_', '-').toLocaleLowerCase(); + dayjs.locale(dayjsLocale); + this.setLocaleInfo({ + ...localeSetting, + ...this.localInfo, + }); + }, + }, +}); + +// Need to be used outside the setup +export function useLocaleStoreWithOut() { + return useLocaleStore(store); +} diff --git a/src/store/modules/lock.ts b/src/store/modules/lock.ts new file mode 100644 index 0000000..b3a961c --- /dev/null +++ b/src/store/modules/lock.ts @@ -0,0 +1,52 @@ +import type { LockInfo } from '#/store'; + +import { defineStore } from 'pinia'; + +import { LOCK_INFO_KEY } from '@/enums/cacheEnum'; +import { Persistent } from '@/utils/cache/persistent'; +import { useUserStore } from './user'; +import { unlock } from '@/api/basic/user'; + +interface LockState { + lockInfo: Nullable; +} + +export const useLockStore = defineStore({ + id: 'app-lock', + state: (): LockState => ({ + lockInfo: Persistent.getLocal(LOCK_INFO_KEY), + }), + getters: { + getLockInfo(): Nullable { + return this.lockInfo; + }, + }, + actions: { + setLockInfo(info: LockInfo) { + this.lockInfo = Object.assign({}, this.lockInfo, info); + Persistent.setLocal(LOCK_INFO_KEY, this.lockInfo, true); + }, + resetLockInfo() { + Persistent.removeLocal(LOCK_INFO_KEY, true); + this.lockInfo = null; + }, + // Unlock + async unLock(password: string) { + const userStore = useUserStore(); + const tryLogin = async () => { + try { + const account = userStore.getUserInfo?.userAccount; + const res = await unlock({ + account, + password, + }); + if (res) this.resetLockInfo(); + return res; + } catch (error) { + return false; + } + }; + return await tryLogin(); + }, + }, +}); diff --git a/src/store/modules/multipleTab.ts b/src/store/modules/multipleTab.ts new file mode 100644 index 0000000..a9aef26 --- /dev/null +++ b/src/store/modules/multipleTab.ts @@ -0,0 +1,352 @@ +import type { RouteLocationNormalized, RouteLocationRaw, Router } from 'vue-router'; + +import { toRaw, unref } from 'vue'; +import { defineStore } from 'pinia'; +import { store } from '@/store'; + +import { useGo, useRedo } from '@/hooks/web/usePage'; +import { Persistent } from '@/utils/cache/persistent'; + +import { PageEnum } from '@/enums/pageEnum'; +import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '@/router/routes/basic'; +import { getRawRoute } from '@/utils'; +import { MULTIPLE_TABS_KEY } from '@/enums/cacheEnum'; + +import projectSetting from '@/settings/projectSetting'; + +export interface MultipleTabState { + cacheTabList: Set; + tabList: RouteLocationNormalized[]; + lastDragEndIndex: number; +} + +function handleGotoPage(router: Router) { + const go = useGo(router); + go(unref(router.currentRoute).fullPath, true); +} + +const getToTarget = (tabItem: RouteLocationNormalized) => { + const { params, path, query } = tabItem; + return { + params: params || {}, + path, + query: query || {}, + }; +}; + +const cacheTab = projectSetting.multiTabsSetting.cache; + +export const useMultipleTabStore = defineStore({ + id: 'app-multiple-tab', + state: (): MultipleTabState => ({ + // Tabs that need to be cached + cacheTabList: new Set(), + // multiple tab list + tabList: cacheTab ? Persistent.getLocal(MULTIPLE_TABS_KEY) || [] : [], + // Index of the last moved tab + lastDragEndIndex: 0, + }), + getters: { + getTabList(): RouteLocationNormalized[] { + return this.tabList; + }, + getCachedTabList(): string[] { + return Array.from(this.cacheTabList); + }, + getLastDragEndIndex(): number { + return this.lastDragEndIndex; + }, + }, + actions: { + /** + * Update the cache according to the currently opened tabs + */ + async updateCacheTab() { + const cacheMap: Set = new Set(); + + for (const tab of this.tabList) { + const item = getRawRoute(tab); + // Ignore the cache + const needCache = !item.meta?.ignoreKeepAlive; + if (!needCache) { + continue; + } + const name = item.name as string; + cacheMap.add(name); + } + this.cacheTabList = cacheMap; + }, + + /** + * Refresh tabs + */ + async refreshPage(router: Router) { + const { currentRoute } = router; + const route = unref(currentRoute); + const name = route.name; + + const findTab = this.getCachedTabList.find(item => item === name); + if (findTab) { + this.cacheTabList.delete(findTab); + } + const redo = useRedo(router); + await redo(); + }, + clearCacheTabs(): void { + this.cacheTabList = new Set(); + }, + resetState(): void { + this.tabList = []; + this.clearCacheTabs(); + }, + goToPage(router: Router) { + const go = useGo(router); + const len = this.tabList.length; + const { path } = unref(router.currentRoute); + + let toPath: PageEnum | string = PageEnum.BASE_HOME; + + if (len > 0) { + const page = this.tabList[len - 1]; + const p = page.fullPath || page.path; + if (p) { + toPath = p; + } + } + // Jump to the current page and report an error + path !== toPath && go(toPath as PageEnum, true); + }, + + async addTab(route: RouteLocationNormalized) { + const { path, name, fullPath, params, query, meta } = getRawRoute(route); + // 404 The page does not need to add a tab + if (path === PageEnum.ERROR_PAGE || path === PageEnum.BASE_LOGIN || !name || [REDIRECT_ROUTE.name, PAGE_NOT_FOUND_ROUTE.name].includes(name as string)) { + return; + } + + let updateIndex = -1; + // Existing pages, do not add tabs repeatedly + const tabHasExits = this.tabList.some((tab, index) => { + updateIndex = index; + return (tab.fullPath || tab.path) === (fullPath || path); + }); + + // If the tab already exists, perform the update operation + if (tabHasExits) { + const curTab = toRaw(this.tabList)[updateIndex]; + if (!curTab) { + return; + } + curTab.params = params || curTab.params; + curTab.query = query || curTab.query; + curTab.fullPath = fullPath || curTab.fullPath; + this.tabList.splice(updateIndex, 1, curTab); + } else { + // Add tab + // 获取动态路由打开数,超过 0 即代表需要控制打开数 + const dynamicLevel = meta?.dynamicLevel ?? -1; + if (dynamicLevel > 0) { + // 如果动态路由层级大于 0 了,那么就要限制该路由的打开数限制了 + // 首先获取到真实的路由,使用配置方式减少计算开销. + // const realName: string = path.match(/(\S*)\//)![1]; + const realPath = meta?.realPath ?? ''; + // 获取到已经打开的动态路由数, 判断是否大于某一个值 + if (this.tabList.filter(e => e.meta?.realPath ?? '' === realPath).length >= dynamicLevel) { + // 关闭第一个 + const index = this.tabList.findIndex(item => item.meta.realPath === realPath); + index !== -1 && this.tabList.splice(index, 1); + } + } + this.tabList.push(route); + } + this.updateCacheTab(); + cacheTab && Persistent.setLocal(MULTIPLE_TABS_KEY, this.tabList); + }, + + async closeTab(tab: RouteLocationNormalized, router: Router) { + const close = (route: RouteLocationNormalized) => { + const { fullPath, meta: { affix } = {} } = route; + if (affix) { + return; + } + const index = this.tabList.findIndex(item => item.fullPath === fullPath); + index !== -1 && this.tabList.splice(index, 1); + }; + + const { currentRoute, replace } = router; + + const { path } = unref(currentRoute); + if (path !== tab.path) { + // Closed is not the activation tab + close(tab); + this.updateCacheTab(); + return; + } + + // Closed is activated atb + let toTarget: RouteLocationRaw = {}; + + const index = this.tabList.findIndex(item => item.path === path); + + // If the current is the leftmost tab + if (index === 0) { + // There is only one tab, then jump to the homepage, otherwise jump to the right tab + if (this.tabList.length === 1) { + toTarget = PageEnum.BASE_HOME; + } else { + // Jump to the right tab + const page = this.tabList[index + 1]; + toTarget = getToTarget(page); + } + } else { + // Close the current tab + const page = this.tabList[index - 1]; + toTarget = getToTarget(page); + } + close(currentRoute.value); + await replace(toTarget); + }, + + // Close according to key + async closeTabByKey(key: string, router: Router) { + const index = this.tabList.findIndex(item => (item.fullPath || item.path) === key); + if (index !== -1) { + await this.closeTab(this.tabList[index], router); + const { currentRoute, replace } = router; + // 检查当前路由是否存在于tabList中 + const isActivated = this.tabList.findIndex(item => { + return item.fullPath === currentRoute.value.fullPath; + }); + // 如果当前路由不存在于TabList中,尝试切换到其它路由 + if (isActivated === -1) { + let pageIndex; + if (index > 0) { + pageIndex = index - 1; + } else if (index < this.tabList.length - 1) { + pageIndex = index + 1; + } else { + pageIndex = -1; + } + if (pageIndex >= 0) { + const page = this.tabList[index - 1]; + const toTarget = getToTarget(page); + await replace(toTarget); + } + } + } + }, + + // Sort the tabs + async sortTabs(oldIndex: number, newIndex: number) { + const currentTab = this.tabList[oldIndex]; + this.tabList.splice(oldIndex, 1); + this.tabList.splice(newIndex, 0, currentTab); + this.lastDragEndIndex = this.lastDragEndIndex + 1; + }, + + // Close the tab on the right and jump + async closeLeftTabs(route: RouteLocationNormalized, router: Router) { + const index = this.tabList.findIndex(item => item.path === route.path); + + if (index > 0) { + const leftTabs = this.tabList.slice(0, index); + const pathList: string[] = []; + for (const item of leftTabs) { + const affix = item?.meta?.affix ?? false; + if (!affix) { + pathList.push(item.fullPath); + } + } + this.bulkCloseTabs(pathList); + } + this.updateCacheTab(); + handleGotoPage(router); + }, + + // Close the tab on the left and jump + async closeRightTabs(route: RouteLocationNormalized, router: Router) { + const index = this.tabList.findIndex(item => item.fullPath === route.fullPath); + + if (index >= 0 && index < this.tabList.length - 1) { + const rightTabs = this.tabList.slice(index + 1, this.tabList.length); + + const pathList: string[] = []; + for (const item of rightTabs) { + const affix = item?.meta?.affix ?? false; + if (!affix) { + pathList.push(item.fullPath); + } + } + this.bulkCloseTabs(pathList); + } + this.updateCacheTab(); + handleGotoPage(router); + }, + + async closeAllTab(router: Router) { + this.tabList = this.tabList.filter(item => item?.meta?.affix ?? false); + this.clearCacheTabs(); + this.goToPage(router); + }, + + /** + * Close other tabs + */ + async closeOtherTabs(route: RouteLocationNormalized, router: Router) { + const closePathList = this.tabList.map(item => item.fullPath); + + const pathList: string[] = []; + + for (const path of closePathList) { + if (path !== route.fullPath) { + const closeItem = this.tabList.find(item => item.fullPath === path); + if (!closeItem) { + continue; + } + const affix = closeItem?.meta?.affix ?? false; + if (!affix) { + pathList.push(closeItem.fullPath); + } + } + } + this.bulkCloseTabs(pathList); + this.updateCacheTab(); + Persistent.setLocal(MULTIPLE_TABS_KEY, this.tabList, true); + handleGotoPage(router); + }, + + /** + * Close tabs in bulk + */ + async bulkCloseTabs(pathList: string[]) { + this.tabList = this.tabList.filter(item => !pathList.includes(item.fullPath)); + }, + + /** + * Set tab's title + */ + async setTabTitle(title: string, route: RouteLocationNormalized) { + const findTab = this.getTabList.find(item => item === route); + if (findTab) { + findTab.meta.title = title; + await this.updateCacheTab(); + } + }, + /** + * replace tab's path + * **/ + async updateTabPath(fullPath: string, route: RouteLocationNormalized) { + const findTab = this.getTabList.find(item => item === route); + if (findTab) { + findTab.fullPath = fullPath; + findTab.path = fullPath; + await this.updateCacheTab(); + } + }, + }, +}); + +// Need to be used outside the setup +export function useMultipleTabWithOutStore() { + return useMultipleTabStore(store); +} diff --git a/src/store/modules/organize.ts b/src/store/modules/organize.ts new file mode 100644 index 0000000..4f390da --- /dev/null +++ b/src/store/modules/organize.ts @@ -0,0 +1,116 @@ +import { defineStore } from 'pinia'; +import { getDepartmentSelector } from '@/api/permission/organize'; +import { getPositionListAll, getPositionSelector } from '@/api/permission/position'; +import { getGroupSelector } from '@/api/permission/group'; +import { getRoleSelector } from '@/api/permission/role'; +import { treeToList } from '@/utils/helper/treeHelper'; + +export const useOrganizeStore = defineStore({ + id: 'app-organize', + state: () => ({ + organizeList: [], + organizeTree: [], + positionList: [], + positionTree: [], + groupList: [], + groupTree: [], + roleList: [], + roleTree: [], + }), + getters: {}, + actions: { + resetState() { + this.organizeList = []; + this.organizeTree = []; + this.positionList = []; + this.positionTree = []; + this.groupList = []; + this.groupTree = []; + this.roleList = []; + this.roleTree = []; + }, + async getOrganizeTree(): Promise { + try { + if (this.organizeTree.length) return this.organizeTree; + const res = await getDepartmentSelector(); + if (!res) return []; + this.organizeTree = res.data.list; + this.organizeList = treeToList(this.organizeTree); + return this.organizeTree; + } catch (error) { + return []; + } + }, + async getOrganizeList(): Promise { + try { + const list = this.organizeTree.length ? this.organizeTree : await this.getOrganizeTree(); + this.organizeList = treeToList(list); + return this.organizeList; + } catch (error) { + return []; + } + }, + async getPositionTree(): Promise { + try { + if (this.positionTree.length) return this.positionTree; + const res = await getPositionSelector(); + if (!res) return []; + this.positionTree = res.data.list; + return this.positionTree; + } catch (error) { + return []; + } + }, + async getPositionList(): Promise { + try { + if (this.positionList.length) return this.positionList; + const res = await getPositionListAll(); + if (!res) return []; + this.positionList = res.data.list; + return this.positionList; + } catch (error) { + return []; + } + }, + async getGroupTree(): Promise { + try { + if (this.groupTree.length) return this.groupTree; + const res = await getGroupSelector(); + if (!res) return []; + this.groupTree = res.data; + return this.groupTree; + } catch (error) { + return []; + } + }, + async getGroupList(): Promise { + try { + const list = this.groupTree.length ? this.groupTree : await this.getGroupTree(); + this.groupList = treeToList(list, { type: 'group' }); + return this.groupList; + } catch (error) { + return []; + } + }, + async getRoleTree(): Promise { + try { + if (this.roleTree.length) return this.roleTree; + const res = await getRoleSelector(); + if (!res) return []; + this.roleTree = res.data.list; + return this.roleTree; + } catch (error) { + return []; + } + }, + async getRoleList(): Promise { + try { + const list = this.roleTree.length ? this.roleTree : await this.getRoleTree(); + this.roleList = treeToList(list, { type: 'role' }); + return this.roleList; + } catch (error) { + return []; + } + }, + }, +}); diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts new file mode 100644 index 0000000..df468e8 --- /dev/null +++ b/src/store/modules/permission.ts @@ -0,0 +1,117 @@ +import type { AppRouteRecordRaw, Menu } from '@/router/types'; + +import { defineStore } from 'pinia'; +import { store } from '@/store'; +import { useUserStore } from './user'; +import { toRaw } from 'vue'; +import { transformObjToRoute, flatMultiLevelRoutes } from '@/router/helper/routeHelper'; +// import { transformRouteToMenu } from '@/router/helper/menuHelper'; +import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic'; +import { PageEnum } from '@/enums/pageEnum'; + +interface PermissionState { + // 路由是否动态添加 + isDynamicAddedRoute: boolean; + // 触发菜单更新 + lastBuildMenuTime: number; + // 菜单列表 + menuList: Menu[]; +} + +export const usePermissionStore = defineStore({ + id: 'app-permission', + state: (): PermissionState => ({ + // 路由是否动态添加 + isDynamicAddedRoute: false, + // 触发菜单更新 + lastBuildMenuTime: 0, + // 菜单列表 + menuList: [], + }), + getters: { + getMenuList(): Menu[] { + return this.menuList; + }, + getLastBuildMenuTime(): number { + return this.lastBuildMenuTime; + }, + getIsDynamicAddedRoute(): boolean { + return this.isDynamicAddedRoute; + }, + }, + actions: { + setMenuList(list: Menu[]) { + this.menuList = list; + list?.length > 0 && this.setLastBuildMenuTime(); + }, + + setLastBuildMenuTime() { + this.lastBuildMenuTime = new Date().getTime(); + }, + + setDynamicAddedRoute(added: boolean) { + this.isDynamicAddedRoute = added; + }, + resetState(): void { + this.isDynamicAddedRoute = false; + this.menuList = []; + this.lastBuildMenuTime = 0; + }, + + // 构建路由 + async buildRoutesAction(): Promise { + const userStore = useUserStore(); + const backRouterList = toRaw(userStore.getBackRouterList); + + // 动态引入组件 + let routeList = transformObjToRoute(backRouterList); + let routes: AppRouteRecordRaw[] = []; + routes = [PAGE_NOT_FOUND_ROUTE, ...routeList]; + + this.setMenuList(backRouterList as Menu[]); + routeList = flatMultiLevelRoutes(routeList); + + /** + * @description 根据设置的首页path,修正routes中的affix标记(固定首页) + * */ + const patchHomeAffix = (routes: AppRouteRecordRaw[]) => { + if (!routes || routes.length === 0) return; + let homePath: string = PageEnum.BASE_HOME; + + function patcher(routes: AppRouteRecordRaw[], parentPath = '') { + if (parentPath) parentPath = parentPath + '/'; + routes.forEach((route: AppRouteRecordRaw) => { + const { path, children, redirect } = route; + const currentPath = path.startsWith('/') ? path : parentPath + path; + if (currentPath === homePath) { + if (redirect) { + homePath = route.redirect! as string; + } else { + route.meta = Object.assign({}, route.meta, { affix: true }); + throw new Error('end'); + } + } + children && children.length > 0 && patcher(children, currentPath); + }); + } + + try { + patcher(routes); + } catch (e) { + // 已处理完毕跳出循环 + } + return; + }; + + routes.push(ERROR_LOG_ROUTE); + patchHomeAffix(routes); + return routes; + }, + }, +}); + +// Need to be used outside the setup +// 需要在设置之外使用 +export function usePermissionStoreWithOut() { + return usePermissionStore(store); +} diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts new file mode 100644 index 0000000..ade0c14 --- /dev/null +++ b/src/store/modules/user.ts @@ -0,0 +1,242 @@ +import type { UserInfo, PermissionInfo } from '#/store'; +import type { ErrorMessageMode } from '#/axios'; +import { defineStore } from 'pinia'; +import { store } from '@/store'; +import { PageEnum } from '@/enums/pageEnum'; +import { PERMISSIONS_KEY, TOKEN_KEY, USER_INFO_KEY } from '@/enums/cacheEnum'; +import { getAuthCache, setAuthCache } from '@/utils/auth'; +import { GetUserInfoModel, LoginParams, LoginRequestParams, BackMenu } from '@/api/basic/model/userModel'; +import { loginApi, getUserInfo, doLogout } from '@/api/basic/user'; +import { useI18n } from '@/hooks/web/useI18n'; +import { useMessage } from '@/hooks/web/useMessage'; +import { router } from '@/router'; +import { usePermissionStore } from '@/store/modules/permission'; +import { useBaseStore } from '@/store/modules/base'; +import { useOrganizeStore } from '@/store/modules/organize'; +import { useAppStore } from '@/store/modules/app'; +import { useLocale } from '@/locales/useLocale'; +import { RouteRecordRaw } from 'vue-router'; +import { PAGE_NOT_FOUND_ROUTE } from '@/router/routes/basic'; +import { h } from 'vue'; +import { deepMerge } from '@/utils'; + +interface UserState { + userInfo: Nullable; + token?: string; + permissionList: PermissionInfo[]; + backMenuList: BackMenu[]; + backRouterList: BackMenu[]; + currentActiveMenu: Nullable; + sessionTimeout?: boolean; + lastUpdateTime: number; + +} + +export const useUserStore = defineStore({ + id: 'app-user', + state: (): UserState => ({ + // user info + userInfo: null, + // token + token: undefined, + // permissionList + permissionList: [], + backMenuList: [], + backRouterList: [], + // Whether the login expired + sessionTimeout: false, + // Last fetch time + lastUpdateTime: 0, + currentActiveMenu: null, // 👈 2. 加这里 + }), + getters: { + getUserInfo(): UserInfo { + return this.userInfo || getAuthCache(USER_INFO_KEY) || {}; + }, + getToken(): string { + return this.token || getAuthCache(TOKEN_KEY); + }, + getPermissionList(): PermissionInfo[] { + return this.permissionList.length ? this.permissionList : getAuthCache(PERMISSIONS_KEY); + }, + getBackMenuList(): BackMenu[] { + return this.backMenuList; + }, + getBackRouterList(): BackMenu[] { + return this.backRouterList; + }, + getSessionTimeout(): boolean { + return !!this.sessionTimeout; + }, + getLastUpdateTime(): number { + return this.lastUpdateTime; + }, + getCurrentActiveMenu(): BackMenu | null { // 👈 3. 加这里 + return this.currentActiveMenu; + }, + }, + actions: { + setToken(info: string | undefined) { + this.token = info ? info : ''; // for null or undefined value + setAuthCache(TOKEN_KEY, info); + }, + updateToken(info: string | undefined) { + this.lastUpdateTime = 0; + this.setToken(info); + }, + setPermissionList(permissionList: PermissionInfo[]) { + this.permissionList = permissionList; + setAuthCache(PERMISSIONS_KEY, permissionList); + }, + setBackMenuList(backMenuList: BackMenu[]) { + this.backMenuList = backMenuList; + }, + setBackRouterList(backRouterList: BackMenu[]) { + this.backRouterList = backRouterList; + }, + setCurrentActiveMenu(menu: BackMenu | null) { // 👈 4. 加这里 + this.currentActiveMenu = menu; + }, + setUserInfo(info: DeepPartial | null) { + this.userInfo = info ? deepMerge(this.userInfo || {}, info as any) : info; + this.lastUpdateTime = new Date().getTime(); + setAuthCache(USER_INFO_KEY, info); + }, + setSessionTimeout(flag: boolean) { + this.sessionTimeout = flag; + }, + resetState() { + this.userInfo = null; + this.token = ''; + this.permissionList = []; + this.backMenuList = []; + this.backRouterList = []; + this.sessionTimeout = false; + }, + /** + * @description: login + */ + async login( + params: LoginParams & { + goHome?: boolean; + mode?: ErrorMessageMode; + }, + ): Promise { + try { + const { goHome = false, mode, ...loginParams } = params; + const loginRequestParams: LoginRequestParams = { + ...loginParams, + grant_type: 'password', + }; + const res = await loginApi(loginRequestParams); + const { token } = res.data; + this.setToken(token); + const baseStore = useBaseStore(); + const organizeStore = useOrganizeStore(); + baseStore.resetState(); + organizeStore.resetState(); + return this.afterLoginAction(goHome); + } catch (error) { + return null; + } + }, + async afterLoginAction(goHome?: boolean): Promise { + if (!this.getToken) return null; + // get user info + const res = await this.getUserInfoAction(); + const { userInfo } = res as GetUserInfoModel; + const sessionTimeout = this.sessionTimeout; + if (sessionTimeout) { + this.setSessionTimeout(false); + } else { + const permissionStore = usePermissionStore(); + + if (!permissionStore.isDynamicAddedRoute) { + const routes = await permissionStore.buildRoutesAction(); + routes.forEach(route => { + router.addRoute(route as unknown as RouteRecordRaw); + }); + router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw); + permissionStore.setDynamicAddedRoute(true); + } + goHome && (await router.replace(PageEnum.BASE_HOME)); + } + return userInfo; + }, + async getUserInfoAction(): Promise { + if (!this.getToken) return null; + const { createMessage } = useMessage(); + const { t } = useI18n(); + // createMessage.loading({ + // content: t('sys.app.menuLoading'), + // duration: 1, + // }); + const res = await getUserInfo(); + const { userInfo, sysConfigInfo, menuList = [], permissionList = [] } = res.data; + if (!menuList.length) { + this.resetToken(); + return Promise.reject('您的权限不足,请联系管理员'); + } + const { initLocale, getLocale } = useLocale(); + initLocale(getLocale.value); + this.setUserInfo(userInfo); + this.setPermissionList(permissionList); + this.setBackMenuList(menuList); + this.setBackRouterList(menuList); + const appStore = useAppStore(); + appStore.setProjectConfig({ sysConfigInfo }); + localStorage.setItem('_APP_LOGIN_LOGO_', sysConfigInfo.loginIcon || ''); + return res.data; + }, + /** + * @description: logout + */ + async logout(goLogin = false) { + if (this.getToken) { + try { + const res = await doLogout(); + // 单点登录退出登录 + if (res?.data?.ssoLogoutApiUrl) { + const iframe: any = document.createElement('IFRAME'); + iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;'); + iframe.src = res?.data.ssoLogoutApiUrl; + iframe.onload = function () { + document.body.removeChild(iframe); + }; + document.body.appendChild(iframe); + } + } catch { + console.log('注销Token失败'); + } + } + this.resetToken(); + }, + + resetToken() { + this.setToken(undefined); + this.setSessionTimeout(false); + this.setUserInfo(null); + router.push(PageEnum.BASE_LOGIN); + }, + /** + * @description: Confirm before logging out + */ + confirmLoginOut() { + const { createConfirm } = useMessage(); + const { t } = useI18n(); + createConfirm({ + iconType: 'warning', + title: () => h('span', t('sys.app.logoutTip')), + content: () => h('span', t('sys.app.logoutMessage')), + onOk: async () => { + await this.logout(true); + }, + }); + }, + }, +}); + +// Need to be used outside the setup +export function useUserStoreWithOut() { + return useUserStore(store); +} diff --git a/src/utils/auth/index.ts b/src/utils/auth/index.ts new file mode 100644 index 0000000..48d217a --- /dev/null +++ b/src/utils/auth/index.ts @@ -0,0 +1,26 @@ +import { Persistent, BasicKeys } from '@/utils/cache/persistent'; +import { CacheTypeEnum } from '@/enums/cacheEnum'; +import projectSetting from '@/settings/projectSetting'; +import { TOKEN_KEY } from '@/enums/cacheEnum'; + +const { permissionCacheType } = projectSetting; +const isLocal = permissionCacheType === CacheTypeEnum.LOCAL; + +export function getToken() { + return getAuthCache(TOKEN_KEY); +} + +export function getAuthCache(key: BasicKeys) { + const fn = isLocal ? Persistent.getLocal : Persistent.getSession; + return fn(key) as T; +} + +export function setAuthCache(key: BasicKeys, value) { + const fn = isLocal ? Persistent.setLocal : Persistent.setSession; + return fn(key, value, true); +} + +export function clearAuthCache(immediate = true) { + const fn = isLocal ? Persistent.clearLocal : Persistent.clearSession; + return fn(immediate); +} diff --git a/src/utils/bem.ts b/src/utils/bem.ts new file mode 100644 index 0000000..a75b3bd --- /dev/null +++ b/src/utils/bem.ts @@ -0,0 +1,52 @@ +import { prefixCls } from '@/settings/designSetting'; + +type Mod = string | { [key: string]: any }; +type Mods = Mod | Mod[]; + +export type BEM = ReturnType; + +function genBem(name: string, mods?: Mods): string { + if (!mods) { + return ''; + } + + if (typeof mods === 'string') { + return ` ${name}--${mods}`; + } + + if (Array.isArray(mods)) { + return mods.reduce((ret, item) => ret + genBem(name, item), ''); + } + + return Object.keys(mods).reduce((ret, key) => ret + (mods[key] ? genBem(name, key) : ''), ''); +} + +/** + * bem helper + * b() // 'button' + * b('text') // 'button__text' + * b({ disabled }) // 'button button--disabled' + * b('text', { disabled }) // 'button__text button__text--disabled' + * b(['disabled', 'primary']) // 'button button--disabled button--primary' + */ +export function buildBEM(name: string) { + return (el?: Mods, mods?: Mods): Mods => { + if (el && typeof el !== 'string') { + mods = el; + el = ''; + } + + el = el ? `${name}__${el}` : name; + + return `${el}${genBem(el, mods)}`; + }; +} + +export function createBEM(name: string) { + return [buildBEM(`${prefixCls}-${name}`)]; +} + +export function createNamespace(name: string) { + const prefixedName = `${prefixCls}-${name}`; + return [prefixedName, buildBEM(prefixedName)] as const; +} diff --git a/src/utils/cache/index.ts b/src/utils/cache/index.ts new file mode 100644 index 0000000..c1a984c --- /dev/null +++ b/src/utils/cache/index.ts @@ -0,0 +1,32 @@ +import { getStorageShortName } from '@/utils/env'; +import { createStorage as create, CreateStorageParams } from './storageCache'; +import { enableStorageEncryption } from '@/settings/encryptionSetting'; +import { DEFAULT_CACHE_TIME } from '@/settings/encryptionSetting'; + +export type Options = Partial; + +const createOptions = (storage: Storage, options: Options = {}): Options => { + return { + // No encryption in debug mode + hasEncrypt: enableStorageEncryption, + storage, + prefixKey: getStorageShortName(), + ...options, + }; +}; + +export const WebStorage = create(createOptions(sessionStorage)); + +export const createStorage = (storage: Storage = sessionStorage, options: Options = {}) => { + return create(createOptions(storage, options)); +}; + +export const createSessionStorage = (options: Options = {}) => { + return createStorage(sessionStorage, { ...options, timeout: DEFAULT_CACHE_TIME }); +}; + +export const createLocalStorage = (options: Options = {}) => { + return createStorage(localStorage, { ...options, timeout: DEFAULT_CACHE_TIME }); +}; + +export default WebStorage; diff --git a/src/utils/cache/memory.ts b/src/utils/cache/memory.ts new file mode 100644 index 0000000..08a0a64 --- /dev/null +++ b/src/utils/cache/memory.ts @@ -0,0 +1,107 @@ +export interface Cache { + value?: V; + timeoutId?: ReturnType; + time?: number; + alive?: number; +} + +const NOT_ALIVE = 0; + +export class Memory { + private cache: { [key in keyof T]?: Cache } = {}; + private alive: number; + + constructor(alive = NOT_ALIVE) { + // Unit second + this.alive = alive * 1000; + } + + get getCache() { + return this.cache; + } + + setCache(cache) { + this.cache = cache; + } + + // get(key: K) { + // const item = this.getItem(key); + // const time = item?.time; + // if (!isNullOrUnDef(time) && time < new Date().getTime()) { + // this.remove(key); + // } + // return item?.value ?? undefined; + // } + + get(key: K) { + return this.cache[key]; + } + + set(key: K, value: V, expires?: number) { + let item = this.get(key); + + if (!expires || (expires as number) <= 0) { + expires = this.alive; + } + if (item) { + if (item.timeoutId) { + clearTimeout(item.timeoutId); + item.timeoutId = undefined; + } + item.value = value; + } else { + item = { value, alive: expires }; + this.cache[key] = item; + } + + if (!expires) { + return value; + } + const now = new Date().getTime(); + /** + * Prevent overflow of the setTimeout Maximum delay value + * Maximum delay value 2,147,483,647 ms + * https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#maximum_delay_value + */ + item.time = expires > now ? expires : now + expires; + item.timeoutId = setTimeout( + () => { + this.remove(key); + }, + expires > now ? expires - now : expires, + ); + + return value; + } + + remove(key: K) { + const item = this.get(key); + Reflect.deleteProperty(this.cache, key); + if (item) { + clearTimeout(item.timeoutId!); + return item.value; + } + } + + resetCache(cache: { [K in keyof T]: Cache }) { + Object.keys(cache).forEach((key) => { + const k = key as any as keyof T; + const item = cache[k]; + if (item && item.time) { + const now = new Date().getTime(); + const expire = item.time; + if (expire > now) { + this.set(k, item.value, expire); + } + } + }); + } + + clear() { + Object.keys(this.cache).forEach((key) => { + const item = this.cache[key]; + item.timeoutId && clearTimeout(item.timeoutId); + }); + this.cache = {}; + } +} diff --git a/src/utils/cache/persistent.ts b/src/utils/cache/persistent.ts new file mode 100644 index 0000000..1a0121f --- /dev/null +++ b/src/utils/cache/persistent.ts @@ -0,0 +1,132 @@ +import type { LockInfo, UserInfo, PermissionInfo } from '#/store'; +import type { ProjectConfig } from '#/config'; +import type { RouteLocationNormalized } from 'vue-router'; + +import { createLocalStorage, createSessionStorage } from '@/utils/cache'; +import { Memory } from './memory'; +import { + TOKEN_KEY, + USER_INFO_KEY, + PERMISSIONS_KEY, + LOCK_INFO_KEY, + PROJ_CFG_KEY, + APP_LOCAL_CACHE_KEY, + APP_SESSION_CACHE_KEY, + MULTIPLE_TABS_KEY, +} from '@/enums/cacheEnum'; +import { DEFAULT_CACHE_TIME } from '@/settings/encryptionSetting'; +import { toRaw } from 'vue'; +import { pick, omit } from 'lodash-es'; + +interface BasicStore { + [TOKEN_KEY]: string | number | null | undefined; + [USER_INFO_KEY]: UserInfo; + [PERMISSIONS_KEY]: PermissionInfo[]; + [LOCK_INFO_KEY]: LockInfo; + [PROJ_CFG_KEY]: ProjectConfig; + [MULTIPLE_TABS_KEY]: RouteLocationNormalized[]; +} + +type LocalStore = BasicStore; + +type SessionStore = BasicStore; + +export type BasicKeys = keyof BasicStore; +type LocalKeys = keyof LocalStore; +type SessionKeys = keyof SessionStore; + +const ls = createLocalStorage(); +const ss = createSessionStorage(); + +const localMemory = new Memory(DEFAULT_CACHE_TIME); +const sessionMemory = new Memory(DEFAULT_CACHE_TIME); + +function initPersistentMemory() { + const localCache = ls.get(APP_LOCAL_CACHE_KEY); + const sessionCache = ss.get(APP_SESSION_CACHE_KEY); + localCache && localMemory.resetCache(localCache); + sessionCache && sessionMemory.resetCache(sessionCache); +} + +export class Persistent { + static getLocal(key: LocalKeys) { + return localMemory.get(key)?.value as Nullable; + } + + static setLocal(key: LocalKeys, value: LocalStore[LocalKeys], immediate = false): void { + localMemory.set(key, toRaw(value)); + immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache); + } + + static removeLocal(key: LocalKeys, immediate = false): void { + localMemory.remove(key); + immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache); + } + + static clearLocal(immediate = false): void { + localMemory.clear(); + immediate && ls.clear(); + } + + static getSession(key: SessionKeys) { + return sessionMemory.get(key)?.value as Nullable; + } + + static setSession(key: SessionKeys, value: SessionStore[SessionKeys], immediate = false): void { + sessionMemory.set(key, toRaw(value)); + immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache); + } + + static removeSession(key: SessionKeys, immediate = false): void { + sessionMemory.remove(key); + immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache); + } + static clearSession(immediate = false): void { + sessionMemory.clear(); + immediate && ss.clear(); + } + + static clearAll(immediate = false) { + sessionMemory.clear(); + localMemory.clear(); + if (immediate) { + ls.clear(); + ss.clear(); + } + } +} + +window.addEventListener('beforeunload', function () { + // TOKEN_KEY 在登录或注销时已经写入到storage了,此处为了解决同时打开多个窗口时token不同步的问题 + // LOCK_INFO_KEY 在锁屏和解锁时写入,此处也不应修改 + ls.set(APP_LOCAL_CACHE_KEY, { + ...omit(localMemory.getCache, LOCK_INFO_KEY), + ...pick(ls.get(APP_LOCAL_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]), + }); + ss.set(APP_SESSION_CACHE_KEY, { + ...omit(sessionMemory.getCache, LOCK_INFO_KEY), + ...pick(ss.get(APP_SESSION_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]), + }); +}); + +function storageChange(e: any) { + const { key, newValue, oldValue } = e; + + if (!key) { + Persistent.clearAll(); + return; + } + + if (!!newValue && !!oldValue) { + if (APP_LOCAL_CACHE_KEY === key) { + Persistent.clearLocal(); + } + if (APP_SESSION_CACHE_KEY === key) { + Persistent.clearSession(); + } + } +} + +window.addEventListener('storage', storageChange); + +initPersistentMemory(); diff --git a/src/utils/cache/storageCache.ts b/src/utils/cache/storageCache.ts new file mode 100644 index 0000000..421eddd --- /dev/null +++ b/src/utils/cache/storageCache.ts @@ -0,0 +1,114 @@ +import { cacheCipher } from '@/settings/encryptionSetting'; +import type { EncryptionParams } from '@/utils/cipher'; +import { AesEncryption } from '@/utils/cipher'; +import { isNullOrUnDef } from '@/utils/is'; + +export interface CreateStorageParams extends EncryptionParams { + prefixKey: string; + storage: Storage; + hasEncrypt: boolean; + timeout?: Nullable; +} +export const createStorage = ({ + prefixKey = '', + storage = sessionStorage, + key = cacheCipher.key, + iv = cacheCipher.iv, + timeout = null, + hasEncrypt = true, +}: Partial = {}) => { + if (hasEncrypt && [key.length, iv.length].some(item => item !== 16)) { + throw new Error('When hasEncrypt is true, the key or iv must be 16 bits!'); + } + + const encryption = new AesEncryption({ key, iv }); + + /** + * Cache class + * Construction parameters can be passed into sessionStorage, localStorage, + * @class Cache + * @example + */ + const WebStorage = class WebStorage { + private storage: Storage; + private prefixKey?: string; + private encryption: AesEncryption; + private hasEncrypt: boolean; + /** + * + * @param {*} storage + */ + constructor() { + this.storage = storage; + this.prefixKey = prefixKey; + this.encryption = encryption; + this.hasEncrypt = hasEncrypt; + } + + private getKey(key: string) { + let appId = ''; + if (window.location.pathname?.startsWith('/YUNZHUPAAS_APP_')) { + const list = window.location.pathname.split('/'); + appId = list[1]; + } + return `${this.prefixKey}${key}`.toUpperCase() + (appId ? `_${appId}` : ''); + } + + /** + * Set cache + * @param {string} key + * @param {*} value + * @param {*} expire Expiration time in seconds + * @memberof Cache + */ + set(key: string, value: any, expire: number | null = timeout) { + const stringData = JSON.stringify({ + value, + time: Date.now(), + expire: !isNullOrUnDef(expire) ? new Date().getTime() + expire * 1000 : null, + }); + const stringifyValue = this.hasEncrypt ? this.encryption.encryptByAES(stringData) : stringData; + this.storage.setItem(this.getKey(key), stringifyValue); + } + + /** + * Read cache + * @param {string} key + * @param {*} def + * @memberof Cache + */ + get(key: string, def: any = null): any { + const val = this.storage.getItem(this.getKey(key)); + if (!val) return def; + + try { + const decVal = this.hasEncrypt ? this.encryption.decryptByAES(val) : val; + const data = JSON.parse(decVal); + const { value, expire } = data; + if (isNullOrUnDef(expire) || expire >= new Date().getTime()) { + return value; + } + this.remove(key); + } catch (e) { + return def; + } + } + + /** + * Delete cache based on key + * @param {string} key + * @memberof Cache + */ + remove(key: string) { + this.storage.removeItem(this.getKey(key)); + } + + /** + * Delete all caches of this instance + */ + clear(): void { + this.storage.clear(); + } + }; + return new WebStorage(); +}; diff --git a/src/utils/cipher.ts b/src/utils/cipher.ts new file mode 100644 index 0000000..4554b1d --- /dev/null +++ b/src/utils/cipher.ts @@ -0,0 +1,60 @@ +import { encrypt, decrypt } from 'crypto-js/aes'; +import { parse } from 'crypto-js/enc-utf8'; +import pkcs7 from 'crypto-js/pad-pkcs7'; +import ECB from 'crypto-js/mode-ecb'; +import md5 from 'crypto-js/md5'; +import UTF8 from 'crypto-js/enc-utf8'; +import Base64 from 'crypto-js/enc-base64'; +import Hex from 'crypto-js/enc-hex'; +import { useGlobSetting } from '@/hooks/setting'; + +const globSetting = useGlobSetting(); + +export interface EncryptionParams { + key: string; + iv: string; + useHex: boolean; +} + +export class AesEncryption { + private key; + private iv; + private useHex = false; + + constructor(opt: Partial = {}) { + const { key = globSetting.cipherKey, iv, useHex } = opt; + if (key) this.key = parse(key); + if (iv) this.iv = parse(iv); + if (useHex) this.useHex = !!useHex; + } + + get getOptions() { + return { + mode: ECB, + padding: pkcs7, + iv: this.iv, + }; + } + + encryptByAES(cipherText: string) { + const result = encrypt(cipherText, this.key, this.getOptions).toString(); + return this.useHex ? Hex.stringify(Base64.parse(result)) : result; + } + + decryptByAES(cipherText: string) { + const realCipherText = this.useHex ? Base64.stringify(Hex.parse(cipherText)) : cipherText; + return decrypt(realCipherText, this.key, this.getOptions).toString(UTF8); + } +} + +export function encryptByBase64(cipherText: string) { + return UTF8.parse(cipherText).toString(Base64); +} + +export function decodeByBase64(cipherText: string) { + return Base64.parse(cipherText).toString(UTF8); +} + +export function encryptByMd5(password: string) { + return md5(password).toString(); +} diff --git a/src/utils/color.ts b/src/utils/color.ts new file mode 100644 index 0000000..fba12b6 --- /dev/null +++ b/src/utils/color.ts @@ -0,0 +1,142 @@ +/** + * 判断是否 十六进制颜色值. + * 输入形式可为 #fff000 #f00 + * + * @param String color 十六进制颜色值 + * @return Boolean + */ +export function isHexColor(color: string) { + const reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; + return reg.test(color); +} + +/** + * RGB 颜色值转换为 十六进制颜色值. + * r, g, 和 b 需要在 [0, 255] 范围内 + * + * @return String 类似#ff00ff + * @param r + * @param g + * @param b + */ +export function rgbToHex(r: number, g: number, b: number) { + // tslint:disable-next-line:no-bitwise + const hex = ((r << 16) | (g << 8) | b).toString(16); + return '#' + new Array(Math.abs(hex.length - 7)).join('0') + hex; +} + +/** + * Transform a HEX color to its RGB representation + * @param {string} hex The color to transform + * @returns The RGB representation of the passed color + */ +export function hexToRGB(hex: string) { + let sHex = hex.toLowerCase(); + if (isHexColor(hex)) { + if (sHex.length === 4) { + let sColorNew = '#'; + for (let i = 1; i < 4; i += 1) { + sColorNew += sHex.slice(i, i + 1).concat(sHex.slice(i, i + 1)); + } + sHex = sColorNew; + } + const sColorChange: number[] = []; + for (let i = 1; i < 7; i += 2) { + sColorChange.push(parseInt('0x' + sHex.slice(i, i + 2))); + } + return 'RGB(' + sColorChange.join(',') + ')'; + } + return sHex; +} + +export function colorIsDark(color: string) { + if (!isHexColor(color)) return; + const [r, g, b] = hexToRGB(color) + .replace(/(?:\(|\)|rgb|RGB)*/g, '') + .split(',') + .map(item => Number(item)); + return r * 0.299 + g * 0.578 + b * 0.114 < 192; +} + +/** + * Darkens a HEX color given the passed percentage + * @param {string} color The color to process + * @param {number} amount The amount to change the color by + * @returns {string} The HEX representation of the processed color + */ +export function darken(color: string, amount: number) { + color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color; + amount = Math.trunc((255 * amount) / 100); + return `#${subtractLight(color.substring(0, 2), amount)}${subtractLight(color.substring(2, 4), amount)}${subtractLight(color.substring(4, 6), amount)}`; +} + +/** + * Lightens a 6 char HEX color according to the passed percentage + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed color represented as HEX + */ +export function lighten(color: string, amount: number) { + color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color; + amount = Math.trunc((255 * amount) / 100); + return `#${addLight(color.substring(0, 2), amount)}${addLight(color.substring(2, 4), amount)}${addLight(color.substring(4, 6), amount)}`; +} + +/* Suma el porcentaje indicado a un color (RR, GG o BB) hexadecimal para aclararlo */ +/** + * Sums the passed percentage to the R, G or B of a HEX color + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed part of the color + */ +function addLight(color: string, amount: number) { + const cc = parseInt(color, 16) + amount; + const c = cc > 255 ? 255 : cc; + return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`; +} + +/** + * Calculates luminance of an rgb color + * @param {number} r red + * @param {number} g green + * @param {number} b blue + */ +function luminanace(r: number, g: number, b: number) { + const a = [r, g, b].map(v => { + v /= 255; + return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); + }); + return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; +} + +/** + * Calculates contrast between two rgb colors + * @param {string} rgb1 rgb color 1 + * @param {string} rgb2 rgb color 2 + */ +function contrast(rgb1: string[], rgb2: number[]) { + return (luminanace(~~rgb1[0], ~~rgb1[1], ~~rgb1[2]) + 0.05) / (luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05); +} + +/** + * Determines what the best text color is (black or white) based con the contrast with the background + * @param hexColor - Last selected color by the user + */ +export function calculateBestTextColor(hexColor: string) { + const rgbColor = hexToRGB(hexColor.substring(1)); + const contrastWithBlack = contrast(rgbColor.split(','), [0, 0, 0]); + + return contrastWithBlack >= 12 ? '#000000' : '#FFFFFF'; +} + +/** + * Subtracts the indicated percentage to the R, G or B of a HEX color + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed part of the color + */ +function subtractLight(color: string, amount: number) { + const cc = parseInt(color, 16) - amount; + const c = cc < 0 ? 0 : cc; + return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`; +} diff --git a/src/utils/dateUtil.ts b/src/utils/dateUtil.ts new file mode 100644 index 0000000..a7ef9c8 --- /dev/null +++ b/src/utils/dateUtil.ts @@ -0,0 +1,20 @@ +/** + * Independent time operation tool to facilitate subsequent switch to dayjs + */ +import dayjs from 'dayjs'; +import { getDateFormat } from '@/utils/yunzhupaas'; + +const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'; +const DATE_FORMAT = 'YYYY-MM-DD'; + +export type FormatDate = dayjs.ConfigType; + +export function formatToDateTime(date: dayjs.ConfigType = undefined, format = DATE_TIME_FORMAT): string { + return dayjs(date).format(getDateFormat(format)); +} + +export function formatToDate(date: dayjs.ConfigType = undefined, format = DATE_FORMAT): string { + return dayjs(date).format(getDateFormat(format)); +} + +export const dateUtil = dayjs; diff --git a/src/utils/domUtils.ts b/src/utils/domUtils.ts new file mode 100644 index 0000000..7efe9cb --- /dev/null +++ b/src/utils/domUtils.ts @@ -0,0 +1,180 @@ +import type { FunctionArgs } from '@vueuse/core'; +import { upperFirst } from 'lodash-es'; + +export interface ViewportOffsetResult { + left: number; + top: number; + right: number; + bottom: number; + rightIncludeBody: number; + bottomIncludeBody: number; +} + +export function getBoundingClientRect(element: Element): DOMRect | number { + if (!element || !element.getBoundingClientRect) { + return 0; + } + return element.getBoundingClientRect(); +} + +function trim(string: string) { + return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, ''); +} + +/* istanbul ignore next */ +export function hasClass(el: Element, cls: string) { + if (!el || !cls) return false; + if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.'); + if (el.classList) { + return el.classList.contains(cls); + } else { + return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1; + } +} + +/* istanbul ignore next */ +export function addClass(el: Element, cls: string) { + if (!el) return; + let curClass = el.className; + const classes = (cls || '').split(' '); + + for (let i = 0, j = classes.length; i < j; i++) { + const clsName = classes[i]; + if (!clsName) continue; + + if (el.classList) { + el.classList.add(clsName); + } else if (!hasClass(el, clsName)) { + curClass += ' ' + clsName; + } + } + if (!el.classList) { + el.className = curClass; + } +} + +/* istanbul ignore next */ +export function removeClass(el: Element, cls: string) { + if (!el || !cls) return; + const classes = cls.split(' '); + let curClass = ' ' + el.className + ' '; + + for (let i = 0, j = classes.length; i < j; i++) { + const clsName = classes[i]; + if (!clsName) continue; + + if (el.classList) { + el.classList.remove(clsName); + } else if (hasClass(el, clsName)) { + curClass = curClass.replace(' ' + clsName + ' ', ' '); + } + } + if (!el.classList) { + el.className = trim(curClass); + } +} +/** + * Get the left and top offset of the current element + * left: the distance between the leftmost element and the left side of the document + * top: the distance from the top of the element to the top of the document + * right: the distance from the far right of the element to the right of the document + * bottom: the distance from the bottom of the element to the bottom of the document + * rightIncludeBody: the distance between the leftmost element and the right side of the document + * bottomIncludeBody: the distance from the bottom of the element to the bottom of the document + * + * @description: + */ +export function getViewportOffset(element: Element): ViewportOffsetResult { + const doc = document.documentElement; + + const docScrollLeft = doc.scrollLeft; + const docScrollTop = doc.scrollTop; + const docClientLeft = doc.clientLeft; + const docClientTop = doc.clientTop; + + const pageXOffset = window.pageXOffset; + const pageYOffset = window.pageYOffset; + + const box = getBoundingClientRect(element); + + const { left: retLeft, top: rectTop, width: rectWidth, height: rectHeight } = box as DOMRect; + + const scrollLeft = (pageXOffset || docScrollLeft) - (docClientLeft || 0); + const scrollTop = (pageYOffset || docScrollTop) - (docClientTop || 0); + const offsetLeft = retLeft + pageXOffset; + const offsetTop = rectTop + pageYOffset; + + const left = offsetLeft - scrollLeft; + const top = offsetTop - scrollTop; + + const clientWidth = window.document.documentElement.clientWidth; + const clientHeight = window.document.documentElement.clientHeight; + return { + left: left, + top: top, + right: clientWidth - rectWidth - left, + bottom: clientHeight - rectHeight - top, + rightIncludeBody: clientWidth - left, + bottomIncludeBody: clientHeight - top, + }; +} + +export function hackCss(attr: string, value: string) { + const prefix: string[] = ['webkit', 'Moz', 'ms', 'OT']; + + const styleObj: any = {}; + prefix.forEach((item) => { + styleObj[`${item}${upperFirst(attr)}`] = value; + }); + return { + ...styleObj, + [attr]: value, + }; +} + +/* istanbul ignore next */ +export function on( + element: Element | HTMLElement | Document | Window, + event: string, + handler: EventListenerOrEventListenerObject, +): void { + if (element && event && handler) { + element.addEventListener(event, handler, false); + } +} + +/* istanbul ignore next */ +export function off( + element: Element | HTMLElement | Document | Window, + event: string, + handler: Fn, +): void { + if (element && event && handler) { + element.removeEventListener(event, handler, false); + } +} + +/* istanbul ignore next */ +export function once(el: HTMLElement, event: string, fn: EventListener): void { + const listener = function (this: any, ...args: unknown[]) { + if (fn) { + fn.apply(this, args); + } + off(el, event, listener); + }; + on(el, event, listener); +} + +export function useRafThrottle(fn: T): T { + let locked = false; + // @ts-ignore + return function (...args: any[]) { + if (locked) return; + locked = true; + window.requestAnimationFrame(() => { + // @ts-ignore + fn.apply(this, args); + locked = false; + }); + }; +} diff --git a/src/utils/env.ts b/src/utils/env.ts new file mode 100644 index 0000000..8e7f371 --- /dev/null +++ b/src/utils/env.ts @@ -0,0 +1,76 @@ +import type { GlobEnvConfig } from '#/config'; + +import { warn } from '@/utils/log'; +import pkg from '../../package.json'; +import { getConfigFileName } from '../../build/getConfigFileName'; + +export function getCommonStoragePrefix() { + const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig(); + return `${VITE_GLOB_APP_SHORT_NAME}__${getEnv()}`.toUpperCase(); +} + +// Generate cache key according to version +export function getStorageShortName() { + return `${getCommonStoragePrefix()}${`__${pkg.version}`}__`.toUpperCase(); +} + +export function getAppEnvConfig() { + const ENV_NAME = getConfigFileName(import.meta.env); + + const ENV = (import.meta.env.DEV + ? // Get the global configuration (the configuration will be extracted independently when packaging) + (import.meta.env as unknown as GlobEnvConfig) + : window[ENV_NAME as any]) as unknown as GlobEnvConfig; + + const { VITE_GLOB_APP_TITLE, VITE_GLOB_API_URL, VITE_GLOB_REPORT_API_URL, VITE_GLOB_APP_SHORT_NAME, VITE_GLOB_API_URL_PREFIX, VITE_GLOB_WEBSOCKET_URL } = ENV; + + if (!/^[a-zA-Z\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) { + warn(`VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`); + } + + return { + VITE_GLOB_APP_TITLE, + VITE_GLOB_API_URL, + VITE_GLOB_REPORT_API_URL, + VITE_GLOB_APP_SHORT_NAME, + VITE_GLOB_API_URL_PREFIX, + VITE_GLOB_WEBSOCKET_URL, + }; +} + +/** + * @description: Development mode + */ +export const devMode = 'development'; + +/** + * @description: Production mode + */ +export const prodMode = 'production'; + +/** + * @description: Get environment variables + * @returns: + * @example: + */ +export function getEnv(): string { + return import.meta.env.MODE; +} + +/** + * @description: Is it a development mode + * @returns: + * @example: + */ +export function isDevMode(): boolean { + return import.meta.env.DEV; +} + +/** + * @description: Is it a production mode + * @returns: + * @example: + */ +export function isProdMode(): boolean { + return import.meta.env.PROD; +} diff --git a/src/utils/event/index.ts b/src/utils/event/index.ts new file mode 100644 index 0000000..3a60d7c --- /dev/null +++ b/src/utils/event/index.ts @@ -0,0 +1,42 @@ +import ResizeObserver from 'resize-observer-polyfill'; + +const isServer = typeof window === 'undefined'; + +/* istanbul ignore next */ +function resizeHandler(entries: any[]) { + for (const entry of entries) { + const listeners = entry.target.__resizeListeners__ || []; + if (listeners.length) { + listeners.forEach((fn: () => any) => { + fn(); + }); + } + } +} + +/* istanbul ignore next */ +export function addResizeListener(element: any, fn: () => any) { + if (isServer) return; + if (!element.__resizeListeners__) { + element.__resizeListeners__ = []; + element.__ro__ = new ResizeObserver(resizeHandler); + element.__ro__.observe(element); + } + element.__resizeListeners__.push(fn); +} + +/* istanbul ignore next */ +export function removeResizeListener(element: any, fn: () => any) { + if (!element || !element.__resizeListeners__) return; + element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1); + if (!element.__resizeListeners__.length) { + element.__ro__.disconnect(); + } +} + +export function triggerWindowResize() { + const event = document.createEvent('HTMLEvents'); + event.initEvent('resize', true, true); + (event as any).eventType = 'message'; + window.dispatchEvent(event); +} diff --git a/src/utils/factory/createAsyncComponent.tsx b/src/utils/factory/createAsyncComponent.tsx new file mode 100644 index 0000000..58f9be6 --- /dev/null +++ b/src/utils/factory/createAsyncComponent.tsx @@ -0,0 +1,63 @@ +import { + defineAsyncComponent, + // FunctionalComponent, CSSProperties +} from 'vue'; +import { Spin } from 'ant-design-vue'; +import { noop } from '@/utils'; + +// const Loading: FunctionalComponent<{ size: 'small' | 'default' | 'large' }> = (props) => { +// const style: CSSProperties = { +// position: 'absolute', +// display: 'flex', +// justifyContent: 'center', +// alignItems: 'center', +// }; +// return ( +//
+// +//
+// ); +// }; + +interface Options { + size?: 'default' | 'small' | 'large'; + delay?: number; + timeout?: number; + loading?: boolean; + retry?: boolean; +} + +export function createAsyncComponent(loader: Fn, options: Options = {}) { + const { size = 'small', delay = 100, timeout = 30000, loading = false, retry = true } = options; + return defineAsyncComponent({ + loader, + loadingComponent: loading ? : undefined, + // The error component will be displayed if a timeout is + // provided and exceeded. Default: Infinity. + // TODO + timeout, + // errorComponent + // Defining if component is suspensible. Default: true. + // suspensible: false, + delay, + /** + * + * @param {*} error Error message object + * @param {*} retry A function that indicating whether the async component should retry when the loader promise rejects + * @param {*} fail End of failure + * @param {*} attempts Maximum allowed retries number + */ + onError: !retry + ? noop + : (error, retry, fail, attempts) => { + if (error.message.match(/fetch/) && attempts <= 3) { + // retry on fetch errors, 3 max attempts + retry(); + } else { + // Note that retry/fail are like resolve/reject of a promise: + // one of them must be called for the error handling to continue. + fail(); + } + }, + }); +} diff --git a/src/utils/file/base64Conver.ts b/src/utils/file/base64Conver.ts new file mode 100644 index 0000000..5480c81 --- /dev/null +++ b/src/utils/file/base64Conver.ts @@ -0,0 +1,43 @@ +/** + * @description: base64 to blob + */ +export function dataURLtoBlob(base64Buf: string): Blob { + const arr = base64Buf.split(','); + const typeItem = arr[0]; + const mime = typeItem.match(/:(.*?);/)![1]; + const bstr = window.atob(arr[1]); + let n = bstr.length; + const u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new Blob([u8arr], { type: mime }); +} + +/** + * img url to base64 + * @param url + */ +export function urlToBase64(url: string, mineType?: string): Promise { + return new Promise((resolve, reject) => { + let img = new Image(); + img.onload = function () { + let canvas = document.createElement('CANVAS') as Nullable; + const ctx = canvas!.getContext('2d'); + if (!canvas || !ctx) { + return reject(); + } + canvas.height = img.height; + canvas.width = img.width; + ctx.drawImage(img, 0, 0); + const dataURL = canvas.toDataURL(mineType || 'image/png'); + resolve(dataURL); + }; + img.crossOrigin = ''; + img.src = url; + // 图片加载失败的错误处理 + img.onerror = () => { + reject(new Error('图片加载失败')); + }; + }); +} diff --git a/src/utils/file/download.ts b/src/utils/file/download.ts new file mode 100644 index 0000000..a9ae2bd --- /dev/null +++ b/src/utils/file/download.ts @@ -0,0 +1,144 @@ +import { openWindow } from '..'; +import { dataURLtoBlob, urlToBase64 } from './base64Conver'; +import { useGlobSetting } from '@/hooks/setting'; +import { isDevMode } from '@/utils/env'; + +/** + * Download online pictures + * @param url + * @param filename + * @param mime + * @param bom + */ +export function downloadByOnlineUrl(url: string, filename: string, mime?: string, bom?: BlobPart) { + urlToBase64(url).then(base64 => { + downloadByBase64(base64, filename, mime, bom); + }); +} + +/** + * Download pictures based on base64 + * @param buf + * @param filename + * @param mime + * @param bom + */ +export function downloadByBase64(buf: string, filename: string, mime?: string, bom?: BlobPart) { + const base64Buf = dataURLtoBlob(buf); + downloadByData(base64Buf, filename, mime, bom); +} + +/** + * Download according to the background interface file stream + * @param {*} data + * @param {*} filename + * @param {*} mime + * @param {*} bom + */ +export function downloadByData(data: BlobPart, filename: string, mime?: string, bom?: BlobPart) { + const blobData = typeof bom !== 'undefined' ? [bom, data] : [data]; + const blob = new Blob(blobData, { type: mime || 'application/octet-stream' }); + + const blobURL = window.URL.createObjectURL(blob); + const tempLink = document.createElement('a'); + tempLink.style.display = 'none'; + tempLink.href = blobURL; + tempLink.setAttribute('download', filename); + if (typeof tempLink.download === 'undefined') { + tempLink.setAttribute('target', '_blank'); + } + document.body.appendChild(tempLink); + tempLink.click(); + document.body.removeChild(tempLink); + window.URL.revokeObjectURL(blobURL); +} + +/** + * Download file according to file address + * @param {*} sUrl + */ +export function downloadByUrl({ url, target = '_blank', fileName }: { url: string; target?: TargetContext; fileName?: string }): boolean { + if (!url) return false; + const globSetting = useGlobSetting(); + const isChrome = window.navigator.userAgent.toLowerCase().indexOf('chrome') > -1; + const isSafari = window.navigator.userAgent.toLowerCase().indexOf('safari') > -1; + const isFirefox = window.navigator.userAgent.toLowerCase().indexOf('firefox') > -1; + + if (!/https?:\/\//.test(url) && url.indexOf('data:image/png;base64') < 0) url = globSetting.apiUrl + url; + if (isDevMode() && isFirefox) { + const VITE_PROXY: any = import.meta.env.VITE_PROXY || ''; + const proxyList = import.meta.env.VITE_PROXY ? JSON.parse(VITE_PROXY) : []; + for (const [prefix, target] of proxyList) { + if (prefix === globSetting.apiUrl) { + url = url.replace(prefix, target); + break; + } + } + } + if (fileName && url.indexOf('data:image/png;base64') < 0 && url.indexOf('&name=') < 0 && url.indexOf('?name=') < 0) { + url = url + (url.indexOf('?') > -1 ? `&name=${encodeURIComponent(fileName)}` : `?name=${encodeURIComponent(fileName)}`); + } + if (/(iP)/g.test(window.navigator.userAgent)) { + console.error('Your browser does not support download!'); + return false; + } + if (isChrome || isSafari || isFirefox) { + const link = document.createElement('a'); + link.href = url; + link.download = fileName || ''; + if (document.createEvent) { + const e = document.createEvent('MouseEvents'); + e.initEvent('click', true, true); + link.dispatchEvent(e); + return true; + } + } + if (url.indexOf('?') === -1) { + url += '?download'; + } + openWindow(url, { target }); + return true; +} + +export function downloadByUrlReport({ url, target = '_blank', fileName }: { url: string; target?: TargetContext; fileName?: string }): boolean { + if (!url) return false; + const globSetting = useGlobSetting(); + const isChrome = window.navigator.userAgent.toLowerCase().indexOf('chrome') > -1; + const isSafari = window.navigator.userAgent.toLowerCase().indexOf('safari') > -1; + const isFirefox = window.navigator.userAgent.toLowerCase().indexOf('firefox') > -1; + + if (!/https?:\/\//.test(url) && url.indexOf('data:image/png;base64') < 0) url = globSetting.reportApiUrl + url; + if (isDevMode() && isFirefox) { + const VITE_PROXY: any = import.meta.env.VITE_PROXY || ''; + const proxyList = import.meta.env.VITE_PROXY ? JSON.parse(VITE_PROXY) : []; + for (const [prefix, target] of proxyList) { + if (prefix === globSetting.reportApiUrl) { + url = url.replace(prefix, target); + break; + } + } + } + if (fileName && url.indexOf('data:image/png;base64') < 0 && url.indexOf('&name=') < 0 && url.indexOf('?name=') < 0) { + url = url + (url.indexOf('?') > -1 ? `&name=${encodeURIComponent(fileName)}` : `?name=${encodeURIComponent(fileName)}`); + } + if (/(iP)/g.test(window.navigator.userAgent)) { + console.error('Your browser does not support download!'); + return false; + } + if (isChrome || isSafari || isFirefox) { + const link = document.createElement('a'); + link.href = url; + link.download = fileName || ''; + if (document.createEvent) { + const e = document.createEvent('MouseEvents'); + e.initEvent('click', true, true); + link.dispatchEvent(e); + return true; + } + } + if (url.indexOf('?') === -1) { + url += '?download'; + } + openWindow(url, { target }); + return true; +} diff --git a/src/utils/formValidate.ts b/src/utils/formValidate.ts new file mode 100644 index 0000000..c964b1d --- /dev/null +++ b/src/utils/formValidate.ts @@ -0,0 +1,87 @@ +/* + * 正则库 + */ +const regularList = { + iphone: { + rule: /^1[3456789]\d{9}$/, + msg: '请正确输入您的手机号', + }, + password: { + rule: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$/, + msg: '6-16位字符的密码(数字和字母组成)', + }, + idCard: { + rule: /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X|x)$/, + msg: '请正确输入您的身份证号码', + }, + email: { + rule: /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/, + msg: '请正确输入您的邮箱地址', + }, + plateNumber: { + rule: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/, + msg: '请正确输入您的车牌号', + }, + chinese: { + rule: /^[\u4e00-\u9fa5]+$/, + msg: '请正确输入中文', + }, + enCode: { + // 编码校验 + rule: /^[a-zA-Z0-9]((([a-zA-Z0-9])*[a-zA-Z0-9]?)|(([a-zA-Z0-9]+|\.)*[a-zA-Z0-9]))$/, + msg: '只能输入英文、数字和小数点且小数点不能放在首尾', + }, + userAccount: { + // 岗位编码 + rule: /^[A-Za-z0-9]+$/, + msg: '只能输入数字英文', + }, + fullName: { + // 名称 + rule: /^([\u4e00-\u9fa5]|[a-zA-Z0-9])+$/, + msg: '名称不能含有特殊符号', + }, + number: { + // 数字编码 + rule: /^([0-9]+)$/, + msg: '只能输入数字', + }, + allDate: { + //判断请假时间和小时是否为0.5的倍数 + rule: /^[1-9]\d*\.[5]$|0\.[5]$|\.[0]$|^[1-9]\d*$/, + msg: '时间只能是整数和0.5的倍数', + }, + bigInt: { + // 正整数(不含0) + rule: /^[1-9]*[1-9][0-9]*$/, + msg: '请输入正整数', + }, + field: { + // 大小写英文字母、数字、下划线组合,且不能数字、下划线开头 + rule: /^[a-zA-Z]([a-zA-Z0-9_])*$/, + msg: '只能输入大小写英文字母、数字、下划线组合,且不能数字、下划线开头', + }, +}; +/* + * 内置规则 + * @param {String} type - {pattern}中预定义正则名称 or 自定义正则 + * @param {String} msg - 正则校验不通过提示 + * 用法 + * 1、{ validator: this.formValidate('fullName', '用户名由字母、数字、下划线以及短横线组成。'), trigger: 'blur' } + * 2、{ validator: this.formValidate('/^([w-]+|[u4e00-u9fa5]+)$/', '用户名由字母、数字、下划线以及短横线组成。'), trigger: 'blur' } + */ + +const formValidate = (type: string, msg: string = '') => { + return (_rule, value) => { + let reg = regularList[type] && regularList[type].rule ? regularList[type].rule : type; + msg = msg ? msg : regularList[type] && regularList[type].msg ? regularList[type].msg : ''; + if (!value) return Promise.resolve(); + if (!reg.test(value)) { + return Promise.reject(msg); + } else { + return Promise.resolve(); + } + }; +}; + +export default formValidate; diff --git a/src/utils/helper/treeHelper.ts b/src/utils/helper/treeHelper.ts new file mode 100644 index 0000000..eaaf21e --- /dev/null +++ b/src/utils/helper/treeHelper.ts @@ -0,0 +1,205 @@ +interface TreeHelperConfig { + id: string; + children: string; + pid: string; + type?: string; +} +interface FieldNames { + children: string; + title: string; + key: string; +} + +// 默认配置 +const DEFAULT_CONFIG: TreeHelperConfig = { + id: 'id', + children: 'children', + pid: 'parentId', +}; + +// 获取配置。 Object.assign 从一个或多个源对象复制到目标对象 +const getConfig = (config: Partial) => Object.assign({}, DEFAULT_CONFIG, config); + +// tree from list +// 列表中的树 +export function listToTree(list: any[], config: Partial = {}): T[] { + const conf = getConfig(config) as TreeHelperConfig; + const nodeMap = new Map(); + const result: T[] = []; + const { id, children, pid } = conf; + + for (const node of list) { + node[children] = node[children] || []; + nodeMap.set(node[id], node); + } + for (const node of list) { + const parent = nodeMap.get(node[pid]); + (parent ? parent[children] : result).push(node); + } + return result; +} + +export function treeToList(tree: any, config: Partial = {}): T { + config = getConfig(config); + const { children, type = '' } = config; + const result: any = [...tree]; + for (let i = 0; i < result.length; i++) { + if (!result[i][children!]) continue; + result.splice(i + 1, 0, ...result[i][children!]); + } + if (!type) return result; + return result.filter(o => o.type == type); +} + +export function findNode(tree: any, func: Fn, config: Partial = {}): T | null { + config = getConfig(config); + const { children } = config; + const list = [...tree]; + for (const node of list) { + if (func(node)) return node; + node[children!] && list.push(...node[children!]); + } + return null; +} + +export function findNodeAll(tree: any, func: Fn, config: Partial = {}): T[] { + config = getConfig(config); + const { children } = config; + const list = [...tree]; + const result: T[] = []; + for (const node of list) { + func(node) && result.push(node); + node[children!] && list.push(...node[children!]); + } + return result; +} + +export function findPath(tree: any, func: Fn, config: Partial = {}): T | T[] | null { + config = getConfig(config); + const path: T[] = []; + const list = [...tree]; + const visitedSet = new Set(); + const { children } = config; + while (list.length) { + const node = list[0]; + if (visitedSet.has(node)) { + path.pop(); + list.shift(); + } else { + visitedSet.add(node); + node[children!] && list.unshift(...node[children!]); + path.push(node); + if (func(node)) { + return path; + } + } + } + return null; +} + +export function findPathAll(tree: any, func: Fn, config: Partial = {}) { + config = getConfig(config); + const path: any[] = []; + const list = [...tree]; + const result: any[] = []; + const visitedSet = new Set(), + { children } = config; + while (list.length) { + const node = list[0]; + if (visitedSet.has(node)) { + path.pop(); + list.shift(); + } else { + visitedSet.add(node); + node[children!] && list.unshift(...node[children!]); + path.push(node); + func(node) && result.push([...path]); + } + } + return result; +} + +export function filter( + tree: T[], + func: (n: T) => boolean, + // Partial 将 T 中的所有属性设为可选 + config: Partial = {}, +): T[] { + // 获取配置 + config = getConfig(config); + const children = config.children as string; + + function listFilter(list: T[]) { + return list + .map((node: any) => ({ ...node })) + .filter(node => { + // 递归调用 对含有children项 进行再次调用自身函数 listFilter + node[children] = node[children] && listFilter(node[children]); + // 执行传入的回调 func 进行过滤 + return func(node) || (node[children] && node[children].length); + }); + } + + return listFilter(tree); +} + +export function forEach(tree: T[], func: (n: T) => any, config: Partial = {}): void { + config = getConfig(config); + const list: any[] = [...tree]; + const { children } = config; + for (let i = 0; i < list.length; i++) { + //func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿 + if (func(list[i])) { + return; + } + children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]); + } +} + +/** + * @description: Extract tree specified structure + * @description: 提取树指定结构 + */ +export function treeMap(treeData: T[], opt: { children?: string; conversion: Fn }): T[] { + return treeData.map(item => treeMapEach(item, opt)); +} + +/** + * @description: Extract tree specified structure + * @description: 提取树指定结构 + */ +export function treeMapEach(data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) { + const haveChildren = Array.isArray(data[children]) && data[children].length > 0; + const conversionData = conversion(data) || {}; + if (haveChildren) { + return { + ...conversionData, + [children]: data[children].map((i: number) => + treeMapEach(i, { + children, + conversion, + }), + ), + }; + } else { + return { + ...conversionData, + }; + } +} + +/** + * 递归遍历树结构 + * @param treeDatas 树 + * @param callBack 回调 + * @param parentNode 父节点 + */ +export function eachTree(treeDatas: any[], fieldNames: FieldNames, callBack: Fn, parentNode = {}) { + const { children = 'children' } = fieldNames; + treeDatas.forEach(element => { + const newNode = callBack(element, parentNode) || element; + if (element[children]) { + eachTree(element[children], fieldNames, callBack, newNode); + } + }); +} diff --git a/src/utils/helper/tsxHelper.tsx b/src/utils/helper/tsxHelper.tsx new file mode 100644 index 0000000..9ab2805 --- /dev/null +++ b/src/utils/helper/tsxHelper.tsx @@ -0,0 +1,35 @@ +import { Slots } from 'vue'; +import { isFunction } from '@/utils/is'; + +/** + * @description: Get slot to prevent empty error + */ +export function getSlot(slots: Slots, slot = 'default', data?: any) { + if (!slots || !Reflect.has(slots, slot)) { + return null; + } + if (!isFunction(slots[slot])) { + console.error(`${slot} is not a function!`); + return null; + } + const slotFn = slots[slot]; + if (!slotFn) return null; + return slotFn(data); +} + +/** + * extends slots + * @param slots + * @param excludeKeys + */ +export function extendSlots(slots: Slots, excludeKeys: string[] = []) { + const slotKeys = Object.keys(slots); + const ret: any = {}; + slotKeys.map(key => { + if (excludeKeys.includes(key)) { + return null; + } + ret[key] = (data?: any) => getSlot(slots, key, data); + }); + return ret; +} diff --git a/src/utils/http/axios/Axios.ts b/src/utils/http/axios/Axios.ts new file mode 100644 index 0000000..42580b9 --- /dev/null +++ b/src/utils/http/axios/Axios.ts @@ -0,0 +1,228 @@ +import type { AxiosRequestConfig, AxiosInstance, AxiosResponse, AxiosError } from 'axios'; +import type { RequestOptions, Result, UploadFileParams } from '#/axios'; +import type { CreateAxiosOptions } from './axiosTransform'; +import axios from 'axios'; +import qs from 'qs'; +import { AxiosCanceler } from './axiosCancel'; +import { isFunction } from '@/utils/is'; +import { cloneDeep } from 'lodash-es'; +import { ContentTypeEnum } from '@/enums/httpEnum'; +import { RequestEnum } from '@/enums/httpEnum'; + +export * from './axiosTransform'; + +/** + * @description: axios module + */ +export class VAxios { + private axiosInstance: AxiosInstance; + private readonly options: CreateAxiosOptions; + + constructor(options: CreateAxiosOptions) { + this.options = options; + this.axiosInstance = axios.create(options); + this.setupInterceptors(); + } + + /** + * @description: Create axios instance + */ + private createAxios(config: CreateAxiosOptions): void { + this.axiosInstance = axios.create(config); + } + + private getTransform() { + const { transform } = this.options; + return transform; + } + + getAxios(): AxiosInstance { + return this.axiosInstance; + } + + /** + * @description: Reconfigure axios + */ + configAxios(config: CreateAxiosOptions) { + if (!this.axiosInstance) { + return; + } + this.createAxios(config); + } + + /** + * @description: Set general header + */ + setHeader(headers: any): void { + if (!this.axiosInstance) { + return; + } + Object.assign(this.axiosInstance.defaults.headers, headers); + } + + /** + * @description: Interceptor configuration 拦截器配置 + */ + private setupInterceptors() { + const transform = this.getTransform(); + if (!transform) { + return; + } + const { requestInterceptors, requestInterceptorsCatch, responseInterceptors, responseInterceptorsCatch } = transform; + + const axiosCanceler = new AxiosCanceler(); + + // Request interceptor configuration processing + this.axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => { + // If cancel repeat request is turned on, then cancel repeat request is prohibited + // @ts-ignore + const { ignoreCancelToken } = config.requestOptions; + const ignoreCancel = ignoreCancelToken !== undefined ? ignoreCancelToken : this.options.requestOptions?.ignoreCancelToken; + + !ignoreCancel && axiosCanceler.addPending(config); + if (requestInterceptors && isFunction(requestInterceptors)) { + config = requestInterceptors(config, this.options); + } + return config; + }, undefined); + + // Request interceptor error capture + requestInterceptorsCatch && isFunction(requestInterceptorsCatch) && this.axiosInstance.interceptors.request.use(undefined, requestInterceptorsCatch); + + // Response result interceptor processing + this.axiosInstance.interceptors.response.use((res: AxiosResponse) => { + res && axiosCanceler.removePending(res.config); + if (responseInterceptors && isFunction(responseInterceptors)) { + res = responseInterceptors(res); + } + return res; + }, undefined); + + // Response result interceptor error capture + responseInterceptorsCatch && + isFunction(responseInterceptorsCatch) && + this.axiosInstance.interceptors.response.use(undefined, error => { + // @ts-ignore + return responseInterceptorsCatch(this.axiosInstance, error); + }); + } + + /** + * @description: File Upload + */ + uploadFile(config: AxiosRequestConfig, params: UploadFileParams) { + const formData = new window.FormData(); + const customFilename = params.name || 'file'; + + if (params.filename) { + formData.append(customFilename, params.file, params.filename); + } else { + formData.append(customFilename, params.file); + } + + if (params.data) { + Object.keys(params.data).forEach(key => { + const value = params.data![key]; + if (Array.isArray(value)) { + value.forEach(item => { + formData.append(`${key}[]`, item); + }); + return; + } + + formData.append(key, params.data![key]); + }); + } + + return this.axiosInstance.request({ + ...config, + method: 'POST', + data: formData, + headers: { + 'Content-type': ContentTypeEnum.FORM_DATA, + // @ts-ignore + ignoreCancelToken: true, + }, + }); + } + + // support form-data + supportFormData(config: AxiosRequestConfig) { + const headers = config.headers || this.options.headers; + const contentType = headers?.['Content-Type'] || headers?.['content-type']; + + if (contentType !== ContentTypeEnum.FORM_URLENCODED || !Reflect.has(config, 'data') || config.method?.toUpperCase() === RequestEnum.GET) { + return config; + } + + return { + ...config, + data: qs.stringify(config.data, { arrayFormat: 'brackets' }), + }; + } + + get(config: AxiosRequestConfig, options?: RequestOptions): Promise { + return this.request({ ...config, method: 'GET' }, options); + } + + post(config: AxiosRequestConfig, options?: RequestOptions): Promise { + return this.request({ ...config, method: 'POST' }, options); + } + + put(config: AxiosRequestConfig, options?: RequestOptions): Promise { + return this.request({ ...config, method: 'PUT' }, options); + } + + delete(config: AxiosRequestConfig, options?: RequestOptions): Promise { + return this.request({ ...config, method: 'DELETE' }, options); + } + + request(config: AxiosRequestConfig, options?: RequestOptions): Promise { + let conf: CreateAxiosOptions = cloneDeep(config); + // cancelToken 如果被深拷贝,会导致最外层无法使用cancel方法来取消请求 + if (config.cancelToken) { + conf.cancelToken = config.cancelToken; + } + const transform = this.getTransform(); + + const { requestOptions } = this.options; + + const opt: RequestOptions = Object.assign({}, requestOptions, options); + + conf.requestOptions = opt; + + const { beforeRequestHook, requestCatchHook, transformResponseHook } = transform || {}; + if (beforeRequestHook && isFunction(beforeRequestHook)) { + conf = beforeRequestHook(conf, opt); + } + + conf = this.supportFormData(conf); + + return new Promise((resolve, reject) => { + this.axiosInstance + .request>(conf) + .then((res: AxiosResponse) => { + if (transformResponseHook && isFunction(transformResponseHook)) { + try { + const ret = transformResponseHook(res, opt); + resolve(ret); + } catch (err) { + reject(err || new Error('request error!')); + } + return; + } + resolve(res as unknown as Promise); + }) + .catch((e: Error | AxiosError) => { + if (requestCatchHook && isFunction(requestCatchHook)) { + reject(requestCatchHook(e, opt)); + return; + } + if (axios.isAxiosError(e)) { + // rewrite error message from axios in here + } + reject(e); + }); + }); + } +} diff --git a/src/utils/http/axios/axiosCancel.ts b/src/utils/http/axios/axiosCancel.ts new file mode 100644 index 0000000..3b983be --- /dev/null +++ b/src/utils/http/axios/axiosCancel.ts @@ -0,0 +1,60 @@ +import type { AxiosRequestConfig, Canceler } from 'axios'; +import axios from 'axios'; +import { isFunction } from '@/utils/is'; + +// Used to store the identification and cancellation function of each request +let pendingMap = new Map(); + +export const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&'); + +export class AxiosCanceler { + /** + * Add request + * @param {Object} config + */ + addPending(config: AxiosRequestConfig) { + this.removePending(config); + const url = getPendingUrl(config); + config.cancelToken = + config.cancelToken || + new axios.CancelToken(cancel => { + if (!pendingMap.has(url)) { + // If there is no current request in pending, add it + pendingMap.set(url, cancel); + } + }); + } + + /** + * @description: Clear all pending + */ + removeAllPending() { + pendingMap.forEach(cancel => { + cancel && isFunction(cancel) && cancel(); + }); + pendingMap.clear(); + } + + /** + * Removal request + * @param {Object} config + */ + removePending(config: AxiosRequestConfig) { + const url = getPendingUrl(config); + + if (pendingMap.has(url)) { + // If there is a current request identifier in pending, + // the current request needs to be cancelled and removed + const cancel = pendingMap.get(url); + cancel && cancel(url); + pendingMap.delete(url); + } + } + + /** + * @description: reset + */ + reset(): void { + pendingMap = new Map(); + } +} diff --git a/src/utils/http/axios/axiosRetry.ts b/src/utils/http/axios/axiosRetry.ts new file mode 100644 index 0000000..86e1b44 --- /dev/null +++ b/src/utils/http/axios/axiosRetry.ts @@ -0,0 +1,30 @@ +import { AxiosError, AxiosInstance } from 'axios'; +/** + * 请求重试机制 + */ + +export class AxiosRetry { + /** + * 重试 + */ + retry(axiosInstance: AxiosInstance, error: AxiosError) { + // @ts-ignore + const { config } = error.response; + const { waitTime, count } = config?.requestOptions?.retryRequest; + config.__retryCount = config.__retryCount || 0; + if (config.__retryCount >= count) { + return Promise.reject(error); + } + config.__retryCount += 1; + //请求返回后config的header不正确造成重试请求失败,删除返回headers采用默认headers + delete config.headers; + return this.delay(waitTime).then(() => axiosInstance(config)); + } + + /** + * 延迟 + */ + private delay(waitTime: number) { + return new Promise(resolve => setTimeout(resolve, waitTime)); + } +} diff --git a/src/utils/http/axios/axiosTransform.ts b/src/utils/http/axios/axiosTransform.ts new file mode 100644 index 0000000..eb6344d --- /dev/null +++ b/src/utils/http/axios/axiosTransform.ts @@ -0,0 +1,49 @@ +/** + * Data processing class, can be configured according to the project + */ +import type { AxiosRequestConfig, AxiosInstance, AxiosResponse } from 'axios'; +import type { RequestOptions, Result } from '#/axios'; + +export interface CreateAxiosOptions extends AxiosRequestConfig { + authenticationScheme?: string; + transform?: AxiosTransform; + requestOptions?: RequestOptions; +} + +export abstract class AxiosTransform { + /** + * @description: Process configuration before request + * @description: Process configuration before request + */ + beforeRequestHook?: (config: CreateAxiosOptions, options: RequestOptions) => AxiosRequestConfig; + + /** + * @description: 处理响应数据 + */ + transformResponseHook?: (res: AxiosResponse, options: RequestOptions) => any; + + /** + * @description: 请求失败处理 + */ + requestCatchHook?: (e: Error, options: RequestOptions) => Promise; + + /** + * @description: 请求之前的拦截器 + */ + requestInterceptors?: (config: AxiosRequestConfig, options: CreateAxiosOptions) => AxiosRequestConfig; + + /** + * @description: 请求之后的拦截器 + */ + responseInterceptors?: (res: AxiosResponse) => AxiosResponse; + + /** + * @description: 请求之前的拦截器错误处理 + */ + requestInterceptorsCatch?: (error: Error) => void; + + /** + * @description: 请求之后的拦截器错误处理 + */ + responseInterceptorsCatch?: (axiosInstance: AxiosInstance, error: Error) => void; +} diff --git a/src/utils/http/axios/checkStatus.ts b/src/utils/http/axios/checkStatus.ts new file mode 100644 index 0000000..d049664 --- /dev/null +++ b/src/utils/http/axios/checkStatus.ts @@ -0,0 +1,76 @@ +import type { ErrorMessageMode } from '#/axios'; +import { useMessage } from '@/hooks/web/useMessage'; +import { useI18n } from '@/hooks/web/useI18n'; +// import router from '@/router'; +// import { PageEnum } from '@/enums/pageEnum'; +import { useUserStoreWithOut } from '@/store/modules/user'; +import projectSetting from '@/settings/projectSetting'; +import { SessionTimeoutProcessingEnum } from '@/enums/appEnum'; + +const { createMessage, createErrorModal } = useMessage(); +const error = createMessage.error!; +const stp = projectSetting.sessionTimeoutProcessing; + +export function checkStatus(status: number, msg: string, errorMessageMode: ErrorMessageMode = 'message'): void { + const { t } = useI18n(); + const userStore = useUserStoreWithOut(); + let errMessage = ''; + + switch (status) { + case 400: + errMessage = `${msg}`; + break; + // 401: Not logged in + // Jump to the login page if not logged in, and carry the path of the current page + // Return to the current page after successful login. This step needs to be operated on the login page. + case 401: + userStore.setToken(undefined); + errMessage = msg || t('sys.api.errMsg401'); + if (stp === SessionTimeoutProcessingEnum.PAGE_COVERAGE) { + userStore.setSessionTimeout(true); + } else { + userStore.logout(true); + } + break; + case 403: + errMessage = t('sys.api.errMsg403'); + break; + // 404请求不存在 + case 404: + errMessage = t('sys.api.errMsg404'); + break; + case 405: + errMessage = t('sys.api.errMsg405'); + break; + case 408: + errMessage = t('sys.api.errMsg408'); + break; + case 500: + errMessage = t('sys.api.errMsg500'); + break; + case 501: + errMessage = t('sys.api.errMsg501'); + break; + case 502: + errMessage = t('sys.api.errMsg502'); + break; + case 503: + errMessage = t('sys.api.errMsg503'); + break; + case 504: + errMessage = t('sys.api.errMsg504'); + break; + case 505: + errMessage = t('sys.api.errMsg505'); + break; + default: + } + + if (errMessage) { + if (errorMessageMode === 'modal') { + createErrorModal({ title: t('sys.api.errorTip'), content: errMessage }); + } else if (errorMessageMode === 'message') { + error({ content: errMessage, key: `global_error_message_status_${status}` }); + } + } +} diff --git a/src/utils/http/axios/helper.ts b/src/utils/http/axios/helper.ts new file mode 100644 index 0000000..ff5b6d6 --- /dev/null +++ b/src/utils/http/axios/helper.ts @@ -0,0 +1,45 @@ +import { isObject, isString } from '@/utils/is'; + +const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'; + +export function joinTimestamp(join: boolean, restful: T): T extends true ? string : object; + +export function joinTimestamp(join: boolean, restful = false): string | object { + if (!join) { + return restful ? '' : {}; + } + const now = new Date().getTime(); + if (restful) { + return `?_t=${now}`; + } + return { _t: now }; +} + +/** + * @description: Format request parameter time + */ +export function formatRequestDate(params: Recordable) { + if (Object.prototype.toString.call(params) !== '[object Object]') { + return; + } + + for (const key in params) { + const format = params[key]?.format ?? null; + if (format && typeof format === 'function') { + params[key] = params[key].format(DATE_TIME_FORMAT); + } + if (isString(key)) { + const value = params[key]; + if (value) { + try { + params[key] = isString(value) ? value.trim() : value; + } catch (error: any) { + throw new Error(error); + } + } + } + if (isObject(params[key])) { + formatRequestDate(params[key]); + } + } +} diff --git a/src/utils/http/axios/index.ts b/src/utils/http/axios/index.ts new file mode 100644 index 0000000..cb06e6d --- /dev/null +++ b/src/utils/http/axios/index.ts @@ -0,0 +1,292 @@ +// axios配置 可自行根据项目进行更改,只需更改该文件即可,其他文件可以不动 +// The axios configuration can be changed according to the project, just change the file, other files can be left unchanged + +import type { AxiosInstance, AxiosResponse } from 'axios'; +import { clone } from 'lodash-es'; +import type { RequestOptions, Result } from '#/axios'; +import type { AxiosTransform, CreateAxiosOptions } from './axiosTransform'; +import { VAxios } from './Axios'; +import { checkStatus } from './checkStatus'; +import { useGlobSetting } from '@/hooks/setting'; +import { useMessage } from '@/hooks/web/useMessage'; +import { RequestEnum, ResultEnum, ContentTypeEnum } from '@/enums/httpEnum'; +import { isString, isObject } from '@/utils/is'; +import { getToken } from '@/utils/auth'; +import { setObjToUrlParams, deepMerge } from '@/utils'; +import { useErrorLogStoreWithOut } from '@/store/modules/errorLog'; +import { useI18n } from '@/hooks/web/useI18n'; +import { joinTimestamp, formatRequestDate } from './helper'; +import { useUserStoreWithOut } from '@/store/modules/user'; +import { useLocaleStoreWithOut } from '@/store/modules/locale'; +import { AxiosRetry } from '@/utils/http/axios/axiosRetry'; +import { AesEncryption } from '@/utils/cipher'; +import axios from 'axios'; + +const localeStore = useLocaleStoreWithOut(); +const locale = localeStore.getLocale; +const globSetting = useGlobSetting(); +const urlPrefix = globSetting.urlPrefix; +const aesEncryption = new AesEncryption({ useHex: true }); +const { createMessage, createErrorModal } = useMessage(); + +/** + * @description: 数据处理,方便区分多种处理方式 + */ +const transform: AxiosTransform = { + /** + * @description: 处理响应数据。如果数据不是预期格式,可直接抛出错误 + */ + transformResponseHook: (res: AxiosResponse, options: RequestOptions) => { + const { t } = useI18n(); + const { isTransformResponse, isReturnNativeResponse } = options; + // 是否返回原生响应头 比如:需要获取响应头时使用该属性 + if (isReturnNativeResponse) { + return res; + } + // 不进行任何处理,直接返回 + // 用于页面代码可能需要直接获取code,data,msg这些信息时开启 + if (!isTransformResponse) { + return res.data; + } + // 错误的时候返回 + + if (!res.data) { + // return '[HTTP] Request has no return value'; + throw new Error(t('sys.api.apiRequestFailed')); + } + // 这里 code,data,msg为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式 + const { code, msg } = res.data; + + // 这里逻辑可以根据项目进行修改 + const hasSuccess = res.data && isObject(res.data) && Reflect.has(res.data, 'code') && code === ResultEnum.SUCCESS; + if (hasSuccess) { + return res.data; + } + + // 在此处根据自己项目的实际情况对不同的code执行不同的操作 + // 如果不希望中断当前请求,请return数据,否则直接抛出异常即可 + let errorMsg = ''; + switch (code) { + case ResultEnum.TOKEN_TIMEOUT: + case ResultEnum.TOKEN_LOGGED: + case ResultEnum.TOKEN_ERROR: + errorMsg = msg || t('sys.api.timeoutMessage'); + const userStore = useUserStoreWithOut(); + userStore.setToken(undefined); + userStore.logout(true); + break; + default: + errorMsg = msg || t('sys.api.apiRequestFailed'); + } + + // errorMessageMode='modal'的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误 + // errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示 + if (options.errorMessageMode === 'modal') { + createErrorModal({ title: t('sys.api.errorTip'), content: errorMsg }); + } else if (options.errorMessageMode === 'message') { + createMessage.error(errorMsg); + } + + throw new Error(errorMsg); + }, + + // 请求之前处理config + beforeRequestHook: (config, options) => { + const { apiUrl, joinPrefix, joinParamsToUrl, formatDate, joinTime = true, urlPrefix } = options; + + if (joinPrefix) { + config.url = `${urlPrefix}${config.url}`; + } + + if (apiUrl && isString(apiUrl) && !/https?:\/\//.test(config.url || '')) { + config.url = `${apiUrl}${config.url}`; + } + const params = config.params || config.data || {}; + const data = config.data || false; + formatDate && data && !isString(data) && formatRequestDate(data); + if (config.method?.toUpperCase() === RequestEnum.GET) { + if (!isString(params)) { + // 给 get 请求加上时间戳参数,避免从缓存中拿数据。 + config.params = Object.assign(params || {}, joinTimestamp(joinTime, false)); + } else { + // 兼容restful风格 + config.url = config.url + params + `${joinTimestamp(joinTime, true)}`; + config.params = undefined; + } + } else { + if (!isString(params)) { + formatDate && formatRequestDate(params); + if (Reflect.has(config, 'data') && config.data && (Object.keys(config.data).length > 0 || config.data instanceof FormData)) { + config.data = data; + config.params = undefined; + } else { + // 非GET请求如果没有提供data,则将params视为data + config.data = params; + config.params = undefined; + } + if (joinParamsToUrl) { + config.url = setObjToUrlParams(config.url as string, Object.assign({}, config.params, config.data)); + } + // 数据加密 + if (config?.requestOptions?.useCipher && config.data) { + const resultStr = aesEncryption.encryptByAES(JSON.stringify(config.data)); + if (resultStr) config.data = { encryptData: resultStr }; + } + } else { + // 兼容restful风格 + config.url = config.url + params; + config.params = undefined; + } + } + return config; + }, + + /** + * @description: 请求拦截器处理 + */ + requestInterceptors: (config, options) => { + // 请求之前处理config + (config as Recordable).headers['yunzhupaas-origin'] = 'pc'; + (config as Recordable).headers['vue-version'] = '3'; + (config as Recordable).headers['Accept-Language'] = locale.replace('_', '-'); + const token = getToken(); + if (token && (config as Recordable)?.requestOptions?.withToken !== false) { + // jwt token + (config as Recordable).headers.Authorization = options.authenticationScheme ? `${options.authenticationScheme} ${token}` : token; + } + return config; + }, + + /** + * @description: 响应拦截器处理 + */ + responseInterceptors: (res: AxiosResponse) => { + // 数据解密 + if ((res.config as any)?.requestOptions?.useCipher) { + const resultStr = aesEncryption.decryptByAES(res.data as unknown as string); + if (resultStr) res.data = JSON.parse(resultStr); + } + return res; + }, + + /** + * @description: 响应错误处理 + */ + responseInterceptorsCatch: (axiosInstance: AxiosInstance, error: any) => { + const { t } = useI18n(); + const errorLogStore = useErrorLogStoreWithOut(); + errorLogStore.addAjaxErrorInfo(error); + const { response, code, message, config } = error || {}; + const errorMessageMode = config?.requestOptions?.errorMessageMode || 'none'; + const msg: string = response?.data?.error?.message ?? ''; + const err: string = error?.toString?.() ?? ''; + let errMessage = ''; + + if (axios.isCancel(error)) { + return Promise.reject(error); + } + + try { + if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) { + errMessage = t('sys.api.apiTimeoutMessage'); + } + if (err?.includes('Network Error')) { + errMessage = t('sys.api.networkExceptionMsg'); + } + + if (errMessage) { + if (errorMessageMode === 'modal') { + createErrorModal({ title: t('sys.api.errorTip'), content: errMessage }); + } else if (errorMessageMode === 'message') { + createMessage.error(errMessage); + } + return Promise.reject(error); + } + } catch (error) { + throw new Error(error as unknown as string); + } + + checkStatus(error?.response?.status, msg, errorMessageMode); + + // 添加自动重试机制 保险起见 只针对GET请求 + const retryRequest = new AxiosRetry(); + const { isOpenRetry } = config.requestOptions.retryRequest; + config.method?.toUpperCase() === RequestEnum.GET && + isOpenRetry && + // @ts-ignore + retryRequest.retry(axiosInstance, error); + return Promise.reject(error); + }, +}; + +function createAxios(opt?: Partial) { + return new VAxios( + // 深度合并 + deepMerge( + { + // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes + // authentication schemes,e.g: Bearer + // authenticationScheme: 'Bearer', + authenticationScheme: '', + timeout: 1000 * 1000, + // 基础接口地址 + // baseURL: globSetting.apiUrl, + + headers: { 'Content-Type': ContentTypeEnum.JSON }, + // 如果是form-data格式 + // headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED }, + // 数据处理方式 + transform: clone(transform), + // 配置项,下面的选项都可以在独立的接口请求中覆盖 + requestOptions: { + // 默认将prefix 添加到url + joinPrefix: true, + // 是否返回原生响应头 比如:需要获取响应头时使用该属性 + isReturnNativeResponse: false, + // 需要对返回数据进行处理 + isTransformResponse: true, + // post请求的时候添加参数到url + joinParamsToUrl: false, + // 格式化提交参数时间 + formatDate: true, + // 消息提示类型 + errorMessageMode: 'message', + // 接口地址 + apiUrl: globSetting.apiUrl, + // 接口拼接地址 + urlPrefix: urlPrefix, + // 是否加入时间戳 + joinTime: true, + // 忽略重复请求 + ignoreCancelToken: true, + // 是否携带token + withToken: true, + // 是否加密 + useCipher: false, + retryRequest: { + isOpenRetry: false, + count: 5, + waitTime: 100, + }, + }, + }, + opt || {}, + ), + ); +} +export const defHttp = createAxios(); + +// 报表接口 +export const reportHttp = createAxios({ + requestOptions: { + apiUrl: globSetting.reportApiUrl, + }, +}); + +// other api url +// export const otherHttp = createAxios({ +// requestOptions: { +// apiUrl: 'xxx', +// urlPrefix: 'xxx', +// }, +// }); diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..ad92972 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,147 @@ +import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router'; +import type { App, Component } from 'vue'; + +import { unref } from 'vue'; +import { isArray, isObject } from '@/utils/is'; +import { cloneDeep, isEqual, mergeWith, unionWith } from 'lodash-es'; + +export const noop = () => {}; + +/** + * @description: Set ui mount node + */ +export function getPopupContainer(node?: HTMLElement): HTMLElement { + return (node?.parentNode as HTMLElement) ?? document.body; +} + +/** + * Add the object as a parameter to the URL + * @param baseUrl url + * @param obj + * @returns {string} + * eg: + * let obj = {a: '3', b: '4'} + * setObjToUrlParams('www.baidu.com', obj) + * ==>www.baidu.com?a=3&b=4 + */ +export function setObjToUrlParams(baseUrl: string, obj: any): string { + let parameters = ''; + for (const key in obj) { + parameters += key + '=' + encodeURIComponent(obj[key]) + '&'; + } + parameters = parameters.replace(/&$/, ''); + return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters; +} + +/** + 递归合并两个对象。 + Recursively merge two objects. + @param target 目标对象,合并后结果存放于此。The target object to merge into. + @param source 要合并的源对象。The source object to merge from. + @returns 合并后的对象。The merged object. + */ +export function deepMerge(target: T, source: U): T & U { + return mergeWith(cloneDeep(target), source, (objValue, srcValue) => { + if (isObject(objValue) && isObject(srcValue)) { + return mergeWith(cloneDeep(objValue), srcValue, (prevValue, nextValue) => { + // 如果是数组,合并数组(去重) If it is an array, merge the array (remove duplicates) + return isArray(prevValue) ? unionWith(prevValue, nextValue, isEqual) : undefined; + }); + } + }); +} + +export function openWindow(url: string, opt?: { target?: TargetContext | string; noopener?: boolean; noreferrer?: boolean }) { + const { target = '_blank', noopener = true, noreferrer = true } = opt || {}; + const feature: string[] = []; + + noopener && feature.push('noopener=yes'); + noreferrer && feature.push('noreferrer=yes'); + + window.open(url, target, feature.join(',')); +} + +// dynamic use hook props +export function getDynamicProps, U>(props: T): Partial { + const ret: Recordable = {}; + + Object.keys(props).map(key => { + ret[key] = unref((props as Recordable)[key]); + }); + + return ret as Partial; +} + +export function getRawRoute(route: RouteLocationNormalized): RouteLocationNormalized { + if (!route) return route; + const { matched, ...opt } = route; + return { + ...opt, + matched: (matched + ? matched.map(item => ({ + meta: item.meta, + name: item.name, + path: item.path, + })) + : undefined) as RouteRecordNormalized[], + }; +} + +// https://github.com/vant-ui/vant/issues/8302 +type EventShim = { + new (...args: any[]): { + $props: { + onClick?: (...args: any[]) => void; + }; + }; +}; + +export type WithInstall = T & { + install(app: App): void; +} & EventShim; + +export type CustomComponent = Component & { displayName?: string }; + +export const withInstall = (component: T, alias?: string) => { + (component as Record).install = (app: App) => { + const compName = component.name || component.displayName; + if (!compName) return; + app.component(compName, component); + if (alias) { + app.config.globalProperties[alias] = component; + } + }; + return component as WithInstall; +}; + +// 开始:解决老的vue2动态导入文件语法vite不支持的问题 +const allModules = import.meta.glob('../views/**/*.vue'); +export function importViewsFile(path): Promise { + if (path.startsWith('/')) { + path = path.substring(1); + } + let page = '', + realPage = ''; + if (path.endsWith('.vue')) { + page = `../views/${path}`; + realPage = `../views/${path}`; + } else { + page = `../views/${path}.vue`; + realPage = `../views/${path}/index.vue`; + } + return new Promise((resolve, reject) => { + let flag = true; + for (const path in allModules) { + if (path == page || path == realPage) { + flag = false; + allModules[path]().then(mod => { + resolve(mod); + }); + } + } + if (flag) { + reject('该文件不存在:' + page); + } + }); +} +// 结束:解决老的vue2动态导入文件语法 vite不支持的问题 diff --git a/src/utils/is.ts b/src/utils/is.ts new file mode 100644 index 0000000..4e729f9 --- /dev/null +++ b/src/utils/is.ts @@ -0,0 +1,98 @@ +const toString = Object.prototype.toString; + +export function is(val: unknown, type: string) { + return toString.call(val) === `[object ${type}]`; +} + +export function isDef(val?: T): val is T { + return typeof val !== 'undefined'; +} + +export function isUnDef(val?: T): val is T { + return !isDef(val); +} + +export function isObject(val: any): val is Record { + return val !== null && is(val, 'Object'); +} + +export function isEmpty(val: T): val is T { + if (isArray(val) || isString(val)) { + return val.length === 0; + } + + if (val instanceof Map || val instanceof Set) { + return val.size === 0; + } + + if (isObject(val)) { + return Object.keys(val).length === 0; + } + + return false; +} + +export function isDate(val: unknown): val is Date { + return is(val, 'Date'); +} + +export function isNull(val: unknown): val is null { + return val === null; +} + +export function isNullAndUnDef(val: unknown): val is null | undefined { + return isUnDef(val) && isNull(val); +} + +export function isNullOrUnDef(val: unknown): val is null | undefined { + return isUnDef(val) || isNull(val); +} + +export function isNumber(val: unknown): val is number { + return is(val, 'Number'); +} + +export function isPromise(val: unknown): val is Promise { + return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch); +} + +export function isString(val: unknown): val is string { + return is(val, 'String'); +} + +export function isFunction(val: unknown): val is Function { + return typeof val === 'function'; +} + +export function isBoolean(val: unknown): val is boolean { + return is(val, 'Boolean'); +} + +export function isRegExp(val: unknown): val is RegExp { + return is(val, 'RegExp'); +} + +export function isArray(val: any): val is Array { + return val && Array.isArray(val); +} + +export function isWindow(val: any): val is Window { + return typeof window !== 'undefined' && is(val, 'Window'); +} + +export function isElement(val: unknown): val is Element { + return isObject(val) && !!val.tagName; +} + +export function isMap(val: unknown): val is Map { + return is(val, 'Map'); +} + +export const isServer = typeof window === 'undefined'; + +export const isClient = !isServer; + +export function isUrl(path: string): boolean { + const reg = /^http(s)?:\/\/([\w-]+(\.)?)+[\w-]+(\/[\w- .\/?%&=]*)?/; + return reg.test(path); +} diff --git a/src/utils/log.ts b/src/utils/log.ts new file mode 100644 index 0000000..8f79800 --- /dev/null +++ b/src/utils/log.ts @@ -0,0 +1,9 @@ +const projectName = import.meta.env.VITE_GLOB_APP_TITLE; + +export function warn(message: string) { + console.warn(`[${projectName} warn]:${message}`); +} + +export function error(message: string) { + throw new Error(`[${projectName} error]:${message}`); +} diff --git a/src/utils/mitt.ts b/src/utils/mitt.ts new file mode 100644 index 0000000..4b15bba --- /dev/null +++ b/src/utils/mitt.ts @@ -0,0 +1,101 @@ +/** + * copy to https://github.com/developit/mitt + * Expand clear method + */ + +export type EventType = string | symbol; + +// An event handler can take an optional event argument +// and should not return a value +export type Handler = (event?: T) => void; +export type WildcardHandler = (type: EventType, event?: any) => void; + +// An array of all currently registered event handlers for a type +export type EventHandlerList = Array; +export type WildCardEventHandlerList = Array; + +// A map of event types and their corresponding event handlers. +export type EventHandlerMap = Map; + +export interface Emitter { + all: EventHandlerMap; + + on(type: EventType, handler: Handler): void; + on(type: '*', handler: WildcardHandler): void; + + off(type: EventType, handler: Handler): void; + off(type: '*', handler: WildcardHandler): void; + + emit(type: EventType, event?: T): void; + emit(type: '*', event?: any): void; + clear(): void; +} + +/** + * Mitt: Tiny (~200b) functional event emitter / pubsub. + * @name mitt + * @returns {Mitt} + */ +export default function mitt(all?: EventHandlerMap): Emitter { + all = all || new Map(); + + return { + /** + * A Map of event names to registered handler functions. + */ + all, + + /** + * Register an event handler for the given type. + * @param {string|symbol} type Type of event to listen for, or `"*"` for all events + * @param {Function} handler Function to call in response to given event + * @memberOf mitt + */ + on(type: EventType, handler: Handler) { + const handlers = all?.get(type); + const added = handlers && handlers.push(handler); + if (!added) { + all?.set(type, [handler]); + } + }, + + /** + * Remove an event handler for the given type. + * @param {string|symbol} type Type of event to unregister `handler` from, or `"*"` + * @param {Function} handler Handler function to remove + * @memberOf mitt + */ + off(type: EventType, handler: Handler) { + const handlers = all?.get(type); + if (handlers) { + handlers.splice(handlers.indexOf(handler) >>> 0, 1); + } + }, + + /** + * Invoke all handlers for the given type. + * If present, `"*"` handlers are invoked after type-matched handlers. + * + * Note: Manually firing "*" handlers is not supported. + * + * @param {string|symbol} type The event type to invoke + * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler + * @memberOf mitt + */ + emit(type: EventType, evt: T) { + ((all?.get(type) || []) as EventHandlerList).slice().map((handler) => { + handler(evt); + }); + ((all?.get('*') || []) as WildCardEventHandlerList).slice().map((handler) => { + handler(type, evt); + }); + }, + + /** + * Clear all + */ + clear() { + this.all.clear(); + }, + }; +} diff --git a/src/utils/propTypes.ts b/src/utils/propTypes.ts new file mode 100644 index 0000000..972f501 --- /dev/null +++ b/src/utils/propTypes.ts @@ -0,0 +1,36 @@ +import { CSSProperties, VNodeChild } from 'vue'; +import { createTypes, VueTypeValidableDef, VueTypesInterface, toValidableType } from 'vue-types'; + +export type VueNode = VNodeChild | JSX.Element; + +type PropTypes = VueTypesInterface & { + readonly style: VueTypeValidableDef; + readonly VNodeChild: VueTypeValidableDef; + // readonly trueBool: VueTypeValidableDef; +}; + +const newPropTypes = createTypes({ + func: undefined, + bool: undefined, + string: undefined, + number: undefined, + object: undefined, + integer: undefined, +}) as PropTypes; + +// 从 vue-types v5.0 开始,extend()方法已经废弃,当前已改为官方推荐的ES6+方法 https://dwightjack.github.io/vue-types/advanced/extending-vue-types.html#the-extend-method +class propTypes extends newPropTypes { + // a native-like validator that supports the `.validable` method + static get style() { + return toValidableType('style', { + type: [String, Object], + }); + } + + static get VNodeChild() { + return toValidableType('VNodeChild', { + type: undefined, + }); + } +} +export { propTypes }; diff --git a/src/utils/props.ts b/src/utils/props.ts new file mode 100644 index 0000000..2dfdd63 --- /dev/null +++ b/src/utils/props.ts @@ -0,0 +1,151 @@ +// copy from element-plus + +import { warn } from 'vue'; +import { isObject } from '@vue/shared'; +import { fromPairs } from 'lodash-es'; +import type { ExtractPropTypes, PropType } from '@vue/runtime-core'; +import type { Mutable } from './types'; + +const wrapperKey = Symbol(); +export type PropWrapper = { [wrapperKey]: T }; + +export const propKey = Symbol(); + +type ResolveProp = ExtractPropTypes<{ + key: { type: T; required: true }; +}>['key']; +type ResolvePropType = ResolveProp extends { type: infer V } ? V : ResolveProp; +type ResolvePropTypeWithReadonly = Readonly extends Readonly> ? ResolvePropType : ResolvePropType; + +type IfUnknown = [unknown] extends [T] ? V : T; + +export type BuildPropOption, R, V, C> = { + type?: T; + values?: readonly V[]; + required?: R; + default?: R extends true ? never : D extends Record | Array ? () => D : (() => D) | D; + validator?: ((val: any) => val is C) | ((val: any) => boolean); +}; + +type _BuildPropType = (T extends PropWrapper ? T[typeof wrapperKey] : [V] extends [never] ? ResolvePropTypeWithReadonly : never) | V | C; +export type BuildPropType = _BuildPropType, IfUnknown, IfUnknown>; + +type _BuildPropDefault = [T] extends [ + // eslint-disable-next-line @typescript-eslint/ban-types + Record | Array | Function, +] + ? D + : D extends () => T + ? ReturnType + : D; + +export type BuildPropDefault = R extends true + ? { readonly default?: undefined } + : { + readonly default: Exclude extends never ? undefined : Exclude<_BuildPropDefault, undefined>; + }; +export type BuildPropReturn = { + readonly type: PropType>; + readonly required: IfUnknown; + readonly validator: ((val: unknown) => boolean) | undefined; + [propKey]: true; +} & BuildPropDefault, IfUnknown, IfUnknown>; + +/** + * @description Build prop. It can better optimize prop types + * @description 生成 prop,能更好地优化类型 + * @example + // limited options + // the type will be PropType<'light' | 'dark'> + buildProp({ + type: String, + values: ['light', 'dark'], + } as const) + * @example + // limited options and other types + // the type will be PropType<'small' | 'medium' | number> + buildProp({ + type: [String, Number], + values: ['small', 'medium'], + validator: (val: unknown): val is number => typeof val === 'number', + } as const) + @link see more: https://github.com/element-plus/element-plus/pull/3341 + */ +export function buildProp = never, R extends boolean = false, V = never, C = never>( + option: BuildPropOption, + key?: string, +): BuildPropReturn { + // filter native prop type and nested prop, e.g `null`, `undefined` (from `buildProps`) + if (!isObject(option) || !!option[propKey]) return option as any; + + const { values, required, default: defaultValue, type, validator } = option; + + const _validator = + values || validator + ? (val: unknown) => { + let valid = false; + let allowedValues: unknown[] = []; + + if (values) { + allowedValues = [...values, defaultValue]; + valid || (valid = allowedValues.includes(val)); + } + if (validator) valid || (valid = validator(val)); + + if (!valid && allowedValues.length > 0) { + const allowValuesText = [...new Set(allowedValues)].map(value => JSON.stringify(value)).join(', '); + warn(`Invalid prop: validation failed${key ? ` for prop "${key}"` : ''}. Expected one of [${allowValuesText}], got value ${JSON.stringify(val)}.`); + } + return valid; + } + : undefined; + + return { + type: typeof type === 'object' && Object.getOwnPropertySymbols(type).includes(wrapperKey) ? type[wrapperKey] : type, + required: !!required, + default: defaultValue, + validator: _validator, + [propKey]: true, + } as unknown as BuildPropReturn; +} + +type NativePropType = [((...args: any) => any) | { new (...args: any): any } | undefined | null]; + +export const buildProps = < + O extends { + [K in keyof O]: O[K] extends BuildPropReturn + ? O[K] + : [O[K]] extends NativePropType + ? O[K] + : O[K] extends BuildPropOption + ? D extends BuildPropType + ? BuildPropOption + : never + : never; + }, +>( + props: O, +) => + fromPairs(Object.entries(props).map(([key, option]) => [key, buildProp(option as any, key)])) as unknown as { + [K in keyof O]: O[K] extends { [propKey]: boolean } + ? O[K] + : [O[K]] extends NativePropType + ? O[K] + : O[K] extends BuildPropOption< + infer T, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + infer _D, + infer R, + infer V, + infer C + > + ? BuildPropReturn + : never; + }; + +export const definePropType = (val: any) => ({ [wrapperKey]: val } as PropWrapper); + +export const keyOf = (arr: T) => Object.keys(arr) as Array; +export const mutable = >(val: T) => val as Mutable; + +export const componentSize = ['large', 'medium', 'small', 'mini'] as const; diff --git a/src/utils/types.ts b/src/utils/types.ts new file mode 100644 index 0000000..4453ec4 --- /dev/null +++ b/src/utils/types.ts @@ -0,0 +1,42 @@ +// copy from element-plus + +import type { CSSProperties, Plugin } from 'vue'; + +type OptionalKeys> = { + [K in keyof T]: T extends Record ? never : K; +}[keyof T]; + +type RequiredKeys> = Exclude>; + +type MonoArgEmitter = (evt: K, arg?: T[K]) => void; + +type BiArgEmitter = (evt: K, arg: T[K]) => void; + +export type EventEmitter> = MonoArgEmitter> & + BiArgEmitter>; + +export type AnyFunction = (...args: any[]) => T; + +export type PartialReturnType unknown> = Partial>; + +export type SFCWithInstall = T & Plugin; + +export type Nullable = T | null; + +export type RefElement = Nullable; + +export type CustomizedHTMLElement = HTMLElement & T; + +export type Indexable = { + [key: string]: T; +}; + +export type Hash = Indexable; + +export type TimeoutHandle = ReturnType; + +export type ComponentSize = 'large' | 'medium' | 'small' | 'mini'; + +export type StyleValue = string | CSSProperties | Array; + +export type Mutable = { -readonly [P in keyof T]: T[P] }; diff --git a/src/utils/uuid.ts b/src/utils/uuid.ts new file mode 100644 index 0000000..cd0f9bb --- /dev/null +++ b/src/utils/uuid.ts @@ -0,0 +1,31 @@ +const hexList: string[] = []; +for (let i = 0; i <= 15; i++) { + hexList[i] = i.toString(16); +} + +export function buildUUID(): string { + let uuid = ''; + for (let i = 1; i <= 36; i++) { + if (i === 9 || i === 14 || i === 19 || i === 24) { + uuid += '-'; + } else if (i === 15) { + uuid += 4; + } else if (i === 20) { + uuid += hexList[(Math.random() * 4) | 8]; + } else { + uuid += hexList[(Math.random() * 16) | 0]; + } + } + return uuid.replace(/-/g, ''); +} +export function buildBitUUID(length = 6): string { + return buildUUID().substring(0, length); +} + +let unique = 0; +export function buildShortUUID(prefix = ''): string { + const time = Date.now(); + const random = Math.floor(Math.random() * 1000000000); + unique++; + return prefix + '_' + random + unique + String(time); +} diff --git a/src/utils/yunzhupaas.ts b/src/utils/yunzhupaas.ts new file mode 100644 index 0000000..5cbbb03 --- /dev/null +++ b/src/utils/yunzhupaas.ts @@ -0,0 +1,364 @@ +import { defHttp } from '@/utils/http/axios'; +import { getToken } from '@/utils/auth'; +import { isString, isNumber } from '@/utils/is'; +import { useMessage } from '@/hooks/web/useMessage'; +import { useUserStoreWithOut } from '@/store/modules/user'; +import type { UserInfo } from '#/store'; +import { router } from '@/router'; +import { cloneDeep } from 'lodash-es'; + +interface OnlineUserInfo extends UserInfo { + token?: string; +} + +export function toDecimal(num: number = 0) { + const sign = num == (num = Math.abs(num)); + num = Math.floor(num * 100 + 0.50000000001); + const cents = num % 100; + let value: string = Math.floor(num / 100).toString(); + const centsStr: string = cents < 10 ? '0' + cents : cents.toString(); + for (let i = 0; i < Math.floor((value.length - (1 + i)) / 3); i++) + value = value.substring(0, value.length - (4 * i + 3)) + '' + value.substring(value.length - (4 * i + 3)); + return (sign ? '' : '-') + value + '.' + centsStr; +} +export function toFileSize(size) { + if (size == null || size == '') return ''; + if (size < 1024) return toDecimal(size) + ' 字节'; + else if (size >= 1024 && size < 1048576) return toDecimal(size / 1024) + ' KB'; + else if (size >= 1048576 && size < 1073741824) return toDecimal(size / 1024 / 1024) + ' MB'; + else if (size >= 1073741824) return toDecimal(size / 1024 / 1024 / 1024) + ' GB'; +} +export function toDateText(dateTimeStamp) { + if (!dateTimeStamp) return ''; + let result = ''; + let minute = 1000 * 60; //把分,时,天,周,半个月,一个月用毫秒表示 + let hour = minute * 60; + let day = hour * 24; + let week = day * 7; + // let halfAMonth = day * 15; + let month = day * 30; + let now = new Date().getTime(); //获取当前时间毫秒 + let diffValue = now - dateTimeStamp; //时间差 + if (diffValue < 0) return '刚刚'; + let minC = diffValue / minute; //计算时间差的分,时,天,周,月 + let hourC = diffValue / hour; + let dayC = diffValue / day; + let weekC = diffValue / week; + let monthC = diffValue / month; + if (monthC >= 1 && monthC <= 3) { + result = ' ' + parseInt(monthC) + '月前'; + } else if (weekC >= 1 && weekC <= 3) { + result = ' ' + parseInt(weekC) + '周前'; + } else if (dayC >= 1 && dayC <= 6) { + result = ' ' + parseInt(dayC) + '天前'; + } else if (hourC >= 1 && hourC <= 23) { + result = ' ' + parseInt(hourC) + '小时前'; + } else if (minC >= 1 && minC <= 59) { + result = ' ' + parseInt(minC) + '分钟前'; + } else if (diffValue >= 0 && diffValue <= minute) { + result = '刚刚'; + } else { + let datetime = new Date(); + datetime.setTime(dateTimeStamp); + const nYear = datetime.getFullYear(); + const nMonth = datetime.getMonth() + 1 < 10 ? '0' + (datetime.getMonth() + 1) : datetime.getMonth() + 1; + const nDate = datetime.getDate() < 10 ? '0' + datetime.getDate() : datetime.getDate(); + // const nHour = datetime.getHours() < 10 ? '0' + datetime.getHours() : datetime.getHours(); + // const nMinute = datetime.getMinutes() < 10 ? '0' + datetime.getMinutes() : datetime.getMinutes(); + // const nSecond = datetime.getSeconds() < 10 ? '0' + datetime.getSeconds() : datetime.getSeconds(); + result = nYear + '-' + nMonth + '-' + nDate; + } + return result; +} +export function toDateValue(dateTimeStamp) { + if (!dateTimeStamp) return ''; + let result = ''; + let datetime = new Date(); + let nowYear = datetime.getFullYear(); + datetime.setTime(dateTimeStamp); + let nYear = datetime.getFullYear(); + let nMonth = datetime.getMonth() + 1 < 10 ? '0' + (datetime.getMonth() + 1) : datetime.getMonth() + 1; + let nDate = datetime.getDate() < 10 ? '0' + datetime.getDate() : datetime.getDate(); + let nHour = datetime.getHours() < 10 ? '0' + datetime.getHours() : datetime.getHours(); + let nMinute = datetime.getMinutes() < 10 ? '0' + datetime.getMinutes() : datetime.getMinutes(); + if (nYear == nowYear) { + result = nMonth + '-' + nDate + ' ' + nHour + ':' + nMinute; + } else { + result = nYear + '-' + nMonth + '-' + nDate + ' ' + nHour + ':' + nMinute; + } + return result; +} +// 数据类型转换 +export function getDataTypeText(val) { + let text = val; + switch (val) { + case 'varchar': + text = '字符串'; + break; + case 'int': + text = '整型'; + break; + case 'datetime': + text = '日期时间'; + break; + case 'decimal': + text = '浮点'; + break; + case 'bigint': + text = '长整型'; + break; + case 'text': + text = '文本'; + break; + default: + text = val; + break; + } + return text; +} +export function getScriptFunc(str) { + let func = null; + try { + func = eval(str); + if (Object.prototype.toString.call(func) !== '[object Function]') return false; + return func; + } catch (_) { + return false; + } +} +export function handleRequest(url: string, method: string, data) { + return defHttp[method ? method.toLowerCase() : 'get']({ url, data }); +} +export function interfaceDataHandler(data): any { + if (!data.dataProcessing) return data.data; + const dataHandler: any = getScriptFunc(data.dataProcessing); + if (!dataHandler) return data.data; + return dataHandler(data.data); +} +// 代码生成器数据匹配 +export function dynamicText(value, options) { + if (!value) return ''; + if (Array.isArray(value)) { + if (!options || !Array.isArray(options)) return value.join(); + let textList: any[] = []; + for (let i = 0; i < value.length; i++) { + let item = options.filter(o => o.id == value[i])[0]; + if (!item || !item.fullName) { + textList.push(value[i]); + } else { + textList.push(item.fullName); + } + } + return textList.join(); + } + if (!options || !Array.isArray(options)) return value; + let item = options.filter(o => o.id == value)[0]; + if (!item || !item.fullName) return value; + return item.fullName; +} + +export function dynamicTreeText(value, options) { + if (!value) return ''; + + function transfer(data) { + let textList: any[] = []; + + function loop(data, id) { + for (let i = 0; i < data.length; i++) { + if (data[i].id === id) { + textList.push(data[i].fullName); + break; + } + if (data[i].children) loop(data[i].children, id); + } + } + for (let i = 0; i < data.length; i++) { + loop(options, data[i]); + } + return textList.join(); + } + if (!options || !Array.isArray(options)) return value.join(); + if (Array.isArray(value)) { + let text = transfer(value); + return text; + } else { + if (!options || !Array.isArray(options)) return value; + let list = value.split(); + let text = transfer(list); + return text; + } +} +/** + * 金额转中文 + * 思路: + * 个 + * 十 百 千 万 + * 十万 百万 千万 亿 + * 十亿 百亿 千亿 + * + * 1 + * 2 3 4 5 + * 6 7 8 9 + * 10 + * + * 计算步骤 + * 1. 获取当前数值大小 + * 2. 排除个位后 数值按个,十,百,千有规律的重复 所以计算其和4的余数 pos % 4 + * 3. pos = 0 ~ 3 没有最大单位 + * pos = 4 ~ 7 最大单位是万 + * pos = 8 ~ 11 最大单位是亿 + * pos / 4 的整数就是最大单位 + * + */ +export function getAmountChinese(val) { + if (!val && val !== 0) return ''; + if (val == 0) return '零元整'; + const regExp = /[a-zA-Z]/; + if (regExp.test(val)) return '数字较大溢出'; + let amount = +val; + if (isNaN(amount)) return ''; + if (amount < 0) amount = Number(amount.toString().split('-')[1]); + const NUMBER = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; + const N_UNIT1 = ['', '拾', '佰', '仟']; + const N_UNIT2 = ['', '万', '亿', '兆']; + const D_UNIT = ['角', '分', '厘', '毫']; + let [integer, decimal] = amount.toString().split('.'); + if (integer && (integer.length > 15 || integer.indexOf('e') > -1)) return '数字较大溢出'; + let res = ''; + // 整数部分 + if (integer) { + let yunzhupaasCount = 0; + for (let i = 0, len = integer.length; i < len; i++) { + const num = integer.charAt(i); + const pos = len - i - 1; // 排除个位后 所处的索引位置 + const q = pos / 4; + const m = pos % 4; + if (num === '0') { + yunzhupaasCount++; + } else { + if (yunzhupaasCount > 0 && m !== 3) res += NUMBER[0]; + yunzhupaasCount = 0; + res += NUMBER[parseInt(num)] + N_UNIT1[m]; + } + if (m == 0 && yunzhupaasCount < 4) res += N_UNIT2[Math.floor(q)]; + } + } + if (Number(integer) != 0) res += '元'; + // 小数部分 + if (parseInt(decimal)) { + for (let i = 0; i < 4; i++) { + const num = decimal.charAt(i); + if (parseInt(num)) res += NUMBER[num] + D_UNIT[i]; + } + } else { + res += '整'; + } + if (val < 0) res = '负数' + res; + return res; +} +// 转千位分隔 +export function thousandsFormat(num) { + if (num === 0) return '0'; + if (!num) return ''; + const numArr = num.toString().split('.'); + numArr[0] = numArr[0].replace(/\B(?=(\d{3})+(?!\d))/g, ','); + return numArr.join('.'); +} +export function getDateTimeUnit(format) { + if (format == 'YYYY' || format == 'yyyy') return 'year'; + if (format == 'YYYY-MM' || format == 'yyyy-MM') return 'month'; + if (format == 'YYYY-MM-DD' || format == 'yyyy-MM-dd') return 'day'; + if (format == 'YYYY-MM-DD HH:mm' || format == 'yyyy-MM-dd HH:mm') return 'minute'; + if (format == 'YYYY-MM-DD HH:mm:ss' || format == 'yyyy-MM-dd HH:mm:ss') return 'second'; + return 'day'; +} +export function getTimeUnit(key) { + if (key == 1) return 'year'; + if (key == 2) return 'month'; + if (key == 3) return 'day'; + if (key == 4) return 'hour'; + if (key == 5) return 'minute'; + if (key == 6) return 'second'; + return 'day'; +} +export function getDateFormat(format) { + if (!format) return 'YYYY-MM-DD HH:mm:ss'; + const formatObj = { + yyyy: 'YYYY', + 'yyyy-MM': 'YYYY-MM', + 'yyyy-MM-dd': 'YYYY-MM-DD', + 'yyyy-MM-dd HH:mm': 'YYYY-MM-DD HH:mm', + 'yyyy-MM-dd HH:mm:ss': 'YYYY-MM-DD HH:mm:ss', + YYYY: 'YYYY', + 'YYYY-MM': 'YYYY-MM', + 'YYYY-MM-DD': 'YYYY-MM-DD', + 'YYYY-MM-DD HH:mm': 'YYYY-MM-DD HH:mm', + 'YYYY-MM-DD HH:mm:ss': 'YYYY-MM-DD HH:mm:ss', + }; + return formatObj[format] || 'YYYY-MM-DD HH:mm:ss'; +} +export function getYunzhupaasAppId() { + let appId = ''; + if (window.location.pathname?.startsWith('/YUNZHUPAAS_APP_')) { + const list = window.location.pathname.split('/'); + appId = list[1]; + } + return appId; +} +export const onlineUtils = { + // 获取用户信息 + getUserInfo() { + const userStore = useUserStoreWithOut(); + const userInfo: OnlineUserInfo = userStore.getUserInfo; + userInfo.token = getToken() as string; + return userInfo; + }, + // 获取设备信息 + getDeviceInfo() { + const deviceInfo = { vueVersion: '3', origin: 'pc' }; + return deviceInfo; + }, + // 请求 + request(url: string, method: string, data = {}, headers = {}) { + return defHttp[method ? method.toLowerCase() : 'get']({ url, data, headers }); + }, + // 路由跳转 + route(url: string) { + if (!url) return; + router.push(url); + }, + // 消息提示 + toast(message: string | number, type: string = 'info', duration: number = 3000) { + const { createMessage } = useMessage(); + if (!isString(message) && !isNumber(message)) return; + const newDuration = duration / 1000; + const config = { content: message, type, duration: newDuration }; + createMessage[type] && createMessage[type](config); + }, +}; +export function getParamList(templateJson, data?, rowKey = 'id') { + if (!templateJson?.length) return []; + for (let i = 0; i < templateJson.length; i++) { + const e = templateJson[i]; + if (e.sourceType == 1 && data) { + e.defaultValue = data[e.relationField] || data[e.relationField] == 0 || data[e.relationField] == false ? data[e.relationField] : ''; + } + if (e.sourceType == 4 && e.relationField == '@formId') e.defaultValue = data[rowKey] || ''; + } + return templateJson; +} +export function getLaunchFlowParamList(transferList, data?, rowKey = 'id') { + transferList = cloneDeep(transferList); + if (!transferList?.length) return []; + for (let i = 0; i < transferList.length; i++) { + const e = transferList[i]; + if (e.sourceType == 1) { + if (e.sourceValue == '@formId') { + e.sourceValue = data[rowKey] || ''; + } else { + e.sourceValue = data[e.sourceValue] || data[e.sourceValue] == 0 || data[e.sourceValue] == false ? data[e.sourceValue] : ''; + } + } + } + return transferList; +} diff --git a/src/views/basic/error-log/DetailModal.vue b/src/views/basic/error-log/DetailModal.vue new file mode 100644 index 0000000..d326078 --- /dev/null +++ b/src/views/basic/error-log/DetailModal.vue @@ -0,0 +1,27 @@ + + diff --git a/src/views/basic/error-log/data.tsx b/src/views/basic/error-log/data.tsx new file mode 100644 index 0000000..40ec922 --- /dev/null +++ b/src/views/basic/error-log/data.tsx @@ -0,0 +1,67 @@ +import { Tag } from 'ant-design-vue'; +import { BasicColumn } from '@/components/Table/index'; +import { ErrorTypeEnum } from '@/enums/exceptionEnum'; +import { useI18n } from '@/hooks/web/useI18n'; + +const { t } = useI18n(); + +export function getColumns(): BasicColumn[] { + return [ + { + dataIndex: 'type', + title: t('sys.errorLog.tableColumnType'), + width: 80, + customRender: ({ text }) => { + const color = + text === ErrorTypeEnum.VUE + ? 'green' + : text === ErrorTypeEnum.RESOURCE + ? 'cyan' + : text === ErrorTypeEnum.PROMISE + ? 'blue' + : ErrorTypeEnum.AJAX + ? 'red' + : 'purple'; + return {() => text}; + }, + }, + { + dataIndex: 'url', + title: 'URL', + width: 200, + }, + { + dataIndex: 'time', + title: t('sys.errorLog.tableColumnDate'), + width: 160, + }, + { + dataIndex: 'file', + title: t('sys.errorLog.tableColumnFile'), + width: 200, + }, + { + dataIndex: 'name', + title: 'Name', + width: 200, + }, + { + dataIndex: 'message', + title: t('sys.errorLog.tableColumnMsg'), + width: 300, + }, + { + dataIndex: 'stack', + title: t('sys.errorLog.tableColumnStackMsg'), + }, + ]; +} + +export function getDescSchema(): any { + return getColumns().map(column => { + return { + field: column.dataIndex!, + label: column.title, + }; + }); +} diff --git a/src/views/basic/error-log/index.vue b/src/views/basic/error-log/index.vue new file mode 100644 index 0000000..82d5ee6 --- /dev/null +++ b/src/views/basic/error-log/index.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/views/basic/exception/Exception.vue b/src/views/basic/exception/Exception.vue new file mode 100644 index 0000000..c4fe1fd --- /dev/null +++ b/src/views/basic/exception/Exception.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/views/basic/exception/index.ts b/src/views/basic/exception/index.ts new file mode 100644 index 0000000..5002c4a --- /dev/null +++ b/src/views/basic/exception/index.ts @@ -0,0 +1 @@ +export { default as Exception } from './Exception.vue'; diff --git a/src/views/basic/home/Default.vue b/src/views/basic/home/Default.vue new file mode 100644 index 0000000..717d86f --- /dev/null +++ b/src/views/basic/home/Default.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/views/basic/home/Setting.vue b/src/views/basic/home/Setting.vue new file mode 100644 index 0000000..5acf787 --- /dev/null +++ b/src/views/basic/home/Setting.vue @@ -0,0 +1,95 @@ + + diff --git a/src/views/basic/home/components/GrowCard.vue b/src/views/basic/home/components/GrowCard.vue new file mode 100644 index 0000000..2a3f8ec --- /dev/null +++ b/src/views/basic/home/components/GrowCard.vue @@ -0,0 +1,86 @@ + + + diff --git a/src/views/basic/home/components/SalesProductPie.vue b/src/views/basic/home/components/SalesProductPie.vue new file mode 100644 index 0000000..1b7d107 --- /dev/null +++ b/src/views/basic/home/components/SalesProductPie.vue @@ -0,0 +1,64 @@ + + diff --git a/src/views/basic/home/components/SiteAnalysis.vue b/src/views/basic/home/components/SiteAnalysis.vue new file mode 100644 index 0000000..e6529fa --- /dev/null +++ b/src/views/basic/home/components/SiteAnalysis.vue @@ -0,0 +1,33 @@ + + diff --git a/src/views/basic/home/components/VisitAnalysis.vue b/src/views/basic/home/components/VisitAnalysis.vue new file mode 100644 index 0000000..4d3401a --- /dev/null +++ b/src/views/basic/home/components/VisitAnalysis.vue @@ -0,0 +1,93 @@ + + + diff --git a/src/views/basic/home/components/VisitAnalysisBar.vue b/src/views/basic/home/components/VisitAnalysisBar.vue new file mode 100644 index 0000000..f139a91 --- /dev/null +++ b/src/views/basic/home/components/VisitAnalysisBar.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/views/basic/home/components/VisitRadar.vue b/src/views/basic/home/components/VisitRadar.vue new file mode 100644 index 0000000..f948192 --- /dev/null +++ b/src/views/basic/home/components/VisitRadar.vue @@ -0,0 +1,94 @@ + + diff --git a/src/views/basic/home/components/VisitSource.vue b/src/views/basic/home/components/VisitSource.vue new file mode 100644 index 0000000..026a6de --- /dev/null +++ b/src/views/basic/home/components/VisitSource.vue @@ -0,0 +1,81 @@ + + diff --git a/src/views/basic/home/components/props.ts b/src/views/basic/home/components/props.ts new file mode 100644 index 0000000..8643650 --- /dev/null +++ b/src/views/basic/home/components/props.ts @@ -0,0 +1,16 @@ +import { PropType } from 'vue'; + +export interface BasicProps { + width: string; + height: string; +} +export const basicProps = { + width: { + type: String as PropType, + default: '100%', + }, + height: { + type: String as PropType, + default: '280px', + }, +}; diff --git a/src/views/basic/home/data.ts b/src/views/basic/home/data.ts new file mode 100644 index 0000000..0285efd --- /dev/null +++ b/src/views/basic/home/data.ts @@ -0,0 +1,67 @@ +import growIcon1 from '@/assets/images/home/grow-icon1.png'; +import growIcon2 from '@/assets/images/home/grow-icon2.png'; +import growIcon3 from '@/assets/images/home/grow-icon3.png'; +import growIcon4 from '@/assets/images/home/grow-icon4.png'; +import growImg1 from '@/assets/images/home/grow-img1.png'; +import growImg2 from '@/assets/images/home/grow-img2.png'; +import growImg3 from '@/assets/images/home/grow-img3.png'; +import growImg4 from '@/assets/images/home/grow-img4.png'; + +export interface GrowCardItem { + icon: string; + mainImg: string; + title: string; + value: number; + total: number; + color: string; + bg: string; + tagBg: string; + action: string; +} + +export const growCardList: GrowCardItem[] = [ + { + title: '访问数', + icon: growIcon1, + mainImg: growImg1, + value: 2000, + total: 120000, + color: '#21AD82', + tagBg: 'rgba(33,173,130,0.1)', + bg: 'linear-gradient(58deg, #F7FFFE 0%, #E7FFFE 67%, #E2FCF8 100%)', + action: '月', + }, + { + title: '成交额', + icon: growIcon2, + mainImg: growImg2, + value: 20000, + total: 500000, + color: '#CD7326', + tagBg: 'rgba(205,115,38,0.1)', + bg: 'linear-gradient(58deg, #FFFCF4 0%, #FFF9F4 67%, #FFE2D0 100%)', + action: '月', + }, + { + title: '下载数', + icon: growIcon3, + mainImg: growImg3, + value: 8000, + total: 120000, + color: '#294DE5', + tagBg: 'rgba(41,70,229,0.1)', + bg: 'linear-gradient(58deg, #F7FAFF 0%, #EFF5FF 67%, #D0E0FD 100%)', + action: '周', + }, + { + title: '成交数', + icon: growIcon4, + mainImg: growImg4, + value: 5000, + total: 50000, + color: '#2F92E6', + tagBg: 'rgba(41,128,229,0.1)', + bg: 'linear-gradient(58deg, #F5F8FF 0%, #EFF6FF 67%, #D0E6FD 100%)', + action: '年', + }, +]; diff --git a/src/views/basic/home/hooks/usePortal.ts b/src/views/basic/home/hooks/usePortal.ts new file mode 100644 index 0000000..c29dc78 --- /dev/null +++ b/src/views/basic/home/hooks/usePortal.ts @@ -0,0 +1,155 @@ +import { reactive, defineAsyncComponent, markRaw } from 'vue'; +import { getAuthPortal, UpdateCustomPortal } from '@/api/onlineDev/portal'; +import { getDataInterfaceRes } from '@/api/systemData/dataInterface'; +import { importViewsFile } from '@/utils'; +import { getParamList } from '@/utils/yunzhupaas'; + +interface State { + portalId: string; + layout: any[]; + type: number; + linkType: number; + currentView: string; + url: string; + ajaxing: boolean; + loading: boolean; + noData: boolean; + refreshData: any; + timerList: any[]; + formData: any; + enabledLock: number; + systemId: string; +} + +const state = reactive({ + portalId: '', + layout: [], + type: 0, + linkType: 0, + currentView: '', + url: '', + ajaxing: true, + loading: false, + noData: false, + refreshData: {}, + timerList: [], + formData: {}, + enabledLock: 1, + systemId: '', +}); + +export function usePortal() { + function initData() { + state.loading = true; + state.layout = []; + state.noData = false; + if (!state.portalId) { + state.loading = false; + state.ajaxing = false; + state.noData = true; + return; + } + getAuthPortal(state.portalId, { platform: 'Web', systemId: state.systemId }) + .then(res => { + if (res.data) { + state.type = res.data.type || 0; + state.linkType = res.data.linkType || 0; + state.url = res.data.customUrl || ''; + state.enabledLock = res.data.enabledLock || 0; + if (res.data.type === 1) { + if (res.data.customUrl && res.data.customUrl !== 1) { + const formUrl = `${res.data.customUrl}`; + state.currentView = markRaw(defineAsyncComponent(() => importViewsFile(formUrl))); + } + } else { + if (res.data.formData) { + state.formData = JSON.parse(res.data.formData); + state.layout = filterList(JSON.parse(JSON.stringify(state.formData.layout)) || []); + state.refreshData = state.formData.refresh || {}; + } + } + } + state.ajaxing = false; + state.loading = false; + setTimeout(() => { + initAutoRefresh(); + }, 500); + }) + .catch(() => { + state.loading = false; + state.ajaxing = false; + state.noData = true; + }); + } + function filterList(layout) { + const loop = list => { + for (let i = 0; i < list.length; i++) { + const item = list[i]; + if (!(Array.isArray(item.visibility) && item.visibility.includes('pc')) && item.yunzhupaasKey) { + list.splice(i, 1); + i--; + } + if (item.children && item.children.length) loop(item.children); + } + }; + loop(layout); + return layout; + } + function initAutoRefresh() { + if (!state.layout.length) return; + state.timerList = []; + const loop = (list, type = 1) => { + list.forEach(ele => { + if ((ele.refresh && ele.refresh.autoRefresh && ele.refresh.autoRefreshTime) || type == 2) { + var timer = setInterval( + () => { + ele.renderKey = +new Date(); + autoRefresh(ele); + }, + type == 2 ? state.refreshData.autoRefreshTime * 1000 * 60 : ele.refresh.autoRefreshTime * 1000 * 60, + ); + state.timerList.push(timer); + } + if (ele.children && ele.children.length) loop(ele.children, type); + }); + }; + if (state.refreshData.autoRefresh) { + loop(state.layout, 2); + } else { + loop(state.layout); + } + } + function autoRefresh(item) { + const chartList = ['barChart', 'lineChart', 'pieChart', 'radarChart', 'mapChart']; + if (item.dataType === 'dynamic' && chartList.includes(item.yunzhupaasKey)) { + item.option.defaultValue = []; + if (!item.propsApi) return; + const query = { paramList: getParamList(item.templateJson) }; + getDataInterfaceRes(item.propsApi, query).then(res => { + const realData = res.data; + item.option.defaultValue = Array.isArray(realData) ? realData : []; + }); + } + } + function clearAutoRefresh() { + if (state.timerList.length) { + state.timerList.forEach(ele => { + if (ele) clearInterval(ele); + }); + } + } + function layoutUpdatedEvent() { + state.formData.layout = state.layout; + const query = { formData: JSON.stringify(state.formData), systemId: state.systemId }; + UpdateCustomPortal(state.portalId, query); + } + return { + state: state, + initData, + filterList, + initAutoRefresh, + autoRefresh, + clearAutoRefresh, + layoutUpdatedEvent, + }; +} diff --git a/src/views/basic/home/index.vue b/src/views/basic/home/index.vue new file mode 100644 index 0000000..aa56d8c --- /dev/null +++ b/src/views/basic/home/index.vue @@ -0,0 +1,102 @@ + + + + diff --git a/src/views/basic/iframe/FrameBlank.vue b/src/views/basic/iframe/FrameBlank.vue new file mode 100644 index 0000000..a8a61f5 --- /dev/null +++ b/src/views/basic/iframe/FrameBlank.vue @@ -0,0 +1,9 @@ + + diff --git a/src/views/basic/iframe/index.vue b/src/views/basic/iframe/index.vue new file mode 100644 index 0000000..ccf9352 --- /dev/null +++ b/src/views/basic/iframe/index.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/views/basic/lock/LockPage.vue b/src/views/basic/lock/LockPage.vue new file mode 100644 index 0000000..497b0b4 --- /dev/null +++ b/src/views/basic/lock/LockPage.vue @@ -0,0 +1,213 @@ + + + diff --git a/src/views/basic/lock/index.vue b/src/views/basic/lock/index.vue new file mode 100644 index 0000000..4af9f81 --- /dev/null +++ b/src/views/basic/lock/index.vue @@ -0,0 +1,13 @@ + + diff --git a/src/views/basic/lock/useNow.ts b/src/views/basic/lock/useNow.ts new file mode 100644 index 0000000..dafc9ab --- /dev/null +++ b/src/views/basic/lock/useNow.ts @@ -0,0 +1,60 @@ +import { dateUtil } from '@/utils/dateUtil'; +import { reactive, toRefs } from 'vue'; +import { tryOnMounted, tryOnUnmounted } from '@vueuse/core'; + +export function useNow(immediate = true) { + let timer: IntervalHandle; + + const state = reactive({ + year: 0, + month: 0, + week: '', + day: 0, + hour: '', + minute: '', + second: 0, + meridiem: '', + }); + + const update = () => { + const now = dateUtil(); + + const h = now.format('HH'); + const m = now.format('mm'); + const s = now.get('s'); + + state.year = now.get('y'); + state.month = now.get('M') + 1; + state.week = '星期' + ['日', '一', '二', '三', '四', '五', '六'][now.day()]; + state.day = now.get('date'); + state.hour = h; + state.minute = m; + state.second = s; + + state.meridiem = now.format('A'); + }; + + function start() { + update(); + clearInterval(timer); + timer = setInterval(() => update(), 1000); + } + + function stop() { + clearInterval(timer); + } + + tryOnMounted(() => { + immediate && start(); + }); + + tryOnUnmounted(() => { + stop(); + }); + + return { + ...toRefs(state), + start, + stop, + }; +} diff --git a/src/views/basic/login/Login.vue b/src/views/basic/login/Login.vue new file mode 100644 index 0000000..803d6a0 --- /dev/null +++ b/src/views/basic/login/Login.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/views/basic/login/LoginForm.vue b/src/views/basic/login/LoginForm.vue new file mode 100644 index 0000000..ba17bd5 --- /dev/null +++ b/src/views/basic/login/LoginForm.vue @@ -0,0 +1,358 @@ + + diff --git a/src/views/basic/login/LoginFormTitle.vue b/src/views/basic/login/LoginFormTitle.vue new file mode 100644 index 0000000..0063aeb --- /dev/null +++ b/src/views/basic/login/LoginFormTitle.vue @@ -0,0 +1,17 @@ + + diff --git a/src/views/basic/login/QrCodeForm.vue b/src/views/basic/login/QrCodeForm.vue new file mode 100644 index 0000000..875ce64 --- /dev/null +++ b/src/views/basic/login/QrCodeForm.vue @@ -0,0 +1,113 @@ + + diff --git a/src/views/basic/login/SessionTimeoutLogin.vue b/src/views/basic/login/SessionTimeoutLogin.vue new file mode 100644 index 0000000..9571455 --- /dev/null +++ b/src/views/basic/login/SessionTimeoutLogin.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/views/basic/login/index.less b/src/views/basic/login/index.less new file mode 100644 index 0000000..bdc5fa5 --- /dev/null +++ b/src/views/basic/login/index.less @@ -0,0 +1,466 @@ +@prefix-cls: ~'@{namespace}-login-container'; +@countdown-prefix-cls: ~'@{namespace}-countdown-input'; +@dark-bg: #293146; + +html[data-theme='dark'] { + .@{prefix-cls} { + background-image: url(@/assets/images/login-bg-dark.png); + .login-content { + background-color: @dark-bg; + box-shadow: 0px 40px 40px rgba(11, 15, 19, 0.2); + .login-left::after { + background-color: #343434; + } + .login-sub-title, + .rule-tip { + color: #606266; + } + .login-cap { + color: #ffffff; + } + } + + .ant-input, + .ant-input-affix-wrapper, + .ant-input-password { + background-color: #232a3b; + } + + .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) { + border: 1px solid #4a5569; + } + + &-form { + background-color: @dark-bg !important; + } + .code-box { + .code { + background: #3333 !important; + } + } + input.fix-auto-fill, + .fix-auto-fill input { + -webkit-box-shadow: 0 0 0 1000px #232a3b inset !important; + } + input:-webkit-autofill { + -webkit-box-shadow: 0 0 0 1000px #232a3b inset !important; + -webkit-text-fill-color: #c9d1d9 !important; + } + .ant-input-affix-wrapper > input.ant-input:focus { + box-shadow: 0 0 0 1000px #232a3b inset !important; + -webkit-text-fill-color: #c9d1d9 !important; + caret-color: #c9d1d9; + border-color: unset !important; + } + input:-internal-autofill-previewed, + input:-internal-autofill-selected { + -webkit-text-fill-color: #232a3b; + transition: background-color 5000s ease-out 0.2s; + } + .qrcode-form .qrcode-mask { + .qrcode-mask-main { + background: rgba(41, 49, 70, 0.96); + } + } + } +} + +.@{prefix-cls} { + width: 100%; + height: 100%; + overflow: hidden; + position: relative; + display: flex; + justify-content: center; + align-items: center; + background-image: url(@/assets/images/login-bg.png); + background-position: center center; + background-repeat: no-repeat; + background-attachment: scroll; + background-size: cover; + background-origin: border-box; + + .ant-input-affix-wrapper > input.ant-input:focus { + box-shadow: 0 0 0 1000px #fff inset !important; + } + + .login-version { + position: fixed; + right: 0px; + top: 0px; + width: 82px; + height: 82px; + background: url('@/assets/images/login_version.png') no-repeat center; + background-size: 100%; + + .login-version-text { + width: 82px; + height: 82px; + line-height: 50px; + text-align: center; + color: #fff; + font-size: 16px; + transform: rotate(45deg); + white-space: nowrap; + overflow: hidden; + } + } + + .@{prefix-cls}-form { + width: 500px; + padding: 73px 50px 20px; + .ant-image, + .login-logo { + width: 100%; + height: 36px; + margin: 0 auto 20px; + } + } + .login-left { + height: 100%; + position: relative; + width: 500px; + padding-top: 80px; + position: relative; + &::after { + content: ''; + display: block; + width: 1px; + height: 420px; + background-color: @border-color-base1; + position: absolute; + right: 0; + top: 90px; + } + .ant-image, + .login-logo { + display: block; + width: 400px; + height: 36px; + margin: 0 auto 50px; + } + + .login-banner { + display: block; + margin: 0 auto; + width: 400px; + height: auto; + } + } + .copyright { + color: #656e93; + font-size: 14px; + position: fixed; + bottom: 50px; + text-align: center; + } + .login-header { + position: absolute; + top: 80px; + right: 60px; + left: 60px; + display: flex; + align-items: center; + justify-content: space-between; + .login-company-logo { + display: block; + .login-company-logo-img { + height: 36px; + width: auto; + } + } + } + + .login-content { + height: 580px; + border-radius: 8px; + box-shadow: 0px 40px 40px rgba(141, 150, 160, 0.1); + display: flex; + justify-content: center; + align-items: center; + position: relative; + background: @component-background; + z-index: 1; + overflow: hidden; + + .login-cap { + font-size: 24px; + line-height: 33px; + margin-bottom: 8px; + } + .login-sub-title { + margin-bottom: 20px; + line-height: 17px; + color: #8c8c8c; + height: 17px; + user-select: none; + font-size: 14px; + span { + color: @primary-color; + cursor: pointer; + } + } + + .login-tab { + margin-bottom: 60px; + display: flex; + justify-content: center; + align-items: center; + .login-tab-item { + cursor: pointer; + font-size: 16px; + line-height: 46px; + color: @text-color-secondary; + padding: 0 30px; + position: relative; + &.active { + font-size: 20px; + font-weight: 600; + color: @text-color-base; + &::after { + content: ''; + display: block; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 80px; + height: 3px; + background-color: @primary-color; + } + } + } + } + + .sso-login-btn { + width: 100%; + font-size: 16px; + margin-top: 100px; + } + .code-box { + z-index: 100; + width: 400px; + position: absolute; + bottom: 50px; + right: 50px; + .code-floor { + display: flex; + align-items: center; + justify-content: space-between; + + &.code-floor1 { + margin-bottom: 12px; + } + .code { + width: 120px; + height: 32px; + background: @component-background; + border: 1px solid #93a9c6; + opacity: 1; + border-radius: 2px; + cursor: pointer; + display: flex; + align-items: center; + padding: 0 10px; + &:hover { + background: @primary-color; + border: 1px solid @primary-color; + .code-icon { + color: #fff; + } + .code-txt { + color: #fff; + } + } + .code-icon { + flex-shrink: 0; + font-size: 20px; + color: #93a9c6; + width: 20px; + } + .code-txt { + text-align: center; + font-size: 14px; + color: #93a9c6; + flex: 1; + } + } + } + } + } + .socials-box { + position: absolute; + padding: 0 50px; + bottom: 50px; + right: 0; + left: 0; + } + + .socials-list { + display: flex; + align-items: center; + justify-content: center; + .socials-item { + width: 32px; + height: 32px; + line-height: 32px; + text-align: center; + cursor: pointer; + border-radius: 50%; + margin: 0 12px; + i { + font-size: 22px; + color: #b9b9b9; + } + &:hover { + background-color: @primary-color; + i { + color: #fff; + } + } + } + } + .sms-input { + width: 260px; + overflow: hidden; + .ant-input { + width: 260px; + min-width: 0 !important; + } + } + .sms-right { + width: 120px; + height: 40px; + cursor: pointer; + .codeImg { + width: 100%; + height: 40px; + } + .smsBtn { + width: 100%; + } + } + .rule-tip { + color: #8c8c8c; + font-size: 12px; + line-height: 12px; + text-align: left; + + .ant-form-item-control-input { + line-height: 12px !important; + min-height: 12px !important; + } + } + .qrcode-form { + position: relative; + padding-top: 20px; + .qrcode-title { + font-size: 14px; + text-align: center; + margin-bottom: 27px; + } + .qrcode-content { + position: relative; + width: 260px; + height: 260px; + padding: 10px; + margin: 0 auto; + background: url(../../../assets/images/qrcode-bg.png) 100% 100% no-repeat; + background-size: cover; + .ant-qrcode { + border-radius: 0; + } + } + .qrcode-mask { + position: absolute; + left: 10px; + right: 10px; + top: 10px; + display: flex; + justify-content: center; + align-items: center; + .qrcode-mask-main { + position: relative; + width: 240px; + height: 240px; + background: rgba(255, 255, 255, 0.96); + text-align: center; + padding-top: 70px; + .qrcode-icon { + background-color: @primary-color; + width: 60px; + height: 60px; + border-radius: 50%; + overflow: hidden; + margin: 0 auto 20px; + display: flex; + justify-content: center; + align-items: center; + font-size: 40px; + color: #fff; + &.expired-icon { + background-color: @error-color; + } + } + .qrcode-tip { + font-size: 20px; + } + } + } + .qrcode-bottom { + text-align: center; + margin-top: 10px; + } + .link-text { + font-size: 16px !important; + } + } +} +.login-code-popover { + .ant-popover-inner-content { + padding: 12px; + } + .code-content { + padding: 0; + .qrcode { + display: block; + width: 122px; + height: 122px; + } + .code-tip { + text-align: center; + font-size: 14px; + font-weight: 400; + line-height: 25px; + color: @text-color-label; + } + } +} +.yunzhupaas-login-code-modal { + .ant-modal-header { + border-bottom: none !important; + height: 10px !important; + } + .wechat-code-container { + text-align: center; + padding-bottom: 30px; + .cap { + line-height: 38px; + font-size: 26px; + color: #000721; + } + .wechat-code-img { + display: inline-block; + width: 182px; + height: 182px; + margin: 40px 0 44px; + } + .tip { + line-height: 30px; + font-size: 16px; + color: #666; + margin-bottom: 6px; + font-weight: 400; + } + } +} diff --git a/src/views/basic/login/sso-redirect.vue b/src/views/basic/login/sso-redirect.vue new file mode 100644 index 0000000..b79e091 --- /dev/null +++ b/src/views/basic/login/sso-redirect.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/views/basic/login/useLogin.ts b/src/views/basic/login/useLogin.ts new file mode 100644 index 0000000..4ea772b --- /dev/null +++ b/src/views/basic/login/useLogin.ts @@ -0,0 +1,124 @@ +import type { FormInstance } from 'ant-design-vue'; +import type { Rule, RuleObject, NamePath } from 'ant-design-vue/lib/form/interface'; +import { ref, computed, unref, Ref } from 'vue'; +import { useI18n } from '@/hooks/web/useI18n'; + +export enum LoginStateEnum { + LOGIN, + REGISTER, + RESET_PASSWORD, + MOBILE, + QR_CODE, +} + +const currentState = ref(LoginStateEnum.LOGIN); + +export function useLoginState() { + function setLoginState(state: LoginStateEnum) { + currentState.value = state; + } + + const getLoginState = computed(() => currentState.value); + + function handleBackLogin() { + setLoginState(LoginStateEnum.LOGIN); + } + + return { setLoginState, getLoginState, handleBackLogin }; +} + +export function useFormValid(formRef: Ref) { + const validate = computed(() => { + const form = unref(formRef); + return form?.validate ?? ((_nameList?: NamePath) => Promise.resolve()); + }); + + async function validForm() { + const form = unref(formRef); + if (!form) return; + const data = await form.validate(); + return data as T; + } + + return { validate, validForm }; +} + +export function useFormRules(formData?: Recordable) { + const { t } = useI18n(); + + const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder'))); + const getPasswordFormRule = computed(() => createRule(t('sys.login.passwordPlaceholder'))); + const getCodeFormRule = computed(() => createRule(t('sys.login.codeTip'))); + const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder'))); + const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder'))); + + const validatePolicy = async (_: RuleObject, value: boolean) => { + return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve(); + }; + + const validateConfirmPassword = (password: string) => { + return async (_: RuleObject, value: string) => { + if (!value) { + return Promise.reject(t('sys.login.passwordPlaceholder')); + } + if (value !== password) { + return Promise.reject(t('sys.login.diffPwd')); + } + return Promise.resolve(); + }; + }; + + const getFormRules = computed((): { [k: string]: Rule | Rule[] } => { + const accountFormRule = unref(getAccountFormRule); + const passwordFormRule = unref(getPasswordFormRule); + const codeFormRule = unref(getCodeFormRule); + const smsFormRule = unref(getSmsFormRule); + const mobileFormRule = unref(getMobileFormRule); + + const mobileRule = { + sms: smsFormRule, + mobile: mobileFormRule, + }; + switch (unref(currentState)) { + // register form rules + case LoginStateEnum.REGISTER: + return { + account: accountFormRule, + password: passwordFormRule, + confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }], + policy: [{ validator: validatePolicy, trigger: 'change' }], + ...mobileRule, + }; + + // reset password form rules + case LoginStateEnum.RESET_PASSWORD: + return { + account: accountFormRule, + ...mobileRule, + }; + + // mobile form rules + case LoginStateEnum.MOBILE: + return mobileRule; + + // login form rules + default: + return { + account: accountFormRule, + password: passwordFormRule, + code: codeFormRule, + }; + } + }); + return { getFormRules }; +} + +function createRule(message: string): RuleObject[] { + return [ + { + required: true, + message, + trigger: 'change', + }, + ]; +} diff --git a/src/views/basic/messageRecord/index.vue b/src/views/basic/messageRecord/index.vue new file mode 100644 index 0000000..0e67e57 --- /dev/null +++ b/src/views/basic/messageRecord/index.vue @@ -0,0 +1,175 @@ + + diff --git a/src/views/basic/profile/components/Authorize.vue b/src/views/basic/profile/components/Authorize.vue new file mode 100644 index 0000000..64c4c21 --- /dev/null +++ b/src/views/basic/profile/components/Authorize.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/views/basic/profile/components/Entrust/Form.vue b/src/views/basic/profile/components/Entrust/Form.vue new file mode 100644 index 0000000..8cfa56f --- /dev/null +++ b/src/views/basic/profile/components/Entrust/Form.vue @@ -0,0 +1,189 @@ + + diff --git a/src/views/basic/profile/components/Entrust/index.vue b/src/views/basic/profile/components/Entrust/index.vue new file mode 100644 index 0000000..cb00414 --- /dev/null +++ b/src/views/basic/profile/components/Entrust/index.vue @@ -0,0 +1,285 @@ + + diff --git a/src/views/basic/profile/components/JustAuth.vue b/src/views/basic/profile/components/JustAuth.vue new file mode 100644 index 0000000..9875267 --- /dev/null +++ b/src/views/basic/profile/components/JustAuth.vue @@ -0,0 +1,108 @@ + + diff --git a/src/views/basic/profile/components/Password.vue b/src/views/basic/profile/components/Password.vue new file mode 100644 index 0000000..a745b92 --- /dev/null +++ b/src/views/basic/profile/components/Password.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/views/basic/profile/components/SysLog.vue b/src/views/basic/profile/components/SysLog.vue new file mode 100644 index 0000000..ae7fe3c --- /dev/null +++ b/src/views/basic/profile/components/SysLog.vue @@ -0,0 +1,175 @@ + + diff --git a/src/views/basic/profile/components/TenantInfo.vue b/src/views/basic/profile/components/TenantInfo.vue new file mode 100644 index 0000000..358cf11 --- /dev/null +++ b/src/views/basic/profile/components/TenantInfo.vue @@ -0,0 +1,92 @@ + + diff --git a/src/views/basic/profile/components/UserInfo.vue b/src/views/basic/profile/components/UserInfo.vue new file mode 100644 index 0000000..fbc3996 --- /dev/null +++ b/src/views/basic/profile/components/UserInfo.vue @@ -0,0 +1,481 @@ + + + + + diff --git a/src/views/basic/profile/index.vue b/src/views/basic/profile/index.vue new file mode 100644 index 0000000..752b1ad --- /dev/null +++ b/src/views/basic/profile/index.vue @@ -0,0 +1,453 @@ + + + + + diff --git a/src/views/basic/redirect/index.vue b/src/views/basic/redirect/index.vue new file mode 100644 index 0000000..9e6647b --- /dev/null +++ b/src/views/basic/redirect/index.vue @@ -0,0 +1,30 @@ + + diff --git a/src/views/common/dynamicDataReport/index.vue b/src/views/common/dynamicDataReport/index.vue new file mode 100644 index 0000000..42e6b62 --- /dev/null +++ b/src/views/common/dynamicDataReport/index.vue @@ -0,0 +1,61 @@ + + diff --git a/src/views/common/formShortLink/form/index.vue b/src/views/common/formShortLink/form/index.vue new file mode 100644 index 0000000..e1c2f0f --- /dev/null +++ b/src/views/common/formShortLink/form/index.vue @@ -0,0 +1,217 @@ + + + diff --git a/src/views/common/formShortLink/index.vue b/src/views/common/formShortLink/index.vue new file mode 100644 index 0000000..0daf3f2 --- /dev/null +++ b/src/views/common/formShortLink/index.vue @@ -0,0 +1,66 @@ + + diff --git a/src/views/common/formShortLink/list/detail/index.vue b/src/views/common/formShortLink/list/detail/index.vue new file mode 100644 index 0000000..b13fd4b --- /dev/null +++ b/src/views/common/formShortLink/list/detail/index.vue @@ -0,0 +1,167 @@ + + diff --git a/src/views/common/formShortLink/list/index.vue b/src/views/common/formShortLink/list/index.vue new file mode 100644 index 0000000..3fab783 --- /dev/null +++ b/src/views/common/formShortLink/list/index.vue @@ -0,0 +1,675 @@ + + + diff --git a/src/views/extend/barCode/index.vue b/src/views/extend/barCode/index.vue new file mode 100644 index 0000000..d422439 --- /dev/null +++ b/src/views/extend/barCode/index.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/views/extend/bigData/index.vue b/src/views/extend/bigData/index.vue new file mode 100644 index 0000000..ad841fd --- /dev/null +++ b/src/views/extend/bigData/index.vue @@ -0,0 +1,79 @@ + + diff --git a/src/views/extend/documentPreview/Preview.vue b/src/views/extend/documentPreview/Preview.vue new file mode 100644 index 0000000..0d4bda1 --- /dev/null +++ b/src/views/extend/documentPreview/Preview.vue @@ -0,0 +1,97 @@ + + + diff --git a/src/views/extend/documentPreview/index.vue b/src/views/extend/documentPreview/index.vue new file mode 100644 index 0000000..c5b065e --- /dev/null +++ b/src/views/extend/documentPreview/index.vue @@ -0,0 +1,103 @@ + + diff --git a/src/views/extend/email/Config.vue b/src/views/extend/email/Config.vue new file mode 100644 index 0000000..5ec8d71 --- /dev/null +++ b/src/views/extend/email/Config.vue @@ -0,0 +1,129 @@ + + diff --git a/src/views/extend/email/Detail.vue b/src/views/extend/email/Detail.vue new file mode 100644 index 0000000..def02a8 --- /dev/null +++ b/src/views/extend/email/Detail.vue @@ -0,0 +1,35 @@ + + diff --git a/src/views/extend/email/DetailMain.vue b/src/views/extend/email/DetailMain.vue new file mode 100644 index 0000000..894f026 --- /dev/null +++ b/src/views/extend/email/DetailMain.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/views/extend/email/DetailPage.vue b/src/views/extend/email/DetailPage.vue new file mode 100644 index 0000000..776a4fe --- /dev/null +++ b/src/views/extend/email/DetailPage.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/views/extend/email/Form.vue b/src/views/extend/email/Form.vue new file mode 100644 index 0000000..df5ff3d --- /dev/null +++ b/src/views/extend/email/Form.vue @@ -0,0 +1,151 @@ + + diff --git a/src/views/extend/email/index.vue b/src/views/extend/email/index.vue new file mode 100644 index 0000000..e15451a --- /dev/null +++ b/src/views/extend/email/index.vue @@ -0,0 +1,325 @@ + + + + + diff --git a/src/views/extend/formDemo/fieldForm1/index.vue b/src/views/extend/formDemo/fieldForm1/index.vue new file mode 100644 index 0000000..b922b14 --- /dev/null +++ b/src/views/extend/formDemo/fieldForm1/index.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/views/extend/formDemo/fieldForm1/index1.vue b/src/views/extend/formDemo/fieldForm1/index1.vue new file mode 100644 index 0000000..fc55744 --- /dev/null +++ b/src/views/extend/formDemo/fieldForm1/index1.vue @@ -0,0 +1,60 @@ + + diff --git a/src/views/extend/formDemo/fieldForm1/schemaData.tsx b/src/views/extend/formDemo/fieldForm1/schemaData.tsx new file mode 100644 index 0000000..2be91b3 --- /dev/null +++ b/src/views/extend/formDemo/fieldForm1/schemaData.tsx @@ -0,0 +1,275 @@ +import { FormSchema } from '@/components/Form'; + +export const getFormSchema = (): FormSchema[] => { + const schemas: FormSchema[] = [ + { + field: 'fieldInput', + label: '单行输入', + component: 'Input', + helpMessage: '单行输入', + }, + { + field: 'fieldInput2', + label: '单行输入', + component: 'Input', + componentProps: { showPassword: true }, + }, + { + field: 'fieldTextarea', + label: '多行输入', + component: 'Textarea', + }, + { + field: 'fieldInputNumber', + label: '数字输入', + component: 'InputNumber', + componentProps: { + min: 0, + max: 999999, + }, + }, + { + field: 'fieldSwitch', + label: '开关', + component: 'Switch', + }, + { + field: 'fieldDivider', + label: '分割线', + component: 'Divider', + componentProps: { content: '分割线' }, + }, + { + field: 'fieldSelect', + label: '下拉选择', + component: 'Select', + componentProps: { + options: [ + { fullName: '启用', id: 1 }, + { fullName: '锁定', id: 2 }, + { fullName: '禁用', id: 0 }, + ], + }, + }, + { + field: 'fieldSelect2', + label: '下拉多选', + component: 'Select', + componentProps: { + multiple: true, + options: [ + { fullName: '启用', id: 1 }, + { fullName: '锁定', id: 2 }, + { fullName: '禁用', id: 0 }, + ], + }, + }, + { + field: 'fieldRadio', + label: '单选框组', + component: 'Radio', + componentProps: { + options: [ + { fullName: '启用', id: 1 }, + { fullName: '锁定', id: 2 }, + { fullName: '禁用', id: 0 }, + ], + }, + }, + { + field: 'fieldCheckbox', + label: '多选框组', + component: 'Checkbox', + componentProps: { + options: [ + { fullName: '启用', id: 1 }, + { fullName: '锁定', id: 2 }, + { fullName: '禁用', id: 0 }, + ], + }, + }, + { + field: 'fieldButton', + label: '按钮', + component: 'Button', + componentProps: { buttonText: '按钮' }, + }, + { + field: 'fieldTreeSelect', + label: '下拉树形', + component: 'TreeSelect', + }, + { + field: 'fieldGroupTitle', + label: '分组标题', + component: 'GroupTitle', + componentProps: { content: '分组标题' }, + }, + { + field: 'fieldDatePicker', + label: '日期选择', + component: 'DatePicker', + }, + { + field: 'fieldTimePicker', + label: '时间选择', + component: 'TimePicker', + }, + { + field: 'fieldUploadImg', + label: '图片上传', + component: 'UploadImg', + }, + { + field: 'fieldOrganizeSelect', + label: '组织选择', + component: 'OrganizeSelect', + }, + { + field: 'fieldDepSelect', + label: '部门选择', + component: 'DepSelect', + }, + { + field: 'fieldPosSelect', + label: '岗位选择', + component: 'PosSelect', + }, + { + field: 'fieldGroupSelect', + label: '分组选择', + component: 'GroupSelect', + }, + { + field: 'fieldRoleSelect', + label: '角色选择', + component: 'RoleSelect', + }, + { + field: 'fieldUserSelect', + label: '用户选择', + component: 'UserSelect', + }, + { + field: 'fieldUsersSelect', + label: '用户组件', + component: 'UsersSelect', + }, + { + field: 'fieldCascader', + label: '级联选择', + component: 'Cascader', + }, + { + field: 'fieldColorPicker', + label: '颜色选择', + component: 'ColorPicker', + }, + { + field: 'fieldRate', + label: '评分', + component: 'Rate', + }, + { + field: 'fieldSlider', + label: '滑块', + component: 'Slider', + }, + { + field: 'fieldEditor', + label: '富文本', + component: 'Editor', + }, + { + field: 'fieldLink', + label: '链接', + component: 'Link', + componentProps: { content: '官网', href: 'https://yunzhupaas.com' }, + }, + { + field: 'fieldText', + label: '文本', + component: 'Text', + componentProps: { content: '这是一段文字' }, + }, + { + field: 'fieldAlert', + label: '提示', + component: 'Alert', + componentProps: { message: '这是一段提示', type: 'success', showIcon: true }, + }, + { + field: 'fieldAreaSelect', + label: '省市区域', + component: 'AreaSelect', + }, + { + field: 'fieldBillRule', + label: '单据规则', + component: 'BillRule', + }, + { + field: 'fieldModifyUser', + label: '修改人员', + component: 'ModifyUser', + }, + { + field: 'fieldModifyTime', + label: '修改时间', + component: 'ModifyTime', + }, + { + field: 'fieldCreateUser', + label: '创建人员', + component: 'CreateUser', + componentProps: { type: 'currUser' }, + }, + { + field: 'fieldCreateTime', + label: '创建时间', + component: 'CreateTime', + componentProps: { type: 'currTime' }, + }, + { + field: 'fieldCurrOrganize', + label: '所属组织', + component: 'CurrOrganize', + componentProps: { type: 'currOrganize' }, + }, + { + field: 'fieldCurrPosition', + label: '所属岗位', + component: 'CurrPosition', + componentProps: { type: 'currPosition' }, + }, + { + field: 'fieldIconPicker', + label: '图标选择', + component: 'IconPicker', + }, + { + field: 'fieldSign', + label: '在线签名', + component: 'Sign', + }, + { + field: 'fieldQrcode', + label: '二维码', + component: 'Qrcode', + componentProps: { staticText: '二维码' }, + }, + { + field: 'fieldBarcode', + label: '条形码', + component: 'Barcode', + componentProps: { staticText: '10241024' }, + }, + { + field: 'fieldNumberRange', + label: '条形码', + component: 'NumberRange', + componentProps: { staticText: '10241024' }, + }, + ]; + return schemas; +}; diff --git a/src/views/extend/formDemo/fieldForm2/index.vue b/src/views/extend/formDemo/fieldForm2/index.vue new file mode 100644 index 0000000..d48316a --- /dev/null +++ b/src/views/extend/formDemo/fieldForm2/index.vue @@ -0,0 +1,364 @@ + + diff --git a/src/views/extend/formDemo/fieldForm3/index.vue b/src/views/extend/formDemo/fieldForm3/index.vue new file mode 100644 index 0000000..5eb90a9 --- /dev/null +++ b/src/views/extend/formDemo/fieldForm3/index.vue @@ -0,0 +1,45 @@ + + diff --git a/src/views/extend/formDemo/fieldForm4/index.vue b/src/views/extend/formDemo/fieldForm4/index.vue new file mode 100644 index 0000000..77d1962 --- /dev/null +++ b/src/views/extend/formDemo/fieldForm4/index.vue @@ -0,0 +1,33 @@ + + diff --git a/src/views/extend/formDemo/fieldForm5/index.vue b/src/views/extend/formDemo/fieldForm5/index.vue new file mode 100644 index 0000000..de28106 --- /dev/null +++ b/src/views/extend/formDemo/fieldForm5/index.vue @@ -0,0 +1,103 @@ + + + diff --git a/src/views/extend/formDemo/fieldForm6/index.vue b/src/views/extend/formDemo/fieldForm6/index.vue new file mode 100644 index 0000000..6cbe607 --- /dev/null +++ b/src/views/extend/formDemo/fieldForm6/index.vue @@ -0,0 +1,110 @@ + + + diff --git a/src/views/extend/formDemo/verifyForm/index.vue b/src/views/extend/formDemo/verifyForm/index.vue new file mode 100644 index 0000000..75e3c73 --- /dev/null +++ b/src/views/extend/formDemo/verifyForm/index.vue @@ -0,0 +1,252 @@ + + + diff --git a/src/views/extend/formDemo/verifyForm1/index.vue b/src/views/extend/formDemo/verifyForm1/index.vue new file mode 100644 index 0000000..599d080 --- /dev/null +++ b/src/views/extend/formDemo/verifyForm1/index.vue @@ -0,0 +1,225 @@ + + + diff --git a/src/views/extend/graphDemo/echartsBar/index.vue b/src/views/extend/graphDemo/echartsBar/index.vue new file mode 100644 index 0000000..927143c --- /dev/null +++ b/src/views/extend/graphDemo/echartsBar/index.vue @@ -0,0 +1,120 @@ + + diff --git a/src/views/extend/graphDemo/echartsBarAcross/index.vue b/src/views/extend/graphDemo/echartsBarAcross/index.vue new file mode 100644 index 0000000..1797ee7 --- /dev/null +++ b/src/views/extend/graphDemo/echartsBarAcross/index.vue @@ -0,0 +1,55 @@ + + diff --git a/src/views/extend/graphDemo/echartsCandlestick/index.vue b/src/views/extend/graphDemo/echartsCandlestick/index.vue new file mode 100644 index 0000000..063b94b --- /dev/null +++ b/src/views/extend/graphDemo/echartsCandlestick/index.vue @@ -0,0 +1,308 @@ + + diff --git a/src/views/extend/graphDemo/echartsFunnel/index.vue b/src/views/extend/graphDemo/echartsFunnel/index.vue new file mode 100644 index 0000000..deae083 --- /dev/null +++ b/src/views/extend/graphDemo/echartsFunnel/index.vue @@ -0,0 +1,91 @@ + + diff --git a/src/views/extend/graphDemo/echartsGauge/index.vue b/src/views/extend/graphDemo/echartsGauge/index.vue new file mode 100644 index 0000000..9a6d46d --- /dev/null +++ b/src/views/extend/graphDemo/echartsGauge/index.vue @@ -0,0 +1,263 @@ + + diff --git a/src/views/extend/graphDemo/echartsLineArea/index.vue b/src/views/extend/graphDemo/echartsLineArea/index.vue new file mode 100644 index 0000000..4e712c8 --- /dev/null +++ b/src/views/extend/graphDemo/echartsLineArea/index.vue @@ -0,0 +1,104 @@ + + diff --git a/src/views/extend/graphDemo/echartsLineBar/index.vue b/src/views/extend/graphDemo/echartsLineBar/index.vue new file mode 100644 index 0000000..f4c72f4 --- /dev/null +++ b/src/views/extend/graphDemo/echartsLineBar/index.vue @@ -0,0 +1,84 @@ + + diff --git a/src/views/extend/graphDemo/echartsPie/index.vue b/src/views/extend/graphDemo/echartsPie/index.vue new file mode 100644 index 0000000..25e016b --- /dev/null +++ b/src/views/extend/graphDemo/echartsPie/index.vue @@ -0,0 +1,90 @@ + + diff --git a/src/views/extend/graphDemo/echartsScatter/index.vue b/src/views/extend/graphDemo/echartsScatter/index.vue new file mode 100644 index 0000000..52e173a --- /dev/null +++ b/src/views/extend/graphDemo/echartsScatter/index.vue @@ -0,0 +1,149 @@ + + diff --git a/src/views/extend/graphDemo/echartsTree/index.vue b/src/views/extend/graphDemo/echartsTree/index.vue new file mode 100644 index 0000000..acfac59 --- /dev/null +++ b/src/views/extend/graphDemo/echartsTree/index.vue @@ -0,0 +1,888 @@ + + diff --git a/src/views/extend/importAndExport/ExportModal.vue b/src/views/extend/importAndExport/ExportModal.vue new file mode 100644 index 0000000..b2f6c74 --- /dev/null +++ b/src/views/extend/importAndExport/ExportModal.vue @@ -0,0 +1,90 @@ + + diff --git a/src/views/extend/importAndExport/ImportModal.vue b/src/views/extend/importAndExport/ImportModal.vue new file mode 100644 index 0000000..4435b00 --- /dev/null +++ b/src/views/extend/importAndExport/ImportModal.vue @@ -0,0 +1,271 @@ + + diff --git a/src/views/extend/importAndExport/index.vue b/src/views/extend/importAndExport/index.vue new file mode 100644 index 0000000..99daecf --- /dev/null +++ b/src/views/extend/importAndExport/index.vue @@ -0,0 +1,137 @@ + + diff --git a/src/views/extend/map/index.vue b/src/views/extend/map/index.vue new file mode 100644 index 0000000..6f77bb1 --- /dev/null +++ b/src/views/extend/map/index.vue @@ -0,0 +1,47 @@ + + diff --git a/src/views/extend/order/index.vue b/src/views/extend/order/index.vue new file mode 100644 index 0000000..5716799 --- /dev/null +++ b/src/views/extend/order/index.vue @@ -0,0 +1,232 @@ + + diff --git a/src/views/extend/projectGantt/Form.vue b/src/views/extend/projectGantt/Form.vue new file mode 100644 index 0000000..d0d90a1 --- /dev/null +++ b/src/views/extend/projectGantt/Form.vue @@ -0,0 +1,157 @@ + + diff --git a/src/views/extend/projectGantt/Task.vue b/src/views/extend/projectGantt/Task.vue new file mode 100644 index 0000000..374b052 --- /dev/null +++ b/src/views/extend/projectGantt/Task.vue @@ -0,0 +1,290 @@ + + + diff --git a/src/views/extend/projectGantt/TaskForm.vue b/src/views/extend/projectGantt/TaskForm.vue new file mode 100644 index 0000000..f961d75 --- /dev/null +++ b/src/views/extend/projectGantt/TaskForm.vue @@ -0,0 +1,161 @@ + + diff --git a/src/views/extend/projectGantt/index.vue b/src/views/extend/projectGantt/index.vue new file mode 100644 index 0000000..f6a6cd1 --- /dev/null +++ b/src/views/extend/projectGantt/index.vue @@ -0,0 +1,130 @@ + + diff --git a/src/views/extend/saleOrder/Form.vue b/src/views/extend/saleOrder/Form.vue new file mode 100644 index 0000000..c3c30c5 --- /dev/null +++ b/src/views/extend/saleOrder/Form.vue @@ -0,0 +1,399 @@ + + + diff --git a/src/views/extend/saleOrder/components/productModal.vue b/src/views/extend/saleOrder/components/productModal.vue new file mode 100644 index 0000000..6e0d639 --- /dev/null +++ b/src/views/extend/saleOrder/components/productModal.vue @@ -0,0 +1,120 @@ + + + diff --git a/src/views/extend/saleOrder/index.vue b/src/views/extend/saleOrder/index.vue new file mode 100644 index 0000000..95b82ed --- /dev/null +++ b/src/views/extend/saleOrder/index.vue @@ -0,0 +1,209 @@ + + + diff --git a/src/views/extend/signature/index.vue b/src/views/extend/signature/index.vue new file mode 100644 index 0000000..2fd7f23 --- /dev/null +++ b/src/views/extend/signature/index.vue @@ -0,0 +1,250 @@ + + + diff --git a/src/views/extend/signet/index.vue b/src/views/extend/signet/index.vue new file mode 100644 index 0000000..f0e5798 --- /dev/null +++ b/src/views/extend/signet/index.vue @@ -0,0 +1,271 @@ + + + diff --git a/src/views/extend/signet/printStyle.ts b/src/views/extend/signet/printStyle.ts new file mode 100644 index 0000000..1c670af --- /dev/null +++ b/src/views/extend/signet/printStyle.ts @@ -0,0 +1,1202 @@ +const style = ``; +export default style; diff --git a/src/views/extend/tableDemo/commonForm/index.vue b/src/views/extend/tableDemo/commonForm/index.vue new file mode 100644 index 0000000..a398aa4 --- /dev/null +++ b/src/views/extend/tableDemo/commonForm/index.vue @@ -0,0 +1,143 @@ + + diff --git a/src/views/extend/tableDemo/commonTable/index.vue b/src/views/extend/tableDemo/commonTable/index.vue new file mode 100644 index 0000000..e7ce918 --- /dev/null +++ b/src/views/extend/tableDemo/commonTable/index.vue @@ -0,0 +1,119 @@ + + diff --git a/src/views/extend/tableDemo/complexHeader/index.vue b/src/views/extend/tableDemo/complexHeader/index.vue new file mode 100644 index 0000000..d2ffb96 --- /dev/null +++ b/src/views/extend/tableDemo/complexHeader/index.vue @@ -0,0 +1,127 @@ + + diff --git a/src/views/extend/tableDemo/extension/index.vue b/src/views/extend/tableDemo/extension/index.vue new file mode 100644 index 0000000..3c500b4 --- /dev/null +++ b/src/views/extend/tableDemo/extension/index.vue @@ -0,0 +1,83 @@ + + diff --git a/src/views/extend/tableDemo/groupingTable/index.vue b/src/views/extend/tableDemo/groupingTable/index.vue new file mode 100644 index 0000000..ff6d453 --- /dev/null +++ b/src/views/extend/tableDemo/groupingTable/index.vue @@ -0,0 +1,136 @@ + + diff --git a/src/views/extend/tableDemo/lockTable/index.vue b/src/views/extend/tableDemo/lockTable/index.vue new file mode 100644 index 0000000..867a813 --- /dev/null +++ b/src/views/extend/tableDemo/lockTable/index.vue @@ -0,0 +1,119 @@ + + diff --git a/src/views/extend/tableDemo/mergeTable/index.vue b/src/views/extend/tableDemo/mergeTable/index.vue new file mode 100644 index 0000000..492234d --- /dev/null +++ b/src/views/extend/tableDemo/mergeTable/index.vue @@ -0,0 +1,142 @@ + + diff --git a/src/views/extend/tableDemo/postilTable/Form.vue b/src/views/extend/tableDemo/postilTable/Form.vue new file mode 100644 index 0000000..b93f52c --- /dev/null +++ b/src/views/extend/tableDemo/postilTable/Form.vue @@ -0,0 +1,132 @@ + + + diff --git a/src/views/extend/tableDemo/postilTable/index.vue b/src/views/extend/tableDemo/postilTable/index.vue new file mode 100644 index 0000000..815e6c2 --- /dev/null +++ b/src/views/extend/tableDemo/postilTable/index.vue @@ -0,0 +1,90 @@ + + diff --git a/src/views/extend/tableDemo/printTable/index.vue b/src/views/extend/tableDemo/printTable/index.vue new file mode 100644 index 0000000..37167b8 --- /dev/null +++ b/src/views/extend/tableDemo/printTable/index.vue @@ -0,0 +1,93 @@ + + diff --git a/src/views/extend/tableDemo/redactTable/index.vue b/src/views/extend/tableDemo/redactTable/index.vue new file mode 100644 index 0000000..5fb4a34 --- /dev/null +++ b/src/views/extend/tableDemo/redactTable/index.vue @@ -0,0 +1,141 @@ + + diff --git a/src/views/extend/tableDemo/signTable/index.vue b/src/views/extend/tableDemo/signTable/index.vue new file mode 100644 index 0000000..b66b3a2 --- /dev/null +++ b/src/views/extend/tableDemo/signTable/index.vue @@ -0,0 +1,246 @@ + + diff --git a/src/views/extend/tableDemo/statisticsTable/index.vue b/src/views/extend/tableDemo/statisticsTable/index.vue new file mode 100644 index 0000000..b215c18 --- /dev/null +++ b/src/views/extend/tableDemo/statisticsTable/index.vue @@ -0,0 +1,145 @@ + + diff --git a/src/views/extend/tableDemo/tableTree/index.vue b/src/views/extend/tableDemo/tableTree/index.vue new file mode 100644 index 0000000..bb2de5c --- /dev/null +++ b/src/views/extend/tableDemo/tableTree/index.vue @@ -0,0 +1,44 @@ + + diff --git a/src/views/extend/tableDemo/treeTable/index.vue b/src/views/extend/tableDemo/treeTable/index.vue new file mode 100644 index 0000000..a459ddf --- /dev/null +++ b/src/views/extend/tableDemo/treeTable/index.vue @@ -0,0 +1,119 @@ + + diff --git a/src/views/mdm/asset/Detail.vue b/src/views/mdm/asset/Detail.vue new file mode 100644 index 0000000..5b94e8f --- /dev/null +++ b/src/views/mdm/asset/Detail.vue @@ -0,0 +1,322 @@ + + diff --git a/src/views/mdm/asset/Form.vue b/src/views/mdm/asset/Form.vue new file mode 100644 index 0000000..210d43e --- /dev/null +++ b/src/views/mdm/asset/Form.vue @@ -0,0 +1,739 @@ + + diff --git a/src/views/mdm/asset/helper/api.ts b/src/views/mdm/asset/helper/api.ts new file mode 100644 index 0000000..2461a3e --- /dev/null +++ b/src/views/mdm/asset/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/Asset/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/Asset', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/Asset/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/Asset/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/Asset/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/Asset/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/Asset/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/Asset/Actions/Export', data }); +} diff --git a/src/views/mdm/asset/helper/columnList.ts b/src/views/mdm/asset/helper/columnList.ts new file mode 100644 index 0000000..3bcf74c --- /dev/null +++ b/src/views/mdm/asset/helper/columnList.ts @@ -0,0 +1,1091 @@ +const columnList = [ + { + "yunzhupaasKey":"billRule", + "resizable":true, + "fullName":"资产编码", + "fullNameI18nCode":[ + "" + ], + "label":"资产编码", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItemec5a15", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"assetCode", + "className":[], + "label":"资产编码", + "trigger":"change", + "ruleConfig":{ + "startNumber":"", + "dateFormat":"YYYY", + "randomDigit":16, + "prefixList":[], + "randomType":1, + "suffixList":[], + "type":1, + "digit":null + }, + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777345780019, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"资产编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":12 + }, + "readonly":true, + "prop":"asset_code", + "width":null, + "__vModel__":"asset_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "id":"asset_code", + "placeholder":"系统自动生成", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem120e88", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "defaultValue":"", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"资产名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777345895532, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":false, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"asset_name", + "__vModel__":"asset_name", + "disabled":false, + "id":"asset_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":20, + "fullName":"资产名称", + "label":"资产名称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"资产类型", + "fullNameI18nCode":[ + "" + ], + "label":"资产类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"10", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777346352365, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItema4f72a", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"assetType", + "tipLabel":"", + "tableFixed":"none", + "label":"资产类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"asset_type", + "width":null, + "options":[], + "__vModel__":"asset_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_type", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"资产分类", + "fullNameI18nCode":[ + "" + ], + "label":"资产分类", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"40", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777347095610, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem03ef8d", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"assetCategory", + "tipLabel":"", + "tableFixed":"none", + "label":"资产分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"asset_category", + "width":null, + "options":[], + "__vModel__":"asset_category", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_category", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"资产状态", + "fullNameI18nCode":[ + "" + ], + "label":"资产状态", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"InUse", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777347177897, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemc6c516", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"资产状态", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"asset_status", + "width":null, + "options":[ + { + "fullName":"在用", + "id":"InUse" + }, + { + "fullName":"闲置", + "id":"Idle" + }, + { + "fullName":"故障", + "id":"Fault" + }, + { + "fullName":"维修中", + "id":"FIX" + }, + { + "fullName":"借用中", + "id":"OnLoan" + }, + { + "fullName":"已报废", + "id":"Scrapped" + }, + { + "fullName":"已处置", + "id":"Disposed" + } + ], + "__vModel__":"asset_status", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_status", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"cascader", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"资产位置", + "fullNameI18nCode":[ + "" + ], + "label":"资产位置", + "sortable":false, + "align":"left", + "props":{ + "children":"children", + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347474179, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItem2ea454", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"assetLocation", + "tipLabel":"", + "tableFixed":"none", + "label":"资产位置", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"asset_location", + "width":null, + "options":[], + "__vModel__":"asset_location", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_location", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"使用组织", + "fullNameI18nCode":[ + "" + ], + "label":"使用组织", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem60e2d0", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"使用组织", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347508873, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":false, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"current_org_id", + "width":null, + "__vModel__":"current_org_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"current_org_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "ableRelationIds":[], + "yunzhupaasKey":"userSelect", + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"保管用户", + "fullNameI18nCode":[ + "" + ], + "label":"保管用户", + "sortable":false, + "align":"left", + "relationField":"", + "__config__":{ + "formId":"formItem8d2078", + "yunzhupaasKey":"userSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"保管用户", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347525827, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-user", + "defaultCurrent":false, + "tag":"YunzhupaasUserSelect", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"current_user_id", + "width":null, + "__vModel__":"current_user_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"current_user_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"资产权属", + "fullNameI18nCode":[ + "" + ], + "label":"资产权属", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"Owned", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777347571406, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem4eae10", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"资产权属", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"asset_ownership", + "width":null, + "options":[ + { + "fullName":"自有", + "id":"Owned" + }, + { + "fullName":"租赁", + "id":"Leased" + }, + { + "fullName":"融资租赁", + "id":"FinLeased" + }, + { + "fullName":"借用", + "id":"Borrowed" + }, + { + "fullName":"托管", + "id":"Trusteeship" + } + ], + "__vModel__":"asset_ownership", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_ownership", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemec96d9", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"单位", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347663137, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"measurement_unit", + "__vModel__":"measurement_unit", + "disabled":false, + "id":"measurement_unit", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":20, + "fullName":"单位", + "label":"单位", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":2, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItem21ecc7", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"数量", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347687893, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "min":0, + "prop":"quantity", + "__vModel__":"quantity", + "disabled":false, + "id":"quantity", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "max":null, + "fullName":"数量", + "label":"数量", + "sortable":false, + "thousands":false, + "addonAfter":"", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "resizable":true, + "format":"yyyy-MM-dd", + "fullName":"购置日期", + "fullNameI18nCode":[ + "" + ], + "label":"购置日期", + "sortable":false, + "align":"left", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347731278, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem375d5b", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"购置日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"purchase_date", + "width":null, + "__vModel__":"purchase_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"purchase_date", + "placeholder":"请选择", + "endTime":null, + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "resizable":true, + "format":"yyyy-MM-dd", + "fullName":"启用日期", + "fullNameI18nCode":[ + "" + ], + "label":"启用日期", + "sortable":false, + "align":"left", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347763029, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem99411c", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"启用日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"commissioning_date", + "width":null, + "__vModel__":"commissioning_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"commissioning_date", + "placeholder":"请选择", + "endTime":null, + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":2, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItembba5e3", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"预计使用年限", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347785655, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "min":0, + "prop":"expected_life", + "__vModel__":"expected_life", + "disabled":false, + "id":"expected_life", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "fullName":"预计使用年限", + "label":"预计使用年限", + "sortable":false, + "thousands":false, + "addonAfter":"月", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "popupType":"dialog", + "yunzhupaasKey":"relationForm", + "hasPage":false, + "modelId":"817082533433836293", + "pageSize":20, + "columnOptions":[], + "fullNameI18nCode":[ + "" + ], + "align":"left", + "__config__":{ + "formId":"formItem218e23", + "yunzhupaasKey":"relationForm", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"供应商", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347854600, + "layout":"colFormItem", + "transferList":[], + "tagIcon":"icon-ym icon-ym-generator-menu", + "tag":"YunzhupaasRelationFormByUrl", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"supplier_id", + "__vModel__":"supplier_id", + "disabled":false, + "id":"supplier_id", + "placeholder":"请选择", + "popupWidth":"1000px", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "filterable":false, + "clearable":true, + "resizable":true, + "fullName":"供应商", + "label":"供应商", + "sortable":false, + "relationField":"company_name", + "queryType":0, + "extraOptions":[], + "popupTitle":"选择数据", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "labelI18nCode":"", + "propsValue":"company_id" + }, + { + "yunzhupaasKey":"textarea", + "clearable":true, + "resizable":true, + "maxlength":255, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "label":"备注", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItema2c991", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347940332, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"remark", + "width":null, + "__vModel__":"remark", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default columnList \ No newline at end of file diff --git a/src/views/mdm/asset/helper/searchList.ts b/src/views/mdm/asset/helper/searchList.ts new file mode 100644 index 0000000..f5eebc9 --- /dev/null +++ b/src/views/mdm/asset/helper/searchList.ts @@ -0,0 +1,362 @@ +const searchList = [ + { + "yunzhupaasKey":"billRule", + "searchType":2, + "fullName":"资产编码", + "fullNameI18nCode":[ + "" + ], + "label":"资产编码", + "__config__":{ + "formId":"formItemec5a15", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"assetCode", + "className":[], + "label":"资产编码", + "trigger":"change", + "ruleConfig":{ + "startNumber":"", + "dateFormat":"YYYY", + "randomDigit":16, + "prefixList":[], + "randomType":1, + "suffixList":[], + "type":1, + "digit":null + }, + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777345780019, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"资产编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":12 + }, + "readonly":true, + "prop":"asset_code", + "__vModel__":"asset_code", + "searchMultiple":false, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "id":"asset_code", + "placeholder":"系统自动生成", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem120e88", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "defaultValue":"", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"资产名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777345895532, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":false, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"asset_name", + "__vModel__":"asset_name", + "searchMultiple":false, + "disabled":false, + "id":"asset_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "searchType":2, + "maxlength":20, + "fullName":"资产名称", + "label":"资产名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":false, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "searchType":1, + "multiple":false, + "fullName":"资产状态", + "fullNameI18nCode":[ + "" + ], + "label":"资产状态", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"InUse", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777347177897, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemc6c516", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"资产状态", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"asset_status", + "options":[ + { + "fullName":"在用", + "id":"InUse" + }, + { + "fullName":"闲置", + "id":"Idle" + }, + { + "fullName":"故障", + "id":"Fault" + }, + { + "fullName":"维修中", + "id":"FIX" + }, + { + "fullName":"借用中", + "id":"OnLoan" + }, + { + "fullName":"已报废", + "id":"Scrapped" + }, + { + "fullName":"已处置", + "id":"Disposed" + } + ], + "__vModel__":"asset_status", + "searchMultiple":true, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_status", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "searchType":3, + "noShow":false, + "format":"yyyy-MM-dd", + "fullName":"购置日期", + "fullNameI18nCode":[ + "" + ], + "label":"购置日期", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347731278, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem375d5b", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"购置日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"purchase_date", + "__vModel__":"purchase_date", + "searchMultiple":false, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"purchase_date", + "placeholder":"请选择", + "endTime":null, + "value":[], + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "searchType":3, + "noShow":false, + "format":"yyyy-MM-dd", + "fullName":"启用日期", + "fullNameI18nCode":[ + "" + ], + "label":"启用日期", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347763029, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem99411c", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"启用日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"commissioning_date", + "__vModel__":"commissioning_date", + "searchMultiple":false, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"commissioning_date", + "placeholder":"请选择", + "endTime":null, + "value":[], + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/asset/helper/superQueryJson.ts b/src/views/mdm/asset/helper/superQueryJson.ts new file mode 100644 index 0000000..d176557 --- /dev/null +++ b/src/views/mdm/asset/helper/superQueryJson.ts @@ -0,0 +1,947 @@ +const superQueryJson = [ + { + "__config__":{ + "formId":"formItemec5a15", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"assetCode", + "className":[], + "label":"资产编码", + "trigger":"change", + "ruleConfig":{ + "startNumber":"", + "dateFormat":"YYYY", + "randomDigit":16, + "prefixList":[], + "randomType":1, + "suffixList":[], + "type":1, + "digit":null + }, + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777345780019, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"资产编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":12 + }, + "readonly":true, + "__vModel__":"asset_code", + "fullName":"资产编码", + "fullNameI18nCode":[ + "" + ], + "style":{ + "width":"100%" + }, + "id":"asset_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"资产名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem120e88", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "defaultValue":"", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"资产名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777345895532, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":false, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"asset_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"资产类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"10", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777346352365, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItema4f72a", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"assetType", + "tipLabel":"", + "tableFixed":"none", + "label":"资产类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"asset_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_type", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"资产分类", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"40", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777347095610, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem03ef8d", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"assetCategory", + "tipLabel":"", + "tableFixed":"none", + "label":"资产分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"asset_category", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_category", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"资产状态", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"InUse", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777347177897, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemc6c516", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"资产状态", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[ + { + "fullName":"在用", + "id":"InUse" + }, + { + "fullName":"闲置", + "id":"Idle" + }, + { + "fullName":"故障", + "id":"Fault" + }, + { + "fullName":"维修中", + "id":"FIX" + }, + { + "fullName":"借用中", + "id":"OnLoan" + }, + { + "fullName":"已报废", + "id":"Scrapped" + }, + { + "fullName":"已处置", + "id":"Disposed" + } + ], + "__vModel__":"asset_status", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_status", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"资产位置", + "fullNameI18nCode":[ + "" + ], + "props":{ + "children":"children", + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347474179, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItem2ea454", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"assetLocation", + "tipLabel":"", + "tableFixed":"none", + "label":"资产位置", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"asset_location", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_location", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"使用组织", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItem60e2d0", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"使用组织", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347508873, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":false, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"current_org_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"current_org_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "ableRelationIds":[], + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"保管用户", + "fullNameI18nCode":[ + "" + ], + "relationField":"", + "__config__":{ + "formId":"formItem8d2078", + "yunzhupaasKey":"userSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"保管用户", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347525827, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-user", + "defaultCurrent":false, + "tag":"YunzhupaasUserSelect", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"current_user_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"current_user_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"资产权属", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"Owned", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_asset", + "renderKey":1777347571406, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem4eae10", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"资产权属", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[ + { + "fullName":"自有", + "id":"Owned" + }, + { + "fullName":"租赁", + "id":"Leased" + }, + { + "fullName":"融资租赁", + "id":"FinLeased" + }, + { + "fullName":"借用", + "id":"Borrowed" + }, + { + "fullName":"托管", + "id":"Trusteeship" + } + ], + "__vModel__":"asset_ownership", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"asset_ownership", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"单位", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemec96d9", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"单位", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347663137, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"measurement_unit", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"measurement_unit", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "max":null, + "precision":2, + "fullName":"数量", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"", + "__config__":{ + "formId":"formItem21ecc7", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"数量", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347687893, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "min":0, + "__vModel__":"quantity", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"quantity", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "format":"yyyy-MM-dd", + "fullName":"购置日期", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347731278, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem375d5b", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"购置日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"purchase_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"purchase_date", + "placeholder":"请选择", + "endTime":null, + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "format":"yyyy-MM-dd", + "fullName":"启用日期", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347763029, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem99411c", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"启用日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"commissioning_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"commissioning_date", + "placeholder":"请选择", + "endTime":null, + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "precision":2, + "fullName":"预计使用年限", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"月", + "__config__":{ + "formId":"formItembba5e3", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"预计使用年限", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347785655, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "min":0, + "__vModel__":"expected_life", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"expected_life", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "popupType":"dialog", + "hasPage":false, + "filterable":false, + "clearable":true, + "modelId":"817082533433836293", + "fullName":"供应商", + "pageSize":20, + "columnOptions":[], + "fullNameI18nCode":[ + "" + ], + "relationField":"company_name", + "queryType":0, + "__config__":{ + "formId":"formItem218e23", + "yunzhupaasKey":"relationForm", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"供应商", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347854600, + "layout":"colFormItem", + "transferList":[], + "tagIcon":"icon-ym icon-ym-generator-menu", + "tag":"YunzhupaasRelationForm", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "extraOptions":[], + "popupTitle":"选择数据", + "__vModel__":"supplier_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"supplier_id", + "placeholder":"请选择", + "popupWidth":"1000px", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "propsValue":"company_id" + }, + { + "clearable":true, + "maxlength":255, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItema2c991", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_asset", + "renderKey":1777347940332, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"remark", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default superQueryJson \ No newline at end of file diff --git a/src/views/mdm/asset/index.vue b/src/views/mdm/asset/index.vue new file mode 100644 index 0000000..02fcd88 --- /dev/null +++ b/src/views/mdm/asset/index.vue @@ -0,0 +1,719 @@ + + + diff --git a/src/views/mdm/company/Detail.vue b/src/views/mdm/company/Detail.vue new file mode 100644 index 0000000..dffc12e --- /dev/null +++ b/src/views/mdm/company/Detail.vue @@ -0,0 +1,1126 @@ + + diff --git a/src/views/mdm/company/Form.vue b/src/views/mdm/company/Form.vue new file mode 100644 index 0000000..e990464 --- /dev/null +++ b/src/views/mdm/company/Form.vue @@ -0,0 +1,1892 @@ + + diff --git a/src/views/mdm/company/helper/api.ts b/src/views/mdm/company/helper/api.ts new file mode 100644 index 0000000..9637ee8 --- /dev/null +++ b/src/views/mdm/company/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/Company/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/Company', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/Company/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/Company/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/Company/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/Company/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/Company/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/Company/Actions/Export', data }); +} diff --git a/src/views/mdm/company/helper/columnList.ts b/src/views/mdm/company/helper/columnList.ts new file mode 100644 index 0000000..ba66602 --- /dev/null +++ b/src/views/mdm/company/helper/columnList.ts @@ -0,0 +1,1370 @@ +const columnList = [ + { + "yunzhupaasKey":"billRule", + "resizable":true, + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "label":"企业编码", + "sortable":true, + "align":"left", + "__config__":{ + "formId":"formItem7a91b8", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"companyCode", + "className":[], + "label":"企业编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776916036468, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"企业编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":8 + }, + "readonly":true, + "prop":"company_code", + "width":null, + "__vModel__":"company_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "id":"company_code", + "placeholder":"系统自动生成", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_name", + "__vModel__":"company_name", + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"企业名称", + "label":"企业名称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem84e51c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506482631, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"short_name", + "__vModel__":"short_name", + "disabled":false, + "id":"short_name", + "placeholder":"请输入简称/昵称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":50, + "fullName":"简称/昵称", + "label":"简称/昵称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "label":"归属组织", + "sortable":true, + "align":"left", + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"org_id", + "width":null, + "__vModel__":"org_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"radio", + "resizable":true, + "buttonStyle":"solid", + "fullName":"类型", + "fullNameI18nCode":[ + "" + ], + "label":"类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"ORG", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506487223, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItemb3f6cd", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "size":"default", + "prop":"entity_type", + "width":null, + "options":[ + { + "fullName":"企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem10350c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506494880, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"credit_code", + "__vModel__":"credit_code", + "disabled":false, + "id":"credit_code", + "placeholder":"请输入社会信用代码", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"社会信用代码", + "label":"社会信用代码", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"纳税人类别", + "fullNameI18nCode":[ + "" + ], + "label":"纳税人类别", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503586, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem05d07f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"tax_type", + "width":null, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_type", + "placeholder":"请选择纳税人类别", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"企业规模", + "fullNameI18nCode":[ + "" + ], + "label":"企业规模", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503806, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem66e88f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797424039713832965", + "tipLabel":"", + "tableFixed":"none", + "label":"企业规模", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"enterprise_scale", + "width":null, + "options":[], + "__vModel__":"enterprise_scale", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_scale", + "placeholder":"请选择企业规模", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"企业类型", + "fullNameI18nCode":[ + "" + ], + "label":"企业类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506504118, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItema76b83", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"9b542177a477488994ce09fff3c93901", + "tipLabel":"", + "tableFixed":"none", + "label":"企业类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"enterprise_nature", + "width":null, + "options":[], + "__vModel__":"enterprise_nature", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_nature", + "placeholder":"请选择企业类型", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"行业代码", + "fullNameI18nCode":[ + "" + ], + "label":"行业代码", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506507062, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem6bd8a7", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"d59a3cf65f9847dbb08be449e3feae16", + "tipLabel":"", + "tableFixed":"none", + "label":"行业代码", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"industry_code", + "width":null, + "options":[], + "__vModel__":"industry_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"industry_code", + "placeholder":"请选择行业代码", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "resizable":true, + "format":"yyyy-MM-dd", + "fullName":"成立日期", + "fullNameI18nCode":[ + "" + ], + "label":"成立日期", + "sortable":false, + "align":"left", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506509988, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItembab00e", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"成立日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"registration_date", + "width":null, + "__vModel__":"registration_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"registration_date", + "placeholder":"请选择成立日期", + "endTime":null, + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":4, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItem3134b1", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"注册资本", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506514957, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"registered_capital", + "__vModel__":"registered_capital", + "disabled":false, + "id":"registered_capital", + "placeholder":"请输入注册资本", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "max":999999, + "fullName":"注册资本", + "label":"注册资本", + "sortable":false, + "thousands":false, + "addonAfter":"万元", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem4f2d0b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524679, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"legal_representative", + "__vModel__":"legal_representative", + "disabled":false, + "id":"legal_representative", + "placeholder":"请输入法定代表人", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":50, + "fullName":"法定代表人", + "label":"法定代表人", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem97bd9d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524966, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$|^0\\d{2,3}-?\\d{7,8}$/", + "message":"请输入正确的电话号码", + "messageI18nCode":"sys.validate.telephone" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"phone", + "__vModel__":"phone", + "disabled":false, + "id":"phone", + "placeholder":"请输入联系电话", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":11, + "fullName":"联系电话", + "label":"联系电话", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem439010", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506525554, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/", + "message":"请输入正确的邮箱", + "messageI18nCode":"sys.validate.email" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"email", + "__vModel__":"email", + "disabled":false, + "id":"email", + "placeholder":"请输入邮箱", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"邮箱", + "label":"邮箱", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem7fa940", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528130, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"website", + "__vModel__":"website", + "disabled":false, + "id":"website", + "placeholder":"请输入网站", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"网站", + "label":"网站", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem5b2d2b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528353, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"address", + "__vModel__":"address", + "disabled":false, + "id":"address", + "placeholder":"请输入地址", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"地址", + "label":"地址", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"areaSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "label":"所属地区", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItemcc9deb", + "yunzhupaasKey":"areaSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"所属地区", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507118587, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-Provinces", + "tag":"YunzhupaasAreaSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"province_id", + "width":null, + "__vModel__":"province_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"province_id", + "placeholder":"请选择所属地区", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"textarea", + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"经营范围", + "fullNameI18nCode":[ + "" + ], + "label":"经营范围", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem8cbf03", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"经营范围", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534652, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"business_scope", + "width":null, + "__vModel__":"business_scope", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"business_scope", + "placeholder":"请输入经营范围", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"textarea", + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "label":"备注", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem9f5e00", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534863, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"remark", + "width":null, + "__vModel__":"remark", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入备注", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default columnList \ No newline at end of file diff --git a/src/views/mdm/company/helper/searchList.ts b/src/views/mdm/company/helper/searchList.ts new file mode 100644 index 0000000..f1c4163 --- /dev/null +++ b/src/views/mdm/company/helper/searchList.ts @@ -0,0 +1,133 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_name", + "__vModel__":"company_name", + "searchMultiple":false, + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "searchType":2, + "maxlength":200, + "fullName":"企业名称", + "label":"企业名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":false, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "searchType":1, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "label":"归属组织", + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"org_id", + "__vModel__":"org_id", + "searchMultiple":true, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "value":[], + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/company/helper/superQueryJson.ts b/src/views/mdm/company/helper/superQueryJson.ts new file mode 100644 index 0000000..42f12f4 --- /dev/null +++ b/src/views/mdm/company/helper/superQueryJson.ts @@ -0,0 +1,2302 @@ +const superQueryJson = [ + { + "__config__":{ + "formId":"formItem7a91b8", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"CorporationCode", + "className":[], + "label":"企业编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776916036468, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"法人单位编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":8 + }, + "readonly":true, + "__vModel__":"company_code", + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "style":{ + "width":"100%" + }, + "id":"company_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"企业名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"company_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"简称/昵称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem84e51c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506482631, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"short_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"short_name", + "placeholder":"请输入简称/昵称", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "buttonStyle":"solid", + "fullName":"类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"ORG", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506487223, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItemb3f6cd", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "size":"default", + "options":[ + { + "fullName":"企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"社会信用代码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem10350c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506494880, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"credit_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"credit_code", + "placeholder":"请输入社会信用代码", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业范围", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"EXT", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506498092, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem13797c", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"企业范围", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"内部公司", + "id":"INT" + }, + { + "fullName":"客商企业", + "id":"EXT" + } + ], + "__vModel__":"company_scope", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_scope", + "placeholder":"请选择企业范围", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"org_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItemcc9deb", + "yunzhupaasKey":"areaSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"所属地区", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507118587, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-Provinces", + "tag":"YunzhupaasAreaSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"province_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"province_id", + "placeholder":"请选择所属地区", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"纳税人类别", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503586, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem05d07f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_type", + "placeholder":"请选择纳税人类别", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业规模", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503806, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem66e88f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797424039713832965", + "tipLabel":"", + "tableFixed":"none", + "label":"企业规模", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"enterprise_scale", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_scale", + "placeholder":"请选择企业规模", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506504118, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItema76b83", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"9b542177a477488994ce09fff3c93901", + "tipLabel":"", + "tableFixed":"none", + "label":"企业类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"enterprise_nature", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_nature", + "placeholder":"请选择企业类型", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"行业代码", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506507062, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem6bd8a7", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"d59a3cf65f9847dbb08be449e3feae16", + "tipLabel":"", + "tableFixed":"none", + "label":"行业代码", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"industry_code", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"industry_code", + "placeholder":"请选择行业代码", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "format":"yyyy-MM-dd", + "fullName":"成立日期", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506509988, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItembab00e", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"成立日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"registration_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"registration_date", + "placeholder":"请选择成立日期", + "endTime":null, + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "max":999999, + "precision":4, + "fullName":"注册资本", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"万元", + "__config__":{ + "formId":"formItem3134b1", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"注册资本", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506514957, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"registered_capital", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"registered_capital", + "placeholder":"请输入注册资本", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"法定代表人", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem4f2d0b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524679, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"legal_representative", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"legal_representative", + "placeholder":"请输入法定代表人", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":11, + "useScan":false, + "suffixIcon":"", + "fullName":"联系电话", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem97bd9d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524966, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$|^0\\d{2,3}-?\\d{7,8}$/", + "message":"请输入正确的电话号码", + "messageI18nCode":"sys.validate.telephone" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"phone", + "placeholder":"请输入联系电话", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"邮箱", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem439010", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506525554, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/", + "message":"请输入正确的邮箱", + "messageI18nCode":"sys.validate.email" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"email", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"email", + "placeholder":"请输入邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"网站", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem7fa940", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528130, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"website", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"website", + "placeholder":"请输入网站", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"地址", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem5b2d2b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528353, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"address", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"address", + "placeholder":"请输入地址", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "fullName":"经营范围", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem8cbf03", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"经营范围", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534652, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"business_scope", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"business_scope", + "placeholder":"请输入经营范围", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem9f5e00", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534863, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"remark", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入备注", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem3756b9", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507591361, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_name", + "placeholder":"请输入开户行", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-账户名", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemf42745", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"账户名", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507611465, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_account_name", + "placeholder":"请输入账户名", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-银行账号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem8abffe", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507627371, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account_number", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_account_number", + "placeholder":"请输入银行账号", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户行城市", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemb870cb", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行城市", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507627772, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_province", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_province", + "placeholder":"请输入开户行城市", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemf22092", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507628423, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"remark", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-remark", + "placeholder":"请输入备注", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"billRule", + "defaultValue":null, + "parentVModel":"tableField46dc53", + "dragDisabled":false, + "rule":"InvoiceTitleCode", + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754320599, + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "isSubTable":true, + "ruleName":"发票抬头编码", + "tag":"YunzhupaasInput", + "formId":"formItem57f1d4", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "label":"发票抬头编码", + "trigger":"change", + "ruleConfig":{}, + "layout":"colFormItem", + "tableAlign":"left", + "span":24 + }, + "readonly":true, + "__vModel__":"title_code", + "fullName":"设计子表-发票抬头编码", + "fullNameI18nCode":[ + "", + "" + ], + "style":{ + "width":"100%" + }, + "id":"tableField46dc53-title_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":10, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-发票抬头名称", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItema8b1f4", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"发票抬头名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507383593, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"title_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-title_name", + "placeholder":"请输入联系人", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-纳税人识别号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1963f0", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"纳税人识别号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507440273, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"credit_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-credit_code", + "placeholder":"请输入联系人职务", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"设计子表-纳税人类别", + "fullNameI18nCode":[ + "", + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"select", + "defaultValue":"", + "parentVModel":"tableField46dc53", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754396382, + "tagIcon":"icon-ym icon-ym-generator-select", + "isSubTable":true, + "tag":"YunzhupaasSelect", + "formId":"formItemb3492f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-tax_type", + "placeholder":"请选择纳税人类别", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-地址", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItema9aaf2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507448061, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"address", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-address", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-电话", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItemf8b766", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754421983, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-phone", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户银行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1730ca", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户银行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754433217, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-bank_name", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-银行账户", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1089bb", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账户", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754444839, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-bank_account", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "formId":"formItem4743e7", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"是否默认", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754525239, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "isSubTable":true, + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"is_defalut", + "fullName":"设计子表-是否默认", + "inactiveTxt":"关", + "fullNameI18nCode":[ + "", + "" + ], + "disabled":false, + "activeTxt":"开", + "id":"tableField46dc53-is_defalut", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "formId":"formItema2b4cf", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"是否有效", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754540042, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "isSubTable":true, + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"is_valid", + "fullName":"设计子表-是否有效", + "inactiveTxt":"关", + "fullNameI18nCode":[ + "", + "" + ], + "disabled":false, + "activeTxt":"开", + "id":"tableField46dc53-is_valid", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem560a27", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507449005, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"remark", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-remark", + "placeholder":"请输入备注", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default superQueryJson \ No newline at end of file diff --git a/src/views/mdm/company/index.vue b/src/views/mdm/company/index.vue new file mode 100644 index 0000000..0989f0a --- /dev/null +++ b/src/views/mdm/company/index.vue @@ -0,0 +1,675 @@ + + + diff --git a/src/views/mdm/custinfo/Detail.vue b/src/views/mdm/custinfo/Detail.vue new file mode 100644 index 0000000..c9e8b3a --- /dev/null +++ b/src/views/mdm/custinfo/Detail.vue @@ -0,0 +1,1146 @@ + + diff --git a/src/views/mdm/custinfo/Form.vue b/src/views/mdm/custinfo/Form.vue new file mode 100644 index 0000000..e9863ff --- /dev/null +++ b/src/views/mdm/custinfo/Form.vue @@ -0,0 +1,1992 @@ + + diff --git a/src/views/mdm/custinfo/helper/api.ts b/src/views/mdm/custinfo/helper/api.ts new file mode 100644 index 0000000..0f3a87b --- /dev/null +++ b/src/views/mdm/custinfo/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/Custinfo/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/Custinfo', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/Custinfo/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/Custinfo/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/Custinfo/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/Custinfo/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/Custinfo/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/Custinfo/Actions/Export', data }); +} diff --git a/src/views/mdm/custinfo/helper/columnList.ts b/src/views/mdm/custinfo/helper/columnList.ts new file mode 100644 index 0000000..40bf570 --- /dev/null +++ b/src/views/mdm/custinfo/helper/columnList.ts @@ -0,0 +1,1444 @@ +const columnList = [ + { + "yunzhupaasKey":"billRule", + "resizable":true, + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "label":"企业编码", + "sortable":true, + "align":"left", + "__config__":{ + "formId":"formItem7a91b8", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"CorporationCode", + "className":[], + "label":"企业编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776916036468, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"法人单位编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":8 + }, + "readonly":true, + "prop":"company_code", + "width":null, + "__vModel__":"company_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "id":"company_code", + "placeholder":"系统自动生成", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_name", + "__vModel__":"company_name", + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"企业名称", + "label":"企业名称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem84e51c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506482631, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"short_name", + "__vModel__":"short_name", + "disabled":false, + "id":"short_name", + "placeholder":"请输入简称/昵称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":50, + "fullName":"简称/昵称", + "label":"简称/昵称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "label":"归属组织", + "sortable":true, + "align":"left", + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"org_id", + "width":null, + "__vModel__":"org_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"radio", + "resizable":true, + "buttonStyle":"solid", + "fullName":"类型", + "fullNameI18nCode":[ + "" + ], + "label":"类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"ORG", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506487223, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItemb3f6cd", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "size":"default", + "prop":"entity_type", + "width":null, + "options":[ + { + "fullName":"企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem10350c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506494880, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"credit_code", + "__vModel__":"credit_code", + "disabled":false, + "id":"credit_code", + "placeholder":"请输入社会信用代码", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"社会信用代码", + "label":"社会信用代码", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + // { + // "yunzhupaasKey":"radio", + // "resizable":true, + // "buttonStyle":"solid", + // "fullName":"伙伴性质", + // "fullNameI18nCode":[ + // "" + // ], + // "label":"伙伴性质", + // "sortable":false, + // "align":"left", + // "props":{ + // "label":"fullName", + // "value":"id" + // }, + // "optionType":"default", + // "__config__":{ + // "yunzhupaasKey":"radio", + // "defaultValue":"EXT", + // "dragDisabled":false, + // "className":[], + // "propsUrl":"", + // "templateJson":[], + // "showLabel":true, + // "required":false, + // "tableName":"mdm_company", + // "renderKey":1776918211021, + // "tagIcon":"icon-ym icon-ym-generator-radio", + // "tag":"YunzhupaasRadio", + // "formId":"formItem97bed8", + // "visibility":[ + // "pc", + // "app" + // ], + // "noShow":true, + // "dataType":"static", + // "dictionaryType":"", + // "tipLabel":"", + // "tableFixed":"none", + // "label":"伙伴性质", + // "trigger":"change", + // "layout":"colFormItem", + // "useCache":true, + // "propsName":"", + // "regList":[], + // "tableAlign":"left", + // "span":24 + // }, + // "size":"default", + // "prop":"company_scope", + // "width":null, + // "options":[ + // { + // "fullName":"内部", + // "id":"INT" + // }, + // { + // "fullName":"外部", + // "id":"EXT" + // } + // ], + // "__vModel__":"company_scope", + // "fixed":"none", + // "style":{ + // "width":"100%" + // }, + // "disabled":false, + // "id":"company_scope", + // "labelI18nCode":"", + // "on":{ + // "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + // }, + // "direction":"horizontal" + // }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"纳税人类别", + "fullNameI18nCode":[ + "" + ], + "label":"纳税人类别", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503586, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem05d07f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"tax_type", + "width":null, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_type", + "placeholder":"请选择纳税人类别", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"企业规模", + "fullNameI18nCode":[ + "" + ], + "label":"企业规模", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503806, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem66e88f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797424039713832965", + "tipLabel":"", + "tableFixed":"none", + "label":"企业规模", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"enterprise_scale", + "width":null, + "options":[], + "__vModel__":"enterprise_scale", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_scale", + "placeholder":"请选择企业规模", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"企业类型", + "fullNameI18nCode":[ + "" + ], + "label":"企业类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506504118, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItema76b83", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"9b542177a477488994ce09fff3c93901", + "tipLabel":"", + "tableFixed":"none", + "label":"企业类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"enterprise_nature", + "width":null, + "options":[], + "__vModel__":"enterprise_nature", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_nature", + "placeholder":"请选择企业类型", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"行业代码", + "fullNameI18nCode":[ + "" + ], + "label":"行业代码", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506507062, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem6bd8a7", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"d59a3cf65f9847dbb08be449e3feae16", + "tipLabel":"", + "tableFixed":"none", + "label":"行业代码", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"industry_code", + "width":null, + "options":[], + "__vModel__":"industry_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"industry_code", + "placeholder":"请选择行业代码", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "resizable":true, + "format":"yyyy-MM-dd", + "fullName":"成立日期", + "fullNameI18nCode":[ + "" + ], + "label":"成立日期", + "sortable":false, + "align":"left", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506509988, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItembab00e", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"成立日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"registration_date", + "width":null, + "__vModel__":"registration_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"registration_date", + "placeholder":"请选择成立日期", + "endTime":null, + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":4, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItem3134b1", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"注册资本", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506514957, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"registered_capital", + "__vModel__":"registered_capital", + "disabled":false, + "id":"registered_capital", + "placeholder":"请输入注册资本", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "max":999999, + "fullName":"注册资本", + "label":"注册资本", + "sortable":false, + "thousands":false, + "addonAfter":"万元", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem4f2d0b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524679, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"legal_representative", + "__vModel__":"legal_representative", + "disabled":false, + "id":"legal_representative", + "placeholder":"请输入法定代表人", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":50, + "fullName":"法定代表人", + "label":"法定代表人", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem97bd9d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524966, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$|^0\\d{2,3}-?\\d{7,8}$/", + "message":"请输入正确的电话号码", + "messageI18nCode":"sys.validate.telephone" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"phone", + "__vModel__":"phone", + "disabled":false, + "id":"phone", + "placeholder":"请输入联系电话", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":11, + "fullName":"联系电话", + "label":"联系电话", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem439010", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506525554, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/", + "message":"请输入正确的邮箱", + "messageI18nCode":"sys.validate.email" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"email", + "__vModel__":"email", + "disabled":false, + "id":"email", + "placeholder":"请输入邮箱", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"邮箱", + "label":"邮箱", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem7fa940", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528130, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"website", + "__vModel__":"website", + "disabled":false, + "id":"website", + "placeholder":"请输入网站", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"网站", + "label":"网站", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem5b2d2b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528353, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"address", + "__vModel__":"address", + "disabled":false, + "id":"address", + "placeholder":"请输入地址", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"地址", + "label":"地址", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"areaSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "label":"所属地区", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItemcc9deb", + "yunzhupaasKey":"areaSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"所属地区", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507118587, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-Provinces", + "tag":"YunzhupaasAreaSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"province_id", + "width":null, + "__vModel__":"province_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"province_id", + "placeholder":"请选择所属地区", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"textarea", + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"经营范围", + "fullNameI18nCode":[ + "" + ], + "label":"经营范围", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem8cbf03", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"经营范围", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534652, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"business_scope", + "width":null, + "__vModel__":"business_scope", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"business_scope", + "placeholder":"请输入经营范围", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"textarea", + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "label":"备注", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem9f5e00", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534863, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"remark", + "width":null, + "__vModel__":"remark", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入备注", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default columnList \ No newline at end of file diff --git a/src/views/mdm/custinfo/helper/searchList.ts b/src/views/mdm/custinfo/helper/searchList.ts new file mode 100644 index 0000000..f1c4163 --- /dev/null +++ b/src/views/mdm/custinfo/helper/searchList.ts @@ -0,0 +1,133 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_name", + "__vModel__":"company_name", + "searchMultiple":false, + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "searchType":2, + "maxlength":200, + "fullName":"企业名称", + "label":"企业名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":false, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "searchType":1, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "label":"归属组织", + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"org_id", + "__vModel__":"org_id", + "searchMultiple":true, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "value":[], + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/custinfo/helper/superQueryJson.ts b/src/views/mdm/custinfo/helper/superQueryJson.ts new file mode 100644 index 0000000..050fe89 --- /dev/null +++ b/src/views/mdm/custinfo/helper/superQueryJson.ts @@ -0,0 +1,3502 @@ +const superQueryJson = [ + { + "buttonStyle":"solid", + "fullName":"伙伴性质", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"EXT", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776918211021, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItem97bed8", + "visibility":[ + "pc", + "app" + ], + "noShow":true, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"伙伴性质", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "size":"default", + "options":[ + { + "fullName":"内部", + "id":"INT" + }, + { + "fullName":"外部", + "id":"EXT" + } + ], + "__vModel__":"company_scope", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_scope", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "__config__":{ + "formId":"formItem7a91b8", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"CorporationCode", + "className":[], + "label":"企业编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776916036468, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"法人单位编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":8 + }, + "readonly":true, + "__vModel__":"company_code", + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"企业名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"company_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"简称/昵称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem84e51c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506482631, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"short_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"short_name", + "placeholder":"请输入简称/昵称", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "buttonStyle":"solid", + "fullName":"类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"ORG", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506487223, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItemb3f6cd", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "size":"default", + "options":[ + { + "fullName":"企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"社会信用代码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem10350c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506494880, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"credit_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"credit_code", + "placeholder":"请输入社会信用代码", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"org_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItemcc9deb", + "yunzhupaasKey":"areaSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"所属地区", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507118587, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-Provinces", + "tag":"YunzhupaasAreaSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"province_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"province_id", + "placeholder":"请选择所属地区", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"纳税人类别", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503586, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem05d07f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_type", + "placeholder":"请选择纳税人类别", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业规模", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503806, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem66e88f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797424039713832965", + "tipLabel":"", + "tableFixed":"none", + "label":"企业规模", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "enCode":"XS", + "children":null, + "hasChildren":false, + "fullName":"微型", + "id":"797424215203512325", + "parentId":"0" + }, + { + "enCode":"S", + "children":null, + "hasChildren":false, + "fullName":"小型", + "id":"797424263127629829", + "parentId":"0" + }, + { + "enCode":"M", + "children":null, + "hasChildren":false, + "fullName":"中型", + "id":"797424333336084485", + "parentId":"0" + }, + { + "enCode":"L", + "children":null, + "hasChildren":false, + "fullName":"大型", + "id":"797424384636616709", + "parentId":"0" + } + ], + "__vModel__":"enterprise_scale", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_scale", + "placeholder":"请选择企业规模", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506504118, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItema76b83", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"9b542177a477488994ce09fff3c93901", + "tipLabel":"", + "tableFixed":"none", + "label":"企业类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "enCode":"5", + "children":null, + "hasChildren":false, + "fullName":"个体户", + "id":"2a3fa24dcace4a7aafeddb3d8c0ec65a", + "parentId":"0" + }, + { + "enCode":"4", + "children":null, + "hasChildren":false, + "fullName":"合伙企业", + "id":"cf5b616c15ed40c3bfbf59d4f6e8b7fb", + "parentId":"0" + }, + { + "enCode":"3", + "children":null, + "hasChildren":false, + "fullName":"集体企业", + "id":"82d9060f011a42dd8488a9feaaef376e", + "parentId":"0" + }, + { + "enCode":"2", + "children":null, + "hasChildren":false, + "fullName":"私营企业", + "id":"f4a0897d4f2d4e748a8f55ec7d85a82a", + "parentId":"0" + }, + { + "enCode":"1", + "children":null, + "hasChildren":false, + "fullName":"国有企业", + "id":"074a2706adc84abe8832b0b6a9f20229", + "parentId":"0" + } + ], + "__vModel__":"enterprise_nature", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_nature", + "placeholder":"请选择企业类型", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"行业代码", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506507062, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem6bd8a7", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"d59a3cf65f9847dbb08be449e3feae16", + "tipLabel":"", + "tableFixed":"none", + "label":"行业代码", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "enCode":"文艺演出", + "children":null, + "hasChildren":false, + "fullName":"文艺演出", + "id":"00C3CCB3-47E1-4FA3-8F8E-3AF6EA6D808A", + "parentId":"0" + }, + { + "enCode":"景区/公园/游乐", + "children":null, + "hasChildren":false, + "fullName":"景区/公园/游乐", + "id":"02C0A09B-1FD7-4B1A-BCD1-9F368AEE9066", + "parentId":"0" + }, + { + "enCode":"兴趣辅导/特长教育", + "children":null, + "hasChildren":false, + "fullName":"兴趣辅导/特长教育", + "id":"06DBA3B3-B7E5-4631-9718-8B3160EE289C", + "parentId":"0" + }, + { + "enCode":"水/电/暖/气", + "children":null, + "hasChildren":false, + "fullName":"水/电/暖/气", + "id":"07F0018A-897A-4D27-BBF5-9567D8F78A7B", + "parentId":"0" + }, + { + "enCode":"商务中介/外贸报关代理", + "children":null, + "hasChildren":false, + "fullName":"商务中介/外贸报关代理", + "id":"0A5B92DD-3236-45E7-BD1B-CC92EE212135", + "parentId":"0" + }, + { + "enCode":"养生/按摩", + "children":null, + "hasChildren":false, + "fullName":"养生/按摩", + "id":"0A5BECDA-4840-4DAA-94A6-3564B744B35E", + "parentId":"0" + }, + { + "enCode":"政府", + "children":null, + "hasChildren":false, + "fullName":"政府", + "id":"0DB2D286-D299-4490-808B-A94A217E45DD", + "parentId":"0" + }, + { + "enCode":"洗浴", + "children":null, + "hasChildren":false, + "fullName":"洗浴", + "id":"0F2C0CD7-D2ED-4119-8E06-80D928B6F6DD", + "parentId":"0" + }, + { + "enCode":"货物运输/大宗物流", + "children":null, + "hasChildren":false, + "fullName":"货物运输/大宗物流", + "id":"0F3966B0-63A5-47B1-A88B-D8CDFE65563E", + "parentId":"0" + }, + { + "enCode":"房产/装修/租售", + "children":null, + "hasChildren":false, + "fullName":"房产/装修/租售", + "id":"0fcc751d-9ceb-4767-8755-f0189b239468", + "parentId":"0" + }, + { + "enCode":"留学/移民", + "children":null, + "hasChildren":false, + "fullName":"留学/移民", + "id":"128ACB5A-3619-4D41-86A6-9CC8CE44F0C9", + "parentId":"0" + }, + { + "enCode":"手机数码/通讯服务", + "children":null, + "hasChildren":false, + "fullName":"手机数码/通讯服务", + "id":"1b82cfae-98f1-4b54-a3ae-1d1c6ad3f3f6", + "parentId":"0" + }, + { + "enCode":"维修/保养/改装", + "children":null, + "hasChildren":false, + "fullName":"维修/保养/改装", + "id":"1CCFE5C7-9448-44C1-A7A0-206DA6095868", + "parentId":"0" + }, + { + "enCode":"安防/监控器材", + "children":null, + "hasChildren":false, + "fullName":"安防/监控器材", + "id":"1E8757B0-9572-43B7-B5B0-CE15FDC9AAF2", + "parentId":"0" + }, + { + "enCode":"开发商", + "children":null, + "hasChildren":false, + "fullName":"开发商", + "id":"2112FC39-0B0C-4D4D-87CB-A48843674083", + "parentId":"0" + }, + { + "enCode":"客运/票务", + "children":null, + "hasChildren":false, + "fullName":"客运/票务", + "id":"22DF536C-B5FF-44BA-A53E-66DD314055E0", + "parentId":"0" + }, + { + "enCode":"电影院", + "children":null, + "hasChildren":false, + "fullName":"电影院", + "id":"2716A909-1CAC-4A72-8749-28206D3326E0", + "parentId":"0" + }, + { + "enCode":"家具/家居", + "children":null, + "hasChildren":false, + "fullName":"家具/家居", + "id":"2745E89F-AA85-49EB-943C-9037D7B73535", + "parentId":"0" + }, + { + "enCode":"教育/出国", + "children":null, + "hasChildren":false, + "fullName":"教育/出国", + "id":"27c38cf2-dc0a-4449-ab87-7eb68f7e425b", + "parentId":"0" + }, + { + "enCode":"计算机/互联网", + "children":null, + "hasChildren":false, + "fullName":"计算机/互联网", + "id":"27d8cf5a-22e8-4e05-b4d6-5684a564418a", + "parentId":"0" + }, + { + "enCode":"农家乐/度假村", + "children":null, + "hasChildren":false, + "fullName":"农家乐/度假村", + "id":"28C182AE-BCD2-48DA-97FC-C45383A58C68", + "parentId":"0" + }, + { + "enCode":"职业培训/企业管理", + "children":null, + "hasChildren":false, + "fullName":"职业培训/企业管理", + "id":"2FD33FE4-D636-4BC0-8A66-984D71387428", + "parentId":"0" + }, + { + "enCode":"电子/IC/集成电路", + "children":null, + "hasChildren":false, + "fullName":"电子/IC/集成电路", + "id":"2FE19FDC-6308-441D-A10A-C1B2E33FBE87", + "parentId":"0" + }, + { + "enCode":"行业组织", + "children":null, + "hasChildren":false, + "fullName":"行业组织", + "id":"3206B717-97FC-4249-8AAA-4743992C7538", + "parentId":"0" + }, + { + "enCode":"计算机硬件", + "children":null, + "hasChildren":false, + "fullName":"计算机硬件", + "id":"33311B5D-5566-4E8B-A367-5BB23D32553B", + "parentId":"0" + }, + { + "enCode":"中式美食", + "children":null, + "hasChildren":false, + "fullName":"中式美食", + "id":"33859881-6714-470C-9CAC-F2B4C34FB0A9", + "parentId":"0" + }, + { + "enCode":"小吃快餐", + "children":null, + "hasChildren":false, + "fullName":"小吃快餐", + "id":"33A0777B-51C0-4A71-B99F-2CBB081FF93F", + "parentId":"0" + }, + { + "enCode":"医疗/护理/卫生", + "children":null, + "hasChildren":false, + "fullName":"医疗/护理/卫生", + "id":"38B8C27D-7AEF-4B30-95A6-7B3472E12F99", + "parentId":"0" + }, + { + "enCode":"宠物", + "children":null, + "hasChildren":false, + "fullName":"宠物", + "id":"39AEC832-D76F-4635-AF3C-1F249C22010B", + "parentId":"0" + }, + { + "enCode":"户外/拓展", + "children":null, + "hasChildren":false, + "fullName":"户外/拓展", + "id":"3F9F5BF6-99B8-4342-933A-5A36528D9A3D", + "parentId":"0" + }, + { + "enCode":"美食餐饮", + "children":null, + "hasChildren":false, + "fullName":"美食餐饮", + "id":"44338471-6e77-4dd0-899d-ea0355c03277", + "parentId":"0" + }, + { + "enCode":"非赢利性组织", + "children":null, + "hasChildren":false, + "fullName":"非赢利性组织", + "id":"44D8F7B7-3BD7-4C0E-B694-0191E49568E8", + "parentId":"0" + }, + { + "enCode":"甜品饮品", + "children":null, + "hasChildren":false, + "fullName":"甜品饮品", + "id":"48EA619A-6B6C-4185-9C9E-67A0AE4D15CF", + "parentId":"0" + }, + { + "enCode":"工程机械/行业设备/仪器仪表", + "children":null, + "hasChildren":false, + "fullName":"工程机械/行业设备/仪器仪表", + "id":"4A2F85F0-C2CD-4F90-83CF-06ABD9A1975C", + "parentId":"0" + }, + { + "enCode":"婚庆摄影", + "children":null, + "hasChildren":false, + "fullName":"婚庆摄影", + "id":"4B00983C-2994-446C-9D4D-8C7D20624D0A", + "parentId":"0" + }, + { + "enCode":"旅游/出行", + "children":null, + "hasChildren":false, + "fullName":"旅游/出行", + "id":"4d885793-2fbd-49ce-9b0e-aa709a71b2d0", + "parentId":"0" + }, + { + "enCode":"食品饮料", + "children":null, + "hasChildren":false, + "fullName":"食品饮料", + "id":"4EF041F9-A5DA-4120-AC7C-95468EACBF1F", + "parentId":"0" + }, + { + "enCode":"网络游戏", + "children":null, + "hasChildren":false, + "fullName":"网络游戏", + "id":"52D968DF-1B38-4FE4-AC9E-D9958A9D3DD8", + "parentId":"0" + }, + { + "enCode":"房屋中介", + "children":null, + "hasChildren":false, + "fullName":"房屋中介", + "id":"548323F5-70A1-4979-9EE7-F30642B0821D", + "parentId":"0" + }, + { + "enCode":"互联网服务", + "children":null, + "hasChildren":false, + "fullName":"互联网服务", + "id":"5996617D-23EC-4691-B119-C3270ED1645F", + "parentId":"0" + }, + { + "enCode":"咖啡厅/茶馆", + "children":null, + "hasChildren":false, + "fullName":"咖啡厅/茶馆", + "id":"59B7E4C7-B888-4DA1-8A68-E23F0E25E5C3", + "parentId":"0" + }, + { + "enCode":"金融/保险", + "children":null, + "hasChildren":false, + "fullName":"金融/保险", + "id":"5bf517bb-f45b-491b-93c0-25849ffa0a5c", + "parentId":"0" + }, + { + "enCode":"点卡/虚拟币", + "children":null, + "hasChildren":false, + "fullName":"点卡/虚拟币", + "id":"5BFA882E-B4DB-43D5-9950-1AAAB021F0BA", + "parentId":"0" + }, + { + "enCode":"公关/市场推广", + "children":null, + "hasChildren":false, + "fullName":"公关/市场推广", + "id":"5D1066AB-F366-42D0-B5BB-4BDB86738C3F", + "parentId":"0" + }, + { + "enCode":"公共事业", + "children":null, + "hasChildren":false, + "fullName":"公共事业", + "id":"5E43C907-A735-45AD-81E4-DA078F49D27C", + "parentId":"0" + }, + { + "enCode":"能源/电力/水利", + "children":null, + "hasChildren":false, + "fullName":"能源/电力/水利", + "id":"5E51C077-025C-40CC-84D3-40DD426AD19B", + "parentId":"0" + }, + { + "enCode":"工业/工业品", + "children":null, + "hasChildren":false, + "fullName":"工业/工业品", + "id":"614ecab4-845f-4cbc-9ff7-a9968aca6eeb", + "parentId":"0" + }, + { + "enCode":"新闻媒体/报刊杂志", + "children":null, + "hasChildren":false, + "fullName":"新闻媒体/报刊杂志", + "id":"619A02B0-1FC7-4899-9E35-21179AD897B3", + "parentId":"0" + }, + { + "enCode":"加盟招商", + "children":null, + "hasChildren":false, + "fullName":"加盟招商", + "id":"6454738D-DCDF-4A3F-AA4A-4E88AE3C04BB", + "parentId":"0" + }, + { + "enCode":"工商注册/代理代办", + "children":null, + "hasChildren":false, + "fullName":"工商注册/代理代办", + "id":"689DCC5B-5CCC-402F-8054-83D1EE93BE7B", + "parentId":"0" + }, + { + "enCode":"固话/宽带", + "children":null, + "hasChildren":false, + "fullName":"固话/宽带", + "id":"68A6864E-D2D5-4547-AF89-374E511ECB5F", + "parentId":"0" + }, + { + "enCode":"洗衣房", + "children":null, + "hasChildren":false, + "fullName":"洗衣房", + "id":"6FEB335E-C083-41B7-B094-69A5C837EE7E", + "parentId":"0" + }, + { + "enCode":"美容/护理", + "children":null, + "hasChildren":false, + "fullName":"美容/护理", + "id":"74E80DA6-85AA-4595-9A4A-DEAFA4B78EBA", + "parentId":"0" + }, + { + "enCode":"文化/广电/影视", + "children":null, + "hasChildren":false, + "fullName":"文化/广电/影视", + "id":"7592795B-5241-4ADA-8A1F-22192DF432CF", + "parentId":"0" + }, + { + "enCode":"商业服务", + "children":null, + "hasChildren":false, + "fullName":"商业服务", + "id":"75f1eb60-1258-4747-bfbc-ac66c1724b49", + "parentId":"0" + }, + { + "enCode":"会展服务", + "children":null, + "hasChildren":false, + "fullName":"会展服务", + "id":"76A68CC8-7C7C-4E5A-8270-2C937CF5207D", + "parentId":"0" + }, + { + "enCode":"鲜花速递", + "children":null, + "hasChildren":false, + "fullName":"鲜花速递", + "id":"7A5CCD49-9C2E-45D4-A400-CC55874BD591", + "parentId":"0" + }, + { + "enCode":"汽车/汽配/租赁", + "children":null, + "hasChildren":false, + "fullName":"汽车/汽配/租赁", + "id":"7c7d4ae2-455c-439b-b8a8-eb484014aa75", + "parentId":"0" + }, + { + "enCode":"医疗/整形整容", + "children":null, + "hasChildren":false, + "fullName":"医疗/整形整容", + "id":"7d7dd051-6e57-499b-ac88-c019d7c663da", + "parentId":"0" + }, + { + "enCode":"话费充值", + "children":null, + "hasChildren":false, + "fullName":"话费充值", + "id":"81499648-7139-4C49-8E73-E68085B07524", + "parentId":"0" + }, + { + "enCode":"奢侈品/收藏品", + "children":null, + "hasChildren":false, + "fullName":"奢侈品/收藏品", + "id":"84158383-A0D0-45B5-ADF4-8C7AC1A6E042", + "parentId":"0" + }, + { + "enCode":"旅行社", + "children":null, + "hasChildren":false, + "fullName":"旅行社", + "id":"85D701EB-9B95-42CC-99D0-C0026DB5EF4B", + "parentId":"0" + }, + { + "enCode":"印刷/包装/平面设计", + "children":null, + "hasChildren":false, + "fullName":"印刷/包装/平面设计", + "id":"85F898D1-D467-4DAF-8846-A3307A2EEA53", + "parentId":"0" + }, + { + "enCode":"西餐/日韩料理/异国美食", + "children":null, + "hasChildren":false, + "fullName":"西餐/日韩料理/异国美食", + "id":"895BF6CB-479D-4A3C-9FDE-06CDEA600464", + "parentId":"0" + }, + { + "enCode":"电信增值业务", + "children":null, + "hasChildren":false, + "fullName":"电信增值业务", + "id":"8CFC9EED-68FD-46B8-B67B-58AEFD9F45AB", + "parentId":"0" + }, + { + "enCode":"生活服务", + "children":null, + "hasChildren":false, + "fullName":"生活服务", + "id":"8e63a940-4e88-461f-b80d-fd3db065bfef", + "parentId":"0" + }, + { + "enCode":"搬家/搬运", + "children":null, + "hasChildren":false, + "fullName":"搬家/搬运", + "id":"90F0F95F-007B-400D-8146-92665AC3B515", + "parentId":"0" + }, + { + "enCode":"媒体/广告/出版", + "children":null, + "hasChildren":false, + "fullName":"媒体/广告/出版", + "id":"926023bb-0b74-4bca-8d67-5d7657d0bca7", + "parentId":"0" + }, + { + "enCode":"投资/证券", + "children":null, + "hasChildren":false, + "fullName":"投资/证券", + "id":"94D20938-8724-40CE-806A-FB61DDAB3FBC", + "parentId":"0" + }, + { + "enCode":"会馆会所", + "children":null, + "hasChildren":false, + "fullName":"会馆会所", + "id":"97337AB5-E9FF-41E6-B963-0A4768B32611", + "parentId":"0" + }, + { + "enCode":"典当/抵押/信贷", + "children":null, + "hasChildren":false, + "fullName":"典当/抵押/信贷", + "id":"9C7AA17D-4682-40C9-A9B6-AC14EE7D8A54", + "parentId":"0" + }, + { + "enCode":"工艺品/玩具/珠宝", + "children":null, + "hasChildren":false, + "fullName":"工艺品/玩具/珠宝", + "id":"9D8266BD-10A3-4A88-8131-51D2C57C3519", + "parentId":"0" + }, + { + "enCode":"宾馆/酒店", + "children":null, + "hasChildren":false, + "fullName":"宾馆/酒店", + "id":"A99C5405-DC2A-440D-A5E3-6B0A8C6026DB", + "parentId":"0" + }, + { + "enCode":"环保/废料回收", + "children":null, + "hasChildren":false, + "fullName":"环保/废料回收", + "id":"ABA8D38C-7B37-4C32-A7C9-4DBB33A4B413", + "parentId":"0" + }, + { + "enCode":"计算机服务/维修", + "children":null, + "hasChildren":false, + "fullName":"计算机服务/维修", + "id":"ABE7D855-FA7A-4FF3-B39A-B4999B99C59E", + "parentId":"0" + }, + { + "enCode":"化工/肥料/农药", + "children":null, + "hasChildren":false, + "fullName":"化工/肥料/农药", + "id":"ADF3DA95-2674-4830-BD9B-14043451C09F", + "parentId":"0" + }, + { + "enCode":"电工/电气/开关/线缆", + "children":null, + "hasChildren":false, + "fullName":"电工/电气/开关/线缆", + "id":"AEF24D19-1B7A-4ADB-85FF-7B974C8B0297", + "parentId":"0" + }, + { + "enCode":"五金/工具", + "children":null, + "hasChildren":false, + "fullName":"五金/工具", + "id":"AF6172C8-DA14-419D-84F9-6CB1D1A5B231", + "parentId":"0" + }, + { + "enCode":"化妆品/护肤品", + "children":null, + "hasChildren":false, + "fullName":"化妆品/护肤品", + "id":"B1F6AE91-F128-4E3D-9D5D-4FF08420682D", + "parentId":"0" + }, + { + "enCode":"家政服务", + "children":null, + "hasChildren":false, + "fullName":"家政服务", + "id":"B2630C4A-ED8C-4147-BAED-5BD0BCA4E5F1", + "parentId":"0" + }, + { + "enCode":"建材/工程", + "children":null, + "hasChildren":false, + "fullName":"建材/工程", + "id":"B4A01EC3-8EB3-479D-AB60-FBB2A9E13BA8", + "parentId":"0" + }, + { + "enCode":"美容/保健", + "children":null, + "hasChildren":false, + "fullName":"美容/保健", + "id":"b5dc651f-1125-4c6c-8114-24e2ef85ed73", + "parentId":"0" + }, + { + "enCode":"人力资源/财会", + "children":null, + "hasChildren":false, + "fullName":"人力资源/财会", + "id":"B5F754A5-9598-41E1-AA17-B6223DC144BE", + "parentId":"0" + }, + { + "enCode":"图书/音像", + "children":null, + "hasChildren":false, + "fullName":"图书/音像", + "id":"BCA3C4EB-9545-4A2D-94CF-CFFADC2B4EE3", + "parentId":"0" + }, + { + "enCode":"照明工业", + "children":null, + "hasChildren":false, + "fullName":"照明工业", + "id":"BCAC8366-A51D-4595-B50F-59DBC552CECD", + "parentId":"0" + }, + { + "enCode":"服装服饰", + "children":null, + "hasChildren":false, + "fullName":"服装服饰", + "id":"C48852B0-CE48-49C3-82FB-3267F513E91B", + "parentId":"0" + }, + { + "enCode":"美发", + "children":null, + "hasChildren":false, + "fullName":"美发", + "id":"C4BD8743-ADCF-42EC-901D-44485F1B242A", + "parentId":"0" + }, + { + "enCode":"政府机关/社会组织", + "children":null, + "hasChildren":false, + "fullName":"政府机关/社会组织", + "id":"c6edee1e-ae57-4b1e-84e5-4837e24978b8", + "parentId":"0" + }, + { + "enCode":"银行/保险", + "children":null, + "hasChildren":false, + "fullName":"银行/保险", + "id":"C7469619-5331-42D8-B625-2D75BA69A59C", + "parentId":"0" + }, + { + "enCode":"4S店/汽车经销商", + "children":null, + "hasChildren":false, + "fullName":"4S店/汽车经销商", + "id":"CC83B3E0-4E70-4910-B39D-4758A89C858F", + "parentId":"0" + }, + { + "enCode":"采掘/冶炼/金属", + "children":null, + "hasChildren":false, + "fullName":"采掘/冶炼/金属", + "id":"CEDE4DDD-B946-46E7-87CF-59A393DCED36", + "parentId":"0" + }, + { + "enCode":"大中小学", + "children":null, + "hasChildren":false, + "fullName":"大中小学", + "id":"D13F172E-080E-4362-862D-088BE89C0B65", + "parentId":"0" + }, + { + "enCode":"移动通讯", + "children":null, + "hasChildren":false, + "fullName":"移动通讯", + "id":"D416CE11-E6A5-4778-AB42-3BDB6262D6AE", + "parentId":"0" + }, + { + "enCode":"医疗整形", + "children":null, + "hasChildren":false, + "fullName":"医疗整形", + "id":"D4427F85-09BD-4572-BEC0-5297DB690184", + "parentId":"0" + }, + { + "enCode":"计算机软件", + "children":null, + "hasChildren":false, + "fullName":"计算机软件", + "id":"D4C26AA6-8B40-4DD5-BE0B-4EB027958184", + "parentId":"0" + }, + { + "enCode":"其他", + "children":null, + "hasChildren":false, + "fullName":"其他", + "id":"D967E161-32D3-4A32-9F99-86A69ECA894E", + "parentId":"0" + }, + { + "enCode":"休闲娱乐", + "children":null, + "hasChildren":false, + "fullName":"休闲娱乐", + "id":"d9b969ed-9122-4861-9035-c631acf99378", + "parentId":"0" + }, + { + "enCode":"生活用品", + "children":null, + "hasChildren":false, + "fullName":"生活用品", + "id":"DF326EC3-AD05-41E0-B4D3-3382748C700C", + "parentId":"0" + }, + { + "enCode":"数码产品", + "children":null, + "hasChildren":false, + "fullName":"数码产品", + "id":"E6C0D972-0A2A-48B6-85E8-55F80200C503", + "parentId":"0" + }, + { + "enCode":"楼盘/物业", + "children":null, + "hasChildren":false, + "fullName":"楼盘/物业", + "id":"E86D955D-8E32-4D9E-AF66-87E0D30C5555", + "parentId":"0" + }, + { + "enCode":"室内设计/装潢", + "children":null, + "hasChildren":false, + "fullName":"室内设计/装潢", + "id":"E8802412-74A7-42BB-B892-F8AAAB779783", + "parentId":"0" + }, + { + "enCode":"语言培训", + "children":null, + "hasChildren":false, + "fullName":"语言培训", + "id":"EA8E6EF5-76CA-4E2C-B2B0-D6BAF4ED7F08", + "parentId":"0" + }, + { + "enCode":"外包服务", + "children":null, + "hasChildren":false, + "fullName":"外包服务", + "id":"EB53529F-71C0-4136-A27B-73A533434D87", + "parentId":"0" + }, + { + "enCode":"烟酒", + "children":null, + "hasChildren":false, + "fullName":"烟酒", + "id":"EC84E1BB-4DEB-4E71-BEA0-76FB939DFD34", + "parentId":"0" + }, + { + "enCode":"快递/物流/速运", + "children":null, + "hasChildren":false, + "fullName":"快递/物流/速运", + "id":"ECB00494-3C58-43FF-BA93-8505FB568AB5", + "parentId":"0" + }, + { + "enCode":"保健品", + "children":null, + "hasChildren":false, + "fullName":"保健品", + "id":"EECBF1B0-C175-4BAB-A189-5E7DE1632F23", + "parentId":"0" + }, + { + "enCode":"广告", + "children":null, + "hasChildren":false, + "fullName":"广告", + "id":"F18D5175-4200-47C4-B299-3AFBF8216AF9", + "parentId":"0" + }, + { + "enCode":"日用杂货/家电", + "children":null, + "hasChildren":false, + "fullName":"日用杂货/家电", + "id":"f2acc9ef-ce0d-4ef1-a17e-c0cc32c7e678", + "parentId":"0" + }, + { + "enCode":"制药/生物", + "children":null, + "hasChildren":false, + "fullName":"制药/生物", + "id":"F463A7BE-F5BC-4C9F-8A89-F744C1E1A88E", + "parentId":"0" + }, + { + "enCode":"办公用品及设备", + "children":null, + "hasChildren":false, + "fullName":"办公用品及设备", + "id":"F61115F6-A7A1-4B04-858E-E976721AAF30", + "parentId":"0" + }, + { + "enCode":"医疗设备/器械", + "children":null, + "hasChildren":false, + "fullName":"医疗设备/器械", + "id":"F6D5FE02-A217-4F90-A820-D5BD710B4FF7", + "parentId":"0" + }, + { + "enCode":"孕前/婴幼儿教育", + "children":null, + "hasChildren":false, + "fullName":"孕前/婴幼儿教育", + "id":"FB03EBBE-AE85-4394-91EF-DB6D6DC0BBCB", + "parentId":"0" + }, + { + "enCode":"租车/代驾", + "children":null, + "hasChildren":false, + "fullName":"租车/代驾", + "id":"FBA08D44-765D-4462-9782-E4AADB4E8AE3", + "parentId":"0" + }, + { + "enCode":"咨询/顾问", + "children":null, + "hasChildren":false, + "fullName":"咨询/顾问", + "id":"FBE677DD-AB1D-43D0-AF5F-460B2610F58A", + "parentId":"0" + }, + { + "enCode":"鞋服/工艺品/奢侈品", + "children":null, + "hasChildren":false, + "fullName":"鞋服/工艺品/奢侈品", + "id":"fc4a08ce-9804-4cb1-a4c6-9440ca614b5d", + "parentId":"0" + }, + { + "enCode":"家电/小家电/厨卫用具", + "children":null, + "hasChildren":false, + "fullName":"家电/小家电/厨卫用具", + "id":"FCAD0103-FAA2-4D5C-96AA-D113F307225D", + "parentId":"0" + }, + { + "enCode":"维修/疏通", + "children":null, + "hasChildren":false, + "fullName":"维修/疏通", + "id":"FD32473F-9151-4A9F-85FF-B1FE95D5B9D4", + "parentId":"0" + }, + { + "enCode":"KTV/酒吧/夜店", + "children":null, + "hasChildren":false, + "fullName":"KTV/酒吧/夜店", + "id":"FE7F43BF-75C7-492B-8898-72A40FDDBB95", + "parentId":"0" + } + ], + "__vModel__":"industry_code", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"industry_code", + "placeholder":"请选择行业代码", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "format":"yyyy-MM-dd", + "fullName":"成立日期", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506509988, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItembab00e", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"成立日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"registration_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"registration_date", + "placeholder":"请选择成立日期", + "endTime":null, + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "max":999999, + "precision":4, + "fullName":"注册资本", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"万元", + "__config__":{ + "formId":"formItem3134b1", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"注册资本", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506514957, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"registered_capital", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"registered_capital", + "placeholder":"请输入注册资本", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"法定代表人", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem4f2d0b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524679, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"legal_representative", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"legal_representative", + "placeholder":"请输入法定代表人", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":11, + "useScan":false, + "suffixIcon":"", + "fullName":"联系电话", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem97bd9d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524966, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$|^0\\d{2,3}-?\\d{7,8}$/", + "message":"请输入正确的电话号码", + "messageI18nCode":"sys.validate.telephone" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"phone", + "placeholder":"请输入联系电话", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"邮箱", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem439010", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506525554, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/", + "message":"请输入正确的邮箱", + "messageI18nCode":"sys.validate.email" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"email", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"email", + "placeholder":"请输入邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"网站", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem7fa940", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528130, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"website", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"website", + "placeholder":"请输入网站", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"地址", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem5b2d2b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528353, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"address", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"address", + "placeholder":"请输入地址", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "ableRelationIds":[], + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"销售责任人", + "fullNameI18nCode":[ + "" + ], + "relationField":"", + "__config__":{ + "formId":"formItemf4ca17", + "yunzhupaasKey":"userSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"销售责任人", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_customer", + "renderKey":1776918111506, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-user", + "defaultCurrent":true, + "tag":"YunzhupaasUserSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"yunzhupaas_mdm_customer_yunzhupaas_major_person_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"yunzhupaas_mdm_customer_yunzhupaas_major_person_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"客户级别。关联字典:客户级别(CustomerLevel)", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_customer", + "renderKey":1776918157184, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem379bfe", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"客户级别。关联字典:客户级别(CustomerLevel)", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"yunzhupaas_mdm_customer_yunzhupaas_customer_level", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_customer_yunzhupaas_customer_level", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"客户来源。关联字典:客户来源(CustomerSource)", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_customer", + "renderKey":1776918191565, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem68763d", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"客户来源。关联字典:客户来源(CustomerSource)", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"yunzhupaas_mdm_customer_yunzhupaas_customer_source", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_customer_yunzhupaas_customer_source", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "fullName":"经营范围", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem8cbf03", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"经营范围", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534652, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"business_scope", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"business_scope", + "placeholder":"请输入经营范围", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem9f5e00", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534863, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"remark", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入备注", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem3756b9", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507591361, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_name", + "placeholder":"请输入开户行", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-账户名", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemf42745", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"账户名", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507611465, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_account_name", + "placeholder":"请输入账户名", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-银行账号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem8abffe", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507627371, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account_number", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_account_number", + "placeholder":"请输入银行账号", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户行城市", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemb870cb", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行城市", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507627772, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_province", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_province", + "placeholder":"请输入开户行城市", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemf22092", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507628423, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"remark", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-remark", + "placeholder":"请输入备注", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"billRule", + "defaultValue":null, + "parentVModel":"tableField46dc53", + "dragDisabled":false, + "rule":"InvoiceTitleCode", + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754320599, + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "isSubTable":true, + "ruleName":"发票抬头编码", + "tag":"YunzhupaasInput", + "formId":"formItem57f1d4", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "label":"发票抬头编码", + "trigger":"change", + "ruleConfig":{}, + "layout":"colFormItem", + "tableAlign":"left", + "span":24 + }, + "readonly":true, + "__vModel__":"title_code", + "fullName":"设计子表-发票抬头编码", + "fullNameI18nCode":[ + "", + "" + ], + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-title_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":10, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-发票抬头名称", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItema8b1f4", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"发票抬头名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507383593, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"title_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-title_name", + "placeholder":"请输入联系人", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-纳税人识别号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1963f0", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"纳税人识别号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507440273, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"credit_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-credit_code", + "placeholder":"请输入联系人职务", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"设计子表-纳税人类别", + "fullNameI18nCode":[ + "", + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"select", + "defaultValue":"", + "parentVModel":"tableField46dc53", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754396382, + "tagIcon":"icon-ym icon-ym-generator-select", + "isSubTable":true, + "tag":"YunzhupaasSelect", + "formId":"formItemb3492f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-tax_type", + "placeholder":"请选择纳税人类别", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-地址", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItema9aaf2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507448061, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"address", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-address", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-电话", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItemf8b766", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754421983, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-phone", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户银行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1730ca", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户银行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754433217, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-bank_name", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-银行账户", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1089bb", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账户", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754444839, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-bank_account", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "formId":"formItem4743e7", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"是否默认", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754525239, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "isSubTable":true, + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"is_defalut", + "fullName":"设计子表-是否默认", + "inactiveTxt":"关", + "fullNameI18nCode":[ + "", + "" + ], + "disabled":false, + "activeTxt":"开", + "id":"tableField46dc53-is_defalut", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "formId":"formItema2b4cf", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"是否有效", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754540042, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "isSubTable":true, + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"is_valid", + "fullName":"设计子表-是否有效", + "inactiveTxt":"关", + "fullNameI18nCode":[ + "", + "" + ], + "disabled":false, + "activeTxt":"开", + "id":"tableField46dc53-is_valid", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem560a27", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507449005, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"remark", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-remark", + "placeholder":"请输入备注", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default superQueryJson \ No newline at end of file diff --git a/src/views/mdm/custinfo/index.vue b/src/views/mdm/custinfo/index.vue new file mode 100644 index 0000000..d98e3a8 --- /dev/null +++ b/src/views/mdm/custinfo/index.vue @@ -0,0 +1,675 @@ + + + diff --git a/src/views/mdm/lpc/Detail.vue b/src/views/mdm/lpc/Detail.vue new file mode 100644 index 0000000..716f5e9 --- /dev/null +++ b/src/views/mdm/lpc/Detail.vue @@ -0,0 +1,1105 @@ + + diff --git a/src/views/mdm/lpc/Form.vue b/src/views/mdm/lpc/Form.vue new file mode 100644 index 0000000..a7bb5a9 --- /dev/null +++ b/src/views/mdm/lpc/Form.vue @@ -0,0 +1,1888 @@ + + diff --git a/src/views/mdm/lpc/helper/api.ts b/src/views/mdm/lpc/helper/api.ts new file mode 100644 index 0000000..6d98fd3 --- /dev/null +++ b/src/views/mdm/lpc/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/Lpc/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/Lpc', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/Lpc/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/Lpc/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/Lpc/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/Lpc/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/Lpc/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/Lpc/Actions/Export', data }); +} diff --git a/src/views/mdm/lpc/helper/columnList.ts b/src/views/mdm/lpc/helper/columnList.ts new file mode 100644 index 0000000..94332b4 --- /dev/null +++ b/src/views/mdm/lpc/helper/columnList.ts @@ -0,0 +1,1280 @@ +const columnList = [ + { + "yunzhupaasKey":"billRule", + "resizable":true, + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "label":"企业编码", + "sortable":true, + "align":"left", + "__config__":{ + "formId":"formItemd86399", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"companyCode", + "className":[], + "label":"企业编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756346790, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"企业编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":8 + }, + "readonly":true, + "prop":"company_code", + "width":null, + "__vModel__":"company_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "id":"company_code", + "placeholder":"系统自动生成", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemac3814", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756270027, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_name", + "__vModel__":"company_name", + "disabled":false, + "id":"company_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"企业名称", + "label":"企业名称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem950378", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756445058, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"short_name", + "__vModel__":"short_name", + "disabled":false, + "id":"short_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"简称/昵称", + "label":"简称/昵称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formIteme913d2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756480142, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"credit_code", + "__vModel__":"credit_code", + "disabled":false, + "id":"credit_code", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"社会信用代码", + "label":"社会信用代码", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"纳税人类别", + "fullNameI18nCode":[ + "" + ], + "label":"纳税人类别", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756520113, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemf1b719", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"tax_type", + "width":null, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_type", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "label":"归属组织", + "sortable":true, + "align":"left", + "__config__":{ + "formId":"formItem3e0d06", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756606740, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"org_id", + "width":null, + "__vModel__":"org_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"areaSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "label":"所属地区", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItembac4d7", + "yunzhupaasKey":"areaSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"所属地区", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756709692, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-Provinces", + "tag":"YunzhupaasAreaSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"province_id", + "width":null, + "__vModel__":"province_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"province_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"企业类型", + "fullNameI18nCode":[ + "" + ], + "label":"企业类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756797475, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem402f2c", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"9b542177a477488994ce09fff3c93901", + "tipLabel":"", + "tableFixed":"none", + "label":"企业类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"enterprise_nature", + "width":null, + "options":[], + "__vModel__":"enterprise_nature", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_nature", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"行业代码", + "fullNameI18nCode":[ + "" + ], + "label":"行业代码", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756887768, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem62cf2d", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"d59a3cf65f9847dbb08be449e3feae16", + "tipLabel":"", + "tableFixed":"none", + "label":"行业代码", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"industry_code", + "width":null, + "options":[], + "__vModel__":"industry_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"industry_code", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"企业规模", + "fullNameI18nCode":[ + "" + ], + "label":"企业规模", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756923859, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem236419", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797424039713832965", + "tipLabel":"", + "tableFixed":"none", + "label":"企业规模", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"enterprise_scale", + "width":null, + "options":[], + "__vModel__":"enterprise_scale", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_scale", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "resizable":true, + "format":"yyyy-MM-dd", + "fullName":"成立日期", + "fullNameI18nCode":[ + "" + ], + "label":"成立日期", + "sortable":false, + "align":"left", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756967842, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem31fbac", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"成立日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"registration_date", + "width":null, + "__vModel__":"registration_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"registration_date", + "placeholder":"请选择", + "endTime":null, + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "resizable":true, + "fullName":"注册资本", + "fullNameI18nCode":[ + "" + ], + "label":"注册资本", + "sortable":false, + "align":"left", + "thousands":false, + "isAmountChinese":false, + "addonAfter":"万元", + "__config__":{ + "formId":"formItembe6067", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"注册资本", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757334161, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"registered_capital", + "width":null, + "__vModel__":"registered_capital", + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"registered_capital", + "placeholder":"请输入", + "addonBefore":"", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemb811fc", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757395564, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"legal_representative", + "__vModel__":"legal_representative", + "disabled":false, + "id":"legal_representative", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"法定代表人", + "label":"法定代表人", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem5f994c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757411562, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"phone", + "__vModel__":"phone", + "disabled":false, + "id":"phone", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"联系电话", + "label":"联系电话", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItembcb540", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757415485, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"email", + "__vModel__":"email", + "disabled":false, + "id":"email", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"邮箱", + "label":"邮箱", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem2b0674", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757420940, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"website", + "__vModel__":"website", + "disabled":false, + "id":"website", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"网站", + "label":"网站", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem8e2a41", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757434551, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"address", + "__vModel__":"address", + "disabled":false, + "id":"address", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"地址", + "label":"地址", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "ableRelationIds":[], + "yunzhupaasKey":"userSelect", + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"负责人", + "fullNameI18nCode":[ + "" + ], + "label":"负责人", + "sortable":false, + "align":"left", + "relationField":"", + "__config__":{ + "formId":"formItem9e3ebb", + "yunzhupaasKey":"userSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"负责人", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_corporation", + "renderKey":1776911034109, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-user", + "defaultCurrent":true, + "tag":"YunzhupaasUserSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"yunzhupaas_mdm_corporation_yunzhupaas_major_person_id", + "width":null, + "__vModel__":"yunzhupaas_mdm_corporation_yunzhupaas_major_person_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"yunzhupaas_mdm_corporation_yunzhupaas_major_person_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"textarea", + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "label":"备注", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":2, + "maxRows":10 + }, + "showCount":false, + "__config__":{ + "formId":"formItem5e3ca2", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757518231, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"remark", + "width":null, + "__vModel__":"remark", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default columnList \ No newline at end of file diff --git a/src/views/mdm/lpc/helper/searchList.ts b/src/views/mdm/lpc/helper/searchList.ts new file mode 100644 index 0000000..215b414 --- /dev/null +++ b/src/views/mdm/lpc/helper/searchList.ts @@ -0,0 +1,133 @@ +const searchList = [ + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "searchType":1, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "label":"归属组织", + "__config__":{ + "formId":"formItem3e0d06", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756606740, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"org_id", + "__vModel__":"org_id", + "searchMultiple":true, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "value":[], + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItemac3814", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756270027, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_name", + "__vModel__":"company_name", + "searchMultiple":false, + "disabled":false, + "id":"company_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "searchType":2, + "maxlength":null, + "noShow":false, + "fullName":"企业名称", + "label":"企业名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":false, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + } +] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/lpc/helper/superQueryJson.ts b/src/views/mdm/lpc/helper/superQueryJson.ts new file mode 100644 index 0000000..539ef07 --- /dev/null +++ b/src/views/mdm/lpc/helper/superQueryJson.ts @@ -0,0 +1,2271 @@ +const superQueryJson = [ + { + "buttonStyle":"solid", + "fullName":"实体类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"ORG", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776916730323, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItembb71f5", + "visibility":[ + "pc", + "app" + ], + "noShow":true, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"实体类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "size":"default", + "options":[ + { + "fullName":"组织/企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "__config__":{ + "formId":"formItemd86399", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"companyCode", + "className":[], + "label":"企业编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756346790, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"企业编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":8 + }, + "readonly":true, + "__vModel__":"company_code", + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "style":{ + "width":"100%" + }, + "id":"company_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"企业名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemac3814", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756270027, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"company_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"简称/昵称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem950378", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756445058, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"short_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"short_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"社会信用代码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formIteme913d2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756480142, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"credit_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"credit_code", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"纳税人类别", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756520113, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemf1b719", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_type", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItem3e0d06", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776756606740, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"org_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItembac4d7", + "yunzhupaasKey":"areaSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"所属地区", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756709692, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-Provinces", + "tag":"YunzhupaasAreaSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"province_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"province_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756797475, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem402f2c", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"9b542177a477488994ce09fff3c93901", + "tipLabel":"", + "tableFixed":"none", + "label":"企业类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"enterprise_nature", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_nature", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"行业代码", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756887768, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem62cf2d", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"d59a3cf65f9847dbb08be449e3feae16", + "tipLabel":"", + "tableFixed":"none", + "label":"行业代码", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"industry_code", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"industry_code", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业规模", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756923859, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem236419", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797424039713832965", + "tipLabel":"", + "tableFixed":"none", + "label":"企业规模", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"enterprise_scale", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_scale", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "format":"yyyy-MM-dd", + "fullName":"成立日期", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776756967842, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem31fbac", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"成立日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"registration_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"registration_date", + "placeholder":"请选择", + "endTime":null, + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "fullName":"注册资本", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"万元", + "__config__":{ + "formId":"formItembe6067", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"注册资本", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757334161, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"registered_capital", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"registered_capital", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"法定代表人", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemb811fc", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757395564, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"legal_representative", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"legal_representative", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"联系电话", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem5f994c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757411562, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"phone", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"邮箱", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItembcb540", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757415485, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"email", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"email", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"网站", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem2b0674", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757420940, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"website", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"website", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"地址", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem8e2a41", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757434551, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"address", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"address", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "ableRelationIds":[], + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"负责人", + "fullNameI18nCode":[ + "" + ], + "relationField":"", + "__config__":{ + "formId":"formItem9e3ebb", + "yunzhupaasKey":"userSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"负责人", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_corporation", + "renderKey":1776911034109, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-user", + "defaultCurrent":true, + "tag":"YunzhupaasUserSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"yunzhupaas_mdm_corporation_yunzhupaas_major_person_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"yunzhupaas_mdm_corporation_yunzhupaas_major_person_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"经营范围", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":10 + }, + "showCount":false, + "__config__":{ + "formId":"formItem1cbed8", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"经营范围", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757471228, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"business_scope", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"business_scope", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":10 + }, + "showCount":false, + "__config__":{ + "formId":"formItem5e3ca2", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757518231, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"remark", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"billRule", + "defaultValue":null, + "parentVModel":"tableField5ced3a", + "dragDisabled":false, + "rule":"InvoiceTitleCode", + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757704179, + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "isSubTable":true, + "ruleName":"发票抬头编码", + "tag":"YunzhupaasInput", + "formId":"formItemf85a31", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "label":"发票抬头编码", + "trigger":"change", + "ruleConfig":{}, + "layout":"colFormItem", + "tableAlign":"left", + "span":24 + }, + "readonly":true, + "__vModel__":"title_code", + "fullName":"设计子表-发票抬头编码", + "fullNameI18nCode":[ + "", + "" + ], + "style":{ + "width":"100%" + }, + "id":"tableField5ced3a-title_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-发票抬头名称", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItema0f091", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"发票抬头名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776757735612, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"title_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField5ced3a-title_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-纳税人识别号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem410ef8", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"纳税人识别号", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776757742594, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"credit_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField5ced3a-credit_code", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"设计子表-纳税人类别", + "fullNameI18nCode":[ + "", + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"select", + "defaultValue":"", + "parentVModel":"tableField5ced3a", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776757754042, + "tagIcon":"icon-ym icon-ym-generator-select", + "isSubTable":true, + "tag":"YunzhupaasSelect", + "formId":"formItem9a9db2", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField5ced3a-tax_type", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-地址", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formIteme1488f", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757782422, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"address", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField5ced3a-address", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-电话", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem58d117", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757790773, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField5ced3a-phone", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户银行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem5736dd", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户银行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757797258, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField5ced3a-bank_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-银行账户", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem7541c6", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账户", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757803853, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField5ced3a-bank_account", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItemfa99ed", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"是否默认抬头", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757838265, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "isSubTable":true, + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"is_defalut", + "fullName":"设计子表-是否默认抬头", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "", + "" + ], + "disabled":false, + "activeTxt":"Y", + "id":"tableField5ced3a-is_defalut", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItema0c23f", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"是否有效", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776757884853, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "isSubTable":true, + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"is_valid", + "fullName":"设计子表-是否有效", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "", + "" + ], + "disabled":false, + "activeTxt":"Y", + "id":"tableField5ced3a-is_valid", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemf6c9b4", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField5ced3a", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_legal", + "renderKey":1776757948832, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"remark", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField5ced3a-remark", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItema6ee01", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldbd0aa4", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776758021515, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldbd0aa4-bank_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-账户名", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem961220", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldbd0aa4", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"账户名", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776758032023, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldbd0aa4-bank_account_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-银行账号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem68e172", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldbd0aa4", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776758041593, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account_number", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldbd0aa4-bank_account_number", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户行城市", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formIteme5e523", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldbd0aa4", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行城市", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776758062168, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_province", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldbd0aa4-bank_province", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem5c7f16", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldbd0aa4", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776758070020, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"remark", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldbd0aa4-remark", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default superQueryJson \ No newline at end of file diff --git a/src/views/mdm/lpc/index.vue b/src/views/mdm/lpc/index.vue new file mode 100644 index 0000000..60bcc3f --- /dev/null +++ b/src/views/mdm/lpc/index.vue @@ -0,0 +1,675 @@ + + + diff --git a/src/views/mdm/material/Detail.vue b/src/views/mdm/material/Detail.vue new file mode 100644 index 0000000..187fac0 --- /dev/null +++ b/src/views/mdm/material/Detail.vue @@ -0,0 +1,255 @@ + + diff --git a/src/views/mdm/material/Form.vue b/src/views/mdm/material/Form.vue new file mode 100644 index 0000000..1fd649d --- /dev/null +++ b/src/views/mdm/material/Form.vue @@ -0,0 +1,498 @@ + + diff --git a/src/views/mdm/material/helper/api.ts b/src/views/mdm/material/helper/api.ts new file mode 100644 index 0000000..431af6d --- /dev/null +++ b/src/views/mdm/material/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/Material/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/Material', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/Material/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/Material/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/Material/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/Material/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/Material/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/Material/Actions/Export', data }); +} diff --git a/src/views/mdm/material/helper/columnList.ts b/src/views/mdm/material/helper/columnList.ts new file mode 100644 index 0000000..57504dc --- /dev/null +++ b/src/views/mdm/material/helper/columnList.ts @@ -0,0 +1,628 @@ +const columnList = [ + { + "yunzhupaasKey":"billRule", + "resizable":true, + "fullName":"物料编码", + "fullNameI18nCode":[ + "" + ], + "label":"物料编码", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem8ccf90", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"materialCode", + "className":[], + "label":"物料编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013211756, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"物料编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":12 + }, + "readonly":true, + "prop":"material_code", + "width":null, + "__vModel__":"material_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "id":"material_code", + "placeholder":"系统自动生成", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem83c40d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"物料名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777008057645, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"material_name", + "__vModel__":"material_name", + "disabled":false, + "id":"material_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"物料名称", + "label":"物料名称", + "sortable":true, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"cascader", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"物料分类", + "fullNameI18nCode":[ + "" + ], + "label":"物料分类", + "sortable":true, + "align":"left", + "props":{ + "children":"children", + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013275790, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItem493db2", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"materialCategory", + "tipLabel":"", + "tableFixed":"none", + "label":"物料分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"material_category", + "width":null, + "options":[], + "__vModel__":"material_category", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"material_category", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemb35646", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"单位名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013263798, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"unit_name", + "__vModel__":"unit_name", + "disabled":false, + "id":"unit_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"单位名称", + "label":"单位名称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemb369a1", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"材质/纹理", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013303007, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"texture", + "__vModel__":"texture", + "disabled":false, + "id":"texture", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"材质/纹理", + "label":"材质/纹理", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItembbc1a2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"规格型号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777014869849, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"material_model", + "__vModel__":"material_model", + "disabled":false, + "id":"material_model", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"规格型号", + "label":"规格型号", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem8c9279", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"品牌", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013311315, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"brand", + "__vModel__":"brand", + "disabled":false, + "id":"brand", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"品牌", + "label":"品牌", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"税率", + "fullNameI18nCode":[ + "" + ], + "label":"税率", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777014805432, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemd0f934", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"817378654752342789", + "tipLabel":"", + "tableFixed":"none", + "label":"税率", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"tax_rate", + "width":null, + "options":[], + "__vModel__":"tax_rate", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_rate", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"cascader", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"税收分类", + "fullNameI18nCode":[ + "" + ], + "label":"税收分类", + "sortable":false, + "align":"left", + "props":{ + "children":"children", + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777014893882, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItem0b34b4", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"taxCode", + "tipLabel":"", + "tableFixed":"none", + "label":"税收分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"tax_code", + "width":null, + "options":[], + "__vModel__":"tax_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_code", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default columnList \ No newline at end of file diff --git a/src/views/mdm/material/helper/searchList.ts b/src/views/mdm/material/helper/searchList.ts new file mode 100644 index 0000000..8670075 --- /dev/null +++ b/src/views/mdm/material/helper/searchList.ts @@ -0,0 +1,149 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem83c40d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"物料名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777008057645, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"material_name", + "__vModel__":"material_name", + "searchMultiple":false, + "disabled":false, + "id":"material_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "searchType":2, + "maxlength":null, + "fullName":"物料名称", + "label":"物料名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":false, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItembbc1a2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"规格型号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777014869849, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"material_model", + "__vModel__":"material_model", + "searchMultiple":false, + "disabled":false, + "id":"material_model", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "searchType":2, + "maxlength":null, + "fullName":"规格型号", + "label":"规格型号", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":false, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + } +] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/material/helper/superQueryJson.ts b/src/views/mdm/material/helper/superQueryJson.ts new file mode 100644 index 0000000..23f9a0a --- /dev/null +++ b/src/views/mdm/material/helper/superQueryJson.ts @@ -0,0 +1,813 @@ +const superQueryJson = [ + { + "__config__":{ + "formId":"formItem8ccf90", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"materialCode", + "className":[], + "label":"物料编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013211756, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"物料编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":12 + }, + "readonly":true, + "__vModel__":"material_code", + "fullName":"物料编码", + "fullNameI18nCode":[ + "" + ], + "style":{ + "width":"100%" + }, + "id":"material_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"物料名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem83c40d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"物料名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777008057645, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"material_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"material_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"物料分类", + "fullNameI18nCode":[ + "" + ], + "props":{ + "children":"children", + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013275790, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItem493db2", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"materialCategory", + "tipLabel":"", + "tableFixed":"none", + "label":"物料分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"material_category", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"material_category", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"规格型号", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItembbc1a2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"规格型号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777014869849, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"material_model", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"material_model", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"单位名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemb35646", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"单位名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013263798, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"unit_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"unit_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"品牌", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem8c9279", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"品牌", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013311315, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"brand", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"brand", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"税率", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777014805432, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemd0f934", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"817378654752342789", + "tipLabel":"", + "tableFixed":"none", + "label":"税率", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"tax_rate", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_rate", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"税收分类", + "fullNameI18nCode":[ + "" + ], + "props":{ + "children":"children", + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777014893882, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItem0b34b4", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"taxCode", + "tipLabel":"", + "tableFixed":"none", + "label":"税收分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"tax_code", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_code", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"材质/纹理", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemb369a1", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"材质/纹理", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013303007, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"texture", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"texture", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"质量标准", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem5b262b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"质量标准", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013318024, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"quality_standard", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"quality_standard", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"技术标准", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem8f3df1", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"技术标准", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013366266, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"technical_standard", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"technical_standard", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"验收标准", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItemb1305e", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"验收标准", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013375099, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"acceptance_criteria", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"acceptance_criteria", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"交付要求", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItemf44c38", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"交付要求", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013396926, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"delivery_requirements", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"delivery_requirements", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"储存条件", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem4fad6e", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"储存条件", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_material", + "renderKey":1777013402484, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"storage_conditions", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"storage_conditions", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default superQueryJson \ No newline at end of file diff --git a/src/views/mdm/material/index.vue b/src/views/mdm/material/index.vue new file mode 100644 index 0000000..e085a9b --- /dev/null +++ b/src/views/mdm/material/index.vue @@ -0,0 +1,726 @@ + + + diff --git a/src/views/mdm/product/Detail.vue b/src/views/mdm/product/Detail.vue new file mode 100644 index 0000000..263a58e --- /dev/null +++ b/src/views/mdm/product/Detail.vue @@ -0,0 +1,343 @@ + + diff --git a/src/views/mdm/product/Form.vue b/src/views/mdm/product/Form.vue new file mode 100644 index 0000000..af130c3 --- /dev/null +++ b/src/views/mdm/product/Form.vue @@ -0,0 +1,618 @@ + + diff --git a/src/views/mdm/product/helper/api.ts b/src/views/mdm/product/helper/api.ts new file mode 100644 index 0000000..144e654 --- /dev/null +++ b/src/views/mdm/product/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/Products/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/Products', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/Products/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/Products/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/Products/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/Products/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/Products/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/Products/Actions/Export', data }); +} diff --git a/src/views/mdm/product/helper/columnList.ts b/src/views/mdm/product/helper/columnList.ts new file mode 100644 index 0000000..504dbdf --- /dev/null +++ b/src/views/mdm/product/helper/columnList.ts @@ -0,0 +1,1358 @@ +const columnList = [ + { + "yunzhupaasKey":"billRule", + "resizable":true, + "fullName":"商品编码", + "fullNameI18nCode":[ + "" + ], + "label":"商品编码", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem8978c9", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"productCode", + "className":[], + "label":"商品编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777015748420, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"商品编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":12 + }, + "readonly":true, + "prop":"product_code", + "width":null, + "__vModel__":"product_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "id":"product_code", + "placeholder":"系统自动生成", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem388306", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商品名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_product", + "renderKey":1777015778372, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"product_name", + "__vModel__":"product_name", + "disabled":false, + "id":"product_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"商品名称", + "label":"商品名称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"商品类型", + "fullNameI18nCode":[ + "" + ], + "label":"商品类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_product", + "renderKey":1777016063171, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemfede94", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"productType", + "tipLabel":"", + "tableFixed":"none", + "label":"商品类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"product_type", + "width":null, + "options":[], + "__vModel__":"product_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"product_type", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"cascader", + "filterable":true, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"商品分类", + "fullNameI18nCode":[ + "" + ], + "label":"商品分类", + "sortable":false, + "align":"left", + "props":{ + "children":"children", + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_product", + "renderKey":1777016020981, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItema7e5eb", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"productCategory", + "tipLabel":"", + "tableFixed":"none", + "label":"商品分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"product_category", + "width":null, + "options":[], + "__vModel__":"product_category", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"product_category", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem77df66", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商品简称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777015813586, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"short_name", + "__vModel__":"short_name", + "disabled":false, + "id":"short_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"商品简称", + "label":"商品简称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem990d79", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"品牌", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777015990788, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"brand", + "__vModel__":"brand", + "disabled":false, + "id":"brand", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"品牌", + "label":"品牌", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemffeec4", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"规格型号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016647380, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"product_model", + "__vModel__":"product_model", + "disabled":false, + "id":"product_model", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"规格型号", + "label":"规格型号", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem01dbb3", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"颜色", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016185738, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"color", + "__vModel__":"color", + "disabled":false, + "id":"color", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"颜色", + "label":"颜色", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem813de2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"尺寸/规格", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016206973, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"product_size", + "__vModel__":"product_size", + "disabled":false, + "id":"product_size", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"尺寸/规格", + "label":"尺寸/规格", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formIteme04c5d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"重量", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016212624, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"weight", + "__vModel__":"weight", + "disabled":false, + "id":"weight", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"重量", + "label":"重量", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":4, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItemb270cb", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"最小起订量", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016935479, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"min_order_quantity", + "__vModel__":"min_order_quantity", + "disabled":false, + "id":"min_order_quantity", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "fullName":"最小起订量", + "label":"最小起订量", + "sortable":false, + "thousands":false, + "addonAfter":"", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":2, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItem3a8055", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"标准销售单价", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016944560, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"standard_sales_price", + "__vModel__":"standard_sales_price", + "disabled":false, + "id":"standard_sales_price", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "fullName":"标准销售单价", + "label":"标准销售单价", + "sortable":false, + "thousands":false, + "addonAfter":"元", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":4, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItemb1a46c", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"毛重", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016995149, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"gross_weight", + "__vModel__":"gross_weight", + "disabled":false, + "id":"gross_weight", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "fullName":"毛重", + "label":"毛重", + "sortable":false, + "thousands":false, + "addonAfter":"KG", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":4, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItem0ff3be", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"净重", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016999511, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"net_weight", + "__vModel__":"net_weight", + "disabled":false, + "id":"net_weight", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "fullName":"净重", + "label":"净重", + "sortable":false, + "thousands":false, + "addonAfter":"KG", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formIteme0cfab", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"单位名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016218388, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"unit_name", + "__vModel__":"unit_name", + "disabled":false, + "id":"unit_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"单位名称", + "label":"单位名称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemcfb8fe", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"包装尺寸", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016338579, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"packagesize", + "__vModel__":"packagesize", + "disabled":false, + "id":"packagesize", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"包装尺寸", + "label":"包装尺寸", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":2, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItem0d3a1f", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"成本价", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777017076802, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"cost_price", + "__vModel__":"cost_price", + "disabled":false, + "id":"cost_price", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "fullName":"成本价", + "label":"成本价", + "sortable":false, + "thousands":false, + "addonAfter":"元", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "resizable":true, + "fullName":"保修期", + "fullNameI18nCode":[ + "" + ], + "label":"保修期", + "sortable":false, + "align":"left", + "thousands":false, + "isAmountChinese":false, + "addonAfter":"月", + "__config__":{ + "formId":"formItemfe52ba", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"保修期", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777017256548, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"warranty_period", + "width":null, + "__vModel__":"warranty_period", + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"warranty_period", + "placeholder":"请输入", + "addonBefore":"", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"税率", + "fullNameI18nCode":[ + "" + ], + "label":"税率", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016371157, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem601a00", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"817378654752342789", + "tipLabel":"", + "tableFixed":"none", + "label":"税率", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"tax_rate", + "width":null, + "options":[], + "__vModel__":"tax_rate", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_rate", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"cascader", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"税收分类", + "fullNameI18nCode":[ + "" + ], + "label":"税收分类", + "sortable":false, + "align":"left", + "props":{ + "children":"children", + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016375009, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItemecba02", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"taxCode", + "tipLabel":"", + "tableFixed":"none", + "label":"税收分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"tax_code", + "width":null, + "options":[], + "__vModel__":"tax_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_code", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default columnList \ No newline at end of file diff --git a/src/views/mdm/product/helper/searchList.ts b/src/views/mdm/product/helper/searchList.ts new file mode 100644 index 0000000..141dc7d --- /dev/null +++ b/src/views/mdm/product/helper/searchList.ts @@ -0,0 +1,217 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem388306", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商品名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_product", + "renderKey":1777015778372, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"product_name", + "__vModel__":"product_name", + "searchMultiple":false, + "disabled":false, + "id":"product_name", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "searchType":2, + "maxlength":null, + "fullName":"商品名称", + "label":"商品名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":false, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"cascader", + "filterable":true, + "clearable":true, + "searchType":1, + "multiple":false, + "fullName":"商品分类", + "fullNameI18nCode":[ + "" + ], + "label":"商品分类", + "props":{ + "children":"children", + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_product", + "renderKey":1777016020981, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItema7e5eb", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"productCategory", + "tipLabel":"", + "tableFixed":"none", + "label":"商品分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"product_category", + "options":[ + { + "enCode":"10.10", + "children":[ + { + "enCode":"10", + "children":null, + "hasChildren":false, + "fullName":"核心发电单元", + "id":"817364726802547461", + "parentId":"817364810650878725" + } + ], + "hasChildren":true, + "fullName":"光伏组件", + "id":"817364810650878725", + "parentId":"0" + }, + { + "enCode":"20", + "children":[ + { + "enCode":"20.10", + "children":null, + "hasChildren":false, + "fullName":"逆变器", + "id":"817364973343736581", + "parentId":"817364893576463109" + }, + { + "enCode":"20.20", + "children":null, + "hasChildren":false, + "fullName":"光伏控制器", + "id":"817365033645245189", + "parentId":"817364893576463109" + } + ], + "hasChildren":true, + "fullName":"电力转换与控制系统", + "id":"817364893576463109", + "parentId":"0" + }, + { + "enCode":"30", + "children":[ + { + "enCode":"30.10", + "children":null, + "hasChildren":false, + "fullName":"直流侧设备", + "id":"817365215380243205", + "parentId":"817365130466558725" + }, + { + "enCode":"30.20", + "children":null, + "hasChildren":false, + "fullName":"交流侧设备", + "id":"817365288625373957", + "parentId":"817365130466558725" + }, + { + "enCode":"30.30", + "children":null, + "hasChildren":false, + "fullName":"电缆及桥架", + "id":"817365357449708293", + "parentId":"817365130466558725" + } + ], + "hasChildren":true, + "fullName":"电气配套与汇流设备", + "id":"817365130466558725", + "parentId":"0" + } + ], + "__vModel__":"product_category", + "searchMultiple":false, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"product_category", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/product/helper/superQueryJson.ts b/src/views/mdm/product/helper/superQueryJson.ts new file mode 100644 index 0000000..f2c6c9e --- /dev/null +++ b/src/views/mdm/product/helper/superQueryJson.ts @@ -0,0 +1,1278 @@ +const superQueryJson = [ + { + "__config__":{ + "formId":"formItem8978c9", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"productCode", + "className":[], + "label":"商品编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777015748420, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"商品编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":12 + }, + "readonly":true, + "__vModel__":"product_code", + "fullName":"商品编码", + "fullNameI18nCode":[ + "" + ], + "style":{ + "width":"100%" + }, + "id":"product_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"商品名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem388306", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商品名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_product", + "renderKey":1777015778372, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"product_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"product_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"商品类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_product", + "renderKey":1777016063171, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemfede94", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"productType", + "tipLabel":"", + "tableFixed":"none", + "label":"商品类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"product_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"product_type", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":true, + "clearable":true, + "multiple":false, + "fullName":"商品分类", + "fullNameI18nCode":[ + "" + ], + "props":{ + "children":"children", + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_product", + "renderKey":1777016020981, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItema7e5eb", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"productCategory", + "tipLabel":"", + "tableFixed":"none", + "label":"商品分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"product_category", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"product_category", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"商品简称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem77df66", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商品简称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777015813586, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"short_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"short_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"品牌", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem990d79", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"品牌", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777015990788, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"brand", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"brand", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"规格型号", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemffeec4", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"规格型号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016647380, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"product_model", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"product_model", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"颜色", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem01dbb3", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"颜色", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016185738, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"color", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"color", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"尺寸/规格", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem813de2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"尺寸/规格", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016206973, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"product_size", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"product_size", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"重量", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formIteme04c5d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"重量", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016212624, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"weight", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"weight", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "precision":4, + "fullName":"最小起订量", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"", + "__config__":{ + "formId":"formItemb270cb", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"最小起订量", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016935479, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"min_order_quantity", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"min_order_quantity", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "precision":2, + "fullName":"标准销售单价", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"元", + "__config__":{ + "formId":"formItem3a8055", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"标准销售单价", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016944560, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"standard_sales_price", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"standard_sales_price", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "precision":4, + "fullName":"毛重", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"KG", + "__config__":{ + "formId":"formItemb1a46c", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"毛重", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016995149, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"gross_weight", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"gross_weight", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "precision":4, + "fullName":"净重", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"KG", + "__config__":{ + "formId":"formItem0ff3be", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"净重", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016999511, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"net_weight", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"net_weight", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"单位名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formIteme0cfab", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"单位名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016218388, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"unit_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"unit_name", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "useScan":false, + "suffixIcon":"", + "fullName":"包装尺寸", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemcfb8fe", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"包装尺寸", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016338579, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"packagesize", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"packagesize", + "placeholder":"请输入", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "precision":2, + "fullName":"成本价", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"元", + "__config__":{ + "formId":"formItem0d3a1f", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"成本价", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777017076802, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"cost_price", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"cost_price", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "fullName":"保修期", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"月", + "__config__":{ + "formId":"formItemfe52ba", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"保修期", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777017256548, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"warranty_period", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"warranty_period", + "placeholder":"请输入", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"税率", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016371157, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem601a00", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"817378654752342789", + "tipLabel":"", + "tableFixed":"none", + "label":"税率", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"tax_rate", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_rate", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"税收分类", + "fullNameI18nCode":[ + "" + ], + "props":{ + "children":"children", + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"cascader", + "defaultValue":[], + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777016375009, + "tagIcon":"icon-ym icon-ym-generator-cascader", + "tag":"YunzhupaasCascader", + "formId":"formItemecba02", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"taxCode", + "tipLabel":"", + "tableFixed":"none", + "label":"税收分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"tax_code", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_code", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"保修条款", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":4 + }, + "showCount":false, + "__config__":{ + "formId":"formItem542030", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"保修条款", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777017312713, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"warranty_terms", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"warranty_terms", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":4 + }, + "showCount":false, + "__config__":{ + "formId":"formItemdd92df", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_product", + "renderKey":1777017339245, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"remark", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default superQueryJson \ No newline at end of file diff --git a/src/views/mdm/product/index.vue b/src/views/mdm/product/index.vue new file mode 100644 index 0000000..5cacb0b --- /dev/null +++ b/src/views/mdm/product/index.vue @@ -0,0 +1,703 @@ + + + diff --git a/src/views/mdm/suppinfo/Detail.vue b/src/views/mdm/suppinfo/Detail.vue new file mode 100644 index 0000000..2475d72 --- /dev/null +++ b/src/views/mdm/suppinfo/Detail.vue @@ -0,0 +1,1170 @@ + + diff --git a/src/views/mdm/suppinfo/Form.vue b/src/views/mdm/suppinfo/Form.vue new file mode 100644 index 0000000..0519213 --- /dev/null +++ b/src/views/mdm/suppinfo/Form.vue @@ -0,0 +1,2072 @@ + + diff --git a/src/views/mdm/suppinfo/helper/api.ts b/src/views/mdm/suppinfo/helper/api.ts new file mode 100644 index 0000000..bf9195b --- /dev/null +++ b/src/views/mdm/suppinfo/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/Suppinfo/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/Suppinfo', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/Suppinfo/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/Suppinfo/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/Suppinfo/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/Suppinfo/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/Suppinfo/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/Suppinfo/Actions/Export', data }); +} diff --git a/src/views/mdm/suppinfo/helper/columnList.ts b/src/views/mdm/suppinfo/helper/columnList.ts new file mode 100644 index 0000000..11bb0c9 --- /dev/null +++ b/src/views/mdm/suppinfo/helper/columnList.ts @@ -0,0 +1,1650 @@ +const columnList = [ + { + "yunzhupaasKey":"billRule", + "resizable":true, + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "label":"企业编码", + "sortable":true, + "align":"left", + "__config__":{ + "formId":"formItem7a91b8", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"CustomerCompanyCode", + "className":[], + "label":"企业编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776916036468, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"客户编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":8 + }, + "readonly":true, + "prop":"company_code", + "width":null, + "__vModel__":"company_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "id":"company_code", + "placeholder":"系统自动生成", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_name", + "__vModel__":"company_name", + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"企业名称", + "label":"企业名称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem84e51c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506482631, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"short_name", + "__vModel__":"short_name", + "disabled":false, + "id":"short_name", + "placeholder":"请输入简称/昵称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":50, + "fullName":"简称/昵称", + "label":"简称/昵称", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "label":"归属组织", + "sortable":true, + "align":"left", + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"org_id", + "width":null, + "__vModel__":"org_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"radio", + "resizable":true, + "buttonStyle":"solid", + "fullName":"类型", + "fullNameI18nCode":[ + "" + ], + "label":"类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"ORG", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506487223, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItemb3f6cd", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "size":"default", + "prop":"entity_type", + "width":null, + "options":[ + { + "fullName":"企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem10350c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506494880, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"credit_code", + "__vModel__":"credit_code", + "disabled":false, + "id":"credit_code", + "placeholder":"请输入社会信用代码", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"社会信用代码", + "label":"社会信用代码", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"纳税人类别", + "fullNameI18nCode":[ + "" + ], + "label":"纳税人类别", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503586, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem05d07f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"tax_type", + "width":null, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_type", + "placeholder":"请选择纳税人类别", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"供应商级别", + "fullNameI18nCode":[ + "" + ], + "label":"供应商级别", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776918157184, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem379bfe", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"供应商级别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_level", + "width":null, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_level", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_level", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"供应商类型", + "fullNameI18nCode":[ + "" + ], + "label":"供应商类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776918191565, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem68763d", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"供应商类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_type", + "width":null, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_type", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"供应商分类", + "fullNameI18nCode":[ + "" + ], + "label":"供应商分类", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776944232887, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItembc9eef", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"供应商分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_category", + "width":null, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_category", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_category", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem4f2d0b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524679, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"legal_representative", + "__vModel__":"legal_representative", + "disabled":false, + "id":"legal_representative", + "placeholder":"请输入法定代表人", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":50, + "fullName":"法定代表人", + "label":"法定代表人", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"企业规模", + "fullNameI18nCode":[ + "" + ], + "label":"企业规模", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503806, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem66e88f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797424039713832965", + "tipLabel":"", + "tableFixed":"none", + "label":"企业规模", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"enterprise_scale", + "width":null, + "options":[], + "__vModel__":"enterprise_scale", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_scale", + "placeholder":"请选择企业规模", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"企业类型", + "fullNameI18nCode":[ + "" + ], + "label":"企业类型", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506504118, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItema76b83", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"9b542177a477488994ce09fff3c93901", + "tipLabel":"", + "tableFixed":"none", + "label":"企业类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"enterprise_nature", + "width":null, + "options":[], + "__vModel__":"enterprise_nature", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_nature", + "placeholder":"请选择企业类型", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"行业代码", + "fullNameI18nCode":[ + "" + ], + "label":"行业代码", + "sortable":false, + "align":"left", + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506507062, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem6bd8a7", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"d59a3cf65f9847dbb08be449e3feae16", + "tipLabel":"", + "tableFixed":"none", + "label":"行业代码", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"industry_code", + "width":null, + "options":[], + "__vModel__":"industry_code", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"industry_code", + "placeholder":"请选择行业代码", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "resizable":true, + "format":"yyyy-MM-dd", + "fullName":"成立日期", + "fullNameI18nCode":[ + "" + ], + "label":"成立日期", + "sortable":false, + "align":"left", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506509988, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItembab00e", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"成立日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"registration_date", + "width":null, + "__vModel__":"registration_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"registration_date", + "placeholder":"请选择成立日期", + "endTime":null, + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":4, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItem3134b1", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"注册资本", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506514957, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"registered_capital", + "__vModel__":"registered_capital", + "disabled":false, + "id":"registered_capital", + "placeholder":"请输入注册资本", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "resizable":true, + "max":999999, + "fullName":"注册资本", + "label":"注册资本", + "sortable":false, + "thousands":false, + "addonAfter":"万元", + "width":null, + "fixed":"none", + "style":{ + "width":"100%" + }, + "step":1, + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem97bd9d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524966, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$|^0\\d{2,3}-?\\d{7,8}$/", + "message":"请输入正确的电话号码", + "messageI18nCode":"sys.validate.telephone" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"phone", + "__vModel__":"phone", + "disabled":false, + "id":"phone", + "placeholder":"请输入联系电话", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":11, + "fullName":"联系电话", + "label":"联系电话", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem439010", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506525554, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/", + "message":"请输入正确的邮箱", + "messageI18nCode":"sys.validate.email" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"email", + "__vModel__":"email", + "disabled":false, + "id":"email", + "placeholder":"请输入邮箱", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"邮箱", + "label":"邮箱", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem7fa940", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528130, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"website", + "__vModel__":"website", + "disabled":false, + "id":"website", + "placeholder":"请输入网站", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"网站", + "label":"网站", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem5b2d2b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528353, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"address", + "__vModel__":"address", + "disabled":false, + "id":"address", + "placeholder":"请输入地址", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"地址", + "label":"地址", + "sortable":false, + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "width":null, + "useMask":false, + "showPassword":false, + "fixed":"none", + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"areaSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "label":"所属地区", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItemcc9deb", + "yunzhupaasKey":"areaSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"所属地区", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507118587, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-Provinces", + "tag":"YunzhupaasAreaSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"province_id", + "width":null, + "__vModel__":"province_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"province_id", + "placeholder":"请选择所属地区", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"textarea", + "clearable":true, + "resizable":true, + "maxlength":200, + "fullName":"经营范围", + "fullNameI18nCode":[ + "" + ], + "label":"经营范围", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem8cbf03", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"经营范围", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534652, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"business_scope", + "width":null, + "__vModel__":"business_scope", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"business_scope", + "placeholder":"请输入经营范围", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "ableRelationIds":[], + "yunzhupaasKey":"userSelect", + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"责任人", + "fullNameI18nCode":[ + "" + ], + "label":"责任人", + "sortable":false, + "align":"left", + "relationField":"", + "__config__":{ + "formId":"formItemf4ca17", + "yunzhupaasKey":"userSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"责任人", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_supplier", + "renderKey":1776918111506, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-user", + "defaultCurrent":true, + "tag":"YunzhupaasUserSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"yunzhupaas_mdm_supplier_yunzhupaas_major_person_id", + "width":null, + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_major_person_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_major_person_id", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"textarea", + "clearable":true, + "resizable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "label":"备注", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem9f5e00", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534863, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"remark", + "width":null, + "__vModel__":"remark", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入备注", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default columnList \ No newline at end of file diff --git a/src/views/mdm/suppinfo/helper/searchList.ts b/src/views/mdm/suppinfo/helper/searchList.ts new file mode 100644 index 0000000..f1c4163 --- /dev/null +++ b/src/views/mdm/suppinfo/helper/searchList.ts @@ -0,0 +1,133 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_name", + "__vModel__":"company_name", + "searchMultiple":false, + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "clearable":true, + "searchType":2, + "maxlength":200, + "fullName":"企业名称", + "label":"企业名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":false, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"organizeSelect", + "filterable":false, + "clearable":true, + "searchType":1, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "label":"归属组织", + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "prop":"org_id", + "__vModel__":"org_id", + "searchMultiple":true, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "value":[], + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/suppinfo/helper/superQueryJson.ts b/src/views/mdm/suppinfo/helper/superQueryJson.ts new file mode 100644 index 0000000..a30ff70 --- /dev/null +++ b/src/views/mdm/suppinfo/helper/superQueryJson.ts @@ -0,0 +1,2631 @@ +const superQueryJson = [ + { + "__config__":{ + "formId":"formItem7a91b8", + "yunzhupaasKey":"billRule", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "rule":"CustomerCompanyCode", + "className":[], + "label":"企业编码", + "trigger":"change", + "ruleConfig":{}, + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776916036468, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "ruleName":"客户编码", + "tag":"YunzhupaasInput", + "tableAlign":"left", + "span":8 + }, + "readonly":true, + "__vModel__":"company_code", + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "style":{ + "width":"100%" + }, + "id":"company_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"企业名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem478e5c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506482470, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"company_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_name", + "placeholder":"请输入企业名称", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"简称/昵称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem84e51c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506482631, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"short_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"short_name", + "placeholder":"请输入简称/昵称", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "buttonStyle":"solid", + "fullName":"类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"ORG", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506487223, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItemb3f6cd", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "size":"default", + "options":[ + { + "fullName":"企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"社会信用代码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem10350c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774506494880, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"credit_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"credit_code", + "placeholder":"请输入社会信用代码", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItemfc6848", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1776912270086, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"org_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"org_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItemcc9deb", + "yunzhupaasKey":"areaSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"所属地区", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507118587, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-Provinces", + "tag":"YunzhupaasAreaSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"province_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"province_id", + "placeholder":"请选择所属地区", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"纳税人类别", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503586, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem05d07f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tax_type", + "placeholder":"请选择纳税人类别", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业规模", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506503806, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem66e88f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797424039713832965", + "tipLabel":"", + "tableFixed":"none", + "label":"企业规模", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"enterprise_scale", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_scale", + "placeholder":"请选择企业规模", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"企业类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506504118, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItema76b83", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"9b542177a477488994ce09fff3c93901", + "tipLabel":"", + "tableFixed":"none", + "label":"企业类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"enterprise_nature", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"enterprise_nature", + "placeholder":"请选择企业类型", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"行业代码", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506507062, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem6bd8a7", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"d59a3cf65f9847dbb08be449e3feae16", + "tipLabel":"", + "tableFixed":"none", + "label":"行业代码", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"industry_code", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"industry_code", + "placeholder":"请选择行业代码", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "format":"yyyy-MM-dd", + "fullName":"成立日期", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506509988, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItembab00e", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "endTimeTarget":1, + "tipLabel":"", + "tableFixed":"none", + "startTimeType":1, + "endTimeRule":false, + "label":"成立日期", + "trigger":"change", + "startTimeRule":false, + "startTimeValue":null, + "endTimeValue":null, + "endTimeType":1, + "layout":"colFormItem", + "startTimeTarget":1, + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"registration_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"registration_date", + "placeholder":"请选择成立日期", + "endTime":null, + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "max":999999, + "precision":4, + "fullName":"注册资本", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"万元", + "__config__":{ + "formId":"formItem3134b1", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"注册资本", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506514957, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"registered_capital", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"registered_capital", + "placeholder":"请输入注册资本", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"法定代表人", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem4f2d0b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524679, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"legal_representative", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"legal_representative", + "placeholder":"请输入法定代表人", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":11, + "useScan":false, + "suffixIcon":"", + "fullName":"联系电话", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem97bd9d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506524966, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$|^0\\d{2,3}-?\\d{7,8}$/", + "message":"请输入正确的电话号码", + "messageI18nCode":"sys.validate.telephone" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"phone", + "placeholder":"请输入联系电话", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"邮箱", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem439010", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506525554, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/", + "message":"请输入正确的邮箱", + "messageI18nCode":"sys.validate.email" + } + ], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"email", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"email", + "placeholder":"请输入邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":100, + "useScan":false, + "suffixIcon":"", + "fullName":"网站", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem7fa940", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528130, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"website", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"website", + "placeholder":"请输入网站", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"地址", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem5b2d2b", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506528353, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"address", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"address", + "placeholder":"请输入地址", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "fullName":"经营范围", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem8cbf03", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"经营范围", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534652, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"business_scope", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"business_scope", + "placeholder":"请输入经营范围", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "ableRelationIds":[], + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"责任人", + "fullNameI18nCode":[ + "" + ], + "relationField":"", + "__config__":{ + "formId":"formItemf4ca17", + "yunzhupaasKey":"userSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"责任人", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"mdm_supplier", + "renderKey":1776918111506, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-user", + "defaultCurrent":true, + "tag":"YunzhupaasUserSelect", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_major_person_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_major_person_id", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"供应商级别", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776918157184, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem379bfe", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"供应商级别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_level", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_level", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"供应商类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776918191565, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem68763d", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"供应商类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_type", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"供应商分类", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776944232887, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItembc9eef", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"供应商分类", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_category", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_supplier_category", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"荣誉、资质", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem108619", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"荣誉、资质", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776944281798, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_honor", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_honor", + "placeholder":"请输入备注", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"供应商业绩", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem237f5f", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"供应商业绩", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776944313831, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_achievement", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_achievement", + "placeholder":"请输入备注", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"完工项目", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem0c9119", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"完工项目", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_supplier", + "renderKey":1776944334228, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"yunzhupaas_mdm_supplier_yunzhupaas_finish_project", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"yunzhupaas_mdm_supplier_yunzhupaas_finish_project", + "placeholder":"请输入备注", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":null, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem9f5e00", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506534863, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"remark", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"remark", + "placeholder":"请输入备注", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"billRule", + "defaultValue":null, + "parentVModel":"tableField46dc53", + "dragDisabled":false, + "rule":"InvoiceTitleCode", + "className":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754320599, + "tagIcon":"icon-ym icon-ym-generator-documents", + "ruleType":1, + "isSubTable":true, + "ruleName":"发票抬头编码", + "tag":"YunzhupaasInput", + "formId":"formItem57f1d4", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "label":"发票抬头编码", + "trigger":"change", + "ruleConfig":{}, + "layout":"colFormItem", + "tableAlign":"left", + "span":24 + }, + "readonly":true, + "__vModel__":"title_code", + "fullName":"设计子表-发票抬头编码", + "fullNameI18nCode":[ + "", + "" + ], + "style":{ + "width":"100%" + }, + "id":"tableField46dc53-title_code", + "placeholder":"系统自动生成" + }, + { + "clearable":true, + "maxlength":10, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-发票抬头名称", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItema8b1f4", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"发票抬头名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507383593, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"title_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-title_name", + "placeholder":"请输入联系人", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-纳税人识别号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1963f0", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"纳税人识别号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507440273, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"credit_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-credit_code", + "placeholder":"请输入联系人职务", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"设计子表-纳税人类别", + "fullNameI18nCode":[ + "", + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"select", + "defaultValue":"", + "parentVModel":"tableField46dc53", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754396382, + "tagIcon":"icon-ym icon-ym-generator-select", + "isSubTable":true, + "tag":"YunzhupaasSelect", + "formId":"formItemb3492f", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"纳税人类别", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[ + { + "fullName":"一般纳税人", + "id":"GENERAL" + }, + { + "fullName":"小规模纳税人", + "id":"SMALL" + } + ], + "__vModel__":"tax_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-tax_type", + "placeholder":"请选择纳税人类别", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-地址", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItema9aaf2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507448061, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"address", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-address", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-电话", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItemf8b766", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754421983, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-phone", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户银行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1730ca", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户银行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754433217, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-bank_name", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-银行账户", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem1089bb", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账户", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754444839, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-bank_account", + "placeholder":"请输入联系人邮箱", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "formId":"formItem4743e7", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"是否默认", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754525239, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "isSubTable":true, + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"is_defalut", + "fullName":"设计子表-是否默认", + "inactiveTxt":"关", + "fullNameI18nCode":[ + "", + "" + ], + "disabled":false, + "activeTxt":"开", + "id":"tableField46dc53-is_defalut", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "formId":"formItema2b4cf", + "relationTable":"mdm_company_invoice", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"是否有效", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1776754540042, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "isSubTable":true, + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"is_valid", + "fullName":"设计子表-是否有效", + "inactiveTxt":"关", + "fullNameI18nCode":[ + "", + "" + ], + "disabled":false, + "activeTxt":"开", + "id":"tableField46dc53-is_valid", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_invoice", + "formId":"formItem560a27", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableField46dc53", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507449005, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"remark", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-remark", + "placeholder":"请输入备注", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem3756b9", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507591361, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_name", + "placeholder":"请输入开户行", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-账户名", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemf42745", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"账户名", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507611465, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_account_name", + "placeholder":"请输入账户名", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-银行账号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem8abffe", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507627371, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_account_number", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_account_number", + "placeholder":"请输入银行账号", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":20, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-开户行城市", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemb870cb", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行城市", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507627772, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"bank_province", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-bank_province", + "placeholder":"请输入开户行城市", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItemf22092", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldad9d92", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774507628423, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "isSubTable":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"remark", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldad9d92-remark", + "placeholder":"请输入备注", + "prefixIcon":"", + "addonBefore":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}", + "blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + } +] +export default superQueryJson \ No newline at end of file diff --git a/src/views/mdm/suppinfo/index.vue b/src/views/mdm/suppinfo/index.vue new file mode 100644 index 0000000..3025266 --- /dev/null +++ b/src/views/mdm/suppinfo/index.vue @@ -0,0 +1,675 @@ + + + diff --git a/src/views/msgCenter/accountConfig/emailConfig/Form.vue b/src/views/msgCenter/accountConfig/emailConfig/Form.vue new file mode 100644 index 0000000..aa9abdb --- /dev/null +++ b/src/views/msgCenter/accountConfig/emailConfig/Form.vue @@ -0,0 +1,165 @@ + + diff --git a/src/views/msgCenter/accountConfig/emailConfig/Test.vue b/src/views/msgCenter/accountConfig/emailConfig/Test.vue new file mode 100644 index 0000000..984a6f9 --- /dev/null +++ b/src/views/msgCenter/accountConfig/emailConfig/Test.vue @@ -0,0 +1,71 @@ + + diff --git a/src/views/msgCenter/accountConfig/emailConfig/index.vue b/src/views/msgCenter/accountConfig/emailConfig/index.vue new file mode 100644 index 0000000..3f0ec1f --- /dev/null +++ b/src/views/msgCenter/accountConfig/emailConfig/index.vue @@ -0,0 +1,125 @@ + + diff --git a/src/views/msgCenter/accountConfig/smsConfig/Form.vue b/src/views/msgCenter/accountConfig/smsConfig/Form.vue new file mode 100644 index 0000000..066ed77 --- /dev/null +++ b/src/views/msgCenter/accountConfig/smsConfig/Form.vue @@ -0,0 +1,226 @@ + + diff --git a/src/views/msgCenter/accountConfig/smsConfig/index.vue b/src/views/msgCenter/accountConfig/smsConfig/index.vue new file mode 100644 index 0000000..7b38f7b --- /dev/null +++ b/src/views/msgCenter/accountConfig/smsConfig/index.vue @@ -0,0 +1,137 @@ + + diff --git a/src/views/msgCenter/accountConfig/webhookConfig/Form.vue b/src/views/msgCenter/accountConfig/webhookConfig/Form.vue new file mode 100644 index 0000000..1f74f5b --- /dev/null +++ b/src/views/msgCenter/accountConfig/webhookConfig/Form.vue @@ -0,0 +1,154 @@ + + diff --git a/src/views/msgCenter/accountConfig/webhookConfig/index.vue b/src/views/msgCenter/accountConfig/webhookConfig/index.vue new file mode 100644 index 0000000..75f7a69 --- /dev/null +++ b/src/views/msgCenter/accountConfig/webhookConfig/index.vue @@ -0,0 +1,144 @@ + + diff --git a/src/views/msgCenter/accountConfig/wxWananchiConfig/Form.vue b/src/views/msgCenter/accountConfig/wxWananchiConfig/Form.vue new file mode 100644 index 0000000..9a19eed --- /dev/null +++ b/src/views/msgCenter/accountConfig/wxWananchiConfig/Form.vue @@ -0,0 +1,139 @@ + + diff --git a/src/views/msgCenter/accountConfig/wxWananchiConfig/index.vue b/src/views/msgCenter/accountConfig/wxWananchiConfig/index.vue new file mode 100644 index 0000000..9e0e0bb --- /dev/null +++ b/src/views/msgCenter/accountConfig/wxWananchiConfig/index.vue @@ -0,0 +1,125 @@ + + diff --git a/src/views/msgCenter/msgMonitor/Detail.vue b/src/views/msgCenter/msgMonitor/Detail.vue new file mode 100644 index 0000000..0d63c91 --- /dev/null +++ b/src/views/msgCenter/msgMonitor/Detail.vue @@ -0,0 +1,60 @@ + + diff --git a/src/views/msgCenter/msgMonitor/index.vue b/src/views/msgCenter/msgMonitor/index.vue new file mode 100644 index 0000000..4a5c822 --- /dev/null +++ b/src/views/msgCenter/msgMonitor/index.vue @@ -0,0 +1,152 @@ + + diff --git a/src/views/msgCenter/msgTemplate/Detail.vue b/src/views/msgCenter/msgTemplate/Detail.vue new file mode 100644 index 0000000..ba7c7f7 --- /dev/null +++ b/src/views/msgCenter/msgTemplate/Detail.vue @@ -0,0 +1,287 @@ + + diff --git a/src/views/msgCenter/msgTemplate/Form.vue b/src/views/msgCenter/msgTemplate/Form.vue new file mode 100644 index 0000000..eb5c952 --- /dev/null +++ b/src/views/msgCenter/msgTemplate/Form.vue @@ -0,0 +1,518 @@ + + diff --git a/src/views/msgCenter/msgTemplate/index.vue b/src/views/msgCenter/msgTemplate/index.vue new file mode 100644 index 0000000..edaa8af --- /dev/null +++ b/src/views/msgCenter/msgTemplate/index.vue @@ -0,0 +1,194 @@ + + diff --git a/src/views/msgCenter/sendConfig/Detail.vue b/src/views/msgCenter/sendConfig/Detail.vue new file mode 100644 index 0000000..6b4f346 --- /dev/null +++ b/src/views/msgCenter/sendConfig/Detail.vue @@ -0,0 +1,171 @@ + + diff --git a/src/views/msgCenter/sendConfig/Form.vue b/src/views/msgCenter/sendConfig/Form.vue new file mode 100644 index 0000000..1877e8a --- /dev/null +++ b/src/views/msgCenter/sendConfig/Form.vue @@ -0,0 +1,262 @@ + + diff --git a/src/views/msgCenter/sendConfig/components/SendResults.vue b/src/views/msgCenter/sendConfig/components/SendResults.vue new file mode 100644 index 0000000..52b2061 --- /dev/null +++ b/src/views/msgCenter/sendConfig/components/SendResults.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/views/msgCenter/sendConfig/components/TemplateForm.vue b/src/views/msgCenter/sendConfig/components/TemplateForm.vue new file mode 100644 index 0000000..8a90892 --- /dev/null +++ b/src/views/msgCenter/sendConfig/components/TemplateForm.vue @@ -0,0 +1,153 @@ + + diff --git a/src/views/msgCenter/sendConfig/components/TemplateModal.vue b/src/views/msgCenter/sendConfig/components/TemplateModal.vue new file mode 100644 index 0000000..8e0681c --- /dev/null +++ b/src/views/msgCenter/sendConfig/components/TemplateModal.vue @@ -0,0 +1,145 @@ + + + diff --git a/src/views/msgCenter/sendConfig/components/TestSend.vue b/src/views/msgCenter/sendConfig/components/TestSend.vue new file mode 100644 index 0000000..35e2e59 --- /dev/null +++ b/src/views/msgCenter/sendConfig/components/TestSend.vue @@ -0,0 +1,116 @@ + + + diff --git a/src/views/msgCenter/sendConfig/index.vue b/src/views/msgCenter/sendConfig/index.vue new file mode 100644 index 0000000..c466e05 --- /dev/null +++ b/src/views/msgCenter/sendConfig/index.vue @@ -0,0 +1,201 @@ + + + diff --git a/src/views/onlineDev/dataReport/Form.vue b/src/views/onlineDev/dataReport/Form.vue new file mode 100644 index 0000000..bf57b8e --- /dev/null +++ b/src/views/onlineDev/dataReport/Form.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/views/workFlow/document/UserBox.vue b/src/views/workFlow/document/UserBox.vue new file mode 100644 index 0000000..0f60db7 --- /dev/null +++ b/src/views/workFlow/document/UserBox.vue @@ -0,0 +1,271 @@ + + diff --git a/src/views/workFlow/document/index.vue b/src/views/workFlow/document/index.vue new file mode 100644 index 0000000..860cda7 --- /dev/null +++ b/src/views/workFlow/document/index.vue @@ -0,0 +1,580 @@ + + + + + diff --git a/src/views/workFlow/flowChart/index.vue b/src/views/workFlow/flowChart/index.vue new file mode 100644 index 0000000..84d8f53 --- /dev/null +++ b/src/views/workFlow/flowChart/index.vue @@ -0,0 +1,59 @@ + + diff --git a/src/views/workFlow/flowCirculate/index.vue b/src/views/workFlow/flowCirculate/index.vue new file mode 100644 index 0000000..f784ad9 --- /dev/null +++ b/src/views/workFlow/flowCirculate/index.vue @@ -0,0 +1,193 @@ + + diff --git a/src/views/workFlow/flowDoing/BatchList.vue b/src/views/workFlow/flowDoing/BatchList.vue new file mode 100644 index 0000000..2ac803b --- /dev/null +++ b/src/views/workFlow/flowDoing/BatchList.vue @@ -0,0 +1,334 @@ + + diff --git a/src/views/workFlow/flowDoing/index.vue b/src/views/workFlow/flowDoing/index.vue new file mode 100644 index 0000000..75ef61d --- /dev/null +++ b/src/views/workFlow/flowDoing/index.vue @@ -0,0 +1,202 @@ + + diff --git a/src/views/workFlow/flowDone/index.vue b/src/views/workFlow/flowDone/index.vue new file mode 100644 index 0000000..a3486fc --- /dev/null +++ b/src/views/workFlow/flowDone/index.vue @@ -0,0 +1,196 @@ + + diff --git a/src/views/workFlow/flowEngine/AuthModal.vue b/src/views/workFlow/flowEngine/AuthModal.vue new file mode 100644 index 0000000..e956f42 --- /dev/null +++ b/src/views/workFlow/flowEngine/AuthModal.vue @@ -0,0 +1,154 @@ + + diff --git a/src/views/workFlow/flowEngine/DesignForm.vue b/src/views/workFlow/flowEngine/DesignForm.vue new file mode 100644 index 0000000..e3a648c --- /dev/null +++ b/src/views/workFlow/flowEngine/DesignForm.vue @@ -0,0 +1,284 @@ + + + + diff --git a/src/views/workFlow/flowEngine/Form.vue b/src/views/workFlow/flowEngine/Form.vue new file mode 100644 index 0000000..646462c --- /dev/null +++ b/src/views/workFlow/flowEngine/Form.vue @@ -0,0 +1,169 @@ + + diff --git a/src/views/workFlow/flowEngine/index.vue b/src/views/workFlow/flowEngine/index.vue new file mode 100644 index 0000000..6ebdf9b --- /dev/null +++ b/src/views/workFlow/flowEngine/index.vue @@ -0,0 +1,310 @@ + + diff --git a/src/views/workFlow/flowFile/index.vue b/src/views/workFlow/flowFile/index.vue new file mode 100644 index 0000000..be2668e --- /dev/null +++ b/src/views/workFlow/flowFile/index.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/views/workFlow/flowLaunch/FlowPopup.vue b/src/views/workFlow/flowLaunch/FlowPopup.vue new file mode 100644 index 0000000..aa9c466 --- /dev/null +++ b/src/views/workFlow/flowLaunch/FlowPopup.vue @@ -0,0 +1,28 @@ + + diff --git a/src/views/workFlow/flowLaunch/index.vue b/src/views/workFlow/flowLaunch/index.vue new file mode 100644 index 0000000..19fabdc --- /dev/null +++ b/src/views/workFlow/flowLaunch/index.vue @@ -0,0 +1,219 @@ + + diff --git a/src/views/workFlow/flowMonitor/index.vue b/src/views/workFlow/flowMonitor/index.vue new file mode 100644 index 0000000..0c4a934 --- /dev/null +++ b/src/views/workFlow/flowMonitor/index.vue @@ -0,0 +1,330 @@ + + diff --git a/src/views/workFlow/flowQuickLaunch/FlowList.vue b/src/views/workFlow/flowQuickLaunch/FlowList.vue new file mode 100644 index 0000000..96f8b3e --- /dev/null +++ b/src/views/workFlow/flowQuickLaunch/FlowList.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/src/views/workFlow/flowQuickLaunch/index.vue b/src/views/workFlow/flowQuickLaunch/index.vue new file mode 100644 index 0000000..1cdcf1c --- /dev/null +++ b/src/views/workFlow/flowQuickLaunch/index.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/views/workFlow/flowToSign/index.vue b/src/views/workFlow/flowToSign/index.vue new file mode 100644 index 0000000..391a11e --- /dev/null +++ b/src/views/workFlow/flowToSign/index.vue @@ -0,0 +1,168 @@ + + diff --git a/src/views/workFlow/flowTodo/index.vue b/src/views/workFlow/flowTodo/index.vue new file mode 100644 index 0000000..2341cab --- /dev/null +++ b/src/views/workFlow/flowTodo/index.vue @@ -0,0 +1,228 @@ + + diff --git a/src/views/workFlow/formDesign/FieldForm.vue b/src/views/workFlow/formDesign/FieldForm.vue new file mode 100644 index 0000000..bf18866 --- /dev/null +++ b/src/views/workFlow/formDesign/FieldForm.vue @@ -0,0 +1,121 @@ + + diff --git a/src/views/workFlow/formDesign/Form.vue b/src/views/workFlow/formDesign/Form.vue new file mode 100644 index 0000000..a83855d --- /dev/null +++ b/src/views/workFlow/formDesign/Form.vue @@ -0,0 +1,235 @@ + + diff --git a/src/views/workFlow/formDesign/Preview.vue b/src/views/workFlow/formDesign/Preview.vue new file mode 100644 index 0000000..aad4141 --- /dev/null +++ b/src/views/workFlow/formDesign/Preview.vue @@ -0,0 +1,47 @@ + + diff --git a/src/views/workFlow/formDesign/index.vue b/src/views/workFlow/formDesign/index.vue new file mode 100644 index 0000000..aeaa1fb --- /dev/null +++ b/src/views/workFlow/formDesign/index.vue @@ -0,0 +1,188 @@ + + diff --git a/src/views/workFlow/printTemplate/TplList.vue b/src/views/workFlow/printTemplate/TplList.vue new file mode 100644 index 0000000..c05015c --- /dev/null +++ b/src/views/workFlow/printTemplate/TplList.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/src/views/workFlow/printTemplate/index.vue b/src/views/workFlow/printTemplate/index.vue new file mode 100644 index 0000000..757e0d2 --- /dev/null +++ b/src/views/workFlow/printTemplate/index.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/views/workFlow/schedule/Detail.vue b/src/views/workFlow/schedule/Detail.vue new file mode 100644 index 0000000..465aa30 --- /dev/null +++ b/src/views/workFlow/schedule/Detail.vue @@ -0,0 +1,131 @@ + + diff --git a/src/views/workFlow/schedule/Form.vue b/src/views/workFlow/schedule/Form.vue new file mode 100644 index 0000000..32eb03a --- /dev/null +++ b/src/views/workFlow/schedule/Form.vue @@ -0,0 +1,398 @@ + + diff --git a/src/views/workFlow/schedule/calendar.ts b/src/views/workFlow/schedule/calendar.ts new file mode 100644 index 0000000..1c4a1d6 --- /dev/null +++ b/src/views/workFlow/schedule/calendar.ts @@ -0,0 +1,1011 @@ +/** + * @1900-2100区间内的公历、农历互转 + * @charset UTF-8 + * @Author Jea杨(JJonline@JJonline.Cn) + * @Time 2014-7-21 + * @Time 2016-8-13 Fixed 2033hex、Attribution Annals + * @Time 2016-9-25 Fixed lunar LeapMonth Param Bug + * @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year + * @Version 1.0.3 + * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] + * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] + */ +export const calendar: any = { + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [ + 0x04bd8, + 0x04ae0, + 0x0a570, + 0x054d5, + 0x0d260, + 0x0d950, + 0x16554, + 0x056a0, + 0x09ad0, + 0x055d2, //1900-1909 + 0x04ae0, + 0x0a5b6, + 0x0a4d0, + 0x0d250, + 0x1d255, + 0x0b540, + 0x0d6a0, + 0x0ada2, + 0x095b0, + 0x14977, //1910-1919 + 0x04970, + 0x0a4b0, + 0x0b4b5, + 0x06a50, + 0x06d40, + 0x1ab54, + 0x02b60, + 0x09570, + 0x052f2, + 0x04970, //1920-1929 + 0x06566, + 0x0d4a0, + 0x0ea50, + 0x16a95, + 0x05ad0, + 0x02b60, + 0x186e3, + 0x092e0, + 0x1c8d7, + 0x0c950, //1930-1939 + 0x0d4a0, + 0x1d8a6, + 0x0b550, + 0x056a0, + 0x1a5b4, + 0x025d0, + 0x092d0, + 0x0d2b2, + 0x0a950, + 0x0b557, //1940-1949 + 0x06ca0, + 0x0b550, + 0x15355, + 0x04da0, + 0x0a5b0, + 0x14573, + 0x052b0, + 0x0a9a8, + 0x0e950, + 0x06aa0, //1950-1959 + 0x0aea6, + 0x0ab50, + 0x04b60, + 0x0aae4, + 0x0a570, + 0x05260, + 0x0f263, + 0x0d950, + 0x05b57, + 0x056a0, //1960-1969 + 0x096d0, + 0x04dd5, + 0x04ad0, + 0x0a4d0, + 0x0d4d4, + 0x0d250, + 0x0d558, + 0x0b540, + 0x0b6a0, + 0x195a6, //1970-1979 + 0x095b0, + 0x049b0, + 0x0a974, + 0x0a4b0, + 0x0b27a, + 0x06a50, + 0x06d40, + 0x0af46, + 0x0ab60, + 0x09570, //1980-1989 + 0x04af5, + 0x04970, + 0x064b0, + 0x074a3, + 0x0ea50, + 0x06b58, + 0x05ac0, + 0x0ab60, + 0x096d5, + 0x092e0, //1990-1999 + 0x0c960, + 0x0d954, + 0x0d4a0, + 0x0da50, + 0x07552, + 0x056a0, + 0x0abb7, + 0x025d0, + 0x092d0, + 0x0cab5, //2000-2009 + 0x0a950, + 0x0b4a0, + 0x0baa4, + 0x0ad50, + 0x055d9, + 0x04ba0, + 0x0a5b0, + 0x15176, + 0x052b0, + 0x0a930, //2010-2019 + 0x07954, + 0x06aa0, + 0x0ad50, + 0x05b52, + 0x04b60, + 0x0a6e6, + 0x0a4e0, + 0x0d260, + 0x0ea65, + 0x0d530, //2020-2029 + 0x05aa0, + 0x076a3, + 0x096d0, + 0x04afb, + 0x04ad0, + 0x0a4d0, + 0x1d0b6, + 0x0d250, + 0x0d520, + 0x0dd45, //2030-2039 + 0x0b5a0, + 0x056d0, + 0x055b2, + 0x049b0, + 0x0a577, + 0x0a4b0, + 0x0aa50, + 0x1b255, + 0x06d20, + 0x0ada0, //2040-2049 + /**Add By JJonline@JJonline.Cn**/ + 0x14b63, + 0x09370, + 0x049f8, + 0x04970, + 0x064b0, + 0x168a6, + 0x0ea50, + 0x06b20, + 0x1a6c4, + 0x0aae0, //2050-2059 + 0x092e0, + 0x0d2e3, + 0x0c960, + 0x0d557, + 0x0d4a0, + 0x0da50, + 0x05d55, + 0x056a0, + 0x0a6d0, + 0x055d4, //2060-2069 + 0x052d0, + 0x0a9b8, + 0x0a950, + 0x0b4a0, + 0x0b6a6, + 0x0ad50, + 0x055a0, + 0x0aba4, + 0x0a5b0, + 0x052b0, //2070-2079 + 0x0b273, + 0x06930, + 0x07337, + 0x06aa0, + 0x0ad50, + 0x14b55, + 0x04b60, + 0x0a570, + 0x054e4, + 0x0d160, //2080-2089 + 0x0e968, + 0x0d520, + 0x0daa0, + 0x16aa6, + 0x056d0, + 0x04ae0, + 0x0a9d4, + 0x0a2d0, + 0x0d150, + 0x0f252, //2090-2099 + 0x0d520, + ], //2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], + + /** + * 阳历节日 + */ + festival: { + '1-1': { title: '元旦节' }, + '2-14': { title: '情人节' }, + '5-1': { title: '劳动节' }, + '5-4': { title: '青年节' }, + '6-1': { title: '儿童节' }, + '9-10': { title: '教师节' }, + '10-1': { title: '国庆节' }, + '12-25': { title: '圣诞节' }, + + '3-8': { title: '妇女节' }, + '3-12': { title: '植树节' }, + '4-1': { title: '愚人节' }, + '5-12': { title: '护士节' }, + '7-1': { title: '建党节' }, + '8-1': { title: '建军节' }, + '12-24': { title: '平安夜' }, + }, + + /** + * 农历节日 + */ + lFestival: { + '12-30': { title: '除夕' }, + '1-1': { title: '春节' }, + '1-15': { title: '元宵节' }, + '2-2': { title: '龙抬头' }, + '5-5': { title: '端午节' }, + '7-7': { title: '七夕节' }, + '7-15': { title: '中元节' }, + '8-15': { title: '中秋节' }, + '9-9': { title: '重阳节' }, + '10-1': { title: '寒衣节' }, + '10-15': { title: '下元节' }, + '12-8': { title: '腊八节' }, + '12-23': { title: '北方小年' }, + '12-24': { title: '南方小年' }, + }, + + /** + * 返回默认定义的阳历节日 + */ + getFestival() { + return this.festival; + }, + + /** + * 返回默认定义的内容里节日 + */ + getLunarFestival() { + return this.lFestival; + }, + + /** + * + * @param param {Object} 按照festival的格式输入数据,设置阳历节日 + */ + setFestival(param = {}) { + this.festival = param; + }, + + /** + * + * @param param {Object} 按照lFestival的格式输入数据,设置农历节日 + */ + setLunarFestival(param = {}) { + this.lFestival = param; + }, + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: [ + '\u5c0f\u5bd2', + '\u5927\u5bd2', + '\u7acb\u6625', + '\u96e8\u6c34', + '\u60ca\u86f0', + '\u6625\u5206', + '\u6e05\u660e', + '\u8c37\u96e8', + '\u7acb\u590f', + '\u5c0f\u6ee1', + '\u8292\u79cd', + '\u590f\u81f3', + '\u5c0f\u6691', + '\u5927\u6691', + '\u7acb\u79cb', + '\u5904\u6691', + '\u767d\u9732', + '\u79cb\u5206', + '\u5bd2\u9732', + '\u971c\u964d', + '\u7acb\u51ac', + '\u5c0f\u96ea', + '\u5927\u96ea', + '\u51ac\u81f3', + ], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: [ + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', + '9778397bd19801ec9210c965cc920e', + '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', + '97bd09801d98082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', + '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', + '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', + '9778397bd19801ec9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', + '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', + '97b6b97bd197c36c9210c9274c920e', + '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', + '7f0e37f5307f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', + '7f0e27f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', + '97b6b7f0e47f149b0723b0787b0721', + '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', + '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e37f5307f595b0b0bc920fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', + '7f07e7f0e37f149b0723b0787b0721', + '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e37f14998083b0787b0721', + '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14898082b0723b02d5', + '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e36665b66aa89801e9808297c35', + '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', + '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e26665b66a449801e9808297c35', + '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', + ], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], + + /** + * 返回农历y年一整年的总天数 + * @param y lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + let i, + sum = 348; + for (i = 0x8000; i > 0x8; i >>= 1) { + sum += this.lunarInfo[y - 1900] & i ? 1 : 0; + } + return sum + this.leapDays(y); + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param y lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { + //闰字编码 \u95f0 + return this.lunarInfo[y - 1900] & 0xf; + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param y lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return this.lunarInfo[y - 1900] & 0x10000 ? 30 : 29; + } + return 0; + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param y lunar Year + * @param m lunar Month + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { + return -1; + } //月份参数从1至12,参数错误返回-1 + return this.lunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29; + }, + + /** + * 返回公历(!)y年m月的天数 + * @param y solar Year + * @param m solar Month + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { + return -1; + } //若参数错误 返回-1 + const ms = m - 1; + if (ms === 1) { + //2月份的闰平规律测算后确认返回28或29 + return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0 ? 29 : 28; + } else { + return this.solarMonth[ms]; + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10; + var zhiKey = (lYear - 3) % 12; + if (ganKey === 0) ganKey = 10; //如果余数为0则为最后一个天干 + if (zhiKey === 0) zhiKey = 12; //如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]; + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + const s = + '\u6469\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u6469\u7faf'; + const arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]; + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'; //座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12]; + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y y公历年(1900-2100) + * @param n n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100 || n < 1 || n > 24) { + return -1; + } + const _table = this.sTermInfo[y - 1900]; + const _calcDay: any[] = []; + for (let index = 0; index < _table.length; index += 5) { + const chunk = parseInt('0x' + _table.substr(index, 5)).toString(); + _calcDay.push(chunk[0], chunk.substr(1, 2), chunk[3], chunk.substr(4, 2)); + } + return parseInt(_calcDay[n - 1]); + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param m lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { + // 月 => \u6708 + if (m > 12 || m < 1) { + return -1; + } //若参数错误 返回-1 + let s = this.nStr3[m - 1]; + s += '\u6708'; //加上月字 + return s; + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param d lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { + //日 => \u65e5 + let s; + switch (d) { + case 10: + s = '\u521d\u5341'; + break; + case 20: + s = '\u4e8c\u5341'; + break; + case 30: + s = '\u4e09\u5341'; + break; + default: + s = this.nStr2[Math.floor(d / 10)]; + s += this.nStr1[d % 10]; + } + return s; + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12]; + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * !important! 公历参数区间1900.1.31~2100.12.31 + * @param yPara solar year + * @param mPara solar month + * @param dPara solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (yPara, mPara, dPara) { + let y = parseInt(yPara); + let m = parseInt(mPara); + let d = parseInt(dPara); + //年份限定、上限 + if (y < 1900 || y > 2100) { + return -1; // undefined转换为数字变为NaN + } + //公历传参最下限 + if (y === 1900 && m === 1 && d < 31) { + return -1; + } + + //未传参 获得当天 + let objDate; + if (!y) { + objDate = new Date(); + } else { + objDate = new Date(y, parseInt(m) - 1, d); + } + let i, + leap = 0, + temp = 0; + //修正ymd参数 + y = objDate.getFullYear(); + m = objDate.getMonth() + 1; + d = objDate.getDate(); + let offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000; + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i); + offset -= temp; + } + if (offset < 0) { + offset += temp; + i--; + } + + //是否今天 + let isTodayObj = new Date(), + isToday = false; + if (isTodayObj.getFullYear() === y && isTodayObj.getMonth() + 1 === m && isTodayObj.getDate() === d) { + isToday = true; + } + //星期几 + let nWeek = objDate.getDay(), + cWeek = this.nStr1[nWeek]; + //数字表示周几顺应天朝周一开始的惯例 + if (nWeek === 0) { + nWeek = 7; + } + //农历年 + const year = i; + leap = this.leapMonth(i); //闰哪个月 + let isLeap = false; + + //效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + //闰月 + if (leap > 0 && i === leap + 1 && isLeap === false) { + --i; + isLeap = true; + temp = this.leapDays(year); //计算农历闰月天数 + } else { + temp = this.monthDays(year, i); //计算农历普通月天数 + } + //解除闰月 + if (isLeap === true && i === leap + 1) { + isLeap = false; + } + offset -= temp; + } + // 闰月导致数组下标重叠取反 + if (offset === 0 && leap > 0 && i === leap + 1) { + if (isLeap) { + isLeap = false; + } else { + isLeap = true; + --i; + } + } + if (offset < 0) { + offset += temp; + --i; + } + //农历月 + const month = i; + //农历日 + const day = offset + 1; + //天干地支处理 + const sm = m - 1; + const gzY = this.toGanZhiYear(year); + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + const firstNode = this.getTerm(y, m * 2 - 1); //返回当月「节」为几日开始 + const secondNode = this.getTerm(y, m * 2); //返回当月「节」为几日开始 + + // 依据12节气修正干支月 + let gzM = this.toGanZhi((y - 1900) * 12 + m + 11); + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12); + } + + //传入的日期的节气与否 + let isTerm = false; + let Term = null; + if (firstNode === d) { + isTerm = true; + Term = this.solarTerm[m * 2 - 2]; + } + if (secondNode === d) { + isTerm = true; + Term = this.solarTerm[m * 2 - 1]; + } + //日柱 当月一日与 1900/1/1 相差天数 + const dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10; + const gzD = this.toGanZhi(dayCyclical + d - 1); + //该日期所属的星座 + const astro = this.toAstro(m, d); + + const solarDate = y + '-' + m + '-' + d; + const lunarDate = year + '-' + month + '-' + day; + + const festival = this.festival; + const lFestival = this.lFestival; + + const festivalDate = m + '-' + d; + let lunarFestivalDate = month + '-' + day; + + // bugfix https://github.com/jjonline/calendar.js/issues/29 + // 农历节日修正:农历12月小月则29号除夕,大月则30号除夕 + // 此处取巧修正:当前为农历12月29号时增加一次判断并且把lunarFestivalDate设置为12-30以正确取得除夕 + // 天朝农历节日遇闰月过前不过后的原则,此处取农历12月天数不考虑闰月 + // 农历润12月在本工具支持的200年区间内仅1574年出现 + if (month === 12 && day === 29 && this.monthDays(year, month) === 29) { + lunarFestivalDate = '12-30'; + } + return { + date: solarDate, + lunarDate: lunarDate, + festival: festival[festivalDate] ? festival[festivalDate].title : null, + lunarFestival: lFestival[lunarFestivalDate] ? lFestival[lunarFestivalDate].title : null, + lYear: year, + lMonth: month, + lDay: day, + Animal: this.getAnimal(year), + IMonthCn: (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), + IDayCn: this.toChinaDay(day), + cYear: y, + cMonth: m, + cDay: d, + gzYear: gzY, + gzMonth: gzM, + gzDay: gzD, + isToday: isToday, + isLeap: isLeap, + nWeek: nWeek, + ncWeek: '\u661f\u671f' + cWeek, + isTerm: isTerm, + Term: Term, + astro: astro, + }; + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * !important! 参数区间1900.1.31~2100.12.1 + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { + y = parseInt(y); + m = parseInt(m); + d = parseInt(d); + isLeapMonth = !!isLeapMonth; + const leapOffset = 0; + const leapMonth = this.leapMonth(y); + const leapDay = this.leapDays(y); + if (isLeapMonth && leapMonth !== m) { + return -1; + } //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if ((y === 2100 && m === 12 && d > 1) || (y === 1900 && m === 1 && d < 31)) { + return -1; + } //超出了最大极限值 + const day = this.monthDays(y, m); + let _day = day; + //bugFix 2016-9-25 + //if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m); + } + if (y < 1900 || y > 2100 || d > _day) { + return -1; + } //参数合法性效验 + + //计算农历的时间差 + let offset = 0; + let i; + for (i = 1900; i < y; i++) { + offset += this.lYearDays(i); + } + let leap = 0, + isAdd = false; + for (i = 1; i < m; i++) { + leap = this.leapMonth(y); + if (!isAdd) { + //处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); + isAdd = true; + } + } + offset += this.monthDays(y, i); + } + //转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { + offset += day; + } + //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + const strap = Date.UTC(1900, 1, 30, 0, 0, 0); + const calObj = new Date((offset + d - 31) * 86400000 + strap); + const cY = calObj.getUTCFullYear(); + const cM = calObj.getUTCMonth() + 1; + const cD = calObj.getUTCDate(); + return this.solar2lunar(cY, cM, cD); + }, +}; diff --git a/src/views/workFlow/schedule/index.vue b/src/views/workFlow/schedule/index.vue new file mode 100644 index 0000000..e6af7db --- /dev/null +++ b/src/views/workFlow/schedule/index.vue @@ -0,0 +1,377 @@ + + + diff --git a/src/views/workFlow/workFlowDetail/index.vue b/src/views/workFlow/workFlowDetail/index.vue new file mode 100644 index 0000000..72bb691 --- /dev/null +++ b/src/views/workFlow/workFlowDetail/index.vue @@ -0,0 +1,58 @@ + + diff --git a/src/views/workFlow/workFlowForm/crmOrder/GoodsModal.vue b/src/views/workFlow/workFlowForm/crmOrder/GoodsModal.vue new file mode 100644 index 0000000..af0a44c --- /dev/null +++ b/src/views/workFlow/workFlowForm/crmOrder/GoodsModal.vue @@ -0,0 +1,59 @@ + + diff --git a/src/views/workFlow/workFlowForm/crmOrder/index.vue b/src/views/workFlow/workFlowForm/crmOrder/index.vue new file mode 100644 index 0000000..ec4cb2a --- /dev/null +++ b/src/views/workFlow/workFlowForm/crmOrder/index.vue @@ -0,0 +1,410 @@ + + + + diff --git a/src/views/workFlow/workFlowForm/dynamicForm/index.vue b/src/views/workFlow/workFlowForm/dynamicForm/index.vue new file mode 100644 index 0000000..054a2ec --- /dev/null +++ b/src/views/workFlow/workFlowForm/dynamicForm/index.vue @@ -0,0 +1,187 @@ + + + diff --git a/src/views/workFlow/workFlowForm/hooks/useFlowForm.ts b/src/views/workFlow/workFlowForm/hooks/useFlowForm.ts new file mode 100644 index 0000000..c9eb838 --- /dev/null +++ b/src/views/workFlow/workFlowForm/hooks/useFlowForm.ts @@ -0,0 +1,211 @@ +import { reactive, computed, nextTick, unref } from 'vue'; +import { useUserStore } from '@/store/modules/user'; +import type { FormInstance } from 'ant-design-vue'; +import type { Ref } from 'vue'; +import { getBillNumber } from '@/api/system/billRule'; +import { useMessage } from '@/hooks/web/useMessage'; +import { isEmpty } from '@/utils/is'; + +interface State { + config: any; + loading: boolean; + eventType: string; + flowUrgent: number; + formRef: string; + tableRequiredData: any; +} +interface UseFlowFormContext { + config: any; + selfState: any; + emit: EmitType; + formRef: Ref; + beforeInit?: any; + selfGetInfo?: any; + selfInit?: any; + beforeSubmit?: any; + selfSubmit?: any; + selfExist?: any; +} + +const userStore = useUserStore(); +const { createMessage } = useMessage(); +const state = reactive({ + config: {}, + loading: false, + eventType: '', + flowUrgent: 1, + formRef: 'formRef', + tableRequiredData: {}, +}); + +const includeList = ['crmOrder', 'salesOrder', 'leaveApply']; + +const getUserInfo = computed(() => userStore.getUserInfo || {}); + +export function useFlowForm(data: UseFlowFormContext) { + const { config, emit, formRef, selfState } = data; + + function getForm() { + const form = unref(formRef); + if (!form) { + throw new Error('form is null!'); + } + return form; + } + + function init() { + selfState.dataForm.id = config.id || ''; + state.config = config; + state.loading = true; + updateDataRule(); + nextTick(() => { + getForm().resetFields(); + // 自定义初始化前方法 + if (data.beforeInit && typeof data.beforeInit === 'function') data.beforeInit(); + if (config.id) { + selfState.dataForm = config.draftData || config.formData; + // 自定义获取详情方法 + if (data.selfGetInfo && typeof data.selfGetInfo === 'function') data.selfGetInfo(selfState.dataForm); + if (includeList.includes(config.formEnCode) && selfState.dataForm.fileJson) selfState.fileList = JSON.parse(selfState.dataForm.fileJson); + emit('setPageLoad'); + return; + } else { + selfState.dataForm.flowId = config.flowId; + // 自定义初始化方法 + if (data.selfInit && typeof data.selfInit === 'function') data.selfInit(data); + if (!selfState.billEnCode) return emit('setPageLoad'); + getBillNumber(selfState.billEnCode).then(res => { + if (selfState.billEnCode === 'OrderNumber') { + selfState.dataForm.orderCode = res.data; + } else { + selfState.dataForm.billNo = res.data; + } + emit('setPageLoad'); + }); + } + state.loading = false; + emit('setPageLoad'); + }); + } + // 更新校验规则 + function updateDataRule() { + if (!config.formOperates || !config.formOperates.length) return (selfState.dataRule = {}); + let newRules = {}; + for (let i = 0; i < config.formOperates.length; i++) { + const item = config.formOperates[i]; + if (!item.id.includes('-')) { + const newRulesItem = { + required: item.required || false, + message: item.name + '不能为空', + trigger: item.trigger || 'blur', + }; + if (!selfState.dataRule.hasOwnProperty(item.id)) { + if (item.required) newRules[item.id] = [newRulesItem]; + } else { + let withoutRequiredItem = true; + for (let i = 0; i < selfState.dataRule[item.id].length; i++) { + if (selfState.dataRule[item.id][i].hasOwnProperty('required')) { + selfState.dataRule[item.id][i].required = item.required || false; + withoutRequiredItem = false; + } + } + if (withoutRequiredItem && item.required) selfState.dataRule[item.id].push(newRulesItem); + } + } else { + let key = item.id.split('-')[0]; + let newId = item.id.split('-')[1]; + let newItem = { + ...item, + id: newId, + }; + if (!state.tableRequiredData.hasOwnProperty(key)) { + state.tableRequiredData[key] = [newItem]; + } else { + state.tableRequiredData[key].push(newItem); + } + } + } + selfState.dataRule = { ...selfState.dataRule, ...newRules }; + } + async function dataFormSubmit(eventType, flowUrgent) { + try { + const values = await getForm()?.validate(); + if (!values) return; + if (!exist()) return; + if (data.selfExist && typeof data.selfExist === 'function' && !data.selfExist()) return; + let formData: any = {}; + if (data.beforeSubmit && typeof data.beforeSubmit === 'function') { + formData = data.beforeSubmit(); + } else { + formData = selfState.dataForm; + } + if (includeList.includes(config.formEnCode)) formData.fileJson = JSON.stringify(selfState.fileList || []); + if (eventType === 'save' || eventType === 'submit') { + if (data.selfSubmit && typeof data.selfSubmit === 'function') { + data.selfSubmit(formData, eventType, flowUrgent); + return; + } + } + emit('eventReceiver', { formData }, eventType); + } catch (_) {} + } + function exist() { + let isOk = true; + if (JSON.stringify(state.tableRequiredData) === '{}') return isOk; + for (let key in state.tableRequiredData) { + if (selfState.dataForm[key] && Array.isArray(selfState.dataForm[key])) { + for (let i = 0; i < selfState.dataForm[key].length; i++) { + let item = selfState.dataForm[key][i]; + inner: for (let id in item) { + let arr = state.tableRequiredData[key].filter(o => o.id === id) || []; + if (!arr.length) continue inner; + if (arr[0].required) { + const msg = `${arr[0].name}不能为空`; + const boo = (!item[id] && item[id] != 0) || isEmpty(item[id]); + if (boo) { + createMessage.error(msg); + isOk = false; + break; + } + } + } + } + } + } + return isOk; + } + function judgeRequired(id) { + if (!config.formOperates || !config.formOperates.length) return false; + let arr = config.formOperates.filter(o => o.id === id) || []; + if (!arr.length) return false; + let item = arr[0]; + return item.required; + } + function judgeShow(id) { + if (config.opType == 4) return true; + if (!config.formOperates || !config.formOperates.length) return true; + let arr = config.formOperates.filter(o => o.id === id) || []; + if (!arr.length) return true; + let item = arr[0]; + return item.read; + } + function judgeWrite(id) { + if (config.disabled) return true; + if (!config.formOperates || !config.formOperates.length) return false; + let arr = config.formOperates.filter(o => o.id === id) || []; + if (!arr.length) return true; + let item = arr[0]; + return !item.write; + } + + return { + comState: state, + init, + getUserInfo, + judgeRequired, + judgeShow, + judgeWrite, + getForm, + dataFormSubmit, + }; +} diff --git a/src/views/workFlow/workFlowForm/leaveApply/index.vue b/src/views/workFlow/workFlowForm/leaveApply/index.vue new file mode 100644 index 0000000..2171b28 --- /dev/null +++ b/src/views/workFlow/workFlowForm/leaveApply/index.vue @@ -0,0 +1,182 @@ + + + diff --git a/src/views/workFlow/workFlowForm/revoke/index.vue b/src/views/workFlow/workFlowForm/revoke/index.vue new file mode 100644 index 0000000..31d140c --- /dev/null +++ b/src/views/workFlow/workFlowForm/revoke/index.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/views/workFlow/workFlowForm/salesOrder/index.vue b/src/views/workFlow/workFlowForm/salesOrder/index.vue new file mode 100644 index 0000000..d0a1b35 --- /dev/null +++ b/src/views/workFlow/workFlowForm/salesOrder/index.vue @@ -0,0 +1,212 @@ + + + diff --git a/stylelint.config.js b/stylelint.config.js new file mode 100644 index 0000000..8560b29 --- /dev/null +++ b/stylelint.config.js @@ -0,0 +1,89 @@ +module.exports = { + root: true, + plugins: ['stylelint-order'], + extends: ['stylelint-config-standard', 'stylelint-config-prettier'], + customSyntax: 'postcss-html', + rules: { + 'function-no-unknown': null, + 'selector-class-pattern': null, + 'selector-pseudo-class-no-unknown': [ + true, + { + ignorePseudoClasses: ['global', 'deep'], + }, + ], + 'selector-pseudo-element-no-unknown': [ + true, + { + ignorePseudoElements: ['v-deep'], + }, + ], + 'at-rule-no-unknown': [ + true, + { + ignoreAtRules: ['tailwind', 'apply', 'variants', 'responsive', 'screen', 'function', 'if', 'each', 'include', 'mixin'], + }, + ], + 'no-empty-source': null, + 'string-quotes': null, + 'named-grid-areas-no-invalid': null, + 'unicode-bom': 'never', + 'no-descending-specificity': null, + 'font-family-no-missing-generic-family-keyword': null, + 'declaration-colon-space-after': 'always-single-line', + 'declaration-colon-space-before': 'never', + // 'declaration-block-trailing-semicolon': 'always', + 'rule-empty-line-before': [ + 'always', + { + ignore: ['after-comment', 'first-nested'], + }, + ], + 'unit-no-unknown': [true, { ignoreUnits: ['rpx'] }], + 'order/order': [ + [ + 'dollar-variables', + 'custom-properties', + 'at-rules', + 'declarations', + { + type: 'at-rule', + name: 'supports', + }, + { + type: 'at-rule', + name: 'media', + }, + 'rules', + ], + { severity: 'warning' }, + ], + }, + ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.tsx', '**/*.ts'], + overrides: [ + { + files: ['*.vue', '**/*.vue', '*.html', '**/*.html'], + extends: ['stylelint-config-recommended'], + rules: { + 'keyframes-name-pattern': null, + 'selector-pseudo-class-no-unknown': [ + true, + { + ignorePseudoClasses: ['deep', 'global'], + }, + ], + 'selector-pseudo-element-no-unknown': [ + true, + { + ignorePseudoElements: ['v-deep', 'v-global', 'v-slotted'], + }, + ], + }, + }, + { + files: ['*.less', '**/*.less'], + customSyntax: 'postcss-less', + extends: ['stylelint-config-standard', 'stylelint-config-recommended-vue'], + }, + ], +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e435495 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "noLib": false, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "strictFunctionTypes": false, + "jsx": "preserve", + "baseUrl": ".", + "allowJs": true, + "sourceMap": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "lib": ["dom", "esnext"], + "noImplicitAny": false, + "skipLibCheck": true, + "types": ["node", "vite/client"], + "removeComments": true, + "paths": { + "@/*": ["src/*"], + "#/*": ["types/*"] + } + }, + "include": ["src", "types", "build", "mock", "vite.config.ts"], + "exclude": ["node_modules", "tests/server/**/*.ts", "dist", "**/*.js"] +} diff --git a/types/axios.d.ts b/types/axios.d.ts new file mode 100644 index 0000000..078744c --- /dev/null +++ b/types/axios.d.ts @@ -0,0 +1,54 @@ +export type ErrorMessageMode = 'none' | 'modal' | 'message' | undefined; + +export interface RequestOptions { + // Splicing request parameters to url + joinParamsToUrl?: boolean; + // Format request parameter time + formatDate?: boolean; + // Whether to process the request result + isTransformResponse?: boolean; + // Whether to return native response headers + // For example: use this attribute when you need to get the response headers + isReturnNativeResponse?: boolean; + // Whether to join url + joinPrefix?: boolean; + // Interface address, use the default apiUrl if you leave it blank + apiUrl?: string; + // 请求拼接路径 + urlPrefix?: string; + // Error message prompt type + errorMessageMode?: ErrorMessageMode; + // Whether to add a timestamp + joinTime?: boolean; + ignoreCancelToken?: boolean; + // Whether to send token in header + withToken?: boolean; + // 是否加密 + useCipher?: boolean; + // 请求重试机制 + retryRequest?: RetryRequest; +} + +export interface RetryRequest { + isOpenRetry: boolean; + count: number; + waitTime: number; +} +export interface Result { + code: number; + msg: string; + data?: T; +} + +// multipart/form-data: upload file +export interface UploadFileParams { + // Other parameters + data?: Recordable; + // File parameter interface field name + name?: string; + // file name + file: File | Blob; + // file name + filename?: string; + [key: string]: any; +} diff --git a/types/config.d.ts b/types/config.d.ts new file mode 100644 index 0000000..c9090b3 --- /dev/null +++ b/types/config.d.ts @@ -0,0 +1,171 @@ +import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from '@/enums/menuEnum'; +import { ContentEnum, ThemeEnum, RouterTransitionEnum, SettingButtonPositionEnum, SessionTimeoutProcessingEnum } from '@/enums/appEnum'; + +import { CacheTypeEnum } from '@/enums/cacheEnum'; + +export type LocaleType = 'zh_CN' | 'zh_TW' | 'en_US' | 'ru' | 'ja' | 'ko'; + +export interface MenuSetting { + bgColor: string; + fixed: boolean; + collapsed: boolean; + siderHidden: boolean; + canDrag: boolean; + show: boolean; + hidden: boolean; + split: boolean; + menuWidth: number; + mode: MenuModeEnum; + type: MenuTypeEnum; + theme: ThemeEnum; + topMenuAlign: 'start' | 'center' | 'end'; + trigger: TriggerEnum; + accordion: boolean; + closeMixSidebarOnChange: boolean; + collapsedShowTitle: boolean; + mixSideTrigger: MixSidebarTriggerEnum; + mixSideFixed: boolean; +} + +export interface MultiTabsSetting { + cache: boolean; + show: boolean; + showIcon: boolean; + showQuick: boolean; + canDrag: boolean; + showRedo: boolean; + showFold: boolean; + showIcon: boolean; +} + +export interface HeaderSetting { + bgColor: string; + fixed: boolean; + show: boolean; + theme: ThemeEnum; + // Turn on full screen + showFullScreen: boolean; + // Whether to show the lock screen + useLockPage: boolean; + // Show document button + showDoc: boolean; + // Show message center button + showNotice: boolean; + showSearch: boolean; +} + +export interface LocaleSetting { + showPicker: boolean; + // Current language + locale: LocaleType; + // default language + fallback: LocaleType; + // available Locales + availableLocales: LocaleType[]; +} + +export interface TransitionSetting { + // Whether to open the page switching animation + enable: boolean; + // Route basic switching animation + basicTransition: RouterTransitionEnum; + // Whether to open page switching loading + openPageLoading: boolean; + // Whether to open the top progress bar + openNProgress: boolean; +} + +export interface ProjectConfig { + // Storage location of permission related information + permissionCacheType: CacheTypeEnum; + // Whether to show the configuration button + showSettingButton: boolean; + // Whether to show the theme switch button + showDarkModeToggle: boolean; + // Configure where the button is displayed + settingButtonPosition: SettingButtonPositionEnum; + // Session timeout processing + sessionTimeoutProcessing: SessionTimeoutProcessingEnum; + // Website gray mode, open for possible mourning dates + grayMode: boolean; + // Whether to turn on the color weak mode + colorWeak: boolean; + // Theme color + themeColor: string; + // 系统背景 + sysBg: string; + + // The main interface is displayed in full screen, the menu is not displayed, and the top + fullContent: boolean; + // content width + contentMode: ContentEnum; + // Whether to display the logo + showLogo: boolean; + // Whether to show the global footer + showFooter: boolean; + // menuType: MenuTypeEnum; + headerSetting: HeaderSetting; + // menuSetting + menuSetting: MenuSetting; + // Multi-tab settings + multiTabsSetting: MultiTabsSetting; + // Animation configuration + transitionSetting: TransitionSetting; + // pageLayout whether to enable keep-alive + openKeepAlive: boolean; + // Lock screen time + lockTime: number; + // Show breadcrumbs + showBreadCrumb: boolean; + // Show breadcrumb icon + showBreadCrumbIcon: boolean; + // Use error-handler-plugin + useErrorHandle: boolean; + // Whether to open back to top + useOpenBackTop: boolean; + // Is it possible to embed iframe pages + canEmbedIFramePage: boolean; + // Whether to delete unclosed messages and notify when switching the interface + closeMessageOnSwitch: boolean; + // Whether to cancel the http request that has been sent but not responded when switching the interface. + removeAllHttpPending: boolean; + sysConfigInfo: SysConfigInfo; + globalBorderRadius: number; +} + +export interface GlobConfig { + // Site title + title: string; + // Service interface url + apiUrl: string; + // Report Service interface url + reportApiUrl: string; + // Upload url + uploadUrl?: string; + // Service interface url prefix + urlPrefix?: string; + // Project abbreviation + shortName: string; + webSocketUrl: string; + cipherKey: string; + aMapJsKey: string; + aMapWebKey: string; + aMapSecurityJsCode: string; + filePreviewServer: string; + dataVUrl: string; + reportServer: string; + report: string; +} +export interface GlobEnvConfig { + // Site title + VITE_GLOB_APP_TITLE: string; + // Service interface url + VITE_GLOB_API_URL: string; + // Report Service interface url + VITE_GLOB_REPORT_API_URL: string; + // Service interface url prefix + VITE_GLOB_API_URL_PREFIX?: string; + // Project abbreviation + VITE_GLOB_APP_SHORT_NAME: string; + VITE_GLOB_WEBSOCKET_URL: string; +} diff --git a/types/global.d.ts b/types/global.d.ts new file mode 100644 index 0000000..8c199b7 --- /dev/null +++ b/types/global.d.ts @@ -0,0 +1,90 @@ +import type { ComponentRenderProxy, VNode, VNodeChild, ComponentPublicInstance, FunctionalComponent, PropType as VuePropType } from 'vue'; + +declare global { + const __APP_INFO__: { + pkg: { + name: string; + version: string; + dependencies: Recordable; + devDependencies: Recordable; + }; + lastBuildTime: string; + }; + // declare interface Window { + // // Global vue app instance + // __APP__: App; + // } + + // vue + declare type PropType = VuePropType; + declare type VueNode = VNodeChild | JSX.Element; + + export type Writable = { + -readonly [P in keyof T]: T[P]; + }; + + declare type Nullable = T | null; + declare type NonNullable = T extends null | undefined ? never : T; + declare type Recordable = Record; + declare type ReadonlyRecordable = { + readonly [key: string]: T; + }; + declare type Indexable = { + [key: string]: T; + }; + declare type DeepPartial = { + [P in keyof T]?: DeepPartial; + }; + declare type TimeoutHandle = ReturnType; + declare type IntervalHandle = ReturnType; + + declare interface ChangeEvent extends Event { + target: HTMLInputElement; + } + + declare interface WheelEvent { + path?: EventTarget[]; + } + interface ImportMetaEnv extends ViteEnv { + __: unknown; + } + + declare interface ViteEnv { + VITE_PORT: number; + VITE_USE_PWA: boolean; + VITE_PUBLIC_PATH: string; + VITE_PROXY: [string, string][]; + VITE_GLOB_APP_TITLE: string; + VITE_GLOB_APP_SHORT_NAME: string; + VITE_USE_CDN: boolean; + VITE_DROP_CONSOLE: boolean; + VITE_BUILD_COMPRESS: 'gzip' | 'brotli' | 'none'; + VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean; + VITE_GENERATE_UI: string; + VITE_CDN: string; + } + + declare function parseInt(s: string | number, radix?: number): number; + + declare function parseFloat(string: string | number): number; + + namespace JSX { + // tslint:disable no-empty-interface + type Element = VNode; + // tslint:disable no-empty-interface + type ElementClass = ComponentRenderProxy; + interface ElementAttributesProperty { + $props: any; + } + interface IntrinsicElements { + [elem: string]: any; + } + interface IntrinsicAttributes { + [elem: string]: any; + } + } +} + +declare module 'vue' { + export type JSXComponent = { new (): ComponentPublicInstance } | FunctionalComponent; +} diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..b279c0a --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,27 @@ +declare interface Fn { + (...arg: T[]): R; +} + +declare interface PromiseFn { + (...arg: T[]): Promise; +} + +declare type RefType = T | null; + +declare type LabelValueOptions = { + label: string; + value: any; + [key: string]: string | number | boolean; +}[]; + +declare type EmitType = (event: string, ...args: any[]) => void; + +declare type TargetContext = '_self' | '_blank'; + +declare interface ComponentElRef { + $el: T; +} + +declare type ComponentRef = ComponentElRef | null; + +declare type ElRef = Nullable; diff --git a/types/module.d.ts b/types/module.d.ts new file mode 100644 index 0000000..9615206 --- /dev/null +++ b/types/module.d.ts @@ -0,0 +1,16 @@ +declare module '*.vue' { + import { DefineComponent } from 'vue'; + const Component: DefineComponent<{}, {}, any>; + export default Component; +} + +declare module 'ant-design-vue/es/locale/*' { + import { Locale } from 'ant-design-vue/types/locale-provider'; + const locale: Locale & ReadonlyRecordable; + export default locale as Locale & ReadonlyRecordable; +} + +declare module 'virtual:*' { + const result: any; + export default result; +} diff --git a/types/store.d.ts b/types/store.d.ts new file mode 100644 index 0000000..9eccb97 --- /dev/null +++ b/types/store.d.ts @@ -0,0 +1,115 @@ +import { ErrorTypeEnum } from '@/enums/exceptionEnum'; +import { MenuModeEnum, MenuTypeEnum } from '@/enums/menuEnum'; + +// Lock screen information +export interface LockInfo { + // Is it locked? + isLock?: boolean; +} + +// Error-log information +export interface ErrorLogInfo { + // Type of error + type: ErrorTypeEnum; + // Error file + file: string; + // Error name + name?: string; + // Error message + message: string; + // Error stack + stack?: string; + // Error detail + detail: string; + // Error url + url: string; + // Error time + time?: string; +} + +export interface PermissionChildItem { + id: string; + enCode: string; + fullName: string; +} + +export interface PermissionInfo { + modelId: string; + moduleName: string; + button: PermissionChildItem[]; + column: PermissionChildItem[]; + form: PermissionChildItem[]; + resource: PermissionChildItem[]; +} + +export interface SysConfigInfo { + appIcon: Nullable; + companyName: Nullable; + copyright: Nullable; + loginIcon: Nullable; + logoIcon: Nullable; + navigationIcon: Nullable; + workLogoIcon: Nullable; + newUserDefaultPassword: Nullable; + sysName: Nullable; + sysVersion: Nullable; + title: Nullable; + yunzhupaasDomain: Nullable; + defaultView: Nullable; + showLunarCalendar: Nullable; + firstDay: number; + duration: number; + flowSign: number; + flowTodo: number; + delegateScope: number; + delegateAck: number; + proxyScope: number; + proxyAck: number; +} + +export interface SystemInfo { + id: string; + name: Nullable; + icon: Nullable; + currentSystem: boolean; +} + +export interface UserInfo { + birthday: Nullable; + departmentId: Nullable; + departmentName: Nullable; + email: Nullable; + headIcon: Nullable; + isAdministrator: boolean; + manager: Nullable; + mobilePhone: Nullable; + organizeId: Nullable; + organizeIdList: Nullable; + organizeName: Nullable; + portalId: Nullable; + positionId: Nullable; + positionName: string; + positionIds: any[]; + prevLogin: number; + prevLoginIPAddress: Nullable; + prevLoginIPAddressName: Nullable; + prevLoginTime: Nullable; + roleName: Nullable; + roleIds: string[]; + groupIds: string[]; + systemId: string; + systemIds: SystemInfo[]; + userAccount: string; + userId: string; + userName: Nullable; + signImg: string; + signId: string; + standingList: any[]; +} + +export interface BeforeMiniState { + menuCollapsed?: boolean; + menuSplit?: boolean; + menuMode?: MenuModeEnum; + menuType?: MenuTypeEnum; +} diff --git a/types/utils.d.ts b/types/utils.d.ts new file mode 100644 index 0000000..6500d44 --- /dev/null +++ b/types/utils.d.ts @@ -0,0 +1,5 @@ +import type { ComputedRef, Ref } from 'vue'; + +export type DynamicProps = { + [P in keyof T]: Ref | T[P] | ComputedRef; +}; diff --git a/types/vue-router.d.ts b/types/vue-router.d.ts new file mode 100644 index 0000000..a84d0a9 --- /dev/null +++ b/types/vue-router.d.ts @@ -0,0 +1,43 @@ +export {}; + +declare module 'vue-router' { + interface RouteMeta extends Record { + orderNo?: number; + // title + title: string; + // dynamic router level. + dynamicLevel?: number; + // dynamic router real route path (For performance). + realPath?: string; + // Whether to ignore permissions + ignoreAuth?: boolean; + // Whether not to cache + ignoreKeepAlive?: boolean; + // Is it fixed on tab + affix?: boolean; + // icon on tab + icon?: string; + frameSrc?: string; + // current page transition + transitionName?: string; + // Whether the route has been dynamically added + hideBreadcrumb?: boolean; + // Hide submenu + hideChildrenInMenu?: boolean; + // Carrying parameters + carryParam?: boolean; + // Used internally to mark single-level menus + single?: boolean; + // Currently active menu + currentActiveMenu?: string; + // Never show in tab + hideTab?: boolean; + // Never show in menu + hideMenu?: boolean; + isLink?: boolean; + // only build for Menu + ignoreRoute?: boolean; + // Hide path for children + hidePathForChildren?: boolean; + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..d6dbb21 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,145 @@ +import type { UserConfig, ConfigEnv } from 'vite'; +import pkg from './package.json'; +import dayjs from 'dayjs'; +import { loadEnv } from 'vite'; +import { resolve } from 'path'; +import { generateModifyVars } from './build/generate/generateModifyVars'; +import { createProxy } from './build/vite/proxy'; +import { wrapperEnv } from './build/utils'; +import { createVitePlugins } from './build/vite/plugin'; +import { OUTPUT_DIR } from './build/constant'; + +function pathResolve(dir: string) { + return resolve(process.cwd(), '.', dir); +} + +const { dependencies, devDependencies, name, version } = pkg; +const __APP_INFO__ = { + pkg: { dependencies, devDependencies, name, version }, + lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), +}; + +export default ({ command, mode }: ConfigEnv): UserConfig => { + const root = process.cwd(); + + const env = loadEnv(mode, root); + + // The boolean type read by loadEnv is a string. This function can be converted to boolean type + const viteEnv = wrapperEnv(env); + + const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv; + + const isBuild = command === 'build'; + + return { + base: VITE_PUBLIC_PATH, + root, + resolve: { + alias: [ + { + find: 'vue-i18n', + replacement: 'vue-i18n/dist/vue-i18n.cjs.js', + }, + // @/xxxx => src/xxxx + { + find: /@\//, + replacement: pathResolve('src') + '/', + }, + // #/xxxx => types/xxxx + { + find: /#\//, + replacement: pathResolve('types') + '/', + }, + // 新增:yunzhu-bpmn 映射到 zero-bpmn + { + find: 'yunzhupaas-bpmn', + replacement: pathResolve('node_modules/zero-bpmn'), + }, + // 新增:yunzhu-univer 映射到 zero-univer + { + find: 'yunzhupaas-univer', + replacement: pathResolve('node_modules/zero-univer'), + } + ], + }, + server: { + https: false, + // Listening on all local IPs + host: true, + port: VITE_PORT, + // Load proxy configuration from .env + proxy: createProxy(VITE_PROXY), + open: true, //vite项目启动时自动打开浏览器 + // 👇 就加这一行!解决域名拦截问题 + allowedHosts: true + }, + esbuild: { + drop: VITE_DROP_CONSOLE ? ['console', 'debugger'] : [], + }, + build: { + target: 'es2022', + cssTarget: 'chrome80', + outDir: OUTPUT_DIR, + minify: 'terser', + terserOptions: { + compress: { + keep_infinity: true, + // Used to delete console in production environment + drop_console: VITE_DROP_CONSOLE, + drop_debugger: true, + }, + }, + // Turning off reportCompressedSize display can slightly reduce packaging time + reportCompressedSize: false, + chunkSizeWarningLimit: 2000, + rollupOptions: { + input: { + index: pathResolve('index.html'), + }, + // 静态资源分类打包 + output: { + chunkFileNames: 'static/js/[name]-[hash].js', + entryFileNames: 'static/js/[name]-[hash].js', + assetFileNames: 'static/[ext]/[name]-[hash].[ext]', + }, + }, + }, + define: { + // setting vue-i18-next + // Suppress warning + __INTLIFY_PROD_DEVTOOLS__: false, + __APP_INFO__: JSON.stringify(__APP_INFO__), + }, + css: { + preprocessorOptions: { + less: { + modifyVars: generateModifyVars(), + javascriptEnabled: true, + }, + }, + }, + + // The vite plugin used by the project. The quantity is large, so it is separately extracted and managed + plugins: createVitePlugins(viteEnv, isBuild), + + optimizeDeps: { + esbuildOptions: { + target: 'es2020', + }, + // @iconify/iconify: The dependency is dynamically and virtually loaded by @purge-icons/generated, so it needs to be specified explicitly + include: [ + '@vue/runtime-core', + '@vue/shared', + '@iconify/iconify', + 'ant-design-vue/es/locale/zh_CN', + 'ant-design-vue/es/locale/zh_TW', + 'ant-design-vue/es/locale/en_US', + `monaco-editor/esm/vs/language/json/json.worker`, + `monaco-editor/esm/vs/language/css/css.worker`, + `monaco-editor/esm/vs/language/html/html.worker`, + `monaco-editor/esm/vs/language/typescript/ts.worker`, + `monaco-editor/esm/vs/editor/editor.worker`, + ], + }, + }; +}; diff --git a/windi.config.ts b/windi.config.ts new file mode 100644 index 0000000..0f3d1f2 --- /dev/null +++ b/windi.config.ts @@ -0,0 +1,74 @@ +import { defineConfig } from 'vite-plugin-windicss'; +import { primaryColor } from './build/config/themeConfig'; + +export default defineConfig({ + darkMode: 'class', + plugins: [createEnterPlugin()], + theme: { + extend: { + zIndex: { + '-1': '-1', + }, + colors: { + primary: primaryColor, + }, + screens: { + sm: '576px', + md: '768px', + lg: '992px', + xl: '1200px', + '2xl': '1600px', + }, + }, + }, +}); + +/** + * Used for animation when the element is displayed. + * @param maxOutput The larger the maxOutput output, the larger the generated css volume. + */ +function createEnterPlugin(maxOutput = 6) { + const createCss = (index: number, d = 'x') => { + const upd = d.toUpperCase(); + return { + [`*> .enter-${d}:nth-child(${index})`]: { + transform: `translate${upd}(50px)`, + }, + [`*> .-enter-${d}:nth-child(${index})`]: { + transform: `translate${upd}(-50px)`, + }, + [`* > .enter-${d}:nth-child(${index}),* > .-enter-${d}:nth-child(${index})`]: { + 'z-index': `${10 - index}`, + opacity: '0', + animation: `enter-${d}-animation 0.4s ease-in-out 0.3s`, + 'animation-fill-mode': 'forwards', + 'animation-delay': `${(index * 1) / 10}s`, + }, + }; + }; + const handler = ({ addBase }) => { + const addRawCss = {}; + for (let index = 1; index < maxOutput; index++) { + Object.assign(addRawCss, { + ...createCss(index, 'x'), + ...createCss(index, 'y'), + }); + } + addBase({ + ...addRawCss, + [`@keyframes enter-x-animation`]: { + to: { + opacity: '1', + transform: 'translateX(0)', + }, + }, + [`@keyframes enter-y-animation`]: { + to: { + opacity: '1', + transform: 'translateY(0)', + }, + }, + }); + }; + return { handler }; +}