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..83a9d2d --- /dev/null +++ b/.env.development @@ -0,0 +1,23 @@ +# 资源公共路径,需要以 /开头和结尾 +VITE_PUBLIC_PATH = / + +# 本地开发代理,可以解决跨域及多地址代理 +# 如果接口地址匹配到,则会转发到http://localhost:30000,防止本地出现跨域问题 +# 可以有多个,注意多个不能换行,否则代理将会失效 +VITE_PROXY = [["/dev","http://localhost:30000"], ["/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:30000' + +# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换 +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..0f790b4 --- /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:30000"]] + +# 第17行,websocket地址 +# 在本地开发环境,将后端默认接口地址的协议改成 ws 即可 +VITE_GLOB_WEBSOCKET_URL='ws://localhost:30000' +``` + +#### 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..918d9db --- /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:30000; + } + + location /websocket { + proxy_pass http://yunzhupaas-gateway-external.java-cloud-v510:30000/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 copy.vue b/src/views/basic/iframe/index copy.vue new file mode 100644 index 0000000..1a9b4d6 --- /dev/null +++ b/src/views/basic/iframe/index copy.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/views/basic/iframe/index.vue b/src/views/basic/iframe/index.vue new file mode 100644 index 0000000..5e81d16 --- /dev/null +++ b/src/views/basic/iframe/index.vue @@ -0,0 +1,102 @@ + + + + + \ No newline at end of file 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/crm/crmlead/Detail.vue b/src/views/crm/crmlead/Detail.vue new file mode 100644 index 0000000..4fb59c9 --- /dev/null +++ b/src/views/crm/crmlead/Detail.vue @@ -0,0 +1,225 @@ + + diff --git a/src/views/crm/crmlead/Form.vue b/src/views/crm/crmlead/Form.vue new file mode 100644 index 0000000..edce843 --- /dev/null +++ b/src/views/crm/crmlead/Form.vue @@ -0,0 +1,457 @@ + + diff --git a/src/views/crm/crmlead/helper/api.ts b/src/views/crm/crmlead/helper/api.ts new file mode 100644 index 0000000..26b81c0 --- /dev/null +++ b/src/views/crm/crmlead/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/CrmLead/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/CrmLead', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/CrmLead/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/CrmLead/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/CrmLead/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/CrmLead/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/CrmLead/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/CrmLead/Actions/Export', data }); +} diff --git a/src/views/crm/crmlead/helper/columnList.ts b/src/views/crm/crmlead/helper/columnList.ts new file mode 100644 index 0000000..e2b6457 --- /dev/null +++ b/src/views/crm/crmlead/helper/columnList.ts @@ -0,0 +1,503 @@ +const columnList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemcd2c2e", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"线索名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774574864579, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"lead_name", + "__vModel__":"lead_name", + "disabled":false, + "id":"lead_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":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem35dee5", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"手机号", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774574898493, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$/", + "message":"请输入正确的手机号码", + "messageI18nCode":"sys.validate.mobilePhone" + } + ], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"mobile", + "__vModel__":"mobile", + "disabled":false, + "id":"mobile", + "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":"formItem4e5a2c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_lead", + "renderKey":1774574938265, + "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":24 + }, + "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":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":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"Unassigned", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774574965631, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem199e0c", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"状态", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"lead_status", + "width":null, + "options":[ + { + "fullName":"待分配", + "id":"Unassigned" + }, + { + "fullName":"跟进中", + "id":"InProgress" + }, + { + "fullName":"已转换", + "id":"Converted" + }, + { + "fullName":"无效", + "id":"Invalid" + } + ], + "__vModel__":"lead_status", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"lead_status", + "placeholder":"请选择状态", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"usersSelect", + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"销售人员", + "fullNameI18nCode":[ + "" + ], + "label":"销售人员", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem20008f", + "yunzhupaasKey":"usersSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"销售人员", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774575084782, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-founder", + "defaultCurrent":false, + "tag":"YunzhupaasUsersSelect", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"sales_id", + "width":null, + "__vModel__":"sales_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"sales_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":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"crm_lead", + "renderKey":1774575125146, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem0800c0", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797256993944371205", + "tipLabel":"", + "tableFixed":"none", + "label":"来源", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"customer_source", + "width":null, + "options":[], + "__vModel__":"customer_source", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"customer_source", + "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":4, + "maxRows":4 + }, + "showCount":false, + "__config__":{ + "formId":"formItem292367", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_lead", + "renderKey":1774575155402, + "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/crm/crmlead/helper/searchList.ts b/src/views/crm/crmlead/helper/searchList.ts new file mode 100644 index 0000000..ffba277 --- /dev/null +++ b/src/views/crm/crmlead/helper/searchList.ts @@ -0,0 +1,146 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem35dee5", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"手机号", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774574898493, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$/", + "message":"请输入正确的手机号码", + "messageI18nCode":"sys.validate.mobilePhone" + } + ], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"mobile", + "__vModel__":"mobile", + "searchMultiple":false, + "disabled":false, + "id":"mobile", + "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":11, + "fullName":"手机号", + "label":"手机号", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":true, + "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":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"crm_lead", + "renderKey":1774575125146, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem0800c0", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797256993944371205", + "tipLabel":"", + "tableFixed":"none", + "label":"来源", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"customer_source", + "options":[], + "__vModel__":"customer_source", + "searchMultiple":true, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"customer_source", + "placeholder":"请选择来源", + "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/crm/crmlead/helper/superQueryJson.ts b/src/views/crm/crmlead/helper/superQueryJson.ts new file mode 100644 index 0000000..365fda2 --- /dev/null +++ b/src/views/crm/crmlead/helper/superQueryJson.ts @@ -0,0 +1,440 @@ +const superQueryJson = [ + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"线索名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemcd2c2e", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"线索名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774574864579, + "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__":"lead_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"lead_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":11, + "useScan":false, + "suffixIcon":"", + "fullName":"手机号", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem35dee5", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"手机号", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774574898493, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[ + { + "pattern":"/^1[3456789]\\d{9}$/", + "message":"请输入正确的手机号码", + "messageI18nCode":"sys.validate.mobilePhone" + } + ], + "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__":"mobile", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"mobile", + "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":"formItem4e5a2c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_lead", + "renderKey":1774574938265, + "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":24 + }, + "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}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"状态", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"Unassigned", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774574965631, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem199e0c", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"状态", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "options":[ + { + "fullName":"待分配", + "id":"Unassigned" + }, + { + "fullName":"跟进中", + "id":"InProgress" + }, + { + "fullName":"已转换", + "id":"Converted" + }, + { + "fullName":"无效", + "id":"Invalid" + } + ], + "__vModel__":"lead_status", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"lead_status", + "placeholder":"请选择状态", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"销售人员", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItem20008f", + "yunzhupaasKey":"usersSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"销售人员", + "trigger":"change", + "showLabel":true, + "required":true, + "tableName":"crm_lead", + "renderKey":1774575084782, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-founder", + "defaultCurrent":false, + "tag":"YunzhupaasUsersSelect", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "__vModel__":"sales_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"sales_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":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"crm_lead", + "renderKey":1774575125146, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem0800c0", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797256993944371205", + "tipLabel":"", + "tableFixed":"none", + "label":"来源", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "options":[], + "__vModel__":"customer_source", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"customer_source", + "placeholder":"请选择来源", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":200, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":4, + "maxRows":4 + }, + "showCount":false, + "__config__":{ + "formId":"formItem292367", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_lead", + "renderKey":1774575155402, + "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/crm/crmlead/index.vue b/src/views/crm/crmlead/index.vue new file mode 100644 index 0000000..42582de --- /dev/null +++ b/src/views/crm/crmlead/index.vue @@ -0,0 +1,686 @@ + + + diff --git a/src/views/crm/crmopportunity/Detail.vue b/src/views/crm/crmopportunity/Detail.vue new file mode 100644 index 0000000..86207de --- /dev/null +++ b/src/views/crm/crmopportunity/Detail.vue @@ -0,0 +1,295 @@ + + diff --git a/src/views/crm/crmopportunity/Form.vue b/src/views/crm/crmopportunity/Form.vue new file mode 100644 index 0000000..04a22ea --- /dev/null +++ b/src/views/crm/crmopportunity/Form.vue @@ -0,0 +1,647 @@ + + diff --git a/src/views/crm/crmopportunity/helper/api.ts b/src/views/crm/crmopportunity/helper/api.ts new file mode 100644 index 0000000..c33eef6 --- /dev/null +++ b/src/views/crm/crmopportunity/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/CrmOpportunity/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/CrmOpportunity', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/CrmOpportunity/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/CrmOpportunity/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/CrmOpportunity/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/CrmOpportunity/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/CrmOpportunity/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/CrmOpportunity/Actions/Export', data }); +} diff --git a/src/views/crm/crmopportunity/helper/columnList.ts b/src/views/crm/crmopportunity/helper/columnList.ts new file mode 100644 index 0000000..ad1d0e0 --- /dev/null +++ b/src/views/crm/crmopportunity/helper/columnList.ts @@ -0,0 +1,619 @@ +const columnList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemccf93a", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商机编码", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575485596, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"opportunity_code", + "__vModel__":"opportunity_code", + "disabled":false, + "id":"opportunity_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":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":"formItemd62246", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商机名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575491289, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"opportunity_name", + "__vModel__":"opportunity_name", + "disabled":false, + "id":"opportunity_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":"" + }, + { + "popupType":"drawer", + "yunzhupaasKey":"relationForm", + "hasPage":false, + "modelId":"806858527036409349", + "pageSize":20, + "columnOptions":[ + { + "label":"企业名称", + "value":"company_name" + }, + { + "label":"类型", + "value":"entity_type" + }, + { + "label":"归属组织", + "value":"org_id" + }, + { + "label":"客户负责人", + "value":"owner_id" + }, + { + "label":"客户等级", + "value":"customer_level" + } + ], + "fullNameI18nCode":[ + "" + ], + "align":"left", + "__config__":{ + "formId":"formItemd16307", + "yunzhupaasKey":"relationForm", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"客户", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575610653, + "layout":"colFormItem", + "transferList":[], + "tagIcon":"icon-ym icon-ym-generator-menu", + "tag":"YunzhupaasRelationForm", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"customer_id", + "__vModel__":"customer_id", + "disabled":false, + "id":"customer_id", + "placeholder":"请选择客户", + "popupWidth":"70%", + "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":"usersSelect", + "clearable":true, + "resizable":true, + "ableIds":[], + "multiple":false, + "fullName":"商机负责人", + "fullNameI18nCode":[ + "" + ], + "label":"商机负责人", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem133e27", + "yunzhupaasKey":"usersSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商机负责人", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575984909, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-founder", + "defaultCurrent":true, + "tag":"YunzhupaasUsersSelect", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"owner_id", + "width":null, + "__vModel__":"owner_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"owner_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":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576009744, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem97b95a", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797444616478523397", + "tipLabel":"", + "tableFixed":"none", + "label":"商机阶段", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"opportunity_stage", + "width":null, + "options":[], + "__vModel__":"opportunity_stage", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"opportunity_stage", + "placeholder":"请选择商机阶段", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"inputNumber", + "controls":false, + "precision":2, + "fullNameI18nCode":[ + "" + ], + "align":"left", + "isAmountChinese":false, + "__config__":{ + "formId":"formItem25e841", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"预计金额", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576045553, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"amount", + "__vModel__":"amount", + "disabled":false, + "id":"amount", + "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":9999999, + "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":"crm_opportunity", + "renderKey":1774576099226, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItemc8fcbf", + "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":"close_date", + "width":null, + "__vModel__":"close_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"close_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":"formItem4b8dd6", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"赢单概率", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576216024, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"probability", + "__vModel__":"probability", + "disabled":false, + "id":"probability", + "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":100, + "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":"crm_opportunity", + "renderKey":1774576256284, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":true, + "tag":"YunzhupaasDatePicker", + "formId":"formIteme2d97f", + "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":"last_followup_date", + "width":null, + "__vModel__":"last_followup_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":true, + "id":"last_followup_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}" + } + } +] +export default columnList \ No newline at end of file diff --git a/src/views/crm/crmopportunity/helper/searchList.ts b/src/views/crm/crmopportunity/helper/searchList.ts new file mode 100644 index 0000000..02d21b4 --- /dev/null +++ b/src/views/crm/crmopportunity/helper/searchList.ts @@ -0,0 +1,205 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItemd62246", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商机名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575491289, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"opportunity_name", + "__vModel__":"opportunity_name", + "searchMultiple":false, + "disabled":false, + "id":"opportunity_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":50, + "fullName":"商机名称", + "label":"商机名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":true, + "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":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576009744, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem97b95a", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797444616478523397", + "tipLabel":"", + "tableFixed":"none", + "label":"商机阶段", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "prop":"opportunity_stage", + "options":[], + "__vModel__":"opportunity_stage", + "searchMultiple":true, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"opportunity_stage", + "placeholder":"请选择商机阶段", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"datePicker", + "clearable":true, + "searchType":3, + "format":"yyyy-MM-dd", + "fullName":"预计成交日期", + "fullNameI18nCode":[ + "" + ], + "label":"预计成交日期", + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576099226, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItemc8fcbf", + "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":"close_date", + "__vModel__":"close_date", + "searchMultiple":false, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"close_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/crm/crmopportunity/helper/superQueryJson.ts b/src/views/crm/crmopportunity/helper/superQueryJson.ts new file mode 100644 index 0000000..c55cc6d --- /dev/null +++ b/src/views/crm/crmopportunity/helper/superQueryJson.ts @@ -0,0 +1,738 @@ +const superQueryJson = [ + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"商机编码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemccf93a", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商机编码", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575485596, + "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__":"opportunity_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"opportunity_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}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"商机名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemd62246", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商机名称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575491289, + "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__":"opportunity_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"opportunity_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}" + } + }, + { + "popupType":"drawer", + "hasPage":false, + "filterable":false, + "clearable":true, + "modelId":"806858527036409349", + "fullName":"客户", + "pageSize":20, + "columnOptions":[ + { + "label":"企业名称", + "value":"company_name" + }, + { + "label":"类型", + "value":"entity_type" + }, + { + "label":"归属组织", + "value":"org_id" + }, + { + "label":"客户负责人", + "value":"owner_id" + }, + { + "label":"客户等级", + "value":"customer_level" + } + ], + "fullNameI18nCode":[ + "" + ], + "relationField":"company_name", + "queryType":0, + "__config__":{ + "formId":"formItemd16307", + "yunzhupaasKey":"relationForm", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"客户", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575610653, + "layout":"colFormItem", + "transferList":[], + "tagIcon":"icon-ym icon-ym-generator-menu", + "tag":"YunzhupaasRelationForm", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "extraOptions":[], + "popupTitle":"选择客户", + "__vModel__":"customer_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"customer_id", + "placeholder":"请选择客户", + "popupWidth":"70%", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "propsValue":"company_id" + }, + { + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"商机负责人", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItem133e27", + "yunzhupaasKey":"usersSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商机负责人", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774575984909, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-founder", + "defaultCurrent":true, + "tag":"YunzhupaasUsersSelect", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"owner_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"owner_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":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576009744, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem97b95a", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797444616478523397", + "tipLabel":"", + "tableFixed":"none", + "label":"商机阶段", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "options":[], + "__vModel__":"opportunity_stage", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"opportunity_stage", + "placeholder":"请选择商机阶段", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "max":9999999, + "precision":2, + "fullName":"预计金额", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"元", + "__config__":{ + "formId":"formItem25e841", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"预计金额", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576045553, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"amount", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"amount", + "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":"crm_opportunity", + "renderKey":1774576099226, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItemc8fcbf", + "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__":"close_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"close_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, + "maxlength":200, + "fullName":"商机简介", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItemdff872", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"商机简介", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576122837, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"desciption", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"desciption", + "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}" + } + }, + { + "controls":false, + "max":100, + "precision":2, + "fullName":"赢单概率", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"%", + "__config__":{ + "formId":"formItem4b8dd6", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "defaultValue":null, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"赢单概率", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576216024, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "__vModel__":"probability", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"probability", + "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":"crm_opportunity", + "renderKey":1774576256284, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":true, + "tag":"YunzhupaasDatePicker", + "formId":"formIteme2d97f", + "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__":"last_followup_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":true, + "id":"last_followup_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, + "maxlength":200, + "fullName":"竞争对手信息", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItemf00947", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"竞争对手信息", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576286031, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"competitor", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"competitor", + "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":200, + "fullName":"决策分析", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItemd031ca", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"决策分析", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576313718, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-textarea", + "tag":"YunzhupaasTextarea", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "__vModel__":"analysis", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"analysis", + "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":200, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItem327c50", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"crm_opportunity", + "renderKey":1774576314248, + "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/crm/crmopportunity/index.vue b/src/views/crm/crmopportunity/index.vue new file mode 100644 index 0000000..8dffd2f --- /dev/null +++ b/src/views/crm/crmopportunity/index.vue @@ -0,0 +1,652 @@ + + + diff --git a/src/views/crm/mdmcompany/Detail.vue b/src/views/crm/mdmcompany/Detail.vue new file mode 100644 index 0000000..7676976 --- /dev/null +++ b/src/views/crm/mdmcompany/Detail.vue @@ -0,0 +1,1052 @@ + + diff --git a/src/views/crm/mdmcompany/Form.vue b/src/views/crm/mdmcompany/Form.vue new file mode 100644 index 0000000..51b6d0a --- /dev/null +++ b/src/views/crm/mdmcompany/Form.vue @@ -0,0 +1,1914 @@ + + diff --git a/src/views/crm/mdmcompany/helper/api.ts b/src/views/crm/mdmcompany/helper/api.ts new file mode 100644 index 0000000..b10cafe --- /dev/null +++ b/src/views/crm/mdmcompany/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/MdmCompany/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/MdmCompany', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/MdmCompany/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/MdmCompany/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/MdmCompany/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/MdmCompany/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/MdmCompany/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/MdmCompany/Actions/Export', data }); +} diff --git a/src/views/crm/mdmcompany/helper/columnList.ts b/src/views/crm/mdmcompany/helper/columnList.ts new file mode 100644 index 0000000..72218a3 --- /dev/null +++ b/src/views/crm/mdmcompany/helper/columnList.ts @@ -0,0 +1,784 @@ +const columnList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem7a8e2d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业编码", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774517618858, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_code", + "__vModel__":"company_code", + "disabled":false, + "id":"company_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":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":"formItem977ea9", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774517624902, + "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":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":"formItemdf17f1", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774517625074, + "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":"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":true, + "tableName":"mdm_company", + "renderKey":1774517712501, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItem60d037", + "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":"formItema17d51", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774518217493, + "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":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":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"EXT", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774518276461, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemf9ae24", + "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":"company_scope", + "width":null, + "options":[ + { + "fullName":"内部公司", + "id":"INT" + }, + { + "fullName":"客商企业", + "id":"EXT" + } + ], + "__vModel__":"company_scope", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_scope", + "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":1774518522631, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemf04bd0", + "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":"enCode" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518361357, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem8deef9", + "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":1774518361164, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem838852", + "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":"areaSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "label":"所属地区", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItema460b7", + "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":1774518666101, + "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":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemed01bf", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518656865, + "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.mobilePhone" + } + ], + "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":"" + } +] +export default columnList \ No newline at end of file diff --git a/src/views/crm/mdmcompany/helper/searchList.ts b/src/views/crm/mdmcompany/helper/searchList.ts new file mode 100644 index 0000000..74f180c --- /dev/null +++ b/src/views/crm/mdmcompany/helper/searchList.ts @@ -0,0 +1,149 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem977ea9", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774517624902, + "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":50, + "fullName":"企业名称", + "label":"企业名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":true, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"radio", + "searchType":1, + "buttonStyle":"solid", + "fullName":"类型", + "fullNameI18nCode":[ + "" + ], + "label":"类型", + "props":{ + "label":"fullName", + "value":"id" + }, + "optionType":"default", + "__config__":{ + "yunzhupaasKey":"radio", + "defaultValue":"ORG", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774517712501, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItem60d037", + "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", + "options":[ + { + "fullName":"企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "searchMultiple":false, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + } +] +export default searchList \ No newline at end of file diff --git a/src/views/crm/mdmcompany/helper/superQueryJson.ts b/src/views/crm/mdmcompany/helper/superQueryJson.ts new file mode 100644 index 0000000..a3a5fca --- /dev/null +++ b/src/views/crm/mdmcompany/helper/superQueryJson.ts @@ -0,0 +1,2275 @@ +const superQueryJson = [ + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem7a8e2d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业编码", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774517618858, + "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_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_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}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"企业名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem977ea9", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774517624902, + "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":"formItemdf17f1", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"简称/昵称", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774517625074, + "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":true, + "tableName":"mdm_company", + "renderKey":1774517712501, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItem60d037", + "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":50, + "useScan":false, + "suffixIcon":"", + "fullName":"社会信用代码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItema17d51", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"社会信用代码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774518217493, + "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":true, + "tableName":"mdm_company", + "renderKey":1774518276461, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemf9ae24", + "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, + "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":1774518357602, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem69746c", + "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":1774518361164, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem838852", + "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":1774518361357, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem8deef9", + "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":1774518522631, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemf04bd0", + "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":1774518525088, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItemdc98d0", + "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":"formItem0a4303", + "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":1774518533499, + "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":"formItem20de10", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"法定代表人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518656592, + "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":"formItemed01bf", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518656865, + "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.mobilePhone" + } + ], + "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":50, + "useScan":false, + "suffixIcon":"", + "fullName":"邮箱", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemb3e280", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518657540, + "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":50, + "useScan":false, + "suffixIcon":"", + "fullName":"网站", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem4ea349", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"网站", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518661749, + "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":"formItem1bd779", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"地址", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518661969, + "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}" + } + }, + { + "filterable":false, + "clearable":true, + "level":2, + "multiple":false, + "fullName":"所属地区", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "formId":"formItema460b7", + "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":1774518666101, + "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}" + } + }, + { + "clearable":true, + "maxlength":200, + "fullName":"经营范围", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":3 + }, + "showCount":false, + "__config__":{ + "formId":"formItemd26c5f", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"经营范围", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518900986, + "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":100, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":2, + "maxRows":2 + }, + "showCount":false, + "__config__":{ + "formId":"formItem29a995", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774518902015, + "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}" + } + }, + { + "ableRelationIds":[], + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"客户负责人", + "fullNameI18nCode":[ + "" + ], + "relationField":"", + "__config__":{ + "relationTable":"crm_customer", + "yunzhupaasKey":"userSelect", + "defaultValue":"", + "parentVModel":"tableField8aadcc", + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774519074242, + "tagIcon":"icon-ym icon-ym-generator-user", + "defaultCurrent":true, + "isSubTable":true, + "tag":"YunzhupaasUserSelect", + "formId":"formItem23193e", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "label":"客户负责人", + "trigger":"change", + "layout":"colFormItem", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "__vModel__":"owner_id", + "style":{ + "width":"100%" + }, + "selectType":"all", + "disabled":false, + "id":"owner_id", + "placeholder":"请选择客户负责人", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "ableIds":[], + "multiple":false, + "fullName":"归属组织", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "relationTable":"crm_customer", + "yunzhupaasKey":"organizeSelect", + "defaultValue":[], + "parentVModel":"tableField8aadcc", + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":true, + "tableName":"mdm_company", + "renderKey":1774519154328, + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "isSubTable":true, + "tag":"YunzhupaasOrganizeSelect", + "formId":"formItem1a3ddb", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "label":"归属组织", + "trigger":"change", + "layout":"colFormItem", + "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, + "multiple":false, + "fullName":"客户等级", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"enCode" + }, + "__config__":{ + "relationTable":"crm_customer", + "yunzhupaasKey":"select", + "defaultValue":"", + "parentVModel":"tableField8aadcc", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774519226937, + "tagIcon":"icon-ym icon-ym-generator-select", + "isSubTable":true, + "tag":"YunzhupaasSelect", + "formId":"formItem1ee068", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797390895816114181", + "tipLabel":"", + "tableFixed":"none", + "label":"客户等级", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"customer_level", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"customer_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":"enCode" + }, + "__config__":{ + "relationTable":"crm_customer", + "yunzhupaasKey":"select", + "defaultValue":"", + "parentVModel":"tableField8aadcc", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774519337250, + "tagIcon":"icon-ym icon-ym-generator-select", + "isSubTable":true, + "tag":"YunzhupaasSelect", + "formId":"formItemaf9ab8", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797391011549544453", + "tipLabel":"", + "tableFixed":"none", + "label":"生命周期阶段", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "options":[], + "__vModel__":"customer_lifecycle", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"customer_lifecycle", + "placeholder":"请选择生命周期阶段", + "on":{ + "change":"({ 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":"N", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"crm_customer", + "renderKey":1774573933774, + "tagIcon":"icon-ym icon-ym-generator-radio", + "tag":"YunzhupaasRadio", + "formId":"formItemb98a29", + "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":"Y" + }, + { + "fullName":"否", + "id":"N" + } + ], + "__vModel__":"s_public", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"s_public", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + }, + { + "clearable":true, + "format":"yyyy-MM-dd", + "fullName":"最后一次跟进", + "fullNameI18nCode":[ + "" + ], + "__config__":{ + "yunzhupaasKey":"datePicker", + "endRelationField":"", + "defaultValue":null, + "dragDisabled":false, + "className":[], + "showLabel":true, + "required":false, + "tableName":"crm_customer", + "renderKey":1774574040772, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItemb3acd5", + "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__":"yunzhupaas_crm_customer_yunzhupaas_last_followup_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"yunzhupaas_crm_customer_yunzhupaas_last_followup_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, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"联系人信息-联系人", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_contact", + "formId":"formItem2e2f41", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldc4fb23", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系人", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574155089, + "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__":"contact_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldc4fb23-contact_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_contact", + "formId":"formItemff7c91", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldc4fb23", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"联系人职务", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574157323, + "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__":"contact_title", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldc4fb23-contact_title", + "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__":{ + "relationTable":"mdm_company_contact", + "formId":"formItem0f11df", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldc4fb23", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"电话", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574158083, + "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__":"contact_phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldc4fb23-contact_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_contact", + "formId":"formItem3709ae", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldc4fb23", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"邮箱", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574158708, + "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__":"contact_email", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableFieldc4fb23-contact_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":50, + "useScan":false, + "suffixIcon":"", + "fullName":"联系人信息-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_contact", + "formId":"formItem5a7e54", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldc4fb23", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574159406, + "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":"tableFieldc4fb23-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":50, + "useScan":false, + "suffixIcon":"", + "fullName":"银行信息-银行账号", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItema4673e", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldaafa82", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"银行账号", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574426369, + "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":"tableFieldaafa82-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":50, + "useScan":false, + "suffixIcon":"", + "fullName":"银行信息-开户行", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem127c34", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldaafa82", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574428601, + "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":"tableFieldaafa82-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_bank", + "formId":"formItem1d5bbc", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldaafa82", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"账户名", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574428951, + "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":"tableFieldaafa82-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":50, + "useScan":false, + "suffixIcon":"", + "fullName":"银行信息-开户行城市", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_bank", + "formId":"formItem8919f8", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldaafa82", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"开户行城市", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574429998, + "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":"tableFieldaafa82-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":"formItemc73f2d", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "parentVModel":"tableFieldaafa82", + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774574430694, + "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":"tableFieldaafa82-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/crm/mdmcompany/index.vue b/src/views/crm/mdmcompany/index.vue new file mode 100644 index 0000000..e6af131 --- /dev/null +++ b/src/views/crm/mdmcompany/index.vue @@ -0,0 +1,652 @@ + + + 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/bcmprojecttype/Detail.vue b/src/views/mdm/bcmprojecttype/Detail.vue new file mode 100644 index 0000000..9fcfb5c --- /dev/null +++ b/src/views/mdm/bcmprojecttype/Detail.vue @@ -0,0 +1,182 @@ + + diff --git a/src/views/mdm/bcmprojecttype/Form.vue b/src/views/mdm/bcmprojecttype/Form.vue new file mode 100644 index 0000000..53e1608 --- /dev/null +++ b/src/views/mdm/bcmprojecttype/Form.vue @@ -0,0 +1,362 @@ + + diff --git a/src/views/mdm/bcmprojecttype/helper/api.ts b/src/views/mdm/bcmprojecttype/helper/api.ts new file mode 100644 index 0000000..43e7c6f --- /dev/null +++ b/src/views/mdm/bcmprojecttype/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/BcmProjectType/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/BcmProjectType', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/BcmProjectType/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/BcmProjectType/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/BcmProjectType/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/BcmProjectType/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/BcmProjectType/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/BcmProjectType/Actions/Export', data }); +} diff --git a/src/views/mdm/bcmprojecttype/helper/columnList.ts b/src/views/mdm/bcmprojecttype/helper/columnList.ts new file mode 100644 index 0000000..9261683 --- /dev/null +++ b/src/views/mdm/bcmprojecttype/helper/columnList.ts @@ -0,0 +1,214 @@ +const columnList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem69cbe2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目类型编码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"bcm_project_type", + "renderKey":1774504684544, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"project_type_code", + "__vModel__":"project_type_code", + "disabled":false, + "id":"project_type_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":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":"formItembf3850", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目类型名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"bcm_project_type", + "renderKey":1774504743202, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"project_type_name", + "__vModel__":"project_type_name", + "disabled":false, + "id":"project_type_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":"textarea", + "clearable":true, + "resizable":true, + "maxlength":100, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "label":"备注", + "sortable":false, + "align":"left", + "autoSize":{ + "minRows":3, + "maxRows":4 + }, + "showCount":false, + "__config__":{ + "formId":"formIteme2bc88", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"bcm_project_type", + "renderKey":1774504772430, + "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/bcmprojecttype/helper/searchList.ts b/src/views/mdm/bcmprojecttype/helper/searchList.ts new file mode 100644 index 0000000..6c58858 --- /dev/null +++ b/src/views/mdm/bcmprojecttype/helper/searchList.ts @@ -0,0 +1,2 @@ +const searchList = [] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/bcmprojecttype/helper/superQueryJson.ts b/src/views/mdm/bcmprojecttype/helper/superQueryJson.ts new file mode 100644 index 0000000..086ea87 --- /dev/null +++ b/src/views/mdm/bcmprojecttype/helper/superQueryJson.ts @@ -0,0 +1,187 @@ +const superQueryJson = [ + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"项目类型编码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem69cbe2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目类型编码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"bcm_project_type", + "renderKey":1774504684544, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":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__":"project_type_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_type_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}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"项目类型名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItembf3850", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目类型名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"bcm_project_type", + "renderKey":1774504743202, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":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__":"project_type_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_type_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":100, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":3, + "maxRows":4 + }, + "showCount":false, + "__config__":{ + "formId":"formIteme2bc88", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"bcm_project_type", + "renderKey":1774504772430, + "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/bcmprojecttype/index.vue b/src/views/mdm/bcmprojecttype/index.vue new file mode 100644 index 0000000..fa6ce9f --- /dev/null +++ b/src/views/mdm/bcmprojecttype/index.vue @@ -0,0 +1,640 @@ + + + diff --git a/src/views/mdm/mdmcompany/Detail.vue b/src/views/mdm/mdmcompany/Detail.vue new file mode 100644 index 0000000..4f02002 --- /dev/null +++ b/src/views/mdm/mdmcompany/Detail.vue @@ -0,0 +1,1005 @@ + + diff --git a/src/views/mdm/mdmcompany/Form.vue b/src/views/mdm/mdmcompany/Form.vue new file mode 100644 index 0000000..60e618e --- /dev/null +++ b/src/views/mdm/mdmcompany/Form.vue @@ -0,0 +1,1738 @@ + + diff --git a/src/views/mdm/mdmcompany/helper/api.ts b/src/views/mdm/mdmcompany/helper/api.ts new file mode 100644 index 0000000..b10cafe --- /dev/null +++ b/src/views/mdm/mdmcompany/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/MdmCompany/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/MdmCompany', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/MdmCompany/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/MdmCompany/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/MdmCompany/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/MdmCompany/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/MdmCompany/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/MdmCompany/Actions/Export', data }); +} diff --git a/src/views/mdm/mdmcompany/helper/columnList.ts b/src/views/mdm/mdmcompany/helper/columnList.ts new file mode 100644 index 0000000..301f9b7 --- /dev/null +++ b/src/views/mdm/mdmcompany/helper/columnList.ts @@ -0,0 +1,1411 @@ +const columnList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItemd18905", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业编码", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506476411, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":8 + }, + "readonly":false, + "prop":"company_code", + "__vModel__":"company_code", + "disabled":false, + "id":"company_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":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":"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":"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":"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 + }, + "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", + "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":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/mdmcompany/helper/searchList.ts b/src/views/mdm/mdmcompany/helper/searchList.ts new file mode 100644 index 0000000..4f3a6f7 --- /dev/null +++ b/src/views/mdm/mdmcompany/helper/searchList.ts @@ -0,0 +1,149 @@ +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":true, + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "prefixIcon":"", + "labelI18nCode":"" + }, + { + "yunzhupaasKey":"radio", + "searchType":1, + "buttonStyle":"solid", + "fullName":"类型", + "fullNameI18nCode":[ + "" + ], + "label":"类型", + "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", + "options":[ + { + "fullName":"企业", + "id":"ORG" + }, + { + "fullName":"个人", + "id":"IND" + } + ], + "__vModel__":"entity_type", + "searchMultiple":false, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"entity_type", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + }, + "direction":"horizontal" + } +] +export default searchList \ No newline at end of file diff --git a/src/views/mdm/mdmcompany/helper/superQueryJson.ts b/src/views/mdm/mdmcompany/helper/superQueryJson.ts new file mode 100644 index 0000000..33fef18 --- /dev/null +++ b/src/views/mdm/mdmcompany/helper/superQueryJson.ts @@ -0,0 +1,1931 @@ +const superQueryJson = [ + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"企业编码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemd18905", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"企业编码", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_company", + "renderKey":1774506476411, + "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_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"company_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}" + } + }, + { + "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, + "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}" + } + }, + { + "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}" + } + }, + { + "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":10, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-联系人", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_contact", + "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__":"contact_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-contact_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_contact", + "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__":"contact_title", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-contact_title", + "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__":{ + "relationTable":"mdm_company_contact", + "formId":"formItem3191b2", + "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":1774507445601, + "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__":"contact_phone", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-contact_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_contact", + "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__":"contact_email", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"tableField46dc53-contact_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":50, + "useScan":false, + "suffixIcon":"", + "fullName":"设计子表-备注", + "fullNameI18nCode":[ + "", + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "relationTable":"mdm_company_contact", + "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/mdmcompany/index.vue b/src/views/mdm/mdmcompany/index.vue new file mode 100644 index 0000000..e69cb31 --- /dev/null +++ b/src/views/mdm/mdmcompany/index.vue @@ -0,0 +1,669 @@ + + + diff --git a/src/views/mdm/mdmcontracttype/Detail.vue b/src/views/mdm/mdmcontracttype/Detail.vue new file mode 100644 index 0000000..8dca8e7 --- /dev/null +++ b/src/views/mdm/mdmcontracttype/Detail.vue @@ -0,0 +1,402 @@ + + diff --git a/src/views/mdm/mdmcontracttype/Form.vue b/src/views/mdm/mdmcontracttype/Form.vue new file mode 100644 index 0000000..2e9aa72 --- /dev/null +++ b/src/views/mdm/mdmcontracttype/Form.vue @@ -0,0 +1,998 @@ + + + \ No newline at end of file diff --git a/src/views/mdm/mdmcontracttype/helper/api.ts b/src/views/mdm/mdmcontracttype/helper/api.ts new file mode 100644 index 0000000..297c648 --- /dev/null +++ b/src/views/mdm/mdmcontracttype/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/MdmContractType/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/MdmContractType', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/MdmContractType/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/MdmContractType/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/MdmContractType/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/MdmContractType/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/MdmContractType/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/MdmContractType/Actions/Export', data }); +} diff --git a/src/views/mdm/mdmcontracttype/helper/columnList.ts b/src/views/mdm/mdmcontracttype/helper/columnList.ts new file mode 100644 index 0000000..9592d7e --- /dev/null +++ b/src/views/mdm/mdmcontracttype/helper/columnList.ts @@ -0,0 +1,600 @@ +const columnList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem49f65f", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"合同类型编码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_contract_type", + "renderKey":1774838784995, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"contract_type_code", + "__vModel__":"contract_type_code", + "disabled":false, + "id":"contract_type_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":25, + "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":"formItema51d1e", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"合同类型名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_contract_type", + "renderKey":1774838789410, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"contract_type_name", + "__vModel__":"contract_type_name", + "disabled":false, + "id":"contract_type_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":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"项目类型", + "fullNameI18nCode":[ + "" + ], + "label":"项目类型", + "sortable":false, + "align":"left", + "props":{ + "label":"project_type_name", + "value":"project_type_code" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"SOFT", + "dragDisabled":false, + "className":[], + "propsUrl":"797165402772733957", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_contract_type", + "renderKey":1774840899305, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemac75d7", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dynamic", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"项目类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"项目类型列表", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"project_type", + "width":null, + "options":[], + "__vModel__":"project_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_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":"revenue", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774839981641, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemb30132", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"合同模式", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":6 + }, + "prop":"contract_mode", + "width":null, + "options":[ + { + "fullName":"收入类合同", + "id":"revenue" + }, + { + "fullName":"支付类合同", + "id":"payment" + } + ], + "__vModel__":"contract_mode", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"contract_mode", + "placeholder":"请选择", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"switch", + "resizable":true, + "activeValue":1, + "inactiveValue":0, + "fullName":"材料清单", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "label":"材料清单", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItemef29e9", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"材料清单", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840487884, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "prop":"cl_list_enabled", + "width":null, + "__vModel__":"cl_list_enabled", + "fixed":"none", + "disabled":false, + "activeTxt":"Y", + "id":"cl_list_enabled", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"switch", + "resizable":true, + "activeValue":1, + "inactiveValue":0, + "fullName":"劳务清单", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "label":"劳务清单", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItemc48550", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"劳务清单", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840557640, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "prop":"rg_list_enabled", + "width":null, + "__vModel__":"rg_list_enabled", + "fixed":"none", + "disabled":false, + "activeTxt":"Y", + "id":"rg_list_enabled", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"switch", + "resizable":true, + "activeValue":1, + "inactiveValue":0, + "fullName":"工程量清单", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "label":"工程量清单", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem477d28", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"工程量清单", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840573827, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "prop":"gcl_list_enabled", + "width":null, + "__vModel__":"gcl_list_enabled", + "fixed":"none", + "disabled":false, + "activeTxt":"Y", + "id":"gcl_list_enabled", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"switch", + "resizable":true, + "activeValue":1, + "inactiveValue":0, + "fullName":"租赁清单", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "label":"租赁清单", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem061f70", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"租赁清单", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840537386, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "prop":"zl_list_enabled", + "width":null, + "__vModel__":"zl_list_enabled", + "fixed":"none", + "disabled":false, + "activeTxt":"Y", + "id":"zl_list_enabled", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"switch", + "resizable":true, + "activeValue":1, + "inactiveValue":0, + "fullName":"工作流程", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "label":"工作流程", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem43b97d", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"工作流程", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840790597, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "prop":"workflow_enabled", + "width":null, + "__vModel__":"workflow_enabled", + "fixed":"none", + "disabled":false, + "activeTxt":"Y", + "id":"workflow_enabled", + "labelI18nCode":"", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "yunzhupaasKey":"switch", + "resizable":true, + "activeValue":1, + "inactiveValue":0, + "fullName":"在线合同模板", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "label":"在线合同模板", + "sortable":false, + "align":"left", + "__config__":{ + "formId":"formItem098126", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"在线合同模板", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840646431, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "prop":"contract_temp_enabled", + "width":null, + "__vModel__":"contract_temp_enabled", + "fixed":"none", + "disabled":false, + "activeTxt":"Y", + "id":"contract_temp_enabled", + "labelI18nCode":"", + "on":{ + "change":"({ 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/mdmcontracttype/helper/searchList.ts b/src/views/mdm/mdmcontracttype/helper/searchList.ts new file mode 100644 index 0000000..599ae43 --- /dev/null +++ b/src/views/mdm/mdmcontracttype/helper/searchList.ts @@ -0,0 +1,223 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItem49f65f", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"合同类型编码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_contract_type", + "renderKey":1774838784995, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"contract_type_code", + "__vModel__":"contract_type_code", + "searchMultiple":false, + "disabled":false, + "id":"contract_type_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, + "searchType":2, + "maxlength":25, + "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":"formItema51d1e", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"合同类型名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_contract_type", + "renderKey":1774838789410, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":12 + }, + "readonly":false, + "prop":"contract_type_name", + "__vModel__":"contract_type_name", + "searchMultiple":false, + "disabled":false, + "id":"contract_type_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":50, + "fullName":"合同类型名称", + "label":"合同类型名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":true, + "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":"revenue", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774839981641, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemb30132", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"合同模式", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":6 + }, + "prop":"contract_mode", + "options":[ + { + "fullName":"收入类合同", + "id":"revenue" + }, + { + "fullName":"支付类合同", + "id":"payment" + } + ], + "__vModel__":"contract_mode", + "searchMultiple":false, + "isKeyword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"contract_mode", + "placeholder":"请选择", + "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/mdmcontracttype/helper/superQueryJson.ts b/src/views/mdm/mdmcontracttype/helper/superQueryJson.ts new file mode 100644 index 0000000..1493845 --- /dev/null +++ b/src/views/mdm/mdmcontracttype/helper/superQueryJson.ts @@ -0,0 +1,1052 @@ +const superQueryJson = [ + { + "clearable":true, + "maxlength":25, + "useScan":false, + "suffixIcon":"", + "fullName":"合同类型编码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem49f65f", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"合同类型编码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_contract_type", + "renderKey":1774838784995, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "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__":"contract_type_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"contract_type_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}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"合同类型名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItema51d1e", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"合同类型名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_contract_type", + "renderKey":1774838789410, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "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__":"contract_type_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"contract_type_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":"project_type_name", + "value":"project_type_code" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"SOFT", + "dragDisabled":false, + "className":[], + "propsUrl":"797165402772733957", + "templateJson":[], + "showLabel":true, + "required":true, + "tableName":"mdm_contract_type", + "renderKey":1774840899305, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemac75d7", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dynamic", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"项目类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"项目类型列表", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "options":[], + "__vModel__":"project_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_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":"revenue", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774839981641, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemb30132", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"合同模式", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":6 + }, + "options":[ + { + "fullName":"收入类合同", + "id":"revenue" + }, + { + "fullName":"支付类合同", + "id":"payment" + } + ], + "__vModel__":"contract_mode", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"contract_mode", + "placeholder":"请选择", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "formId":"formItemef29e9", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"材料清单", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840487884, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"cl_list_enabled", + "fullName":"材料清单", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "disabled":false, + "activeTxt":"Y", + "id":"cl_list_enabled", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":10, + "useScan":false, + "suffixIcon":"", + "fullName":"材料清单别名", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem3e8d4c", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"材料清单别名", + "trigger":"blur", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851489317, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":4 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"cl_list_alias", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"cl_list_alias", + "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":0, + "fullName":"材料清单顺序", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"", + "__config__":{ + "formId":"formIteme074c9", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "defaultValue":1, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"材料清单顺序", + "trigger":[ + "blur", + "change" + ], + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851512300, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "__vModel__":"cl_lst_seq", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"cl_lst_seq", + "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}" + } + }, + { + "__config__":{ + "formId":"formItem061f70", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"租赁清单", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840537386, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"zl_list_enabled", + "fullName":"租赁清单", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "disabled":false, + "activeTxt":"Y", + "id":"zl_list_enabled", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":10, + "useScan":false, + "suffixIcon":"", + "fullName":"租赁清单别名", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemb6ebcd", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"租赁清单别名", + "trigger":"blur", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851624469, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":4 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"zl_list_alias", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"zl_list_alias", + "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":0, + "fullName":"租赁清单顺序", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"", + "__config__":{ + "formId":"formItembbc79a", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "defaultValue":15.3, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"租赁清单顺序", + "trigger":[ + "blur", + "change" + ], + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851641091, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "__vModel__":"zl_lst_seq", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"zl_lst_seq", + "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}" + } + }, + { + "__config__":{ + "formId":"formItemc48550", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"劳务清单", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840557640, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"rg_list_enabled", + "fullName":"劳务清单", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "disabled":false, + "activeTxt":"Y", + "id":"rg_list_enabled", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":10, + "useScan":false, + "suffixIcon":"", + "fullName":"劳务清单别名", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem2c32bb", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "defaultValue":"", + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"劳务清单别名", + "trigger":"blur", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851667939, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":4 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"rg_list_alias", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"rg_list_alias", + "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":0, + "fullName":"劳务清单顺序", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"", + "__config__":{ + "formId":"formItem820f29", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "defaultValue":1, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"劳务清单顺序", + "trigger":[ + "blur", + "change" + ], + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851672696, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "__vModel__":"rg_lst_seq", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"rg_lst_seq", + "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}" + } + }, + { + "__config__":{ + "formId":"formItem477d28", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"工程量清单", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840573827, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"gcl_list_enabled", + "fullName":"工程量清单", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "disabled":false, + "activeTxt":"Y", + "id":"gcl_list_enabled", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "clearable":true, + "maxlength":10, + "useScan":false, + "suffixIcon":"", + "fullName":"工程量清单别名", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem0ff8b2", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"工程量清单别名", + "trigger":"blur", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851694031, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":4 + }, + "readonly":false, + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "__vModel__":"gcl_list_alias", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"gcl_list_alias", + "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":0, + "fullName":"工程量清单顺序", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"", + "__config__":{ + "formId":"formItemb67ed7", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "defaultValue":1, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"工程量清单顺序", + "trigger":[ + "blur", + "change" + ], + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851695845, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "__vModel__":"gcl_lst_seq", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"gcl_lst_seq", + "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}" + } + }, + { + "__config__":{ + "formId":"formItem098126", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"在线合同模板", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840646431, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"contract_temp_enabled", + "fullName":"在线合同模板", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "disabled":false, + "activeTxt":"Y", + "id":"contract_temp_enabled", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "__config__":{ + "formId":"formItem43b97d", + "yunzhupaasKey":"switch", + "visibility":[ + "pc", + "app" + ], + "defaultValue":0, + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"工作流程", + "trigger":"change", + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774840790597, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-switch", + "tag":"YunzhupaasSwitch", + "regList":[], + "tableAlign":"left", + "span":2 + }, + "activeValue":1, + "inactiveValue":0, + "__vModel__":"workflow_enabled", + "fullName":"工作流程", + "inactiveTxt":"N", + "fullNameI18nCode":[ + "" + ], + "disabled":false, + "activeTxt":"Y", + "id":"workflow_enabled", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "filterable":false, + "clearable":true, + "multiple":false, + "fullName":"流程模板ID,关联流程模板表", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"fullName", + "value":"id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"", + "templateJson":[], + "showLabel":false, + "required":false, + "tableName":"mdm_contract_type", + "renderKey":1774851882338, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemfabe81", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"static", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"流程模板ID,关联流程模板表", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":4 + }, + "options":[ + { + "fullName":"选项一", + "id":"1" + }, + { + "fullName":"选项二", + "id":"2" + } + ], + "__vModel__":"workflow_temp_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"workflow_temp_id", + "placeholder":"请选择", + "on":{ + "change":"({ 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/mdmcontracttype/index.vue b/src/views/mdm/mdmcontracttype/index.vue new file mode 100644 index 0000000..3dbcf72 --- /dev/null +++ b/src/views/mdm/mdmcontracttype/index.vue @@ -0,0 +1,705 @@ + + + diff --git a/src/views/mdm/mdmproject/Detail.vue b/src/views/mdm/mdmproject/Detail.vue new file mode 100644 index 0000000..aa0f36e --- /dev/null +++ b/src/views/mdm/mdmproject/Detail.vue @@ -0,0 +1,231 @@ + + diff --git a/src/views/mdm/mdmproject/Form.vue b/src/views/mdm/mdmproject/Form.vue new file mode 100644 index 0000000..36f2326 --- /dev/null +++ b/src/views/mdm/mdmproject/Form.vue @@ -0,0 +1,521 @@ + + diff --git a/src/views/mdm/mdmproject/helper/api.ts b/src/views/mdm/mdmproject/helper/api.ts new file mode 100644 index 0000000..6757774 --- /dev/null +++ b/src/views/mdm/mdmproject/helper/api.ts @@ -0,0 +1,34 @@ +import { defHttp } from '@/utils/http/axios'; + +// 获取列表 +export function getList(data) { + return defHttp.post({ url: '/api/bcm/MdmProject/getList', data }); +} +// 新建 +export function create(data) { + return defHttp.post({ url:'/api/bcm/MdmProject', data }); +} +// 修改 +export function update(data) { + return defHttp.put({ url: '/api/bcm/MdmProject/'+ data.id, data }); +} +// 详情(无转换数据) +export function getInfo(id) { + return defHttp.get({ url: '/api/bcm/MdmProject/' + id }); +} +// 获取(转换数据) +export function getDetailInfo(id) { + return defHttp.get({ url: '/api/bcm/MdmProject/detail/' + id }); +} +// 删除 +export function del(id) { + return defHttp.delete({ url: '/api/bcm/MdmProject/' + id }); +} +// 批量删除数据 +export function batchDelete(data) { + return defHttp.delete({ url: '/api/bcm/MdmProject/batchRemove', data }); +} +// 导出 +export function exportData(data) { + return defHttp.post({ url: '/api/bcm/MdmProject/Actions/Export', data }); +} diff --git a/src/views/mdm/mdmproject/helper/columnList.ts b/src/views/mdm/mdmproject/helper/columnList.ts new file mode 100644 index 0000000..76bebea --- /dev/null +++ b/src/views/mdm/mdmproject/helper/columnList.ts @@ -0,0 +1,475 @@ +const columnList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "align":"left", + "showCount":false, + "__config__":{ + "formId":"formItem36dc22", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目编码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_project", + "renderKey":1774508650570, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"project_code", + "__vModel__":"project_code", + "disabled":false, + "id":"project_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":30, + "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":"formItemd2b645", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_project", + "renderKey":1774508651244, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"project_name", + "__vModel__":"project_name", + "disabled":false, + "id":"project_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":"treeSelect", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"上级项目", + "fullNameI18nCode":[ + "" + ], + "label":"上级项目", + "sortable":false, + "align":"left", + "props":{ + "children":"children", + "label":"project_name", + "value":"project_id" + }, + "__config__":{ + "yunzhupaasKey":"treeSelect", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"797177453981204485", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509368149, + "tagIcon":"icon-ym icon-ym-generator-tree", + "tag":"YunzhupaasTreeSelect", + "formId":"formItem503db0", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dynamic", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"上级项目", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"项目结构树", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"parent_project_id", + "width":null, + "options":[], + "__vModel__":"parent_project_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"parent_project_id", + "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":false, + "align":"left", + "__config__":{ + "formId":"formItem0f5baf", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509431105, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "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":"select", + "filterable":false, + "clearable":true, + "resizable":true, + "multiple":false, + "fullName":"项目类型", + "fullNameI18nCode":[ + "" + ], + "label":"项目类型", + "sortable":false, + "align":"left", + "props":{ + "label":"project_type_name", + "value":"project_type_id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"797165402772733957", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509499767, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemb4a566", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dynamic", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"项目类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"项目类型列表", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"project_type", + "width":null, + "options":[], + "__vModel__":"project_type", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_type", + "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_project", + "renderKey":1774509542390, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem27f6a6", + "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":24 + }, + "prop":"project_start_date", + "width":null, + "__vModel__":"project_start_date", + "fixed":"none", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"project_start_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":"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_project", + "renderKey":1774509577696, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem4ff05a", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797036777536749573", + "tipLabel":"", + "tableFixed":"none", + "label":"项目状态", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "prop":"project_state_id", + "width":null, + "options":[], + "__vModel__":"project_state_id", + "fixed":"none", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_state_id", + "placeholder":"请选择项目状态", + "labelI18nCode":"", + "on":{ + "change":"({ 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/mdmproject/helper/searchList.ts b/src/views/mdm/mdmproject/helper/searchList.ts new file mode 100644 index 0000000..55f2024 --- /dev/null +++ b/src/views/mdm/mdmproject/helper/searchList.ts @@ -0,0 +1,133 @@ +const searchList = [ + { + "yunzhupaasKey":"input", + "useScan":false, + "suffixIcon":"", + "fullNameI18nCode":[ + "" + ], + "showCount":false, + "__config__":{ + "formId":"formItemd2b645", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_project", + "renderKey":1774508651244, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":true, + "tag":"YunzhupaasInput", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "readonly":false, + "prop":"project_name", + "__vModel__":"project_name", + "searchMultiple":false, + "disabled":false, + "id":"project_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":50, + "fullName":"项目名称", + "label":"项目名称", + "addonAfter":"", + "maskConfig":{ + "prefixType":1, + "useUnrealMask":false, + "maskType":1, + "unrealMaskLength":1, + "prefixLimit":0, + "suffixLimit":0, + "filler":"*", + "prefixSpecifyChar":"", + "suffixType":1, + "ignoreChar":"", + "suffixSpecifyChar":"" + }, + "isKeyword":true, + "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":"formItem0f5baf", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509431105, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "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/mdmproject/helper/superQueryJson.ts b/src/views/mdm/mdmproject/helper/superQueryJson.ts new file mode 100644 index 0000000..ce9255b --- /dev/null +++ b/src/views/mdm/mdmproject/helper/superQueryJson.ts @@ -0,0 +1,513 @@ +const superQueryJson = [ + { + "clearable":true, + "maxlength":30, + "useScan":false, + "suffixIcon":"", + "fullName":"项目编码", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItem36dc22", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目编码", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_project", + "renderKey":1774508650570, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":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__":"project_code", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_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}" + } + }, + { + "clearable":true, + "maxlength":50, + "useScan":false, + "suffixIcon":"", + "fullName":"项目名称", + "fullNameI18nCode":[ + "" + ], + "addonAfter":"", + "showCount":false, + "__config__":{ + "formId":"formItemd2b645", + "yunzhupaasKey":"input", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"项目名称", + "trigger":"blur", + "showLabel":true, + "required":true, + "tableName":"mdm_project", + "renderKey":1774508651244, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-input", + "unique":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__":"project_name", + "useMask":false, + "showPassword":false, + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_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":"project_name", + "value":"project_id" + }, + "__config__":{ + "yunzhupaasKey":"treeSelect", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"797177453981204485", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509368149, + "tagIcon":"icon-ym icon-ym-generator-tree", + "tag":"YunzhupaasTreeSelect", + "formId":"formItem503db0", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dynamic", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"上级项目", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"项目结构树", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "options":[], + "__vModel__":"parent_project_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"parent_project_id", + "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":"formItem0f5baf", + "yunzhupaasKey":"organizeSelect", + "visibility":[ + "pc", + "app" + ], + "defaultValue":[], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"归属组织", + "trigger":"change", + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509431105, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-company", + "defaultCurrent":true, + "tag":"YunzhupaasOrganizeSelect", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "__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, + "multiple":false, + "fullName":"项目类型", + "fullNameI18nCode":[ + "" + ], + "props":{ + "label":"project_type_name", + "value":"project_type_id" + }, + "__config__":{ + "yunzhupaasKey":"select", + "defaultValue":"", + "dragDisabled":false, + "className":[], + "propsUrl":"797165402772733957", + "templateJson":[], + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509499767, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItemb4a566", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dynamic", + "dictionaryType":"", + "tipLabel":"", + "tableFixed":"none", + "label":"项目类型", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"项目类型列表", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "options":[], + "__vModel__":"project_type", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_type", + "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_project", + "renderKey":1774509542390, + "tagIcon":"icon-ym icon-ym-generator-date", + "startRelationField":"", + "defaultCurrent":false, + "tag":"YunzhupaasDatePicker", + "formId":"formItem27f6a6", + "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":24 + }, + "__vModel__":"project_start_date", + "style":{ + "width":"100%" + }, + "startTime":null, + "disabled":false, + "id":"project_start_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}" + } + }, + { + "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_project", + "renderKey":1774509577696, + "tagIcon":"icon-ym icon-ym-generator-select", + "tag":"YunzhupaasSelect", + "formId":"formItem4ff05a", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "dataType":"dictionary", + "dictionaryType":"797036777536749573", + "tipLabel":"", + "tableFixed":"none", + "label":"项目状态", + "trigger":"change", + "layout":"colFormItem", + "useCache":true, + "propsName":"", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "options":[], + "__vModel__":"project_state_id", + "style":{ + "width":"100%" + }, + "disabled":false, + "id":"project_state_id", + "placeholder":"请选择项目状态", + "on":{ + "change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}" + } + }, + { + "controls":false, + "fullName":"顺序号", + "fullNameI18nCode":[ + "" + ], + "thousands":false, + "isAmountChinese":false, + "addonAfter":"", + "__config__":{ + "formId":"formItem28643a", + "yunzhupaasKey":"inputNumber", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"顺序号", + "trigger":[ + "blur", + "change" + ], + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509649106, + "layout":"colFormItem", + "tagIcon":"icon-ym icon-ym-generator-number", + "tag":"YunzhupaasInputNumber", + "regList":[], + "tableAlign":"left", + "span":24 + }, + "__vModel__":"seq_num", + "style":{ + "width":"100%" + }, + "step":1, + "disabled":false, + "id":"seq_num", + "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":200, + "fullName":"备注", + "fullNameI18nCode":[ + "" + ], + "autoSize":{ + "minRows":4, + "maxRows":4 + }, + "showCount":true, + "__config__":{ + "formId":"formItem793976", + "yunzhupaasKey":"textarea", + "visibility":[ + "pc", + "app" + ], + "noShow":false, + "tipLabel":"", + "tableFixed":"none", + "dragDisabled":false, + "className":[], + "label":"备注", + "trigger":"blur", + "showLabel":true, + "required":false, + "tableName":"mdm_project", + "renderKey":1774509685351, + "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/mdmproject/index.vue b/src/views/mdm/mdmproject/index.vue new file mode 100644 index 0000000..5d3b518 --- /dev/null +++ b/src/views/mdm/mdmproject/index.vue @@ -0,0 +1,680 @@ + + + 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 }; +}