diff --git a/.dumi/global.less b/.dumi/global.less index 778625e..0aec62c 100644 --- a/.dumi/global.less +++ b/.dumi/global.less @@ -6,6 +6,10 @@ max-width: none; } +#root .dumi-default-header-content { + max-width: none; +} + #root .dumi-default-header { box-shadow: 2px 1px 16px #dfdfdf; } diff --git a/.dumirc.ts b/.dumirc.ts index e22c241..0df3427 100644 --- a/.dumirc.ts +++ b/.dumirc.ts @@ -4,7 +4,6 @@ import path from 'path'; export default defineConfig({ logo: '/logo.jpg', favicons: ['/logo.jpg'], - history: { type: 'hash' }, themeConfig: { name: 'Lambo', socialLinks: { @@ -17,31 +16,29 @@ export default defineConfig({ '@zhst/biz': path.join(__dirname, 'packages/biz/src'), '@zhst/meta': path.join(__dirname, 'packages/meta/src'), '@zhst/request': path.join(__dirname, 'packages/request/src'), + '@zhst/slave': path.join(__dirname, 'packages/slave/src'), + '@zhst/material': path.join(__dirname, 'packages/material/src'), + '@zhst/icon': path.join(__dirname, 'packages/icon/src'), + '@zhst/map': path.join(__dirname, 'packages/map/src'), }, resolve: { docDirs: ['docs'], atomDirs: [ { type: 'hooks', dir: 'packages/hooks/src' }, { type: 'utils', dir: 'packages/func/src' }, - { type: 'biz', dir: 'packages/biz/src' }, - { type: 'meta', dir: 'packages/meta/src' }, - { type: 'request', dir: 'packages/request/src' }, - { type: 'constants', dir: 'packages/constants/src' }, - { type: 'types', dir: 'packages/types/src' }, + { type: 'module', subType: 'biz', dir: 'packages/biz/src' }, + { type: 'module', subType: 'meta', dir: 'packages/meta/src' }, + { type: 'other', subType: 'request', dir: 'packages/request/src' }, + { type: 'other', subType: 'constants', dir: 'packages/constants/src' }, + { type: 'other', subType: 'types', dir: 'packages/types/src' }, + { type: 'slave', dir: 'packages/slave/src' }, + { type: 'material', dir: 'packages/material/src' }, + { type: 'icon', dir: 'packages/icon/src' }, + { type: 'map', dir: 'packages/map/src' }, ], }, monorepoRedirect: { srcDir: ['packages', 'src'], peerDeps: true, }, - extraBabelPlugins: [ - [ - 'import', - { - libraryName: 'antd', - libraryDirectory: 'es', - style: true, - }, - ], - ], }); diff --git a/.fatherrc.ts b/.fatherrc.ts index 0e503e9..db700bd 100644 --- a/.fatherrc.ts +++ b/.fatherrc.ts @@ -2,14 +2,4 @@ import { defineConfig } from 'father'; export default defineConfig({ // more father config: https://github.com/umijs/father/blob/master/docs/config.md - extraBabelPlugins: [ - [ - 'import', - { - libraryName: 'antd', - libraryDirectory: 'es', - style: true, - }, - ], - ], }); diff --git a/.gitignore b/.gitignore index 544d4ae..96c84a7 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ packages/**/es packages/**/lib /es /lib +pnpm-lock.yaml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 353deb0..5155b1b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,12 +1,32 @@ stages: - build + - package + - deploy + +cache: + policy: pull + key: '$CI_COMMIT_REF_NAME' + paths: + - node_modules/ build: + image: registry.zhst.com/video-analysis/pnpm4 tags: - linux stage: build script: - - cd /home - - ls - - git - - node + - chmod +x ./deploy/build.sh && ./deploy/build.sh + artifacts: + name: '${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}_${CI_JOB_NAME}_${CI_PIPELINE_ID}' + paths: + - ./app/public/* + +package: + tags: + - linux_shell + stage: package + script: + - chmod +x ./deploy/package.sh && ./deploy/package.sh + dependencies: + - build + diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d6aacd6 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,10 @@ +{ + "configurations": [ + { + "type": "chrome", + "name": "http://localhost:8000/metas/big-image-preview", + "request": "launch", + "url": "http://localhost:8000/metas/big-image-preview" + } + ] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..123c217 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM alpine:latest + +ADD ./app/public/ /app/public/ + +CMD [ "sh", "-c", "while true; do echo zhst-web; sleep 1; done" ] \ No newline at end of file diff --git a/deploy/build.sh b/deploy/build.sh new file mode 100755 index 0000000..00a1980 --- /dev/null +++ b/deploy/build.sh @@ -0,0 +1,9 @@ +pnpm install + +pnpm run build:master + +mkdir -p ./app/public/ + +mv ./dist/* ./app/public/ + +cat ./app/public/index.html | head -n 7 diff --git a/deploy/package.sh b/deploy/package.sh new file mode 100644 index 0000000..74c068d --- /dev/null +++ b/deploy/package.sh @@ -0,0 +1,10 @@ +#! /bin/bash +set -e + +export DOCKER_CLI_EXPERIMENTAL=enabled +docker login registry.zhst.com -u zhst -p Zhst666\& + +# docker build -t registry.zhst.com/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME//\//-}-${CI_PIPELINE_ID} -f Dockerfile . +# docker push registry.zhst.com/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME//\//-}-${CI_PIPELINE_ID} +docker buildx build --platform linux/arm64,linux/amd64 -t registry.zhst.com/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME//\//-}-${CI_PIPELINE_ID} -f Dockerfile . --push + diff --git a/global.d.ts b/global.d.ts index 63ff4c6..1ea3960 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1,4 +1 @@ -declare module '@zhst/func'; -declare module '@zhst/hooks'; -declare module '@zhst/meta'; -declare module '@zhst/request'; +declare module '*.less'; diff --git a/package.json b/package.json index 738ca88..e01b2b7 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "scripts": { "add": "pnpm changeset add", "build": "pnpm --filter=@zhst/* run build", + "build:master": "dumi build", "build:watch": "father dev", "dev": "dumi dev", "docs:build": "dumi build", @@ -22,6 +23,7 @@ "lint": "npm run lint:es && npm run lint:css", "lint:css": "stylelint \"{src,test}/**/*.{css,less}\"", "lint:es": "eslint \"{src,test}/**/*.{js,jsx,ts,tsx}\"", + "pkg:build": "pnpm --filter=@zhst/* run build", "prepare": "husky install && dumi setup", "prepublishOnly": "father doctor && npm run build", "pub": "pnpm changeset publish", @@ -58,7 +60,6 @@ "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "@umijs/lint": "^4.0.0", - "babel-plugin-import": "^1.13.8", "dumi": "^2.2.13", "eslint": "^8.23.0", "father": "^4.1.0", diff --git a/packages/biz/.fatherrc.ts b/packages/biz/.fatherrc.ts index 9e3a0ef..447d06b 100644 --- a/packages/biz/.fatherrc.ts +++ b/packages/biz/.fatherrc.ts @@ -2,6 +2,12 @@ import { defineConfig } from 'father'; export default defineConfig({ // more father config: https://github.com/umijs/father/blob/master/docs/config.md - esm: { output: 'es' }, - cjs: { output: 'lib' }, + esm: { + output: 'es', + ignores: ['**/demo/*', 'src/**/demo/*'] + }, + cjs: { + output: 'lib', + ignores: ['**/demo/*', 'src/**/demo/*'] + }, }); diff --git a/packages/biz/CHANGELOG.md b/packages/biz/CHANGELOG.md index 1c38a91..61b9f99 100644 --- a/packages/biz/CHANGELOG.md +++ b/packages/biz/CHANGELOG.md @@ -1,5 +1,195 @@ # @zhst/biz +## 0.11.3 + +### Patch Changes + +- @zhst/func@0.9.1 +- @zhst/hooks@0.8.10 +- @zhst/meta@0.9.7 + +## 0.11.2 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.9.0 + - @zhst/hooks@0.8.9 + - @zhst/meta@0.9.6 + +## 0.11.1 + +### Patch Changes + +- biz 打包没打上 + +## 0.11.0 + +### Minor Changes + +- 添加 traansfer 组件 searchProps 透传 + +## 0.10.5 + +### Patch Changes + +- 初始化物料库 +- Updated dependencies + - @zhst/hooks@0.8.8 + - @zhst/func@0.8.3 + - @zhst/meta@0.9.5 + +## 0.10.4 + +### Patch Changes + +- 初始化物料包 +- Updated dependencies + - @zhst/hooks@0.8.7 + - @zhst/func@0.8.2 + - @zhst/meta@0.9.4 + +## 0.10.3 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.8.1 + - @zhst/hooks@0.8.6 + - @zhst/meta@0.9.3 + +## 0.10.2 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.8.0 + - @zhst/hooks@0.8.5 + - @zhst/meta@0.9.2 + +## 0.10.1 + +### Patch Changes + +- Updated dependencies + - @zhst/meta@0.9.1 + +## 0.10.0 + +### Minor Changes + +- 修改 metad 大图组建 + +### Patch Changes + +- Updated dependencies + - @zhst/meta@0.9.0 + +## 0.9.8 + +### Patch Changes + +- @zhst/func@0.7.5 +- @zhst/hooks@0.8.4 +- @zhst/meta@0.8.5 + +## 0.9.7 + +### Patch Changes + +- 新增 RealTimeMonitor,VideoPlayerCard,ViewLargerImageModal,WarningRecordCard 组件,优化盒子树创建弹框规则校验 +- Updated dependencies + - @zhst/meta@0.8.5 + +## 0.9.6 + +### Patch Changes + +- 新增 tree 组件的监听事件,优化 meta 全选的回调事件监听 +- Updated dependencies + - @zhst/hooks@0.8.3 + - @zhst/func@0.7.4 + - @zhst/meta@0.8.4 + +## 0.9.5 + +### Patch Changes + +- 删除预览图组件,新增摄像头状态判断,修复 ts 生成失败问题 + +## 0.9.4 + +### Patch Changes + +- 添加 biz 模块修改树形盒子组件监听事件 + +## 0.9.3 + +### Patch Changes + +- 新增监听点击事件自定义 + +## 0.9.2 + +### Patch Changes + +- 新增 BoxSelectTree 监听时钟点击事件,导入盒子事件 + +## 0.9.1 + +### Patch Changes + +- 修改 boxSelectTree 类型提示 +- Updated dependencies + - @zhst/hooks@0.8.2 + - @zhst/func@0.7.3 + - @zhst/meta@0.8.3 + +## 0.9.0 + +### Minor Changes + +- 优化 boxSelectTree 组件,添加可以自定义配置按钮功能 + +### Patch Changes + +- Updated dependencies + - @zhst/hooks@0.8.1 + - @zhst/func@0.7.2 + - @zhst/meta@0.8.2 + +## 0.8.0 + +### Minor Changes + +- @zhst/biz 优化数组件 + +### Patch Changes + +- Updated dependencies + - @zhst/hooks@0.8.0 + - @zhst/func@0.7.1 + - @zhst/meta@0.8.1 + +## 0.7.0 + +### Minor Changes + +- 新增预警记录卡片组件 + +## 0.6.0 + +### Minor Changes + +- 新增业务组件 Tree、TreeTransfer、TreeTransferModal、BoxSelectTree + +### Patch Changes + +- Updated dependencies + - @zhst/hooks@0.7.0 + - @zhst/func@0.7.0 + - @zhst/meta@0.8.0 + ## 0.5.1 ### Patch Changes diff --git a/packages/biz/README.md b/packages/biz/README.md index 012e258..66246f7 100644 --- a/packages/biz/README.md +++ b/packages/biz/README.md @@ -8,7 +8,7 @@ ## 使用 -```jsx +```js import React from 'react'; import { Demo } from '@zhst/biz' diff --git a/packages/biz/es/BigImageModal/components/CombineImage/index.d.ts b/packages/biz/es/BigImageModal/components/CombineImage/index.d.ts new file mode 100644 index 0000000..19dbaa2 --- /dev/null +++ b/packages/biz/es/BigImageModal/components/CombineImage/index.d.ts @@ -0,0 +1,11 @@ +import { FC } from 'react'; +interface ComBineImageProps { + data: { + imgSummary: string; + compaterImages: string[]; + imageKey: string; + score: number; + }; +} +declare const ComBineImage: FC; +export default ComBineImage; diff --git a/packages/biz/es/BigImageModal/components/CombineImage/index.js b/packages/biz/es/BigImageModal/components/CombineImage/index.js new file mode 100644 index 0000000..abe895d --- /dev/null +++ b/packages/biz/es/BigImageModal/components/CombineImage/index.js @@ -0,0 +1,58 @@ +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +import React, { useRef, forwardRef, useImperativeHandle, useState } from 'react'; +import { CompareImage, Flex, Score } from '@zhst/meta'; +var ComBineImage = /*#__PURE__*/forwardRef(function (props, ref) { + var data = props.data; + var imgSummary = data.imgSummary, + _data$compaterImages = data.compaterImages, + compaterImages = _data$compaterImages === void 0 ? [] : _data$compaterImages; + var targetImageRef = useRef(null); + var compareImageRef = useRef(null); + var _useState = useState(compaterImages.findIndex(function (_url) { + return imgSummary === _url; + }) || 0), + _useState2 = _slicedToArray(_useState, 2), + targetIndex = _useState2[0], + setTargetIndex = _useState2[1]; + useImperativeHandle(ref, function () { + return { + compareImageRef: compareImageRef, + targetImageRef: targetImageRef + }; + }); + return /*#__PURE__*/React.createElement(Flex, { + justify: "space-evenly", + align: "center", + style: { + padding: '0 32px' + } + }, /*#__PURE__*/React.createElement(CompareImage, { + ref: targetImageRef, + preDisable: targetIndex === 0, + nextDisable: targetIndex >= compaterImages.length - 1, + onNext: function onNext() { + return setTargetIndex(targetIndex + 1); + }, + onPre: function onPre() { + return setTargetIndex(targetIndex - 1); + }, + showScore: false, + openRoll: !!compaterImages.length, + url: compaterImages[targetIndex] || imgSummary, + label: "\u76EE\u6807\u56FE" + }), /*#__PURE__*/React.createElement(Score, { + score: data.score + }), /*#__PURE__*/React.createElement(CompareImage, { + ref: compareImageRef, + url: data.imageKey, + openRoll: false, + score: data.score, + label: "\u5BF9\u6BD4\u56FE" + })); +}); +export default ComBineImage; \ No newline at end of file diff --git a/packages/biz/es/BigImageModal/components/navigation/index.js b/packages/biz/es/BigImageModal/components/navigation/index.js index df9ed8d..19dae1e 100644 --- a/packages/biz/es/BigImageModal/components/navigation/index.js +++ b/packages/biz/es/BigImageModal/components/navigation/index.js @@ -1,7 +1,6 @@ import * as React from 'react'; import classnames from 'classnames'; -import { Button } from 'antd'; -import { Icon } from '@zhst/meta'; +import { Icon, Button } from '@zhst/meta'; import "./index.less"; var componentName = "zhst-image__nav"; var Navigation = function Navigation(props) { diff --git a/packages/biz/es/BigImageModal/mock.d.ts b/packages/biz/es/BigImageModal/mock.d.ts new file mode 100644 index 0000000..68ff4e3 --- /dev/null +++ b/packages/biz/es/BigImageModal/mock.d.ts @@ -0,0 +1,245 @@ +export declare const IMAGE_DATA: { + enAbleDeleteFeature: boolean; + tabsFilter: string[]; + selectIndex: number; + disableBtn: number[]; + dataSource: { + objectId: string; + condition: { + featureInfo: null; + featureData: string; + imageData: string; + alg: string; + rect: { + x: number; + y: number; + w: number; + h: number; + }; + objectImageUrl: string; + srcImageUrl: string; + }; + score: number; + timestamp: number; + deviceId: string; + id: string; + name: string; + dirid: string; + status: string; + longitude: number; + latitude: number; + caseId: string; + caseGroup: string; + isDeleted: string; + objectIndex: { + objectId: string; + solutionId: string; + deviceId: string; + fragmentId: string; + }; + objectType: string; + isObjectTrack: boolean; + pathId: string; + frameInfo: { + frameId: string; + frameTimestamp: string; + width: number; + height: number; + originWidth: number; + originHeight: number; + offsetTime: string; + skipNumber: string; + }; + level: number; + bboxInFrame: { + x: number; + y: number; + w: number; + h: number; + }; + bboxExtInFrame: { + x: number; + y: number; + w: number; + h: number; + }; + objectImageKey: string; + objectExtImageKey: string; + frameImageKey: string; + confidence: number; + sourceObjectId: string; + storeTimestamp: string; + gbNumber: string; + qualityScore: number; + subObjectCount: number; + subObjectType: string[]; + subObjectIds: string[]; + solutionId: string; + fragmentId: string; + contrastKey: string; + compaterImages: string[]; + imgSummary: string; + imageKey: string; + srcImageUrl: string; + algorithmVersion: string; + cameraId: string; + cameraName: string; + }[]; + isArchiveDetail: boolean; + ToolProps: { + renderVideoBtn: boolean; + disableVideo: boolean; + }; + specialTitle: string; +}; +export declare const BIG_IMAGE_DATA: ({ + imageKey: string; + imgSummary: string; + flvUrl: string; + compaterImages: string[]; + odRect: { + x: number; + y: number; + w: number; + h: number; + }; + attachImg: { + url: string; + label: string; + }[]; + score: string; + showScore: boolean; + cameraPosition: string; + time: string; + objects: { + objectIndex: { + objectId: string; + solutionId: string; + deviceId: string; + fragmentId: string; + }; + objectType: string; + sourceObjectId: string; + level: number; + confidence: number; + frameInfo: { + frameId: string; + frameTimestamp: string; + width: number; + height: number; + originWidth: number; + originHeight: number; + offsetTime: string; + skipNumber: string; + }; + infoOnSource: { + bboxInFrame: { + bboxRatio: { + x: number; + y: number; + w: number; + h: number; + }; + }; + countInSource: number; + indexInSource: number; + }; + qualityScore: number; + }[]; +} | { + imageKey: string; + imgSummary: string; + odRect: { + x: number; + y: number; + w: number; + h: number; + }; + attachImg: { + url: string; + label: string; + }[]; + flvUrl: string; + score: number; + showScore: boolean; + cameraPosition: string; + time: string; + objects: ({ + objectIndex: { + objectId: string; + solutionId: string; + deviceId: string; + fragmentId: string; + }; + objectType: string; + sourceObjectId: string; + frameInfo: { + frameId: string; + frameTimestamp: string; + width: number; + height: number; + originWidth: number; + originHeight: number; + offsetTime: string; + skipNumber: string; + }; + infoOnSource: { + bboxInFrame: { + bboxRatio: { + x: number; + y: number; + w: number; + h: number; + }; + }; + countInSource: number; + indexInSource: number; + }; + qualityScore: number; + level?: undefined; + confidence?: undefined; + } | { + objectIndex: { + objectId: string; + solutionId: string; + deviceId: string; + fragmentId: string; + }; + objectType: string; + sourceObjectId: string; + level: number; + confidence: number; + frameInfo: { + frameId: string; + frameTimestamp: string; + width: number; + height: number; + originWidth: number; + originHeight: number; + offsetTime: string; + skipNumber: string; + }; + infoOnSource: { + bboxInFrame: { + bboxRatio: { + x: number; + y: number; + w: number; + h: number; + }; + }; + countInSource: number; + indexInSource: number; + }; + qualityScore: number; + })[]; + compaterImages?: undefined; +})[]; +export declare const attributeList: { + title: string; + children: { + key: string; + label: string; + children: string; + }[]; +}[]; diff --git a/packages/biz/es/BigImageModal/util/bigImageModalAdapter.d.ts b/packages/biz/es/BigImageModal/util/bigImageModalAdapter.d.ts new file mode 100644 index 0000000..185982d --- /dev/null +++ b/packages/biz/es/BigImageModal/util/bigImageModalAdapter.d.ts @@ -0,0 +1,118 @@ +/** + * 适配老的大屏组件数据格式传入 + */ +import React from 'react'; +import { AlgorithmVersionStr, HumanProperty, ObjectType, Rect } from '@zhst/types'; +import { VideoViewProps, ImgViewProps, VideoViewRef, ImgViewRef } from '@zhst/meta'; +export type TAB_TYPE = 'COMPATER' | 'NORMAL' | 'TRACK'; +export type MODEL_TYPE = 'VIDEO' | 'IMAGE'; +export interface CarouselProps { + hasPre?: boolean; + hasNext?: boolean; + selectIndex: number; + setSelectIndex: React.Dispatch>; + dataSource: Array<{ + key: string; + url: string; + }>; +} +export type ISelectItem = Partial> & Partial>; +/** + * 描述列表 description + */ +export interface HeaderProps { + value: TAB_TYPE; + onChange: (type: TAB_TYPE) => void; + tabsFilter: TAB_TYPE[]; +} +export interface ParamProps { + tab: string; + selectItem: ISelectItem; + imgViewRef: React.MutableRefObject; + VideoViewRef: React.MutableRefObject; + model: MODEL_TYPE; + setModel: React.Dispatch>; + scale$: number; + showCrop$: boolean; +} +/** + * 工具栏 + */ +export interface ToolProps { + renderRight?: (props: ParamProps) => React.ReactNode; + renderLeft?: (props: ParamProps) => React.ReactNode; + renderVideoBtn?: boolean; + param: ParamProps; + disableVideo: boolean; +} +export interface BigImageData { + extendRectList: (Rect & { + algorithmVersion: AlgorithmVersionStr; + imageKey: string; + })[]; + rectList: (Rect & { + algorithmVersion: AlgorithmVersionStr; + imageKey: string; + })[]; + attachImg: { + url: string; + label: '形体' | '人脸'; + }[]; + odRect: Rect; + compaterImages: string[]; + constractKey: string; + frameImageKey: string; + imageKey?: string; + imgSummary: string; + objectExtImageKey: string; + attributeList: { + label: string; + list: any[]; + }[]; + archiveImages?: any; + spaceName: string; + objectIndex?: { + deviceId: string; + fragmentId: string; + objectId: string; + solutionId: string; + }; + objectType: ObjectType; + objectId: string; + bodyObjectId?: string; + faceObjectId?: string; + sourceObjectId?: string; + cameraId: string; + cameraName: string; + selectIndex: number; + humanProperty: HumanProperty; + qualityScore?: number; + score: number; + timestamp: string; + bodyImageUrl: string; + faceImageUrl: string; + algorithmVersion: AlgorithmVersionStr; + bodySpaceName: string; + faceSpaceName: string; + position: { + lat: number; + lng: number; + }; + solutionId?: string; + [index: string]: any; +} +export interface ImageModalDataProps { + targetData: BigImageData[]; + compactData: BigImageData[]; +} +export interface ModalAdapterConfigProps { + oldMode?: boolean; +} +/** + * 大图组件适配器,兼容老接口 + * @param Cmp 大图组件 + * @param config 额外配置 + * @returns 大图组件 + */ +declare const adapter: (Cmp: any, config: ModalAdapterConfigProps) => any; +export default adapter; diff --git a/packages/biz/es/BigImageModal/util/bigImageModalAdapter.js b/packages/biz/es/BigImageModal/util/bigImageModalAdapter.js new file mode 100644 index 0000000..bad3d69 --- /dev/null +++ b/packages/biz/es/BigImageModal/util/bigImageModalAdapter.js @@ -0,0 +1,50 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +/** + * 适配老的大屏组件数据格式传入 + */ +import React from 'react'; + +/** + * 描述列表 description + */ + +/** + * 工具栏 + */ + +/** + * 兼容老数据格式 + * @param _data 老数据格式 + * @returns newData + */ +var translateOldImageData = function translateOldImageData(_data) { + return _objectSpread(_objectSpread({}, _data), {}, { + open: _data.visible, + onCancel: _data.onClose + }); +}; + +/** + * 大图组件适配器,兼容老接口 + * @param Cmp 大图组件 + * @param config 额外配置 + * @returns 大图组件 + */ +var adapter = function adapter(Cmp, config) { + var _config$oldMode = config.oldMode, + oldMode = _config$oldMode === void 0 ? false : _config$oldMode; + return function (props) { + var newProps = oldMode ? translateOldImageData(props) : props; + console.log('adapter----适配数据', props, newProps); + + // 该属性已经废弃 + delete newProps.visible; + return /*#__PURE__*/React.createElement(Cmp, newProps); + }; +}; +export default adapter; \ No newline at end of file diff --git a/packages/biz/es/Demo/index.js b/packages/biz/es/Demo/index.js index 8704995..b877d8a 100644 --- a/packages/biz/es/Demo/index.js +++ b/packages/biz/es/Demo/index.js @@ -1,5 +1,5 @@ import React from 'react'; -import { Button } from 'antd'; +import { Button } from '@zhst/meta'; import { useThrottleFn } from '@zhst/hooks'; export default (function () { var _useThrottleFn = useThrottleFn(function () { diff --git a/packages/biz/es/RealTimeMonitor/RealTimeMonitor.d.ts b/packages/biz/es/RealTimeMonitor/RealTimeMonitor.d.ts new file mode 100644 index 0000000..a3f147f --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/RealTimeMonitor.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; +import { IRecord, VideoPlayerCardProps, ViewLargerImageModalRef } from '@zhst/biz'; +interface RealTimeMonitorProps { + videoDataSource?: VideoPlayerCardProps[]; + handleWindowClick?: (key?: string) => void; + handleCloseButtonClick?: (key?: string) => void; + selectedWindowKey?: string; + warningDataSource?: IRecord[]; + viewLargerImageModalRef?: React.RefObject; + handleDownloadImg?: (imgSrc?: string) => void; + onRecordClick?: (record?: IRecord) => void; + selectedRecordId?: string; + isRecordListLoading?: boolean; + recordListTitle?: string; + style?: React.CSSProperties; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; + largeImageTitle?: string; +} +export declare const RealTimeMonitor: React.FC; +export default RealTimeMonitor; diff --git a/packages/biz/es/RealTimeMonitor/RealTimeMonitor.js b/packages/biz/es/RealTimeMonitor/RealTimeMonitor.js new file mode 100644 index 0000000..b11561c --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/RealTimeMonitor.js @@ -0,0 +1,35 @@ +import React from 'react'; +import WindowToggle from "./components/WindowToggle"; +import WarningRecordList from "./components/WarningRecordList"; +export var RealTimeMonitor = function RealTimeMonitor(props) { + var videoDataSource = props.videoDataSource, + handleWindowClick = props.handleWindowClick, + handleCloseButtonClick = props.handleCloseButtonClick, + selectedWindowKey = props.selectedWindowKey, + warningDataSource = props.warningDataSource, + viewLargerImageModalRef = props.viewLargerImageModalRef, + handleDownloadImg = props.handleDownloadImg, + onRecordClick = props.onRecordClick, + selectedRecordId = props.selectedRecordId, + isRecordListLoading = props.isRecordListLoading; + return /*#__PURE__*/React.createElement("div", { + className: "zhst-biz-real-time-monitor", + style: { + display: 'flex' + } + }, /*#__PURE__*/React.createElement(WindowToggle, { + selectedWindowKey: selectedWindowKey, + dataSource: videoDataSource, + handleWindowClick: handleWindowClick, + handleCloseButtonClick: handleCloseButtonClick + }), /*#__PURE__*/React.createElement(WarningRecordList, { + dataSource: warningDataSource, + handleDownloadImg: handleDownloadImg, + onRecordClick: onRecordClick, + selectedRecordId: selectedRecordId, + viewLargerImageModalRef: viewLargerImageModalRef, + isRecordListLoading: isRecordListLoading, + recordListTitle: "\u76D1\u63A7\u9884\u8B66\u8BB0\u5F55" + })); +}; +export default RealTimeMonitor; \ No newline at end of file diff --git a/packages/biz/es/RealTimeMonitor/components/WarningRecordList/WarningRecordList.d.ts b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/WarningRecordList.d.ts new file mode 100644 index 0000000..6489299 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/WarningRecordList.d.ts @@ -0,0 +1,18 @@ +import React from 'react'; +import { IRecord, ViewLargerImageModalRef } from '@zhst/biz'; +import "./index.less"; +interface WarningRecordListProps { + dataSource?: IRecord[]; + viewLargerImageModalRef?: React.RefObject; + handleDownloadImg?: (imgSrc?: string) => void; + onRecordClick?: (record?: IRecord) => void; + selectedRecordId?: string; + isRecordListLoading?: boolean; + recordListTitle?: string; + style?: React.CSSProperties; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; + largeImageTitle?: string; +} +declare const WarningRecordList: React.FC; +export default WarningRecordList; diff --git a/packages/biz/es/RealTimeMonitor/components/WarningRecordList/WarningRecordList.js b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/WarningRecordList.js new file mode 100644 index 0000000..5715506 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/WarningRecordList.js @@ -0,0 +1,81 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import React from 'react'; +import { ViewLargerImageModal, WarningRecordCard } from '@zhst/biz'; +import { Empty, Space, Spin } from 'antd'; +import "./index.less"; +import { LoadingOutlined } from '@ant-design/icons'; +var WarningRecordList = function WarningRecordList(props) { + var _props$dataSource = props.dataSource, + dataSource = _props$dataSource === void 0 ? [] : _props$dataSource, + viewLargerImageModalRef = props.viewLargerImageModalRef, + selectedRecordId = props.selectedRecordId, + handleDownloadImg = props.handleDownloadImg, + _onRecordClick = props.onRecordClick, + isRecordListLoading = props.isRecordListLoading, + recordListTitle = props.recordListTitle, + style = props.style, + cardStyle = props.cardStyle, + imgStyle = props.imgStyle, + largeImageTitle = props.largeImageTitle; + return /*#__PURE__*/React.createElement("div", { + className: "zhst-biz-warning-record-list", + style: style + }, /*#__PURE__*/React.createElement("div", { + className: "header" + }, recordListTitle), /*#__PURE__*/React.createElement("div", { + className: "body" + }, isRecordListLoading ? /*#__PURE__*/React.createElement("div", { + style: { + height: '100%', + display: 'flex', + justifyContent: 'center', + alignItems: 'center' + } + }, /*#__PURE__*/React.createElement(Spin, { + indicator: /*#__PURE__*/React.createElement(LoadingOutlined, { + style: { + fontSize: 24 + } + }) + })) : (dataSource === null || dataSource === void 0 ? void 0 : dataSource.length) > 0 ? /*#__PURE__*/React.createElement(Space, { + direction: "vertical", + size: 10 + }, dataSource === null || dataSource === void 0 ? void 0 : dataSource.map(function (record, index) { + if (index > 2) return; + return /*#__PURE__*/React.createElement(WarningRecordCard, { + key: record === null || record === void 0 ? void 0 : record.id, + record: record, + onRecordClick: function onRecordClick(record) { + _onRecordClick === null || _onRecordClick === void 0 || _onRecordClick(record); + }, + selectedRecordId: selectedRecordId, + cardStyle: _objectSpread({ + width: 300, + height: 264 + }, cardStyle), + imgStyle: _objectSpread({ + width: 280, + height: 169 + }, imgStyle) + }); + })) : /*#__PURE__*/React.createElement("div", { + style: { + height: '100%', + display: 'flex', + justifyContent: 'center', + alignItems: 'center' + } + }, /*#__PURE__*/React.createElement(Empty, { + description: "\u6682\u65E0\u6570\u636E" + }))), /*#__PURE__*/React.createElement(ViewLargerImageModal, { + ref: viewLargerImageModalRef, + downloadImg: handleDownloadImg, + title: largeImageTitle + })); +}; +export default WarningRecordList; \ No newline at end of file diff --git a/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.d.ts b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.d.ts new file mode 100644 index 0000000..b50da75 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.d.ts @@ -0,0 +1,2 @@ +import WarningRecordList from './WarningRecordList'; +export default WarningRecordList; diff --git a/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.js b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.js new file mode 100644 index 0000000..6e69d61 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.js @@ -0,0 +1,2 @@ +import WarningRecordList from "./WarningRecordList"; +export default WarningRecordList; \ No newline at end of file diff --git a/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.less b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.less new file mode 100644 index 0000000..e348f82 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WarningRecordList/index.less @@ -0,0 +1,20 @@ +.zhst-biz-warning-record-list { + display: flex; + flex-direction: column; + border-left: solid 1px #00000026; + width: 320px; + + .header { + width: 100%; + height: 48px; + background-color: #EFF2F4; + padding: 10px 20px; + box-sizing: border-box; + } + + .body { + padding: 10px; + overflow: hidden; + flex: 1; + } +} \ No newline at end of file diff --git a/packages/biz/es/RealTimeMonitor/components/WindowToggle/WindowToggle.d.ts b/packages/biz/es/RealTimeMonitor/components/WindowToggle/WindowToggle.d.ts new file mode 100644 index 0000000..c67b407 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WindowToggle/WindowToggle.d.ts @@ -0,0 +1,11 @@ +import React from 'react'; +import { VideoPlayerCardProps } from '@zhst/biz'; +import './index.less'; +interface WindowToggleProps { + dataSource?: VideoPlayerCardProps[]; + handleWindowClick?: (key?: string) => void; + handleCloseButtonClick?: (key?: string) => void; + selectedWindowKey?: string; +} +export declare const WindowToggle: React.FC; +export default WindowToggle; diff --git a/packages/biz/es/RealTimeMonitor/components/WindowToggle/WindowToggle.js b/packages/biz/es/RealTimeMonitor/components/WindowToggle/WindowToggle.js new file mode 100644 index 0000000..d9efe21 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WindowToggle/WindowToggle.js @@ -0,0 +1,81 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +import React, { useState } from 'react'; +import { Segmented } from 'antd'; +import { AppstoreOutlined, BarsOutlined } from '@ant-design/icons'; +import { VideoPlayerCard } from '@zhst/biz'; +import "./index.less"; +import { theme } from 'antd/lib'; +export var WindowToggle = function WindowToggle(props) { + var _props$dataSource = props.dataSource, + dataSource = _props$dataSource === void 0 ? [] : _props$dataSource, + handleWindowClick = props.handleWindowClick, + handleCloseButtonClick = props.handleCloseButtonClick, + selectedWindowKey = props.selectedWindowKey; + var _useState = useState("large"), + _useState2 = _slicedToArray(_useState, 2), + size = _useState2[0], + setSize = _useState2[1]; + var useToken = theme.useToken; + var _useToken = useToken(), + token = _useToken.token; + var getLabelStyle = function getLabelStyle(isSelected) { + return _objectSpread({ + padding: "0 11px", + background: "#fff" + }, isSelected ? { + background: token.colorPrimary, + color: '#fff' + } : {}); + }; + return /*#__PURE__*/React.createElement("div", { + className: "zhst-biz-window-toggle" + }, /*#__PURE__*/React.createElement("div", { + className: "header" + }, /*#__PURE__*/React.createElement(Segmented, { + defaultValue: "large", + options: [{ + value: 'large', + label: /*#__PURE__*/React.createElement("div", { + style: getLabelStyle(size === 'large') + }, /*#__PURE__*/React.createElement(BarsOutlined, null)) + }, { + value: 'small', + label: /*#__PURE__*/React.createElement("div", { + style: getLabelStyle(size === 'small') + }, /*#__PURE__*/React.createElement(AppstoreOutlined, null)) + }], + onChange: function onChange(value) { + // 当一个窗口时 默认 selectedkey 第一条数据的 windowkey + if (value === 'large' && dataSource.length > 0) { + var windowKey = dataSource[0].windowKey; + handleWindowClick === null || handleWindowClick === void 0 || handleWindowClick(windowKey); + } + setSize(value); + } + })), /*#__PURE__*/React.createElement("div", { + className: "body" + }, dataSource === null || dataSource === void 0 ? void 0 : dataSource.map(function (item, index) { + if (size === "large" && index > 0) return; + return /*#__PURE__*/React.createElement(VideoPlayerCard, _extends({ + key: item.windowKey, + selectedWindowKey: selectedWindowKey, + size: size + }, item, { + handleWindowClick: handleWindowClick, + handleCloseButtonClick: handleCloseButtonClick + })); + }))); +}; +export default WindowToggle; \ No newline at end of file diff --git a/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.d.ts b/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.d.ts new file mode 100644 index 0000000..3b57a45 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.d.ts @@ -0,0 +1,2 @@ +import WindowToggle from './WindowToggle'; +export default WindowToggle; diff --git a/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.js b/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.js new file mode 100644 index 0000000..2f4ac13 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.js @@ -0,0 +1,2 @@ +import WindowToggle from "./WindowToggle"; +export default WindowToggle; \ No newline at end of file diff --git a/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.less b/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.less new file mode 100644 index 0000000..61c77bd --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/components/WindowToggle/index.less @@ -0,0 +1,45 @@ +.zhst-biz-window-toggle { + display: flex; + flex-direction: column; + flex: 1; + + .header { + width: 100%; + height: 48px; + background-color: #EFF2F4; + padding: 10px 20px; + box-sizing: border-box; + + .ant-segmented { + padding: 0; + + .ant-segmented-group { + border-radius: 4px; + overflow: hidden; + + .ant-segmented-item { + border-radius: 0; + + .ant-segmented-item-label { + padding: 0; + } + } + } + } + } + + .body { + flex: 1; + width: 100%; + background-color: #E5EAEC; + padding: 10px; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + + >div { + margin: 10px; + } + } +} \ No newline at end of file diff --git a/packages/biz/es/RealTimeMonitor/index.d.ts b/packages/biz/es/RealTimeMonitor/index.d.ts new file mode 100644 index 0000000..9013d29 --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/index.d.ts @@ -0,0 +1,2 @@ +import RealTimeMonitor from './RealTimeMonitor'; +export default RealTimeMonitor; diff --git a/packages/biz/es/RealTimeMonitor/index.js b/packages/biz/es/RealTimeMonitor/index.js new file mode 100644 index 0000000..80b2a3c --- /dev/null +++ b/packages/biz/es/RealTimeMonitor/index.js @@ -0,0 +1,2 @@ +import RealTimeMonitor from "./RealTimeMonitor"; +export default RealTimeMonitor; \ No newline at end of file diff --git a/packages/biz/es/VideoPlayerCard/VideoPlayerCard.d.ts b/packages/biz/es/VideoPlayerCard/VideoPlayerCard.d.ts new file mode 100644 index 0000000..cd1775e --- /dev/null +++ b/packages/biz/es/VideoPlayerCard/VideoPlayerCard.d.ts @@ -0,0 +1,19 @@ +import { CardProps } from 'antd'; +import React, { ReactNode } from 'react'; +import './index.less'; +export interface VideoPlayerCardProps { + windowKey?: string; + selectedWindowKey?: string; + showType?: 'video' | "image"; + imgSrc?: string; + videoSrc?: string; + cardProps?: CardProps; + errorReasonText?: string; + isWindowLoading?: boolean; + size?: 'large' | 'small'; + title?: string | ReactNode; + handleCloseButtonClick?: (key?: string) => void; + handleWindowClick?: (key?: string) => void; +} +export declare const VideoPlayerCard: React.FC; +export default VideoPlayerCard; diff --git a/packages/biz/es/VideoPlayerCard/VideoPlayerCard.js b/packages/biz/es/VideoPlayerCard/VideoPlayerCard.js new file mode 100644 index 0000000..e4daf93 --- /dev/null +++ b/packages/biz/es/VideoPlayerCard/VideoPlayerCard.js @@ -0,0 +1,140 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +import { Card, Space, Spin, Button } from 'antd'; +import { theme } from 'antd/lib'; +import { VideoPlayer } from '@zhst/meta'; +import React, { useState, useEffect, useRef } from 'react'; +import { CloseOutlined, LoadingOutlined } from '@ant-design/icons'; +import "./index.less"; +export var VideoPlayerCard = function VideoPlayerCard(props) { + var componentName = "zhst-biz-video-player-card"; + var showType = props.showType, + imgSrc = props.imgSrc, + videoSrc = props.videoSrc, + cardProps = props.cardProps, + isWindowLoading = props.isWindowLoading, + errorReasonText = props.errorReasonText, + size = props.size, + title = props.title, + handleCloseButtonClick = props.handleCloseButtonClick, + handleWindowClick = props.handleWindowClick, + windowKey = props.windowKey, + _props$selectedWindow = props.selectedWindowKey, + selectedWindowKey = _props$selectedWindow === void 0 ? '' : _props$selectedWindow; + var _useState = useState(null), + _useState2 = _slicedToArray(_useState, 2), + cardContent = _useState2[0], + setCardContent = _useState2[1]; + var useToken = theme.useToken; + var _useToken = useToken(), + token = _useToken.token; + var videoRef = useRef(null); + var selectedBorderStyle = { + border: "2px solid ".concat(token.colorPrimary), + boxShadow: " 0px 2px 9px 0px rgba(0,0,0,0.16)" + }; + var cardStyle = _objectSpread(_objectSpread({}, size === 'large' ? { + height: 931 + } : { + height: 456, + cursor: 'pointer' + }), size === 'small' && selectedWindowKey === windowKey ? selectedBorderStyle : {}); + var videoPlayerCardStyle = size === 'small' ? { + width: "calc(50% - 20px)" + } : { + flex: 1 + }; + useEffect(function () { + if (!isWindowLoading && (videoSrc || imgSrc)) { + var contentElement = null; + if (videoSrc) { + var _videoRef$current; + contentElement = /*#__PURE__*/React.createElement(VideoPlayer, { + ref: videoRef, + url: videoSrc + }); + (_videoRef$current = videoRef.current) === null || _videoRef$current === void 0 || _videoRef$current.setShowCrop(true); + } else if (imgSrc) { + contentElement = /*#__PURE__*/React.createElement("img", { + alt: "\u9996\u5E27\u56FE", + src: imgSrc, + style: { + width: "100%", + height: "100%", + display: 'block' + } + }); + } + setCardContent(contentElement); + } else { + setCardContent(null); + } + }, [showType, imgSrc, videoSrc, isWindowLoading]); + return /*#__PURE__*/React.createElement("div", { + className: componentName, + onClick: function onClick() { + handleWindowClick === null || handleWindowClick === void 0 || handleWindowClick(windowKey); + }, + style: videoPlayerCardStyle + }, /*#__PURE__*/React.createElement(Card, _extends({ + title: /*#__PURE__*/React.createElement(Space, { + style: { + width: "100%", + justifyContent: "space-between" + } + }, /*#__PURE__*/React.createElement("div", null, title), /*#__PURE__*/React.createElement("div", { + className: "card-close-button" + }, /*#__PURE__*/React.createElement(Button, { + type: "text", + onClick: function onClick() { + handleCloseButtonClick === null || handleCloseButtonClick === void 0 || handleCloseButtonClick(windowKey); + } + }, /*#__PURE__*/React.createElement(CloseOutlined, null)))), + style: _objectSpread({ + display: "flex", + flexDirection: "column", + borderRadius: 4, + overflow: "hidden" + }, cardStyle), + bodyStyle: { + flex: 1 + } + }, cardProps), cardContent ? /*#__PURE__*/React.createElement(React.Fragment, null, cardContent) : /*#__PURE__*/React.createElement("div", { + style: { + backgroundColor: '#000', + height: '100%', + display: 'flex', + padding: '20px', + boxSizing: 'border-box' + } + }, isWindowLoading ? /*#__PURE__*/React.createElement("div", { + style: { + flex: 1, + display: 'flex', + justifyContent: 'center', + alignItems: 'center' + } + }, /*#__PURE__*/React.createElement(Spin, { + indicator: /*#__PURE__*/React.createElement(LoadingOutlined, { + style: { + fontSize: 24 + } + }) + })) : !!errorReasonText && /*#__PURE__*/React.createElement("span", { + style: { + color: token.colorError + } + }, errorReasonText)))); +}; +export default VideoPlayerCard; \ No newline at end of file diff --git a/packages/biz/es/VideoPlayerCard/index.d.ts b/packages/biz/es/VideoPlayerCard/index.d.ts new file mode 100644 index 0000000..41afa58 --- /dev/null +++ b/packages/biz/es/VideoPlayerCard/index.d.ts @@ -0,0 +1,3 @@ +import VideoPlayerCard from './VideoPlayerCard'; +export type { VideoPlayerCardProps } from './VideoPlayerCard'; +export default VideoPlayerCard; diff --git a/packages/biz/es/VideoPlayerCard/index.js b/packages/biz/es/VideoPlayerCard/index.js new file mode 100644 index 0000000..4cb8f05 --- /dev/null +++ b/packages/biz/es/VideoPlayerCard/index.js @@ -0,0 +1,2 @@ +import VideoPlayerCard from "./VideoPlayerCard"; +export default VideoPlayerCard; \ No newline at end of file diff --git a/packages/biz/es/VideoPlayerCard/index.less b/packages/biz/es/VideoPlayerCard/index.less new file mode 100644 index 0000000..0f87e3e --- /dev/null +++ b/packages/biz/es/VideoPlayerCard/index.less @@ -0,0 +1,30 @@ +.zhst-biz-video-player-card { + .ant-card-head { + padding: 0 20px; + } + + .ant-card-body { + padding: 0; + overflow: hidden; + border-radius: 0; + + .zhst-image__video-view { + height: 100%; + } + } + + .card-close-button { + .ant-btn { + padding: 0 3px; + height: 22px; + color: #00000073; + } + + .ant-btn:hover { + padding: 0 3px; + height: 22px; + color: #000000e0; + } + } + +} \ No newline at end of file diff --git a/packages/biz/es/ViewLargerImageModal/ViewLargerImageModal.d.ts b/packages/biz/es/ViewLargerImageModal/ViewLargerImageModal.d.ts new file mode 100644 index 0000000..d82a52e --- /dev/null +++ b/packages/biz/es/ViewLargerImageModal/ViewLargerImageModal.d.ts @@ -0,0 +1,25 @@ +import React from 'react'; +import { ModalProps, SpaceProps } from 'antd'; +import './index.less'; +type ViewLargerImageModalParams = { + imgSrc?: string; + warningData?: { + label?: string; + value?: string; + }[]; +}; +export interface ViewLargerImageModalRef { + show: (params?: ViewLargerImageModalParams) => void; + handleCancel: () => void; +} +export interface ViewLargerImageModalProps { + imgStyle?: React.CSSProperties; + downloadImg?: (imgSrc?: string) => void; + title?: string; + downloadText?: string; + modalProps?: ModalProps; + spaceProps?: SpaceProps; +} +export declare const ViewLargerImageModal: React.ForwardRefExoticComponent>; +export default ViewLargerImageModal; +export declare const useViewLargerImageModal: () => React.RefObject; diff --git a/packages/biz/es/ViewLargerImageModal/ViewLargerImageModal.js b/packages/biz/es/ViewLargerImageModal/ViewLargerImageModal.js new file mode 100644 index 0000000..07638be --- /dev/null +++ b/packages/biz/es/ViewLargerImageModal/ViewLargerImageModal.js @@ -0,0 +1,106 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +import React, { useImperativeHandle, useRef, useState, forwardRef } from 'react'; +import { Modal, Space } from 'antd'; +import theme from 'antd/lib/theme'; +import { DownloadOutlined } from '@ant-design/icons'; +import "./index.less"; +export var ViewLargerImageModal = /*#__PURE__*/forwardRef(function (props, ref) { + var modalProps = props.modalProps, + downloadImg = props.downloadImg, + imgStyle = props.imgStyle, + _props$title = props.title, + title = _props$title === void 0 ? '预警大图' : _props$title, + _props$downloadText = props.downloadText, + downloadText = _props$downloadText === void 0 ? '下载大图' : _props$downloadText, + spaceProps = props.spaceProps; + var useToken = theme.useToken; + var _useToken = useToken(), + token = _useToken.token; + var _useState = useState(false), + _useState2 = _slicedToArray(_useState, 2), + open = _useState2[0], + setOpen = _useState2[1]; + var _useState3 = useState(), + _useState4 = _slicedToArray(_useState3, 2), + imgSrc = _useState4[0], + setImgSrc = _useState4[1]; + var _useState5 = useState(), + _useState6 = _slicedToArray(_useState5, 2), + warningData = _useState6[0], + setWarningData = _useState6[1]; + var handleCancel = function handleCancel() { + setOpen(false); + }; + useImperativeHandle(ref, function () { + return { + show: function show(_params) { + setOpen(true); + setImgSrc(_params === null || _params === void 0 ? void 0 : _params.imgSrc); + setWarningData(_params === null || _params === void 0 ? void 0 : _params.warningData); + }, + handleCancel: handleCancel + }; + }); + return /*#__PURE__*/React.createElement(Modal, _extends({ + className: "zhst-biz-view-warning-larger-image-modal", + open: open, + destroyOnClose: true, + title: title, + width: "1029px", + footer: null, + onCancel: handleCancel + }, modalProps), /*#__PURE__*/React.createElement(Space, _extends({ + size: 0, + styles: { + item: { + backgroundColor: '#F6F9FAFF' + } + } + }, spaceProps), /*#__PURE__*/React.createElement("img", { + alt: title, + src: imgSrc, + style: _objectSpread({ + width: 789, + height: 444, + display: 'block' + }, imgStyle) + }), /*#__PURE__*/React.createElement("div", { + className: "right-context" + }, warningData === null || warningData === void 0 ? void 0 : warningData.map(function (_ref) { + var label = _ref.label, + value = _ref.value; + return /*#__PURE__*/React.createElement("div", { + key: label + }, /*#__PURE__*/React.createElement("span", { + className: "context-key" + }, "".concat(label, ": ")), value); + }), imgSrc && downloadImg && /*#__PURE__*/React.createElement("div", { + className: "img-download", + style: { + color: token.colorPrimary + }, + onClick: function onClick() { + return downloadImg === null || downloadImg === void 0 ? void 0 : downloadImg(imgSrc); + } + }, /*#__PURE__*/React.createElement(DownloadOutlined, null), /*#__PURE__*/React.createElement("span", { + style: { + paddingLeft: 3 + } + }, downloadText))))); +}); +export default ViewLargerImageModal; +export var useViewLargerImageModal = function useViewLargerImageModal() { + return useRef(null); +}; \ No newline at end of file diff --git a/packages/biz/es/ViewLargerImageModal/index.d.ts b/packages/biz/es/ViewLargerImageModal/index.d.ts new file mode 100644 index 0000000..417e8be --- /dev/null +++ b/packages/biz/es/ViewLargerImageModal/index.d.ts @@ -0,0 +1,4 @@ +import ViewLargerImageModal, { useViewLargerImageModal } from './ViewLargerImageModal'; +export type { ViewLargerImageModalRef, ViewLargerImageModalProps } from './ViewLargerImageModal'; +export default ViewLargerImageModal; +export { useViewLargerImageModal }; diff --git a/packages/biz/es/ViewLargerImageModal/index.js b/packages/biz/es/ViewLargerImageModal/index.js new file mode 100644 index 0000000..baa9ea1 --- /dev/null +++ b/packages/biz/es/ViewLargerImageModal/index.js @@ -0,0 +1,3 @@ +import ViewLargerImageModal, { useViewLargerImageModal } from "./ViewLargerImageModal"; +export default ViewLargerImageModal; +export { useViewLargerImageModal }; \ No newline at end of file diff --git a/packages/biz/es/ViewLargerImageModal/index.less b/packages/biz/es/ViewLargerImageModal/index.less new file mode 100644 index 0000000..32363d0 --- /dev/null +++ b/packages/biz/es/ViewLargerImageModal/index.less @@ -0,0 +1,62 @@ +.zhst-biz-view-warning-larger-image-modal { + font-family: MicrosoftYaHei; + + .ant-modal-content { + padding: 0; + height: 492px; + border-radius: 6px; + overflow: hidden; + + .ant-modal-close { + top: 14px; + right: 16px; + } + + .ant-modal-header { + height: 48px; + line-height: 48px; + margin-bottom: 0; + + .ant-modal-title { + height: 100%; + line-height: 48px; + font-weight: bold; + padding-left: 20px; + } + } + + .ant-modal-body { + height: 444px; + + >div { + width: 100%; + height: 100%; + align-items: flex-start; + + >div:nth-child(2) { + position: relative; + flex: 1; + box-sizing: border-box; + height: 100%; + padding: 30px 16px; + + .right-context>div { + margin-bottom: 20px; + } + + .right-context .context-key { + font-weight: bold; + } + + .img-download { + position: absolute; + bottom: 0; + cursor: pointer; + } + + } + + } + } + } +} \ No newline at end of file diff --git a/packages/biz/es/WarningRecordCard/WarningRecordCard.d.ts b/packages/biz/es/WarningRecordCard/WarningRecordCard.d.ts new file mode 100644 index 0000000..966998b --- /dev/null +++ b/packages/biz/es/WarningRecordCard/WarningRecordCard.d.ts @@ -0,0 +1,30 @@ +import { CardProps } from 'antd'; +import React from 'react'; +import './index.less'; +export interface IRecord { + imgSrc?: string; + id?: string; + /** + * 预警类型 + */ + warningType?: string; + warningInfo?: string[]; + boxId: string; + position: string; + cabietId?: string; + cabietText?: string; + warningTime?: string; + warningTimestamp?: string | number; + warningTimeFormat?: string; +} +export interface WarningRecordCardProps { + record?: IRecord; + onRecordClick?: (record?: IRecord) => void; + style?: React.CSSProperties; + cardProps?: CardProps; + selectedRecordId?: string; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; +} +export declare const WarningRecordCard: React.FC; +export default WarningRecordCard; diff --git a/packages/biz/es/WarningRecordCard/WarningRecordCard.js b/packages/biz/es/WarningRecordCard/WarningRecordCard.js new file mode 100644 index 0000000..20a6f82 --- /dev/null +++ b/packages/biz/es/WarningRecordCard/WarningRecordCard.js @@ -0,0 +1,89 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import { Card, Space, Divider } from 'antd'; +import { theme } from 'antd/lib'; +import React from 'react'; +import dayjs from 'dayjs'; +import "./index.less"; +; +; +export var WarningRecordCard = function WarningRecordCard(props) { + var componentName = "zhst-biz-warning-record-card"; + var record = props.record, + onRecordClick = props.onRecordClick, + style = props.style, + cardProps = props.cardProps, + selectedRecordId = props.selectedRecordId, + cardStyle = props.cardStyle, + imgStyle = props.imgStyle; + var _ref = record || {}, + imgSrc = _ref.imgSrc, + id = _ref.id, + warningType = _ref.warningType, + _ref$warningInfo = _ref.warningInfo, + warningInfo = _ref$warningInfo === void 0 ? [] : _ref$warningInfo, + cabietText = _ref.cabietText, + warningTime = _ref.warningTime, + warningTimestamp = _ref.warningTimestamp, + _ref$warningTimeForma = _ref.warningTimeFormat, + warningTimeFormat = _ref$warningTimeForma === void 0 ? 'YYYY-MM-DD HH:mm:ss' : _ref$warningTimeForma; + var formattedDate = warningTimestamp ? dayjs(warningTimestamp).format(warningTimeFormat) : ''; + var warningTimeShow = warningTime ? warningTime : formattedDate; + var useToken = theme.useToken; + var _useToken = useToken(), + token = _useToken.token; + var selectedBorderStyle = { + border: "2px solid ".concat(token.colorPrimary), + boxShadow: " 0px 2px 9px 0px rgba(0,0,0,0.16)" + }; + var selectedCardStyle = _objectSpread({}, selectedRecordId === (record === null || record === void 0 ? void 0 : record.id) ? selectedBorderStyle : {}); + var handleClick = function handleClick() { + onRecordClick === null || onRecordClick === void 0 || onRecordClick(record); + }; + return /*#__PURE__*/React.createElement("div", { + className: componentName, + key: id, + onClick: handleClick, + style: style + }, /*#__PURE__*/React.createElement(Card, _extends({ + cover: /*#__PURE__*/React.createElement("img", { + alt: "\u9884\u8B66\u56FE", + src: imgSrc, + style: _objectSpread({ + width: 336, + height: 203, + borderRadius: 0 + }, imgStyle) + }), + style: _objectSpread(_objectSpread({ + width: 356, + height: 302, + padding: 10, + borderRadius: 4 + }, selectedCardStyle), cardStyle) + }, cardProps), /*#__PURE__*/React.createElement("div", { + className: "left-context" + }, /*#__PURE__*/React.createElement("div", { + className: "warning-type" + }, warningType), /*#__PURE__*/React.createElement(Space, { + size: 0, + split: /*#__PURE__*/React.createElement(Divider, { + type: "vertical" + }) + }, warningInfo === null || warningInfo === void 0 ? void 0 : warningInfo.map(function (item, index) { + return /*#__PURE__*/React.createElement("div", { + key: index, + className: "info-item" + }, item); + })), /*#__PURE__*/React.createElement("div", { + className: "warning-time" + }, warningTimeShow)), /*#__PURE__*/React.createElement("div", { + className: "cabietInfo" + }, cabietText))); +}; +export default WarningRecordCard; \ No newline at end of file diff --git a/packages/biz/es/WarningRecordCard/index.d.ts b/packages/biz/es/WarningRecordCard/index.d.ts new file mode 100644 index 0000000..8b82d36 --- /dev/null +++ b/packages/biz/es/WarningRecordCard/index.d.ts @@ -0,0 +1,3 @@ +import WarningRecordCard from './WarningRecordCard'; +export type { IRecord, WarningRecordCardProps } from './WarningRecordCard'; +export default WarningRecordCard; diff --git a/packages/biz/es/WarningRecordCard/index.js b/packages/biz/es/WarningRecordCard/index.js new file mode 100644 index 0000000..36c3c58 --- /dev/null +++ b/packages/biz/es/WarningRecordCard/index.js @@ -0,0 +1,2 @@ +import WarningRecordCard from "./WarningRecordCard"; +export default WarningRecordCard; \ No newline at end of file diff --git a/packages/biz/es/WarningRecordCard/index.less b/packages/biz/es/WarningRecordCard/index.less new file mode 100644 index 0000000..7cfba38 --- /dev/null +++ b/packages/biz/es/WarningRecordCard/index.less @@ -0,0 +1,27 @@ +.zhst-biz-warning-record-card { + cursor: pointer; + + .ant-card-body { + padding: 0; + font-family: MicrosoftYaHei; + line-height: 19px; + display: flex; + margin-top: 10px; + + .left-context { + flex: 1; + + >div { + margin-top: 6px; + } + + >div:nth-child(1) { + margin-top: 0; + } + } + + .warning-type { + font-weight: bold; + } + } +} \ No newline at end of file diff --git a/packages/biz/es/boxSelectTree/boxSelectTree.d.ts b/packages/biz/es/boxSelectTree/boxSelectTree.d.ts new file mode 100644 index 0000000..0690e8f --- /dev/null +++ b/packages/biz/es/boxSelectTree/boxSelectTree.d.ts @@ -0,0 +1,9 @@ +import { FC } from 'react'; +import { TabsProps } from 'antd'; +import type { BoxPanelProps } from './components/boxPanel'; +export interface BoxSelectTreeProps extends BoxPanelProps { + onTabChange?: (e: any) => void; + tabsProps?: TabsProps; +} +declare const BoxSelectTree: FC; +export default BoxSelectTree; diff --git a/packages/biz/es/boxSelectTree/boxSelectTree.js b/packages/biz/es/boxSelectTree/boxSelectTree.js new file mode 100644 index 0000000..a08972a --- /dev/null +++ b/packages/biz/es/boxSelectTree/boxSelectTree.js @@ -0,0 +1,92 @@ +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +import React from 'react'; +import { Tabs } from 'antd'; +import BoxPanel from "./components/boxPanel"; +var BoxSelectTree = function BoxSelectTree(props) { + var data = props.data, + _props$boxDataSource = props.boxDataSource, + boxDataSource = _props$boxDataSource === void 0 ? [] : _props$boxDataSource, + onTabChange = props.onTabChange, + onSearch = props.onSearch, + onItemCheck = props.onItemCheck, + onItemSelect = props.onItemSelect, + onBoxBatchDelete = props.onBoxBatchDelete, + onBoxDelete = props.onBoxDelete, + onCreateSubmit = props.onCreateSubmit, + onClockClick = props.onClockClick, + onImport = props.onImport, + onCreate = props.onCreate, + tabsProps = props.tabsProps, + searchInputProps = props.searchInputProps, + treeProps = props.treeProps, + customImport = props.customImport, + showOptions = props.showOptions, + extraBtns = props.extraBtns; + var items = [{ + key: '1', + label: /*#__PURE__*/React.createElement("div", { + style: { + textAlign: 'center', + width: '160px' + } + }, "\u76D2\u5B50\u7EC4"), + children: /*#__PURE__*/React.createElement(BoxPanel, { + searchInputProps: searchInputProps, + boxDataSource: boxDataSource, + treeProps: treeProps, + data: data, + onCreate: onCreate, + onCreateSubmit: onCreateSubmit, + onBoxBatchDelete: onBoxBatchDelete, + onBoxDelete: onBoxDelete, + onSearch: onSearch, + onItemCheck: onItemCheck, + onItemSelect: onItemSelect, + showOptions: showOptions, + customImport: customImport, + extraBtns: extraBtns, + onClockClick: onClockClick, + onImport: onImport + }) + }, { + key: '2', + label: /*#__PURE__*/React.createElement("div", { + style: { + textAlign: 'center', + width: '160px' + } + }, "\u76D2\u5B50"), + children: /*#__PURE__*/React.createElement(BoxPanel, { + boxDataSource: boxDataSource, + searchInputProps: searchInputProps, + treeProps: treeProps, + data: data, + onCreate: onCreate, + onBoxBatchDelete: onBoxBatchDelete, + onCreateSubmit: onCreateSubmit, + onBoxDelete: onBoxDelete, + onSearch: onSearch, + onItemCheck: onItemCheck, + onItemSelect: onItemSelect, + showOptions: showOptions, + customImport: customImport, + extraBtns: extraBtns, + onClockClick: onClockClick, + onImport: onImport + }) + }]; + return /*#__PURE__*/React.createElement(Tabs, _extends({ + defaultActiveKey: "1", + centered: true, + items: items, + onChange: onTabChange, + tabBarGutter: 0, + indicator: { + size: function size(origin) { + return origin; + }, + align: 'center' + } + }, tabsProps)); +}; +export default BoxSelectTree; \ No newline at end of file diff --git a/packages/biz/es/boxSelectTree/components/boxPanel/index.js b/packages/biz/es/boxSelectTree/components/boxPanel/index.js new file mode 100644 index 0000000..fa2318c --- /dev/null +++ b/packages/biz/es/boxSelectTree/components/boxPanel/index.js @@ -0,0 +1,290 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +import React, { useState, useRef } from 'react'; +import { Button, Divider, Input, Space } from 'antd'; +import { ModalForm, ProFormText } from '@ant-design/pro-components'; +import { ClockCircleOutlined, CloseCircleOutlined, DiffOutlined, FolderAddOutlined, ImportOutlined, SwitcherOutlined } from '@ant-design/icons'; +import TreeTransferModal from "../../../treeTransferModal"; +import BoxTree from "../../../tree"; +var BoxPanel = function BoxPanel(props) { + var _createFormRef$curren4, _treeProps$checkedKey; + var searchInputProps = props.searchInputProps, + _props$showOptions = props.showOptions, + showOptions = _props$showOptions === void 0 ? true : _props$showOptions, + extraBtns = props.extraBtns, + _props$data = props.data, + data = _props$data === void 0 ? [] : _props$data, + onSearch = props.onSearch, + treeProps = props.treeProps, + onItemCheck = props.onItemCheck, + onItemSelect = props.onItemSelect, + onCreateSubmit = props.onCreateSubmit, + onBoxBatchDelete = props.onBoxBatchDelete, + onBoxDelete = props.onBoxDelete, + onClockClick = props.onClockClick, + onImport = props.onImport, + onBatch = props.onBatch, + onCreate = props.onCreate, + boxDataSource = props.boxDataSource, + customImport = props.customImport; + var _useState = useState(false), + _useState2 = _slicedToArray(_useState, 2), + isTreeCheckable = _useState2[0], + setIsTreeCheckable = _useState2[1]; + var _useState3 = useState([]), + _useState4 = _slicedToArray(_useState3, 2), + targetItems = _useState4[0], + setTargetItems = _useState4[1]; + var _useState5 = useState(false), + _useState6 = _slicedToArray(_useState5, 2), + boxChoiceOpen = _useState6[0], + setBoxChoiceOpen = _useState6[1]; + var _useState7 = useState([]), + _useState8 = _slicedToArray(_useState7, 2), + checkedKeys = _useState8[0], + setCheckedKeys = _useState8[1]; + var createFormRef = useRef(); + + /** + * 修改选择状态 + * @param _data + */ + var handleCheckable = function handleCheckable() { + setIsTreeCheckable(function (pre) { + return !pre; + }); + }; + var onTreeCheck = function onTreeCheck(keys, info) { + var _targetItems = []; + setCheckedKeys(keys); + info.checkedNodes.forEach(function (o) { + o.isLeaf && _targetItems.push(o); + }); + setTargetItems(_targetItems); + }; + + /** + * 删除 + * @param key + * @param param1 + */ + var onItemDelete = function onItemDelete(key, _ref) { + var keys = _ref.keys; + setCheckedKeys(function (pre) { + var newKeys = pre.filter(function (_key) { + return !keys.includes(_key); + }); + return newKeys; + }); + setTargetItems(function (pre) { + return pre.filter(function (o) { + return o.key !== key; + }); + }); + }; + + // 盒子点击确定 + var onBoxChoiceOk = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(data) { + var _createFormRef$curren, _createFormRef$curren2, _createFormRef$curren3; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + (_createFormRef$curren = createFormRef.current) === null || _createFormRef$curren === void 0 || _createFormRef$curren.setFieldValue('boxList', data); + (_createFormRef$curren2 = createFormRef.current) === null || _createFormRef$curren2 === void 0 || _createFormRef$curren2.setFieldValue('boxName', 123); + console.log((_createFormRef$curren3 = createFormRef.current) === null || _createFormRef$curren3 === void 0 ? void 0 : _createFormRef$curren3.getFieldValue('boxList')); + setBoxChoiceOpen(false); + case 4: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function onBoxChoiceOk(_x) { + return _ref2.apply(this, arguments); + }; + }(); + + // 盒子选择重置 + var onBoxChoiceReset = function onBoxChoiceReset() { + setCheckedKeys([]); + setTargetItems([]); + }; + return /*#__PURE__*/React.createElement("div", { + style: { + padding: '0 16px' + } + }, /*#__PURE__*/React.createElement(TreeTransferModal, { + open: boxChoiceOpen, + onCancel: function onCancel() { + return setBoxChoiceOpen(false); + }, + onRadioChange: function onRadioChange(e) { + return console.log('radio', e.target.value); + } // 顶部 radio 事件 + , + dataSource: boxDataSource // 数据源 + , + targetItems: targetItems // 右侧选中项 + , + checkedKeys: checkedKeys // 左侧选中 + , + onReset: onBoxChoiceReset // 重置按钮事件 + , + onOk: onBoxChoiceOk // 确定按钮事件 + , + onTreeCheck: onTreeCheck // 树check选中事件 + , + onItemDelete: onItemDelete // 右侧点击删除事件 + }), /*#__PURE__*/React.createElement(Space, { + size: 12, + direction: "vertical", + style: { + width: '100%' + } + }, /*#__PURE__*/React.createElement(Space, { + size: 4, + style: { + width: '100%', + justifyContent: 'space-between' + } + }, /*#__PURE__*/React.createElement(Input, _extends({ + size: "middle", + onChange: function onChange(e) { + return onSearch === null || onSearch === void 0 ? void 0 : onSearch(e); + }, + placeholder: "\u8BF7\u8F93\u5165\u76D2\u5B50\u540D\u79F0" + }, searchInputProps)), customImport || /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, { + type: "text", + onClick: function onClick() { + return (onBatch === null || onBatch === void 0 ? void 0 : onBatch()) || handleCheckable(); + }, + icon: isTreeCheckable ? /*#__PURE__*/React.createElement(SwitcherOutlined, null) : /*#__PURE__*/React.createElement(DiffOutlined, null) + }), /*#__PURE__*/React.createElement(Button, { + type: "text", + onClick: function onClick() { + return onClockClick === null || onClockClick === void 0 ? void 0 : onClockClick(); + }, + icon: /*#__PURE__*/React.createElement(ClockCircleOutlined, null) + }))), showOptions && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Space, { + align: "center" + }, /*#__PURE__*/React.createElement(Button, { + type: "text", + style: { + padding: '4px 8px' + }, + onClick: function onClick() { + return onImport === null || onImport === void 0 ? void 0 : onImport(); + }, + icon: /*#__PURE__*/React.createElement(ImportOutlined, null) + }, "\u5BFC\u5165\u76D2\u5B50"), /*#__PURE__*/React.createElement(Divider, { + type: "vertical", + style: { + margin: '8px 0' + } + }), onCreate ? /*#__PURE__*/React.createElement(Button, { + onClick: onCreate, + type: "text", + style: { + padding: '4px 8px' + }, + icon: /*#__PURE__*/React.createElement(FolderAddOutlined, null) + }, "\u65B0\u5EFA\u7EC4") : /*#__PURE__*/React.createElement(ModalForm, { + width: '600px', + open: onCreate ? false : undefined, + formRef: createFormRef, + title: "\u65B0\u5EFA\u7EC4", + modalProps: { + destroyOnClose: true + }, + layout: "horizontal", + labelCol: { + span: 6 + }, + wrapperCol: { + span: 18 + }, + trigger: /*#__PURE__*/React.createElement(Button, { + type: "text", + style: { + padding: '4px 8px' + }, + icon: /*#__PURE__*/React.createElement(FolderAddOutlined, null) + }, "\u65B0\u5EFA\u7EC4"), + submitter: { + searchConfig: { + submitText: '确定', + resetText: '取消' + } + }, + onFinish: onCreateSubmit + }, /*#__PURE__*/React.createElement(ProFormText, { + rules: [{ + required: true, + max: 20 + }, { + pattern: /^[^\s]*$/g, + message: '禁止输入空格' + }], + fieldProps: { + showCount: true + }, + width: "md", + name: "name", + label: "\u76D2\u5B50\u7EC4\u540D\u79F0", + placeholder: "\u8BF7\u8F93\u5165\u76D2\u5B50\u540D\u79F0" + }), /*#__PURE__*/React.createElement(ProFormText, { + width: "md", + name: "boxList", + label: "\u76D2\u5B50\u9009\u62E9", + fieldProps: { + readOnly: true, + value: "\u5DF2\u9009\u62E9".concat(((_createFormRef$curren4 = createFormRef.current) === null || _createFormRef$curren4 === void 0 || (_createFormRef$curren4 = _createFormRef$curren4.getFieldValue('boxList')) === null || _createFormRef$curren4 === void 0 ? void 0 : _createFormRef$curren4.length) || 0, "\u4E2A\u76D2\u5B50"), + suffix: /*#__PURE__*/React.createElement(Space, null, /*#__PURE__*/React.createElement("a", { + onClick: function onClick() { + var _createFormRef$curren5; + (_createFormRef$curren5 = createFormRef.current) === null || _createFormRef$curren5 === void 0 || _createFormRef$curren5.setFieldValue('boxList', null); + onBoxChoiceReset(); + } + }, "\u6062\u590D\u9ED8\u8BA4"), /*#__PURE__*/React.createElement("a", { + onClick: function onClick() { + return setBoxChoiceOpen(true); + } + }, "\u8303\u56F4\u9009\u62E9")) + } + })), /*#__PURE__*/React.createElement(Divider, { + type: "vertical", + style: { + margin: '8px 0' + } + }), /*#__PURE__*/React.createElement(Button, { + danger: true, + type: "text", + style: { + padding: '4px 8px' + }, + icon: /*#__PURE__*/React.createElement(CloseCircleOutlined, null), + disabled: (treeProps === null || treeProps === void 0 || (_treeProps$checkedKey = treeProps.checkedKeys) === null || _treeProps$checkedKey === void 0 ? void 0 : _treeProps$checkedKey.length) <= 0, + onClick: onBoxBatchDelete + }, "\u5220\u9664")), /*#__PURE__*/React.createElement(Divider, { + style: { + margin: 0 + } + })), extraBtns, /*#__PURE__*/React.createElement(BoxTree, _extends({ + treeCheckable: isTreeCheckable, + data: data, + onItemSelect: onItemSelect, + onItemCheck: onItemCheck, + onItemDelete: onBoxDelete + }, treeProps)))); +}; +export default BoxPanel; \ No newline at end of file diff --git a/packages/biz/es/boxSelectTree/index.d.ts b/packages/biz/es/boxSelectTree/index.d.ts new file mode 100644 index 0000000..2ff0f1e --- /dev/null +++ b/packages/biz/es/boxSelectTree/index.d.ts @@ -0,0 +1,3 @@ +import BoxSelectTree from './boxSelectTree'; +export type { BoxSelectTreeProps } from './boxSelectTree'; +export default BoxSelectTree; diff --git a/packages/biz/es/boxSelectTree/index.js b/packages/biz/es/boxSelectTree/index.js new file mode 100644 index 0000000..c537873 --- /dev/null +++ b/packages/biz/es/boxSelectTree/index.js @@ -0,0 +1,2 @@ +import BoxSelectTree from "./boxSelectTree"; +export default BoxSelectTree; \ No newline at end of file diff --git a/packages/biz/es/boxSelectTree/mock.d.ts b/packages/biz/es/boxSelectTree/mock.d.ts new file mode 100644 index 0000000..84026eb --- /dev/null +++ b/packages/biz/es/boxSelectTree/mock.d.ts @@ -0,0 +1,2 @@ +import { TreeDataNode } from "antd"; +export declare const treeData: TreeDataNode[]; diff --git a/packages/biz/es/boxSelectTree/mock.js b/packages/biz/es/boxSelectTree/mock.js new file mode 100644 index 0000000..f05520b --- /dev/null +++ b/packages/biz/es/boxSelectTree/mock.js @@ -0,0 +1,22 @@ +export var treeData = [{ + title: '全部盒子', + key: '0-0', + children: [{ + title: '盒子组1', + key: '0-0-0', + children: [{ + title: '摄像头1', + key: '0-0-0-0' + }, { + title: '摄像头2', + key: '0-0-0-1' + }] + }, { + title: '盒子组2', + key: '0-0-1', + children: [{ + title: '摄像头4', + key: '0-0-1-0' + }] + }] +}]; \ No newline at end of file diff --git a/packages/biz/es/hooks/useIntelligentTracking/index.js b/packages/biz/es/hooks/useIntelligentTracking/index.js index a2a4caa..5a3264e 100644 --- a/packages/biz/es/hooks/useIntelligentTracking/index.js +++ b/packages/biz/es/hooks/useIntelligentTracking/index.js @@ -8,8 +8,8 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } @@ -18,7 +18,7 @@ import * as turf from '@turf/turf'; import { getListTaskStatus, getCameraStatusFunc } from "../useTaskState"; import Tree from '@common/components/CameraTree/Tree'; import doRequest from "../../utils/request"; -import { message } from 'antd'; +import { message } from '@zhst/meta'; import { SearchCamera } from '@common/components/CameraTree/utils'; import { get, isEmpty } from '@zhst/func'; //默认取值 diff --git a/packages/biz/es/index.d.ts b/packages/biz/es/index.d.ts index 78b6ca3..743bed4 100644 --- a/packages/biz/es/index.d.ts +++ b/packages/biz/es/index.d.ts @@ -1,2 +1,17 @@ -export { default as Demo } from './Demo'; export { default as BigImageModal } from './BigImageModal'; +export type { BigImageModalProps } from './BigImageModal'; +export { default as BoxSelectTree } from './boxSelectTree'; +export type { BoxSelectTreeProps } from './boxSelectTree'; +export { default as Tree } from './tree'; +export type { BoxTreeProps, TreeData } from './tree'; +export { default as TreeTransfer } from './treeTransfer'; +export type { TreeTransferProps } from './treeTransfer'; +export { default as TreeTransferModal } from './treeTransferModal'; +export type { TreeTransferModalProps } from './treeTransferModal'; +export { default as WarningRecordCard } from './WarningRecordCard'; +export type { IRecord, WarningRecordCardProps } from './WarningRecordCard'; +export type { ViewLargerImageModalRef, ViewLargerImageModalProps } from './ViewLargerImageModal'; +export { default as ViewLargerImageModal, useViewLargerImageModal } from './ViewLargerImageModal'; +export type { VideoPlayerCardProps } from './VideoPlayerCard'; +export { default as VideoPlayerCard } from './VideoPlayerCard'; +export { default as RealTimeMonitor } from './RealTimeMonitor'; diff --git a/packages/biz/es/index.js b/packages/biz/es/index.js index 487012d..d340720 100644 --- a/packages/biz/es/index.js +++ b/packages/biz/es/index.js @@ -1,2 +1,9 @@ -export { default as Demo } from "./Demo"; -export { default as BigImageModal } from "./BigImageModal"; \ No newline at end of file +export { default as BigImageModal } from "./BigImageModal"; +export { default as BoxSelectTree } from "./boxSelectTree"; +export { default as Tree } from "./tree"; +export { default as TreeTransfer } from "./treeTransfer"; +export { default as TreeTransferModal } from "./treeTransferModal"; +export { default as WarningRecordCard } from "./WarningRecordCard"; +export { default as ViewLargerImageModal, useViewLargerImageModal } from "./ViewLargerImageModal"; +export { default as VideoPlayerCard } from "./VideoPlayerCard"; +export { default as RealTimeMonitor } from "./RealTimeMonitor"; \ No newline at end of file diff --git a/packages/biz/es/tree/boxTree.d.ts b/packages/biz/es/tree/boxTree.d.ts new file mode 100644 index 0000000..5e34aef --- /dev/null +++ b/packages/biz/es/tree/boxTree.d.ts @@ -0,0 +1,17 @@ +import { FC } from 'react'; +import { TreeDataNode, TreeProps } from 'antd'; +import './index.less'; +export interface BoxTreeProps extends TreeProps { + data: TreeDataNode[]; + treeCheckable?: boolean; + showItemOption?: boolean; + customOptions?: any; + onItemCheck?: TreeProps['onCheck']; + onItemSelect?: TreeProps['onSelect']; + onItemSetting?: (_data: any) => void; + onItemDelete?: (_data: any) => void; + onItemRename?: (_nodeData: any) => void; + onItemRenameFinish?: (_data: any, _nodeData: any) => Promise; +} +declare const boxTree: FC; +export default boxTree; diff --git a/packages/biz/es/tree/boxTree.js b/packages/biz/es/tree/boxTree.js new file mode 100644 index 0000000..e9e44cb --- /dev/null +++ b/packages/biz/es/tree/boxTree.js @@ -0,0 +1,134 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +import React, { useState } from 'react'; +import { Tree, Badge, Space } from 'antd'; +import theme from 'antd/es/theme'; +import { CloseOutlined, EditOutlined, SettingOutlined } from '@ant-design/icons'; +import { ModalForm, ProFormText } from '@ant-design/pro-components'; +import "./index.less"; +var componentName = 'zhst-biz-tree'; +var useToken = theme.useToken; +var boxTree = function boxTree(props) { + var onItemSelect = props.onItemSelect, + onItemCheck = props.onItemCheck, + onItemSetting = props.onItemSetting, + onItemDelete = props.onItemDelete, + _props$data = props.data, + data = _props$data === void 0 ? [] : _props$data, + _props$showItemOption = props.showItemOption, + showItemOption = _props$showItemOption === void 0 ? true : _props$showItemOption, + _props$treeCheckable = props.treeCheckable, + treeCheckable = _props$treeCheckable === void 0 ? false : _props$treeCheckable, + onItemRename = props.onItemRename, + onItemRenameFinish = props.onItemRenameFinish, + customOptions = props.customOptions; + var _useToken = useToken(), + token = _useToken.token; + var _useState = useState(''), + _useState2 = _slicedToArray(_useState, 2), + checkedItem = _useState2[0], + setCheckedItem = _useState2[1]; + var cameraStatus = new Map([['0', 'error'], ['1', 'success'], ['3', 'processing'], ['4', 'default']]); + return /*#__PURE__*/React.createElement(Tree, _extends({ + checkable: treeCheckable, + blockNode: true, + onSelect: function onSelect(selectedKeys, info) { + setCheckedItem(selectedKeys[0]); + onItemSelect === null || onItemSelect === void 0 || onItemSelect(selectedKeys, info); + }, + onCheck: onItemCheck, + treeData: data, + titleRender: function titleRender(_nodeData) { + return /*#__PURE__*/React.createElement("div", { + className: "".concat(componentName, "-item-render") + }, !_nodeData.children && _nodeData.isCamera && /*#__PURE__*/React.createElement(Badge, { + style: { + marginRight: '6px' + }, + status: cameraStatus.get(_nodeData.status || '4') + }), /*#__PURE__*/React.createElement("span", { + // @ts-ignore + style: checkedItem === _nodeData.key && _nodeData.isCamera ? { + color: token.colorPrimary + } : {} + }, _nodeData.title), showItemOption && /*#__PURE__*/React.createElement(Space, { + className: "".concat(componentName, "-item-render_right"), + style: { + float: 'right' + } + }, customOptions || /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ModalForm, { + title: "\u91CD\u547D\u540D", + width: 600, + modalProps: { + destroyOnClose: true + }, + layout: "horizontal", + labelCol: { + span: 6 + }, + wrapperCol: { + span: 18 + }, + trigger: /*#__PURE__*/React.createElement(EditOutlined, { + onClick: function onClick(e) { + e.preventDefault(); + e.stopPropagation(); + onItemRename === null || onItemRename === void 0 || onItemRename(_nodeData); + } + }), + submitter: { + searchConfig: { + submitText: '确定', + resetText: '取消' + } + }, + onFinish: ( /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(value) { + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", onItemRenameFinish === null || onItemRenameFinish === void 0 ? void 0 : onItemRenameFinish(value, _nodeData)); + case 1: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }()) + }, /*#__PURE__*/React.createElement(ProFormText, { + rules: [{ + required: true + }], + width: "md", + name: "name", + label: "\u76D2\u5B50\u540D\u79F0", + placeholder: "\u8BF7\u8F93\u5165\u76D2\u5B50\u540D\u79F0" + })), /*#__PURE__*/React.createElement(SettingOutlined, { + onClick: function onClick(e) { + e.preventDefault(); + e.stopPropagation(); + onItemSetting === null || onItemSetting === void 0 || onItemSetting(_nodeData); + } + }), /*#__PURE__*/React.createElement(CloseOutlined, { + onClick: function onClick(e) { + e.preventDefault(); + e.stopPropagation(); + onItemDelete === null || onItemDelete === void 0 || onItemDelete(_nodeData); + } + })))); + } + }, props)); +}; +export default boxTree; \ No newline at end of file diff --git a/packages/biz/es/tree/index.d.ts b/packages/biz/es/tree/index.d.ts new file mode 100644 index 0000000..4082eb0 --- /dev/null +++ b/packages/biz/es/tree/index.d.ts @@ -0,0 +1,13 @@ +import { TreeDataNode } from 'antd'; +import BoxTree from './boxTree'; +export interface TreeData extends TreeDataNode { + children?: TreeDataNode['children'] & { + isCamera?: boolean; + /** + * 0-失败 1-成功 2-进行中 3-未知 + */ + status?: '0' | '1' | '2' | '3'; + }[]; +} +export type { BoxTreeProps } from './boxTree'; +export default BoxTree; diff --git a/packages/biz/es/tree/index.js b/packages/biz/es/tree/index.js new file mode 100644 index 0000000..23238e5 --- /dev/null +++ b/packages/biz/es/tree/index.js @@ -0,0 +1,2 @@ +import BoxTree from "./boxTree"; +export default BoxTree; \ No newline at end of file diff --git a/packages/biz/es/tree/index.less b/packages/biz/es/tree/index.less new file mode 100644 index 0000000..9da4e2d --- /dev/null +++ b/packages/biz/es/tree/index.less @@ -0,0 +1,9 @@ +.zhst-biz-tree-item-render { + &_right { + display: none; + } + + &:hover &_right { + display: inline-flex; + } +} diff --git a/packages/biz/es/treeTransfer/TreeTransfer.d.ts b/packages/biz/es/treeTransfer/TreeTransfer.d.ts new file mode 100644 index 0000000..b74b4f3 --- /dev/null +++ b/packages/biz/es/treeTransfer/TreeTransfer.d.ts @@ -0,0 +1,22 @@ +import React from 'react'; +import { InputProps } from 'antd'; +import { TransferProps, TreeDataNode, TreeProps } from 'antd'; +import './index.less'; +export interface TreeTransferProps { + dataSource: TreeDataNode[]; + treeProps?: TreeProps; + searchInputProps?: InputProps; + targetItems: TreeDataNode[]; + checkedKeys: string[]; + onTreeSelect?: TreeProps['onSelect']; + onTreeCheck?: TreeProps['onCheck']; + onItemDelete?: (key: string, info?: { + root: TreeDataNode[]; + keys: string[]; + }) => void; + onChange?: TransferProps['onChange']; + onOk?: (data: any) => void; + onReset?: () => void; +} +declare const TreeTransfer: React.FC; +export default TreeTransfer; diff --git a/packages/biz/es/treeTransfer/TreeTransfer.js b/packages/biz/es/treeTransfer/TreeTransfer.js new file mode 100644 index 0000000..dc3e135 --- /dev/null +++ b/packages/biz/es/treeTransfer/TreeTransfer.js @@ -0,0 +1,143 @@ +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +import React, { useState } from 'react'; +import { Button, Card, Flex, Input, Tree } from 'antd'; +import theme from 'antd/es/theme'; +import "./index.less"; +import { DeleteOutlined, DoubleRightOutlined, SearchOutlined } from '@ant-design/icons'; +import { getAllRootKeyById } from "./treeTransferHelper"; +var componentName = 'zhst-biz-treeTransfer'; +var useToken = theme.useToken; +var TreeTransfer = function TreeTransfer(_ref) { + var dataSource = _ref.dataSource, + treeProps = _ref.treeProps, + searchInputProps = _ref.searchInputProps, + _ref$targetItems = _ref.targetItems, + targetItems = _ref$targetItems === void 0 ? [] : _ref$targetItems, + _ref$checkedKeys = _ref.checkedKeys, + checkedKeys = _ref$checkedKeys === void 0 ? [] : _ref$checkedKeys, + onTreeCheck = _ref.onTreeCheck, + onTreeSelect = _ref.onTreeSelect, + onItemDelete = _ref.onItemDelete, + onOk = _ref.onOk, + onReset = _ref.onReset; + var _useToken = useToken(), + token = _useToken.token; + var _useState = useState(''), + _useState2 = _slicedToArray(_useState, 2), + keyWords = _useState2[0], + setKeyWords = _useState2[1]; + function findNodesWithKeyword(_keyWords, _treeData) { + // @ts-ignore + function dfs(node) { + return node.filter(function (item) { + return item.title.includes(_keyWords); + }); + } + var data = dfs(_treeData); + return data || []; + } + return /*#__PURE__*/React.createElement(Flex, { + gap: 20, + className: componentName, + align: "center", + justify: "center" + }, /*#__PURE__*/React.createElement("div", { + className: "".concat(componentName, "-left") + }, /*#__PURE__*/React.createElement(Card, { + className: "".concat(componentName, "-left_card"), + title: /*#__PURE__*/React.createElement("div", { + style: { + textAlign: 'center' + } + }, "\u53EF\u9009\u62E9\u7684\u8303\u56F4"), + bodyStyle: { + padding: 12 + } + }, /*#__PURE__*/React.createElement(Input, _extends({ + prefix: /*#__PURE__*/React.createElement(SearchOutlined, null), + onChange: function onChange(e) { + return setKeyWords(e.target.value); + }, + placeholder: "\u8BF7\u8F93\u5165\u8BBE\u5907\u540D\u79F0" + }, searchInputProps)), /*#__PURE__*/React.createElement(Tree, _extends({ + style: { + marginTop: '6px' + }, + height: 420, + blockNode: true, + checkable: true, + checkedKeys: checkedKeys, + treeData: findNodesWithKeyword(keyWords, dataSource), + onCheck: function onCheck(keys, info) { + return onTreeCheck === null || onTreeCheck === void 0 ? void 0 : onTreeCheck(keys, info); + }, + onSelect: function onSelect(keys, info) { + return onTreeSelect === null || onTreeSelect === void 0 ? void 0 : onTreeSelect(keys, info); + } + }, treeProps)))), /*#__PURE__*/React.createElement(DoubleRightOutlined, null), /*#__PURE__*/React.createElement("div", { + className: "".concat(componentName, "-right") + }, /*#__PURE__*/React.createElement(Card, { + className: "".concat(componentName, "-right_card"), + title: /*#__PURE__*/React.createElement("div", { + style: { + textAlign: 'center' + } + }, "\u5DF2\u9009\u62E9\u7684\u8303\u56F4"), + bodyStyle: { + padding: 0 + } + }, /*#__PURE__*/React.createElement("div", { + className: "".concat(componentName, "-right_card__items") + }, targetItems.map(function (item) { + return /*#__PURE__*/React.createElement("div", { + className: "".concat(componentName, "-right_card__items___item"), + key: item.key, + onMouseEnter: function onMouseEnter(e) { + e.target.style.backgroundColor = token.colorPrimaryBg; + e.target.style.color = token.colorPrimary; + }, + onMouseLeave: function onMouseLeave(e) { + e.target.style.color = token.colorText; + e.target.style.backgroundColor = null; + } + }, item.title, /*#__PURE__*/React.createElement("div", { + style: { + float: 'right' + } + }, /*#__PURE__*/React.createElement(DeleteOutlined, { + onClick: function onClick() { + var _getAllRootKeyById = getAllRootKeyById(item.key, dataSource), + root = _getAllRootKeyById.root, + keys = _getAllRootKeyById.keys; + onItemDelete === null || onItemDelete === void 0 || onItemDelete(item.key, { + root: root, + keys: keys + }); + } + }))); + })), /*#__PURE__*/React.createElement(Flex, { + className: "".concat(componentName, "-right_card__btns") + }, /*#__PURE__*/React.createElement(Button, { + style: { + marginRight: 8, + width: '50%' + }, + disabled: targetItems.length <= 0, + onClick: onReset + }, "\u91CD\u7F6E"), /*#__PURE__*/React.createElement(Button, { + style: { + width: '50%' + }, + type: "primary", + onClick: function onClick() { + return onOk === null || onOk === void 0 ? void 0 : onOk(targetItems); + } + }, "\u786E\u5B9A"))))); +}; +export default TreeTransfer; \ No newline at end of file diff --git a/packages/biz/es/treeTransfer/index.d.ts b/packages/biz/es/treeTransfer/index.d.ts new file mode 100644 index 0000000..7ea5c47 --- /dev/null +++ b/packages/biz/es/treeTransfer/index.d.ts @@ -0,0 +1,4 @@ +import TreeTransfer from "./TreeTransfer"; +export type { TreeTransferProps } from './TreeTransfer'; +export * from './treeTransferHelper'; +export default TreeTransfer; diff --git a/packages/biz/es/treeTransfer/index.js b/packages/biz/es/treeTransfer/index.js new file mode 100644 index 0000000..153880e --- /dev/null +++ b/packages/biz/es/treeTransfer/index.js @@ -0,0 +1,3 @@ +import TreeTransfer from "./TreeTransfer"; +export * from "./treeTransferHelper"; +export default TreeTransfer; \ No newline at end of file diff --git a/packages/biz/es/treeTransfer/index.less b/packages/biz/es/treeTransfer/index.less new file mode 100644 index 0000000..9ffe8cd --- /dev/null +++ b/packages/biz/es/treeTransfer/index.less @@ -0,0 +1,43 @@ +.zhst-biz-treeTransfer { + &-left { + &_card { + width: 500px; + height: 522px; + background-color: #FCFCFC; + } + } + + &-right { + &_card { + width: 300px; + height: 522px; + background-color: #FCFCFC; + + &__items { + padding: 8px 4px; + overflow: scroll; + + &::-webkit-scrollbar { + display: none; + } + + &___item { + margin: 0; + padding: 4px 12px; + cursor: pointer; + } + } + + &__btns { + width: 100%; + padding: 8px; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + box-sizing: border-box; + border-top: 1px solid #f0f0f0; + } + } + } +} diff --git a/packages/biz/es/treeTransfer/treeTransferHelper.d.ts b/packages/biz/es/treeTransfer/treeTransferHelper.d.ts new file mode 100644 index 0000000..705684c --- /dev/null +++ b/packages/biz/es/treeTransfer/treeTransferHelper.d.ts @@ -0,0 +1,12 @@ +export declare const isChecked: (selectedKeys: React.Key[], eventKey: React.Key) => boolean; +/** + * 通过子元素找到父级节点 + * @param objects + * @param element + * @returns + */ +export declare const findParentByChild: (objects: any[], propertyValue: string | number, propertyKey?: string) => any; +export declare const getAllRootKeyById: (val: string | number, list: any[], key?: string) => { + root: any; + keys: any[]; +}; diff --git a/packages/biz/es/treeTransfer/treeTransferHelper.js b/packages/biz/es/treeTransfer/treeTransferHelper.js new file mode 100644 index 0000000..efaf6d8 --- /dev/null +++ b/packages/biz/es/treeTransfer/treeTransferHelper.js @@ -0,0 +1,57 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +export var isChecked = function isChecked(selectedKeys, eventKey) { + return selectedKeys.includes(eventKey); +}; +function isObject(value) { + return value !== null && _typeof(value) === 'object' && !Array.isArray(value); +} + +/** + * 通过子元素找到父级节点 + * @param objects + * @param element + * @returns + */ +export var findParentByChild = function findParentByChild(objects, propertyValue) { + var propertyKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'key'; + for (var i = 0; i < objects.length; i++) { + var obj = objects[i]; + if (obj[propertyKey] === propertyValue) { + return obj; + } else if (_typeof(obj) === 'object') { + var found = findParentByChild(Object.values(obj), propertyValue); + if (found) { + return obj; + } + } + } + return null; // 如果找不到包含具有指定属性的子对象的父对象,返回 null +}; +export var getAllRootKeyById = function getAllRootKeyById(val, list) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'key'; + var keys = []; + var findParentByChild = function findParentByChild(propertyValue, objects, propertyKey) { + for (var i = 0; i < objects.length; i++) { + var obj = objects[i]; + if (obj[propertyKey] === propertyValue) { + console.log('obj', obj); + return obj; + } else if (_typeof(obj) === 'object') { + var found = findParentByChild(propertyValue, Object.values(obj), propertyKey); + if (found) { + if (isObject(found)) { + keys.push(found.key); + } + return obj; + } + } + } + return null; // 如果找不到包含具有指定属性的子对象的父对象,返回 null + }; + var data = findParentByChild(val, list, key); + data.key && keys.push(data.key); + return { + root: data, + keys: keys + }; +}; \ No newline at end of file diff --git a/packages/biz/es/treeTransferModal/TreeTransferModal.d.ts b/packages/biz/es/treeTransferModal/TreeTransferModal.d.ts new file mode 100644 index 0000000..e0a0d0e --- /dev/null +++ b/packages/biz/es/treeTransferModal/TreeTransferModal.d.ts @@ -0,0 +1,26 @@ +import { FC } from 'react'; +import { ModalProps, RadioGroupProps, SelectProps, TransferProps, TreeDataNode, TreeProps } from 'antd'; +export interface TreeTransferModalProps { + dataSource: TreeDataNode[]; + treeProps?: TreeProps; + targetItems: TreeDataNode[]; + checkedKeys: string[]; + onTreeSelect?: TreeProps['onSelect']; + onTreeCheck?: TreeProps['onCheck']; + onItemDelete?: (key: string, info?: { + root: TreeDataNode[]; + keys: string[]; + }) => void; + onChange?: TransferProps['onChange']; + onOk?: (data: any) => void; + onReset?: () => void; + open?: boolean; + onCancel?: ModalProps['onCancel']; + onRadioChange?: RadioGroupProps['onChange']; + onSelect?: SelectProps['onSelect']; + modalProps?: ModalProps; + radioProps?: RadioGroupProps; + selectProps?: SelectProps; +} +declare const TreeTransferModal: FC; +export default TreeTransferModal; diff --git a/packages/biz/es/treeTransferModal/TreeTransferModal.js b/packages/biz/es/treeTransferModal/TreeTransferModal.js new file mode 100644 index 0000000..5580038 --- /dev/null +++ b/packages/biz/es/treeTransferModal/TreeTransferModal.js @@ -0,0 +1,80 @@ +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +import React, { useState } from 'react'; +import { Modal, Radio, Select } from 'antd'; +import TreeTransfer from "../treeTransfer"; +import { ALL_LIST, BOX_TYPE_LIST } from "../utils/constants"; +var TreeTransferModal = function TreeTransferModal(props) { + var open = props.open, + _props$dataSource = props.dataSource, + dataSource = _props$dataSource === void 0 ? [] : _props$dataSource, + checkedKeys = props.checkedKeys, + onItemDelete = props.onItemDelete, + onOk = props.onOk, + onCancel = props.onCancel, + onReset = props.onReset, + onRadioChange = props.onRadioChange, + onTreeCheck = props.onTreeCheck, + onSelect = props.onSelect, + targetItems = props.targetItems, + modalProps = props.modalProps, + radioProps = props.radioProps, + selectProps = props.selectProps; + var _useState = useState('1'), + _useState2 = _slicedToArray(_useState, 2), + type = _useState2[0], + setType = _useState2[1]; + return /*#__PURE__*/React.createElement(Modal, _extends({ + open: open, + destroyOnClose: true, + title: "\u7EDF\u8BA1\u70B9\u4F4D", + width: "948px", + footer: null, + onCancel: onCancel + }, modalProps), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Radio.Group, _extends({ + onChange: function onChange(e) { + setType(e.target.value); + onRadioChange === null || onRadioChange === void 0 || onRadioChange(e); + }, + style: { + marginLeft: '24px', + padding: '20px 0' + }, + value: type, + options: BOX_TYPE_LIST + }, radioProps)), /*#__PURE__*/React.createElement(Select, _extends({ + defaultValue: '', + style: { + marginLeft: 200, + width: 150 + }, + options: ALL_LIST, + onSelect: onSelect + }, selectProps))), type === 'box' ? /*#__PURE__*/React.createElement(TreeTransfer, { + dataSource: dataSource, + targetItems: targetItems, + checkedKeys: checkedKeys, + onTreeCheck: onTreeCheck, + onItemDelete: onItemDelete, + onOk: onOk, + onReset: onReset + }) : /*#__PURE__*/React.createElement(TreeTransfer, { + dataSource: dataSource, + targetItems: targetItems, + checkedKeys: checkedKeys, + onTreeCheck: onTreeCheck, + onItemDelete: onItemDelete, + onOk: onOk, + onReset: onReset + }), /*#__PURE__*/React.createElement("p", { + style: { + textAlign: 'right' + } + }, "\u5DF2\u9009\u4E2D", targetItems.length, "\u4E2A\u70B9\u4F4D"))); +}; +export default TreeTransferModal; \ No newline at end of file diff --git a/packages/biz/es/treeTransferModal/index.d.ts b/packages/biz/es/treeTransferModal/index.d.ts new file mode 100644 index 0000000..8e5245a --- /dev/null +++ b/packages/biz/es/treeTransferModal/index.d.ts @@ -0,0 +1,3 @@ +import TreeTransferModal from './TreeTransferModal'; +export type { TreeTransferModalProps } from './TreeTransferModal'; +export default TreeTransferModal; diff --git a/packages/biz/es/treeTransferModal/index.js b/packages/biz/es/treeTransferModal/index.js new file mode 100644 index 0000000..3c464e7 --- /dev/null +++ b/packages/biz/es/treeTransferModal/index.js @@ -0,0 +1,2 @@ +import TreeTransferModal from "./TreeTransferModal"; +export default TreeTransferModal; \ No newline at end of file diff --git a/packages/biz/es/useSocket/index.js b/packages/biz/es/useSocket/index.js deleted file mode 100644 index 305ec57..0000000 --- a/packages/biz/es/useSocket/index.js +++ /dev/null @@ -1,95 +0,0 @@ -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } -function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -import { useMemo } from 'react'; -import { throttle as loadshThrottle, noop } from '@zhst/func'; -import { useDeepEffect, useLatest } from '@zhst/hooks'; -import ws from "./ws"; -var getSelf = function getSelf(v) { - return v; -}; -export var SocketApi = { - CameraTaskStatue: 'singer.DeviceService/SubScribeCameraTaskStatus', - DeviceStatus: 'singer.TaskManagerService/SubscribeTaskStatus', - SubscribeSolutionDeploy: 'singer.SolutionManagerService/SubscribeSolutionDeploy', - SubscribeTasksSummary: 'singer.TaskManagerService/SubscribeTasksSummary', - MonitorSubscribeResult: 'singer.MonitorService/MonitorSubscribeResult', - MonitorSubscribeStatus: 'singer.MonitorService/MonitorSubscribeStatus', - SubscribeArchiveGroupUpload: 'singer.ArchiveGroupService/CreateArchiveByImport', - SubscribeJointTask: 'singer.JointTaskService/SubscribeJointTask', - SubscribeGroupFragment: 'singer.VideoService/SubscribeVideoFragmentStatus', - // 监听视频分片状态变化,包括新建、删除、变化 - SubscribeGroup: 'singer.VideoService/SubscribeGroup', - // 监听视频分组状态变化,列表变化也通知 - SubscribeStreamEvent: 'singer.MediaManagerService/SubscribeStreamEvent' // 监听视频分组状态变化,列表变化也通知 -}; -export default (function (topic) { - var iterator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop; - var opt = arguments.length > 2 ? arguments[2] : undefined; - var _ref = opt || {}, - _ref$req = _ref.req, - req = _ref$req === void 0 ? {} : _ref$req, - _ref$throttle = _ref.throttle, - throttle = _ref$throttle === void 0 ? 0 : _ref$throttle, - _ref$beforeLoopTmp = _ref.beforeLoopTmp, - beforeLoopTmp = _ref$beforeLoopTmp === void 0 ? getSelf : _ref$beforeLoopTmp, - _ref$shouldBreak = _ref.shouldBreak, - shouldBreak = _ref$shouldBreak === void 0 ? false : _ref$shouldBreak, - forceRefresh = _ref.forceRefresh, - close = _ref.close; - - // 带上token - var reqstring = useMemo(function () { - var newReq = _objectSpread(_objectSpread({}, req), {}, { - extraHeaders: { - authorization: localStorage.getItem('USER-TOKEN') - } - }); - return JSON.stringify(newReq); - }, [req]); - var latestIterator = useLatest(iterator); - useDeepEffect(function () { - if (close) { - return; - } - //控制socket 请求发送 - if (shouldBreak) { - return; - } - //去抖动 - - var tmpData = []; - var throttleUpdate = loadshThrottle(function () { - if (tmpData.length == 0) { - return; - } - var _tmpData = beforeLoopTmp(tmpData); - latestIterator.current(_tmpData); //加了throttle 数据就变成数组 - tmpData = []; - }, throttle); - var unSubscribe = ws.subscribe(SocketApi[topic], reqstring, function (socketData) { - try { - if (!throttle) { - latestIterator.current(socketData); - } else { - tmpData.push(socketData); - throttleUpdate(); - } - } catch (error) { - console.error('useSocke:', error); - } - }); - return function () { - try { - unSubscribe(); - throttleUpdate.cancel(); - } catch (error) { - console.error(error); - throw error; - } - }; - }, [topic, reqstring, shouldBreak, forceRefresh, close]); -}); \ No newline at end of file diff --git a/packages/biz/es/useSocket/onceChannel.d.ts b/packages/biz/es/useSocket/onceChannel.d.ts deleted file mode 100644 index 400ffa7..0000000 --- a/packages/biz/es/useSocket/onceChannel.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const startChannel: (topic: any, req: any, callback: any) => () => void; -export default startChannel; diff --git a/packages/biz/es/useSocket/onceChannel.js b/packages/biz/es/useSocket/onceChannel.js deleted file mode 100644 index ebb1e2e..0000000 --- a/packages/biz/es/useSocket/onceChannel.js +++ /dev/null @@ -1,24 +0,0 @@ -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -//@ts-nocheck -import channel from "./ws"; -var startChannel = function startChannel(topic, req, callback) { - // 带上token - var reqstring = JSON.stringify(_objectSpread(_objectSpread({}, req), {}, { - extraHeaders: { - authorization: localStorage.getItem('USER-TOKEN') - } - })); - var unSubscribe = channel.subscribe(topic, reqstring, function (socketData) { - var shouldStop = callback(socketData); - if (shouldStop) { - unSubscribe === null || unSubscribe === void 0 || unSubscribe(); - } - }); - return unSubscribe; -}; -export default startChannel; \ No newline at end of file diff --git a/packages/biz/es/useSocket/ws.d.ts b/packages/biz/es/useSocket/ws.d.ts deleted file mode 100644 index 0dc9550..0000000 --- a/packages/biz/es/useSocket/ws.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -declare class Channel { - /** - * io 实例化对象 - */ - ioIns: any; - /** - * 已存在的订阅列表 - */ - listeners: never[]; - /** - * 调试信息 记录订阅/反订阅次数 - */ - subscribeListenerId: never[]; - unSubscribeListenerId: never[]; - init: () => void; - retry: (listener: { - [x: string]: any; - lastRetryInterval: number | undefined; - intervalId: NodeJS.Timeout; - } | undefined) => void; - doEmit: (topic: any, req: any, listenerId: any) => void; - subscribe(topic: any, req: any, handle: any): () => void; - unSubscribe(topic: any, req: any, handleId: any, listenerId: any): void; -} -declare const channelIns: Channel; -export default channelIns; diff --git a/packages/biz/es/useSocket/ws.js b/packages/biz/es/useSocket/ws.js deleted file mode 100644 index 8e53d9c..0000000 --- a/packages/biz/es/useSocket/ws.js +++ /dev/null @@ -1,244 +0,0 @@ -function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -// @ts-nocheck -import { v4 as uuidv4 } from 'uuid'; -import { has } from '@zhst/func'; -import io from 'socket.io-client'; -import { SOCKET_HOST } from '@common/constants'; -var EMITSTATE = { - NOT_CONNECT: 0, - WAITING: 1, - CONNECT: 2 -}; -var initRetryTime = 0; -var intervalTime = 5 * 1000; //下次重试增加时间 -var maxIntervalTime = 1 * 60 * 60 * 1000; //最大重试时间1小时 -var Channel = /*#__PURE__*/function () { - function Channel() { - var _this = this; - _classCallCheck(this, Channel); - /** - * io 实例化对象 - */ - _defineProperty(this, "ioIns", void 0); - /** - * 已存在的订阅列表 - */ - _defineProperty(this, "listeners", [ - // { - // topic: "", - // req: "", - // suInfo: {}, - // hasEmit: false,//是否已经订阅 - // lastRetryInterval: 0, - // handles: { - // } - // } - ]); - /** - * 调试信息 记录订阅/反订阅次数 - */ - _defineProperty(this, "subscribeListenerId", []); - _defineProperty(this, "unSubscribeListenerId", []); - _defineProperty(this, "init", function () { - var ioIns = _this.ioIns = io(SOCKET_HOST, { - reconnection: true, - transports: ['websocket'], - forceNew: true - }); - ioIns.on('connect', function () { - for (var _len = arguments.length, arg = new Array(_len), _key = 0; _key < _len; _key++) { - arg[_key] = arguments[_key]; - } - console.debug('connect', arg); - _this.ioIns = ioIns; - _this.listeners.forEach(function (v) { - _this.doEmit(v['topic'], v['req'], v['id']); - }); - }); - ioIns.on('event', function () { - for (var _len2 = arguments.length, arg = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - arg[_key2] = arguments[_key2]; - } - console.debug('event', arg); - }); - ioIns.on('disconnect', function () { - for (var _len3 = arguments.length, arg = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - arg[_key3] = arguments[_key3]; - } - console.debug('disconnect', arg); - _this.subscribeListenerId = []; - _this.unSubscribeListenerId = []; - }); - ioIns.on('reconnect', function () { - for (var _len4 = arguments.length, arg = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - arg[_key4] = arguments[_key4]; - } - console.debug('reconnect', arg); - _this.listeners.forEach(function (v) { - v['hasEmit'] = EMITSTATE.NOT_CONNECT; - _this.doEmit(v['topic'], v['req'], v['id']); - }); - }); - }); - _defineProperty(this, "retry", function (listener) { - //重试逻辑 - var intervalId = setTimeout(function () { - var hasExit = _this.listeners.find(function (v) { - return v['topic'] === (listener === null || listener === void 0 ? void 0 : listener['topic']) && v['req'] === listener['req']; - }); - if (!hasExit) return; - listener['hasEmit'] = EMITSTATE.NOT_CONNECT; - _this.doEmit(listener['topic'], listener['req'], listener['id']); - }, listener.lastRetryInterval); - listener.intervalId = intervalId; - listener.lastRetryInterval = intervalTime + listener.lastRetryInterval > maxIntervalTime ? maxIntervalTime : intervalTime + listener.lastRetryInterval; - }); - _defineProperty(this, "doEmit", function (topic, req, listenerId) { - var _this$ioIns, _this$ioIns$emit; - if (!_this.ioIns) { - _this.init(); - } - //订阅过就不订阅了 - var hasEmit = _this.listeners.find(function (v) { - return v['topic'] === topic && v['req'] === req && v['hasEmit'] !== EMITSTATE.NOT_CONNECT; - }); - if (hasEmit) { - return; - } - var listener = _this.listeners.find(function (v) { - return v['topic'] === topic && v['req'] === req; - }); - listener['hasEmit'] = EMITSTATE.WAITING; - (_this$ioIns = _this.ioIns) === null || _this$ioIns === void 0 || (_this$ioIns$emit = _this$ioIns.emit) === null || _this$ioIns$emit === void 0 || _this$ioIns$emit.call(_this$ioIns, topic, req, function (data) { - var _this$ioIns2, _this$ioIns2$on; - console.info('emit', topic, req, data); - var suInfo = JSON.parse(data); - if (has(suInfo, 'Error.code')) { - if (suInfo.Error.code === 500) { - //后端出错 - _this.retry(listener); - } - return; - } - // console.debug('SUBSCRIBE', listenerId, topic, req, suInfo); - _this.subscribeListenerId.push(listenerId); - // debugger - //重新找一遍topic - var currentTopicIndex = _this.listeners.findIndex(function (v) { - return v['topic'] === topic && v['req'] === req && v['id'] === listenerId; - }); - if (currentTopicIndex == -1) { - // 不存在说明listener取消了 直接反订阅 - _this.ioIns.emit('UnSubscribe', JSON.stringify(suInfo), function (data) { - _this.unSubscribeListenerId.push(listenerId); - console.debug('UNSUBSCRIBE', listenerId, topic, req, data); - }); - return; - } - if (!suInfo['SubscribeID']) { - _this.listeners.splice(currentTopicIndex, 0); - } else { - _this.listeners[currentTopicIndex]['suInfo'] = suInfo; - _this.listeners[currentTopicIndex]['hasEmit'] = EMITSTATE.CONNECT; - } - (_this$ioIns2 = _this.ioIns) === null || _this$ioIns2 === void 0 || (_this$ioIns2$on = _this$ioIns2.on) === null || _this$ioIns2$on === void 0 || _this$ioIns2$on.call(_this$ioIns2, suInfo['SubscribeID'], function (data) { - console.info('on', suInfo['SubscribeID'], data); - try { - var socketData = JSON.parse(data); - if (has(socketData, 'Error.code')) { - if (socketData.Error.code === 500) { - //后端出错 - _this.retry(listener); - } - return; - } - var _ref = _this.listeners.find(function (v) { - return v['topic'] === topic && v['req'] === req; - }) || {}, - _ref$handles = _ref.handles, - handles = _ref$handles === void 0 ? {} : _ref$handles; - Object.keys(handles).forEach(function (key) { - try { - //后面观察 为什么delete后在foreach - var func = handles[key]; - if (!func) return; - func(socketData); - } catch (error) { - console.error(error); - } - }); - } catch (error) { - console.debug('error', error); - } - }); - }); - }); - } - _createClass(Channel, [{ - key: "subscribe", - value: function subscribe(topic, req, handle) { - var handleId = uuidv4(); - var listenerId = uuidv4(); - var listener = this.listeners.find(function (v) { - return v['topic'] === topic && v['req'] === req; - }); - if (listener) { - listener['handles'][handleId] = handle; - } else { - this.listeners.push({ - topic: topic, - req: req, - suInfo: {}, - id: listenerId, - hasEmit: EMITSTATE.NOT_CONNECT, - lastRetryInterval: initRetryTime, - handles: _defineProperty({}, "".concat(handleId), handle) - }); - //未注册过 则去订阅 - this.doEmit(topic, req, listenerId); - } - return this.unSubscribe.bind(this, topic, req, handleId, listenerId); - } - }, { - key: "unSubscribe", - value: function unSubscribe(topic, req, handleId, listenerId) { - var _this2 = this; - var listener = this.listeners.find(function (v) { - return v['topic'] === topic && v['req'] === req && v['id'] === listenerId; - }); - var _ref2 = listener || {}, - _ref2$handles = _ref2.handles, - handles = _ref2$handles === void 0 ? {} : _ref2$handles, - suInfo = _ref2.suInfo; - if (handles[handleId]) { - delete handles[handleId]; - //如果没有其他订阅就删除 - if (Object.keys(handles).length === 0) { - if (this.intervalId) { - clearTimeout(this.intervalId); - } - if (listener['hasEmit'] === EMITSTATE['CONNECT']) { - this.ioIns.emit('UnSubscribe', JSON.stringify(suInfo), function (data) { - _this2.unSubscribeListenerId.push(listenerId); - console.debug('UNSUBSCRIBE', listener['id'], topic, req, data); - }); - } - this.listeners = this.listeners.filter(function (v) { - return !(v['topic'] === topic && v['req'] === req); - }); - } - } - } - }]); - return Channel; -}(); //单例 -var channelIns = new Channel(); -//暴露实例 调试用 -window.__channel__ = channelIns; -export default channelIns; \ No newline at end of file diff --git a/packages/biz/es/utils/constants.d.ts b/packages/biz/es/utils/constants.d.ts deleted file mode 100644 index 45a9a99..0000000 --- a/packages/biz/es/utils/constants.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -export declare const OBJECT_GRNER_THRESHOLD = 0.8; -export declare const OBJECT_AGE_TYPE_THRESHOLD = 0.5; -export declare const MODE_KEY = "test_mode"; -export declare const SEARCH_IMG_COUNT = 10; -export declare const GLOBAL_IS_ITEM_NUMBER_SHOW = false; -export declare const publicPath = "hummingbird"; -export declare const ENTER_CIRCLE = "MONITORTYPE_ENTER_CIRCLE"; -export declare const OUT_CIRCLE = "MONITORTYPE_OUT_CIRCLE"; -export declare const TEMP = "MONITORTYPE_TEMP"; -export declare const GLOBAL_IS_BOX_VMS_SHOW = true; -export declare const BODY_SEARCH_THRESHOID = 0.45; -export declare const RECORD_VERSION = "3.0.0"; -export declare const DeviceTab: { - EMPTY: number; - REAL_CAMERA: number; - PREPROCESS_CAMERA: number; - TAG_CAMERA: number; - HISTORY_VIDEO_GROUP: number; - VIRTUAL_CAMERA: number; - REAL_CAMERA_NOFACE: number; - REAL_CAMERA_ONLYFACE: number; - REAL_CAMERA_NOFACE_NOBOX_NODIRECONNECT: number; -}; diff --git a/packages/biz/es/utils/constants.js b/packages/biz/es/utils/constants.js index 1ad86ba..925bab4 100644 --- a/packages/biz/es/utils/constants.js +++ b/packages/biz/es/utils/constants.js @@ -27,4 +27,17 @@ export var DeviceTab = { REAL_CAMERA_NOFACE: 6, REAL_CAMERA_ONLYFACE: 7, REAL_CAMERA_NOFACE_NOBOX_NODIRECONNECT: 8 // 只有普通摄像头,没有人脸、没有盒子、直连 -}; \ No newline at end of file +}; + +// 盒子 Tab 切换 +export var BOX_TYPE_LIST = [{ + value: '1', + label: '盒子' +}, { + value: '2', + label: '盒子组' +}]; +export var ALL_LIST = [{ + value: '', + label: '全部' +}]; \ No newline at end of file diff --git a/packages/biz/lib/BigImageModal/components/CombineImage/index.d.ts b/packages/biz/lib/BigImageModal/components/CombineImage/index.d.ts new file mode 100644 index 0000000..19dbaa2 --- /dev/null +++ b/packages/biz/lib/BigImageModal/components/CombineImage/index.d.ts @@ -0,0 +1,11 @@ +import { FC } from 'react'; +interface ComBineImageProps { + data: { + imgSummary: string; + compaterImages: string[]; + imageKey: string; + score: number; + }; +} +declare const ComBineImage: FC; +export default ComBineImage; diff --git a/packages/biz/lib/BigImageModal/components/CombineImage/index.js b/packages/biz/lib/BigImageModal/components/CombineImage/index.js new file mode 100644 index 0000000..aa5aca2 --- /dev/null +++ b/packages/biz/lib/BigImageModal/components/CombineImage/index.js @@ -0,0 +1,71 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/BigImageModal/components/CombineImage/index.tsx +var CombineImage_exports = {}; +__export(CombineImage_exports, { + default: () => CombineImage_default +}); +module.exports = __toCommonJS(CombineImage_exports); +var import_react = __toESM(require("react")); +var import_meta = require("@zhst/meta"); +var ComBineImage = (0, import_react.forwardRef)((props, ref) => { + const { data } = props; + const { imgSummary, compaterImages = [] } = data; + const targetImageRef = (0, import_react.useRef)(null); + const compareImageRef = (0, import_react.useRef)(null); + const [targetIndex, setTargetIndex] = (0, import_react.useState)(compaterImages.findIndex((_url) => imgSummary === _url) || 0); + (0, import_react.useImperativeHandle)(ref, () => ({ + compareImageRef, + targetImageRef + })); + return /* @__PURE__ */ import_react.default.createElement(import_meta.Flex, { justify: "space-evenly", align: "center", style: { padding: "0 32px" } }, /* @__PURE__ */ import_react.default.createElement( + import_meta.CompareImage, + { + ref: targetImageRef, + preDisable: targetIndex === 0, + nextDisable: targetIndex >= compaterImages.length - 1, + onNext: () => setTargetIndex(targetIndex + 1), + onPre: () => setTargetIndex(targetIndex - 1), + showScore: false, + openRoll: !!compaterImages.length, + url: compaterImages[targetIndex] || imgSummary, + label: "目标图" + } + ), /* @__PURE__ */ import_react.default.createElement(import_meta.Score, { score: data.score }), /* @__PURE__ */ import_react.default.createElement( + import_meta.CompareImage, + { + ref: compareImageRef, + url: data.imageKey, + openRoll: false, + score: data.score, + label: "对比图" + } + )); +}); +var CombineImage_default = ComBineImage; diff --git a/packages/biz/lib/BigImageModal/components/navigation/index.js b/packages/biz/lib/BigImageModal/components/navigation/index.js index d7cc187..53219e6 100644 --- a/packages/biz/lib/BigImageModal/components/navigation/index.js +++ b/packages/biz/lib/BigImageModal/components/navigation/index.js @@ -34,7 +34,6 @@ __export(navigation_exports, { module.exports = __toCommonJS(navigation_exports); var React = __toESM(require("react")); var import_classnames = __toESM(require("classnames")); -var import_antd = require("antd"); var import_meta = require("@zhst/meta"); var import_index = require("./index.less"); var componentName = `zhst-image__nav`; @@ -52,7 +51,7 @@ var Navigation = (props) => { className ) }, - /* @__PURE__ */ React.createElement(import_antd.Button, { type: "text", disabled, onClick }, /* @__PURE__ */ React.createElement(import_meta.Icon, { size: 28, color, icon: prev ? "icon-qiehuanzuo" : "icon-qiehuanyou" })) + /* @__PURE__ */ React.createElement(import_meta.Button, { type: "text", disabled, onClick }, /* @__PURE__ */ React.createElement(import_meta.Icon, { size: 28, color, icon: prev ? "icon-qiehuanzuo" : "icon-qiehuanyou" })) ); }; var navigation_default = Navigation; diff --git a/packages/biz/lib/BigImageModal/mock.d.ts b/packages/biz/lib/BigImageModal/mock.d.ts new file mode 100644 index 0000000..68ff4e3 --- /dev/null +++ b/packages/biz/lib/BigImageModal/mock.d.ts @@ -0,0 +1,245 @@ +export declare const IMAGE_DATA: { + enAbleDeleteFeature: boolean; + tabsFilter: string[]; + selectIndex: number; + disableBtn: number[]; + dataSource: { + objectId: string; + condition: { + featureInfo: null; + featureData: string; + imageData: string; + alg: string; + rect: { + x: number; + y: number; + w: number; + h: number; + }; + objectImageUrl: string; + srcImageUrl: string; + }; + score: number; + timestamp: number; + deviceId: string; + id: string; + name: string; + dirid: string; + status: string; + longitude: number; + latitude: number; + caseId: string; + caseGroup: string; + isDeleted: string; + objectIndex: { + objectId: string; + solutionId: string; + deviceId: string; + fragmentId: string; + }; + objectType: string; + isObjectTrack: boolean; + pathId: string; + frameInfo: { + frameId: string; + frameTimestamp: string; + width: number; + height: number; + originWidth: number; + originHeight: number; + offsetTime: string; + skipNumber: string; + }; + level: number; + bboxInFrame: { + x: number; + y: number; + w: number; + h: number; + }; + bboxExtInFrame: { + x: number; + y: number; + w: number; + h: number; + }; + objectImageKey: string; + objectExtImageKey: string; + frameImageKey: string; + confidence: number; + sourceObjectId: string; + storeTimestamp: string; + gbNumber: string; + qualityScore: number; + subObjectCount: number; + subObjectType: string[]; + subObjectIds: string[]; + solutionId: string; + fragmentId: string; + contrastKey: string; + compaterImages: string[]; + imgSummary: string; + imageKey: string; + srcImageUrl: string; + algorithmVersion: string; + cameraId: string; + cameraName: string; + }[]; + isArchiveDetail: boolean; + ToolProps: { + renderVideoBtn: boolean; + disableVideo: boolean; + }; + specialTitle: string; +}; +export declare const BIG_IMAGE_DATA: ({ + imageKey: string; + imgSummary: string; + flvUrl: string; + compaterImages: string[]; + odRect: { + x: number; + y: number; + w: number; + h: number; + }; + attachImg: { + url: string; + label: string; + }[]; + score: string; + showScore: boolean; + cameraPosition: string; + time: string; + objects: { + objectIndex: { + objectId: string; + solutionId: string; + deviceId: string; + fragmentId: string; + }; + objectType: string; + sourceObjectId: string; + level: number; + confidence: number; + frameInfo: { + frameId: string; + frameTimestamp: string; + width: number; + height: number; + originWidth: number; + originHeight: number; + offsetTime: string; + skipNumber: string; + }; + infoOnSource: { + bboxInFrame: { + bboxRatio: { + x: number; + y: number; + w: number; + h: number; + }; + }; + countInSource: number; + indexInSource: number; + }; + qualityScore: number; + }[]; +} | { + imageKey: string; + imgSummary: string; + odRect: { + x: number; + y: number; + w: number; + h: number; + }; + attachImg: { + url: string; + label: string; + }[]; + flvUrl: string; + score: number; + showScore: boolean; + cameraPosition: string; + time: string; + objects: ({ + objectIndex: { + objectId: string; + solutionId: string; + deviceId: string; + fragmentId: string; + }; + objectType: string; + sourceObjectId: string; + frameInfo: { + frameId: string; + frameTimestamp: string; + width: number; + height: number; + originWidth: number; + originHeight: number; + offsetTime: string; + skipNumber: string; + }; + infoOnSource: { + bboxInFrame: { + bboxRatio: { + x: number; + y: number; + w: number; + h: number; + }; + }; + countInSource: number; + indexInSource: number; + }; + qualityScore: number; + level?: undefined; + confidence?: undefined; + } | { + objectIndex: { + objectId: string; + solutionId: string; + deviceId: string; + fragmentId: string; + }; + objectType: string; + sourceObjectId: string; + level: number; + confidence: number; + frameInfo: { + frameId: string; + frameTimestamp: string; + width: number; + height: number; + originWidth: number; + originHeight: number; + offsetTime: string; + skipNumber: string; + }; + infoOnSource: { + bboxInFrame: { + bboxRatio: { + x: number; + y: number; + w: number; + h: number; + }; + }; + countInSource: number; + indexInSource: number; + }; + qualityScore: number; + })[]; + compaterImages?: undefined; +})[]; +export declare const attributeList: { + title: string; + children: { + key: string; + label: string; + children: string; + }[]; +}[]; diff --git a/packages/biz/lib/BigImageModal/util/bigImageModalAdapter.d.ts b/packages/biz/lib/BigImageModal/util/bigImageModalAdapter.d.ts new file mode 100644 index 0000000..185982d --- /dev/null +++ b/packages/biz/lib/BigImageModal/util/bigImageModalAdapter.d.ts @@ -0,0 +1,118 @@ +/** + * 适配老的大屏组件数据格式传入 + */ +import React from 'react'; +import { AlgorithmVersionStr, HumanProperty, ObjectType, Rect } from '@zhst/types'; +import { VideoViewProps, ImgViewProps, VideoViewRef, ImgViewRef } from '@zhst/meta'; +export type TAB_TYPE = 'COMPATER' | 'NORMAL' | 'TRACK'; +export type MODEL_TYPE = 'VIDEO' | 'IMAGE'; +export interface CarouselProps { + hasPre?: boolean; + hasNext?: boolean; + selectIndex: number; + setSelectIndex: React.Dispatch>; + dataSource: Array<{ + key: string; + url: string; + }>; +} +export type ISelectItem = Partial> & Partial>; +/** + * 描述列表 description + */ +export interface HeaderProps { + value: TAB_TYPE; + onChange: (type: TAB_TYPE) => void; + tabsFilter: TAB_TYPE[]; +} +export interface ParamProps { + tab: string; + selectItem: ISelectItem; + imgViewRef: React.MutableRefObject; + VideoViewRef: React.MutableRefObject; + model: MODEL_TYPE; + setModel: React.Dispatch>; + scale$: number; + showCrop$: boolean; +} +/** + * 工具栏 + */ +export interface ToolProps { + renderRight?: (props: ParamProps) => React.ReactNode; + renderLeft?: (props: ParamProps) => React.ReactNode; + renderVideoBtn?: boolean; + param: ParamProps; + disableVideo: boolean; +} +export interface BigImageData { + extendRectList: (Rect & { + algorithmVersion: AlgorithmVersionStr; + imageKey: string; + })[]; + rectList: (Rect & { + algorithmVersion: AlgorithmVersionStr; + imageKey: string; + })[]; + attachImg: { + url: string; + label: '形体' | '人脸'; + }[]; + odRect: Rect; + compaterImages: string[]; + constractKey: string; + frameImageKey: string; + imageKey?: string; + imgSummary: string; + objectExtImageKey: string; + attributeList: { + label: string; + list: any[]; + }[]; + archiveImages?: any; + spaceName: string; + objectIndex?: { + deviceId: string; + fragmentId: string; + objectId: string; + solutionId: string; + }; + objectType: ObjectType; + objectId: string; + bodyObjectId?: string; + faceObjectId?: string; + sourceObjectId?: string; + cameraId: string; + cameraName: string; + selectIndex: number; + humanProperty: HumanProperty; + qualityScore?: number; + score: number; + timestamp: string; + bodyImageUrl: string; + faceImageUrl: string; + algorithmVersion: AlgorithmVersionStr; + bodySpaceName: string; + faceSpaceName: string; + position: { + lat: number; + lng: number; + }; + solutionId?: string; + [index: string]: any; +} +export interface ImageModalDataProps { + targetData: BigImageData[]; + compactData: BigImageData[]; +} +export interface ModalAdapterConfigProps { + oldMode?: boolean; +} +/** + * 大图组件适配器,兼容老接口 + * @param Cmp 大图组件 + * @param config 额外配置 + * @returns 大图组件 + */ +declare const adapter: (Cmp: any, config: ModalAdapterConfigProps) => any; +export default adapter; diff --git a/packages/biz/lib/BigImageModal/util/bigImageModalAdapter.js b/packages/biz/lib/BigImageModal/util/bigImageModalAdapter.js new file mode 100644 index 0000000..cc45b23 --- /dev/null +++ b/packages/biz/lib/BigImageModal/util/bigImageModalAdapter.js @@ -0,0 +1,57 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/BigImageModal/util/bigImageModalAdapter.tsx +var bigImageModalAdapter_exports = {}; +__export(bigImageModalAdapter_exports, { + default: () => bigImageModalAdapter_default +}); +module.exports = __toCommonJS(bigImageModalAdapter_exports); +var import_react = __toESM(require("react")); +var translateOldImageData = (_data) => { + return { + ..._data, + open: _data.visible, + onCancel: _data.onClose + }; +}; +var adapter = (Cmp, config) => { + const { oldMode = false } = config; + return (props) => { + const newProps = oldMode ? translateOldImageData(props) : props; + console.log("adapter----适配数据", props, newProps); + delete newProps.visible; + return /* @__PURE__ */ import_react.default.createElement( + Cmp, + { + ...newProps + } + ); + }; +}; +var bigImageModalAdapter_default = adapter; diff --git a/packages/biz/lib/Demo/index.js b/packages/biz/lib/Demo/index.js index fd221c7..53d0cc4 100644 --- a/packages/biz/lib/Demo/index.js +++ b/packages/biz/lib/Demo/index.js @@ -33,9 +33,9 @@ __export(Demo_exports, { }); module.exports = __toCommonJS(Demo_exports); var import_react = __toESM(require("react")); -var import_antd = require("antd"); +var import_meta = require("@zhst/meta"); var import_hooks = require("@zhst/hooks"); var Demo_default = () => { const { run } = (0, import_hooks.useThrottleFn)(() => console.log("123")); - return /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { onClick: () => run() }, "测试"); + return /* @__PURE__ */ import_react.default.createElement(import_meta.Button, { onClick: () => run() }, "测试"); }; diff --git a/packages/biz/lib/RealTimeMonitor/RealTimeMonitor.d.ts b/packages/biz/lib/RealTimeMonitor/RealTimeMonitor.d.ts new file mode 100644 index 0000000..a3f147f --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/RealTimeMonitor.d.ts @@ -0,0 +1,21 @@ +import React from 'react'; +import { IRecord, VideoPlayerCardProps, ViewLargerImageModalRef } from '@zhst/biz'; +interface RealTimeMonitorProps { + videoDataSource?: VideoPlayerCardProps[]; + handleWindowClick?: (key?: string) => void; + handleCloseButtonClick?: (key?: string) => void; + selectedWindowKey?: string; + warningDataSource?: IRecord[]; + viewLargerImageModalRef?: React.RefObject; + handleDownloadImg?: (imgSrc?: string) => void; + onRecordClick?: (record?: IRecord) => void; + selectedRecordId?: string; + isRecordListLoading?: boolean; + recordListTitle?: string; + style?: React.CSSProperties; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; + largeImageTitle?: string; +} +export declare const RealTimeMonitor: React.FC; +export default RealTimeMonitor; diff --git a/packages/biz/lib/RealTimeMonitor/RealTimeMonitor.js b/packages/biz/lib/RealTimeMonitor/RealTimeMonitor.js new file mode 100644 index 0000000..48ad4dc --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/RealTimeMonitor.js @@ -0,0 +1,77 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/RealTimeMonitor/RealTimeMonitor.tsx +var RealTimeMonitor_exports = {}; +__export(RealTimeMonitor_exports, { + RealTimeMonitor: () => RealTimeMonitor, + default: () => RealTimeMonitor_default +}); +module.exports = __toCommonJS(RealTimeMonitor_exports); +var import_react = __toESM(require("react")); +var import_WindowToggle = __toESM(require("./components/WindowToggle")); +var import_WarningRecordList = __toESM(require("./components/WarningRecordList")); +var RealTimeMonitor = (props) => { + const { + videoDataSource, + handleWindowClick, + handleCloseButtonClick, + selectedWindowKey, + warningDataSource, + viewLargerImageModalRef, + handleDownloadImg, + onRecordClick, + selectedRecordId, + isRecordListLoading + } = props; + return /* @__PURE__ */ import_react.default.createElement("div", { className: "zhst-biz-real-time-monitor", style: { display: "flex" } }, /* @__PURE__ */ import_react.default.createElement( + import_WindowToggle.default, + { + selectedWindowKey, + dataSource: videoDataSource, + handleWindowClick, + handleCloseButtonClick + } + ), /* @__PURE__ */ import_react.default.createElement( + import_WarningRecordList.default, + { + dataSource: warningDataSource, + handleDownloadImg, + onRecordClick, + selectedRecordId, + viewLargerImageModalRef, + isRecordListLoading, + recordListTitle: "监控预警记录" + } + )); +}; +var RealTimeMonitor_default = RealTimeMonitor; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + RealTimeMonitor +}); diff --git a/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/WarningRecordList.d.ts b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/WarningRecordList.d.ts new file mode 100644 index 0000000..6489299 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/WarningRecordList.d.ts @@ -0,0 +1,18 @@ +import React from 'react'; +import { IRecord, ViewLargerImageModalRef } from '@zhst/biz'; +import "./index.less"; +interface WarningRecordListProps { + dataSource?: IRecord[]; + viewLargerImageModalRef?: React.RefObject; + handleDownloadImg?: (imgSrc?: string) => void; + onRecordClick?: (record?: IRecord) => void; + selectedRecordId?: string; + isRecordListLoading?: boolean; + recordListTitle?: string; + style?: React.CSSProperties; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; + largeImageTitle?: string; +} +declare const WarningRecordList: React.FC; +export default WarningRecordList; diff --git a/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/WarningRecordList.js b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/WarningRecordList.js new file mode 100644 index 0000000..a2441e3 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/WarningRecordList.js @@ -0,0 +1,74 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/RealTimeMonitor/components/WarningRecordList/WarningRecordList.tsx +var WarningRecordList_exports = {}; +__export(WarningRecordList_exports, { + default: () => WarningRecordList_default +}); +module.exports = __toCommonJS(WarningRecordList_exports); +var import_react = __toESM(require("react")); +var import_biz = require("@zhst/biz"); +var import_antd = require("antd"); +var import_index = require("./index.less"); +var import_icons = require("@ant-design/icons"); +var WarningRecordList = (props) => { + const { + dataSource = [], + viewLargerImageModalRef, + selectedRecordId, + handleDownloadImg, + onRecordClick, + isRecordListLoading, + recordListTitle, + style, + cardStyle, + imgStyle, + largeImageTitle + } = props; + return /* @__PURE__ */ import_react.default.createElement("div", { className: "zhst-biz-warning-record-list", style }, /* @__PURE__ */ import_react.default.createElement("div", { className: "header" }, recordListTitle), /* @__PURE__ */ import_react.default.createElement("div", { className: "body" }, isRecordListLoading ? /* @__PURE__ */ import_react.default.createElement("div", { style: { height: "100%", display: "flex", justifyContent: "center", alignItems: "center" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Spin, { indicator: /* @__PURE__ */ import_react.default.createElement(import_icons.LoadingOutlined, { style: { fontSize: 24 } }) })) : (dataSource == null ? void 0 : dataSource.length) > 0 ? /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { direction: "vertical", size: 10 }, dataSource == null ? void 0 : dataSource.map( + (record, index) => { + if (index > 2) + return; + return /* @__PURE__ */ import_react.default.createElement( + import_biz.WarningRecordCard, + { + key: record == null ? void 0 : record.id, + record, + onRecordClick: (record2) => { + onRecordClick == null ? void 0 : onRecordClick(record2); + }, + selectedRecordId, + cardStyle: { width: 300, height: 264, ...cardStyle }, + imgStyle: { width: 280, height: 169, ...imgStyle } + } + ); + } + )) : /* @__PURE__ */ import_react.default.createElement("div", { style: { height: "100%", display: "flex", justifyContent: "center", alignItems: "center" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Empty, { description: "暂无数据" }))), /* @__PURE__ */ import_react.default.createElement(import_biz.ViewLargerImageModal, { ref: viewLargerImageModalRef, downloadImg: handleDownloadImg, title: largeImageTitle })); +}; +var WarningRecordList_default = WarningRecordList; diff --git a/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.d.ts b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.d.ts new file mode 100644 index 0000000..b50da75 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.d.ts @@ -0,0 +1,2 @@ +import WarningRecordList from './WarningRecordList'; +export default WarningRecordList; diff --git a/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.js b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.js new file mode 100644 index 0000000..6f47b77 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/RealTimeMonitor/components/WarningRecordList/index.tsx +var WarningRecordList_exports = {}; +__export(WarningRecordList_exports, { + default: () => WarningRecordList_default +}); +module.exports = __toCommonJS(WarningRecordList_exports); +var import_WarningRecordList = __toESM(require("./WarningRecordList")); +var WarningRecordList_default = import_WarningRecordList.default; diff --git a/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.less b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.less new file mode 100644 index 0000000..e348f82 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WarningRecordList/index.less @@ -0,0 +1,20 @@ +.zhst-biz-warning-record-list { + display: flex; + flex-direction: column; + border-left: solid 1px #00000026; + width: 320px; + + .header { + width: 100%; + height: 48px; + background-color: #EFF2F4; + padding: 10px 20px; + box-sizing: border-box; + } + + .body { + padding: 10px; + overflow: hidden; + flex: 1; + } +} \ No newline at end of file diff --git a/packages/biz/lib/RealTimeMonitor/components/WindowToggle/WindowToggle.d.ts b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/WindowToggle.d.ts new file mode 100644 index 0000000..c67b407 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/WindowToggle.d.ts @@ -0,0 +1,11 @@ +import React from 'react'; +import { VideoPlayerCardProps } from '@zhst/biz'; +import './index.less'; +interface WindowToggleProps { + dataSource?: VideoPlayerCardProps[]; + handleWindowClick?: (key?: string) => void; + handleCloseButtonClick?: (key?: string) => void; + selectedWindowKey?: string; +} +export declare const WindowToggle: React.FC; +export default WindowToggle; diff --git a/packages/biz/lib/RealTimeMonitor/components/WindowToggle/WindowToggle.js b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/WindowToggle.js new file mode 100644 index 0000000..ccd71ed --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/WindowToggle.js @@ -0,0 +1,88 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/RealTimeMonitor/components/WindowToggle/WindowToggle.tsx +var WindowToggle_exports = {}; +__export(WindowToggle_exports, { + WindowToggle: () => WindowToggle, + default: () => WindowToggle_default +}); +module.exports = __toCommonJS(WindowToggle_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_icons = require("@ant-design/icons"); +var import_biz = require("@zhst/biz"); +var import_index = require("./index.less"); +var import_lib = require("antd/lib"); +var WindowToggle = (props) => { + const { dataSource = [], handleWindowClick, handleCloseButtonClick, selectedWindowKey } = props; + const [size, setSize] = (0, import_react.useState)("large"); + const { useToken } = import_lib.theme; + const { token } = useToken(); + const getLabelStyle = (isSelected) => ({ + padding: "0 11px", + background: "#fff", + ...isSelected ? { background: token.colorPrimary, color: "#fff" } : {} + }); + return /* @__PURE__ */ import_react.default.createElement("div", { className: "zhst-biz-window-toggle" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "header" }, /* @__PURE__ */ import_react.default.createElement( + import_antd.Segmented, + { + defaultValue: "large", + options: [ + { value: "large", label: /* @__PURE__ */ import_react.default.createElement("div", { style: getLabelStyle(size === "large") }, /* @__PURE__ */ import_react.default.createElement(import_icons.BarsOutlined, null)) }, + { value: "small", label: /* @__PURE__ */ import_react.default.createElement("div", { style: getLabelStyle(size === "small") }, /* @__PURE__ */ import_react.default.createElement(import_icons.AppstoreOutlined, null)) } + ], + onChange: (value) => { + if (value === "large" && dataSource.length > 0) { + const { windowKey } = dataSource[0]; + handleWindowClick == null ? void 0 : handleWindowClick(windowKey); + } + setSize(value); + } + } + )), /* @__PURE__ */ import_react.default.createElement("div", { className: "body" }, dataSource == null ? void 0 : dataSource.map((item, index) => { + if (size === "large" && index > 0) + return; + return /* @__PURE__ */ import_react.default.createElement( + import_biz.VideoPlayerCard, + { + key: item.windowKey, + selectedWindowKey, + size, + ...item, + handleWindowClick, + handleCloseButtonClick + } + ); + }))); +}; +var WindowToggle_default = WindowToggle; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + WindowToggle +}); diff --git a/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.d.ts b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.d.ts new file mode 100644 index 0000000..3b57a45 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.d.ts @@ -0,0 +1,2 @@ +import WindowToggle from './WindowToggle'; +export default WindowToggle; diff --git a/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.js b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.js new file mode 100644 index 0000000..9f8c4b6 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/RealTimeMonitor/components/WindowToggle/index.tsx +var WindowToggle_exports = {}; +__export(WindowToggle_exports, { + default: () => WindowToggle_default +}); +module.exports = __toCommonJS(WindowToggle_exports); +var import_WindowToggle = __toESM(require("./WindowToggle")); +var WindowToggle_default = import_WindowToggle.default; diff --git a/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.less b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.less new file mode 100644 index 0000000..61c77bd --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/components/WindowToggle/index.less @@ -0,0 +1,45 @@ +.zhst-biz-window-toggle { + display: flex; + flex-direction: column; + flex: 1; + + .header { + width: 100%; + height: 48px; + background-color: #EFF2F4; + padding: 10px 20px; + box-sizing: border-box; + + .ant-segmented { + padding: 0; + + .ant-segmented-group { + border-radius: 4px; + overflow: hidden; + + .ant-segmented-item { + border-radius: 0; + + .ant-segmented-item-label { + padding: 0; + } + } + } + } + } + + .body { + flex: 1; + width: 100%; + background-color: #E5EAEC; + padding: 10px; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + + >div { + margin: 10px; + } + } +} \ No newline at end of file diff --git a/packages/biz/lib/RealTimeMonitor/index.d.ts b/packages/biz/lib/RealTimeMonitor/index.d.ts new file mode 100644 index 0000000..9013d29 --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/index.d.ts @@ -0,0 +1,2 @@ +import RealTimeMonitor from './RealTimeMonitor'; +export default RealTimeMonitor; diff --git a/packages/biz/lib/RealTimeMonitor/index.js b/packages/biz/lib/RealTimeMonitor/index.js new file mode 100644 index 0000000..041c33e --- /dev/null +++ b/packages/biz/lib/RealTimeMonitor/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/RealTimeMonitor/index.tsx +var RealTimeMonitor_exports = {}; +__export(RealTimeMonitor_exports, { + default: () => RealTimeMonitor_default +}); +module.exports = __toCommonJS(RealTimeMonitor_exports); +var import_RealTimeMonitor = __toESM(require("./RealTimeMonitor")); +var RealTimeMonitor_default = import_RealTimeMonitor.default; diff --git a/packages/biz/lib/VideoPlayerCard/VideoPlayerCard.d.ts b/packages/biz/lib/VideoPlayerCard/VideoPlayerCard.d.ts new file mode 100644 index 0000000..cd1775e --- /dev/null +++ b/packages/biz/lib/VideoPlayerCard/VideoPlayerCard.d.ts @@ -0,0 +1,19 @@ +import { CardProps } from 'antd'; +import React, { ReactNode } from 'react'; +import './index.less'; +export interface VideoPlayerCardProps { + windowKey?: string; + selectedWindowKey?: string; + showType?: 'video' | "image"; + imgSrc?: string; + videoSrc?: string; + cardProps?: CardProps; + errorReasonText?: string; + isWindowLoading?: boolean; + size?: 'large' | 'small'; + title?: string | ReactNode; + handleCloseButtonClick?: (key?: string) => void; + handleWindowClick?: (key?: string) => void; +} +export declare const VideoPlayerCard: React.FC; +export default VideoPlayerCard; diff --git a/packages/biz/lib/VideoPlayerCard/VideoPlayerCard.js b/packages/biz/lib/VideoPlayerCard/VideoPlayerCard.js new file mode 100644 index 0000000..8dae8f4 --- /dev/null +++ b/packages/biz/lib/VideoPlayerCard/VideoPlayerCard.js @@ -0,0 +1,99 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/VideoPlayerCard/VideoPlayerCard.tsx +var VideoPlayerCard_exports = {}; +__export(VideoPlayerCard_exports, { + VideoPlayerCard: () => VideoPlayerCard, + default: () => VideoPlayerCard_default +}); +module.exports = __toCommonJS(VideoPlayerCard_exports); +var import_antd = require("antd"); +var import_lib = require("antd/lib"); +var import_meta = require("@zhst/meta"); +var import_react = __toESM(require("react")); +var import_icons = require("@ant-design/icons"); +var import_index = require("./index.less"); +var VideoPlayerCard = (props) => { + const componentName = `zhst-biz-video-player-card`; + const { showType, imgSrc, videoSrc, cardProps, isWindowLoading, errorReasonText, size, title, handleCloseButtonClick, handleWindowClick, windowKey, selectedWindowKey = "" } = props; + const [cardContent, setCardContent] = (0, import_react.useState)(null); + const { useToken } = import_lib.theme; + const { token } = useToken(); + const videoRef = (0, import_react.useRef)(null); + const selectedBorderStyle = { + border: `2px solid ${token.colorPrimary}`, + boxShadow: " 0px 2px 9px 0px rgba(0,0,0,0.16)" + }; + const cardStyle = { + ...size === "large" ? { height: 931 } : { height: 456, cursor: "pointer" }, + ...size === "small" && selectedWindowKey === windowKey ? selectedBorderStyle : {} + }; + const videoPlayerCardStyle = size === "small" ? { width: "calc(50% - 20px)" } : { flex: 1 }; + (0, import_react.useEffect)(() => { + var _a; + if (!isWindowLoading && (videoSrc || imgSrc)) { + let contentElement = null; + if (videoSrc) { + contentElement = /* @__PURE__ */ import_react.default.createElement(import_meta.VideoPlayer, { ref: videoRef, url: videoSrc }); + (_a = videoRef.current) == null ? void 0 : _a.setShowCrop(true); + } else if (imgSrc) { + contentElement = /* @__PURE__ */ import_react.default.createElement( + "img", + { + alt: "首帧图", + src: imgSrc, + style: { width: "100%", height: "100%", display: "block" } + } + ); + } + setCardContent(contentElement); + } else { + setCardContent(null); + } + }, [showType, imgSrc, videoSrc, isWindowLoading]); + return /* @__PURE__ */ import_react.default.createElement("div", { className: componentName, onClick: () => { + handleWindowClick == null ? void 0 : handleWindowClick(windowKey); + }, style: videoPlayerCardStyle }, /* @__PURE__ */ import_react.default.createElement( + import_antd.Card, + { + title: /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { style: { width: "100%", justifyContent: "space-between" } }, /* @__PURE__ */ import_react.default.createElement("div", null, title), /* @__PURE__ */ import_react.default.createElement("div", { className: "card-close-button" }, /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { type: "text", onClick: () => { + handleCloseButtonClick == null ? void 0 : handleCloseButtonClick(windowKey); + } }, /* @__PURE__ */ import_react.default.createElement(import_icons.CloseOutlined, null)))), + style: { display: "flex", flexDirection: "column", borderRadius: 4, overflow: "hidden", ...cardStyle }, + bodyStyle: { flex: 1 }, + ...cardProps + }, + cardContent ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, cardContent) : /* @__PURE__ */ import_react.default.createElement("div", { style: { backgroundColor: "#000", height: "100%", display: "flex", padding: "20px", boxSizing: "border-box" } }, isWindowLoading ? /* @__PURE__ */ import_react.default.createElement("div", { style: { flex: 1, display: "flex", justifyContent: "center", alignItems: "center" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Spin, { indicator: /* @__PURE__ */ import_react.default.createElement(import_icons.LoadingOutlined, { style: { fontSize: 24 } }) })) : !!errorReasonText && /* @__PURE__ */ import_react.default.createElement("span", { style: { color: token.colorError } }, errorReasonText)) + )); +}; +var VideoPlayerCard_default = VideoPlayerCard; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + VideoPlayerCard +}); diff --git a/packages/biz/lib/VideoPlayerCard/index.d.ts b/packages/biz/lib/VideoPlayerCard/index.d.ts new file mode 100644 index 0000000..41afa58 --- /dev/null +++ b/packages/biz/lib/VideoPlayerCard/index.d.ts @@ -0,0 +1,3 @@ +import VideoPlayerCard from './VideoPlayerCard'; +export type { VideoPlayerCardProps } from './VideoPlayerCard'; +export default VideoPlayerCard; diff --git a/packages/biz/lib/VideoPlayerCard/index.js b/packages/biz/lib/VideoPlayerCard/index.js new file mode 100644 index 0000000..7810d71 --- /dev/null +++ b/packages/biz/lib/VideoPlayerCard/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/VideoPlayerCard/index.tsx +var VideoPlayerCard_exports = {}; +__export(VideoPlayerCard_exports, { + default: () => VideoPlayerCard_default +}); +module.exports = __toCommonJS(VideoPlayerCard_exports); +var import_VideoPlayerCard = __toESM(require("./VideoPlayerCard")); +var VideoPlayerCard_default = import_VideoPlayerCard.default; diff --git a/packages/biz/lib/VideoPlayerCard/index.less b/packages/biz/lib/VideoPlayerCard/index.less new file mode 100644 index 0000000..0f87e3e --- /dev/null +++ b/packages/biz/lib/VideoPlayerCard/index.less @@ -0,0 +1,30 @@ +.zhst-biz-video-player-card { + .ant-card-head { + padding: 0 20px; + } + + .ant-card-body { + padding: 0; + overflow: hidden; + border-radius: 0; + + .zhst-image__video-view { + height: 100%; + } + } + + .card-close-button { + .ant-btn { + padding: 0 3px; + height: 22px; + color: #00000073; + } + + .ant-btn:hover { + padding: 0 3px; + height: 22px; + color: #000000e0; + } + } + +} \ No newline at end of file diff --git a/packages/biz/lib/ViewLargerImageModal/ViewLargerImageModal.d.ts b/packages/biz/lib/ViewLargerImageModal/ViewLargerImageModal.d.ts new file mode 100644 index 0000000..d82a52e --- /dev/null +++ b/packages/biz/lib/ViewLargerImageModal/ViewLargerImageModal.d.ts @@ -0,0 +1,25 @@ +import React from 'react'; +import { ModalProps, SpaceProps } from 'antd'; +import './index.less'; +type ViewLargerImageModalParams = { + imgSrc?: string; + warningData?: { + label?: string; + value?: string; + }[]; +}; +export interface ViewLargerImageModalRef { + show: (params?: ViewLargerImageModalParams) => void; + handleCancel: () => void; +} +export interface ViewLargerImageModalProps { + imgStyle?: React.CSSProperties; + downloadImg?: (imgSrc?: string) => void; + title?: string; + downloadText?: string; + modalProps?: ModalProps; + spaceProps?: SpaceProps; +} +export declare const ViewLargerImageModal: React.ForwardRefExoticComponent>; +export default ViewLargerImageModal; +export declare const useViewLargerImageModal: () => React.RefObject; diff --git a/packages/biz/lib/ViewLargerImageModal/ViewLargerImageModal.js b/packages/biz/lib/ViewLargerImageModal/ViewLargerImageModal.js new file mode 100644 index 0000000..9d5ef6f --- /dev/null +++ b/packages/biz/lib/ViewLargerImageModal/ViewLargerImageModal.js @@ -0,0 +1,87 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/ViewLargerImageModal/ViewLargerImageModal.tsx +var ViewLargerImageModal_exports = {}; +__export(ViewLargerImageModal_exports, { + ViewLargerImageModal: () => ViewLargerImageModal, + default: () => ViewLargerImageModal_default, + useViewLargerImageModal: () => useViewLargerImageModal +}); +module.exports = __toCommonJS(ViewLargerImageModal_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_theme = __toESM(require("antd/lib/theme")); +var import_icons = require("@ant-design/icons"); +var import_index = require("./index.less"); +var ViewLargerImageModal = (0, import_react.forwardRef)( + (props, ref) => { + const { modalProps, downloadImg, imgStyle, title = "预警大图", downloadText = "下载大图", spaceProps } = props; + const { useToken } = import_theme.default; + const { token } = useToken(); + const [open, setOpen] = (0, import_react.useState)(false); + const [imgSrc, setImgSrc] = (0, import_react.useState)(); + const [warningData, setWarningData] = (0, import_react.useState)(); + const handleCancel = () => { + setOpen(false); + }; + (0, import_react.useImperativeHandle)(ref, () => { + return { + show: (_params) => { + setOpen(true); + setImgSrc(_params == null ? void 0 : _params.imgSrc); + setWarningData(_params == null ? void 0 : _params.warningData); + }, + handleCancel + }; + }); + return /* @__PURE__ */ import_react.default.createElement( + import_antd.Modal, + { + className: "zhst-biz-view-warning-larger-image-modal", + open, + destroyOnClose: true, + title, + width: "1029px", + footer: null, + onCancel: handleCancel, + ...modalProps + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { size: 0, styles: { item: { backgroundColor: "#F6F9FAFF" } }, ...spaceProps }, /* @__PURE__ */ import_react.default.createElement("img", { alt: title, src: imgSrc, style: { width: 789, height: 444, display: "block", ...imgStyle } }), /* @__PURE__ */ import_react.default.createElement("div", { className: "right-context" }, warningData == null ? void 0 : warningData.map(({ label, value }) => /* @__PURE__ */ import_react.default.createElement("div", { key: label }, /* @__PURE__ */ import_react.default.createElement("span", { className: "context-key" }, `${label}: `), value)), imgSrc && downloadImg && /* @__PURE__ */ import_react.default.createElement("div", { className: "img-download", style: { color: token.colorPrimary }, onClick: () => downloadImg == null ? void 0 : downloadImg(imgSrc) }, /* @__PURE__ */ import_react.default.createElement(import_icons.DownloadOutlined, null), /* @__PURE__ */ import_react.default.createElement("span", { style: { paddingLeft: 3 } }, downloadText)))) + ); + } +); +var ViewLargerImageModal_default = ViewLargerImageModal; +var useViewLargerImageModal = () => { + return (0, import_react.useRef)(null); +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + ViewLargerImageModal, + useViewLargerImageModal +}); diff --git a/packages/biz/lib/ViewLargerImageModal/index.d.ts b/packages/biz/lib/ViewLargerImageModal/index.d.ts new file mode 100644 index 0000000..417e8be --- /dev/null +++ b/packages/biz/lib/ViewLargerImageModal/index.d.ts @@ -0,0 +1,4 @@ +import ViewLargerImageModal, { useViewLargerImageModal } from './ViewLargerImageModal'; +export type { ViewLargerImageModalRef, ViewLargerImageModalProps } from './ViewLargerImageModal'; +export default ViewLargerImageModal; +export { useViewLargerImageModal }; diff --git a/packages/biz/lib/ViewLargerImageModal/index.js b/packages/biz/lib/ViewLargerImageModal/index.js new file mode 100644 index 0000000..936db94 --- /dev/null +++ b/packages/biz/lib/ViewLargerImageModal/index.js @@ -0,0 +1,41 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/ViewLargerImageModal/index.tsx +var ViewLargerImageModal_exports = {}; +__export(ViewLargerImageModal_exports, { + default: () => ViewLargerImageModal_default, + useViewLargerImageModal: () => import_ViewLargerImageModal.useViewLargerImageModal +}); +module.exports = __toCommonJS(ViewLargerImageModal_exports); +var import_ViewLargerImageModal = __toESM(require("./ViewLargerImageModal")); +var ViewLargerImageModal_default = import_ViewLargerImageModal.default; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + useViewLargerImageModal +}); diff --git a/packages/biz/lib/ViewLargerImageModal/index.less b/packages/biz/lib/ViewLargerImageModal/index.less new file mode 100644 index 0000000..32363d0 --- /dev/null +++ b/packages/biz/lib/ViewLargerImageModal/index.less @@ -0,0 +1,62 @@ +.zhst-biz-view-warning-larger-image-modal { + font-family: MicrosoftYaHei; + + .ant-modal-content { + padding: 0; + height: 492px; + border-radius: 6px; + overflow: hidden; + + .ant-modal-close { + top: 14px; + right: 16px; + } + + .ant-modal-header { + height: 48px; + line-height: 48px; + margin-bottom: 0; + + .ant-modal-title { + height: 100%; + line-height: 48px; + font-weight: bold; + padding-left: 20px; + } + } + + .ant-modal-body { + height: 444px; + + >div { + width: 100%; + height: 100%; + align-items: flex-start; + + >div:nth-child(2) { + position: relative; + flex: 1; + box-sizing: border-box; + height: 100%; + padding: 30px 16px; + + .right-context>div { + margin-bottom: 20px; + } + + .right-context .context-key { + font-weight: bold; + } + + .img-download { + position: absolute; + bottom: 0; + cursor: pointer; + } + + } + + } + } + } +} \ No newline at end of file diff --git a/packages/biz/lib/WarningRecordCard/WarningRecordCard.d.ts b/packages/biz/lib/WarningRecordCard/WarningRecordCard.d.ts new file mode 100644 index 0000000..966998b --- /dev/null +++ b/packages/biz/lib/WarningRecordCard/WarningRecordCard.d.ts @@ -0,0 +1,30 @@ +import { CardProps } from 'antd'; +import React from 'react'; +import './index.less'; +export interface IRecord { + imgSrc?: string; + id?: string; + /** + * 预警类型 + */ + warningType?: string; + warningInfo?: string[]; + boxId: string; + position: string; + cabietId?: string; + cabietText?: string; + warningTime?: string; + warningTimestamp?: string | number; + warningTimeFormat?: string; +} +export interface WarningRecordCardProps { + record?: IRecord; + onRecordClick?: (record?: IRecord) => void; + style?: React.CSSProperties; + cardProps?: CardProps; + selectedRecordId?: string; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; +} +export declare const WarningRecordCard: React.FC; +export default WarningRecordCard; diff --git a/packages/biz/lib/WarningRecordCard/WarningRecordCard.js b/packages/biz/lib/WarningRecordCard/WarningRecordCard.js new file mode 100644 index 0000000..b5de8e4 --- /dev/null +++ b/packages/biz/lib/WarningRecordCard/WarningRecordCard.js @@ -0,0 +1,74 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/WarningRecordCard/WarningRecordCard.tsx +var WarningRecordCard_exports = {}; +__export(WarningRecordCard_exports, { + WarningRecordCard: () => WarningRecordCard, + default: () => WarningRecordCard_default +}); +module.exports = __toCommonJS(WarningRecordCard_exports); +var import_antd = require("antd"); +var import_lib = require("antd/lib"); +var import_react = __toESM(require("react")); +var import_dayjs = __toESM(require("dayjs")); +var import_index = require("./index.less"); +var WarningRecordCard = (props) => { + const componentName = `zhst-biz-warning-record-card`; + const { record, onRecordClick, style, cardProps, selectedRecordId, cardStyle, imgStyle } = props; + const { imgSrc, id, warningType, warningInfo = [], cabietText, warningTime, warningTimestamp, warningTimeFormat = "YYYY-MM-DD HH:mm:ss" } = record || {}; + const formattedDate = warningTimestamp ? (0, import_dayjs.default)(warningTimestamp).format(warningTimeFormat) : ""; + const warningTimeShow = warningTime ? warningTime : formattedDate; + const { useToken } = import_lib.theme; + const { token } = useToken(); + const selectedBorderStyle = { + border: `2px solid ${token.colorPrimary}`, + boxShadow: " 0px 2px 9px 0px rgba(0,0,0,0.16)" + }; + const selectedCardStyle = { + ...selectedRecordId === (record == null ? void 0 : record.id) ? selectedBorderStyle : {} + }; + const handleClick = () => { + onRecordClick == null ? void 0 : onRecordClick(record); + }; + return /* @__PURE__ */ import_react.default.createElement("div", { className: componentName, key: id, onClick: handleClick, style }, /* @__PURE__ */ import_react.default.createElement( + import_antd.Card, + { + cover: /* @__PURE__ */ import_react.default.createElement("img", { alt: "预警图", src: imgSrc, style: { width: 336, height: 203, borderRadius: 0, ...imgStyle } }), + style: { width: 356, height: 302, padding: 10, borderRadius: 4, ...selectedCardStyle, ...cardStyle }, + ...cardProps + }, + /* @__PURE__ */ import_react.default.createElement("div", { className: "left-context" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "warning-type" }, warningType), /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { size: 0, split: /* @__PURE__ */ import_react.default.createElement(import_antd.Divider, { type: "vertical" }) }, warningInfo == null ? void 0 : warningInfo.map((item, index) => /* @__PURE__ */ import_react.default.createElement("div", { key: index, className: "info-item" }, item))), /* @__PURE__ */ import_react.default.createElement("div", { className: "warning-time" }, warningTimeShow)), + /* @__PURE__ */ import_react.default.createElement("div", { className: "cabietInfo" }, cabietText) + )); +}; +var WarningRecordCard_default = WarningRecordCard; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + WarningRecordCard +}); diff --git a/packages/biz/lib/WarningRecordCard/index.d.ts b/packages/biz/lib/WarningRecordCard/index.d.ts new file mode 100644 index 0000000..8b82d36 --- /dev/null +++ b/packages/biz/lib/WarningRecordCard/index.d.ts @@ -0,0 +1,3 @@ +import WarningRecordCard from './WarningRecordCard'; +export type { IRecord, WarningRecordCardProps } from './WarningRecordCard'; +export default WarningRecordCard; diff --git a/packages/biz/lib/WarningRecordCard/index.js b/packages/biz/lib/WarningRecordCard/index.js new file mode 100644 index 0000000..9d01a95 --- /dev/null +++ b/packages/biz/lib/WarningRecordCard/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/WarningRecordCard/index.tsx +var WarningRecordCard_exports = {}; +__export(WarningRecordCard_exports, { + default: () => WarningRecordCard_default +}); +module.exports = __toCommonJS(WarningRecordCard_exports); +var import_WarningRecordCard = __toESM(require("./WarningRecordCard")); +var WarningRecordCard_default = import_WarningRecordCard.default; diff --git a/packages/biz/lib/WarningRecordCard/index.less b/packages/biz/lib/WarningRecordCard/index.less new file mode 100644 index 0000000..7cfba38 --- /dev/null +++ b/packages/biz/lib/WarningRecordCard/index.less @@ -0,0 +1,27 @@ +.zhst-biz-warning-record-card { + cursor: pointer; + + .ant-card-body { + padding: 0; + font-family: MicrosoftYaHei; + line-height: 19px; + display: flex; + margin-top: 10px; + + .left-context { + flex: 1; + + >div { + margin-top: 6px; + } + + >div:nth-child(1) { + margin-top: 0; + } + } + + .warning-type { + font-weight: bold; + } + } +} \ No newline at end of file diff --git a/packages/biz/lib/boxSelectTree/boxSelectTree.d.ts b/packages/biz/lib/boxSelectTree/boxSelectTree.d.ts new file mode 100644 index 0000000..0690e8f --- /dev/null +++ b/packages/biz/lib/boxSelectTree/boxSelectTree.d.ts @@ -0,0 +1,9 @@ +import { FC } from 'react'; +import { TabsProps } from 'antd'; +import type { BoxPanelProps } from './components/boxPanel'; +export interface BoxSelectTreeProps extends BoxPanelProps { + onTabChange?: (e: any) => void; + tabsProps?: TabsProps; +} +declare const BoxSelectTree: FC; +export default BoxSelectTree; diff --git a/packages/biz/lib/boxSelectTree/boxSelectTree.js b/packages/biz/lib/boxSelectTree/boxSelectTree.js new file mode 100644 index 0000000..79df21b --- /dev/null +++ b/packages/biz/lib/boxSelectTree/boxSelectTree.js @@ -0,0 +1,124 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/boxSelectTree/boxSelectTree.tsx +var boxSelectTree_exports = {}; +__export(boxSelectTree_exports, { + default: () => boxSelectTree_default +}); +module.exports = __toCommonJS(boxSelectTree_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_boxPanel = __toESM(require("./components/boxPanel")); +var BoxSelectTree = (props) => { + const { + data, + boxDataSource = [], + onTabChange, + onSearch, + onItemCheck, + onItemSelect, + onBoxBatchDelete, + onBoxDelete, + onCreateSubmit, + onClockClick, + onImport, + onCreate, + tabsProps, + searchInputProps, + treeProps, + customImport, + showOptions, + extraBtns + } = props; + const items = [ + { + key: "1", + label: /* @__PURE__ */ import_react.default.createElement("div", { style: { textAlign: "center", width: "160px" } }, "盒子组"), + children: /* @__PURE__ */ import_react.default.createElement( + import_boxPanel.default, + { + searchInputProps, + boxDataSource, + treeProps, + data, + onCreate, + onCreateSubmit, + onBoxBatchDelete, + onBoxDelete, + onSearch, + onItemCheck, + onItemSelect, + showOptions, + customImport, + extraBtns, + onClockClick, + onImport + } + ) + }, + { + key: "2", + label: /* @__PURE__ */ import_react.default.createElement("div", { style: { textAlign: "center", width: "160px" } }, "盒子"), + children: /* @__PURE__ */ import_react.default.createElement( + import_boxPanel.default, + { + boxDataSource, + searchInputProps, + treeProps, + data, + onCreate, + onBoxBatchDelete, + onCreateSubmit, + onBoxDelete, + onSearch, + onItemCheck, + onItemSelect, + showOptions, + customImport, + extraBtns, + onClockClick, + onImport + } + ) + } + ]; + return /* @__PURE__ */ import_react.default.createElement( + import_antd.Tabs, + { + defaultActiveKey: "1", + centered: true, + items, + onChange: onTabChange, + tabBarGutter: 0, + indicator: { size: (origin) => origin, align: "center" }, + ...tabsProps + } + ); +}; +var boxSelectTree_default = BoxSelectTree; diff --git a/packages/biz/lib/boxSelectTree/components/boxPanel/index.js b/packages/biz/lib/boxSelectTree/components/boxPanel/index.js new file mode 100644 index 0000000..6fafeaa --- /dev/null +++ b/packages/biz/lib/boxSelectTree/components/boxPanel/index.js @@ -0,0 +1,179 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/boxSelectTree/components/boxPanel/index.tsx +var boxPanel_exports = {}; +__export(boxPanel_exports, { + default: () => boxPanel_default +}); +module.exports = __toCommonJS(boxPanel_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_pro_components = require("@ant-design/pro-components"); +var import_icons = require("@ant-design/icons"); +var import_treeTransferModal = __toESM(require("../../../treeTransferModal")); +var import_tree = __toESM(require("../../../tree")); +var BoxPanel = (props) => { + var _a, _b, _c; + const { + searchInputProps, + showOptions = true, + extraBtns, + data = [], + onSearch, + treeProps, + onItemCheck, + onItemSelect, + onCreateSubmit, + onBoxBatchDelete, + onBoxDelete, + onClockClick, + onImport, + onBatch, + onCreate, + boxDataSource, + customImport + } = props; + const [isTreeCheckable, setIsTreeCheckable] = (0, import_react.useState)(false); + const [targetItems, setTargetItems] = (0, import_react.useState)([]); + const [boxChoiceOpen, setBoxChoiceOpen] = (0, import_react.useState)(false); + const [checkedKeys, setCheckedKeys] = (0, import_react.useState)([]); + const createFormRef = (0, import_react.useRef)(); + const handleCheckable = () => { + setIsTreeCheckable((pre) => !pre); + }; + const onTreeCheck = (keys, info) => { + let _targetItems = []; + setCheckedKeys(keys); + info.checkedNodes.forEach((o) => { + o.isLeaf && _targetItems.push(o); + }); + setTargetItems(_targetItems); + }; + const onItemDelete = (key, { keys }) => { + setCheckedKeys((pre) => { + const newKeys = pre.filter((_key) => !keys.includes(_key)); + return newKeys; + }); + setTargetItems((pre) => pre.filter((o) => o.key !== key)); + }; + const onBoxChoiceOk = async (data2) => { + var _a2, _b2, _c2; + (_a2 = createFormRef.current) == null ? void 0 : _a2.setFieldValue("boxList", data2); + (_b2 = createFormRef.current) == null ? void 0 : _b2.setFieldValue("boxName", 123); + console.log((_c2 = createFormRef.current) == null ? void 0 : _c2.getFieldValue("boxList")); + setBoxChoiceOpen(false); + }; + const onBoxChoiceReset = () => { + setCheckedKeys([]); + setTargetItems([]); + }; + return /* @__PURE__ */ import_react.default.createElement("div", { style: { padding: "0 16px" } }, /* @__PURE__ */ import_react.default.createElement( + import_treeTransferModal.default, + { + open: boxChoiceOpen, + onCancel: () => setBoxChoiceOpen(false), + onRadioChange: (e) => console.log("radio", e.target.value), + dataSource: boxDataSource, + targetItems, + checkedKeys, + onReset: onBoxChoiceReset, + onOk: onBoxChoiceOk, + onTreeCheck, + onItemDelete + } + ), /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { size: 12, direction: "vertical", style: { width: "100%" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { size: 4, style: { width: "100%", justifyContent: "space-between" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Input, { size: "middle", onChange: (e) => onSearch == null ? void 0 : onSearch(e), placeholder: "请输入盒子名称", ...searchInputProps }), customImport || /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { type: "text", onClick: () => (onBatch == null ? void 0 : onBatch()) || handleCheckable(), icon: isTreeCheckable ? /* @__PURE__ */ import_react.default.createElement(import_icons.SwitcherOutlined, null) : /* @__PURE__ */ import_react.default.createElement(import_icons.DiffOutlined, null) }), /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { type: "text", onClick: () => onClockClick == null ? void 0 : onClockClick(), icon: /* @__PURE__ */ import_react.default.createElement(import_icons.ClockCircleOutlined, null) }))), showOptions && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { align: "center" }, /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { type: "text", style: { padding: "4px 8px" }, onClick: () => onImport == null ? void 0 : onImport(), icon: /* @__PURE__ */ import_react.default.createElement(import_icons.ImportOutlined, null) }, "导入盒子"), /* @__PURE__ */ import_react.default.createElement(import_antd.Divider, { type: "vertical", style: { margin: "8px 0" } }), onCreate ? /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { onClick: onCreate, type: "text", style: { padding: "4px 8px" }, icon: /* @__PURE__ */ import_react.default.createElement(import_icons.FolderAddOutlined, null) }, "新建组") : /* @__PURE__ */ import_react.default.createElement( + import_pro_components.ModalForm, + { + width: "600px", + open: onCreate ? false : void 0, + formRef: createFormRef, + title: "新建组", + modalProps: { destroyOnClose: true }, + layout: "horizontal", + labelCol: { span: 6 }, + wrapperCol: { span: 18 }, + trigger: /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { type: "text", style: { padding: "4px 8px" }, icon: /* @__PURE__ */ import_react.default.createElement(import_icons.FolderAddOutlined, null) }, "新建组"), + submitter: { + searchConfig: { + submitText: "确定", + resetText: "取消" + } + }, + onFinish: onCreateSubmit + }, + /* @__PURE__ */ import_react.default.createElement( + import_pro_components.ProFormText, + { + rules: [ + { + required: true, + max: 20 + }, + { + pattern: /^[^\s]*$/g, + message: "禁止输入空格" + } + ], + fieldProps: { showCount: true }, + width: "md", + name: "name", + label: "盒子组名称", + placeholder: "请输入盒子名称" + } + ), + /* @__PURE__ */ import_react.default.createElement( + import_pro_components.ProFormText, + { + width: "md", + name: "boxList", + label: "盒子选择", + fieldProps: { + readOnly: true, + value: `已选择${((_b = (_a = createFormRef.current) == null ? void 0 : _a.getFieldValue("boxList")) == null ? void 0 : _b.length) || 0}个盒子`, + suffix: /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement("a", { onClick: () => { + var _a2; + (_a2 = createFormRef.current) == null ? void 0 : _a2.setFieldValue("boxList", null); + onBoxChoiceReset(); + } }, "恢复默认"), /* @__PURE__ */ import_react.default.createElement("a", { onClick: () => setBoxChoiceOpen(true) }, "范围选择")) + } + } + ) + ), /* @__PURE__ */ import_react.default.createElement(import_antd.Divider, { type: "vertical", style: { margin: "8px 0" } }), /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { danger: true, type: "text", style: { padding: "4px 8px" }, icon: /* @__PURE__ */ import_react.default.createElement(import_icons.CloseCircleOutlined, null), disabled: ((_c = treeProps == null ? void 0 : treeProps.checkedKeys) == null ? void 0 : _c.length) <= 0, onClick: onBoxBatchDelete }, "删除")), /* @__PURE__ */ import_react.default.createElement(import_antd.Divider, { style: { margin: 0 } })), extraBtns, /* @__PURE__ */ import_react.default.createElement( + import_tree.default, + { + treeCheckable: isTreeCheckable, + data, + onItemSelect, + onItemCheck, + onItemDelete: onBoxDelete, + ...treeProps + } + ))); +}; +var boxPanel_default = BoxPanel; diff --git a/packages/biz/lib/boxSelectTree/index.d.ts b/packages/biz/lib/boxSelectTree/index.d.ts new file mode 100644 index 0000000..2ff0f1e --- /dev/null +++ b/packages/biz/lib/boxSelectTree/index.d.ts @@ -0,0 +1,3 @@ +import BoxSelectTree from './boxSelectTree'; +export type { BoxSelectTreeProps } from './boxSelectTree'; +export default BoxSelectTree; diff --git a/packages/biz/lib/boxSelectTree/index.js b/packages/biz/lib/boxSelectTree/index.js new file mode 100644 index 0000000..74ef62f --- /dev/null +++ b/packages/biz/lib/boxSelectTree/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/boxSelectTree/index.tsx +var boxSelectTree_exports = {}; +__export(boxSelectTree_exports, { + default: () => boxSelectTree_default +}); +module.exports = __toCommonJS(boxSelectTree_exports); +var import_boxSelectTree = __toESM(require("./boxSelectTree")); +var boxSelectTree_default = import_boxSelectTree.default; diff --git a/packages/biz/lib/boxSelectTree/mock.d.ts b/packages/biz/lib/boxSelectTree/mock.d.ts new file mode 100644 index 0000000..84026eb --- /dev/null +++ b/packages/biz/lib/boxSelectTree/mock.d.ts @@ -0,0 +1,2 @@ +import { TreeDataNode } from "antd"; +export declare const treeData: TreeDataNode[]; diff --git a/packages/biz/lib/boxSelectTree/mock.js b/packages/biz/lib/boxSelectTree/mock.js new file mode 100644 index 0000000..5160e1d --- /dev/null +++ b/packages/biz/lib/boxSelectTree/mock.js @@ -0,0 +1,60 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/boxSelectTree/mock.tsx +var mock_exports = {}; +__export(mock_exports, { + treeData: () => treeData +}); +module.exports = __toCommonJS(mock_exports); +var treeData = [ + { + title: "全部盒子", + key: "0-0", + children: [ + { + title: "盒子组1", + key: "0-0-0", + children: [ + { + title: "摄像头1", + key: "0-0-0-0" + }, + { + title: "摄像头2", + key: "0-0-0-1" + } + ] + }, + { + title: "盒子组2", + key: "0-0-1", + children: [ + { + title: "摄像头4", + key: "0-0-1-0" + } + ] + } + ] + } +]; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + treeData +}); diff --git a/packages/biz/lib/hooks/useIntelligentTracking/index.js b/packages/biz/lib/hooks/useIntelligentTracking/index.js index 7cacace..6fe4a23 100644 --- a/packages/biz/lib/hooks/useIntelligentTracking/index.js +++ b/packages/biz/lib/hooks/useIntelligentTracking/index.js @@ -53,7 +53,7 @@ var turf = __toESM(require("@turf/turf")); var import_useTaskState = require("../useTaskState"); var import_Tree = __toESM(require("@common/components/CameraTree/Tree")); var import_request = __toESM(require("../../utils/request")); -var import_antd = require("antd"); +var import_meta = require("@zhst/meta"); var import_utils = require("@common/components/CameraTree/utils"); var import_func = require("@zhst/func"); var defaultFaceThreshold = 0.68; @@ -85,10 +85,10 @@ var operateTrackById = async (smartTrackId, operationType) => { url: "/singer.SmartTrackService/OperationSmartTrack", data }); - import_antd.message.success("操作成功"); + import_meta.message.success("操作成功"); } catch (err) { console.error(err); - import_antd.message.success("操作失败"); + import_meta.message.success("操作失败"); } }; var deleteTrackById = async (smartTrackId) => { @@ -239,7 +239,7 @@ var ModifyTrackCameras = async (value) => { } }); } catch (err) { - import_antd.message.error(err); + import_meta.message.error(err); } }; var setIntelligentTrackCircleInfo = async (smartTrackId, circleCenter) => { @@ -256,7 +256,7 @@ var setIntelligentTrackCircleInfo = async (smartTrackId, circleCenter) => { } }); } catch (err) { - import_antd.message.error(err); + import_meta.message.error(err); } }; var getTackCameraInfo = async (value) => { diff --git a/packages/biz/lib/index.d.ts b/packages/biz/lib/index.d.ts index 78b6ca3..743bed4 100644 --- a/packages/biz/lib/index.d.ts +++ b/packages/biz/lib/index.d.ts @@ -1,2 +1,17 @@ -export { default as Demo } from './Demo'; export { default as BigImageModal } from './BigImageModal'; +export type { BigImageModalProps } from './BigImageModal'; +export { default as BoxSelectTree } from './boxSelectTree'; +export type { BoxSelectTreeProps } from './boxSelectTree'; +export { default as Tree } from './tree'; +export type { BoxTreeProps, TreeData } from './tree'; +export { default as TreeTransfer } from './treeTransfer'; +export type { TreeTransferProps } from './treeTransfer'; +export { default as TreeTransferModal } from './treeTransferModal'; +export type { TreeTransferModalProps } from './treeTransferModal'; +export { default as WarningRecordCard } from './WarningRecordCard'; +export type { IRecord, WarningRecordCardProps } from './WarningRecordCard'; +export type { ViewLargerImageModalRef, ViewLargerImageModalProps } from './ViewLargerImageModal'; +export { default as ViewLargerImageModal, useViewLargerImageModal } from './ViewLargerImageModal'; +export type { VideoPlayerCardProps } from './VideoPlayerCard'; +export { default as VideoPlayerCard } from './VideoPlayerCard'; +export { default as RealTimeMonitor } from './RealTimeMonitor'; diff --git a/packages/biz/lib/index.js b/packages/biz/lib/index.js index ce35778..435cd59 100644 --- a/packages/biz/lib/index.js +++ b/packages/biz/lib/index.js @@ -30,13 +30,36 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru var src_exports = {}; __export(src_exports, { BigImageModal: () => import_BigImageModal.default, - Demo: () => import_Demo.default + BoxSelectTree: () => import_boxSelectTree.default, + RealTimeMonitor: () => import_RealTimeMonitor.default, + Tree: () => import_tree.default, + TreeTransfer: () => import_treeTransfer.default, + TreeTransferModal: () => import_treeTransferModal.default, + VideoPlayerCard: () => import_VideoPlayerCard.default, + ViewLargerImageModal: () => import_ViewLargerImageModal.default, + WarningRecordCard: () => import_WarningRecordCard.default, + useViewLargerImageModal: () => import_ViewLargerImageModal.useViewLargerImageModal }); module.exports = __toCommonJS(src_exports); -var import_Demo = __toESM(require("./Demo")); var import_BigImageModal = __toESM(require("./BigImageModal")); +var import_boxSelectTree = __toESM(require("./boxSelectTree")); +var import_tree = __toESM(require("./tree")); +var import_treeTransfer = __toESM(require("./treeTransfer")); +var import_treeTransferModal = __toESM(require("./treeTransferModal")); +var import_WarningRecordCard = __toESM(require("./WarningRecordCard")); +var import_ViewLargerImageModal = __toESM(require("./ViewLargerImageModal")); +var import_VideoPlayerCard = __toESM(require("./VideoPlayerCard")); +var import_RealTimeMonitor = __toESM(require("./RealTimeMonitor")); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BigImageModal, - Demo + BoxSelectTree, + RealTimeMonitor, + Tree, + TreeTransfer, + TreeTransferModal, + VideoPlayerCard, + ViewLargerImageModal, + WarningRecordCard, + useViewLargerImageModal }); diff --git a/packages/biz/lib/tree/boxTree.d.ts b/packages/biz/lib/tree/boxTree.d.ts new file mode 100644 index 0000000..5e34aef --- /dev/null +++ b/packages/biz/lib/tree/boxTree.d.ts @@ -0,0 +1,17 @@ +import { FC } from 'react'; +import { TreeDataNode, TreeProps } from 'antd'; +import './index.less'; +export interface BoxTreeProps extends TreeProps { + data: TreeDataNode[]; + treeCheckable?: boolean; + showItemOption?: boolean; + customOptions?: any; + onItemCheck?: TreeProps['onCheck']; + onItemSelect?: TreeProps['onSelect']; + onItemSetting?: (_data: any) => void; + onItemDelete?: (_data: any) => void; + onItemRename?: (_nodeData: any) => void; + onItemRenameFinish?: (_data: any, _nodeData: any) => Promise; +} +declare const boxTree: FC; +export default boxTree; diff --git a/packages/biz/lib/tree/boxTree.js b/packages/biz/lib/tree/boxTree.js new file mode 100644 index 0000000..835a8f7 --- /dev/null +++ b/packages/biz/lib/tree/boxTree.js @@ -0,0 +1,134 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tree/boxTree.tsx +var boxTree_exports = {}; +__export(boxTree_exports, { + default: () => boxTree_default +}); +module.exports = __toCommonJS(boxTree_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_theme = __toESM(require("antd/es/theme")); +var import_icons = require("@ant-design/icons"); +var import_pro_components = require("@ant-design/pro-components"); +var import_index = require("./index.less"); +var componentName = "zhst-biz-tree"; +var { useToken } = import_theme.default; +var boxTree = (props) => { + const { + onItemSelect, + onItemCheck, + onItemSetting, + onItemDelete, + data = [], + showItemOption = true, + treeCheckable = false, + onItemRename, + onItemRenameFinish, + customOptions + } = props; + const { token } = useToken(); + const [checkedItem, setCheckedItem] = (0, import_react.useState)(""); + const cameraStatus = /* @__PURE__ */ new Map([ + ["0", "error"], + ["1", "success"], + ["3", "processing"], + ["4", "default"] + ]); + return /* @__PURE__ */ import_react.default.createElement( + import_antd.Tree, + { + checkable: treeCheckable, + blockNode: true, + onSelect: (selectedKeys, info) => { + setCheckedItem(selectedKeys[0]); + onItemSelect == null ? void 0 : onItemSelect(selectedKeys, info); + }, + onCheck: onItemCheck, + treeData: data, + titleRender: (_nodeData) => { + return /* @__PURE__ */ import_react.default.createElement("div", { className: `${componentName}-item-render` }, !_nodeData.children && _nodeData.isCamera && /* @__PURE__ */ import_react.default.createElement(import_antd.Badge, { style: { marginRight: "6px" }, status: cameraStatus.get(_nodeData.status || "4") }), /* @__PURE__ */ import_react.default.createElement( + "span", + { + style: checkedItem === _nodeData.key && _nodeData.isCamera ? { + color: token.colorPrimary + } : {} + }, + _nodeData.title + ), showItemOption && /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { className: `${componentName}-item-render_right`, style: { float: "right" } }, customOptions || /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement( + import_pro_components.ModalForm, + { + title: "重命名", + width: 600, + modalProps: { destroyOnClose: true }, + layout: "horizontal", + labelCol: { span: 6 }, + wrapperCol: { span: 18 }, + trigger: /* @__PURE__ */ import_react.default.createElement(import_icons.EditOutlined, { onClick: (e) => { + e.preventDefault(); + e.stopPropagation(); + onItemRename == null ? void 0 : onItemRename(_nodeData); + } }), + submitter: { + searchConfig: { + submitText: "确定", + resetText: "取消" + } + }, + onFinish: async (value) => onItemRenameFinish == null ? void 0 : onItemRenameFinish(value, _nodeData) + }, + /* @__PURE__ */ import_react.default.createElement( + import_pro_components.ProFormText, + { + rules: [ + { + required: true + } + ], + width: "md", + name: "name", + label: "盒子名称", + placeholder: "请输入盒子名称" + } + ) + ), /* @__PURE__ */ import_react.default.createElement(import_icons.SettingOutlined, { onClick: (e) => { + e.preventDefault(); + e.stopPropagation(); + onItemSetting == null ? void 0 : onItemSetting(_nodeData); + } }), /* @__PURE__ */ import_react.default.createElement(import_icons.CloseOutlined, { onClick: (e) => { + e.preventDefault(); + e.stopPropagation(); + onItemDelete == null ? void 0 : onItemDelete(_nodeData); + } })))); + }, + ...props + } + ); +}; +var boxTree_default = boxTree; diff --git a/packages/biz/lib/tree/index.d.ts b/packages/biz/lib/tree/index.d.ts new file mode 100644 index 0000000..4082eb0 --- /dev/null +++ b/packages/biz/lib/tree/index.d.ts @@ -0,0 +1,13 @@ +import { TreeDataNode } from 'antd'; +import BoxTree from './boxTree'; +export interface TreeData extends TreeDataNode { + children?: TreeDataNode['children'] & { + isCamera?: boolean; + /** + * 0-失败 1-成功 2-进行中 3-未知 + */ + status?: '0' | '1' | '2' | '3'; + }[]; +} +export type { BoxTreeProps } from './boxTree'; +export default BoxTree; diff --git a/packages/material/lib/Demo/index.js b/packages/biz/lib/tree/index.js similarity index 82% rename from packages/material/lib/Demo/index.js rename to packages/biz/lib/tree/index.js index 09e6968..46783d3 100644 --- a/packages/material/lib/Demo/index.js +++ b/packages/biz/lib/tree/index.js @@ -26,13 +26,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -// src/Demo/index.tsx -var Demo_exports = {}; -__export(Demo_exports, { - default: () => Demo_default +// src/tree/index.tsx +var tree_exports = {}; +__export(tree_exports, { + default: () => tree_default }); -module.exports = __toCommonJS(Demo_exports); -var import_react = __toESM(require("react")); -var Demo_default = () => { - return /* @__PURE__ */ import_react.default.createElement("div", null, "hi"); -}; +module.exports = __toCommonJS(tree_exports); +var import_boxTree = __toESM(require("./boxTree")); +var tree_default = import_boxTree.default; diff --git a/packages/biz/lib/tree/index.less b/packages/biz/lib/tree/index.less new file mode 100644 index 0000000..9da4e2d --- /dev/null +++ b/packages/biz/lib/tree/index.less @@ -0,0 +1,9 @@ +.zhst-biz-tree-item-render { + &_right { + display: none; + } + + &:hover &_right { + display: inline-flex; + } +} diff --git a/packages/biz/lib/treeTransfer/TreeTransfer.d.ts b/packages/biz/lib/treeTransfer/TreeTransfer.d.ts new file mode 100644 index 0000000..b74b4f3 --- /dev/null +++ b/packages/biz/lib/treeTransfer/TreeTransfer.d.ts @@ -0,0 +1,22 @@ +import React from 'react'; +import { InputProps } from 'antd'; +import { TransferProps, TreeDataNode, TreeProps } from 'antd'; +import './index.less'; +export interface TreeTransferProps { + dataSource: TreeDataNode[]; + treeProps?: TreeProps; + searchInputProps?: InputProps; + targetItems: TreeDataNode[]; + checkedKeys: string[]; + onTreeSelect?: TreeProps['onSelect']; + onTreeCheck?: TreeProps['onCheck']; + onItemDelete?: (key: string, info?: { + root: TreeDataNode[]; + keys: string[]; + }) => void; + onChange?: TransferProps['onChange']; + onOk?: (data: any) => void; + onReset?: () => void; +} +declare const TreeTransfer: React.FC; +export default TreeTransfer; diff --git a/packages/biz/lib/treeTransfer/TreeTransfer.js b/packages/biz/lib/treeTransfer/TreeTransfer.js new file mode 100644 index 0000000..5c8aa59 --- /dev/null +++ b/packages/biz/lib/treeTransfer/TreeTransfer.js @@ -0,0 +1,137 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/treeTransfer/TreeTransfer.tsx +var TreeTransfer_exports = {}; +__export(TreeTransfer_exports, { + default: () => TreeTransfer_default +}); +module.exports = __toCommonJS(TreeTransfer_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_theme = __toESM(require("antd/es/theme")); +var import_index = require("./index.less"); +var import_icons = require("@ant-design/icons"); +var import_treeTransferHelper = require("./treeTransferHelper"); +var componentName = "zhst-biz-treeTransfer"; +var { useToken } = import_theme.default; +var TreeTransfer = ({ + dataSource, + treeProps, + searchInputProps, + targetItems = [], + checkedKeys = [], + onTreeCheck, + onTreeSelect, + onItemDelete, + onOk, + onReset +}) => { + const { token } = useToken(); + const [keyWords, setKeyWords] = (0, import_react.useState)(""); + function findNodesWithKeyword(_keyWords, _treeData) { + function dfs(node) { + return node.filter((item) => item.title.includes(_keyWords)); + } + const data = dfs(_treeData); + return data || []; + } + return /* @__PURE__ */ import_react.default.createElement(import_antd.Flex, { gap: 20, className: componentName, align: "center", justify: "center" }, /* @__PURE__ */ import_react.default.createElement("div", { className: `${componentName}-left` }, /* @__PURE__ */ import_react.default.createElement( + import_antd.Card, + { + className: `${componentName}-left_card`, + title: /* @__PURE__ */ import_react.default.createElement("div", { style: { textAlign: "center" } }, "可选择的范围"), + bodyStyle: { padding: 12 } + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Input, { prefix: /* @__PURE__ */ import_react.default.createElement(import_icons.SearchOutlined, null), onChange: (e) => setKeyWords(e.target.value), placeholder: "请输入设备名称", ...searchInputProps }), + /* @__PURE__ */ import_react.default.createElement( + import_antd.Tree, + { + style: { marginTop: "6px" }, + height: 420, + blockNode: true, + checkable: true, + checkedKeys, + treeData: findNodesWithKeyword(keyWords, dataSource), + onCheck: (keys, info) => onTreeCheck == null ? void 0 : onTreeCheck(keys, info), + onSelect: (keys, info) => onTreeSelect == null ? void 0 : onTreeSelect(keys, info), + ...treeProps + } + ) + )), /* @__PURE__ */ import_react.default.createElement(import_icons.DoubleRightOutlined, null), /* @__PURE__ */ import_react.default.createElement("div", { className: `${componentName}-right` }, /* @__PURE__ */ import_react.default.createElement( + import_antd.Card, + { + className: `${componentName}-right_card`, + title: /* @__PURE__ */ import_react.default.createElement("div", { style: { textAlign: "center" } }, "已选择的范围"), + bodyStyle: { padding: 0 } + }, + /* @__PURE__ */ import_react.default.createElement( + "div", + { + className: `${componentName}-right_card__items` + }, + targetItems.map((item) => /* @__PURE__ */ import_react.default.createElement( + "div", + { + className: `${componentName}-right_card__items___item`, + key: item.key, + onMouseEnter: (e) => { + e.target.style.backgroundColor = token.colorPrimaryBg; + e.target.style.color = token.colorPrimary; + }, + onMouseLeave: (e) => { + e.target.style.color = token.colorText; + e.target.style.backgroundColor = null; + } + }, + item.title, + /* @__PURE__ */ import_react.default.createElement("div", { style: { float: "right" } }, /* @__PURE__ */ import_react.default.createElement(import_icons.DeleteOutlined, { onClick: () => { + const { root, keys } = (0, import_treeTransferHelper.getAllRootKeyById)(item.key, dataSource); + onItemDelete == null ? void 0 : onItemDelete(item.key, { root, keys }); + } })) + )) + ), + /* @__PURE__ */ import_react.default.createElement( + import_antd.Flex, + { + className: `${componentName}-right_card__btns` + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { style: { marginRight: 8, width: "50%" }, disabled: targetItems.length <= 0, onClick: onReset }, "重置"), + /* @__PURE__ */ import_react.default.createElement( + import_antd.Button, + { + style: { width: "50%" }, + type: "primary", + onClick: () => onOk == null ? void 0 : onOk(targetItems) + }, + "确定" + ) + ) + ))); +}; +var TreeTransfer_default = TreeTransfer; diff --git a/packages/biz/lib/treeTransfer/index.d.ts b/packages/biz/lib/treeTransfer/index.d.ts new file mode 100644 index 0000000..7ea5c47 --- /dev/null +++ b/packages/biz/lib/treeTransfer/index.d.ts @@ -0,0 +1,4 @@ +import TreeTransfer from "./TreeTransfer"; +export type { TreeTransferProps } from './TreeTransfer'; +export * from './treeTransferHelper'; +export default TreeTransfer; diff --git a/packages/biz/lib/treeTransfer/index.js b/packages/biz/lib/treeTransfer/index.js new file mode 100644 index 0000000..7e50781 --- /dev/null +++ b/packages/biz/lib/treeTransfer/index.js @@ -0,0 +1,42 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/treeTransfer/index.tsx +var treeTransfer_exports = {}; +__export(treeTransfer_exports, { + default: () => treeTransfer_default +}); +module.exports = __toCommonJS(treeTransfer_exports); +var import_TreeTransfer = __toESM(require("./TreeTransfer")); +__reExport(treeTransfer_exports, require("./treeTransferHelper"), module.exports); +var treeTransfer_default = import_TreeTransfer.default; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + ...require("./treeTransferHelper") +}); diff --git a/packages/biz/lib/treeTransfer/index.less b/packages/biz/lib/treeTransfer/index.less new file mode 100644 index 0000000..9ffe8cd --- /dev/null +++ b/packages/biz/lib/treeTransfer/index.less @@ -0,0 +1,43 @@ +.zhst-biz-treeTransfer { + &-left { + &_card { + width: 500px; + height: 522px; + background-color: #FCFCFC; + } + } + + &-right { + &_card { + width: 300px; + height: 522px; + background-color: #FCFCFC; + + &__items { + padding: 8px 4px; + overflow: scroll; + + &::-webkit-scrollbar { + display: none; + } + + &___item { + margin: 0; + padding: 4px 12px; + cursor: pointer; + } + } + + &__btns { + width: 100%; + padding: 8px; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + box-sizing: border-box; + border-top: 1px solid #f0f0f0; + } + } + } +} diff --git a/packages/biz/lib/treeTransfer/treeTransferHelper.d.ts b/packages/biz/lib/treeTransfer/treeTransferHelper.d.ts new file mode 100644 index 0000000..705684c --- /dev/null +++ b/packages/biz/lib/treeTransfer/treeTransferHelper.d.ts @@ -0,0 +1,12 @@ +export declare const isChecked: (selectedKeys: React.Key[], eventKey: React.Key) => boolean; +/** + * 通过子元素找到父级节点 + * @param objects + * @param element + * @returns + */ +export declare const findParentByChild: (objects: any[], propertyValue: string | number, propertyKey?: string) => any; +export declare const getAllRootKeyById: (val: string | number, list: any[], key?: string) => { + root: any; + keys: any[]; +}; diff --git a/packages/biz/lib/treeTransfer/treeTransferHelper.js b/packages/biz/lib/treeTransfer/treeTransferHelper.js new file mode 100644 index 0000000..1c3c4eb --- /dev/null +++ b/packages/biz/lib/treeTransfer/treeTransferHelper.js @@ -0,0 +1,77 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/treeTransfer/treeTransferHelper.ts +var treeTransferHelper_exports = {}; +__export(treeTransferHelper_exports, { + findParentByChild: () => findParentByChild, + getAllRootKeyById: () => getAllRootKeyById, + isChecked: () => isChecked +}); +module.exports = __toCommonJS(treeTransferHelper_exports); +var isChecked = (selectedKeys, eventKey) => selectedKeys.includes(eventKey); +function isObject(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); +} +var findParentByChild = (objects, propertyValue, propertyKey = "key") => { + for (let i = 0; i < objects.length; i++) { + const obj = objects[i]; + if (obj[propertyKey] === propertyValue) { + return obj; + } else if (typeof obj === "object") { + const found = findParentByChild(Object.values(obj), propertyValue); + if (found) { + return obj; + } + } + } + return null; +}; +var getAllRootKeyById = (val, list, key = "key") => { + let keys = []; + const findParentByChild2 = (propertyValue, objects, propertyKey) => { + for (let i = 0; i < objects.length; i++) { + const obj = objects[i]; + if (obj[propertyKey] === propertyValue) { + console.log("obj", obj); + return obj; + } else if (typeof obj === "object") { + const found = findParentByChild2(propertyValue, Object.values(obj), propertyKey); + if (found) { + if (isObject(found)) { + keys.push(found.key); + } + return obj; + } + } + } + return null; + }; + const data = findParentByChild2(val, list, key); + data.key && keys.push(data.key); + return { + root: data, + keys + }; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + findParentByChild, + getAllRootKeyById, + isChecked +}); diff --git a/packages/biz/lib/treeTransferModal/TreeTransferModal.d.ts b/packages/biz/lib/treeTransferModal/TreeTransferModal.d.ts new file mode 100644 index 0000000..e0a0d0e --- /dev/null +++ b/packages/biz/lib/treeTransferModal/TreeTransferModal.d.ts @@ -0,0 +1,26 @@ +import { FC } from 'react'; +import { ModalProps, RadioGroupProps, SelectProps, TransferProps, TreeDataNode, TreeProps } from 'antd'; +export interface TreeTransferModalProps { + dataSource: TreeDataNode[]; + treeProps?: TreeProps; + targetItems: TreeDataNode[]; + checkedKeys: string[]; + onTreeSelect?: TreeProps['onSelect']; + onTreeCheck?: TreeProps['onCheck']; + onItemDelete?: (key: string, info?: { + root: TreeDataNode[]; + keys: string[]; + }) => void; + onChange?: TransferProps['onChange']; + onOk?: (data: any) => void; + onReset?: () => void; + open?: boolean; + onCancel?: ModalProps['onCancel']; + onRadioChange?: RadioGroupProps['onChange']; + onSelect?: SelectProps['onSelect']; + modalProps?: ModalProps; + radioProps?: RadioGroupProps; + selectProps?: SelectProps; +} +declare const TreeTransferModal: FC; +export default TreeTransferModal; diff --git a/packages/biz/lib/treeTransferModal/TreeTransferModal.js b/packages/biz/lib/treeTransferModal/TreeTransferModal.js new file mode 100644 index 0000000..5c20927 --- /dev/null +++ b/packages/biz/lib/treeTransferModal/TreeTransferModal.js @@ -0,0 +1,114 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/treeTransferModal/TreeTransferModal.tsx +var TreeTransferModal_exports = {}; +__export(TreeTransferModal_exports, { + default: () => TreeTransferModal_default +}); +module.exports = __toCommonJS(TreeTransferModal_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_treeTransfer = __toESM(require("../treeTransfer")); +var import_constants = require("../utils/constants"); +var TreeTransferModal = (props) => { + const { + open, + dataSource = [], + checkedKeys, + onItemDelete, + onOk, + onCancel, + onReset, + onRadioChange, + onTreeCheck, + onSelect, + targetItems, + modalProps, + radioProps, + selectProps + } = props; + const [type, setType] = (0, import_react.useState)("1"); + return /* @__PURE__ */ import_react.default.createElement( + import_antd.Modal, + { + open, + destroyOnClose: true, + title: "统计点位", + width: "948px", + footer: null, + onCancel, + ...modalProps + }, + /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement( + import_antd.Radio.Group, + { + onChange: (e) => { + setType(e.target.value); + onRadioChange == null ? void 0 : onRadioChange(e); + }, + style: { marginLeft: "24px", padding: "20px 0" }, + value: type, + options: import_constants.BOX_TYPE_LIST, + ...radioProps + } + ), /* @__PURE__ */ import_react.default.createElement( + import_antd.Select, + { + defaultValue: "", + style: { marginLeft: 200, width: 150 }, + options: import_constants.ALL_LIST, + onSelect, + ...selectProps + } + )), type === "box" ? /* @__PURE__ */ import_react.default.createElement( + import_treeTransfer.default, + { + dataSource, + targetItems, + checkedKeys, + onTreeCheck, + onItemDelete, + onOk, + onReset + } + ) : /* @__PURE__ */ import_react.default.createElement( + import_treeTransfer.default, + { + dataSource, + targetItems, + checkedKeys, + onTreeCheck, + onItemDelete, + onOk, + onReset + } + ), /* @__PURE__ */ import_react.default.createElement("p", { style: { textAlign: "right" } }, "已选中", targetItems.length, "个点位")) + ); +}; +var TreeTransferModal_default = TreeTransferModal; diff --git a/packages/biz/lib/treeTransferModal/index.d.ts b/packages/biz/lib/treeTransferModal/index.d.ts new file mode 100644 index 0000000..8e5245a --- /dev/null +++ b/packages/biz/lib/treeTransferModal/index.d.ts @@ -0,0 +1,3 @@ +import TreeTransferModal from './TreeTransferModal'; +export type { TreeTransferModalProps } from './TreeTransferModal'; +export default TreeTransferModal; diff --git a/packages/biz/lib/treeTransferModal/index.js b/packages/biz/lib/treeTransferModal/index.js new file mode 100644 index 0000000..19037a6 --- /dev/null +++ b/packages/biz/lib/treeTransferModal/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/treeTransferModal/index.tsx +var treeTransferModal_exports = {}; +__export(treeTransferModal_exports, { + default: () => treeTransferModal_default +}); +module.exports = __toCommonJS(treeTransferModal_exports); +var import_TreeTransferModal = __toESM(require("./TreeTransferModal")); +var treeTransferModal_default = import_TreeTransferModal.default; diff --git a/packages/biz/lib/useSocket/index.js b/packages/biz/lib/useSocket/index.js deleted file mode 100644 index b4d6861..0000000 --- a/packages/biz/lib/useSocket/index.js +++ /dev/null @@ -1,118 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// src/useSocket/index.ts -var useSocket_exports = {}; -__export(useSocket_exports, { - SocketApi: () => SocketApi, - default: () => useSocket_default -}); -module.exports = __toCommonJS(useSocket_exports); -var import_react = require("react"); -var import_func = require("@zhst/func"); -var import_hooks = require("@zhst/hooks"); -var import_ws = __toESM(require("./ws")); -var getSelf = (v) => v; -var SocketApi = { - CameraTaskStatue: "singer.DeviceService/SubScribeCameraTaskStatus", - DeviceStatus: "singer.TaskManagerService/SubscribeTaskStatus", - SubscribeSolutionDeploy: "singer.SolutionManagerService/SubscribeSolutionDeploy", - SubscribeTasksSummary: "singer.TaskManagerService/SubscribeTasksSummary", - MonitorSubscribeResult: "singer.MonitorService/MonitorSubscribeResult", - MonitorSubscribeStatus: "singer.MonitorService/MonitorSubscribeStatus", - SubscribeArchiveGroupUpload: "singer.ArchiveGroupService/CreateArchiveByImport", - SubscribeJointTask: "singer.JointTaskService/SubscribeJointTask", - SubscribeGroupFragment: "singer.VideoService/SubscribeVideoFragmentStatus", - // 监听视频分片状态变化,包括新建、删除、变化 - SubscribeGroup: "singer.VideoService/SubscribeGroup", - // 监听视频分组状态变化,列表变化也通知 - SubscribeStreamEvent: "singer.MediaManagerService/SubscribeStreamEvent" - // 监听视频分组状态变化,列表变化也通知 -}; -var useSocket_default = (topic, iterator = import_func.noop, opt) => { - const { - req = {}, - throttle = 0, - beforeLoopTmp = getSelf, - shouldBreak = false, - forceRefresh, - close - } = opt || {}; - const reqstring = (0, import_react.useMemo)(() => { - const newReq = { - ...req, - extraHeaders: { - authorization: localStorage.getItem("USER-TOKEN") - } - }; - return JSON.stringify(newReq); - }, [req]); - const latestIterator = (0, import_hooks.useLatest)(iterator); - (0, import_hooks.useDeepEffect)(() => { - if (close) { - return; - } - if (shouldBreak) { - return; - } - let tmpData = []; - const throttleUpdate = (0, import_func.throttle)(() => { - if (tmpData.length == 0) { - return; - } - const _tmpData = beforeLoopTmp(tmpData); - latestIterator.current(_tmpData); - tmpData = []; - }, throttle); - const unSubscribe = import_ws.default.subscribe(SocketApi[topic], reqstring, (socketData) => { - try { - if (!throttle) { - latestIterator.current(socketData); - } else { - tmpData.push(socketData); - throttleUpdate(); - } - } catch (error) { - console.error("useSocke:", error); - } - }); - return () => { - try { - unSubscribe(); - throttleUpdate.cancel(); - } catch (error) { - console.error(error); - throw error; - } - }; - }, [topic, reqstring, shouldBreak, forceRefresh, close]); -}; -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - SocketApi -}); diff --git a/packages/biz/lib/useSocket/onceChannel.d.ts b/packages/biz/lib/useSocket/onceChannel.d.ts deleted file mode 100644 index 400ffa7..0000000 --- a/packages/biz/lib/useSocket/onceChannel.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const startChannel: (topic: any, req: any, callback: any) => () => void; -export default startChannel; diff --git a/packages/biz/lib/useSocket/ws.d.ts b/packages/biz/lib/useSocket/ws.d.ts deleted file mode 100644 index 0dc9550..0000000 --- a/packages/biz/lib/useSocket/ws.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -declare class Channel { - /** - * io 实例化对象 - */ - ioIns: any; - /** - * 已存在的订阅列表 - */ - listeners: never[]; - /** - * 调试信息 记录订阅/反订阅次数 - */ - subscribeListenerId: never[]; - unSubscribeListenerId: never[]; - init: () => void; - retry: (listener: { - [x: string]: any; - lastRetryInterval: number | undefined; - intervalId: NodeJS.Timeout; - } | undefined) => void; - doEmit: (topic: any, req: any, listenerId: any) => void; - subscribe(topic: any, req: any, handle: any): () => void; - unSubscribe(topic: any, req: any, handleId: any, listenerId: any): void; -} -declare const channelIns: Channel; -export default channelIns; diff --git a/packages/biz/lib/useSocket/ws.js b/packages/biz/lib/useSocket/ws.js deleted file mode 100644 index 8dab6f2..0000000 --- a/packages/biz/lib/useSocket/ws.js +++ /dev/null @@ -1,224 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// src/useSocket/ws.ts -var ws_exports = {}; -__export(ws_exports, { - default: () => ws_default -}); -module.exports = __toCommonJS(ws_exports); -var import_uuid = require("uuid"); -var import_func = require("@zhst/func"); -var import_socket = __toESM(require("socket.io-client")); -var import_constants = require("@common/constants"); -var EMITSTATE = { - NOT_CONNECT: 0, - WAITING: 1, - CONNECT: 2 -}; -var initRetryTime = 0; -var intervalTime = 5 * 1e3; -var maxIntervalTime = 1 * 60 * 60 * 1e3; -var Channel = class { - constructor() { - /** - * 已存在的订阅列表 - */ - this.listeners = [ - // { - // topic: "", - // req: "", - // suInfo: {}, - // hasEmit: false,//是否已经订阅 - // lastRetryInterval: 0, - // handles: { - // } - // } - ]; - /** - * 调试信息 记录订阅/反订阅次数 - */ - this.subscribeListenerId = []; - this.unSubscribeListenerId = []; - this.init = () => { - const ioIns = this.ioIns = (0, import_socket.default)(import_constants.SOCKET_HOST, { - reconnection: true, - transports: ["websocket"], - forceNew: true - }); - ioIns.on("connect", (...arg) => { - console.debug("connect", arg); - this.ioIns = ioIns; - this.listeners.forEach((v) => { - this.doEmit(v["topic"], v["req"], v["id"]); - }); - }); - ioIns.on("event", (...arg) => { - console.debug("event", arg); - }); - ioIns.on("disconnect", (...arg) => { - console.debug("disconnect", arg); - this.subscribeListenerId = []; - this.unSubscribeListenerId = []; - }); - ioIns.on("reconnect", (...arg) => { - console.debug("reconnect", arg); - this.listeners.forEach((v) => { - v["hasEmit"] = EMITSTATE.NOT_CONNECT; - this.doEmit(v["topic"], v["req"], v["id"]); - }); - }); - }; - this.retry = (listener) => { - const intervalId = setTimeout(() => { - const hasExit = this.listeners.find( - (v) => v["topic"] === (listener == null ? void 0 : listener["topic"]) && v["req"] === listener["req"] - ); - if (!hasExit) - return; - listener["hasEmit"] = EMITSTATE.NOT_CONNECT; - this.doEmit(listener["topic"], listener["req"], listener["id"]); - }, listener.lastRetryInterval); - listener.intervalId = intervalId; - listener.lastRetryInterval = intervalTime + listener.lastRetryInterval > maxIntervalTime ? maxIntervalTime : intervalTime + listener.lastRetryInterval; - }; - this.doEmit = (topic, req, listenerId) => { - var _a, _b; - if (!this.ioIns) { - this.init(); - } - const hasEmit = this.listeners.find( - (v) => v["topic"] === topic && v["req"] === req && v["hasEmit"] !== EMITSTATE.NOT_CONNECT - ); - if (hasEmit) { - return; - } - const listener = this.listeners.find((v) => v["topic"] === topic && v["req"] === req); - listener["hasEmit"] = EMITSTATE.WAITING; - (_b = (_a = this.ioIns) == null ? void 0 : _a.emit) == null ? void 0 : _b.call(_a, topic, req, (data) => { - var _a2, _b2; - console.info("emit", topic, req, data); - const suInfo = JSON.parse(data); - if ((0, import_func.has)(suInfo, "Error.code")) { - if (suInfo.Error.code === 500) { - this.retry(listener); - } - return; - } - this.subscribeListenerId.push(listenerId); - const currentTopicIndex = this.listeners.findIndex( - (v) => v["topic"] === topic && v["req"] === req && v["id"] === listenerId - ); - if (currentTopicIndex == -1) { - this.ioIns.emit("UnSubscribe", JSON.stringify(suInfo), (data2) => { - this.unSubscribeListenerId.push(listenerId); - console.debug("UNSUBSCRIBE", listenerId, topic, req, data2); - }); - return; - } - if (!suInfo["SubscribeID"]) { - this.listeners.splice(currentTopicIndex, 0); - } else { - this.listeners[currentTopicIndex]["suInfo"] = suInfo; - this.listeners[currentTopicIndex]["hasEmit"] = EMITSTATE.CONNECT; - } - (_b2 = (_a2 = this.ioIns) == null ? void 0 : _a2.on) == null ? void 0 : _b2.call(_a2, suInfo["SubscribeID"], (data2) => { - console.info("on", suInfo["SubscribeID"], data2); - try { - const socketData = JSON.parse(data2); - if ((0, import_func.has)(socketData, "Error.code")) { - if (socketData.Error.code === 500) { - this.retry(listener); - } - return; - } - const { handles = {} } = this.listeners.find((v) => v["topic"] === topic && v["req"] === req) || {}; - Object.keys(handles).forEach((key) => { - try { - const func = handles[key]; - if (!func) - return; - func(socketData); - } catch (error) { - console.error(error); - } - }); - } catch (error) { - console.debug("error", error); - } - }); - }); - }; - } - subscribe(topic, req, handle) { - const handleId = (0, import_uuid.v4)(); - const listenerId = (0, import_uuid.v4)(); - const listener = this.listeners.find((v) => v["topic"] === topic && v["req"] === req); - if (listener) { - listener["handles"][handleId] = handle; - } else { - this.listeners.push({ - topic, - req, - suInfo: {}, - id: listenerId, - hasEmit: EMITSTATE.NOT_CONNECT, - lastRetryInterval: initRetryTime, - handles: { - [`${handleId}`]: handle - } - }); - this.doEmit(topic, req, listenerId); - } - return this.unSubscribe.bind(this, topic, req, handleId, listenerId); - } - unSubscribe(topic, req, handleId, listenerId) { - const listener = this.listeners.find( - (v) => v["topic"] === topic && v["req"] === req && v["id"] === listenerId - ); - const { handles = {}, suInfo } = listener || {}; - if (handles[handleId]) { - delete handles[handleId]; - if (Object.keys(handles).length === 0) { - if (this.intervalId) { - clearTimeout(this.intervalId); - } - if (listener["hasEmit"] === EMITSTATE["CONNECT"]) { - this.ioIns.emit("UnSubscribe", JSON.stringify(suInfo), (data) => { - this.unSubscribeListenerId.push(listenerId); - console.debug("UNSUBSCRIBE", listener["id"], topic, req, data); - }); - } - this.listeners = this.listeners.filter((v) => !(v["topic"] === topic && v["req"] === req)); - } - } - } -}; -var channelIns = new Channel(); -window.__channel__ = channelIns; -var ws_default = channelIns; diff --git a/packages/biz/lib/utils/constants.d.ts b/packages/biz/lib/utils/constants.d.ts deleted file mode 100644 index 45a9a99..0000000 --- a/packages/biz/lib/utils/constants.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -export declare const OBJECT_GRNER_THRESHOLD = 0.8; -export declare const OBJECT_AGE_TYPE_THRESHOLD = 0.5; -export declare const MODE_KEY = "test_mode"; -export declare const SEARCH_IMG_COUNT = 10; -export declare const GLOBAL_IS_ITEM_NUMBER_SHOW = false; -export declare const publicPath = "hummingbird"; -export declare const ENTER_CIRCLE = "MONITORTYPE_ENTER_CIRCLE"; -export declare const OUT_CIRCLE = "MONITORTYPE_OUT_CIRCLE"; -export declare const TEMP = "MONITORTYPE_TEMP"; -export declare const GLOBAL_IS_BOX_VMS_SHOW = true; -export declare const BODY_SEARCH_THRESHOID = 0.45; -export declare const RECORD_VERSION = "3.0.0"; -export declare const DeviceTab: { - EMPTY: number; - REAL_CAMERA: number; - PREPROCESS_CAMERA: number; - TAG_CAMERA: number; - HISTORY_VIDEO_GROUP: number; - VIRTUAL_CAMERA: number; - REAL_CAMERA_NOFACE: number; - REAL_CAMERA_ONLYFACE: number; - REAL_CAMERA_NOFACE_NOBOX_NODIRECONNECT: number; -}; diff --git a/packages/biz/lib/utils/constants.js b/packages/biz/lib/utils/constants.js index 6c57f12..733d65a 100644 --- a/packages/biz/lib/utils/constants.js +++ b/packages/biz/lib/utils/constants.js @@ -19,7 +19,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru // src/utils/constants.ts var constants_exports = {}; __export(constants_exports, { + ALL_LIST: () => ALL_LIST, BODY_SEARCH_THRESHOID: () => BODY_SEARCH_THRESHOID, + BOX_TYPE_LIST: () => BOX_TYPE_LIST, DeviceTab: () => DeviceTab, ENTER_CIRCLE: () => ENTER_CIRCLE, GLOBAL_IS_BOX_VMS_SHOW: () => GLOBAL_IS_BOX_VMS_SHOW, @@ -62,9 +64,18 @@ var DeviceTab = { REAL_CAMERA_NOFACE_NOBOX_NODIRECONNECT: 8 // 只有普通摄像头,没有人脸、没有盒子、直连 }; +var BOX_TYPE_LIST = [ + { value: "1", label: "盒子" }, + { value: "2", label: "盒子组" } +]; +var ALL_LIST = [ + { value: "", label: "全部" } +]; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { + ALL_LIST, BODY_SEARCH_THRESHOID, + BOX_TYPE_LIST, DeviceTab, ENTER_CIRCLE, GLOBAL_IS_BOX_VMS_SHOW, diff --git a/packages/biz/package.json b/packages/biz/package.json index 41a32a0..3144210 100644 --- a/packages/biz/package.json +++ b/packages/biz/package.json @@ -1,6 +1,6 @@ { "name": "@zhst/biz", - "version": "0.5.1", + "version": "0.11.3", "description": "业务库", "keywords": [ "business", @@ -20,7 +20,7 @@ "typings": "es/index.d.ts", "exports": { ".": { - "import": "./src/index.ts" + "import": "./es/index.js" } }, "files": [ @@ -35,14 +35,17 @@ "registry": "http://10.0.0.77:4874" }, "devDependencies": { - "@types/zhst": "workspace:^" + "@zhst/types": "workspace:^" }, "dependencies": { + "@ant-design/icons": "^5.2.6", + "@ant-design/pro-components": "^2.6.49", "@zhst/func": "workspace:^", "@zhst/hooks": "workspace:^", "@zhst/meta": "workspace:^", "antd": "^5.12.5", "classnames": "^2.5.1", - "rc-util": "^5.38.1" + "rc-util": "^5.38.1", + "dayjs": "^1.11.10" } } diff --git a/packages/biz/src/BigImageModal/index.md b/packages/biz/src/BigImageModal/index.md index d811833..0b24759 100644 --- a/packages/biz/src/BigImageModal/index.md +++ b/packages/biz/src/BigImageModal/index.md @@ -1,7 +1,8 @@ --- -group: 数据展示 +group: 进阶组件 category: Components subtitle: 大图预览组件 +toc: content title: BigImagePreview 大图预览组件 demo: cols: 2 diff --git a/packages/biz/src/RealTimeMonitor/RealTimeMonitor.tsx b/packages/biz/src/RealTimeMonitor/RealTimeMonitor.tsx new file mode 100644 index 0000000..73d7dd4 --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/RealTimeMonitor.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { IRecord, VideoPlayerCardProps, ViewLargerImageModalRef } from '@zhst/biz'; +import WindowToggle from './components/WindowToggle'; +import WarningRecordList from './components/WarningRecordList'; + +interface RealTimeMonitorProps { + videoDataSource?: VideoPlayerCardProps[]; + handleWindowClick?: (key?: string) => void; + handleCloseButtonClick?: (key?: string) => void; + selectedWindowKey?: string; + warningDataSource?: IRecord[]; + viewLargerImageModalRef?: React.RefObject; + /* + 处理 图片下载按钮点击事件 + */ + handleDownloadImg?: (imgSrc?: string) => void; + /* + 处理 预警记录卡片点击事件 + */ + onRecordClick?: (record?: IRecord) => void; + /* + 获取选中的 记录 id 用于 判断是否显示 选中样式 + */ + selectedRecordId?: string; + isRecordListLoading?: boolean; + recordListTitle?: string; + style?: React.CSSProperties; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; + largeImageTitle?: string; +} + +export const RealTimeMonitor: React.FC = (props) => { + + const { videoDataSource, + handleWindowClick, + handleCloseButtonClick, + selectedWindowKey, + warningDataSource, + viewLargerImageModalRef, + handleDownloadImg, + onRecordClick, + selectedRecordId, + isRecordListLoading, + } = props + + return ( +
+ + +
+ + ); +}; + +export default RealTimeMonitor; \ No newline at end of file diff --git a/packages/biz/src/RealTimeMonitor/components/WarningRecordList/WarningRecordList.tsx b/packages/biz/src/RealTimeMonitor/components/WarningRecordList/WarningRecordList.tsx new file mode 100644 index 0000000..9aba8b9 --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/components/WarningRecordList/WarningRecordList.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { ViewLargerImageModal, WarningRecordCard, IRecord, ViewLargerImageModalRef } from '@zhst/biz'; +import { Empty, Space, Spin } from 'antd'; +import "./index.less" +import { LoadingOutlined } from '@ant-design/icons'; + +interface WarningRecordListProps { + dataSource?: IRecord[]; + viewLargerImageModalRef?: React.RefObject; + /* + 处理 图片下载按钮点击事件 + */ + handleDownloadImg?: (imgSrc?: string) => void; + /* + 处理 预警记录卡片点击事件 + */ + onRecordClick?: (record?: IRecord) => void; + /* + 获取选中的 记录 id 用于 判断是否显示 选中样式 + */ + selectedRecordId?: string; + isRecordListLoading?: boolean; + recordListTitle?: string; + style?: React.CSSProperties; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; + largeImageTitle?: string; +} + +const WarningRecordList: React.FC = (props) => { + + const { + dataSource = [], + viewLargerImageModalRef, + selectedRecordId, + handleDownloadImg, + onRecordClick, + isRecordListLoading, + recordListTitle, + style, + cardStyle, + imgStyle, + largeImageTitle + } = props + + return ( +
+
{recordListTitle}
+
+ { + isRecordListLoading ? +
+ } /> +
+ : (dataSource?.length) > 0 ? + + {dataSource?.map((record, index) => { + if (index > 2) return + return ( { onRecordClick?.(record) }} + selectedRecordId={selectedRecordId} + cardStyle={{ width: 300, height: 264, ...cardStyle }} + imgStyle={{ width: 280, height: 169, ...imgStyle }} + />) + } + )} + + : +
+ +
+ } +
+ {/* 弹窗 绑定ref 后可以调用 handleCancel方法关闭弹窗 show方法打开弹窗 */} + +
+ ) +}; + +export default WarningRecordList; \ No newline at end of file diff --git a/packages/biz/src/RealTimeMonitor/components/WarningRecordList/index.less b/packages/biz/src/RealTimeMonitor/components/WarningRecordList/index.less new file mode 100644 index 0000000..e348f82 --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/components/WarningRecordList/index.less @@ -0,0 +1,20 @@ +.zhst-biz-warning-record-list { + display: flex; + flex-direction: column; + border-left: solid 1px #00000026; + width: 320px; + + .header { + width: 100%; + height: 48px; + background-color: #EFF2F4; + padding: 10px 20px; + box-sizing: border-box; + } + + .body { + padding: 10px; + overflow: hidden; + flex: 1; + } +} \ No newline at end of file diff --git a/packages/biz/src/RealTimeMonitor/components/WarningRecordList/index.tsx b/packages/biz/src/RealTimeMonitor/components/WarningRecordList/index.tsx new file mode 100644 index 0000000..3e4aa09 --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/components/WarningRecordList/index.tsx @@ -0,0 +1,2 @@ +import WarningRecordList from './WarningRecordList' +export default WarningRecordList \ No newline at end of file diff --git a/packages/biz/src/RealTimeMonitor/components/WindowToggle/WindowToggle.tsx b/packages/biz/src/RealTimeMonitor/components/WindowToggle/WindowToggle.tsx new file mode 100644 index 0000000..0211f0f --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/components/WindowToggle/WindowToggle.tsx @@ -0,0 +1,71 @@ +import React, { useState } from 'react'; +import { Segmented } from 'antd'; +import { AppstoreOutlined, BarsOutlined } from '@ant-design/icons'; +import { VideoPlayerCard, VideoPlayerCardProps } from '@zhst/biz'; +import './index.less' +import { theme } from 'antd/lib'; + +type Size = 'large' | 'small' + +interface WindowToggleProps { + dataSource?: VideoPlayerCardProps[]; + handleWindowClick?: (key?: string) => void; + handleCloseButtonClick?: (key?: string) => void; + selectedWindowKey?: string; +} + +export const WindowToggle: React.FC = (props) => { + + const { dataSource = [], handleWindowClick, handleCloseButtonClick, selectedWindowKey } = props + const [size, setSize] = useState("large"); + const { useToken } = theme + const { token } = useToken() + + const getLabelStyle = (isSelected: boolean) => ({ + padding: "0 11px", background: "#fff", + ...(isSelected ? { background: token.colorPrimary, color: '#fff' } : {}), + }); + + + return ( +
+ {/* 切换按钮 */} +
+
}, + { value: 'small', label:
}, + ]} + onChange={(value) => { + // 当一个窗口时 默认 selectedkey 第一条数据的 windowkey + if (value === 'large' && dataSource.length > 0) { + const { windowKey } = dataSource[0] + handleWindowClick?.(windowKey) + } + setSize(value as Size) + }} + /> +
+ +
+ { + dataSource?.map((item, index) => { + if (size === "large" && index > 0) return + return ( + ) + }) + } +
+ + ); +}; + +export default WindowToggle; + diff --git a/packages/biz/src/RealTimeMonitor/components/WindowToggle/index.less b/packages/biz/src/RealTimeMonitor/components/WindowToggle/index.less new file mode 100644 index 0000000..61c77bd --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/components/WindowToggle/index.less @@ -0,0 +1,45 @@ +.zhst-biz-window-toggle { + display: flex; + flex-direction: column; + flex: 1; + + .header { + width: 100%; + height: 48px; + background-color: #EFF2F4; + padding: 10px 20px; + box-sizing: border-box; + + .ant-segmented { + padding: 0; + + .ant-segmented-group { + border-radius: 4px; + overflow: hidden; + + .ant-segmented-item { + border-radius: 0; + + .ant-segmented-item-label { + padding: 0; + } + } + } + } + } + + .body { + flex: 1; + width: 100%; + background-color: #E5EAEC; + padding: 10px; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + + >div { + margin: 10px; + } + } +} \ No newline at end of file diff --git a/packages/biz/src/RealTimeMonitor/components/WindowToggle/index.tsx b/packages/biz/src/RealTimeMonitor/components/WindowToggle/index.tsx new file mode 100644 index 0000000..0fa9c9a --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/components/WindowToggle/index.tsx @@ -0,0 +1,2 @@ +import WindowToggle from './WindowToggle' +export default WindowToggle \ No newline at end of file diff --git a/packages/biz/src/RealTimeMonitor/demo/base.tsx b/packages/biz/src/RealTimeMonitor/demo/base.tsx new file mode 100644 index 0000000..90338fd --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/demo/base.tsx @@ -0,0 +1,161 @@ + +import React, { useState } from 'react'; +import { IRecord, RealTimeMonitor, VideoPlayerCardProps, useViewLargerImageModal } from '@zhst/biz'; +import { videoData, warningData } from './mock'; +import { Space } from 'antd'; +import dayjs from 'dayjs' +import './index.less' + +export default () => { + + // 必须设置初始数据 用于渲染 4个窗口 + const initialVideoDataSource: VideoPlayerCardProps[] = [ + { + windowKey: 'first-window', + }, + { + windowKey: 'second-window', + }, + { + windowKey: 'third-window', + }, + { + windowKey: 'forth-window', + } + ] + const [videoDataSource, setVideoDataSource] = useState(initialVideoDataSource); + const [warningDataSource, setWarningDataSource] = useState(); + const [selectedWindowKey, setSelectedWindowKey] = useState('first-window'); + const [selectedRecordId, setSelectedRecordId] = React.useState() + const [isRecordListLoading, setIsRecordListLoading] = React.useState(false) + // 把弹窗的ref 拿出来 + const viewLargerImageModalRef = useViewLargerImageModal() + + const handleWindowClick = (key?: string) => { + setSelectedWindowKey(key) + } + + const clearWindowData = (key?: string) => { + // 当关闭窗口时 也要刷新 右侧 预警记录接口 不要忘记 + setVideoDataSource((pre) => { + const newVideoDataSource = pre.map((item) => { + if (item.windowKey === key) { + return { windowKey: key }; + } + return item; // 保持不变 + }); + return newVideoDataSource + }) + } + + const handleDownloadImg = (imgSrc?: string) => { + console.log(imgSrc) + // 可以调用 下面 方法关闭弹窗 + // viewLargerImageModalRef.current?.handleCancel() + } + + const onRecordClick = (record?: IRecord) => { + // 点击的时候把数据 拿过来处理一下传给大图弹框 + const { imgSrc, warningType, boxId, position, cabietId, warningTime, warningTimestamp, warningTimeFormat = 'YYYY-MM-DD HH:mm:ss' } = record || {} + const formattedDate = warningTimestamp ? dayjs(warningTimestamp).format(warningTimeFormat) : ''; + const warningTimeShow = warningTime ? warningTime : formattedDate + //用于渲染右侧的 信息 + const warningData = [ + { label: '预警类型', value: warningType }, + { label: '预警时间', value: warningTimeShow }, + { label: '盒子', value: boxId }, + { label: '点位', value: position }, + { label: '柜子ID', value: cabietId }, + ] + // 调用这个方法打开弹框 + viewLargerImageModalRef?.current?.show({ imgSrc: imgSrc, warningData: warningData }) + + setSelectedRecordId(record?.id) + } + + const mockData = () => { + // 请求时需要对应窗口为loading 状态 + setVideoDataSource((pre) => { + const newVideoDataSource: VideoPlayerCardProps[] = pre.map((item) => { + // 开启loading + if (item.windowKey === selectedWindowKey) { + return { ...item, isWindowLoading: true, title: '' } + } + return item + }); + return newVideoDataSource + }) + + // 模拟 视频数据请求 + setTimeout(() => { + // 对后端返回数据进行处理 组装一套符合属性的 数据 + const newVideoData: VideoPlayerCardProps = { imgSrc: videoData.imgSrc, title: videoData.title, } + setVideoDataSource((pre) => { + const newVideoDataSource: VideoPlayerCardProps[] = pre.map((item) => { + // 传给 选中的视频窗口 + if (item.windowKey === selectedWindowKey) { + return { ...item, ...newVideoData } + } + return item + }); + return newVideoDataSource + }) + + setVideoDataSource((pre) => { + const newVideoDataSource: VideoPlayerCardProps[] = pre.map((item) => { + // 关闭loading + if (item.windowKey === selectedWindowKey) { + return { ...item, isWindowLoading: false } + } + return item + }); + return newVideoDataSource + }) + + }, 3000); + + // 模拟 预警记录数据请求 + + setIsRecordListLoading(true) + + setTimeout(() => { + const newWarningDataSource: IRecord[] = warningData.map(o => { + return { + imgSrc: o.imgSrc, + id: o.id, + warningType: o.warningType, + boxId: o.boxId, + position: o.position, + cabietId: o.cabietId, + //,`柜子ID: ${o.cabietId}` + warningInfo: [`盒子${o.boxId}`, `位置${o.position}`, `柜子ID${o.cabietId}`], + // cabietText: `柜子ID: ${o.cabietId}`, + warningTimestamp: o.warningTimestamp, + } + }) + setWarningDataSource(newWarningDataSource) + setIsRecordListLoading(false) + }, 1000) + + } + + return ( + + + + + + + ) +} diff --git a/packages/biz/src/RealTimeMonitor/demo/index.less b/packages/biz/src/RealTimeMonitor/demo/index.less new file mode 100644 index 0000000..71ea110 --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/demo/index.less @@ -0,0 +1,5 @@ +#realtimemonitor-demo-base { + .dumi-default-previewer-demo>div { + width: 100%; + } +} \ No newline at end of file diff --git a/packages/biz/src/RealTimeMonitor/demo/mock.tsx b/packages/biz/src/RealTimeMonitor/demo/mock.tsx new file mode 100644 index 0000000..4497d61 --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/demo/mock.tsx @@ -0,0 +1,65 @@ +export const videoData = { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + // videoSrc: 'ws://10.0.0.7:9033/flv/File/test/test_h264_1.mp4.flv?ip=127.0.0.1', + title: `盒子1 点位1` +} + +export const warningData = [ + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '156156ewr1', + warningType: '火焰识别', + boxId: '2', + position: '2', + cabietId: '002', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + }, + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '156156ewr155', + warningType: '火焰识别', + boxId: '1', + position: '1', + cabietId: '001', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + }, + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '156156rew155', + warningType: '火焰识别', + boxId: '3', + position: '3', + cabietId: '004', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + }, + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '15615615ew5', + warningType: '火焰识别', + boxId: '4', + position: '4', + cabietId: '004', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + }, + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '15615615sdf5', + warningType: '火焰识别', + boxId: '5', + position: '5', + cabietId: '005', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + } +] + + diff --git a/packages/biz/src/RealTimeMonitor/index.md b/packages/biz/src/RealTimeMonitor/index.md new file mode 100644 index 0000000..6571d69 --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/index.md @@ -0,0 +1,37 @@ +--- +group: 数据展示 +category: Components +toc: content +subtitle: 实时监控页面 +title: RealTimeMonitor 实时监控页面 +--- + +# RealTimeMonitor 实时监控页面 + + + + + + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| videoDataSource | 用于渲染 每个窗口的数据 | VideoPlayerCardProps[] | 需要传一组默认值用于窗口的渲染| - | +| warningDataSource | 用于渲染 预警记录的数据 | WindowProps[] | 需要传一组默认值用于窗口的渲染| - | +| handleWindowClick | 用于获取窗口的 windowKey 方便更新对应窗口数据 | (key?: string) => void; | - | - | +| handleCloseButtonClick | 用于点击窗口关闭按钮的事件 | (key?: string) => void; | - | - | +| selectedWindowKey | 选中的窗口的 key 用于控制 选中边框样式 |string| - | - | +| handleDownloadImg | 用于处理查看大图下载图片的事件 | (key?: string) => void; | - | - | +| onRecordClick | 用于处理预警记录卡片点击事件事件 | (key?: string) => void; | - | - | +| selectedRecordId| 用于判断是否显示选中样式 |string| - | - | +| isRecordListLoading | 判断预警记录列表loading状态 |boolean| - | - | +| recordListTitle | 预警记录列表的标题 | string | - | - | +| viewLargerImageModalRef | 查看大图弹窗的ref | viewLargerImageModalRef={viewLargerImageModalRef}| | - | +| viewLargerImageModalRef | 查看大图弹窗的ref |React.RefObject\| - | - | + + + + + + diff --git a/packages/biz/src/RealTimeMonitor/index.tsx b/packages/biz/src/RealTimeMonitor/index.tsx new file mode 100644 index 0000000..00985f9 --- /dev/null +++ b/packages/biz/src/RealTimeMonitor/index.tsx @@ -0,0 +1,2 @@ +import RealTimeMonitor from './RealTimeMonitor' +export default RealTimeMonitor \ No newline at end of file diff --git a/packages/biz/src/VideoPlayerCard/VideoPlayerCard.tsx b/packages/biz/src/VideoPlayerCard/VideoPlayerCard.tsx new file mode 100644 index 0000000..7499d22 --- /dev/null +++ b/packages/biz/src/VideoPlayerCard/VideoPlayerCard.tsx @@ -0,0 +1,101 @@ +import { Card, Space, CardProps, Spin, Button } from 'antd'; +import { theme } from 'antd/lib'; +import { VideoPlayer, type VideoViewRef } from '@zhst/meta'; +import React, { useState, useEffect, ReactNode, useRef } from 'react'; +import { CloseOutlined, LoadingOutlined } from '@ant-design/icons'; +import './index.less' +export interface VideoPlayerCardProps { + windowKey?: string; + selectedWindowKey?: string; + showType?: 'video' | "image"; + imgSrc?: string; + videoSrc?: string; + cardProps?: CardProps; + errorReasonText?: string; + isWindowLoading?: boolean; + size?: 'large' | 'small'; + title?: string | ReactNode + handleCloseButtonClick?: (key?: string) => void; + handleWindowClick?: (key?: string) => void; +} + +export const VideoPlayerCard: React.FC = (props) => { + + const componentName = `zhst-biz-video-player-card`; + const { showType, imgSrc, videoSrc, cardProps, isWindowLoading, errorReasonText, size, title, handleCloseButtonClick, handleWindowClick, windowKey, selectedWindowKey = '' } = props; + const [cardContent, setCardContent] = useState(null); + const { useToken } = theme + const { token } = useToken() + const videoRef = useRef(null) + const selectedBorderStyle = { + border: `2px solid ${token.colorPrimary}`, boxShadow: " 0px 2px 9px 0px rgba(0,0,0,0.16)" + } + const cardStyle: React.CSSProperties = { + ...(size === 'large' ? { height: 931 } : { height: 456, cursor: 'pointer' }), + ...(size === 'small' && selectedWindowKey === windowKey ? selectedBorderStyle : {}) + }; + const videoPlayerCardStyle = size === 'small' ? { width: "calc(50% - 20px)" } : { flex: 1 } + + useEffect(() => { + if (!isWindowLoading && (videoSrc || imgSrc)) { + let contentElement: JSX.Element | null = null; + if (videoSrc) { + contentElement = ( + + ); + videoRef.current?.setShowCrop(true) + + } else if (imgSrc) { + contentElement = ( + 首帧图 + ); + } + setCardContent(contentElement); + } else { + setCardContent(null) + } + }, [showType, imgSrc, videoSrc, isWindowLoading]); + + return ( +
{ handleWindowClick?.(windowKey) }} style={videoPlayerCardStyle}> + +
{title}
+
+ +
+ } + style={{ display: "flex", flexDirection: "column", borderRadius: 4, overflow: "hidden", ...cardStyle }} + bodyStyle={{ flex: 1 }} + {...cardProps} + > + {cardContent ? ( + <> + {cardContent} + + ) : ( +
+ { + isWindowLoading ? +
+ } /> +
+ : !!errorReasonText && {errorReasonText} + } +
+ )} + {/* 其他内容 */} +
+
+ ); +}; + +export default VideoPlayerCard; + diff --git a/packages/biz/src/VideoPlayerCard/demo/base.tsx b/packages/biz/src/VideoPlayerCard/demo/base.tsx new file mode 100644 index 0000000..7063d94 --- /dev/null +++ b/packages/biz/src/VideoPlayerCard/demo/base.tsx @@ -0,0 +1,19 @@ + +import React from 'react'; +import { VideoPlayerCard, type VideoPlayerCardProps } from '@zhst/biz'; +import { Space } from 'antd'; + +const mockVideoPlayerCardProps: VideoPlayerCardProps = { + showType: 'image', + // videoSrc: 'https://example.com/video.mp4', + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', // 如果需要在没有视频时显示图片封面 + size: 'small', +}; + +export default () => { + return ( + + + + ) +} diff --git a/packages/biz/src/VideoPlayerCard/index.less b/packages/biz/src/VideoPlayerCard/index.less new file mode 100644 index 0000000..0f87e3e --- /dev/null +++ b/packages/biz/src/VideoPlayerCard/index.less @@ -0,0 +1,30 @@ +.zhst-biz-video-player-card { + .ant-card-head { + padding: 0 20px; + } + + .ant-card-body { + padding: 0; + overflow: hidden; + border-radius: 0; + + .zhst-image__video-view { + height: 100%; + } + } + + .card-close-button { + .ant-btn { + padding: 0 3px; + height: 22px; + color: #00000073; + } + + .ant-btn:hover { + padding: 0 3px; + height: 22px; + color: #000000e0; + } + } + +} \ No newline at end of file diff --git a/packages/biz/src/VideoPlayerCard/index.md b/packages/biz/src/VideoPlayerCard/index.md new file mode 100644 index 0000000..44bff14 --- /dev/null +++ b/packages/biz/src/VideoPlayerCard/index.md @@ -0,0 +1,35 @@ +--- +group: 数据展示 +category: Components +subtitle: 视频播放卡片 +toc: content +title: VideoPlayerCard 视频播放卡片 +--- + +# VideoPlayerCard 视频播放卡片 + + + + + + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| windowKey | 每个卡片的唯一标识 | string | - | - | +| selectedWindowKey | 选中的窗口key | string | - | - | +| imgSrc | 图片地址 | string | - | - | +| videoSrc | 视频地址 | string | - | - | +| errorReasonText | 加载失败的错误提示 | string | - | - | +| isWindowLoading | 判断是否显示loading | boolean | - | - | +| size | 设置窗口大小 | 'large' \| 'small' | - | - | +| title | 设置窗口标题 | string \| ReactNode | - | - | +| handleCloseButtonClick | 处理关闭按钮事件 | (key?: string) => void| - | - | +| handleWindowClick | 处理窗口点击事件 | (key?: string) => void| - | - | + + + + + + diff --git a/packages/biz/src/VideoPlayerCard/index.tsx b/packages/biz/src/VideoPlayerCard/index.tsx new file mode 100644 index 0000000..20710eb --- /dev/null +++ b/packages/biz/src/VideoPlayerCard/index.tsx @@ -0,0 +1,3 @@ +import VideoPlayerCard from './VideoPlayerCard' +export type { VideoPlayerCardProps } from './VideoPlayerCard' +export default VideoPlayerCard \ No newline at end of file diff --git a/packages/biz/src/ViewLargerImageModal/ViewLargerImageModal.tsx b/packages/biz/src/ViewLargerImageModal/ViewLargerImageModal.tsx new file mode 100644 index 0000000..f4475bd --- /dev/null +++ b/packages/biz/src/ViewLargerImageModal/ViewLargerImageModal.tsx @@ -0,0 +1,86 @@ +import React, { useImperativeHandle, useRef, useState, forwardRef } from 'react'; +import { Modal, ModalProps, Space, SpaceProps } from 'antd'; +import theme from 'antd/lib/theme'; +import { DownloadOutlined } from '@ant-design/icons'; +import './index.less' + +type ViewLargerImageModalParams = { + imgSrc?: string; + warningData?: { + label?: string; + value?: string; + }[]; +}; + +export interface ViewLargerImageModalRef { + show: (params?: ViewLargerImageModalParams) => void; + handleCancel: () => void; +} + +export interface ViewLargerImageModalProps { + imgStyle?: React.CSSProperties; + downloadImg?: (imgSrc?: string) => void; + title?: string; + downloadText?: string; + modalProps?: ModalProps + spaceProps?: SpaceProps; +} + +export const ViewLargerImageModal = forwardRef( + (props, ref) => { + + const { modalProps, downloadImg, imgStyle, title = '预警大图', downloadText = '下载大图', spaceProps } = props + const { useToken } = theme + const { token } = useToken() + const [open, setOpen] = useState(false); + const [imgSrc, setImgSrc] = useState(); + const [warningData, setWarningData] = useState(); + + const handleCancel = () => { + setOpen(false); + } + + useImperativeHandle(ref, () => { + return { + show: (_params) => { + setOpen(true); + setImgSrc(_params?.imgSrc) + setWarningData(_params?.warningData) + }, + handleCancel + }; + }); + + return ( + + + {title} +
+ {warningData?.map(({ label, value }) => ( +
+ {`${label}: `} + {value} +
+ ))} + {imgSrc && downloadImg &&
downloadImg?.(imgSrc)} >{downloadText}
} +
+
+
+ ); + } +) + +export default ViewLargerImageModal; + +export const useViewLargerImageModal = () => { + return useRef(null); +}; \ No newline at end of file diff --git a/packages/biz/src/ViewLargerImageModal/demo/base.tsx b/packages/biz/src/ViewLargerImageModal/demo/base.tsx new file mode 100644 index 0000000..0668f55 --- /dev/null +++ b/packages/biz/src/ViewLargerImageModal/demo/base.tsx @@ -0,0 +1,94 @@ + +import React from 'react'; +import { ViewLargerImageModal, WarningRecordCard, IRecord, useViewLargerImageModal } from '@zhst/biz'; +import { Space } from 'antd'; +import dayjs from 'dayjs'; + +// 结合预警图列表 演示查看预警大图的使用 例如 后端返回这样的数据结构 +const backEndData = [ + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '1561561', + warningType: '火焰识别', + boxId: '2', + position: '2', + cabietId: '002', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + }, + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '156156155', + warningType: '火焰识别', + boxId: '1', + position: '1', + cabietId: '001', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + } +] + +// 前端处理数据结构 +const dataSource = backEndData.map(o => { + return { + imgSrc: o.imgSrc, + id: o.id, + warningType: o.warningType, + boxId: o.boxId, + position: o.position, + cabietId: o.cabietId, + //,`柜子ID ${o.cabietId}` + warningInfo: [`盒子${o.boxId}`, `位置${o.position}`], + cabietText: `柜子ID: ${o.cabietId}`, + warningTimestamp: o.warningTimestamp, + } +}) + + + +export default () => { + + const [selectedRecordId, setSelectedRecordId] = React.useState() + + // 把弹窗的ref 拿出来 + const viewLargerImageModalRef = useViewLargerImageModal() + + const handleDownloadImg = () => { + console.log('download') + // 可以调用 下面 方法关闭弹窗 + // viewLargerImageModalRef.current?.handleCancel() + } + + const handleClick = (record?: IRecord) => { + // 点击的时候把数据 拿过来处理一下传给大图弹框 + const { imgSrc, warningType, boxId, position, cabietId, warningTime, warningTimestamp, warningTimeFormat = 'YYYY-MM-DD HH:mm:ss' } = record || {} + const formattedDate = warningTimestamp ? dayjs(warningTimestamp).format(warningTimeFormat) : ''; + const warningTimeShow = warningTime ? warningTime : formattedDate + //用于渲染右侧的 信息 + const warningData = [ + { label: '预警类型', value: warningType }, + { label: '预警时间', value: warningTimeShow }, + { label: '盒子', value: boxId }, + { label: '点位', value: position }, + { label: '柜子ID', value: cabietId }, + ] + // 调用这个方法打开弹框 + viewLargerImageModalRef?.current?.show({ imgSrc: imgSrc, warningData: warningData }) + + setSelectedRecordId(record?.id) + } + + return ( + <> + + { + dataSource?.map((record) => { handleClick(record) }} selectedRecordId={selectedRecordId} />) + } + + {/* 弹窗 绑定ref 后可以调用 handleCancel方法关闭弹窗 show方法打开弹窗 */} + + + ) +} diff --git a/packages/biz/src/ViewLargerImageModal/index.less b/packages/biz/src/ViewLargerImageModal/index.less new file mode 100644 index 0000000..32363d0 --- /dev/null +++ b/packages/biz/src/ViewLargerImageModal/index.less @@ -0,0 +1,62 @@ +.zhst-biz-view-warning-larger-image-modal { + font-family: MicrosoftYaHei; + + .ant-modal-content { + padding: 0; + height: 492px; + border-radius: 6px; + overflow: hidden; + + .ant-modal-close { + top: 14px; + right: 16px; + } + + .ant-modal-header { + height: 48px; + line-height: 48px; + margin-bottom: 0; + + .ant-modal-title { + height: 100%; + line-height: 48px; + font-weight: bold; + padding-left: 20px; + } + } + + .ant-modal-body { + height: 444px; + + >div { + width: 100%; + height: 100%; + align-items: flex-start; + + >div:nth-child(2) { + position: relative; + flex: 1; + box-sizing: border-box; + height: 100%; + padding: 30px 16px; + + .right-context>div { + margin-bottom: 20px; + } + + .right-context .context-key { + font-weight: bold; + } + + .img-download { + position: absolute; + bottom: 0; + cursor: pointer; + } + + } + + } + } + } +} \ No newline at end of file diff --git a/packages/biz/src/ViewLargerImageModal/index.md b/packages/biz/src/ViewLargerImageModal/index.md new file mode 100644 index 0000000..3ee9fe7 --- /dev/null +++ b/packages/biz/src/ViewLargerImageModal/index.md @@ -0,0 +1,29 @@ +--- +group: 数据展示 +category: Components +subtitle: 查看大图弹窗 +toc: content +title: ViewLargerImageModal 查看大图弹窗 +--- + +# ViewLargerImageModal 查看大图弹窗 + + + + + + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| show() |通过 ref 用于开启弹窗 可以将点击的 记录传给弹窗| | | | +| handleCancel() | 通过 ref 用于关闭弹窗 | | | | +| imgSrc | 图片地址 |string | | | +| contextData | 大图显示的数据 | | | | +| imgStyle | 用于修改图片样式 | | | | +| downloadImg | 传入下载图片的方法 | | | | +| title | 弹窗标题 | string | | | +| downloadText | 下载按钮文本 | string | | | +| modalProps | 弹窗属性 | | | | + diff --git a/packages/biz/src/ViewLargerImageModal/index.tsx b/packages/biz/src/ViewLargerImageModal/index.tsx new file mode 100644 index 0000000..2780f86 --- /dev/null +++ b/packages/biz/src/ViewLargerImageModal/index.tsx @@ -0,0 +1,4 @@ +import ViewLargerImageModal, { useViewLargerImageModal } from './ViewLargerImageModal' +export type { ViewLargerImageModalRef, ViewLargerImageModalProps } from './ViewLargerImageModal' +export default ViewLargerImageModal; +export { useViewLargerImageModal }; \ No newline at end of file diff --git a/packages/biz/src/WarningRecordCard/WarningRecordCard.tsx b/packages/biz/src/WarningRecordCard/WarningRecordCard.tsx new file mode 100644 index 0000000..4833868 --- /dev/null +++ b/packages/biz/src/WarningRecordCard/WarningRecordCard.tsx @@ -0,0 +1,109 @@ +import { Card, Space, Divider, CardProps } from 'antd'; +import { theme } from 'antd/lib'; +import React from 'react'; +import dayjs from 'dayjs'; +import './index.less' +export interface IRecord { + + imgSrc?: string; + + id?: string; + /** + * 预警类型 + */ + warningType?: string; + /* + 用于显示 盒子 点位 柜子 等信息 + */ + warningInfo?: string[] + /* + 右侧 柜子id 显示 + /* + 盒子 ID + */ + boxId: string; + /* + 位置信息 + */ + position: string; + /* + 柜子id + */ + cabietId?: string; + /* + 直接传格式化好的时间 + /* + 右侧 柜子id 显示 + */ + cabietText?: string; + /* + 直接传格式化好的时间 + */ + warningTime?: string; + /* + 传格时间戳 + */ + warningTimestamp?: string | number + /* + 传格时间格式 + @default YYYY-MM-DD HH:mm:ss + */ + warningTimeFormat?: string; + +}; + +export interface WarningRecordCardProps { + record?: IRecord; + onRecordClick?: (record?: IRecord) => void; + style?: React.CSSProperties; + cardProps?: CardProps; + selectedRecordId?: string; + cardStyle?: React.CSSProperties; + imgStyle?: React.CSSProperties; +}; + +export const WarningRecordCard: React.FC = (props) => { + + const componentName = `zhst-biz-warning-record-card`; + const { record, onRecordClick, style, cardProps, selectedRecordId, cardStyle, imgStyle } = props; + const { imgSrc, id, warningType, warningInfo = [], cabietText, warningTime, warningTimestamp, warningTimeFormat = 'YYYY-MM-DD HH:mm:ss' } = record || {} + const formattedDate = warningTimestamp ? dayjs(warningTimestamp).format(warningTimeFormat) : ''; + const warningTimeShow = warningTime ? warningTime : formattedDate + const { useToken } = theme + const { token } = useToken() + const selectedBorderStyle = { + border: `2px solid ${token.colorPrimary}`, boxShadow: " 0px 2px 9px 0px rgba(0,0,0,0.16)" + } + const selectedCardStyle: React.CSSProperties = { + ...(selectedRecordId === record?.id ? selectedBorderStyle : {}) + }; + + const handleClick = () => { + onRecordClick?.(record); + }; + + return ( +
+ } + style={{ width: 356, height: 302, padding: 10, borderRadius: 4, ...selectedCardStyle, ...cardStyle }} + {...cardProps} + > +
+
{warningType}
+ }> + {warningInfo?.map((item, index) => ( +
+ {item} +
+ ))} +
+
{warningTimeShow}
+
+
{cabietText}
+
+
+ ); +}; + +export default WarningRecordCard; diff --git a/packages/biz/src/WarningRecordCard/demo/base.tsx b/packages/biz/src/WarningRecordCard/demo/base.tsx new file mode 100644 index 0000000..51a8039 --- /dev/null +++ b/packages/biz/src/WarningRecordCard/demo/base.tsx @@ -0,0 +1,56 @@ + +import React from 'react'; +import { WarningRecordCard } from '@zhst/biz'; +import { Space } from 'antd'; + +// 例如 后端返回这样的数据结构 +const backEndData = [ + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '1561561', + warningType: '火焰识别', + boxId: '2', + position: '2', + cabietId: '002', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + }, + { + imgSrc: 'https://i.yourimageshare.com/lRHiD2UnAT.png', + id: '156156155', + warningType: '火焰识别', + boxId: '1', + position: '1', + cabietId: '001', + // warningTime: "2023-03-01 ", + warningTimestamp: Date.now(), + // warningTimeFormat:"YYYY-MM-DD" + } +] + +// 前端处理数据结构 +const dataSource = backEndData.map(o => { + return { + imgSrc: o.imgSrc, + id: o.id, + warningType: o.warningType, + boxId: o.boxId, + position: o.position, + cabietId: o.cabietId, + warningInfo: [`盒子${o.boxId}`, `位置${o.position}`, `柜子ID${o.cabietId}`], + // cabietText: `柜子ID: ${o.cabietId}`, + warningTimestamp: o.warningTimestamp, + } +}) + +export default () => { + + return ( + + { + dataSource?.map((record) => ) + } + + ) +} diff --git a/packages/biz/src/WarningRecordCard/index.less b/packages/biz/src/WarningRecordCard/index.less new file mode 100644 index 0000000..7cfba38 --- /dev/null +++ b/packages/biz/src/WarningRecordCard/index.less @@ -0,0 +1,27 @@ +.zhst-biz-warning-record-card { + cursor: pointer; + + .ant-card-body { + padding: 0; + font-family: MicrosoftYaHei; + line-height: 19px; + display: flex; + margin-top: 10px; + + .left-context { + flex: 1; + + >div { + margin-top: 6px; + } + + >div:nth-child(1) { + margin-top: 0; + } + } + + .warning-type { + font-weight: bold; + } + } +} \ No newline at end of file diff --git a/packages/biz/src/WarningRecordCard/index.md b/packages/biz/src/WarningRecordCard/index.md new file mode 100644 index 0000000..bb9e648 --- /dev/null +++ b/packages/biz/src/WarningRecordCard/index.md @@ -0,0 +1,30 @@ +--- +group: 数据展示 +category: Components +subtitle: 预警记录卡片 +title: WarningRecordCard 预警记录卡片 +--- + +# WarningRecordCard 预警记录卡片 + + + + + + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| imgSrc | 图片src | string | - | - | +| id | 数据的唯一id 用于key 传值| string | - | - | +| warningType | 预警类型 | string | - | - | +| warningInfo | 盒子 点位 柜子 等信息 | string[] | - | - | +| cabietText | 右侧 柜子信息 | string | - | - | +| warningTime | 预警时间 格式化后的时间字符串 | string | - | - | +| warningTimestamp | 预警时间戳 | string \| number | - | - | +| warningTimeFormat | 预警时间格式 | string | YYYY-MM-DD HH:mm:ss | - | + + + + diff --git a/packages/biz/src/WarningRecordCard/index.tsx b/packages/biz/src/WarningRecordCard/index.tsx new file mode 100644 index 0000000..b60bf27 --- /dev/null +++ b/packages/biz/src/WarningRecordCard/index.tsx @@ -0,0 +1,3 @@ +import WarningRecordCard from './WarningRecordCard' +export type { IRecord, WarningRecordCardProps} from './WarningRecordCard' +export default WarningRecordCard \ No newline at end of file diff --git a/packages/biz/src/boxSelectTree/boxSelectTree.tsx b/packages/biz/src/boxSelectTree/boxSelectTree.tsx new file mode 100644 index 0000000..aea65ad --- /dev/null +++ b/packages/biz/src/boxSelectTree/boxSelectTree.tsx @@ -0,0 +1,97 @@ +import React, { FC } from 'react'; +import { Tabs, TabsProps } from 'antd' +import BoxPanel from './components/boxPanel'; +import type { BoxPanelProps } from './components/boxPanel'; + +export interface BoxSelectTreeProps extends BoxPanelProps { + onTabChange?: (e: any) => void + tabsProps?: TabsProps +} + +const BoxSelectTree: FC = (props) => { + const { + data, + boxDataSource = [], + onTabChange, + onSearch, + onItemCheck, + onItemSelect, + onBoxBatchDelete, + onBoxDelete, + onCreateSubmit, + onClockClick, + onImport, + onCreate, + tabsProps, + searchInputProps, + treeProps, + customImport, + showOptions, + extraBtns, + } = props + + const items: TabsProps['items'] = [ + { + key: '1', + label:
盒子组
, + children: ( + + ) + }, + { + key: '2', + label:
盒子
, + children: ( + + ) + }, + ]; + + return ( + origin, align: 'center' }} + {...tabsProps} + /> + ); +}; + +export default BoxSelectTree; diff --git a/packages/biz/src/boxSelectTree/components/boxPanel/index.tsx b/packages/biz/src/boxSelectTree/components/boxPanel/index.tsx new file mode 100644 index 0000000..396e375 --- /dev/null +++ b/packages/biz/src/boxSelectTree/components/boxPanel/index.tsx @@ -0,0 +1,221 @@ +import React, { FC, useState, useRef } from 'react'; +import{ Button, Divider, Input, Space, TreeDataNode } from 'antd' +import { ModalForm, ModalFormProps, ProFormInstance, ProFormText } from '@ant-design/pro-components' +import { ClockCircleOutlined, CloseCircleOutlined, DiffOutlined, FolderAddOutlined, ImportOutlined, SwitcherOutlined } from '@ant-design/icons' +import type { TreeProps, InputProps } from 'antd'; +import type { BoxTreeProps } from '../../../tree'; +import TreeTransferModal from '../../../treeTransferModal' +import BoxTree from '../../../tree'; + +export interface BoxPanelProps { + searchInputProps?: InputProps + showOptions?: boolean + treeProps?: Partial + data: TreeDataNode[] + boxDataSource: TreeDataNode[] + handleImport?: () => void + onSearch?: (e: any) => void + onItemCheck?: TreeProps['onCheck'] + onItemSelect?: TreeProps['onSelect'] + onBoxBatchDelete?: (data?: any) => void + onBoxDelete?: (data?: any) => void + onCreateSubmit?: ModalFormProps['onFinish'] + onClockClick?: () => void + onImport?: () => void + onBatch?: () => void + onCreate?: () => void + customImport?: any + extraBtns?: any +} + +const BoxPanel: FC = (props) => { + const { + searchInputProps, + showOptions = true, + extraBtns, + data = [], + onSearch, + treeProps, + onItemCheck, + onItemSelect, + onCreateSubmit, + onBoxBatchDelete, + onBoxDelete, + onClockClick, + onImport, + onBatch, + onCreate, + boxDataSource, + customImport + } = props + const [isTreeCheckable, setIsTreeCheckable] = useState(false) + const [targetItems, setTargetItems] = useState([]); + const [boxChoiceOpen, setBoxChoiceOpen] = useState(false) + const [checkedKeys, setCheckedKeys] = useState([]); + const createFormRef = useRef< + ProFormInstance<{ + name: string; + boxList?: any[]; + }> + >() + + /** + * 修改选择状态 + * @param _data + */ + const handleCheckable = () => { + setIsTreeCheckable(pre => !pre) + } + + const onTreeCheck: TreeProps['onCheck'] = (keys: any, info) => { + let _targetItems: TreeDataNode[] = [] + setCheckedKeys(keys) + info.checkedNodes.forEach(o => { + o.isLeaf && _targetItems.push(o) + }) + setTargetItems(_targetItems) + } + + /** + * 删除 + * @param key + * @param param1 + */ + const onItemDelete = (key: any, { keys }: any) => { + setCheckedKeys(pre => { + const newKeys = pre.filter(_key => !keys.includes(_key)) + return newKeys + }) + setTargetItems(pre => pre.filter(o => o.key !== key)) + } + + // 盒子点击确定 + const onBoxChoiceOk = async (data: any) => { + createFormRef.current?.setFieldValue('boxList', data) + createFormRef.current?.setFieldValue('boxName', 123) + console.log(createFormRef.current?.getFieldValue('boxList')) + setBoxChoiceOpen(false) + } + + // 盒子选择重置 + const onBoxChoiceReset = () => { + setCheckedKeys([]) + setTargetItems([]) + } + + return ( +
+ {/* 盒子选择弹框 */} + setBoxChoiceOpen(false)} + onRadioChange={(e) => console.log('radio', e.target.value)} // 顶部 radio 事件 + dataSource={boxDataSource} // 数据源 + targetItems={targetItems} // 右侧选中项 + checkedKeys={checkedKeys} // 左侧选中 + onReset={onBoxChoiceReset} // 重置按钮事件 + onOk={onBoxChoiceOk} // 确定按钮事件 + onTreeCheck={onTreeCheck} // 树check选中事件 + onItemDelete={onItemDelete} // 右侧点击删除事件 + /> + + + onSearch?.(e)} placeholder='请输入盒子名称' {...searchInputProps} /> + {customImport || ( + <> + + + {onCreate ? + ( + + ) : ( + + width={'600px'} + open={onCreate ? false : undefined} + formRef={createFormRef} + title="新建组" + modalProps={{ destroyOnClose: true }} + layout='horizontal' + labelCol={{ span: 6 }} + wrapperCol={{ span: 18 }} + trigger={} + submitter={{ + searchConfig: { + submitText: '确定', + resetText: '取消', + }, + }} + onFinish={onCreateSubmit} + > + + + { + createFormRef.current?.setFieldValue('boxList', null) + onBoxChoiceReset() + }} >恢复默认 + setBoxChoiceOpen(true)}>范围选择 + + ) + }} + /> + + ) + } + + {/* @ts-ignore */} + + + + + )} + {extraBtns} + + +
+ ) +} + +export default BoxPanel diff --git a/packages/biz/src/boxSelectTree/demo/async.tsx b/packages/biz/src/boxSelectTree/demo/async.tsx new file mode 100644 index 0000000..ac573e8 --- /dev/null +++ b/packages/biz/src/boxSelectTree/demo/async.tsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; +import { BoxSelectTree } from '@zhst/biz'; +import { boxDataSource } from './mock' + +interface DataNode { + title: string; + key: string; + isLeaf?: boolean; + children?: DataNode[]; +} + +const initTreeData: DataNode[] = [ + { title: '盒子组1', key: '0' }, + { title: '盒子组2', key: '1' }, + { title: '盒子组3', key: '2', isLeaf: true }, +]; + +/** + * 递归更新树结构 + * @param list 原数组列表 + * @param key 当前选中的项 + * @param children 需要插入更新的数据 + * @returns newList + */ +const updateTreeData = (list: DataNode[], key: React.Key, children: DataNode[]): DataNode[] => + list.map((node) => { + if (node.key === key) { + return { + ...node, + children, + }; + } + if (node.children) { + return { + ...node, + children: updateTreeData(node.children, key, children), + }; + } + return node; + }); + +const demo = () => { + const [treeData, setTreeData] = useState(initTreeData); + const [activeKey, setActiveKey] = useState('1') + const [checkedKeys, setCheckedKeys] = useState([]); + + const onLoadData = ({ key, children }: any) => + new Promise((resolve) => { + if (children) { + resolve(); + return; + } + setTimeout(() => { + setTreeData((origin) => + updateTreeData(origin, key, [ + { title: '盒子', key: `${key}-0` }, + { title: '盒子', key: `${key}-1` }, + ]), + ); + resolve(); + }, 1000); + }); + + return ( +
+ onLoadData(_params), + checkedKeys + }} + /> +
+ ); +}; + +export default demo; diff --git a/packages/biz/src/boxSelectTree/demo/basic.tsx b/packages/biz/src/boxSelectTree/demo/basic.tsx new file mode 100644 index 0000000..8bb399a --- /dev/null +++ b/packages/biz/src/boxSelectTree/demo/basic.tsx @@ -0,0 +1,86 @@ +import React, { useState } from 'react'; +import { BoxSelectTree } from '@zhst/biz'; +import { treeData, boxDataSource } from './mock' +import { Select, TreeProps, Modal, Checkbox } from 'antd'; +import { BOX_TYPE_LIST } from '../../utils/constants'; + +const { Option } = Select + +const demo = () => { + const [activeKey, setActiveKey] = useState('1') + const [searchType, setSearchType] = useState('1') + const [searchVal, setSearchVal] = useState('') + const [checkedKeys, setCheckedKeys] = useState([]); + const [modal, contextHolder] = Modal.useModal(); + + const onTreeCheck: TreeProps['onCheck'] = (keys: any) => { + setCheckedKeys(keys) + } + + const onBoxBatchDelete = () => { + console.log('盒子批量删除', checkedKeys) + modal.warning({ + content: ( +
+

请确认是否从系统中删除盒子?

+ 所选盒子同时从系统中删除 +
+ ), + cancelText: '取消', + okText: '确定', + onOk() {}, + onCancel() {} + }) + } + + return ( +
+ {contextHolder} + console.log('搜索', e)} + onCreateSubmit={async (_data) => { + console.log('新建盒子', _data) + return true + }} + onItemCheck={onTreeCheck} + onItemSelect={e => console.log('onItemSelect', e)} + onTabChange={val => setActiveKey(val)} + onBoxBatchDelete={onBoxBatchDelete} + onClockClick={() => console.log('时钟点击事件')} + onImport={() => console.log('导入盒子')} + tabsProps={{ + activeKey, + }} + searchInputProps={{ + addonBefore: ( + + ), + onChange: e => setSearchVal(e.target.value), + value: searchVal + }} + treeProps={{ + onItemDelete: data => console.log('删除', data), + onItemSetting: data => console.log('配置事件', data), + onItemRename: (data) =>console.log('重命名', data), + onItemRenameFinish: async (val, data) => console.log('盒子重命名提交(返回boolean,控制弹框显示\隐藏)', val, data), + checkedKeys, + }} + /> +
+ ); +}; + +export default demo; diff --git a/packages/biz/src/boxSelectTree/demo/extraBtns.tsx b/packages/biz/src/boxSelectTree/demo/extraBtns.tsx new file mode 100644 index 0000000..d889b8b --- /dev/null +++ b/packages/biz/src/boxSelectTree/demo/extraBtns.tsx @@ -0,0 +1,28 @@ +import React, { useState } from 'react'; +import { BoxSelectTree } from '@zhst/biz'; +import { treeData, boxDataSource } from './mock' +import { Button } from 'antd'; + +const demo = () => { + const [activeKey, setActiveKey] = useState('1') + const [checkedKeys, setCheckedKeys] = useState([]); + + return ( +
+ 自定义按钮} + tabsProps={{ + activeKey, + }} + treeProps={{ + checkedKeys + }} + /> +
+ ); +}; + +export default demo; diff --git a/packages/biz/src/boxSelectTree/demo/mock.tsx b/packages/biz/src/boxSelectTree/demo/mock.tsx new file mode 100644 index 0000000..d6bbc91 --- /dev/null +++ b/packages/biz/src/boxSelectTree/demo/mock.tsx @@ -0,0 +1,54 @@ +import { TreeData } from "@zhst/biz"; + +export const boxDataSource: TreeData[] = [ + { + title: '全部盒子', + key: '0-0', + children: [ + { + title: '盒子组1', + key: '0-0-0', + children: [ + { + title: '摄像头1', + key: '0-0-0-0', + isCamera: true + }, + { + title: '摄像头2', + key: '0-0-0-1', + isCamera: true + }, + ], + }, + { + title: '盒子组2', + key: '0-0-1', + children: [ + { + title: '摄像头4', + key: '0-0-1-0', + isCamera: true + } + ], + }, + ], + }, +]; + + +export const treeData: TreeData[] = [ + { key: '0-1-0', title: '分组0-1-0', isLeaf: true, checkable: false }, + { key: '0-1-1', title: '分组0-1-1', isLeaf: true, checkable: false }, + { key: '0-1-2', title: '分组0-1-2', isLeaf: true, checkable: false }, + { + key: '0-1-3', + title: '分组0-1-3', + isLeaf: false, + children: [ + { key: '0-1-3-1', title: '分组0-1-3-1', isLeaf: true, isCamera: true }, + { key: '0-1-3-2', title: '分组0-1-3-2', isLeaf: true, isCamera: true }, + { key: '0-1-3-3', title: '分组0-1-3-3', isLeaf: true, isCamera: true }, + ], + }, +]; diff --git a/packages/biz/src/boxSelectTree/demo/noOptions.tsx b/packages/biz/src/boxSelectTree/demo/noOptions.tsx new file mode 100644 index 0000000..a2e34e7 --- /dev/null +++ b/packages/biz/src/boxSelectTree/demo/noOptions.tsx @@ -0,0 +1,61 @@ +import React, { useState } from 'react'; +import { BoxSelectTree } from '@zhst/biz'; +import { Button, Select, TreeProps } from 'antd'; +import { FilterOutlined } from '@ant-design/icons'; +import { BOX_TYPE_LIST } from '../../utils/constants'; +import { treeData, boxDataSource } from './mock' + +const { Option } = Select + +const demo = () => { + const [activeKey, setActiveKey] = useState('1') + const [searchType, setSearchType] = useState('1') + const [searchVal, setSearchVal] = useState('') + const [checkedKeys, setCheckedKeys] = useState([]); + + const onTreeCheck: TreeProps['onCheck'] = (keys: any) => { + setCheckedKeys(keys) + } + + return ( +
+ console.log('搜索', e)} + onItemCheck={onTreeCheck} + onItemSelect={e => console.log('onItemSelect', e)} + onTabChange={val => setActiveKey(val)} + onBoxDelete={data => console.log('盒子删除', data)} + showOptions={false} + tabsProps={{ + activeKey, + }} + customImport={
+ ); +}; + +export default demo; diff --git a/packages/biz/src/boxSelectTree/index.md b/packages/biz/src/boxSelectTree/index.md new file mode 100644 index 0000000..48c22b1 --- /dev/null +++ b/packages/biz/src/boxSelectTree/index.md @@ -0,0 +1,38 @@ +--- +category: Components +title: BoxSelectTree 盒子树 +toc: content +demo: + cols: 2 +group: + title: 进阶组件 +--- + +盒子树 + +## 代码演示 + +基本用法 +自定义其它按钮 +不显示其它按钮 +异步加载数据 + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| data | 数据源 | Array[] | [] | - | +| onSearch | 搜索监听 | function: (e) => void | - | - | +| onItemSelect | 树当前选中(单选) | function: (e) => void | - | - | +| onItemCheck | 树选择(支持多选) | function: (e) => void | - | - | +| tabsProps | Tabs组件的Props | antd的Tabs组件 | - | - | +| searchInputProps | 搜索框的Props | antd的Input组件 | - | - | +| onTabChange | tab切换监听 | function: (e) => void | - | - | +| onBoxDelete | 盒子删除事件 | function: (e) => void | - | - | +| onBoxBatchDelete | 盒子批量删除事件 | function: (e) => void | - | - | +| onCreateSubmit | 新建提交事件 | function: (e) => void | - | - | +| onImport | 监听导入盒子点击事件 | function: () => void | - | - | +| onClockClick | 监听时钟点击事件 | function: () => void | - | - | +| onCreate | 监听创建点击事件 | function: () => void | 如果不传默认用自带的创建事件 | - | +| showOptions | 展示其它功能按钮 | boolean | true | - | + diff --git a/packages/biz/src/boxSelectTree/index.tsx b/packages/biz/src/boxSelectTree/index.tsx new file mode 100644 index 0000000..8adaf1d --- /dev/null +++ b/packages/biz/src/boxSelectTree/index.tsx @@ -0,0 +1,5 @@ +import BoxSelectTree from './boxSelectTree'; + +export type { BoxSelectTreeProps } from './boxSelectTree' + +export default BoxSelectTree; diff --git a/packages/biz/src/boxSelectTree/mock.tsx b/packages/biz/src/boxSelectTree/mock.tsx new file mode 100644 index 0000000..cc09c3b --- /dev/null +++ b/packages/biz/src/boxSelectTree/mock.tsx @@ -0,0 +1,34 @@ +import { TreeDataNode } from "antd"; + +export const treeData: TreeDataNode[] = [ + { + title: '全部盒子', + key: '0-0', + children: [ + { + title: '盒子组1', + key: '0-0-0', + children: [ + { + title: '摄像头1', + key: '0-0-0-0', + }, + { + title: '摄像头2', + key: '0-0-0-1', + }, + ], + }, + { + title: '盒子组2', + key: '0-0-1', + children: [ + { + title: '摄像头4', + key: '0-0-1-0' + } + ], + }, + ], + }, +]; diff --git a/packages/biz/src/changelog/index.md b/packages/biz/src/changelog/index.md index d4333e4..c6bd0b1 100644 --- a/packages/biz/src/changelog/index.md +++ b/packages/biz/src/changelog/index.md @@ -1,8 +1,10 @@ --- nav: - title: 元组件 -title: 版本更新日志 -order: 99 + title: 组件库 +title: 业务组件 +toc: content --- + + diff --git a/packages/biz/src/index.md b/packages/biz/src/index.md deleted file mode 100644 index 6ee14d4..0000000 --- a/packages/biz/src/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -nav: - title: 业务组件 -order: 1 -title: 快速上手 ---- - - diff --git a/packages/biz/src/index.tsx b/packages/biz/src/index.tsx index d1ccc9c..2685d54 100644 --- a/packages/biz/src/index.tsx +++ b/packages/biz/src/index.tsx @@ -1,2 +1,18 @@ -export { default as Demo } from './Demo'; export { default as BigImageModal } from './BigImageModal' +export type { BigImageModalProps } from './BigImageModal' +export { default as BoxSelectTree } from './boxSelectTree' +export type { BoxSelectTreeProps } from './boxSelectTree' +export { default as Tree } from './tree' +export type { BoxTreeProps, TreeData } from './tree' +export { default as TreeTransfer } from './treeTransfer' +export type { TreeTransferProps } from './treeTransfer' +export { default as TreeTransferModal } from './treeTransferModal' +export type { TreeTransferModalProps } from './treeTransferModal' +export { default as WarningRecordCard } from './WarningRecordCard' +export type { IRecord, WarningRecordCardProps } from './WarningRecordCard' +export type { ViewLargerImageModalRef, ViewLargerImageModalProps } from './ViewLargerImageModal' +export { default as ViewLargerImageModal, useViewLargerImageModal } from './ViewLargerImageModal' +export type { VideoPlayerCardProps } from './VideoPlayerCard' +export { default as VideoPlayerCard } from './VideoPlayerCard' +export { default as RealTimeMonitor } from './RealTimeMonitor' + diff --git a/packages/biz/src/tree/boxTree.tsx b/packages/biz/src/tree/boxTree.tsx new file mode 100644 index 0000000..f769199 --- /dev/null +++ b/packages/biz/src/tree/boxTree.tsx @@ -0,0 +1,128 @@ +import React, { FC, useState } from 'react'; +import { Tree, Badge, TreeDataNode, Space, TreeProps } from 'antd'; +import theme from 'antd/es/theme' +import { CloseOutlined, EditOutlined, SettingOutlined } from '@ant-design/icons' +import { ModalForm, ProFormText } from '@ant-design/pro-components'; +import './index.less' + +const componentName = 'zhst-biz-tree' +const { useToken } = theme + +export interface BoxTreeProps extends TreeProps { + data: TreeDataNode[] + treeCheckable?: boolean + showItemOption?: boolean + customOptions?: any; + onItemCheck?: TreeProps['onCheck'] + onItemSelect?: TreeProps['onSelect'] + onItemSetting?: (_data: any) => void + onItemDelete?: (_data: any) => void + onItemRename?: (_nodeData: any) => void + onItemRenameFinish?: (_data: any, _nodeData: any) => Promise +} + +const boxTree: FC = (props) => { + const { + onItemSelect, + onItemCheck, + onItemSetting, + onItemDelete, + data = [], + showItemOption = true, + treeCheckable = false, + onItemRename, + onItemRenameFinish, + customOptions + } = props + const { token } = useToken() + const [checkedItem, setCheckedItem] = useState('') + + const cameraStatus = new Map([ + ['0', 'error'], + ['1', 'success'], + ['3', 'processing'], + ['4', 'default'], + ]) + + return ( + { + setCheckedItem(selectedKeys[0]) + onItemSelect?.(selectedKeys, info) + }} + onCheck={onItemCheck} + treeData={data} + titleRender={(_nodeData) => { + return ( +
+ {/* @ts-ignore */} + {!_nodeData.children && _nodeData.isCamera && } + + {_nodeData.title as any} + + {showItemOption && ( + + {customOptions || ( + <> + { + e.preventDefault(); + e.stopPropagation(); + onItemRename?.(_nodeData) + }} />} + submitter={{ + searchConfig: { + submitText: '确定', + resetText: '取消', + }, + }} + onFinish={async (value) => onItemRenameFinish?.(value, _nodeData)} + > + + + { + e.preventDefault(); + e.stopPropagation(); + onItemSetting?.(_nodeData)} + } /> + { + e.preventDefault(); + e.stopPropagation(); + onItemDelete?.(_nodeData) + }} /> + + )} + + )} +
+ ) + }} + {...props} + /> + ); +}; + +export default boxTree; diff --git a/packages/biz/src/tree/demo/basic.tsx b/packages/biz/src/tree/demo/basic.tsx new file mode 100644 index 0000000..9047ef7 --- /dev/null +++ b/packages/biz/src/tree/demo/basic.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Tree } from '@zhst/biz'; +import { treeData } from './mock' + +const demo = () => { + return ( +
+ console.log('多选框', e)} + onItemSelect={e => console.log('当前选中', e)} + onItemDelete={(e) => console.log('删除', e)} + onItemSetting={e => console.log('配置', e)} + onRenameFinish={async (data, pData) => console.log('重命名表单提交', data, pData)} + /> +
+ ); +}; + +export default demo; diff --git a/packages/biz/src/tree/demo/customOptions.tsx b/packages/biz/src/tree/demo/customOptions.tsx new file mode 100644 index 0000000..bcb14fb --- /dev/null +++ b/packages/biz/src/tree/demo/customOptions.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { Tree } from '@zhst/biz'; +import { LoadingOutlined, PlayCircleOutlined, SettingOutlined } from '@ant-design/icons'; +import { treeData } from './mock' + +const demo = () => { + return ( +
+ + + + + + )} + /> +
+ ); +}; + +export default demo; diff --git a/packages/biz/src/tree/demo/customTitleRender.tsx b/packages/biz/src/tree/demo/customTitleRender.tsx new file mode 100644 index 0000000..95f3cd2 --- /dev/null +++ b/packages/biz/src/tree/demo/customTitleRender.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Tree } from '@zhst/biz'; +import { Tooltip } from 'antd'; +import { treeData } from './mock' + +const demo = () => { + return ( +
+ { + const { title } = _nodeData as any + return ( +
+ {title} + +
+ ) + } + } + /> +
+ ); +}; + +export default demo; diff --git a/packages/biz/src/tree/demo/mock.tsx b/packages/biz/src/tree/demo/mock.tsx new file mode 100644 index 0000000..cc09c3b --- /dev/null +++ b/packages/biz/src/tree/demo/mock.tsx @@ -0,0 +1,34 @@ +import { TreeDataNode } from "antd"; + +export const treeData: TreeDataNode[] = [ + { + title: '全部盒子', + key: '0-0', + children: [ + { + title: '盒子组1', + key: '0-0-0', + children: [ + { + title: '摄像头1', + key: '0-0-0-0', + }, + { + title: '摄像头2', + key: '0-0-0-1', + }, + ], + }, + { + title: '盒子组2', + key: '0-0-1', + children: [ + { + title: '摄像头4', + key: '0-0-1-0' + } + ], + }, + ], + }, +]; diff --git a/packages/biz/src/tree/demo/noOption.tsx b/packages/biz/src/tree/demo/noOption.tsx new file mode 100644 index 0000000..8169d25 --- /dev/null +++ b/packages/biz/src/tree/demo/noOption.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { Tree } from '@zhst/biz'; +import { treeData } from './mock' + +const demo = () => { + return ( +
+ +
+ ); +}; + +export default demo; diff --git a/packages/biz/src/tree/index.less b/packages/biz/src/tree/index.less new file mode 100644 index 0000000..9da4e2d --- /dev/null +++ b/packages/biz/src/tree/index.less @@ -0,0 +1,9 @@ +.zhst-biz-tree-item-render { + &_right { + display: none; + } + + &:hover &_right { + display: inline-flex; + } +} diff --git a/packages/biz/src/tree/index.md b/packages/biz/src/tree/index.md new file mode 100644 index 0000000..164a658 --- /dev/null +++ b/packages/biz/src/tree/index.md @@ -0,0 +1,29 @@ +--- +category: Components +title: Tree 树 +toc: content +demo: + cols: 2 +group: + title: 数据展示 + order: 2 +--- + + +## 代码演示 + +基本用法 +自定义渲染界面 +不展示配置项 +自定义配置项 + +## API + +**额外参数可以参考 antd - Tree 组件** + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| data | 数据源 | Array[] | [] | - | +| titleRender | 子项自定义 | ReactNode、 undefined | - | - | +| showItemOption | 是否显示额外配置功能 | boolean | true | - | +| customOptions | 自定义配置项 | any | - | - | diff --git a/packages/biz/src/tree/index.tsx b/packages/biz/src/tree/index.tsx new file mode 100644 index 0000000..7f1277a --- /dev/null +++ b/packages/biz/src/tree/index.tsx @@ -0,0 +1,16 @@ +import { TreeDataNode } from 'antd'; +import BoxTree from './boxTree'; + +export interface TreeData extends TreeDataNode { + children?: TreeDataNode['children'] & { + isCamera?: boolean + /** + * 0-失败 1-成功 2-进行中 3-未知 + */ + status?: '0' | '1' | '2' | '3' + }[] +} + +export type { BoxTreeProps } from './boxTree' + +export default BoxTree; diff --git a/packages/biz/src/treeTransfer/TreeTransfer.tsx b/packages/biz/src/treeTransfer/TreeTransfer.tsx new file mode 100644 index 0000000..c755380 --- /dev/null +++ b/packages/biz/src/treeTransfer/TreeTransfer.tsx @@ -0,0 +1,126 @@ +import React, { useState } from 'react'; +import { Button, Card, Flex, Input, InputProps, Tree } from 'antd'; +import theme from 'antd/es/theme' +import { TransferProps, TreeDataNode, TreeProps } from 'antd'; +import './index.less' +import { DeleteOutlined, DoubleRightOutlined, SearchOutlined } from '@ant-design/icons'; +import { getAllRootKeyById } from './treeTransferHelper'; + +const componentName = 'zhst-biz-treeTransfer' + +export interface TreeTransferProps { + dataSource: TreeDataNode[] + treeProps?: TreeProps + searchInputProps?: InputProps + targetItems: TreeDataNode[]; + checkedKeys: string[]; + onTreeSelect?: TreeProps['onSelect'] + onTreeCheck?: TreeProps['onCheck'] + onItemDelete?: (key: string, info?: { root: TreeDataNode[], keys: string[] }) => void + onChange?: TransferProps['onChange']; + onOk?: (data: any) => void; + onReset?: () => void; +} + +const { useToken } = theme + +const TreeTransfer: React.FC = ({ + dataSource, + treeProps, + searchInputProps, + targetItems = [], + checkedKeys = [], + onTreeCheck, + onTreeSelect, + onItemDelete, + onOk, + onReset +}) => { + + const { token } = useToken() + const [keyWords, setKeyWords ] = useState('') + + function findNodesWithKeyword(_keyWords: string, _treeData: TreeDataNode[]) { + // @ts-ignore + function dfs(node: any) { + return node.filter((item: { title: string | string[]; }) => item.title.includes(_keyWords)) + } + + const data = dfs(_treeData) + return data || []; + } + + return ( + +
+ 可选择的范围
} + bodyStyle={{ padding: 12 }} + > + } onChange={e => setKeyWords(e.target.value)} placeholder='请输入设备名称' {...searchInputProps} /> + onTreeCheck?.(keys, info)} + onSelect={(keys, info) => onTreeSelect?.(keys, info)} + {...treeProps} + /> + + + +
+ 已选择的范围
} + bodyStyle={{ padding: 0 }} + + > +
+ {targetItems.map(item => ( +
{ + e.target.style.backgroundColor = token.colorPrimaryBg + e.target.style.color = token.colorPrimary + }} + onMouseLeave={(e: any) => { + e.target.style.color = token.colorText + e.target.style.backgroundColor = null + }} + > + {item.title as any} +
+ { + const { root, keys } = getAllRootKeyById(item.key as string, dataSource) + onItemDelete?.(item.key as string, { root, keys }) + }} /> +
+
+ ))} + +
+ + + + + + +
+ ); +} + +export default TreeTransfer diff --git a/packages/biz/src/treeTransfer/demo/basic.tsx b/packages/biz/src/treeTransfer/demo/basic.tsx new file mode 100644 index 0000000..c4858d1 --- /dev/null +++ b/packages/biz/src/treeTransfer/demo/basic.tsx @@ -0,0 +1,59 @@ +import React, { useState } from 'react'; +import { TreeTransfer } from '@zhst/biz'; +import { TreeDataNode } from 'antd'; +import { TreeProps } from 'antd/lib'; +import { boxDataSource } from './mock' + +const App: React.FC = () => { + const [targetItems, setTargetItems] = useState([]); + const [checkedKeys, setCheckedKeys] = useState([]); + + const onTreeCheck: TreeProps['onCheck'] = (keys: any, info) => { + let _targetItems: TreeDataNode[] = [] + setCheckedKeys(keys) + info.checkedNodes.forEach(o => { + o.isLeaf && _targetItems.push(o) + }) + setTargetItems(_targetItems) + } + + /** + * 删除 + * @param key + * @param param1 + */ + const onItemDelete = (key: any, { keys }: any) => { + setCheckedKeys(pre => { + const newKeys = pre.filter(_key => !keys.includes(_key)) + console.log('newKeys', newKeys, keys) + return newKeys + }) + setTargetItems(pre => pre.filter(o => o.key !== key)) + } + + const onOk = (data: any) => { + console.log('data', data) + } + + const onReset = () => { + setCheckedKeys([]) + setTargetItems([]) + } + + return ( + console.log('123123') + }} + /> + ) +}; + +export default App; diff --git a/packages/biz/src/treeTransfer/demo/mock.ts b/packages/biz/src/treeTransfer/demo/mock.ts new file mode 100644 index 0000000..0cee481 --- /dev/null +++ b/packages/biz/src/treeTransfer/demo/mock.ts @@ -0,0 +1,35 @@ +import { TreeDataNode } from "antd"; + +export const boxDataSource: TreeDataNode[] = [ + { + key: '0-0', + title: '分组0-0', + isLeaf: false, + checkable: false, + }, + { + key: '0-1', + title: '分组0-1', + isLeaf: false, + children: [ + { key: '0-1-0', title: '分组0-1-0', isLeaf: true, checkable: false }, + { key: '0-1-1', title: '分组0-1-1', isLeaf: true, checkable: false }, + { key: '0-1-2', title: '分组0-1-2', isLeaf: true, checkable: false }, + { + key: '0-1-3', + title: '分组0-1-3', + isLeaf: false, + children: [ + { key: '0-1-3-1', title: '分组0-1-3-1', isLeaf: true }, + { key: '0-1-3-2', title: '分组0-1-3-2', isLeaf: true }, + { key: '0-1-3-3', title: '分组0-1-3-3', isLeaf: true }, + ], + }, + ], + }, + { key: '0-2', title: '分组0-2', isLeaf: false, checkable: false, }, + { key: '0-3', title: '分组0-3', isLeaf: false, checkable: false, }, + { key: '0-4', title: '分组0-4', isLeaf: false, checkable: false, }, + { key: '0-5', title: '分组0-4', isLeaf: false, checkable: false, }, + { key: '0-6', title: '分组0-4', isLeaf: false, checkable: false, }, +]; diff --git a/packages/biz/src/treeTransfer/demo/withModal.tsx b/packages/biz/src/treeTransfer/demo/withModal.tsx new file mode 100644 index 0000000..01c5fe8 --- /dev/null +++ b/packages/biz/src/treeTransfer/demo/withModal.tsx @@ -0,0 +1,127 @@ +import React, { useState } from 'react'; +import { TreeTransfer } from '@zhst/biz'; +import { Button, Modal, Radio, TreeDataNode } from 'antd'; +import { TreeProps } from 'antd/lib'; + +const treeData: TreeDataNode[] = [ + { + key: '0-0', + title: '分组0-0', + isLeaf: false, + checkable: false, + }, + { + key: '0-1', + title: '分组0-1', + isLeaf: false, + children: [ + { key: '0-1-0', title: '分组0-1-0', isLeaf: true, checkable: false }, + { key: '0-1-1', title: '分组0-1-1', isLeaf: true, checkable: false }, + { key: '0-1-2', title: '分组0-1-2', isLeaf: true, checkable: false }, + { + key: '0-1-3', + title: '分组0-1-3', + isLeaf: false, + children: [ + { key: '0-1-3-1', title: '分组0-1-3-1', isLeaf: true }, + { key: '0-1-3-2', title: '分组0-1-3-2', isLeaf: true }, + { key: '0-1-3-3', title: '分组0-1-3-3', isLeaf: true }, + ], + }, + ], + }, + { key: '0-2', title: '分组0-2', isLeaf: false, checkable: false, }, + { key: '0-3', title: '分组0-3', isLeaf: false, checkable: false, }, + { key: '0-4', title: '分组0-4', isLeaf: false, checkable: false, }, + { key: '0-5', title: '分组0-4', isLeaf: false, checkable: false, }, + { key: '0-6', title: '分组0-4', isLeaf: false, checkable: false, }, +]; + +const App: React.FC = () => { + const [targetItems, setTargetItems] = useState([]); + const [checkedKeys, setCheckedKeys] = useState([]); + const [type, setType] = useState('box') + const [open, setOpen] = useState(false) + + const onTreeCheck: TreeProps['onCheck'] = (keys: any, info) => { + let _targetItems: TreeDataNode[] = [] + setCheckedKeys(keys) + info.checkedNodes.forEach(o => { + o.isLeaf && _targetItems.push(o) + }) + setTargetItems(_targetItems) + } + + /** + * 删除 + * @param key + * @param param1 + */ + const onItemDelete = (key: any, { keys }: any) => { + setCheckedKeys(pre => { + const newKeys = pre.filter(_key => !keys.includes(_key)) + console.log('newKeys', newKeys, keys) + return newKeys + }) + setTargetItems(pre => pre.filter(o => o.key !== key)) + } + + const onOk = (data: any) => { + console.log('data', data) + } + + const onReset = () => { + setCheckedKeys([]) + setTargetItems([]) + } + + return ( +
+ + setOpen(false)} + footer={null} + > +
+ setType(e.target.value)} + style={{ marginLeft: '24px', padding: '20px 0' }} + value={type} + > + 盒子 + 盒子组 + + {type === 'box' ? + ( + + ) : ( + + )} +

已选中{targetItems.length}个点位

+
+
+
+ ) +}; + +export default App; diff --git a/packages/biz/src/treeTransfer/index.less b/packages/biz/src/treeTransfer/index.less new file mode 100644 index 0000000..9ffe8cd --- /dev/null +++ b/packages/biz/src/treeTransfer/index.less @@ -0,0 +1,43 @@ +.zhst-biz-treeTransfer { + &-left { + &_card { + width: 500px; + height: 522px; + background-color: #FCFCFC; + } + } + + &-right { + &_card { + width: 300px; + height: 522px; + background-color: #FCFCFC; + + &__items { + padding: 8px 4px; + overflow: scroll; + + &::-webkit-scrollbar { + display: none; + } + + &___item { + margin: 0; + padding: 4px 12px; + cursor: pointer; + } + } + + &__btns { + width: 100%; + padding: 8px; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + box-sizing: border-box; + border-top: 1px solid #f0f0f0; + } + } + } +} diff --git a/packages/biz/src/treeTransfer/index.md b/packages/biz/src/treeTransfer/index.md new file mode 100644 index 0000000..38f801f --- /dev/null +++ b/packages/biz/src/treeTransfer/index.md @@ -0,0 +1,21 @@ +--- +category: Components +title: TreeTransfer 树穿梭框 +toc: content +group: + title: 数据展示 + order: 2 +--- + +盒子树 + +## 代码演示 + +基本用法 +和Modal组合使用 + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| data | 数据源 | Array[] | [] | - | diff --git a/packages/biz/src/treeTransfer/index.tsx b/packages/biz/src/treeTransfer/index.tsx new file mode 100644 index 0000000..f4390fb --- /dev/null +++ b/packages/biz/src/treeTransfer/index.tsx @@ -0,0 +1,7 @@ +import TreeTransfer from "./TreeTransfer"; + +export type { TreeTransferProps } from './TreeTransfer' + +export * from './treeTransferHelper' + +export default TreeTransfer diff --git a/packages/biz/src/treeTransfer/treeTransferHelper.ts b/packages/biz/src/treeTransfer/treeTransferHelper.ts new file mode 100644 index 0000000..3fced7d --- /dev/null +++ b/packages/biz/src/treeTransfer/treeTransferHelper.ts @@ -0,0 +1,62 @@ +export const isChecked = (selectedKeys: React.Key[], eventKey: React.Key) => + selectedKeys.includes(eventKey); + +function isObject(value: any) { + return value !== null && typeof value === 'object' && !Array.isArray(value); +} + +/** + * 通过子元素找到父级节点 + * @param objects + * @param element + * @returns + */ +export const findParentByChild = (objects: any[], propertyValue: string | number, propertyKey: string = 'key') => { + for (let i = 0; i < objects.length; i++) { + const obj = objects[i]; + + if (obj[propertyKey] === propertyValue) { + return obj + } else if (typeof obj === 'object') { + const found = findParentByChild(Object.values(obj), propertyValue); + + if (found) { + return obj + } + } + } + return null; // 如果找不到包含具有指定属性的子对象的父对象,返回 null +} + +export const getAllRootKeyById = (val: string | number, list: any[], key: string = 'key') => { + let keys: any[] = [] + const findParentByChild = (propertyValue: string | number, objects: any[], propertyKey: string) => { + for (let i = 0; i < objects.length; i++) { + const obj = objects[i]; + + if (obj[propertyKey] === propertyValue) { + console.log('obj', obj) + return obj + } else if (typeof obj === 'object') { + const found = findParentByChild(propertyValue, Object.values(obj), propertyKey); + + if (found) { + if (isObject(found)) { + keys.push(found.key) + } + + return obj + } + } + } + return null; // 如果找不到包含具有指定属性的子对象的父对象,返回 null + } + + const data = findParentByChild(val, list, key) + data.key && keys.push(data.key) + + return { + root: data, + keys + } +} diff --git a/packages/biz/src/treeTransferModal/TreeTransferModal.tsx b/packages/biz/src/treeTransferModal/TreeTransferModal.tsx new file mode 100644 index 0000000..303cd40 --- /dev/null +++ b/packages/biz/src/treeTransferModal/TreeTransferModal.tsx @@ -0,0 +1,105 @@ +import React, { FC, useState } from 'react'; +import { Modal, ModalProps, Radio, RadioGroupProps, Select, SelectProps, TransferProps, TreeDataNode, TreeProps } from 'antd'; +import TreeTransfer from '../treeTransfer'; +import { ALL_LIST, BOX_TYPE_LIST } from '../utils/constants'; + +export interface TreeTransferModalProps { + dataSource: TreeDataNode[] + treeProps?: TreeProps + targetItems: TreeDataNode[]; + checkedKeys: string[]; + onTreeSelect?: TreeProps['onSelect'] + onTreeCheck?: TreeProps['onCheck'] + onItemDelete?: (key: string, info?: { root: TreeDataNode[], keys: string[] }) => void + onChange?: TransferProps['onChange']; + onOk?: (data: any) => void; + onReset?: () => void; + open?: boolean + onCancel?: ModalProps['onCancel'] + onRadioChange?: RadioGroupProps['onChange'] + onSelect?: SelectProps['onSelect'] + modalProps?: ModalProps + radioProps?: RadioGroupProps + selectProps?: SelectProps +} + +const TreeTransferModal: FC = (props) => { + const { + open, + dataSource = [], + checkedKeys, + onItemDelete, + onOk, + onCancel, + onReset, + onRadioChange, + onTreeCheck, + onSelect, + targetItems, + modalProps, + radioProps, + selectProps, + } = props + + const [type, setType] = useState('1') + + return ( + +
+
+ { + setType(e.target.value) + onRadioChange?.(e) + }} + style={{ marginLeft: '24px', padding: '20px 0' }} + value={type} + options={BOX_TYPE_LIST} + {...radioProps} + /> + setUrl(e.target.value)} /> + 获取字段: setKeyword(e.target.value)} /> + + +

输出:{outputVal}

+
+ ) +} + +export default demo diff --git a/packages/func/src/string/index.md b/packages/func/src/string/index.md new file mode 100644 index 0000000..82cf768 --- /dev/null +++ b/packages/func/src/string/index.md @@ -0,0 +1,23 @@ +--- +title: 字符串相关 +toc: content +--- + +## 代码演示 + +## getValueByUrl + +通过 url 返回想要的参数 + +```js +import { getValueByUrl } from '@zhst/func' + +const value = getValueByUrl('a', 'http://localhost:30058?a=123&token=asdfasdfsdf') +// --> 123 +const value2 = getValueByUrl('a', '?a=123&token=asdfasdfsdf') +// --> 123 +const value3 = getValueByUrl('a', 'a=123&token=asdfasdfsdf') +// --> 123 +``` + +调试台 diff --git a/packages/func/src/string/index.ts b/packages/func/src/string/index.ts index 2709285..996a23d 100644 --- a/packages/func/src/string/index.ts +++ b/packages/func/src/string/index.ts @@ -47,3 +47,34 @@ export const cutStr = function cutstr(str: string, len: number) { return str; } }; + +/** + * 查看字符串是否为可访问链接 + * @param str 待检查链接 + * @returns + */ +export const isUrl = (str: string) => { + try { + new URL(str); + return true; + } catch (err) { + return false; + } +} + +/** + * 通过url获取值 + * @param key 想要获取的值 + * @param url 需要截取的链接 + */ +export const getValueByUrl = (key: string, str: string) => { + let result = null + + if (isUrl(str)) { + result = new URL(str).searchParams.get(key) + } else { + result = new URLSearchParams(str.indexOf('?') > -1 ? str : `?${str}`).get(key) + } + + return result +} diff --git a/packages/func/src/time/index.md b/packages/func/src/time/index.md new file mode 100644 index 0000000..5ca2ffd --- /dev/null +++ b/packages/func/src/time/index.md @@ -0,0 +1,4 @@ +--- +title: 时间相关 +order: 4 +--- diff --git a/packages/hooks/.fatherrc.ts b/packages/hooks/.fatherrc.ts index 9e3a0ef..f057955 100644 --- a/packages/hooks/.fatherrc.ts +++ b/packages/hooks/.fatherrc.ts @@ -4,4 +4,5 @@ export default defineConfig({ // more father config: https://github.com/umijs/father/blob/master/docs/config.md esm: { output: 'es' }, cjs: { output: 'lib' }, + // umd: { output: 'dist' } }); diff --git a/packages/hooks/CHANGELOG.md b/packages/hooks/CHANGELOG.md index 73733ea..a7f0f66 100644 --- a/packages/hooks/CHANGELOG.md +++ b/packages/hooks/CHANGELOG.md @@ -1,5 +1,99 @@ # @zhst/hooks +## 0.8.10 + +### Patch Changes + +- @zhst/func@0.9.1 + +## 0.8.9 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.9.0 + +## 0.8.8 + +### Patch Changes + +- 初始化物料库 +- Updated dependencies + - @zhst/func@0.8.3 + +## 0.8.7 + +### Patch Changes + +- 初始化物料包 +- Updated dependencies + - @zhst/func@0.8.2 + +## 0.8.6 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.8.1 + +## 0.8.5 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.8.0 + +## 0.8.4 + +### Patch Changes + +- @zhst/func@0.7.5 + +## 0.8.3 + +### Patch Changes + +- 新增 tree 组件的监听事件,优化 meta 全选的回调事件监听 +- Updated dependencies + - @zhst/func@0.7.4 + +## 0.8.2 + +### Patch Changes + +- 修改 boxSelectTree 类型提示 +- Updated dependencies + - @zhst/func@0.7.3 + +## 0.8.1 + +### Patch Changes + +- 优化 boxSelectTree 组件,添加可以自定义配置按钮功能 +- Updated dependencies + - @zhst/func@0.7.2 + +## 0.8.0 + +### Minor Changes + +- @zhst/biz 优化数组件 + +### Patch Changes + +- @zhst/func@0.7.1 + +## 0.7.0 + +### Minor Changes + +- 新增业务组件 Tree、TreeTransfer、TreeTransferModal、BoxSelectTree + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.7.0 + ## 0.6.0 ### Minor Changes diff --git a/packages/hooks/README.md b/packages/hooks/README.md index 69f4d8c..ed73682 100644 --- a/packages/hooks/README.md +++ b/packages/hooks/README.md @@ -1,6 +1,8 @@ +# @zhst/hooks + ## 介绍 -业务中常用函数方法 +常用函数方法 ## 安装 diff --git a/packages/hooks/es/useActivateWrapper/index.d.ts b/packages/hooks/es/useActivateWrapper/index.d.ts new file mode 100644 index 0000000..8c35f0c --- /dev/null +++ b/packages/hooks/es/useActivateWrapper/index.d.ts @@ -0,0 +1,4 @@ +export declare const useUnActivateWrapper: (cb: () => void) => void; +export declare const useActivateWrapper: (cb: any) => null; +export declare const useActivateState: () => boolean; +export default useActivateWrapper; diff --git a/packages/hooks/es/useDeepMemo/index.d.ts b/packages/hooks/es/useDeepMemo/index.d.ts new file mode 100644 index 0000000..ba9fabc --- /dev/null +++ b/packages/hooks/es/useDeepMemo/index.d.ts @@ -0,0 +1,2 @@ +import { DependencyList } from 'react'; +export default function useDeepMemo(factory: () => T, deps: DependencyList | undefined): T; diff --git a/packages/hooks/es/useJump/index.js b/packages/hooks/es/useJump/index.js index 251687b..086b027 100644 --- a/packages/hooks/es/useJump/index.js +++ b/packages/hooks/es/useJump/index.js @@ -2,8 +2,8 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } import { useLatest } from 'ahooks'; import events from 'events'; import { get, isArray } from '@zhst/func'; diff --git a/packages/hooks/es/useSocket/index.d.ts b/packages/hooks/es/useSocket/index.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/hooks/lib/useActivateWrapper/index.d.ts b/packages/hooks/lib/useActivateWrapper/index.d.ts new file mode 100644 index 0000000..8c35f0c --- /dev/null +++ b/packages/hooks/lib/useActivateWrapper/index.d.ts @@ -0,0 +1,4 @@ +export declare const useUnActivateWrapper: (cb: () => void) => void; +export declare const useActivateWrapper: (cb: any) => null; +export declare const useActivateState: () => boolean; +export default useActivateWrapper; diff --git a/packages/hooks/lib/useDeepMemo/index.d.ts b/packages/hooks/lib/useDeepMemo/index.d.ts new file mode 100644 index 0000000..ba9fabc --- /dev/null +++ b/packages/hooks/lib/useDeepMemo/index.d.ts @@ -0,0 +1,2 @@ +import { DependencyList } from 'react'; +export default function useDeepMemo(factory: () => T, deps: DependencyList | undefined): T; diff --git a/packages/hooks/lib/useSocket/index.d.ts b/packages/hooks/lib/useSocket/index.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 106da42..7df2d88 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -1,6 +1,6 @@ { "name": "@zhst/hooks", - "version": "0.6.0", + "version": "0.8.10", "description": "hooks合集", "keywords": [ "hooks" @@ -36,9 +36,7 @@ "access": "public", "registry": "http://10.0.0.77:4874" }, - "devDependencies": { - "@types/zhst": "workspace:^" - }, + "devDependencies": {}, "dependencies": { "@zhst/func": "workspace:^", "ahooks": "^3.7.8", diff --git a/packages/hooks/src/changelog/index.md b/packages/hooks/src/changelog/index.md index d4333e4..f19e2e6 100644 --- a/packages/hooks/src/changelog/index.md +++ b/packages/hooks/src/changelog/index.md @@ -2,6 +2,7 @@ nav: title: 元组件 title: 版本更新日志 +toc: content order: 99 --- diff --git a/packages/icon/.fatherrc.ts b/packages/icon/.fatherrc.ts new file mode 100644 index 0000000..9e3a0ef --- /dev/null +++ b/packages/icon/.fatherrc.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'father'; + +export default defineConfig({ + // more father config: https://github.com/umijs/father/blob/master/docs/config.md + esm: { output: 'es' }, + cjs: { output: 'lib' }, +}); diff --git a/packages/icon/CHANGELOG.md b/packages/icon/CHANGELOG.md new file mode 100644 index 0000000..5b91928 --- /dev/null +++ b/packages/icon/CHANGELOG.md @@ -0,0 +1,7 @@ +# @zhst/icon + +## 0.2.0 + +### Minor Changes + +- 初始化 icon 包 diff --git a/packages/icon/README.md b/packages/icon/README.md new file mode 100644 index 0000000..10249ec --- /dev/null +++ b/packages/icon/README.md @@ -0,0 +1,16 @@ +# @zhst/icon + +## 介绍 + +静态变量库 + +## 安装 + +> pnpm install @zhst/icon + +## 使用 + +```js +import React from 'react'; +import { Arrow } from '@zhst/icon' +``` diff --git a/packages/icon/es/Iconfont.js b/packages/icon/es/Iconfont.js new file mode 100644 index 0000000..fd9fed8 --- /dev/null +++ b/packages/icon/es/Iconfont.js @@ -0,0 +1,42 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import { createFromIconfontCN } from '@ant-design/icons'; +import React from 'react'; +var Icon = createFromIconfontCN({ + scriptUrl: require("./font/iconfont.js") +}); +var IconFont = function IconFont(props) { + var _ref = props || {}, + _ref$title = _ref.title, + title = _ref$title === void 0 ? '' : _ref$title, + _ref$styles = _ref.styles, + styles = _ref$styles === void 0 ? {} : _ref$styles, + icon = _ref.icon, + _ref$size = _ref.size, + size = _ref$size === void 0 ? 14 : _ref$size, + onIconClick = _ref.onIconClick, + children = _ref.children, + _ref$active = _ref.active, + active = _ref$active === void 0 ? false : _ref$active, + _ref$color = _ref.color, + color = _ref$color === void 0 ? '' : _ref$color; + return /*#__PURE__*/React.createElement(Icon, { + title: title, + onClick: function onClick(e) { + onIconClick && onIconClick(e); + }, + style: _objectSpread(_objectSpread({}, styles), {}, { + cursor: 'pointer', + fontSize: size, + color: color + }, active ? { + color: '#09f' + } : {}), + type: icon + }, children); +}; +export default IconFont; \ No newline at end of file diff --git a/packages/icon/es/demo/basic.js b/packages/icon/es/demo/basic.js new file mode 100644 index 0000000..10131a8 --- /dev/null +++ b/packages/icon/es/demo/basic.js @@ -0,0 +1,8 @@ +import React from 'react'; +import { IconFont } from '@zhst/icon'; +var demo = function demo() { + return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(IconFont, { + icon: "icon-daoru1" + })); +}; +export default demo; \ No newline at end of file diff --git a/packages/icon/es/demo/demo.js b/packages/icon/es/demo/demo.js new file mode 100644 index 0000000..b6dc50b --- /dev/null +++ b/packages/icon/es/demo/demo.js @@ -0,0 +1,33 @@ +import React from 'react'; +var iconJson = require("../font/iconfont.json"); +import { IconFont } from '@zhst/icon'; +import "./index.less"; +import { message } from '@zhst/meta'; +var demo = function demo() { + var iconArr = iconJson['glyphs']; + return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("ul", { + className: 'demo-ul' + }, iconArr.map(function (item) { + var font_class = item.font_class, + name = item.name; + var fontName = "icon-".concat(font_class); + return /*#__PURE__*/React.createElement("li", { + className: 'demo-li' + }, /*#__PURE__*/React.createElement(IconFont, { + styles: { + marginBottom: 20 + }, + icon: fontName, + size: 32, + onIconClick: function onIconClick() { + navigator.clipboard.writeText(fontName); + message.success("\u590D\u5236".concat(fontName, "\u6210\u529F")); + } + }), /*#__PURE__*/React.createElement("div", { + className: "demo-li-name" + }, name), /*#__PURE__*/React.createElement("div", { + className: "demo-li-name" + }, fontName)); + }))); +}; +export default demo; \ No newline at end of file diff --git a/packages/icon/es/demo/index.less b/packages/icon/es/demo/index.less new file mode 100644 index 0000000..70b6c9d --- /dev/null +++ b/packages/icon/es/demo/index.less @@ -0,0 +1,20 @@ +.demo { + &-ul { + list-style-type: none; + display: flex; + flex-wrap: wrap; + } + + &-li { + display: flex; + flex-direction: column; + align-items: center; + height: 150px; + width: 150px; + + &-name { + color: #666; + font-size: 12px; + } + } +} \ No newline at end of file diff --git a/packages/icon/es/font/iconfont.css b/packages/icon/es/font/iconfont.css new file mode 100644 index 0000000..ef9f9d5 --- /dev/null +++ b/packages/icon/es/font/iconfont.css @@ -0,0 +1,1743 @@ +@font-face { + font-family: iconfont; /* Project id 1739270 */ + src: url('iconfont.woff2?t=1711094074098') format('woff2'), + url('iconfont.woff?t=1711094074098') format('woff'), + url('iconfont.ttf?t=1711094074098') format('truetype'); +} + +.iconfont { + font-family: iconfont !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-shezhi1::before { + content: "\e7fb"; +} + +.icon-bofang1::before { + content: "\e7fc"; +} + +.icon-zanting2::before { + content: "\e7fa"; +} + +.icon-bangzhu2::before { + content: "\e7f9"; +} + +.icon-daochu2::before { + content: "\e7f7"; +} + +.icon-daoru1::before { + content: "\e7f8"; +} + +.icon-jindonglogo::before { + content: "\e7f6"; +} + +.icon-guankongyujingselect::before { + content: "\e7ef"; +} + +.icon-guankongyujingnor::before { + content: "\e7f0"; +} + +.icon-guankongyuannor::before { + content: "\e7f1"; +} + +.icon-quancengyuanselectbeifen::before { + content: "\e7f2"; +} + +.icon-quancengyujingnor::before { + content: "\e7f3"; +} + +.icon-quancengyuannor::before { + content: "\e7f4"; +} + +.icon-quancengyuanselect::before { + content: "\e7f5"; +} + +.icon-guankongyuanselect::before { + content: "\e7ee"; +} + +.icon-jindong::before { + content: "\e7ed"; +} + +.icon-danganxiangqing_hangweifenxi::before { + content: "\e78d"; +} + +.icon-danganxiangqing_shujuganzhi::before { + content: "\e78e"; +} + +.icon-danganxiangqing_huodongguiji::before { + content: "\e78f"; +} + +.icon-danganxiangqing_jibenxinxi::before { + content: "\e7ea"; +} + +.icon-danganxiangqing_fushuwupin::before { + content: "\e7eb"; +} + +.icon-danganxiangqing_jizhanyingyong::before { + content: "\e7ec"; +} + +.icon-jiarudanganku::before { + content: "\e787"; +} + +.icon-dangankunor::before { + content: "\e793"; +} + +.icon-bukongrenwuselect::before { + content: "\e799"; +} + +.icon-bukongrenwunor1::before { + content: "\e79a"; +} + +.icon-dangankuselect::before { + content: "\e79b"; +} + +.icon-jizhanfanor::before { + content: "\e79c"; +} + +.icon-feijidongchechaxunnor::before { + content: "\e79d"; +} + +.icon-jidongchechaxunselect::before { + content: "\e79e"; +} + +.icon-a-lixianfenxiselect2::before { + content: "\e7a1"; +} + +.icon-huisufenxiselect::before { + content: "\e7a2"; +} + +.icon-jizhanfaselect::before { + content: "\e7a3"; +} + +.icon-mubiaojiansuonor::before { + content: "\e7ae"; +} + +.icon-lurenkuselect::before { + content: "\e7b1"; +} + +.icon-shujujiashicangselect::before { + content: "\e7b2"; +} + +.icon-shishijiexiselect::before { + content: "\e7b4"; +} + +.icon-shishijiexinor::before { + content: "\e7b9"; +} + +.icon-jidongchechaxunnor::before { + content: "\e7c1"; +} + +.icon-lurenkunor1::before { + content: "\e7cf"; +} + +.icon-mubiaotezhengchaxunnor::before { + content: "\e7e1"; +} + +.icon-yujingjiluselect::before { + content: "\e7e2"; +} + +.icon-mubiaotezhengchaxunselect::before { + content: "\e7e3"; +} + +.icon-feijidongchechaxunselect::before { + content: "\e7e4"; +} + +.icon-yujingjilunor::before { + content: "\e7e5"; +} + +.icon-lixianfenxiselect::before { + content: "\e7e6"; +} + +.icon-huisufenxinor::before { + content: "\e7e7"; +} + +.icon-shujujiashicangnor::before { + content: "\e7e8"; +} + +.icon-mubiaojiansuoselect::before { + content: "\e7e9"; +} + +.icon-kuangxuangongju::before { + content: "\e796"; +} + +.icon-fengniao::before { + content: "\e792"; +} + +.icon-zhankai::before { + content: "\e790"; +} + +.icon-shouqi::before { + content: "\e791"; +} + +.icon-shijian::before { + content: "\e786"; +} + +.icon-dingwei2::before { + content: "\e613"; +} + +.icon-renyuan::before { + content: "\e784"; +} + +.icon-houtai::before { + content: "\e785"; +} + +.icon-zuo::before { + content: "\e781"; +} + +.icon-you::before { + content: "\e783"; +} + +.icon-kakou::before { + content: "\e780"; +} + +.icon-yujing1::before { + content: "\e77e"; +} + +.icon-yuan2::before { + content: "\e77d"; +} + +.icon-moxingpengzhuang::before { + content: "\e777"; +} + +.icon-moxingpengzhuangnor::before { + content: "\e778"; +} + +.icon-lurenku::before { + content: "\e77b"; +} + +.icon-lurenkunor::before { + content: "\e77c"; +} + +.icon-shiming::before { + content: "\e776"; +} + +.icon-suoxiao2::before { + content: "\e774"; +} + +.icon-fangda1::before { + content: "\e775"; +} + +.icon-guanbi2::before { + content: "\e772"; +} + +.icon-fanhui1::before { + content: "\e773"; +} + +.icon-xiansuomopai::before { + content: "\e76f"; +} + +.icon-xiansuomopainor::before { + content: "\e76e"; +} + +.icon-zhajiyujing::before { + content: "\e770"; +} + +.icon-zhajiyujingnor::before { + content: "\e771"; +} + +.icon-zhuizongpeizhi::before { + content: "\e76c"; +} + +.icon-zhuizongpeizhinor::before { + content: "\e76d"; +} + +.icon-dapingqiehuan::before { + content: "\e76b"; +} + +.icon-xuanze::before { + content: "\e769"; +} + +.icon-shaixuan1::before { + content: "\e76a"; +} + +.icon-chekashebei::before { + content: "\e764"; +} + +.icon-imsishebei::before { + content: "\e765"; +} + +.icon-xingtishebei::before { + content: "\e766"; +} + +.icon-renlianshebei::before { + content: "\e767"; +} + +.icon-wifishebei::before { + content: "\e768"; +} + +.icon-a-miaozhun2::before { + content: "\e762"; +} + +.icon-a-bianzu19::before { + content: "\e763"; +} + +.icon-fanye::before { + content: "\e75e"; +} + +.icon-shenfenzheng::before { + content: "\e75f"; +} + +.icon-dizhi::before { + content: "\e760"; +} + +.icon-guanbi::before { + content: "\e761"; +} + +.icon-dianwei1::before { + content: "\e75b"; +} + +.icon-weikakou::before { + content: "\e757"; +} + +.icon-weikakounor::before { + content: "\e758"; +} + +.icon-changsuoma::before { + content: "\e759"; +} + +.icon-changsuomanor::before { + content: "\e75a"; +} + +.icon-yujing::before { + content: "\e756"; +} + +.icon-jiansuonor::before { + content: "\e747"; +} + +.icon-tonghangrenfenxinor1::before { + content: "\e748"; +} + +.icon-zhinengyanpannor::before { + content: "\e749"; +} + +.icon-bukongyujingnor::before { + content: "\e74a"; +} + +.icon-bukongrenwunor::before { + content: "\e74b"; +} + +.icon-dianziditunor::before { + content: "\e754"; +} + +.icon-zhuizongnor1::before { + content: "\e755"; +} + +.icon-zhuizong1::before { + content: "\e746"; +} + +.icon-bukongrenwu3::before { + content: "\e74c"; +} + +.icon-dianziditu::before { + content: "\e74d"; +} + +.icon-bukongyujing::before { + content: "\e750"; +} + +.icon-tonghangrenfenxi1::before { + content: "\e751"; +} + +.icon-zhinengyanpan::before { + content: "\e752"; +} + +.icon-jiansuo1::before { + content: "\e753"; +} + +.icon-kaiqijulei::before { + content: "\e745"; +} + +.icon-tongbu::before { + content: "\e744"; +} + +.icon-tonghangrenfenxi::before { + content: "\e743"; +} + +.icon-tonghangrenfenxinor::before { + content: "\e742"; +} + +.icon-jizhanyingyong::before { + content: "\e741"; +} + +.icon-haikangrenlianbukongnor::before { + content: "\e740"; +} + +.icon-haikangrenlianbukong::before { + content: "\e73f"; +} + +.icon-tuozhanshouduantishi::before { + content: "\e73e"; +} + +.icon-fanhuimopailiebiao::before { + content: "\e73d"; +} + +.icon-toukuijiancenor::before { + content: "\e73c"; +} + +.icon-toukuijiance::before { + content: "\e718"; +} + +.icon-zhuixing::before { + content: "\e717"; +} + +.icon-tishi4::before { + content: "\e73b"; +} + +.icon-a-shaixuanfeiji::before { + content: "\e733"; +} + +.icon-a-zidongtiaozhengfanweifeiji::before { + content: "\e73a"; +} + +.icon-heziyunwei::before { + content: "\e739"; +} + +.icon-qiehuan::before { + content: "\e738"; +} + +.icon-disanfangxiaoxinor::before { + content: "\e737"; +} + +.icon-disanfangxiaoxi::before { + content: "\e736"; +} + +.icon-daohang::before { + content: "\e735"; +} + +.icon-yonghu::before { + content: "\e734"; +} + +.icon-feiji::before { + content: "\e732"; +} + +.icon-jieshuzhuizong::before { + content: "\e730"; +} + +.icon-huisuzhoubian::before { + content: "\e731"; +} + +.icon-jixuzhuizong::before { + content: "\e72d"; +} + +.icon-tiaozhengfanwei::before { + content: "\e72e"; +} + +.icon-jiansuo::before { + content: "\e72f"; +} + +.icon-guiji::before { + content: "\e72c"; +} + +.icon-jichuxinxi::before { + content: "\e72b"; +} + +.icon-danganzhaiyao::before { + content: "\e72a"; +} + +.icon-jingzhunbukongicon_on::before { + content: "\e728"; +} + +.icon-jingzhunbukongicon_off::before { + content: "\e729"; +} + +.icon-tiaozhuan::before { + content: "\e727"; +} + +.icon-shezhi::before { + content: "\e726"; +} + +.icon-bangzhu1::before { + content: "\e725"; +} + +.icon-shuaxin1::before { + content: "\e724"; +} + +.icon-duosucaibeifen::before { + content: "\e722"; +} + +.icon-duosucai::before { + content: "\e723"; +} + +.icon-shujutongji::before { + content: "\e721"; +} + +.icon-renlian::before { + content: "\e71c"; +} + +.icon-xingti::before { + content: "\e71d"; +} + +.icon-jidongche::before { + content: "\e71e"; +} + +.icon-huisufenxi4::before { + content: "\e71f"; +} + +.icon-lixianfenxi4::before { + content: "\e720"; +} + +.icon-feijidongche::before { + content: "\e71b"; +} + +.icon-shujudaping::before { + content: "\e71a"; +} + +.icon-peizhisuanfa::before { + content: "\e719"; +} + +.icon-zhuizong::before { + content: "\e715"; +} + +.icon-zhuizongnor::before { + content: "\e716"; +} + +.icon-dianwei::before { + content: "\e714"; +} + +.icon-Container::before { + content: "\e713"; +} + +.icon-Attachment::before { + content: "\e712"; +} + +.icon-cha::before { + content: "\e711"; +} + +.icon-gou::before { + content: "\e710"; +} + +.icon-daoru::before { + content: "\e70f"; +} + +.icon-quanxijiansuo::before { + content: "\e70e"; +} + +.icon-chakanjiankong::before { + content: "\e70c"; +} + +.icon-tishi3::before { + content: "\e70d"; +} + +.icon-heiyemoshi::before { + content: "\e70b"; +} + +.icon-zhengchangmoshi::before { + content: "\e70a"; +} + +.icon-dingwei1::before { + content: "\e709"; +} + +.icon-paixu::before { + content: "\e708"; +} + +.icon-tianjiayuan::before { + content: "\e707"; +} + +.icon-juleidangankunor::before { + content: "\e705"; +} + +.icon-juleidanganku::before { + content: "\e706"; +} + +.icon-guanlian::before { + content: "\e704"; +} + +.icon-renlianbiaozhu::before { + content: "\e703"; +} + +.icon-juleijieguo::before { + content: "\e6ec"; +} + +.icon-juleirenwunor::before { + content: "\e6fb"; +} + +.icon-juleijieguonor::before { + content: "\e701"; +} + +.icon-juleirenwu::before { + content: "\e702"; +} + +.icon-zhongzhi3::before { + content: "\e8ff"; +} + +.icon-xuanzhuan1::before { + content: "\e6fd"; +} + +.icon-shuangmubiaozhu1::before { + content: "\e700"; +} + +.icon-shoudongkuangxuan::before { + content: "\e6f9"; +} + +.icon-zanting1::before { + content: "\e6fe"; +} + +.icon-zhongzhi1::before { + content: "\e6ff"; +} + +.icon-shoudong::before { + content: "\e6fa"; +} + +.icon-zidong::before { + content: "\e6fc"; +} + +.icon-zhenduan::before { + content: "\e6f8"; +} + +.icon-Check-Circle-Fill1::before { + content: "\e6f3"; +} + +.icon-Info--Circle-Fill::before { + content: "\e6f4"; +} + +.icon-Close-Circle-Fill::before { + content: "\e6f5"; +} + +.icon-Warning-Circle-Fill::before { + content: "\e6f6"; +} + +.icon-Question-Circle-Fill::before { + content: "\e6f7"; +} + +.icon-zancunjia::before { + content: "\e6f2"; +} + +.icon-Check-Circle-Fill::before { + content: "\e6f1"; +} + +.icon-tupianji::before { + content: "\e6f0"; +} + +.icon-quanping1::before { + content: "\e6ed"; +} + +.icon-yinliang::before { + content: "\e6ee"; +} + +.icon-suoxiao1::before { + content: "\e6ef"; +} + +.icon-home::before { + content: "\e6eb"; +} + +.icon-zuixiaohua::before { + content: "\e6e9"; +} + +.icon-zuidahua::before { + content: "\e6ea"; +} + +.icon-biaozhunhua::before { + content: "\e6e6"; +} + +.icon-julei::before { + content: "\e6e5"; +} + +.icon-bianzu::before { + content: "\e6e7"; +} + +.icon-bianzu3::before { + content: "\e6e8"; +} + +.icon-bianzu7::before { + content: "\e6e3"; +} + +.icon-bianzu2::before { + content: "\e6e4"; +} + +.icon-kapianqiehuan::before { + content: "\e6e2"; +} + +.icon-duobianxing1::before { + content: "\e6e0"; +} + +.icon-fang1::before { + content: "\e6e1"; +} + +.icon-yuan1::before { + content: "\e6df"; +} + +.icon-cejuli::before { + content: "\e6de"; +} + +.icon-wanggekuangxuannor::before { + content: "\e6dc"; +} + +.icon-lujingkuangxuannor::before { + content: "\e6dd"; +} + +.icon-chuansuo::before { + content: "\e6db"; +} + +.icon-bianyuanhezinor::before { + content: "\e6d8"; +} + +.icon-wujiankuhov::before { + content: "\e6d9"; +} + +.icon-caozuorizhinor::before { + content: "\e6da"; +} + +.icon-collect_dot::before { + content: "\e619"; +} + +.icon-chuxiandingweibg::before { + content: "\e6d4"; +} + +.icon-chuxiandingweiicon::before { + content: "\e6d5"; +} + +.icon-shexiangtoudingweibg::before { + content: "\e6d6"; +} + +.icon-shexiangtoudingweiicon::before { + content: "\e6d7"; +} + +.icon-xiafajieguo::before { + content: "\e6d2"; +} + +.icon-daochu1::before { + content: "\e6d3"; +} + +.icon-zuijinchuxian::before { + content: "\e6cc"; +} + +.icon-leijizhuapai::before { + content: "\e6d0"; +} + +.icon-yichangshijian::before { + content: "\e6d1"; +} + +.icon-dingwei::before { + content: "\e6cb"; +} + +.icon-tupian::before { + content: "\e6ad"; +} + +.icon-wenti::before { + content: "\e6ac"; +} + +.icon-lixian1::before { + content: "\e6ab"; +} + +.icon-yichang::before { + content: "\e6a8"; +} + +.icon-zhuixing-xiugaidianwei::before { + content: "\e6a7"; +} + +.icon-wenhao1::before { + content: "\e69e"; +} + +.icon-ditu_dingwei::before { + content: "\e69d"; +} + +.icon-ditu_fangda::before { + content: "\e689"; +} + +.icon-ditu_suoxiao::before { + content: "\e69a"; +} + +.icon-chakanbukongrenwu::before { + content: "\e688"; +} + +.icon-lietu::before { + content: "\e687"; +} + +.icon-zhongzhi::before { + content: "\e67e"; +} + +.icon-xialada::before { + content: "\e67f"; +} + +.icon-zhinengguanlian_xingti::before { + content: "\e67b"; +} + +.icon-zhinengguanlian_renlian::before { + content: "\e67c"; +} + +.icon-xiajiantou::before { + content: "\e75c"; +} + +.icon-zhinengguanlian_xiaojiantou::before { + content: "\e67d"; +} + +.icon-zhinengguanlian_jiantou::before { + content: "\e67a"; +} + +.icon-shangjiantou::before { + content: "\e75d"; +} + +.icon-banbenxinxi::before { + content: "\e679"; +} + +.icon-wenhao::before { + content: "\e61f"; +} + +.icon-bianjirenyuan::before { + content: "\e7e0"; +} + +.icon-tishi2::before { + content: "\e7df"; +} + +.icon-shexiangji2::before { + content: "\e7de"; +} + +.icon-guijizhuizong::before { + content: "\e7dd"; +} + +.icon-jiezhen1::before { + content: "\e7dc"; +} + +.icon-tianjiaguijihuisu::before { + content: "\e7db"; +} + +.icon-tingzhi::before { + content: "\e7cd"; +} + +.icon-baoweiquan::before { + content: "\e7ce"; +} + +.icon-shangchuanshipin::before { + content: "\e7d0"; +} + +.icon-yidong::before { + content: "\e7d1"; +} + +.icon-chuangjianxinbukong1::before { + content: "\e7d2"; +} + +.icon-yichu1::before { + content: "\e7d3"; +} + +.icon-tishi1::before { + content: "\e7d4"; +} + +.icon-VS::before { + content: "\e7d5"; +} + +.icon-quanjuzonglan::before { + content: "\e7d6"; +} + +.icon-chakanfenxirenwu1::before { + content: "\e7d7"; +} + +.icon-xiaoxi::before { + content: "\e7d8"; +} + +.icon-yonghuming::before { + content: "\e7d9"; +} + +.icon-tuichu::before { + content: "\e7da"; +} + +.icon-guijizhuizongnor::before { + content: "\e7cb"; +} + +.icon-guijizhuizong2::before { + content: "\e7cc"; +} + +.icon-bukongrenwu1::before { + content: "\e7b7"; +} + +.icon-shexiangji::before { + content: "\e7b8"; +} + +.icon-yujingditu::before { + content: "\e7ba"; +} + +.icon-lixianfenxi2::before { + content: "\e7bb"; +} + +.icon-yuanguanli1::before { + content: "\e7bc"; +} + +.icon-danganku::before { + content: "\e7bd"; +} + +.icon-huisufenxi2::before { + content: "\e7be"; +} + +.icon-kuneijiansuo::before { + content: "\e7bf"; +} + +.icon-jiegouhuachaxun::before { + content: "\e7c0"; +} + +.icon-bukongrenwu2::before { + content: "\e7c2"; +} + +.icon-yuanguanli2::before { + content: "\e7c3"; +} + +.icon-shexiangji1::before { + content: "\e7c4"; +} + +.icon-kuneijiansuo1::before { + content: "\e7c5"; +} + +.icon-lixianfenxi3::before { + content: "\e7c6"; +} + +.icon-danganku1::before { + content: "\e7c7"; +} + +.icon-yujingditu1::before { + content: "\e7c8"; +} + +.icon-huisufenxi3::before { + content: "\e7c9"; +} + +.icon-jiegouhuachaxunnor::before { + content: "\e7ca"; +} + +.icon-chuangjianxinbukong::before { + content: "\e7b6"; +} + +.icon-kuangxuan::before { + content: "\e77f"; +} + +.icon-gaojishaixuan::before { + content: "\e779"; +} + +.icon-gaojishaixuanshouqi::before { + content: "\e77a"; +} + +.icon-bukongrenwu::before { + content: "\e7b5"; +} + +.icon-riqi::before { + content: "\e74f"; +} + +.icon-shijianqiehuan::before { + content: "\e797"; +} + +.icon-shouquan1::before { + content: "\e7b3"; +} + +.icon-video-play::before { + content: "\e653"; +} + +.icon-shishifenxi::before { + content: "\e7af"; +} + +.icon-chakanfenxirenwu::before { + content: "\e7b0"; +} + +.icon-jiegouhuafenxi::before { + content: "\e7ad"; +} + +.icon-tianjiaguiji2::before { + content: "\e6aa"; +} + +.icon-tianjiajiansuomubiao::before { + content: "\e6b0"; +} + +.icon-add::before { + content: "\e661"; +} + +.icon-didian::before { + content: "\e798"; +} + +.icon-bofanghov::before { + content: "\e79f"; +} + +.icon-bofang3::before { + content: "\e7a0"; +} + +.icon-jinggao::before { + content: "\e788"; +} + +.icon-tishi::before { + content: "\e789"; +} + +.icon-bangzhu::before { + content: "\e78a"; +} + +.icon-guanbi1::before { + content: "\e78b"; +} + +.icon-chenggong::before { + content: "\e78c"; +} + +.icon-qianwang::before { + content: "\e7ac"; +} + +.icon-shouquan::before { + content: "\e7ab"; +} + +.icon-jingweidu::before { + content: "\e7aa"; +} + +.icon-shanchu1::before { + content: "\e74e"; +} + +.icon-daochu::before { + content: "\e782"; +} + +.icon-ziyuanguanli::before { + content: "\e7a4"; +} + +.icon-fuwuqishouquan::before { + content: "\e7a5"; +} + +.icon-xiugaimima::before { + content: "\e7a6"; +} + +.icon-zhanghaoguanli::before { + content: "\e7a7"; +} + +.icon-suanlipeie::before { + content: "\e7a8"; +} + +.icon-VMSpeizhi::before { + content: "\e7a9"; +} + +.icon-tianjia1::before { + content: "\e794"; +} + +.icon-yichu::before { + content: "\e795"; +} + +.icon-lujing::before { + content: "\e6cf"; +} + +.icon-jiankongxinxi::before { + content: "\e6c8"; +} + +.icon-fanwei::before { + content: "\e6c9"; +} + +.icon-anfadidian::before { + content: "\e6ca"; +} + +.icon-gongjuxiang::before { + content: "\e6cd"; +} + +.icon-gongjuxiangguanbi1::before { + content: "\e6ce"; +} + +.icon-jiezhen::before { + content: "\e6c2"; +} + +.icon-huisufenxi1::before { + content: "\e6c6"; +} + +.icon-huisufenxi::before { + content: "\e6c7"; +} + +.icon-tianjiashipinwenjian1::before { + content: "\e6c5"; +} + +.icon-jiazaishibai::before { + content: "\e6c3"; +} + +.icon-shuaxin::before { + content: "\e6c4"; +} + +.icon-quanping::before { + content: "\e6c0"; +} + +.icon-quxiaoquanping::before { + content: "\e6c1"; +} + +.icon-shipinbofang::before { + content: "\e6be"; +} + +.icon-shipinzanting::before { + content: "\e6bf"; +} + +.icon-lixianguiji::before { + content: "\e6bd"; +} + +.icon-lixian::before { + content: "\e6bc"; +} + +.icon-xiaojiaobiao::before { + content: "\e6bb"; +} + +.icon-shangchuan1::before { + content: "\e6ba"; +} + +.icon-tianjiaweijiansuoduixiang::before { + content: "\e6b8"; +} + +.icon-tianjiaweijiansuojilu::before { + content: "\e6b9"; +} + +.icon-lixianfenxi1::before { + content: "\e6b7"; +} + +.icon-kuaisujiansuohov::before { + content: "\e6b5"; +} + +.icon-kuaisujiansuo1::before { + content: "\e6b6"; +} + +.icon-kuaisujiansuo::before { + content: "\e6b4"; +} + +.icon-yuanguanli::before { + content: "\e6b1"; +} + +.icon-shexiangtou::before { + content: "\e6b2"; +} + +.icon-lixianfenxi::before { + content: "\e6b3"; +} + +.icon-filter::before { + content: "\e61a"; +} + +.icon-tianjiaweizhuizongduixiang2::before { + content: "\e6af"; +} + +.icon-tianjiaweizhuizongduixiang1::before { + content: "\e6ae"; +} + +.icon-baocun1::before { + content: "\e6a9"; +} + +.icon-tianjiashipinwenjianjia::before { + content: "\e6a5"; +} + +.icon-tianjiashipinwenjian::before { + content: "\e6a6"; +} + +.icon-ditu::before { + content: "\e6a4"; +} + +.icon-xinjianshexiangtou::before { + content: "\e6a3"; +} + +.icon-lishihuisu::before { + content: "\e6a2"; +} + +.icon-decoyitianjiaweiguiji::before { + content: "\e69f"; +} + +.icon-bofangqiehuan::before { + content: "\e6a0"; +} + +.icon-tianjia::before { + content: "\e6a1"; +} + +.icon-baocun::before { + content: "\e698"; +} + +.icon-gongjuxiangguanbi::before { + content: "\e699"; +} + +.icon-shangchuan::before { + content: "\e69b"; +} + +.icon-gongjuxiang1::before { + content: "\e69c"; +} + +.icon-logo::before { + content: "\e692"; +} + +.icon-setting::before { + content: "\e627"; +} + +.icon-user::before { + content: "\e628"; +} + +.icon-quit::before { + content: "\e629"; +} + +.icon-arrowzhankaimeixuanzhong::before { + content: "\e693"; +} + +.icon-arrowzhankaixuanzhong::before { + content: "\e694"; +} + +.icon-xuanzexuanzhong::before { + content: "\e695"; +} + +.icon-xuanzebanxuan::before { + content: "\e696"; +} + +.icon-xuanzenor::before { + content: "\e697"; +} + +.icon-shaixuanguanbinor::before { + content: "\e691"; +} + +.icon-gengduo::before { + content: "\e68e"; +} + +.icon-youzhankai::before { + content: "\e68f"; +} + +.icon-zuoshouqi::before { + content: "\e690"; +} + +.icon-yuan::before { + content: "\e68a"; +} + +.icon-duobianxing::before { + content: "\e68b"; +} + +.icon-fang::before { + content: "\e68c"; +} + +.icon-ceju::before { + content: "\e68d"; +} + +.icon-shishizhuizong1::before { + content: "\e683"; +} + +.icon-guijihuisu1::before { + content: "\e684"; +} + +.icon-tianjiaguiji::before { + content: "\e685"; +} + +.icon-yichuguiji::before { + content: "\e686"; +} + +.icon-fangda::before { + content: "\e680"; +} + +.icon-suoxiao::before { + content: "\e681"; +} + +.icon-xiazai::before { + content: "\e682"; +} + +.icon-fanhui::before { + content: "\e678"; +} + +.icon-sousuo::before { + content: "\e669"; +} + +.icon-quxiaoxuanzhong::before { + content: "\e66a"; +} + +.icon-piliangxuanzenor::before { + content: "\e66b"; +} + +.icon-kaiqifenxi::before { + content: "\e66c"; +} + +.icon-quxiaofenxi::before { + content: "\e66d"; +} + +.icon-shaixuan::before { + content: "\e66e"; +} + +.icon-dangan::before { + content: "\e66f"; +} + +.icon-bofang::before { + content: "\e670"; +} + +.icon-zanting::before { + content: "\e671"; +} + +.icon-shanchu::before { + content: "\e672"; +} + +.icon-tianjiaweizhuizongduixiang::before { + content: "\e673"; +} + +.icon-chakandatu::before { + content: "\e674"; +} + +.icon-jiansuojilu::before { + content: "\e675"; +} + +.icon-yuzhi::before { + content: "\e676"; +} + +.icon-chakanxiangqing::before { + content: "\e677"; +} + +.icon-guijihuisu::before { + content: "\e65c"; +} + +.icon-dianweipeizhinor::before { + content: "\e65d"; +} + +.icon-yirenyidang::before { + content: "\e65e"; +} + +.icon-tongbanfenxi::before { + content: "\e65f"; +} + +.icon-qiehuanzuo::before { + content: "\e662"; +} + +.icon-qiehuanyou::before { + content: "\e663"; +} + +.icon-tingzhidengdai::before { + content: "\e664"; +} + +.icon-yiguanbi::before { + content: "\e665"; +} + +.icon-danchuangguanbi::before { + content: "\e666"; +} + +.icon-lishijilu::before { + content: "\e64a"; +} + +.icon-xuanzhuan::before { + content: "\e648"; +} + +.icon-qingchu::before { + content: "\e649"; +} + +.icon-dangantianjia::before { + content: "\e63d"; +} + +.icon-bianji::before { + content: "\e63e"; +} + +.icon-fullscreen::before { + content: "\e63b"; +} + +.icon-cancle_fullscreen::before { + content: "\e63c"; +} + +.icon-quanyujiansuo_nor::before { + content: "\e639"; +} + +.icon-guijihuisu_nor::before { + content: "\e63a"; +} + diff --git a/packages/icon/es/font/iconfont.js b/packages/icon/es/font/iconfont.js new file mode 100644 index 0000000..6af13ff --- /dev/null +++ b/packages/icon/es/font/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_1739270='',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var c,_i,o,z,t,m=function m(a,l){l.parentNode.insertBefore(a,l);};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("");}catch(a){console&&console.log(a);}}c=function c(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_1739270,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?m(l,a.firstChild):a.appendChild(l));},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(c,0):(_i=function i(){document.removeEventListener("DOMContentLoaded",_i,!1),c();},document.addEventListener("DOMContentLoaded",_i,!1)):document.attachEvent&&(o=c,z=h.document,t=!1,v(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,p());});}function p(){t||(t=!0,o());}function v(){try{z.documentElement.doScroll("left");}catch(a){return void setTimeout(v,50);}p();}}(window); \ No newline at end of file diff --git a/packages/icon/es/font/iconfont.json b/packages/icon/es/font/iconfont.json new file mode 100644 index 0000000..8466528 --- /dev/null +++ b/packages/icon/es/font/iconfont.json @@ -0,0 +1,3033 @@ +{ + "id": "1739270", + "name": "蜂鸟实时布控系统", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "39554305", + "name": "设置", + "font_class": "shezhi1", + "unicode": "e7fb", + "unicode_decimal": 59387 + }, + { + "icon_id": "39554304", + "name": "播放", + "font_class": "bofang1", + "unicode": "e7fc", + "unicode_decimal": 59388 + }, + { + "icon_id": "39554349", + "name": "暂停", + "font_class": "zanting2", + "unicode": "e7fa", + "unicode_decimal": 59386 + }, + { + "icon_id": "38794757", + "name": "帮助", + "font_class": "bangzhu2", + "unicode": "e7f9", + "unicode_decimal": 59385 + }, + { + "icon_id": "38736535", + "name": "导出", + "font_class": "daochu2", + "unicode": "e7f7", + "unicode_decimal": 59383 + }, + { + "icon_id": "38736534", + "name": "导入", + "font_class": "daoru1", + "unicode": "e7f8", + "unicode_decimal": 59384 + }, + { + "icon_id": "38439162", + "name": "金东logo", + "font_class": "jindonglogo", + "unicode": "e7f6", + "unicode_decimal": 59382 + }, + { + "icon_id": "38353195", + "name": "管控预警select", + "font_class": "guankongyujingselect", + "unicode": "e7ef", + "unicode_decimal": 59375 + }, + { + "icon_id": "38353194", + "name": "管控预警nor", + "font_class": "guankongyujingnor", + "unicode": "e7f0", + "unicode_decimal": 59376 + }, + { + "icon_id": "38353193", + "name": "管控预案nor", + "font_class": "guankongyuannor", + "unicode": "e7f1", + "unicode_decimal": 59377 + }, + { + "icon_id": "38353188", + "name": "圈层预案select备份", + "font_class": "quancengyuanselectbeifen", + "unicode": "e7f2", + "unicode_decimal": 59378 + }, + { + "icon_id": "38353187", + "name": "圈层预警nor", + "font_class": "quancengyujingnor", + "unicode": "e7f3", + "unicode_decimal": 59379 + }, + { + "icon_id": "38353186", + "name": "圈层预案nor", + "font_class": "quancengyuannor", + "unicode": "e7f4", + "unicode_decimal": 59380 + }, + { + "icon_id": "38353185", + "name": "圈层预案select", + "font_class": "quancengyuanselect", + "unicode": "e7f5", + "unicode_decimal": 59381 + }, + { + "icon_id": "38353196", + "name": "管控预案select", + "font_class": "guankongyuanselect", + "unicode": "e7ee", + "unicode_decimal": 59374 + }, + { + "icon_id": "37989025", + "name": "金东", + "font_class": "jindong", + "unicode": "e7ed", + "unicode_decimal": 59373 + }, + { + "icon_id": "36344792", + "name": "档案详情_行为分析", + "font_class": "danganxiangqing_hangweifenxi", + "unicode": "e78d", + "unicode_decimal": 59277 + }, + { + "icon_id": "36344793", + "name": "档案详情_数据感知", + "font_class": "danganxiangqing_shujuganzhi", + "unicode": "e78e", + "unicode_decimal": 59278 + }, + { + "icon_id": "36344794", + "name": "档案详情_活动轨迹", + "font_class": "danganxiangqing_huodongguiji", + "unicode": "e78f", + "unicode_decimal": 59279 + }, + { + "icon_id": "36344795", + "name": "档案详情_基本信息", + "font_class": "danganxiangqing_jibenxinxi", + "unicode": "e7ea", + "unicode_decimal": 59370 + }, + { + "icon_id": "36344796", + "name": "档案详情_附属物品", + "font_class": "danganxiangqing_fushuwupin", + "unicode": "e7eb", + "unicode_decimal": 59371 + }, + { + "icon_id": "36344797", + "name": "档案详情_技战应用", + "font_class": "danganxiangqing_jizhanyingyong", + "unicode": "e7ec", + "unicode_decimal": 59372 + }, + { + "icon_id": "36101866", + "name": "加入档案库", + "font_class": "jiarudanganku", + "unicode": "e787", + "unicode_decimal": 59271 + }, + { + "icon_id": "36091918", + "name": "档案库nor", + "font_class": "dangankunor", + "unicode": "e793", + "unicode_decimal": 59283 + }, + { + "icon_id": "36091919", + "name": "布控任务select", + "font_class": "bukongrenwuselect", + "unicode": "e799", + "unicode_decimal": 59289 + }, + { + "icon_id": "36091920", + "name": "布控任务nor", + "font_class": "bukongrenwunor1", + "unicode": "e79a", + "unicode_decimal": 59290 + }, + { + "icon_id": "36091921", + "name": "档案库select", + "font_class": "dangankuselect", + "unicode": "e79b", + "unicode_decimal": 59291 + }, + { + "icon_id": "36091922", + "name": "技战法nor", + "font_class": "jizhanfanor", + "unicode": "e79c", + "unicode_decimal": 59292 + }, + { + "icon_id": "36091923", + "name": "非机动车查询nor", + "font_class": "feijidongchechaxunnor", + "unicode": "e79d", + "unicode_decimal": 59293 + }, + { + "icon_id": "36091924", + "name": "机动车查询select", + "font_class": "jidongchechaxunselect", + "unicode": "e79e", + "unicode_decimal": 59294 + }, + { + "icon_id": "36091925", + "name": "离线分析select 2", + "font_class": "a-lixianfenxiselect2", + "unicode": "e7a1", + "unicode_decimal": 59297 + }, + { + "icon_id": "36091926", + "name": "回溯分析select", + "font_class": "huisufenxiselect", + "unicode": "e7a2", + "unicode_decimal": 59298 + }, + { + "icon_id": "36091927", + "name": "技战法select", + "font_class": "jizhanfaselect", + "unicode": "e7a3", + "unicode_decimal": 59299 + }, + { + "icon_id": "36091928", + "name": "目标检索nor", + "font_class": "mubiaojiansuonor", + "unicode": "e7ae", + "unicode_decimal": 59310 + }, + { + "icon_id": "36091929", + "name": "路人库select", + "font_class": "lurenkuselect", + "unicode": "e7b1", + "unicode_decimal": 59313 + }, + { + "icon_id": "36091930", + "name": "数据驾驶舱select", + "font_class": "shujujiashicangselect", + "unicode": "e7b2", + "unicode_decimal": 59314 + }, + { + "icon_id": "36091931", + "name": "实时解析select", + "font_class": "shishijiexiselect", + "unicode": "e7b4", + "unicode_decimal": 59316 + }, + { + "icon_id": "36091932", + "name": "实时解析nor", + "font_class": "shishijiexinor", + "unicode": "e7b9", + "unicode_decimal": 59321 + }, + { + "icon_id": "36091933", + "name": "机动车查询nor", + "font_class": "jidongchechaxunnor", + "unicode": "e7c1", + "unicode_decimal": 59329 + }, + { + "icon_id": "36091934", + "name": "路人库nor", + "font_class": "lurenkunor1", + "unicode": "e7cf", + "unicode_decimal": 59343 + }, + { + "icon_id": "36091935", + "name": "目标特征查询nor", + "font_class": "mubiaotezhengchaxunnor", + "unicode": "e7e1", + "unicode_decimal": 59361 + }, + { + "icon_id": "36091936", + "name": "预警记录select", + "font_class": "yujingjiluselect", + "unicode": "e7e2", + "unicode_decimal": 59362 + }, + { + "icon_id": "36091937", + "name": "目标特征查询select", + "font_class": "mubiaotezhengchaxunselect", + "unicode": "e7e3", + "unicode_decimal": 59363 + }, + { + "icon_id": "36091938", + "name": "非机动车查询select", + "font_class": "feijidongchechaxunselect", + "unicode": "e7e4", + "unicode_decimal": 59364 + }, + { + "icon_id": "36091939", + "name": "预警记录nor", + "font_class": "yujingjilunor", + "unicode": "e7e5", + "unicode_decimal": 59365 + }, + { + "icon_id": "36091940", + "name": "离线分析select", + "font_class": "lixianfenxiselect", + "unicode": "e7e6", + "unicode_decimal": 59366 + }, + { + "icon_id": "36091941", + "name": "回溯分析nor", + "font_class": "huisufenxinor", + "unicode": "e7e7", + "unicode_decimal": 59367 + }, + { + "icon_id": "36091942", + "name": "数据驾驶舱nor", + "font_class": "shujujiashicangnor", + "unicode": "e7e8", + "unicode_decimal": 59368 + }, + { + "icon_id": "36091943", + "name": "目标检索select", + "font_class": "mubiaojiansuoselect", + "unicode": "e7e9", + "unicode_decimal": 59369 + }, + { + "icon_id": "35927785", + "name": "框选工具", + "font_class": "kuangxuangongju", + "unicode": "e796", + "unicode_decimal": 59286 + }, + { + "icon_id": "35652507", + "name": "蜂鸟", + "font_class": "fengniao", + "unicode": "e792", + "unicode_decimal": 59282 + }, + { + "icon_id": "35648087", + "name": "展开", + "font_class": "zhankai", + "unicode": "e790", + "unicode_decimal": 59280 + }, + { + "icon_id": "35648088", + "name": "收起", + "font_class": "shouqi", + "unicode": "e791", + "unicode_decimal": 59281 + }, + { + "icon_id": "6056161", + "name": "时间", + "font_class": "shijian", + "unicode": "e786", + "unicode_decimal": 59270 + }, + { + "icon_id": "16105260", + "name": "定位", + "font_class": "dingwei2", + "unicode": "e613", + "unicode_decimal": 58899 + }, + { + "icon_id": "34994072", + "name": "人员", + "font_class": "renyuan", + "unicode": "e784", + "unicode_decimal": 59268 + }, + { + "icon_id": "34994073", + "name": "后台", + "font_class": "houtai", + "unicode": "e785", + "unicode_decimal": 59269 + }, + { + "icon_id": "34324424", + "name": "左", + "font_class": "zuo", + "unicode": "e781", + "unicode_decimal": 59265 + }, + { + "icon_id": "34324425", + "name": "右", + "font_class": "you", + "unicode": "e783", + "unicode_decimal": 59267 + }, + { + "icon_id": "33566924", + "name": "卡口", + "font_class": "kakou", + "unicode": "e780", + "unicode_decimal": 59264 + }, + { + "icon_id": "33541952", + "name": "预警", + "font_class": "yujing1", + "unicode": "e77e", + "unicode_decimal": 59262 + }, + { + "icon_id": "32497852", + "name": "预案", + "font_class": "yuan2", + "unicode": "e77d", + "unicode_decimal": 59261 + }, + { + "icon_id": "32189295", + "name": "模型碰撞", + "font_class": "moxingpengzhuang", + "unicode": "e777", + "unicode_decimal": 59255 + }, + { + "icon_id": "32189296", + "name": "模型碰撞nor", + "font_class": "moxingpengzhuangnor", + "unicode": "e778", + "unicode_decimal": 59256 + }, + { + "icon_id": "32189298", + "name": "路人库", + "font_class": "lurenku", + "unicode": "e77b", + "unicode_decimal": 59259 + }, + { + "icon_id": "32190455", + "name": "路人库nor", + "font_class": "lurenkunor", + "unicode": "e77c", + "unicode_decimal": 59260 + }, + { + "icon_id": "32477562", + "name": "实名", + "font_class": "shiming", + "unicode": "e776", + "unicode_decimal": 59254 + }, + { + "icon_id": "32356230", + "name": "缩小", + "font_class": "suoxiao2", + "unicode": "e774", + "unicode_decimal": 59252 + }, + { + "icon_id": "32356231", + "name": "放大", + "font_class": "fangda1", + "unicode": "e775", + "unicode_decimal": 59253 + }, + { + "icon_id": "32305021", + "name": "关闭", + "font_class": "guanbi2", + "unicode": "e772", + "unicode_decimal": 59250 + }, + { + "icon_id": "32305022", + "name": "返回", + "font_class": "fanhui1", + "unicode": "e773", + "unicode_decimal": 59251 + }, + { + "icon_id": "31879940", + "name": "线索摸排", + "font_class": "xiansuomopai", + "unicode": "e76f", + "unicode_decimal": 59247 + }, + { + "icon_id": "31879931", + "name": "线索摸排nor", + "font_class": "xiansuomopainor", + "unicode": "e76e", + "unicode_decimal": 59246 + }, + { + "icon_id": "31879839", + "name": "闸机预警", + "font_class": "zhajiyujing", + "unicode": "e770", + "unicode_decimal": 59248 + }, + { + "icon_id": "31879840", + "name": "闸机预警nor", + "font_class": "zhajiyujingnor", + "unicode": "e771", + "unicode_decimal": 59249 + }, + { + "icon_id": "31879545", + "name": "追踪配置", + "font_class": "zhuizongpeizhi", + "unicode": "e76c", + "unicode_decimal": 59244 + }, + { + "icon_id": "31879546", + "name": "追踪配置nor", + "font_class": "zhuizongpeizhinor", + "unicode": "e76d", + "unicode_decimal": 59245 + }, + { + "icon_id": "31298167", + "name": "大屏切换 ", + "font_class": "dapingqiehuan", + "unicode": "e76b", + "unicode_decimal": 59243 + }, + { + "icon_id": "31293396", + "name": "选择", + "font_class": "xuanze", + "unicode": "e769", + "unicode_decimal": 59241 + }, + { + "icon_id": "31293397", + "name": "筛选", + "font_class": "shaixuan1", + "unicode": "e76a", + "unicode_decimal": 59242 + }, + { + "icon_id": "31281773", + "name": "车卡设备", + "font_class": "chekashebei", + "unicode": "e764", + "unicode_decimal": 59236 + }, + { + "icon_id": "31281774", + "name": "imsi设备", + "font_class": "imsishebei", + "unicode": "e765", + "unicode_decimal": 59237 + }, + { + "icon_id": "31281775", + "name": "形体设备", + "font_class": "xingtishebei", + "unicode": "e766", + "unicode_decimal": 59238 + }, + { + "icon_id": "31281776", + "name": "人脸设备", + "font_class": "renlianshebei", + "unicode": "e767", + "unicode_decimal": 59239 + }, + { + "icon_id": "31281777", + "name": "wifi设备", + "font_class": "wifishebei", + "unicode": "e768", + "unicode_decimal": 59240 + }, + { + "icon_id": "31175954", + "name": "瞄准 (2)", + "font_class": "a-miaozhun2", + "unicode": "e762", + "unicode_decimal": 59234 + }, + { + "icon_id": "31175955", + "name": "编组 19", + "font_class": "a-bianzu19", + "unicode": "e763", + "unicode_decimal": 59235 + }, + { + "icon_id": "31109996", + "name": "翻页", + "font_class": "fanye", + "unicode": "e75e", + "unicode_decimal": 59230 + }, + { + "icon_id": "31109998", + "name": "身份证", + "font_class": "shenfenzheng", + "unicode": "e75f", + "unicode_decimal": 59231 + }, + { + "icon_id": "31110000", + "name": "地址", + "font_class": "dizhi", + "unicode": "e760", + "unicode_decimal": 59232 + }, + { + "icon_id": "31110045", + "name": "关闭", + "font_class": "guanbi", + "unicode": "e761", + "unicode_decimal": 59233 + }, + { + "icon_id": "31088147", + "name": "点位", + "font_class": "dianwei1", + "unicode": "e75b", + "unicode_decimal": 59227 + }, + { + "icon_id": "30952366", + "name": "微卡口", + "font_class": "weikakou", + "unicode": "e757", + "unicode_decimal": 59223 + }, + { + "icon_id": "30952367", + "name": "微卡口nor", + "font_class": "weikakounor", + "unicode": "e758", + "unicode_decimal": 59224 + }, + { + "icon_id": "30952370", + "name": "场所码", + "font_class": "changsuoma", + "unicode": "e759", + "unicode_decimal": 59225 + }, + { + "icon_id": "30952371", + "name": "场所码nor", + "font_class": "changsuomanor", + "unicode": "e75a", + "unicode_decimal": 59226 + }, + { + "icon_id": "9974390", + "name": "预警", + "font_class": "yujing", + "unicode": "e756", + "unicode_decimal": 59222 + }, + { + "icon_id": "29552660", + "name": "检索nor", + "font_class": "jiansuonor", + "unicode": "e747", + "unicode_decimal": 59207 + }, + { + "icon_id": "29552661", + "name": "同行人分析nor", + "font_class": "tonghangrenfenxinor1", + "unicode": "e748", + "unicode_decimal": 59208 + }, + { + "icon_id": "29552662", + "name": "智能研判nor", + "font_class": "zhinengyanpannor", + "unicode": "e749", + "unicode_decimal": 59209 + }, + { + "icon_id": "29552663", + "name": "布控预警nor", + "font_class": "bukongyujingnor", + "unicode": "e74a", + "unicode_decimal": 59210 + }, + { + "icon_id": "29552664", + "name": "布控任务nor", + "font_class": "bukongrenwunor", + "unicode": "e74b", + "unicode_decimal": 59211 + }, + { + "icon_id": "29552665", + "name": "电子地图nor", + "font_class": "dianziditunor", + "unicode": "e754", + "unicode_decimal": 59220 + }, + { + "icon_id": "29552666", + "name": "追踪nor", + "font_class": "zhuizongnor1", + "unicode": "e755", + "unicode_decimal": 59221 + }, + { + "icon_id": "29552487", + "name": "追踪", + "font_class": "zhuizong1", + "unicode": "e746", + "unicode_decimal": 59206 + }, + { + "icon_id": "29552240", + "name": "布控任务", + "font_class": "bukongrenwu3", + "unicode": "e74c", + "unicode_decimal": 59212 + }, + { + "icon_id": "29552241", + "name": "电子地图", + "font_class": "dianziditu", + "unicode": "e74d", + "unicode_decimal": 59213 + }, + { + "icon_id": "29552242", + "name": "布控预警", + "font_class": "bukongyujing", + "unicode": "e750", + "unicode_decimal": 59216 + }, + { + "icon_id": "29552243", + "name": "同行人分析", + "font_class": "tonghangrenfenxi1", + "unicode": "e751", + "unicode_decimal": 59217 + }, + { + "icon_id": "29552244", + "name": "智能研判", + "font_class": "zhinengyanpan", + "unicode": "e752", + "unicode_decimal": 59218 + }, + { + "icon_id": "29552245", + "name": "检索", + "font_class": "jiansuo1", + "unicode": "e753", + "unicode_decimal": 59219 + }, + { + "icon_id": "29416924", + "name": "开启聚类", + "font_class": "kaiqijulei", + "unicode": "e745", + "unicode_decimal": 59205 + }, + { + "icon_id": "29416893", + "name": "同步", + "font_class": "tongbu", + "unicode": "e744", + "unicode_decimal": 59204 + }, + { + "icon_id": "28913138", + "name": "同行人分析", + "font_class": "tonghangrenfenxi", + "unicode": "e743", + "unicode_decimal": 59203 + }, + { + "icon_id": "28913111", + "name": "同行人分析nor", + "font_class": "tonghangrenfenxinor", + "unicode": "e742", + "unicode_decimal": 59202 + }, + { + "icon_id": "28603735", + "name": "技战应用", + "font_class": "jizhanyingyong", + "unicode": "e741", + "unicode_decimal": 59201 + }, + { + "icon_id": "28122666", + "name": "海康人脸布控nor", + "font_class": "haikangrenlianbukongnor", + "unicode": "e740", + "unicode_decimal": 59200 + }, + { + "icon_id": "28122657", + "name": "海康人脸布控", + "font_class": "haikangrenlianbukong", + "unicode": "e73f", + "unicode_decimal": 59199 + }, + { + "icon_id": "28028942", + "name": "拓展手段提示", + "font_class": "tuozhanshouduantishi", + "unicode": "e73e", + "unicode_decimal": 59198 + }, + { + "icon_id": "28022750", + "name": "返回摸排列表", + "font_class": "fanhuimopailiebiao", + "unicode": "e73d", + "unicode_decimal": 59197 + }, + { + "icon_id": "26859533", + "name": "头盔检测nor", + "font_class": "toukuijiancenor", + "unicode": "e73c", + "unicode_decimal": 59196 + }, + { + "icon_id": "26859527", + "name": "头盔检测", + "font_class": "toukuijiance", + "unicode": "e718", + "unicode_decimal": 59160 + }, + { + "icon_id": "26859240", + "name": "追形", + "font_class": "zhuixing", + "unicode": "e717", + "unicode_decimal": 59159 + }, + { + "icon_id": "26840606", + "name": "提示", + "font_class": "tishi4", + "unicode": "e73b", + "unicode_decimal": 59195 + }, + { + "icon_id": "26691196", + "name": "筛选(飞机)", + "font_class": "a-shaixuanfeiji", + "unicode": "e733", + "unicode_decimal": 59187 + }, + { + "icon_id": "26690614", + "name": "自动调整范围(飞机)", + "font_class": "a-zidongtiaozhengfanweifeiji", + "unicode": "e73a", + "unicode_decimal": 59194 + }, + { + "icon_id": "26630396", + "name": "盒子运维", + "font_class": "heziyunwei", + "unicode": "e739", + "unicode_decimal": 59193 + }, + { + "icon_id": "26620389", + "name": "切换", + "font_class": "qiehuan", + "unicode": "e738", + "unicode_decimal": 59192 + }, + { + "icon_id": "26523829", + "name": "第三方消息nor", + "font_class": "disanfangxiaoxinor", + "unicode": "e737", + "unicode_decimal": 59191 + }, + { + "icon_id": "26523827", + "name": "第三方消息", + "font_class": "disanfangxiaoxi", + "unicode": "e736", + "unicode_decimal": 59190 + }, + { + "icon_id": "25930570", + "name": "导航", + "font_class": "daohang", + "unicode": "e735", + "unicode_decimal": 59189 + }, + { + "icon_id": "25930569", + "name": "用户", + "font_class": "yonghu", + "unicode": "e734", + "unicode_decimal": 59188 + }, + { + "icon_id": "25878393", + "name": "飞机", + "font_class": "feiji", + "unicode": "e732", + "unicode_decimal": 59186 + }, + { + "icon_id": "25809480", + "name": "结束追踪", + "font_class": "jieshuzhuizong", + "unicode": "e730", + "unicode_decimal": 59184 + }, + { + "icon_id": "25809481", + "name": "回溯周边", + "font_class": "huisuzhoubian", + "unicode": "e731", + "unicode_decimal": 59185 + }, + { + "icon_id": "25809477", + "name": "继续追踪", + "font_class": "jixuzhuizong", + "unicode": "e72d", + "unicode_decimal": 59181 + }, + { + "icon_id": "25809478", + "name": "调整范围", + "font_class": "tiaozhengfanwei", + "unicode": "e72e", + "unicode_decimal": 59182 + }, + { + "icon_id": "25809479", + "name": "检索", + "font_class": "jiansuo", + "unicode": "e72f", + "unicode_decimal": 59183 + }, + { + "icon_id": "25796784", + "name": "轨迹", + "font_class": "guiji", + "unicode": "e72c", + "unicode_decimal": 59180 + }, + { + "icon_id": "25796636", + "name": "基础信息", + "font_class": "jichuxinxi", + "unicode": "e72b", + "unicode_decimal": 59179 + }, + { + "icon_id": "25796635", + "name": "档案摘要", + "font_class": "danganzhaiyao", + "unicode": "e72a", + "unicode_decimal": 59178 + }, + { + "icon_id": "25778781", + "name": "精准布控icon_on", + "font_class": "jingzhunbukongicon_on", + "unicode": "e728", + "unicode_decimal": 59176 + }, + { + "icon_id": "25778782", + "name": "精准布控icon_off", + "font_class": "jingzhunbukongicon_off", + "unicode": "e729", + "unicode_decimal": 59177 + }, + { + "icon_id": "25528851", + "name": "跳转", + "font_class": "tiaozhuan", + "unicode": "e727", + "unicode_decimal": 59175 + }, + { + "icon_id": "25364398", + "name": "设置", + "font_class": "shezhi", + "unicode": "e726", + "unicode_decimal": 59174 + }, + { + "icon_id": "25364282", + "name": "帮助", + "font_class": "bangzhu1", + "unicode": "e725", + "unicode_decimal": 59173 + }, + { + "icon_id": "25156298", + "name": "刷新", + "font_class": "shuaxin1", + "unicode": "e724", + "unicode_decimal": 59172 + }, + { + "icon_id": "25011432", + "name": "多素材备份", + "font_class": "duosucaibeifen", + "unicode": "e722", + "unicode_decimal": 59170 + }, + { + "icon_id": "25011433", + "name": "多素材", + "font_class": "duosucai", + "unicode": "e723", + "unicode_decimal": 59171 + }, + { + "icon_id": "24963746", + "name": "数据统计", + "font_class": "shujutongji", + "unicode": "e721", + "unicode_decimal": 59169 + }, + { + "icon_id": "24944893", + "name": "人脸", + "font_class": "renlian", + "unicode": "e71c", + "unicode_decimal": 59164 + }, + { + "icon_id": "24944894", + "name": "形体", + "font_class": "xingti", + "unicode": "e71d", + "unicode_decimal": 59165 + }, + { + "icon_id": "24944895", + "name": "机动车", + "font_class": "jidongche", + "unicode": "e71e", + "unicode_decimal": 59166 + }, + { + "icon_id": "24944896", + "name": "回溯分析", + "font_class": "huisufenxi4", + "unicode": "e71f", + "unicode_decimal": 59167 + }, + { + "icon_id": "24944897", + "name": "离线分析", + "font_class": "lixianfenxi4", + "unicode": "e720", + "unicode_decimal": 59168 + }, + { + "icon_id": "24944892", + "name": "非机动车", + "font_class": "feijidongche", + "unicode": "e71b", + "unicode_decimal": 59163 + }, + { + "icon_id": "24936781", + "name": "数据大屏", + "font_class": "shujudaping", + "unicode": "e71a", + "unicode_decimal": 59162 + }, + { + "icon_id": "24913034", + "name": "配置算法", + "font_class": "peizhisuanfa", + "unicode": "e719", + "unicode_decimal": 59161 + }, + { + "icon_id": "24685855", + "name": "追踪", + "font_class": "zhuizong", + "unicode": "e715", + "unicode_decimal": 59157 + }, + { + "icon_id": "24685856", + "name": "追踪nor", + "font_class": "zhuizongnor", + "unicode": "e716", + "unicode_decimal": 59158 + }, + { + "icon_id": "24661441", + "name": "点位", + "font_class": "dianwei", + "unicode": "e714", + "unicode_decimal": 59156 + }, + { + "icon_id": "24661326", + "name": "Container", + "font_class": "Container", + "unicode": "e713", + "unicode_decimal": 59155 + }, + { + "icon_id": "24661126", + "name": "Attachment", + "font_class": "Attachment", + "unicode": "e712", + "unicode_decimal": 59154 + }, + { + "icon_id": "24630118", + "name": "叉", + "font_class": "cha", + "unicode": "e711", + "unicode_decimal": 59153 + }, + { + "icon_id": "24630116", + "name": "勾", + "font_class": "gou", + "unicode": "e710", + "unicode_decimal": 59152 + }, + { + "icon_id": "24630033", + "name": "导入", + "font_class": "daoru", + "unicode": "e70f", + "unicode_decimal": 59151 + }, + { + "icon_id": "24607250", + "name": "全息检索", + "font_class": "quanxijiansuo", + "unicode": "e70e", + "unicode_decimal": 59150 + }, + { + "icon_id": "24604837", + "name": "查看监控", + "font_class": "chakanjiankong", + "unicode": "e70c", + "unicode_decimal": 59148 + }, + { + "icon_id": "24604704", + "name": "提示", + "font_class": "tishi3", + "unicode": "e70d", + "unicode_decimal": 59149 + }, + { + "icon_id": "24604626", + "name": "黑夜模式", + "font_class": "heiyemoshi", + "unicode": "e70b", + "unicode_decimal": 59147 + }, + { + "icon_id": "24604623", + "name": "正常模式", + "font_class": "zhengchangmoshi", + "unicode": "e70a", + "unicode_decimal": 59146 + }, + { + "icon_id": "24554896", + "name": "定位", + "font_class": "dingwei1", + "unicode": "e709", + "unicode_decimal": 59145 + }, + { + "icon_id": "24442799", + "name": "排序", + "font_class": "paixu", + "unicode": "e708", + "unicode_decimal": 59144 + }, + { + "icon_id": "24420402", + "name": "添加预案", + "font_class": "tianjiayuan", + "unicode": "e707", + "unicode_decimal": 59143 + }, + { + "icon_id": "23916590", + "name": "聚类档案库nor", + "font_class": "juleidangankunor", + "unicode": "e705", + "unicode_decimal": 59141 + }, + { + "icon_id": "23916591", + "name": "聚类档案库", + "font_class": "juleidanganku", + "unicode": "e706", + "unicode_decimal": 59142 + }, + { + "icon_id": "23499142", + "name": "关联", + "font_class": "guanlian", + "unicode": "e704", + "unicode_decimal": 59140 + }, + { + "icon_id": "23444887", + "name": "人脸标注", + "font_class": "renlianbiaozhu", + "unicode": "e703", + "unicode_decimal": 59139 + }, + { + "icon_id": "23304285", + "name": "聚类结果", + "font_class": "juleijieguo", + "unicode": "e6ec", + "unicode_decimal": 59116 + }, + { + "icon_id": "23304286", + "name": "聚类任务nor", + "font_class": "juleirenwunor", + "unicode": "e6fb", + "unicode_decimal": 59131 + }, + { + "icon_id": "23304287", + "name": "聚类结果nor", + "font_class": "juleijieguonor", + "unicode": "e701", + "unicode_decimal": 59137 + }, + { + "icon_id": "23304288", + "name": "聚类任务", + "font_class": "juleirenwu", + "unicode": "e702", + "unicode_decimal": 59138 + }, + { + "icon_id": "20290678", + "name": "重置", + "font_class": "zhongzhi3", + "unicode": "e8ff", + "unicode_decimal": 59647 + }, + { + "icon_id": "23210742", + "name": "旋转", + "font_class": "xuanzhuan1", + "unicode": "e6fd", + "unicode_decimal": 59133 + }, + { + "icon_id": "23254545", + "name": "双目标注", + "font_class": "shuangmubiaozhu1", + "unicode": "e700", + "unicode_decimal": 59136 + }, + { + "icon_id": "23203403", + "name": "手动框选", + "font_class": "shoudongkuangxuan", + "unicode": "e6f9", + "unicode_decimal": 59129 + }, + { + "icon_id": "23234078", + "name": "暂停", + "font_class": "zanting1", + "unicode": "e6fe", + "unicode_decimal": 59134 + }, + { + "icon_id": "23234079", + "name": "中止", + "font_class": "zhongzhi1", + "unicode": "e6ff", + "unicode_decimal": 59135 + }, + { + "icon_id": "23203404", + "name": "手动", + "font_class": "shoudong", + "unicode": "e6fa", + "unicode_decimal": 59130 + }, + { + "icon_id": "23203406", + "name": "自动", + "font_class": "zidong", + "unicode": "e6fc", + "unicode_decimal": 59132 + }, + { + "icon_id": "23203224", + "name": "诊断", + "font_class": "zhenduan", + "unicode": "e6f8", + "unicode_decimal": 59128 + }, + { + "icon_id": "23203126", + "name": "Check-Circle-Fill", + "font_class": "Check-Circle-Fill1", + "unicode": "e6f3", + "unicode_decimal": 59123 + }, + { + "icon_id": "23203127", + "name": "Info--Circle-Fill", + "font_class": "Info--Circle-Fill", + "unicode": "e6f4", + "unicode_decimal": 59124 + }, + { + "icon_id": "23203128", + "name": "Close-Circle-Fill", + "font_class": "Close-Circle-Fill", + "unicode": "e6f5", + "unicode_decimal": 59125 + }, + { + "icon_id": "23203129", + "name": "Warning-Circle-Fill", + "font_class": "Warning-Circle-Fill", + "unicode": "e6f6", + "unicode_decimal": 59126 + }, + { + "icon_id": "23203130", + "name": "Question-Circle-Fill", + "font_class": "Question-Circle-Fill", + "unicode": "e6f7", + "unicode_decimal": 59127 + }, + { + "icon_id": "23071890", + "name": "暂存架", + "font_class": "zancunjia", + "unicode": "e6f2", + "unicode_decimal": 59122 + }, + { + "icon_id": "22907690", + "name": "Check-Circle-Fill", + "font_class": "Check-Circle-Fill", + "unicode": "e6f1", + "unicode_decimal": 59121 + }, + { + "icon_id": "22884339", + "name": "图片集", + "font_class": "tupianji", + "unicode": "e6f0", + "unicode_decimal": 59120 + }, + { + "icon_id": "22871348", + "name": "全屏", + "font_class": "quanping1", + "unicode": "e6ed", + "unicode_decimal": 59117 + }, + { + "icon_id": "22871349", + "name": "音量", + "font_class": "yinliang", + "unicode": "e6ee", + "unicode_decimal": 59118 + }, + { + "icon_id": "22871350", + "name": "缩小", + "font_class": "suoxiao1", + "unicode": "e6ef", + "unicode_decimal": 59119 + }, + { + "icon_id": "22658169", + "name": "home", + "font_class": "home", + "unicode": "e6eb", + "unicode_decimal": 59115 + }, + { + "icon_id": "22658130", + "name": "最小化", + "font_class": "zuixiaohua", + "unicode": "e6e9", + "unicode_decimal": 59113 + }, + { + "icon_id": "22658131", + "name": "最大化", + "font_class": "zuidahua", + "unicode": "e6ea", + "unicode_decimal": 59114 + }, + { + "icon_id": "22658054", + "name": "标准化", + "font_class": "biaozhunhua", + "unicode": "e6e6", + "unicode_decimal": 59110 + }, + { + "icon_id": "22544357", + "name": "聚类", + "font_class": "julei", + "unicode": "e6e5", + "unicode_decimal": 59109 + }, + { + "icon_id": "21829058", + "name": "密码可见", + "font_class": "bianzu", + "unicode": "e6e7", + "unicode_decimal": 59111 + }, + { + "icon_id": "21829059", + "name": "密码不可见", + "font_class": "bianzu3", + "unicode": "e6e8", + "unicode_decimal": 59112 + }, + { + "icon_id": "21780473", + "name": "编组 7", + "font_class": "bianzu7", + "unicode": "e6e3", + "unicode_decimal": 59107 + }, + { + "icon_id": "21780474", + "name": "编组 2", + "font_class": "bianzu2", + "unicode": "e6e4", + "unicode_decimal": 59108 + }, + { + "icon_id": "21738272", + "name": "卡片切换", + "font_class": "kapianqiehuan", + "unicode": "e6e2", + "unicode_decimal": 59106 + }, + { + "icon_id": "21695431", + "name": "多边形", + "font_class": "duobianxing1", + "unicode": "e6e0", + "unicode_decimal": 59104 + }, + { + "icon_id": "21695432", + "name": "方", + "font_class": "fang1", + "unicode": "e6e1", + "unicode_decimal": 59105 + }, + { + "icon_id": "21695430", + "name": "圆", + "font_class": "yuan1", + "unicode": "e6df", + "unicode_decimal": 59103 + }, + { + "icon_id": "21695426", + "name": "测距离", + "font_class": "cejuli", + "unicode": "e6de", + "unicode_decimal": 59102 + }, + { + "icon_id": "21694880", + "name": "网格框选nor", + "font_class": "wanggekuangxuannor", + "unicode": "e6dc", + "unicode_decimal": 59100 + }, + { + "icon_id": "21694881", + "name": "路径框选nor", + "font_class": "lujingkuangxuannor", + "unicode": "e6dd", + "unicode_decimal": 59101 + }, + { + "icon_id": "21600424", + "name": "穿梭", + "font_class": "chuansuo", + "unicode": "e6db", + "unicode_decimal": 59099 + }, + { + "icon_id": "21248188", + "name": "边缘盒子", + "font_class": "bianyuanhezinor", + "unicode": "e6d8", + "unicode_decimal": 59096 + }, + { + "icon_id": "21248189", + "name": "误检库", + "font_class": "wujiankuhov", + "unicode": "e6d9", + "unicode_decimal": 59097 + }, + { + "icon_id": "21248190", + "name": "操作日志", + "font_class": "caozuorizhinor", + "unicode": "e6da", + "unicode_decimal": 59098 + }, + { + "icon_id": "13838312", + "name": "collect_dot", + "font_class": "collect_dot", + "unicode": "e619", + "unicode_decimal": 58905 + }, + { + "icon_id": "20982904", + "name": "出现定位bg", + "font_class": "chuxiandingweibg", + "unicode": "e6d4", + "unicode_decimal": 59092 + }, + { + "icon_id": "20982905", + "name": "出现定位icon", + "font_class": "chuxiandingweiicon", + "unicode": "e6d5", + "unicode_decimal": 59093 + }, + { + "icon_id": "20982843", + "name": "摄像头定位bg", + "font_class": "shexiangtoudingweibg", + "unicode": "e6d6", + "unicode_decimal": 59094 + }, + { + "icon_id": "20982844", + "name": "摄像头定位icon", + "font_class": "shexiangtoudingweiicon", + "unicode": "e6d7", + "unicode_decimal": 59095 + }, + { + "icon_id": "20933994", + "name": "下发结果", + "font_class": "xiafajieguo", + "unicode": "e6d2", + "unicode_decimal": 59090 + }, + { + "icon_id": "20933996", + "name": "导出", + "font_class": "daochu1", + "unicode": "e6d3", + "unicode_decimal": 59091 + }, + { + "icon_id": "20933901", + "name": "最近出现", + "font_class": "zuijinchuxian", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "20933902", + "name": "累计抓拍", + "font_class": "leijizhuapai", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "20933907", + "name": "异常事件", + "font_class": "yichangshijian", + "unicode": "e6d1", + "unicode_decimal": 59089 + }, + { + "icon_id": "20925063", + "name": "定位", + "font_class": "dingwei", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "20894407", + "name": "图片", + "font_class": "tupian", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "20433461", + "name": "失败原因", + "font_class": "wenti", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "20432083", + "name": "点位-已选中", + "font_class": "lixian1", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "20415322", + "name": "异常", + "font_class": "yichang", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "19332242", + "name": "追形-修改点位", + "font_class": "zhuixing-xiugaidianwei", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "19049729", + "name": "问号", + "font_class": "wenhao1", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "19041610", + "name": "地图_定位", + "font_class": "ditu_dingwei", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "19041571", + "name": "地图_放大", + "font_class": "ditu_fangda", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "19041572", + "name": "地图_缩小", + "font_class": "ditu_suoxiao", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "19039288", + "name": "查看布控任务", + "font_class": "chakanbukongrenwu", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "18985662", + "name": "裂图", + "font_class": "lietu", + "unicode": "e687", + "unicode_decimal": 59015 + }, + { + "icon_id": "18907313", + "name": "重置", + "font_class": "zhongzhi", + "unicode": "e67e", + "unicode_decimal": 59006 + }, + { + "icon_id": "18907314", + "name": "下拉大", + "font_class": "xialada", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "18905520", + "name": "智能关联_形体", + "font_class": "zhinengguanlian_xingti", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "18905521", + "name": "智能关联_人脸", + "font_class": "zhinengguanlian_renlian", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "16018461", + "name": "下箭头", + "font_class": "xiajiantou", + "unicode": "e75c", + "unicode_decimal": 59228 + }, + { + "icon_id": "18885308", + "name": "智能关联_小箭头", + "font_class": "zhinengguanlian_xiaojiantou", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "18883781", + "name": "智能关联_箭头", + "font_class": "zhinengguanlian_jiantou", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "16018463", + "name": "上箭头", + "font_class": "shangjiantou", + "unicode": "e75d", + "unicode_decimal": 59229 + }, + { + "icon_id": "18686782", + "name": "版本信息", + "font_class": "banbenxinxi", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "1330924", + "name": "问号", + "font_class": "wenhao", + "unicode": "e61f", + "unicode_decimal": 58911 + }, + { + "icon_id": "17614568", + "name": "编辑人员", + "font_class": "bianjirenyuan", + "unicode": "e7e0", + "unicode_decimal": 59360 + }, + { + "icon_id": "17416216", + "name": "提示", + "font_class": "tishi2", + "unicode": "e7df", + "unicode_decimal": 59359 + }, + { + "icon_id": "17292128", + "name": "摄像机", + "font_class": "shexiangji2", + "unicode": "e7de", + "unicode_decimal": 59358 + }, + { + "icon_id": "17255570", + "name": "轨迹追踪", + "font_class": "guijizhuizong", + "unicode": "e7dd", + "unicode_decimal": 59357 + }, + { + "icon_id": "17255389", + "name": "截帧", + "font_class": "jiezhen1", + "unicode": "e7dc", + "unicode_decimal": 59356 + }, + { + "icon_id": "17254424", + "name": "添加轨迹回溯", + "font_class": "tianjiaguijihuisu", + "unicode": "e7db", + "unicode_decimal": 59355 + }, + { + "icon_id": "17251847", + "name": "停止", + "font_class": "tingzhi", + "unicode": "e7cd", + "unicode_decimal": 59341 + }, + { + "icon_id": "17251960", + "name": "包围圈", + "font_class": "baoweiquan", + "unicode": "e7ce", + "unicode_decimal": 59342 + }, + { + "icon_id": "17252131", + "name": "上传视频", + "font_class": "shangchuanshipin", + "unicode": "e7d0", + "unicode_decimal": 59344 + }, + { + "icon_id": "17252147", + "name": "移动", + "font_class": "yidong", + "unicode": "e7d1", + "unicode_decimal": 59345 + }, + { + "icon_id": "17252288", + "name": "创建新布控", + "font_class": "chuangjianxinbukong1", + "unicode": "e7d2", + "unicode_decimal": 59346 + }, + { + "icon_id": "17253015", + "name": "移除", + "font_class": "yichu1", + "unicode": "e7d3", + "unicode_decimal": 59347 + }, + { + "icon_id": "17253033", + "name": "提示", + "font_class": "tishi1", + "unicode": "e7d4", + "unicode_decimal": 59348 + }, + { + "icon_id": "17253112", + "name": "VS", + "font_class": "VS", + "unicode": "e7d5", + "unicode_decimal": 59349 + }, + { + "icon_id": "17253139", + "name": "全局总览", + "font_class": "quanjuzonglan", + "unicode": "e7d6", + "unicode_decimal": 59350 + }, + { + "icon_id": "17253187", + "name": "查看分析任务", + "font_class": "chakanfenxirenwu1", + "unicode": "e7d7", + "unicode_decimal": 59351 + }, + { + "icon_id": "17253208", + "name": "消息", + "font_class": "xiaoxi", + "unicode": "e7d8", + "unicode_decimal": 59352 + }, + { + "icon_id": "17254065", + "name": "用户名", + "font_class": "yonghuming", + "unicode": "e7d9", + "unicode_decimal": 59353 + }, + { + "icon_id": "17254204", + "name": "退出", + "font_class": "tuichu", + "unicode": "e7da", + "unicode_decimal": 59354 + }, + { + "icon_id": "17251737", + "name": "轨迹追踪nor", + "font_class": "guijizhuizongnor", + "unicode": "e7cb", + "unicode_decimal": 59339 + }, + { + "icon_id": "17251738", + "name": "轨迹追踪", + "font_class": "guijizhuizong2", + "unicode": "e7cc", + "unicode_decimal": 59340 + }, + { + "icon_id": "17190034", + "name": "布控任务", + "font_class": "bukongrenwu1", + "unicode": "e7b7", + "unicode_decimal": 59319 + }, + { + "icon_id": "17190035", + "name": "摄像机", + "font_class": "shexiangji", + "unicode": "e7b8", + "unicode_decimal": 59320 + }, + { + "icon_id": "17190037", + "name": "预警地图", + "font_class": "yujingditu", + "unicode": "e7ba", + "unicode_decimal": 59322 + }, + { + "icon_id": "17190038", + "name": "离线分析", + "font_class": "lixianfenxi2", + "unicode": "e7bb", + "unicode_decimal": 59323 + }, + { + "icon_id": "17190039", + "name": "预案管理", + "font_class": "yuanguanli1", + "unicode": "e7bc", + "unicode_decimal": 59324 + }, + { + "icon_id": "17190040", + "name": "档案库", + "font_class": "danganku", + "unicode": "e7bd", + "unicode_decimal": 59325 + }, + { + "icon_id": "17190041", + "name": "回溯分析", + "font_class": "huisufenxi2", + "unicode": "e7be", + "unicode_decimal": 59326 + }, + { + "icon_id": "17190042", + "name": "库内检索", + "font_class": "kuneijiansuo", + "unicode": "e7bf", + "unicode_decimal": 59327 + }, + { + "icon_id": "17190043", + "name": "结构化查询", + "font_class": "jiegouhuachaxun", + "unicode": "e7c0", + "unicode_decimal": 59328 + }, + { + "icon_id": "17190062", + "name": "布控任务", + "font_class": "bukongrenwu2", + "unicode": "e7c2", + "unicode_decimal": 59330 + }, + { + "icon_id": "17190063", + "name": "预案管理", + "font_class": "yuanguanli2", + "unicode": "e7c3", + "unicode_decimal": 59331 + }, + { + "icon_id": "17190064", + "name": "摄像机", + "font_class": "shexiangji1", + "unicode": "e7c4", + "unicode_decimal": 59332 + }, + { + "icon_id": "17190065", + "name": "库内检索", + "font_class": "kuneijiansuo1", + "unicode": "e7c5", + "unicode_decimal": 59333 + }, + { + "icon_id": "17190066", + "name": "离线分析", + "font_class": "lixianfenxi3", + "unicode": "e7c6", + "unicode_decimal": 59334 + }, + { + "icon_id": "17190067", + "name": "档案库", + "font_class": "danganku1", + "unicode": "e7c7", + "unicode_decimal": 59335 + }, + { + "icon_id": "17190068", + "name": "预警地图", + "font_class": "yujingditu1", + "unicode": "e7c8", + "unicode_decimal": 59336 + }, + { + "icon_id": "17190069", + "name": "回溯分析", + "font_class": "huisufenxi3", + "unicode": "e7c9", + "unicode_decimal": 59337 + }, + { + "icon_id": "17190167", + "name": "结构化查询nor", + "font_class": "jiegouhuachaxunnor", + "unicode": "e7ca", + "unicode_decimal": 59338 + }, + { + "icon_id": "17073967", + "name": "创建新布控", + "font_class": "chuangjianxinbukong", + "unicode": "e7b6", + "unicode_decimal": 59318 + }, + { + "icon_id": "16018746", + "name": "框选", + "font_class": "kuangxuan", + "unicode": "e77f", + "unicode_decimal": 59263 + }, + { + "icon_id": "16018715", + "name": "高级筛选", + "font_class": "gaojishaixuan", + "unicode": "e779", + "unicode_decimal": 59257 + }, + { + "icon_id": "16018716", + "name": "高级筛选收起", + "font_class": "gaojishaixuanshouqi", + "unicode": "e77a", + "unicode_decimal": 59258 + }, + { + "icon_id": "16924391", + "name": "布控任务", + "font_class": "bukongrenwu", + "unicode": "e7b5", + "unicode_decimal": 59317 + }, + { + "icon_id": "16018385", + "name": "日期", + "font_class": "riqi", + "unicode": "e74f", + "unicode_decimal": 59215 + }, + { + "icon_id": "16301333", + "name": "时间切换", + "font_class": "shijianqiehuan", + "unicode": "e797", + "unicode_decimal": 59287 + }, + { + "icon_id": "16905699", + "name": "授权", + "font_class": "shouquan1", + "unicode": "e7b3", + "unicode_decimal": 59315 + }, + { + "icon_id": "647455", + "name": "播放", + "font_class": "video-play", + "unicode": "e653", + "unicode_decimal": 58963 + }, + { + "icon_id": "16611521", + "name": "实时分析", + "font_class": "shishifenxi", + "unicode": "e7af", + "unicode_decimal": 59311 + }, + { + "icon_id": "16611522", + "name": "查看分析任务", + "font_class": "chakanfenxirenwu", + "unicode": "e7b0", + "unicode_decimal": 59312 + }, + { + "icon_id": "16611335", + "name": "结构化分析", + "font_class": "jiegouhuafenxi", + "unicode": "e7ad", + "unicode_decimal": 59309 + }, + { + "icon_id": "14985809", + "name": "添加轨迹", + "font_class": "tianjiaguiji2", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "15056394", + "name": "添加检索目标", + "font_class": "tianjiajiansuomubiao", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "14677591", + "name": "add", + "font_class": "add", + "unicode": "e661", + "unicode_decimal": 58977 + }, + { + "icon_id": "16320529", + "name": "地点", + "font_class": "didian", + "unicode": "e798", + "unicode_decimal": 59288 + }, + { + "icon_id": "16406202", + "name": "播放hov", + "font_class": "bofanghov", + "unicode": "e79f", + "unicode_decimal": 59295 + }, + { + "icon_id": "16406205", + "name": "播放", + "font_class": "bofang3", + "unicode": "e7a0", + "unicode_decimal": 59296 + }, + { + "icon_id": "16018760", + "name": "警告", + "font_class": "jinggao", + "unicode": "e788", + "unicode_decimal": 59272 + }, + { + "icon_id": "16018761", + "name": "提示", + "font_class": "tishi", + "unicode": "e789", + "unicode_decimal": 59273 + }, + { + "icon_id": "16018772", + "name": "帮助", + "font_class": "bangzhu", + "unicode": "e78a", + "unicode_decimal": 59274 + }, + { + "icon_id": "16018774", + "name": "关闭", + "font_class": "guanbi1", + "unicode": "e78b", + "unicode_decimal": 59275 + }, + { + "icon_id": "16018783", + "name": "成功", + "font_class": "chenggong", + "unicode": "e78c", + "unicode_decimal": 59276 + }, + { + "icon_id": "16438442", + "name": "前往", + "font_class": "qianwang", + "unicode": "e7ac", + "unicode_decimal": 59308 + }, + { + "icon_id": "16437744", + "name": "授权", + "font_class": "shouquan", + "unicode": "e7ab", + "unicode_decimal": 59307 + }, + { + "icon_id": "16436820", + "name": "经纬度", + "font_class": "jingweidu", + "unicode": "e7aa", + "unicode_decimal": 59306 + }, + { + "icon_id": "16018384", + "name": "删除", + "font_class": "shanchu1", + "unicode": "e74e", + "unicode_decimal": 59214 + }, + { + "icon_id": "16018750", + "name": "导出", + "font_class": "daochu", + "unicode": "e782", + "unicode_decimal": 59266 + }, + { + "icon_id": "16436718", + "name": "资源管理", + "font_class": "ziyuanguanli", + "unicode": "e7a4", + "unicode_decimal": 59300 + }, + { + "icon_id": "16436719", + "name": "服务器授权", + "font_class": "fuwuqishouquan", + "unicode": "e7a5", + "unicode_decimal": 59301 + }, + { + "icon_id": "16436720", + "name": "修改密码", + "font_class": "xiugaimima", + "unicode": "e7a6", + "unicode_decimal": 59302 + }, + { + "icon_id": "16436721", + "name": "账号管理", + "font_class": "zhanghaoguanli", + "unicode": "e7a7", + "unicode_decimal": 59303 + }, + { + "icon_id": "16436722", + "name": "算力配额", + "font_class": "suanlipeie", + "unicode": "e7a8", + "unicode_decimal": 59304 + }, + { + "icon_id": "16436723", + "name": "VMS配置", + "font_class": "VMSpeizhi", + "unicode": "e7a9", + "unicode_decimal": 59305 + }, + { + "icon_id": "16059984", + "name": "添加", + "font_class": "tianjia1", + "unicode": "e794", + "unicode_decimal": 59284 + }, + { + "icon_id": "16059985", + "name": "移除", + "font_class": "yichu", + "unicode": "e795", + "unicode_decimal": 59285 + }, + { + "icon_id": "15809722", + "name": "路径", + "font_class": "lujing", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "15809625", + "name": "监控信息", + "font_class": "jiankongxinxi", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "15809627", + "name": "范围", + "font_class": "fanwei", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "15809628", + "name": "案发地点", + "font_class": "anfadidian", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "15809688", + "name": "工具箱", + "font_class": "gongjuxiang", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "15809690", + "name": "工具箱关闭1", + "font_class": "gongjuxiangguanbi1", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "15663416", + "name": "截侦", + "font_class": "jiezhen", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "15660940", + "name": "回溯分析1", + "font_class": "huisufenxi1", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "15660941", + "name": "回溯分析", + "font_class": "huisufenxi", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "15492023", + "name": "添加视频文件", + "font_class": "tianjiashipinwenjian1", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "15415140", + "name": "加载失败", + "font_class": "jiazaishibai", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "15415141", + "name": "刷新", + "font_class": "shuaxin", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "15340138", + "name": "全屏", + "font_class": "quanping", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "15340139", + "name": "取消全屏", + "font_class": "quxiaoquanping", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "15329202", + "name": "视频播放", + "font_class": "shipinbofang", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "15329203", + "name": "视频暂停", + "font_class": "shipinzanting", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "15291283", + "name": "离线轨迹", + "font_class": "lixianguiji", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "15291280", + "name": "离线", + "font_class": "lixian", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "15208512", + "name": "小角标", + "font_class": "xiaojiaobiao", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "15136409", + "name": "上传", + "font_class": "shangchuan1", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "15136380", + "name": "添加为检索对象", + "font_class": "tianjiaweijiansuoduixiang", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "15136381", + "name": "添加为检索记录", + "font_class": "tianjiaweijiansuojilu", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "15085430", + "name": "离线分析", + "font_class": "lixianfenxi1", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "15078532", + "name": "快速检索hov", + "font_class": "kuaisujiansuohov", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "15078533", + "name": "快速检索", + "font_class": "kuaisujiansuo1", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "15076848", + "name": "快速检索", + "font_class": "kuaisujiansuo", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "15076727", + "name": "预案管理", + "font_class": "yuanguanli", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "15076728", + "name": "摄像头", + "font_class": "shexiangtou", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "15076729", + "name": "离线分析", + "font_class": "lixianfenxi", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "13838314", + "name": "filter", + "font_class": "filter", + "unicode": "e61a", + "unicode_decimal": 58906 + }, + { + "icon_id": "15010235", + "name": "添加为追踪对象", + "font_class": "tianjiaweizhuizongduixiang2", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "14986007", + "name": "添加为追踪对象", + "font_class": "tianjiaweizhuizongduixiang1", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "14982860", + "name": "保存", + "font_class": "baocun1", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "14981791", + "name": "添加视频文件夹", + "font_class": "tianjiashipinwenjianjia", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "14981792", + "name": "添加视频文件", + "font_class": "tianjiashipinwenjian", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "14981667", + "name": "地图", + "font_class": "ditu", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "14981619", + "name": "新建摄像头", + "font_class": "xinjianshexiangtou", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "14981570", + "name": "历史回溯", + "font_class": "lishihuisu", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "14796345", + "name": "deco已添加为轨迹", + "font_class": "decoyitianjiaweiguiji", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "14796466", + "name": "播放切换", + "font_class": "bofangqiehuan", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "14796642", + "name": "添加", + "font_class": "tianjia", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "14795587", + "name": "保存", + "font_class": "baocun", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "14795971", + "name": "工具箱关闭", + "font_class": "gongjuxiangguanbi", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "14795973", + "name": "上传", + "font_class": "shangchuan", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "14795974", + "name": "工具箱", + "font_class": "gongjuxiang1", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "14682024", + "name": "logo", + "font_class": "logo", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "13841331", + "name": "setting", + "font_class": "setting", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "13841332", + "name": "user", + "font_class": "user", + "unicode": "e628", + "unicode_decimal": 58920 + }, + { + "icon_id": "13841333", + "name": "quit", + "font_class": "quit", + "unicode": "e629", + "unicode_decimal": 58921 + }, + { + "icon_id": "14681873", + "name": "arrow展开没选中", + "font_class": "arrowzhankaimeixuanzhong", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "14681874", + "name": "arrow展开选中", + "font_class": "arrowzhankaixuanzhong", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "14681940", + "name": "选择选中", + "font_class": "xuanzexuanzhong", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "14681960", + "name": "选择半选", + "font_class": "xuanzebanxuan", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "14681963", + "name": "选择nor", + "font_class": "xuanzenor", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "14681709", + "name": "筛选关闭nor", + "font_class": "shaixuanguanbinor", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "14681588", + "name": "更多", + "font_class": "gengduo", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "14681594", + "name": "右展开", + "font_class": "youzhankai", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "14681599", + "name": "左收起", + "font_class": "zuoshouqi", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "14681557", + "name": "圆", + "font_class": "yuan", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "14681559", + "name": "多边形", + "font_class": "duobianxing", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "14681564", + "name": "方", + "font_class": "fang", + "unicode": "e68c", + "unicode_decimal": 59020 + }, + { + "icon_id": "14681566", + "name": "测距", + "font_class": "ceju", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "14681437", + "name": "实时追踪", + "font_class": "shishizhuizong1", + "unicode": "e683", + "unicode_decimal": 59011 + }, + { + "icon_id": "14681438", + "name": "轨迹回溯", + "font_class": "guijihuisu1", + "unicode": "e684", + "unicode_decimal": 59012 + }, + { + "icon_id": "14681441", + "name": "添加轨迹", + "font_class": "tianjiaguiji", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "14681442", + "name": "移除轨迹", + "font_class": "yichuguiji", + "unicode": "e686", + "unicode_decimal": 59014 + }, + { + "icon_id": "14681327", + "name": "放大", + "font_class": "fangda", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "14681332", + "name": "缩小", + "font_class": "suoxiao", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "14681337", + "name": "下载", + "font_class": "xiazai", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "14681144", + "name": "返回", + "font_class": "fanhui", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "14681046", + "name": "搜索", + "font_class": "sousuo", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "14681047", + "name": "取消选中", + "font_class": "quxiaoxuanzhong", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "14681048", + "name": "批量选择nor", + "font_class": "piliangxuanzenor", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "14681051", + "name": "开启分析", + "font_class": "kaiqifenxi", + "unicode": "e66c", + "unicode_decimal": 58988 + }, + { + "icon_id": "14681060", + "name": "取消分析", + "font_class": "quxiaofenxi", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "14681062", + "name": "筛选", + "font_class": "shaixuan", + "unicode": "e66e", + "unicode_decimal": 58990 + }, + { + "icon_id": "14681067", + "name": "档案", + "font_class": "dangan", + "unicode": "e66f", + "unicode_decimal": 58991 + }, + { + "icon_id": "14681071", + "name": "播放", + "font_class": "bofang", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "14681073", + "name": "暂停", + "font_class": "zanting", + "unicode": "e671", + "unicode_decimal": 58993 + }, + { + "icon_id": "14681075", + "name": "删除", + "font_class": "shanchu", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "14681083", + "name": "添加为追踪对象", + "font_class": "tianjiaweizhuizongduixiang", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "14681086", + "name": "查看大图", + "font_class": "chakandatu", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "14681091", + "name": "检索记录", + "font_class": "jiansuojilu", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "14681108", + "name": "阈值", + "font_class": "yuzhi", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "14681117", + "name": "查看详情", + "font_class": "chakanxiangqing", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "14677552", + "name": "轨迹回溯", + "font_class": "guijihuisu", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "14677553", + "name": "点位配置nor", + "font_class": "dianweipeizhinor", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "14677554", + "name": "一人一档", + "font_class": "yirenyidang", + "unicode": "e65e", + "unicode_decimal": 58974 + }, + { + "icon_id": "14677555", + "name": "同伴分析", + "font_class": "tongbanfenxi", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "14677595", + "name": "切换左", + "font_class": "qiehuanzuo", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "14677596", + "name": "切换右", + "font_class": "qiehuanyou", + "unicode": "e663", + "unicode_decimal": 58979 + }, + { + "icon_id": "14677606", + "name": "停止等待", + "font_class": "tingzhidengdai", + "unicode": "e664", + "unicode_decimal": 58980 + }, + { + "icon_id": "14677607", + "name": "已关闭", + "font_class": "yiguanbi", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "14677648", + "name": "弹窗关闭", + "font_class": "danchuangguanbi", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "14071593", + "name": "历史记录", + "font_class": "lishijilu", + "unicode": "e64a", + "unicode_decimal": 58954 + }, + { + "icon_id": "14070176", + "name": "旋转", + "font_class": "xuanzhuan", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "14070177", + "name": "清除", + "font_class": "qingchu", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "14000087", + "name": "dangantianjia", + "font_class": "dangantianjia", + "unicode": "e63d", + "unicode_decimal": 58941 + }, + { + "icon_id": "14000088", + "name": "bianji", + "font_class": "bianji", + "unicode": "e63e", + "unicode_decimal": 58942 + }, + { + "icon_id": "13979358", + "name": "fullscreen", + "font_class": "fullscreen", + "unicode": "e63b", + "unicode_decimal": 58939 + }, + { + "icon_id": "13979359", + "name": "cancle_fullscreen", + "font_class": "cancle_fullscreen", + "unicode": "e63c", + "unicode_decimal": 58940 + }, + { + "icon_id": "13979335", + "name": "quanyujiansuo_nor", + "font_class": "quanyujiansuo_nor", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "13979336", + "name": "guijihuisu_nor", + "font_class": "guijihuisu_nor", + "unicode": "e63a", + "unicode_decimal": 58938 + } + ] +} diff --git a/packages/icon/es/font/iconfont.ttf b/packages/icon/es/font/iconfont.ttf new file mode 100644 index 0000000..c466c9f Binary files /dev/null and b/packages/icon/es/font/iconfont.ttf differ diff --git a/packages/icon/es/font/iconfont.woff b/packages/icon/es/font/iconfont.woff new file mode 100644 index 0000000..f5b4968 Binary files /dev/null and b/packages/icon/es/font/iconfont.woff differ diff --git a/packages/icon/es/font/iconfont.woff2 b/packages/icon/es/font/iconfont.woff2 new file mode 100644 index 0000000..325adce Binary files /dev/null and b/packages/icon/es/font/iconfont.woff2 differ diff --git a/packages/icon/es/index.js b/packages/icon/es/index.js new file mode 100644 index 0000000..1733337 --- /dev/null +++ b/packages/icon/es/index.js @@ -0,0 +1 @@ +export { default as IconFont } from "./Iconfont"; \ No newline at end of file diff --git a/packages/icon/es/index.less b/packages/icon/es/index.less new file mode 100644 index 0000000..23f5dce --- /dev/null +++ b/packages/icon/es/index.less @@ -0,0 +1,3 @@ +.icon:hover { + color: #6accca !important; +} diff --git a/packages/icon/package.json b/packages/icon/package.json new file mode 100644 index 0000000..959dcb5 --- /dev/null +++ b/packages/icon/package.json @@ -0,0 +1,42 @@ +{ + "name": "@zhst/icon", + "version": "0.2.0", + "description": "图标库", + "keywords": [ + "icon", + "zhst", + "图标库" + ], + "license": "ISC", + "author": "dev", + "sideEffects": [ + "dist/*", + "es/**/style/*", + "lib/**/style/*", + "*.less" + ], + "main": "lib/index.js", + "module": "es/index.js", + "typings": "es/index.d.ts", + "exports": { + ".": { + "require": "./lib/index.js", + "import": "./es/index.js", + "default": "./es/index.js" + } + }, + "files": [ + "es", + "lib" + ], + "scripts": { + "build": "father build" + }, + "publishConfig": { + "access": "public", + "registry": "http://10.0.0.77:4874" + }, + "dependencies": { + "@ant-design/icons": "^5.3.0" + } +} diff --git a/packages/icon/src/Iconfont.tsx b/packages/icon/src/Iconfont.tsx new file mode 100644 index 0000000..ced0757 --- /dev/null +++ b/packages/icon/src/Iconfont.tsx @@ -0,0 +1,50 @@ +import { createFromIconfontCN } from '@ant-design/icons'; +import React from 'react'; +import { ReactNode } from 'react'; + +interface IconFontProps { + styles?: React.CSSProperties; + icon: string; + size?: number; + color?: string; + title?: string; + className?: string; + onIconClick?: (e: React.MouseEvent) => void; + children?: ReactNode; + active?: boolean; + disable?: boolean; +} +const Icon = createFromIconfontCN({ + scriptUrl: require('./font/iconfont.js'), +}); +const IconFont: React.FC = (props) => { + const { + title = '', + styles = {}, + icon, + size = 14, + onIconClick, + children, + active = false, + color = '', + } = props || {}; + return ( + { + onIconClick && onIconClick(e); + }} + style={{ + ...styles, + cursor: 'pointer', + fontSize: size, + color, + ...(active ? { color: '#09f' } : {}), + }} + type={icon} + > + {children} + + ); +}; +export default IconFont; diff --git a/packages/icon/src/demo/basic.tsx b/packages/icon/src/demo/basic.tsx new file mode 100644 index 0000000..9d66d39 --- /dev/null +++ b/packages/icon/src/demo/basic.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { IconFont } from '@zhst/icon'; + +const demo = () => { + + return ( +
+ +
+ ); +}; + +export default demo; diff --git a/packages/icon/src/demo/demo.tsx b/packages/icon/src/demo/demo.tsx new file mode 100644 index 0000000..f415dd7 --- /dev/null +++ b/packages/icon/src/demo/demo.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +const iconJson = require('../font/iconfont.json') +import { IconFont } from '@zhst/icon'; +import './index.less'; +import { message } from '@zhst/meta'; +const demo = ()=>{ + const iconArr = iconJson['glyphs'] + return ( +
+
    + {iconArr.map((item: any)=>{ + const {font_class,name}= item; + const fontName = `icon-${font_class}` + return
  • + { + navigator.clipboard.writeText(fontName) + message.success(`复制${fontName}成功`) + }}> + +
    {name}
    +
    {fontName}
    +
  • + })} +
+
+ ); +} +export default demo \ No newline at end of file diff --git a/packages/icon/src/demo/index.less b/packages/icon/src/demo/index.less new file mode 100644 index 0000000..70b6c9d --- /dev/null +++ b/packages/icon/src/demo/index.less @@ -0,0 +1,20 @@ +.demo { + &-ul { + list-style-type: none; + display: flex; + flex-wrap: wrap; + } + + &-li { + display: flex; + flex-direction: column; + align-items: center; + height: 150px; + width: 150px; + + &-name { + color: #666; + font-size: 12px; + } + } +} \ No newline at end of file diff --git a/packages/icon/src/font/iconfont.css b/packages/icon/src/font/iconfont.css new file mode 100644 index 0000000..ef9f9d5 --- /dev/null +++ b/packages/icon/src/font/iconfont.css @@ -0,0 +1,1743 @@ +@font-face { + font-family: iconfont; /* Project id 1739270 */ + src: url('iconfont.woff2?t=1711094074098') format('woff2'), + url('iconfont.woff?t=1711094074098') format('woff'), + url('iconfont.ttf?t=1711094074098') format('truetype'); +} + +.iconfont { + font-family: iconfont !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-shezhi1::before { + content: "\e7fb"; +} + +.icon-bofang1::before { + content: "\e7fc"; +} + +.icon-zanting2::before { + content: "\e7fa"; +} + +.icon-bangzhu2::before { + content: "\e7f9"; +} + +.icon-daochu2::before { + content: "\e7f7"; +} + +.icon-daoru1::before { + content: "\e7f8"; +} + +.icon-jindonglogo::before { + content: "\e7f6"; +} + +.icon-guankongyujingselect::before { + content: "\e7ef"; +} + +.icon-guankongyujingnor::before { + content: "\e7f0"; +} + +.icon-guankongyuannor::before { + content: "\e7f1"; +} + +.icon-quancengyuanselectbeifen::before { + content: "\e7f2"; +} + +.icon-quancengyujingnor::before { + content: "\e7f3"; +} + +.icon-quancengyuannor::before { + content: "\e7f4"; +} + +.icon-quancengyuanselect::before { + content: "\e7f5"; +} + +.icon-guankongyuanselect::before { + content: "\e7ee"; +} + +.icon-jindong::before { + content: "\e7ed"; +} + +.icon-danganxiangqing_hangweifenxi::before { + content: "\e78d"; +} + +.icon-danganxiangqing_shujuganzhi::before { + content: "\e78e"; +} + +.icon-danganxiangqing_huodongguiji::before { + content: "\e78f"; +} + +.icon-danganxiangqing_jibenxinxi::before { + content: "\e7ea"; +} + +.icon-danganxiangqing_fushuwupin::before { + content: "\e7eb"; +} + +.icon-danganxiangqing_jizhanyingyong::before { + content: "\e7ec"; +} + +.icon-jiarudanganku::before { + content: "\e787"; +} + +.icon-dangankunor::before { + content: "\e793"; +} + +.icon-bukongrenwuselect::before { + content: "\e799"; +} + +.icon-bukongrenwunor1::before { + content: "\e79a"; +} + +.icon-dangankuselect::before { + content: "\e79b"; +} + +.icon-jizhanfanor::before { + content: "\e79c"; +} + +.icon-feijidongchechaxunnor::before { + content: "\e79d"; +} + +.icon-jidongchechaxunselect::before { + content: "\e79e"; +} + +.icon-a-lixianfenxiselect2::before { + content: "\e7a1"; +} + +.icon-huisufenxiselect::before { + content: "\e7a2"; +} + +.icon-jizhanfaselect::before { + content: "\e7a3"; +} + +.icon-mubiaojiansuonor::before { + content: "\e7ae"; +} + +.icon-lurenkuselect::before { + content: "\e7b1"; +} + +.icon-shujujiashicangselect::before { + content: "\e7b2"; +} + +.icon-shishijiexiselect::before { + content: "\e7b4"; +} + +.icon-shishijiexinor::before { + content: "\e7b9"; +} + +.icon-jidongchechaxunnor::before { + content: "\e7c1"; +} + +.icon-lurenkunor1::before { + content: "\e7cf"; +} + +.icon-mubiaotezhengchaxunnor::before { + content: "\e7e1"; +} + +.icon-yujingjiluselect::before { + content: "\e7e2"; +} + +.icon-mubiaotezhengchaxunselect::before { + content: "\e7e3"; +} + +.icon-feijidongchechaxunselect::before { + content: "\e7e4"; +} + +.icon-yujingjilunor::before { + content: "\e7e5"; +} + +.icon-lixianfenxiselect::before { + content: "\e7e6"; +} + +.icon-huisufenxinor::before { + content: "\e7e7"; +} + +.icon-shujujiashicangnor::before { + content: "\e7e8"; +} + +.icon-mubiaojiansuoselect::before { + content: "\e7e9"; +} + +.icon-kuangxuangongju::before { + content: "\e796"; +} + +.icon-fengniao::before { + content: "\e792"; +} + +.icon-zhankai::before { + content: "\e790"; +} + +.icon-shouqi::before { + content: "\e791"; +} + +.icon-shijian::before { + content: "\e786"; +} + +.icon-dingwei2::before { + content: "\e613"; +} + +.icon-renyuan::before { + content: "\e784"; +} + +.icon-houtai::before { + content: "\e785"; +} + +.icon-zuo::before { + content: "\e781"; +} + +.icon-you::before { + content: "\e783"; +} + +.icon-kakou::before { + content: "\e780"; +} + +.icon-yujing1::before { + content: "\e77e"; +} + +.icon-yuan2::before { + content: "\e77d"; +} + +.icon-moxingpengzhuang::before { + content: "\e777"; +} + +.icon-moxingpengzhuangnor::before { + content: "\e778"; +} + +.icon-lurenku::before { + content: "\e77b"; +} + +.icon-lurenkunor::before { + content: "\e77c"; +} + +.icon-shiming::before { + content: "\e776"; +} + +.icon-suoxiao2::before { + content: "\e774"; +} + +.icon-fangda1::before { + content: "\e775"; +} + +.icon-guanbi2::before { + content: "\e772"; +} + +.icon-fanhui1::before { + content: "\e773"; +} + +.icon-xiansuomopai::before { + content: "\e76f"; +} + +.icon-xiansuomopainor::before { + content: "\e76e"; +} + +.icon-zhajiyujing::before { + content: "\e770"; +} + +.icon-zhajiyujingnor::before { + content: "\e771"; +} + +.icon-zhuizongpeizhi::before { + content: "\e76c"; +} + +.icon-zhuizongpeizhinor::before { + content: "\e76d"; +} + +.icon-dapingqiehuan::before { + content: "\e76b"; +} + +.icon-xuanze::before { + content: "\e769"; +} + +.icon-shaixuan1::before { + content: "\e76a"; +} + +.icon-chekashebei::before { + content: "\e764"; +} + +.icon-imsishebei::before { + content: "\e765"; +} + +.icon-xingtishebei::before { + content: "\e766"; +} + +.icon-renlianshebei::before { + content: "\e767"; +} + +.icon-wifishebei::before { + content: "\e768"; +} + +.icon-a-miaozhun2::before { + content: "\e762"; +} + +.icon-a-bianzu19::before { + content: "\e763"; +} + +.icon-fanye::before { + content: "\e75e"; +} + +.icon-shenfenzheng::before { + content: "\e75f"; +} + +.icon-dizhi::before { + content: "\e760"; +} + +.icon-guanbi::before { + content: "\e761"; +} + +.icon-dianwei1::before { + content: "\e75b"; +} + +.icon-weikakou::before { + content: "\e757"; +} + +.icon-weikakounor::before { + content: "\e758"; +} + +.icon-changsuoma::before { + content: "\e759"; +} + +.icon-changsuomanor::before { + content: "\e75a"; +} + +.icon-yujing::before { + content: "\e756"; +} + +.icon-jiansuonor::before { + content: "\e747"; +} + +.icon-tonghangrenfenxinor1::before { + content: "\e748"; +} + +.icon-zhinengyanpannor::before { + content: "\e749"; +} + +.icon-bukongyujingnor::before { + content: "\e74a"; +} + +.icon-bukongrenwunor::before { + content: "\e74b"; +} + +.icon-dianziditunor::before { + content: "\e754"; +} + +.icon-zhuizongnor1::before { + content: "\e755"; +} + +.icon-zhuizong1::before { + content: "\e746"; +} + +.icon-bukongrenwu3::before { + content: "\e74c"; +} + +.icon-dianziditu::before { + content: "\e74d"; +} + +.icon-bukongyujing::before { + content: "\e750"; +} + +.icon-tonghangrenfenxi1::before { + content: "\e751"; +} + +.icon-zhinengyanpan::before { + content: "\e752"; +} + +.icon-jiansuo1::before { + content: "\e753"; +} + +.icon-kaiqijulei::before { + content: "\e745"; +} + +.icon-tongbu::before { + content: "\e744"; +} + +.icon-tonghangrenfenxi::before { + content: "\e743"; +} + +.icon-tonghangrenfenxinor::before { + content: "\e742"; +} + +.icon-jizhanyingyong::before { + content: "\e741"; +} + +.icon-haikangrenlianbukongnor::before { + content: "\e740"; +} + +.icon-haikangrenlianbukong::before { + content: "\e73f"; +} + +.icon-tuozhanshouduantishi::before { + content: "\e73e"; +} + +.icon-fanhuimopailiebiao::before { + content: "\e73d"; +} + +.icon-toukuijiancenor::before { + content: "\e73c"; +} + +.icon-toukuijiance::before { + content: "\e718"; +} + +.icon-zhuixing::before { + content: "\e717"; +} + +.icon-tishi4::before { + content: "\e73b"; +} + +.icon-a-shaixuanfeiji::before { + content: "\e733"; +} + +.icon-a-zidongtiaozhengfanweifeiji::before { + content: "\e73a"; +} + +.icon-heziyunwei::before { + content: "\e739"; +} + +.icon-qiehuan::before { + content: "\e738"; +} + +.icon-disanfangxiaoxinor::before { + content: "\e737"; +} + +.icon-disanfangxiaoxi::before { + content: "\e736"; +} + +.icon-daohang::before { + content: "\e735"; +} + +.icon-yonghu::before { + content: "\e734"; +} + +.icon-feiji::before { + content: "\e732"; +} + +.icon-jieshuzhuizong::before { + content: "\e730"; +} + +.icon-huisuzhoubian::before { + content: "\e731"; +} + +.icon-jixuzhuizong::before { + content: "\e72d"; +} + +.icon-tiaozhengfanwei::before { + content: "\e72e"; +} + +.icon-jiansuo::before { + content: "\e72f"; +} + +.icon-guiji::before { + content: "\e72c"; +} + +.icon-jichuxinxi::before { + content: "\e72b"; +} + +.icon-danganzhaiyao::before { + content: "\e72a"; +} + +.icon-jingzhunbukongicon_on::before { + content: "\e728"; +} + +.icon-jingzhunbukongicon_off::before { + content: "\e729"; +} + +.icon-tiaozhuan::before { + content: "\e727"; +} + +.icon-shezhi::before { + content: "\e726"; +} + +.icon-bangzhu1::before { + content: "\e725"; +} + +.icon-shuaxin1::before { + content: "\e724"; +} + +.icon-duosucaibeifen::before { + content: "\e722"; +} + +.icon-duosucai::before { + content: "\e723"; +} + +.icon-shujutongji::before { + content: "\e721"; +} + +.icon-renlian::before { + content: "\e71c"; +} + +.icon-xingti::before { + content: "\e71d"; +} + +.icon-jidongche::before { + content: "\e71e"; +} + +.icon-huisufenxi4::before { + content: "\e71f"; +} + +.icon-lixianfenxi4::before { + content: "\e720"; +} + +.icon-feijidongche::before { + content: "\e71b"; +} + +.icon-shujudaping::before { + content: "\e71a"; +} + +.icon-peizhisuanfa::before { + content: "\e719"; +} + +.icon-zhuizong::before { + content: "\e715"; +} + +.icon-zhuizongnor::before { + content: "\e716"; +} + +.icon-dianwei::before { + content: "\e714"; +} + +.icon-Container::before { + content: "\e713"; +} + +.icon-Attachment::before { + content: "\e712"; +} + +.icon-cha::before { + content: "\e711"; +} + +.icon-gou::before { + content: "\e710"; +} + +.icon-daoru::before { + content: "\e70f"; +} + +.icon-quanxijiansuo::before { + content: "\e70e"; +} + +.icon-chakanjiankong::before { + content: "\e70c"; +} + +.icon-tishi3::before { + content: "\e70d"; +} + +.icon-heiyemoshi::before { + content: "\e70b"; +} + +.icon-zhengchangmoshi::before { + content: "\e70a"; +} + +.icon-dingwei1::before { + content: "\e709"; +} + +.icon-paixu::before { + content: "\e708"; +} + +.icon-tianjiayuan::before { + content: "\e707"; +} + +.icon-juleidangankunor::before { + content: "\e705"; +} + +.icon-juleidanganku::before { + content: "\e706"; +} + +.icon-guanlian::before { + content: "\e704"; +} + +.icon-renlianbiaozhu::before { + content: "\e703"; +} + +.icon-juleijieguo::before { + content: "\e6ec"; +} + +.icon-juleirenwunor::before { + content: "\e6fb"; +} + +.icon-juleijieguonor::before { + content: "\e701"; +} + +.icon-juleirenwu::before { + content: "\e702"; +} + +.icon-zhongzhi3::before { + content: "\e8ff"; +} + +.icon-xuanzhuan1::before { + content: "\e6fd"; +} + +.icon-shuangmubiaozhu1::before { + content: "\e700"; +} + +.icon-shoudongkuangxuan::before { + content: "\e6f9"; +} + +.icon-zanting1::before { + content: "\e6fe"; +} + +.icon-zhongzhi1::before { + content: "\e6ff"; +} + +.icon-shoudong::before { + content: "\e6fa"; +} + +.icon-zidong::before { + content: "\e6fc"; +} + +.icon-zhenduan::before { + content: "\e6f8"; +} + +.icon-Check-Circle-Fill1::before { + content: "\e6f3"; +} + +.icon-Info--Circle-Fill::before { + content: "\e6f4"; +} + +.icon-Close-Circle-Fill::before { + content: "\e6f5"; +} + +.icon-Warning-Circle-Fill::before { + content: "\e6f6"; +} + +.icon-Question-Circle-Fill::before { + content: "\e6f7"; +} + +.icon-zancunjia::before { + content: "\e6f2"; +} + +.icon-Check-Circle-Fill::before { + content: "\e6f1"; +} + +.icon-tupianji::before { + content: "\e6f0"; +} + +.icon-quanping1::before { + content: "\e6ed"; +} + +.icon-yinliang::before { + content: "\e6ee"; +} + +.icon-suoxiao1::before { + content: "\e6ef"; +} + +.icon-home::before { + content: "\e6eb"; +} + +.icon-zuixiaohua::before { + content: "\e6e9"; +} + +.icon-zuidahua::before { + content: "\e6ea"; +} + +.icon-biaozhunhua::before { + content: "\e6e6"; +} + +.icon-julei::before { + content: "\e6e5"; +} + +.icon-bianzu::before { + content: "\e6e7"; +} + +.icon-bianzu3::before { + content: "\e6e8"; +} + +.icon-bianzu7::before { + content: "\e6e3"; +} + +.icon-bianzu2::before { + content: "\e6e4"; +} + +.icon-kapianqiehuan::before { + content: "\e6e2"; +} + +.icon-duobianxing1::before { + content: "\e6e0"; +} + +.icon-fang1::before { + content: "\e6e1"; +} + +.icon-yuan1::before { + content: "\e6df"; +} + +.icon-cejuli::before { + content: "\e6de"; +} + +.icon-wanggekuangxuannor::before { + content: "\e6dc"; +} + +.icon-lujingkuangxuannor::before { + content: "\e6dd"; +} + +.icon-chuansuo::before { + content: "\e6db"; +} + +.icon-bianyuanhezinor::before { + content: "\e6d8"; +} + +.icon-wujiankuhov::before { + content: "\e6d9"; +} + +.icon-caozuorizhinor::before { + content: "\e6da"; +} + +.icon-collect_dot::before { + content: "\e619"; +} + +.icon-chuxiandingweibg::before { + content: "\e6d4"; +} + +.icon-chuxiandingweiicon::before { + content: "\e6d5"; +} + +.icon-shexiangtoudingweibg::before { + content: "\e6d6"; +} + +.icon-shexiangtoudingweiicon::before { + content: "\e6d7"; +} + +.icon-xiafajieguo::before { + content: "\e6d2"; +} + +.icon-daochu1::before { + content: "\e6d3"; +} + +.icon-zuijinchuxian::before { + content: "\e6cc"; +} + +.icon-leijizhuapai::before { + content: "\e6d0"; +} + +.icon-yichangshijian::before { + content: "\e6d1"; +} + +.icon-dingwei::before { + content: "\e6cb"; +} + +.icon-tupian::before { + content: "\e6ad"; +} + +.icon-wenti::before { + content: "\e6ac"; +} + +.icon-lixian1::before { + content: "\e6ab"; +} + +.icon-yichang::before { + content: "\e6a8"; +} + +.icon-zhuixing-xiugaidianwei::before { + content: "\e6a7"; +} + +.icon-wenhao1::before { + content: "\e69e"; +} + +.icon-ditu_dingwei::before { + content: "\e69d"; +} + +.icon-ditu_fangda::before { + content: "\e689"; +} + +.icon-ditu_suoxiao::before { + content: "\e69a"; +} + +.icon-chakanbukongrenwu::before { + content: "\e688"; +} + +.icon-lietu::before { + content: "\e687"; +} + +.icon-zhongzhi::before { + content: "\e67e"; +} + +.icon-xialada::before { + content: "\e67f"; +} + +.icon-zhinengguanlian_xingti::before { + content: "\e67b"; +} + +.icon-zhinengguanlian_renlian::before { + content: "\e67c"; +} + +.icon-xiajiantou::before { + content: "\e75c"; +} + +.icon-zhinengguanlian_xiaojiantou::before { + content: "\e67d"; +} + +.icon-zhinengguanlian_jiantou::before { + content: "\e67a"; +} + +.icon-shangjiantou::before { + content: "\e75d"; +} + +.icon-banbenxinxi::before { + content: "\e679"; +} + +.icon-wenhao::before { + content: "\e61f"; +} + +.icon-bianjirenyuan::before { + content: "\e7e0"; +} + +.icon-tishi2::before { + content: "\e7df"; +} + +.icon-shexiangji2::before { + content: "\e7de"; +} + +.icon-guijizhuizong::before { + content: "\e7dd"; +} + +.icon-jiezhen1::before { + content: "\e7dc"; +} + +.icon-tianjiaguijihuisu::before { + content: "\e7db"; +} + +.icon-tingzhi::before { + content: "\e7cd"; +} + +.icon-baoweiquan::before { + content: "\e7ce"; +} + +.icon-shangchuanshipin::before { + content: "\e7d0"; +} + +.icon-yidong::before { + content: "\e7d1"; +} + +.icon-chuangjianxinbukong1::before { + content: "\e7d2"; +} + +.icon-yichu1::before { + content: "\e7d3"; +} + +.icon-tishi1::before { + content: "\e7d4"; +} + +.icon-VS::before { + content: "\e7d5"; +} + +.icon-quanjuzonglan::before { + content: "\e7d6"; +} + +.icon-chakanfenxirenwu1::before { + content: "\e7d7"; +} + +.icon-xiaoxi::before { + content: "\e7d8"; +} + +.icon-yonghuming::before { + content: "\e7d9"; +} + +.icon-tuichu::before { + content: "\e7da"; +} + +.icon-guijizhuizongnor::before { + content: "\e7cb"; +} + +.icon-guijizhuizong2::before { + content: "\e7cc"; +} + +.icon-bukongrenwu1::before { + content: "\e7b7"; +} + +.icon-shexiangji::before { + content: "\e7b8"; +} + +.icon-yujingditu::before { + content: "\e7ba"; +} + +.icon-lixianfenxi2::before { + content: "\e7bb"; +} + +.icon-yuanguanli1::before { + content: "\e7bc"; +} + +.icon-danganku::before { + content: "\e7bd"; +} + +.icon-huisufenxi2::before { + content: "\e7be"; +} + +.icon-kuneijiansuo::before { + content: "\e7bf"; +} + +.icon-jiegouhuachaxun::before { + content: "\e7c0"; +} + +.icon-bukongrenwu2::before { + content: "\e7c2"; +} + +.icon-yuanguanli2::before { + content: "\e7c3"; +} + +.icon-shexiangji1::before { + content: "\e7c4"; +} + +.icon-kuneijiansuo1::before { + content: "\e7c5"; +} + +.icon-lixianfenxi3::before { + content: "\e7c6"; +} + +.icon-danganku1::before { + content: "\e7c7"; +} + +.icon-yujingditu1::before { + content: "\e7c8"; +} + +.icon-huisufenxi3::before { + content: "\e7c9"; +} + +.icon-jiegouhuachaxunnor::before { + content: "\e7ca"; +} + +.icon-chuangjianxinbukong::before { + content: "\e7b6"; +} + +.icon-kuangxuan::before { + content: "\e77f"; +} + +.icon-gaojishaixuan::before { + content: "\e779"; +} + +.icon-gaojishaixuanshouqi::before { + content: "\e77a"; +} + +.icon-bukongrenwu::before { + content: "\e7b5"; +} + +.icon-riqi::before { + content: "\e74f"; +} + +.icon-shijianqiehuan::before { + content: "\e797"; +} + +.icon-shouquan1::before { + content: "\e7b3"; +} + +.icon-video-play::before { + content: "\e653"; +} + +.icon-shishifenxi::before { + content: "\e7af"; +} + +.icon-chakanfenxirenwu::before { + content: "\e7b0"; +} + +.icon-jiegouhuafenxi::before { + content: "\e7ad"; +} + +.icon-tianjiaguiji2::before { + content: "\e6aa"; +} + +.icon-tianjiajiansuomubiao::before { + content: "\e6b0"; +} + +.icon-add::before { + content: "\e661"; +} + +.icon-didian::before { + content: "\e798"; +} + +.icon-bofanghov::before { + content: "\e79f"; +} + +.icon-bofang3::before { + content: "\e7a0"; +} + +.icon-jinggao::before { + content: "\e788"; +} + +.icon-tishi::before { + content: "\e789"; +} + +.icon-bangzhu::before { + content: "\e78a"; +} + +.icon-guanbi1::before { + content: "\e78b"; +} + +.icon-chenggong::before { + content: "\e78c"; +} + +.icon-qianwang::before { + content: "\e7ac"; +} + +.icon-shouquan::before { + content: "\e7ab"; +} + +.icon-jingweidu::before { + content: "\e7aa"; +} + +.icon-shanchu1::before { + content: "\e74e"; +} + +.icon-daochu::before { + content: "\e782"; +} + +.icon-ziyuanguanli::before { + content: "\e7a4"; +} + +.icon-fuwuqishouquan::before { + content: "\e7a5"; +} + +.icon-xiugaimima::before { + content: "\e7a6"; +} + +.icon-zhanghaoguanli::before { + content: "\e7a7"; +} + +.icon-suanlipeie::before { + content: "\e7a8"; +} + +.icon-VMSpeizhi::before { + content: "\e7a9"; +} + +.icon-tianjia1::before { + content: "\e794"; +} + +.icon-yichu::before { + content: "\e795"; +} + +.icon-lujing::before { + content: "\e6cf"; +} + +.icon-jiankongxinxi::before { + content: "\e6c8"; +} + +.icon-fanwei::before { + content: "\e6c9"; +} + +.icon-anfadidian::before { + content: "\e6ca"; +} + +.icon-gongjuxiang::before { + content: "\e6cd"; +} + +.icon-gongjuxiangguanbi1::before { + content: "\e6ce"; +} + +.icon-jiezhen::before { + content: "\e6c2"; +} + +.icon-huisufenxi1::before { + content: "\e6c6"; +} + +.icon-huisufenxi::before { + content: "\e6c7"; +} + +.icon-tianjiashipinwenjian1::before { + content: "\e6c5"; +} + +.icon-jiazaishibai::before { + content: "\e6c3"; +} + +.icon-shuaxin::before { + content: "\e6c4"; +} + +.icon-quanping::before { + content: "\e6c0"; +} + +.icon-quxiaoquanping::before { + content: "\e6c1"; +} + +.icon-shipinbofang::before { + content: "\e6be"; +} + +.icon-shipinzanting::before { + content: "\e6bf"; +} + +.icon-lixianguiji::before { + content: "\e6bd"; +} + +.icon-lixian::before { + content: "\e6bc"; +} + +.icon-xiaojiaobiao::before { + content: "\e6bb"; +} + +.icon-shangchuan1::before { + content: "\e6ba"; +} + +.icon-tianjiaweijiansuoduixiang::before { + content: "\e6b8"; +} + +.icon-tianjiaweijiansuojilu::before { + content: "\e6b9"; +} + +.icon-lixianfenxi1::before { + content: "\e6b7"; +} + +.icon-kuaisujiansuohov::before { + content: "\e6b5"; +} + +.icon-kuaisujiansuo1::before { + content: "\e6b6"; +} + +.icon-kuaisujiansuo::before { + content: "\e6b4"; +} + +.icon-yuanguanli::before { + content: "\e6b1"; +} + +.icon-shexiangtou::before { + content: "\e6b2"; +} + +.icon-lixianfenxi::before { + content: "\e6b3"; +} + +.icon-filter::before { + content: "\e61a"; +} + +.icon-tianjiaweizhuizongduixiang2::before { + content: "\e6af"; +} + +.icon-tianjiaweizhuizongduixiang1::before { + content: "\e6ae"; +} + +.icon-baocun1::before { + content: "\e6a9"; +} + +.icon-tianjiashipinwenjianjia::before { + content: "\e6a5"; +} + +.icon-tianjiashipinwenjian::before { + content: "\e6a6"; +} + +.icon-ditu::before { + content: "\e6a4"; +} + +.icon-xinjianshexiangtou::before { + content: "\e6a3"; +} + +.icon-lishihuisu::before { + content: "\e6a2"; +} + +.icon-decoyitianjiaweiguiji::before { + content: "\e69f"; +} + +.icon-bofangqiehuan::before { + content: "\e6a0"; +} + +.icon-tianjia::before { + content: "\e6a1"; +} + +.icon-baocun::before { + content: "\e698"; +} + +.icon-gongjuxiangguanbi::before { + content: "\e699"; +} + +.icon-shangchuan::before { + content: "\e69b"; +} + +.icon-gongjuxiang1::before { + content: "\e69c"; +} + +.icon-logo::before { + content: "\e692"; +} + +.icon-setting::before { + content: "\e627"; +} + +.icon-user::before { + content: "\e628"; +} + +.icon-quit::before { + content: "\e629"; +} + +.icon-arrowzhankaimeixuanzhong::before { + content: "\e693"; +} + +.icon-arrowzhankaixuanzhong::before { + content: "\e694"; +} + +.icon-xuanzexuanzhong::before { + content: "\e695"; +} + +.icon-xuanzebanxuan::before { + content: "\e696"; +} + +.icon-xuanzenor::before { + content: "\e697"; +} + +.icon-shaixuanguanbinor::before { + content: "\e691"; +} + +.icon-gengduo::before { + content: "\e68e"; +} + +.icon-youzhankai::before { + content: "\e68f"; +} + +.icon-zuoshouqi::before { + content: "\e690"; +} + +.icon-yuan::before { + content: "\e68a"; +} + +.icon-duobianxing::before { + content: "\e68b"; +} + +.icon-fang::before { + content: "\e68c"; +} + +.icon-ceju::before { + content: "\e68d"; +} + +.icon-shishizhuizong1::before { + content: "\e683"; +} + +.icon-guijihuisu1::before { + content: "\e684"; +} + +.icon-tianjiaguiji::before { + content: "\e685"; +} + +.icon-yichuguiji::before { + content: "\e686"; +} + +.icon-fangda::before { + content: "\e680"; +} + +.icon-suoxiao::before { + content: "\e681"; +} + +.icon-xiazai::before { + content: "\e682"; +} + +.icon-fanhui::before { + content: "\e678"; +} + +.icon-sousuo::before { + content: "\e669"; +} + +.icon-quxiaoxuanzhong::before { + content: "\e66a"; +} + +.icon-piliangxuanzenor::before { + content: "\e66b"; +} + +.icon-kaiqifenxi::before { + content: "\e66c"; +} + +.icon-quxiaofenxi::before { + content: "\e66d"; +} + +.icon-shaixuan::before { + content: "\e66e"; +} + +.icon-dangan::before { + content: "\e66f"; +} + +.icon-bofang::before { + content: "\e670"; +} + +.icon-zanting::before { + content: "\e671"; +} + +.icon-shanchu::before { + content: "\e672"; +} + +.icon-tianjiaweizhuizongduixiang::before { + content: "\e673"; +} + +.icon-chakandatu::before { + content: "\e674"; +} + +.icon-jiansuojilu::before { + content: "\e675"; +} + +.icon-yuzhi::before { + content: "\e676"; +} + +.icon-chakanxiangqing::before { + content: "\e677"; +} + +.icon-guijihuisu::before { + content: "\e65c"; +} + +.icon-dianweipeizhinor::before { + content: "\e65d"; +} + +.icon-yirenyidang::before { + content: "\e65e"; +} + +.icon-tongbanfenxi::before { + content: "\e65f"; +} + +.icon-qiehuanzuo::before { + content: "\e662"; +} + +.icon-qiehuanyou::before { + content: "\e663"; +} + +.icon-tingzhidengdai::before { + content: "\e664"; +} + +.icon-yiguanbi::before { + content: "\e665"; +} + +.icon-danchuangguanbi::before { + content: "\e666"; +} + +.icon-lishijilu::before { + content: "\e64a"; +} + +.icon-xuanzhuan::before { + content: "\e648"; +} + +.icon-qingchu::before { + content: "\e649"; +} + +.icon-dangantianjia::before { + content: "\e63d"; +} + +.icon-bianji::before { + content: "\e63e"; +} + +.icon-fullscreen::before { + content: "\e63b"; +} + +.icon-cancle_fullscreen::before { + content: "\e63c"; +} + +.icon-quanyujiansuo_nor::before { + content: "\e639"; +} + +.icon-guijihuisu_nor::before { + content: "\e63a"; +} + diff --git a/packages/icon/src/font/iconfont.js b/packages/icon/src/font/iconfont.js new file mode 100644 index 0000000..c009008 --- /dev/null +++ b/packages/icon/src/font/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_1739270='',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var c,i,o,z,t,m=function(a,l){l.parentNode.insertBefore(a,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}c=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_1739270,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?m(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(c,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),c()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=c,z=h.document,t=!1,v(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,p())})}function p(){t||(t=!0,o())}function v(){try{z.documentElement.doScroll("left")}catch(a){return void setTimeout(v,50)}p()}}(window); \ No newline at end of file diff --git a/packages/icon/src/font/iconfont.json b/packages/icon/src/font/iconfont.json new file mode 100644 index 0000000..8466528 --- /dev/null +++ b/packages/icon/src/font/iconfont.json @@ -0,0 +1,3033 @@ +{ + "id": "1739270", + "name": "蜂鸟实时布控系统", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "39554305", + "name": "设置", + "font_class": "shezhi1", + "unicode": "e7fb", + "unicode_decimal": 59387 + }, + { + "icon_id": "39554304", + "name": "播放", + "font_class": "bofang1", + "unicode": "e7fc", + "unicode_decimal": 59388 + }, + { + "icon_id": "39554349", + "name": "暂停", + "font_class": "zanting2", + "unicode": "e7fa", + "unicode_decimal": 59386 + }, + { + "icon_id": "38794757", + "name": "帮助", + "font_class": "bangzhu2", + "unicode": "e7f9", + "unicode_decimal": 59385 + }, + { + "icon_id": "38736535", + "name": "导出", + "font_class": "daochu2", + "unicode": "e7f7", + "unicode_decimal": 59383 + }, + { + "icon_id": "38736534", + "name": "导入", + "font_class": "daoru1", + "unicode": "e7f8", + "unicode_decimal": 59384 + }, + { + "icon_id": "38439162", + "name": "金东logo", + "font_class": "jindonglogo", + "unicode": "e7f6", + "unicode_decimal": 59382 + }, + { + "icon_id": "38353195", + "name": "管控预警select", + "font_class": "guankongyujingselect", + "unicode": "e7ef", + "unicode_decimal": 59375 + }, + { + "icon_id": "38353194", + "name": "管控预警nor", + "font_class": "guankongyujingnor", + "unicode": "e7f0", + "unicode_decimal": 59376 + }, + { + "icon_id": "38353193", + "name": "管控预案nor", + "font_class": "guankongyuannor", + "unicode": "e7f1", + "unicode_decimal": 59377 + }, + { + "icon_id": "38353188", + "name": "圈层预案select备份", + "font_class": "quancengyuanselectbeifen", + "unicode": "e7f2", + "unicode_decimal": 59378 + }, + { + "icon_id": "38353187", + "name": "圈层预警nor", + "font_class": "quancengyujingnor", + "unicode": "e7f3", + "unicode_decimal": 59379 + }, + { + "icon_id": "38353186", + "name": "圈层预案nor", + "font_class": "quancengyuannor", + "unicode": "e7f4", + "unicode_decimal": 59380 + }, + { + "icon_id": "38353185", + "name": "圈层预案select", + "font_class": "quancengyuanselect", + "unicode": "e7f5", + "unicode_decimal": 59381 + }, + { + "icon_id": "38353196", + "name": "管控预案select", + "font_class": "guankongyuanselect", + "unicode": "e7ee", + "unicode_decimal": 59374 + }, + { + "icon_id": "37989025", + "name": "金东", + "font_class": "jindong", + "unicode": "e7ed", + "unicode_decimal": 59373 + }, + { + "icon_id": "36344792", + "name": "档案详情_行为分析", + "font_class": "danganxiangqing_hangweifenxi", + "unicode": "e78d", + "unicode_decimal": 59277 + }, + { + "icon_id": "36344793", + "name": "档案详情_数据感知", + "font_class": "danganxiangqing_shujuganzhi", + "unicode": "e78e", + "unicode_decimal": 59278 + }, + { + "icon_id": "36344794", + "name": "档案详情_活动轨迹", + "font_class": "danganxiangqing_huodongguiji", + "unicode": "e78f", + "unicode_decimal": 59279 + }, + { + "icon_id": "36344795", + "name": "档案详情_基本信息", + "font_class": "danganxiangqing_jibenxinxi", + "unicode": "e7ea", + "unicode_decimal": 59370 + }, + { + "icon_id": "36344796", + "name": "档案详情_附属物品", + "font_class": "danganxiangqing_fushuwupin", + "unicode": "e7eb", + "unicode_decimal": 59371 + }, + { + "icon_id": "36344797", + "name": "档案详情_技战应用", + "font_class": "danganxiangqing_jizhanyingyong", + "unicode": "e7ec", + "unicode_decimal": 59372 + }, + { + "icon_id": "36101866", + "name": "加入档案库", + "font_class": "jiarudanganku", + "unicode": "e787", + "unicode_decimal": 59271 + }, + { + "icon_id": "36091918", + "name": "档案库nor", + "font_class": "dangankunor", + "unicode": "e793", + "unicode_decimal": 59283 + }, + { + "icon_id": "36091919", + "name": "布控任务select", + "font_class": "bukongrenwuselect", + "unicode": "e799", + "unicode_decimal": 59289 + }, + { + "icon_id": "36091920", + "name": "布控任务nor", + "font_class": "bukongrenwunor1", + "unicode": "e79a", + "unicode_decimal": 59290 + }, + { + "icon_id": "36091921", + "name": "档案库select", + "font_class": "dangankuselect", + "unicode": "e79b", + "unicode_decimal": 59291 + }, + { + "icon_id": "36091922", + "name": "技战法nor", + "font_class": "jizhanfanor", + "unicode": "e79c", + "unicode_decimal": 59292 + }, + { + "icon_id": "36091923", + "name": "非机动车查询nor", + "font_class": "feijidongchechaxunnor", + "unicode": "e79d", + "unicode_decimal": 59293 + }, + { + "icon_id": "36091924", + "name": "机动车查询select", + "font_class": "jidongchechaxunselect", + "unicode": "e79e", + "unicode_decimal": 59294 + }, + { + "icon_id": "36091925", + "name": "离线分析select 2", + "font_class": "a-lixianfenxiselect2", + "unicode": "e7a1", + "unicode_decimal": 59297 + }, + { + "icon_id": "36091926", + "name": "回溯分析select", + "font_class": "huisufenxiselect", + "unicode": "e7a2", + "unicode_decimal": 59298 + }, + { + "icon_id": "36091927", + "name": "技战法select", + "font_class": "jizhanfaselect", + "unicode": "e7a3", + "unicode_decimal": 59299 + }, + { + "icon_id": "36091928", + "name": "目标检索nor", + "font_class": "mubiaojiansuonor", + "unicode": "e7ae", + "unicode_decimal": 59310 + }, + { + "icon_id": "36091929", + "name": "路人库select", + "font_class": "lurenkuselect", + "unicode": "e7b1", + "unicode_decimal": 59313 + }, + { + "icon_id": "36091930", + "name": "数据驾驶舱select", + "font_class": "shujujiashicangselect", + "unicode": "e7b2", + "unicode_decimal": 59314 + }, + { + "icon_id": "36091931", + "name": "实时解析select", + "font_class": "shishijiexiselect", + "unicode": "e7b4", + "unicode_decimal": 59316 + }, + { + "icon_id": "36091932", + "name": "实时解析nor", + "font_class": "shishijiexinor", + "unicode": "e7b9", + "unicode_decimal": 59321 + }, + { + "icon_id": "36091933", + "name": "机动车查询nor", + "font_class": "jidongchechaxunnor", + "unicode": "e7c1", + "unicode_decimal": 59329 + }, + { + "icon_id": "36091934", + "name": "路人库nor", + "font_class": "lurenkunor1", + "unicode": "e7cf", + "unicode_decimal": 59343 + }, + { + "icon_id": "36091935", + "name": "目标特征查询nor", + "font_class": "mubiaotezhengchaxunnor", + "unicode": "e7e1", + "unicode_decimal": 59361 + }, + { + "icon_id": "36091936", + "name": "预警记录select", + "font_class": "yujingjiluselect", + "unicode": "e7e2", + "unicode_decimal": 59362 + }, + { + "icon_id": "36091937", + "name": "目标特征查询select", + "font_class": "mubiaotezhengchaxunselect", + "unicode": "e7e3", + "unicode_decimal": 59363 + }, + { + "icon_id": "36091938", + "name": "非机动车查询select", + "font_class": "feijidongchechaxunselect", + "unicode": "e7e4", + "unicode_decimal": 59364 + }, + { + "icon_id": "36091939", + "name": "预警记录nor", + "font_class": "yujingjilunor", + "unicode": "e7e5", + "unicode_decimal": 59365 + }, + { + "icon_id": "36091940", + "name": "离线分析select", + "font_class": "lixianfenxiselect", + "unicode": "e7e6", + "unicode_decimal": 59366 + }, + { + "icon_id": "36091941", + "name": "回溯分析nor", + "font_class": "huisufenxinor", + "unicode": "e7e7", + "unicode_decimal": 59367 + }, + { + "icon_id": "36091942", + "name": "数据驾驶舱nor", + "font_class": "shujujiashicangnor", + "unicode": "e7e8", + "unicode_decimal": 59368 + }, + { + "icon_id": "36091943", + "name": "目标检索select", + "font_class": "mubiaojiansuoselect", + "unicode": "e7e9", + "unicode_decimal": 59369 + }, + { + "icon_id": "35927785", + "name": "框选工具", + "font_class": "kuangxuangongju", + "unicode": "e796", + "unicode_decimal": 59286 + }, + { + "icon_id": "35652507", + "name": "蜂鸟", + "font_class": "fengniao", + "unicode": "e792", + "unicode_decimal": 59282 + }, + { + "icon_id": "35648087", + "name": "展开", + "font_class": "zhankai", + "unicode": "e790", + "unicode_decimal": 59280 + }, + { + "icon_id": "35648088", + "name": "收起", + "font_class": "shouqi", + "unicode": "e791", + "unicode_decimal": 59281 + }, + { + "icon_id": "6056161", + "name": "时间", + "font_class": "shijian", + "unicode": "e786", + "unicode_decimal": 59270 + }, + { + "icon_id": "16105260", + "name": "定位", + "font_class": "dingwei2", + "unicode": "e613", + "unicode_decimal": 58899 + }, + { + "icon_id": "34994072", + "name": "人员", + "font_class": "renyuan", + "unicode": "e784", + "unicode_decimal": 59268 + }, + { + "icon_id": "34994073", + "name": "后台", + "font_class": "houtai", + "unicode": "e785", + "unicode_decimal": 59269 + }, + { + "icon_id": "34324424", + "name": "左", + "font_class": "zuo", + "unicode": "e781", + "unicode_decimal": 59265 + }, + { + "icon_id": "34324425", + "name": "右", + "font_class": "you", + "unicode": "e783", + "unicode_decimal": 59267 + }, + { + "icon_id": "33566924", + "name": "卡口", + "font_class": "kakou", + "unicode": "e780", + "unicode_decimal": 59264 + }, + { + "icon_id": "33541952", + "name": "预警", + "font_class": "yujing1", + "unicode": "e77e", + "unicode_decimal": 59262 + }, + { + "icon_id": "32497852", + "name": "预案", + "font_class": "yuan2", + "unicode": "e77d", + "unicode_decimal": 59261 + }, + { + "icon_id": "32189295", + "name": "模型碰撞", + "font_class": "moxingpengzhuang", + "unicode": "e777", + "unicode_decimal": 59255 + }, + { + "icon_id": "32189296", + "name": "模型碰撞nor", + "font_class": "moxingpengzhuangnor", + "unicode": "e778", + "unicode_decimal": 59256 + }, + { + "icon_id": "32189298", + "name": "路人库", + "font_class": "lurenku", + "unicode": "e77b", + "unicode_decimal": 59259 + }, + { + "icon_id": "32190455", + "name": "路人库nor", + "font_class": "lurenkunor", + "unicode": "e77c", + "unicode_decimal": 59260 + }, + { + "icon_id": "32477562", + "name": "实名", + "font_class": "shiming", + "unicode": "e776", + "unicode_decimal": 59254 + }, + { + "icon_id": "32356230", + "name": "缩小", + "font_class": "suoxiao2", + "unicode": "e774", + "unicode_decimal": 59252 + }, + { + "icon_id": "32356231", + "name": "放大", + "font_class": "fangda1", + "unicode": "e775", + "unicode_decimal": 59253 + }, + { + "icon_id": "32305021", + "name": "关闭", + "font_class": "guanbi2", + "unicode": "e772", + "unicode_decimal": 59250 + }, + { + "icon_id": "32305022", + "name": "返回", + "font_class": "fanhui1", + "unicode": "e773", + "unicode_decimal": 59251 + }, + { + "icon_id": "31879940", + "name": "线索摸排", + "font_class": "xiansuomopai", + "unicode": "e76f", + "unicode_decimal": 59247 + }, + { + "icon_id": "31879931", + "name": "线索摸排nor", + "font_class": "xiansuomopainor", + "unicode": "e76e", + "unicode_decimal": 59246 + }, + { + "icon_id": "31879839", + "name": "闸机预警", + "font_class": "zhajiyujing", + "unicode": "e770", + "unicode_decimal": 59248 + }, + { + "icon_id": "31879840", + "name": "闸机预警nor", + "font_class": "zhajiyujingnor", + "unicode": "e771", + "unicode_decimal": 59249 + }, + { + "icon_id": "31879545", + "name": "追踪配置", + "font_class": "zhuizongpeizhi", + "unicode": "e76c", + "unicode_decimal": 59244 + }, + { + "icon_id": "31879546", + "name": "追踪配置nor", + "font_class": "zhuizongpeizhinor", + "unicode": "e76d", + "unicode_decimal": 59245 + }, + { + "icon_id": "31298167", + "name": "大屏切换 ", + "font_class": "dapingqiehuan", + "unicode": "e76b", + "unicode_decimal": 59243 + }, + { + "icon_id": "31293396", + "name": "选择", + "font_class": "xuanze", + "unicode": "e769", + "unicode_decimal": 59241 + }, + { + "icon_id": "31293397", + "name": "筛选", + "font_class": "shaixuan1", + "unicode": "e76a", + "unicode_decimal": 59242 + }, + { + "icon_id": "31281773", + "name": "车卡设备", + "font_class": "chekashebei", + "unicode": "e764", + "unicode_decimal": 59236 + }, + { + "icon_id": "31281774", + "name": "imsi设备", + "font_class": "imsishebei", + "unicode": "e765", + "unicode_decimal": 59237 + }, + { + "icon_id": "31281775", + "name": "形体设备", + "font_class": "xingtishebei", + "unicode": "e766", + "unicode_decimal": 59238 + }, + { + "icon_id": "31281776", + "name": "人脸设备", + "font_class": "renlianshebei", + "unicode": "e767", + "unicode_decimal": 59239 + }, + { + "icon_id": "31281777", + "name": "wifi设备", + "font_class": "wifishebei", + "unicode": "e768", + "unicode_decimal": 59240 + }, + { + "icon_id": "31175954", + "name": "瞄准 (2)", + "font_class": "a-miaozhun2", + "unicode": "e762", + "unicode_decimal": 59234 + }, + { + "icon_id": "31175955", + "name": "编组 19", + "font_class": "a-bianzu19", + "unicode": "e763", + "unicode_decimal": 59235 + }, + { + "icon_id": "31109996", + "name": "翻页", + "font_class": "fanye", + "unicode": "e75e", + "unicode_decimal": 59230 + }, + { + "icon_id": "31109998", + "name": "身份证", + "font_class": "shenfenzheng", + "unicode": "e75f", + "unicode_decimal": 59231 + }, + { + "icon_id": "31110000", + "name": "地址", + "font_class": "dizhi", + "unicode": "e760", + "unicode_decimal": 59232 + }, + { + "icon_id": "31110045", + "name": "关闭", + "font_class": "guanbi", + "unicode": "e761", + "unicode_decimal": 59233 + }, + { + "icon_id": "31088147", + "name": "点位", + "font_class": "dianwei1", + "unicode": "e75b", + "unicode_decimal": 59227 + }, + { + "icon_id": "30952366", + "name": "微卡口", + "font_class": "weikakou", + "unicode": "e757", + "unicode_decimal": 59223 + }, + { + "icon_id": "30952367", + "name": "微卡口nor", + "font_class": "weikakounor", + "unicode": "e758", + "unicode_decimal": 59224 + }, + { + "icon_id": "30952370", + "name": "场所码", + "font_class": "changsuoma", + "unicode": "e759", + "unicode_decimal": 59225 + }, + { + "icon_id": "30952371", + "name": "场所码nor", + "font_class": "changsuomanor", + "unicode": "e75a", + "unicode_decimal": 59226 + }, + { + "icon_id": "9974390", + "name": "预警", + "font_class": "yujing", + "unicode": "e756", + "unicode_decimal": 59222 + }, + { + "icon_id": "29552660", + "name": "检索nor", + "font_class": "jiansuonor", + "unicode": "e747", + "unicode_decimal": 59207 + }, + { + "icon_id": "29552661", + "name": "同行人分析nor", + "font_class": "tonghangrenfenxinor1", + "unicode": "e748", + "unicode_decimal": 59208 + }, + { + "icon_id": "29552662", + "name": "智能研判nor", + "font_class": "zhinengyanpannor", + "unicode": "e749", + "unicode_decimal": 59209 + }, + { + "icon_id": "29552663", + "name": "布控预警nor", + "font_class": "bukongyujingnor", + "unicode": "e74a", + "unicode_decimal": 59210 + }, + { + "icon_id": "29552664", + "name": "布控任务nor", + "font_class": "bukongrenwunor", + "unicode": "e74b", + "unicode_decimal": 59211 + }, + { + "icon_id": "29552665", + "name": "电子地图nor", + "font_class": "dianziditunor", + "unicode": "e754", + "unicode_decimal": 59220 + }, + { + "icon_id": "29552666", + "name": "追踪nor", + "font_class": "zhuizongnor1", + "unicode": "e755", + "unicode_decimal": 59221 + }, + { + "icon_id": "29552487", + "name": "追踪", + "font_class": "zhuizong1", + "unicode": "e746", + "unicode_decimal": 59206 + }, + { + "icon_id": "29552240", + "name": "布控任务", + "font_class": "bukongrenwu3", + "unicode": "e74c", + "unicode_decimal": 59212 + }, + { + "icon_id": "29552241", + "name": "电子地图", + "font_class": "dianziditu", + "unicode": "e74d", + "unicode_decimal": 59213 + }, + { + "icon_id": "29552242", + "name": "布控预警", + "font_class": "bukongyujing", + "unicode": "e750", + "unicode_decimal": 59216 + }, + { + "icon_id": "29552243", + "name": "同行人分析", + "font_class": "tonghangrenfenxi1", + "unicode": "e751", + "unicode_decimal": 59217 + }, + { + "icon_id": "29552244", + "name": "智能研判", + "font_class": "zhinengyanpan", + "unicode": "e752", + "unicode_decimal": 59218 + }, + { + "icon_id": "29552245", + "name": "检索", + "font_class": "jiansuo1", + "unicode": "e753", + "unicode_decimal": 59219 + }, + { + "icon_id": "29416924", + "name": "开启聚类", + "font_class": "kaiqijulei", + "unicode": "e745", + "unicode_decimal": 59205 + }, + { + "icon_id": "29416893", + "name": "同步", + "font_class": "tongbu", + "unicode": "e744", + "unicode_decimal": 59204 + }, + { + "icon_id": "28913138", + "name": "同行人分析", + "font_class": "tonghangrenfenxi", + "unicode": "e743", + "unicode_decimal": 59203 + }, + { + "icon_id": "28913111", + "name": "同行人分析nor", + "font_class": "tonghangrenfenxinor", + "unicode": "e742", + "unicode_decimal": 59202 + }, + { + "icon_id": "28603735", + "name": "技战应用", + "font_class": "jizhanyingyong", + "unicode": "e741", + "unicode_decimal": 59201 + }, + { + "icon_id": "28122666", + "name": "海康人脸布控nor", + "font_class": "haikangrenlianbukongnor", + "unicode": "e740", + "unicode_decimal": 59200 + }, + { + "icon_id": "28122657", + "name": "海康人脸布控", + "font_class": "haikangrenlianbukong", + "unicode": "e73f", + "unicode_decimal": 59199 + }, + { + "icon_id": "28028942", + "name": "拓展手段提示", + "font_class": "tuozhanshouduantishi", + "unicode": "e73e", + "unicode_decimal": 59198 + }, + { + "icon_id": "28022750", + "name": "返回摸排列表", + "font_class": "fanhuimopailiebiao", + "unicode": "e73d", + "unicode_decimal": 59197 + }, + { + "icon_id": "26859533", + "name": "头盔检测nor", + "font_class": "toukuijiancenor", + "unicode": "e73c", + "unicode_decimal": 59196 + }, + { + "icon_id": "26859527", + "name": "头盔检测", + "font_class": "toukuijiance", + "unicode": "e718", + "unicode_decimal": 59160 + }, + { + "icon_id": "26859240", + "name": "追形", + "font_class": "zhuixing", + "unicode": "e717", + "unicode_decimal": 59159 + }, + { + "icon_id": "26840606", + "name": "提示", + "font_class": "tishi4", + "unicode": "e73b", + "unicode_decimal": 59195 + }, + { + "icon_id": "26691196", + "name": "筛选(飞机)", + "font_class": "a-shaixuanfeiji", + "unicode": "e733", + "unicode_decimal": 59187 + }, + { + "icon_id": "26690614", + "name": "自动调整范围(飞机)", + "font_class": "a-zidongtiaozhengfanweifeiji", + "unicode": "e73a", + "unicode_decimal": 59194 + }, + { + "icon_id": "26630396", + "name": "盒子运维", + "font_class": "heziyunwei", + "unicode": "e739", + "unicode_decimal": 59193 + }, + { + "icon_id": "26620389", + "name": "切换", + "font_class": "qiehuan", + "unicode": "e738", + "unicode_decimal": 59192 + }, + { + "icon_id": "26523829", + "name": "第三方消息nor", + "font_class": "disanfangxiaoxinor", + "unicode": "e737", + "unicode_decimal": 59191 + }, + { + "icon_id": "26523827", + "name": "第三方消息", + "font_class": "disanfangxiaoxi", + "unicode": "e736", + "unicode_decimal": 59190 + }, + { + "icon_id": "25930570", + "name": "导航", + "font_class": "daohang", + "unicode": "e735", + "unicode_decimal": 59189 + }, + { + "icon_id": "25930569", + "name": "用户", + "font_class": "yonghu", + "unicode": "e734", + "unicode_decimal": 59188 + }, + { + "icon_id": "25878393", + "name": "飞机", + "font_class": "feiji", + "unicode": "e732", + "unicode_decimal": 59186 + }, + { + "icon_id": "25809480", + "name": "结束追踪", + "font_class": "jieshuzhuizong", + "unicode": "e730", + "unicode_decimal": 59184 + }, + { + "icon_id": "25809481", + "name": "回溯周边", + "font_class": "huisuzhoubian", + "unicode": "e731", + "unicode_decimal": 59185 + }, + { + "icon_id": "25809477", + "name": "继续追踪", + "font_class": "jixuzhuizong", + "unicode": "e72d", + "unicode_decimal": 59181 + }, + { + "icon_id": "25809478", + "name": "调整范围", + "font_class": "tiaozhengfanwei", + "unicode": "e72e", + "unicode_decimal": 59182 + }, + { + "icon_id": "25809479", + "name": "检索", + "font_class": "jiansuo", + "unicode": "e72f", + "unicode_decimal": 59183 + }, + { + "icon_id": "25796784", + "name": "轨迹", + "font_class": "guiji", + "unicode": "e72c", + "unicode_decimal": 59180 + }, + { + "icon_id": "25796636", + "name": "基础信息", + "font_class": "jichuxinxi", + "unicode": "e72b", + "unicode_decimal": 59179 + }, + { + "icon_id": "25796635", + "name": "档案摘要", + "font_class": "danganzhaiyao", + "unicode": "e72a", + "unicode_decimal": 59178 + }, + { + "icon_id": "25778781", + "name": "精准布控icon_on", + "font_class": "jingzhunbukongicon_on", + "unicode": "e728", + "unicode_decimal": 59176 + }, + { + "icon_id": "25778782", + "name": "精准布控icon_off", + "font_class": "jingzhunbukongicon_off", + "unicode": "e729", + "unicode_decimal": 59177 + }, + { + "icon_id": "25528851", + "name": "跳转", + "font_class": "tiaozhuan", + "unicode": "e727", + "unicode_decimal": 59175 + }, + { + "icon_id": "25364398", + "name": "设置", + "font_class": "shezhi", + "unicode": "e726", + "unicode_decimal": 59174 + }, + { + "icon_id": "25364282", + "name": "帮助", + "font_class": "bangzhu1", + "unicode": "e725", + "unicode_decimal": 59173 + }, + { + "icon_id": "25156298", + "name": "刷新", + "font_class": "shuaxin1", + "unicode": "e724", + "unicode_decimal": 59172 + }, + { + "icon_id": "25011432", + "name": "多素材备份", + "font_class": "duosucaibeifen", + "unicode": "e722", + "unicode_decimal": 59170 + }, + { + "icon_id": "25011433", + "name": "多素材", + "font_class": "duosucai", + "unicode": "e723", + "unicode_decimal": 59171 + }, + { + "icon_id": "24963746", + "name": "数据统计", + "font_class": "shujutongji", + "unicode": "e721", + "unicode_decimal": 59169 + }, + { + "icon_id": "24944893", + "name": "人脸", + "font_class": "renlian", + "unicode": "e71c", + "unicode_decimal": 59164 + }, + { + "icon_id": "24944894", + "name": "形体", + "font_class": "xingti", + "unicode": "e71d", + "unicode_decimal": 59165 + }, + { + "icon_id": "24944895", + "name": "机动车", + "font_class": "jidongche", + "unicode": "e71e", + "unicode_decimal": 59166 + }, + { + "icon_id": "24944896", + "name": "回溯分析", + "font_class": "huisufenxi4", + "unicode": "e71f", + "unicode_decimal": 59167 + }, + { + "icon_id": "24944897", + "name": "离线分析", + "font_class": "lixianfenxi4", + "unicode": "e720", + "unicode_decimal": 59168 + }, + { + "icon_id": "24944892", + "name": "非机动车", + "font_class": "feijidongche", + "unicode": "e71b", + "unicode_decimal": 59163 + }, + { + "icon_id": "24936781", + "name": "数据大屏", + "font_class": "shujudaping", + "unicode": "e71a", + "unicode_decimal": 59162 + }, + { + "icon_id": "24913034", + "name": "配置算法", + "font_class": "peizhisuanfa", + "unicode": "e719", + "unicode_decimal": 59161 + }, + { + "icon_id": "24685855", + "name": "追踪", + "font_class": "zhuizong", + "unicode": "e715", + "unicode_decimal": 59157 + }, + { + "icon_id": "24685856", + "name": "追踪nor", + "font_class": "zhuizongnor", + "unicode": "e716", + "unicode_decimal": 59158 + }, + { + "icon_id": "24661441", + "name": "点位", + "font_class": "dianwei", + "unicode": "e714", + "unicode_decimal": 59156 + }, + { + "icon_id": "24661326", + "name": "Container", + "font_class": "Container", + "unicode": "e713", + "unicode_decimal": 59155 + }, + { + "icon_id": "24661126", + "name": "Attachment", + "font_class": "Attachment", + "unicode": "e712", + "unicode_decimal": 59154 + }, + { + "icon_id": "24630118", + "name": "叉", + "font_class": "cha", + "unicode": "e711", + "unicode_decimal": 59153 + }, + { + "icon_id": "24630116", + "name": "勾", + "font_class": "gou", + "unicode": "e710", + "unicode_decimal": 59152 + }, + { + "icon_id": "24630033", + "name": "导入", + "font_class": "daoru", + "unicode": "e70f", + "unicode_decimal": 59151 + }, + { + "icon_id": "24607250", + "name": "全息检索", + "font_class": "quanxijiansuo", + "unicode": "e70e", + "unicode_decimal": 59150 + }, + { + "icon_id": "24604837", + "name": "查看监控", + "font_class": "chakanjiankong", + "unicode": "e70c", + "unicode_decimal": 59148 + }, + { + "icon_id": "24604704", + "name": "提示", + "font_class": "tishi3", + "unicode": "e70d", + "unicode_decimal": 59149 + }, + { + "icon_id": "24604626", + "name": "黑夜模式", + "font_class": "heiyemoshi", + "unicode": "e70b", + "unicode_decimal": 59147 + }, + { + "icon_id": "24604623", + "name": "正常模式", + "font_class": "zhengchangmoshi", + "unicode": "e70a", + "unicode_decimal": 59146 + }, + { + "icon_id": "24554896", + "name": "定位", + "font_class": "dingwei1", + "unicode": "e709", + "unicode_decimal": 59145 + }, + { + "icon_id": "24442799", + "name": "排序", + "font_class": "paixu", + "unicode": "e708", + "unicode_decimal": 59144 + }, + { + "icon_id": "24420402", + "name": "添加预案", + "font_class": "tianjiayuan", + "unicode": "e707", + "unicode_decimal": 59143 + }, + { + "icon_id": "23916590", + "name": "聚类档案库nor", + "font_class": "juleidangankunor", + "unicode": "e705", + "unicode_decimal": 59141 + }, + { + "icon_id": "23916591", + "name": "聚类档案库", + "font_class": "juleidanganku", + "unicode": "e706", + "unicode_decimal": 59142 + }, + { + "icon_id": "23499142", + "name": "关联", + "font_class": "guanlian", + "unicode": "e704", + "unicode_decimal": 59140 + }, + { + "icon_id": "23444887", + "name": "人脸标注", + "font_class": "renlianbiaozhu", + "unicode": "e703", + "unicode_decimal": 59139 + }, + { + "icon_id": "23304285", + "name": "聚类结果", + "font_class": "juleijieguo", + "unicode": "e6ec", + "unicode_decimal": 59116 + }, + { + "icon_id": "23304286", + "name": "聚类任务nor", + "font_class": "juleirenwunor", + "unicode": "e6fb", + "unicode_decimal": 59131 + }, + { + "icon_id": "23304287", + "name": "聚类结果nor", + "font_class": "juleijieguonor", + "unicode": "e701", + "unicode_decimal": 59137 + }, + { + "icon_id": "23304288", + "name": "聚类任务", + "font_class": "juleirenwu", + "unicode": "e702", + "unicode_decimal": 59138 + }, + { + "icon_id": "20290678", + "name": "重置", + "font_class": "zhongzhi3", + "unicode": "e8ff", + "unicode_decimal": 59647 + }, + { + "icon_id": "23210742", + "name": "旋转", + "font_class": "xuanzhuan1", + "unicode": "e6fd", + "unicode_decimal": 59133 + }, + { + "icon_id": "23254545", + "name": "双目标注", + "font_class": "shuangmubiaozhu1", + "unicode": "e700", + "unicode_decimal": 59136 + }, + { + "icon_id": "23203403", + "name": "手动框选", + "font_class": "shoudongkuangxuan", + "unicode": "e6f9", + "unicode_decimal": 59129 + }, + { + "icon_id": "23234078", + "name": "暂停", + "font_class": "zanting1", + "unicode": "e6fe", + "unicode_decimal": 59134 + }, + { + "icon_id": "23234079", + "name": "中止", + "font_class": "zhongzhi1", + "unicode": "e6ff", + "unicode_decimal": 59135 + }, + { + "icon_id": "23203404", + "name": "手动", + "font_class": "shoudong", + "unicode": "e6fa", + "unicode_decimal": 59130 + }, + { + "icon_id": "23203406", + "name": "自动", + "font_class": "zidong", + "unicode": "e6fc", + "unicode_decimal": 59132 + }, + { + "icon_id": "23203224", + "name": "诊断", + "font_class": "zhenduan", + "unicode": "e6f8", + "unicode_decimal": 59128 + }, + { + "icon_id": "23203126", + "name": "Check-Circle-Fill", + "font_class": "Check-Circle-Fill1", + "unicode": "e6f3", + "unicode_decimal": 59123 + }, + { + "icon_id": "23203127", + "name": "Info--Circle-Fill", + "font_class": "Info--Circle-Fill", + "unicode": "e6f4", + "unicode_decimal": 59124 + }, + { + "icon_id": "23203128", + "name": "Close-Circle-Fill", + "font_class": "Close-Circle-Fill", + "unicode": "e6f5", + "unicode_decimal": 59125 + }, + { + "icon_id": "23203129", + "name": "Warning-Circle-Fill", + "font_class": "Warning-Circle-Fill", + "unicode": "e6f6", + "unicode_decimal": 59126 + }, + { + "icon_id": "23203130", + "name": "Question-Circle-Fill", + "font_class": "Question-Circle-Fill", + "unicode": "e6f7", + "unicode_decimal": 59127 + }, + { + "icon_id": "23071890", + "name": "暂存架", + "font_class": "zancunjia", + "unicode": "e6f2", + "unicode_decimal": 59122 + }, + { + "icon_id": "22907690", + "name": "Check-Circle-Fill", + "font_class": "Check-Circle-Fill", + "unicode": "e6f1", + "unicode_decimal": 59121 + }, + { + "icon_id": "22884339", + "name": "图片集", + "font_class": "tupianji", + "unicode": "e6f0", + "unicode_decimal": 59120 + }, + { + "icon_id": "22871348", + "name": "全屏", + "font_class": "quanping1", + "unicode": "e6ed", + "unicode_decimal": 59117 + }, + { + "icon_id": "22871349", + "name": "音量", + "font_class": "yinliang", + "unicode": "e6ee", + "unicode_decimal": 59118 + }, + { + "icon_id": "22871350", + "name": "缩小", + "font_class": "suoxiao1", + "unicode": "e6ef", + "unicode_decimal": 59119 + }, + { + "icon_id": "22658169", + "name": "home", + "font_class": "home", + "unicode": "e6eb", + "unicode_decimal": 59115 + }, + { + "icon_id": "22658130", + "name": "最小化", + "font_class": "zuixiaohua", + "unicode": "e6e9", + "unicode_decimal": 59113 + }, + { + "icon_id": "22658131", + "name": "最大化", + "font_class": "zuidahua", + "unicode": "e6ea", + "unicode_decimal": 59114 + }, + { + "icon_id": "22658054", + "name": "标准化", + "font_class": "biaozhunhua", + "unicode": "e6e6", + "unicode_decimal": 59110 + }, + { + "icon_id": "22544357", + "name": "聚类", + "font_class": "julei", + "unicode": "e6e5", + "unicode_decimal": 59109 + }, + { + "icon_id": "21829058", + "name": "密码可见", + "font_class": "bianzu", + "unicode": "e6e7", + "unicode_decimal": 59111 + }, + { + "icon_id": "21829059", + "name": "密码不可见", + "font_class": "bianzu3", + "unicode": "e6e8", + "unicode_decimal": 59112 + }, + { + "icon_id": "21780473", + "name": "编组 7", + "font_class": "bianzu7", + "unicode": "e6e3", + "unicode_decimal": 59107 + }, + { + "icon_id": "21780474", + "name": "编组 2", + "font_class": "bianzu2", + "unicode": "e6e4", + "unicode_decimal": 59108 + }, + { + "icon_id": "21738272", + "name": "卡片切换", + "font_class": "kapianqiehuan", + "unicode": "e6e2", + "unicode_decimal": 59106 + }, + { + "icon_id": "21695431", + "name": "多边形", + "font_class": "duobianxing1", + "unicode": "e6e0", + "unicode_decimal": 59104 + }, + { + "icon_id": "21695432", + "name": "方", + "font_class": "fang1", + "unicode": "e6e1", + "unicode_decimal": 59105 + }, + { + "icon_id": "21695430", + "name": "圆", + "font_class": "yuan1", + "unicode": "e6df", + "unicode_decimal": 59103 + }, + { + "icon_id": "21695426", + "name": "测距离", + "font_class": "cejuli", + "unicode": "e6de", + "unicode_decimal": 59102 + }, + { + "icon_id": "21694880", + "name": "网格框选nor", + "font_class": "wanggekuangxuannor", + "unicode": "e6dc", + "unicode_decimal": 59100 + }, + { + "icon_id": "21694881", + "name": "路径框选nor", + "font_class": "lujingkuangxuannor", + "unicode": "e6dd", + "unicode_decimal": 59101 + }, + { + "icon_id": "21600424", + "name": "穿梭", + "font_class": "chuansuo", + "unicode": "e6db", + "unicode_decimal": 59099 + }, + { + "icon_id": "21248188", + "name": "边缘盒子", + "font_class": "bianyuanhezinor", + "unicode": "e6d8", + "unicode_decimal": 59096 + }, + { + "icon_id": "21248189", + "name": "误检库", + "font_class": "wujiankuhov", + "unicode": "e6d9", + "unicode_decimal": 59097 + }, + { + "icon_id": "21248190", + "name": "操作日志", + "font_class": "caozuorizhinor", + "unicode": "e6da", + "unicode_decimal": 59098 + }, + { + "icon_id": "13838312", + "name": "collect_dot", + "font_class": "collect_dot", + "unicode": "e619", + "unicode_decimal": 58905 + }, + { + "icon_id": "20982904", + "name": "出现定位bg", + "font_class": "chuxiandingweibg", + "unicode": "e6d4", + "unicode_decimal": 59092 + }, + { + "icon_id": "20982905", + "name": "出现定位icon", + "font_class": "chuxiandingweiicon", + "unicode": "e6d5", + "unicode_decimal": 59093 + }, + { + "icon_id": "20982843", + "name": "摄像头定位bg", + "font_class": "shexiangtoudingweibg", + "unicode": "e6d6", + "unicode_decimal": 59094 + }, + { + "icon_id": "20982844", + "name": "摄像头定位icon", + "font_class": "shexiangtoudingweiicon", + "unicode": "e6d7", + "unicode_decimal": 59095 + }, + { + "icon_id": "20933994", + "name": "下发结果", + "font_class": "xiafajieguo", + "unicode": "e6d2", + "unicode_decimal": 59090 + }, + { + "icon_id": "20933996", + "name": "导出", + "font_class": "daochu1", + "unicode": "e6d3", + "unicode_decimal": 59091 + }, + { + "icon_id": "20933901", + "name": "最近出现", + "font_class": "zuijinchuxian", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "20933902", + "name": "累计抓拍", + "font_class": "leijizhuapai", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "20933907", + "name": "异常事件", + "font_class": "yichangshijian", + "unicode": "e6d1", + "unicode_decimal": 59089 + }, + { + "icon_id": "20925063", + "name": "定位", + "font_class": "dingwei", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "20894407", + "name": "图片", + "font_class": "tupian", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "20433461", + "name": "失败原因", + "font_class": "wenti", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "20432083", + "name": "点位-已选中", + "font_class": "lixian1", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "20415322", + "name": "异常", + "font_class": "yichang", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "19332242", + "name": "追形-修改点位", + "font_class": "zhuixing-xiugaidianwei", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "19049729", + "name": "问号", + "font_class": "wenhao1", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "19041610", + "name": "地图_定位", + "font_class": "ditu_dingwei", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "19041571", + "name": "地图_放大", + "font_class": "ditu_fangda", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "19041572", + "name": "地图_缩小", + "font_class": "ditu_suoxiao", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "19039288", + "name": "查看布控任务", + "font_class": "chakanbukongrenwu", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "18985662", + "name": "裂图", + "font_class": "lietu", + "unicode": "e687", + "unicode_decimal": 59015 + }, + { + "icon_id": "18907313", + "name": "重置", + "font_class": "zhongzhi", + "unicode": "e67e", + "unicode_decimal": 59006 + }, + { + "icon_id": "18907314", + "name": "下拉大", + "font_class": "xialada", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "18905520", + "name": "智能关联_形体", + "font_class": "zhinengguanlian_xingti", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "18905521", + "name": "智能关联_人脸", + "font_class": "zhinengguanlian_renlian", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "16018461", + "name": "下箭头", + "font_class": "xiajiantou", + "unicode": "e75c", + "unicode_decimal": 59228 + }, + { + "icon_id": "18885308", + "name": "智能关联_小箭头", + "font_class": "zhinengguanlian_xiaojiantou", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "18883781", + "name": "智能关联_箭头", + "font_class": "zhinengguanlian_jiantou", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "16018463", + "name": "上箭头", + "font_class": "shangjiantou", + "unicode": "e75d", + "unicode_decimal": 59229 + }, + { + "icon_id": "18686782", + "name": "版本信息", + "font_class": "banbenxinxi", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "1330924", + "name": "问号", + "font_class": "wenhao", + "unicode": "e61f", + "unicode_decimal": 58911 + }, + { + "icon_id": "17614568", + "name": "编辑人员", + "font_class": "bianjirenyuan", + "unicode": "e7e0", + "unicode_decimal": 59360 + }, + { + "icon_id": "17416216", + "name": "提示", + "font_class": "tishi2", + "unicode": "e7df", + "unicode_decimal": 59359 + }, + { + "icon_id": "17292128", + "name": "摄像机", + "font_class": "shexiangji2", + "unicode": "e7de", + "unicode_decimal": 59358 + }, + { + "icon_id": "17255570", + "name": "轨迹追踪", + "font_class": "guijizhuizong", + "unicode": "e7dd", + "unicode_decimal": 59357 + }, + { + "icon_id": "17255389", + "name": "截帧", + "font_class": "jiezhen1", + "unicode": "e7dc", + "unicode_decimal": 59356 + }, + { + "icon_id": "17254424", + "name": "添加轨迹回溯", + "font_class": "tianjiaguijihuisu", + "unicode": "e7db", + "unicode_decimal": 59355 + }, + { + "icon_id": "17251847", + "name": "停止", + "font_class": "tingzhi", + "unicode": "e7cd", + "unicode_decimal": 59341 + }, + { + "icon_id": "17251960", + "name": "包围圈", + "font_class": "baoweiquan", + "unicode": "e7ce", + "unicode_decimal": 59342 + }, + { + "icon_id": "17252131", + "name": "上传视频", + "font_class": "shangchuanshipin", + "unicode": "e7d0", + "unicode_decimal": 59344 + }, + { + "icon_id": "17252147", + "name": "移动", + "font_class": "yidong", + "unicode": "e7d1", + "unicode_decimal": 59345 + }, + { + "icon_id": "17252288", + "name": "创建新布控", + "font_class": "chuangjianxinbukong1", + "unicode": "e7d2", + "unicode_decimal": 59346 + }, + { + "icon_id": "17253015", + "name": "移除", + "font_class": "yichu1", + "unicode": "e7d3", + "unicode_decimal": 59347 + }, + { + "icon_id": "17253033", + "name": "提示", + "font_class": "tishi1", + "unicode": "e7d4", + "unicode_decimal": 59348 + }, + { + "icon_id": "17253112", + "name": "VS", + "font_class": "VS", + "unicode": "e7d5", + "unicode_decimal": 59349 + }, + { + "icon_id": "17253139", + "name": "全局总览", + "font_class": "quanjuzonglan", + "unicode": "e7d6", + "unicode_decimal": 59350 + }, + { + "icon_id": "17253187", + "name": "查看分析任务", + "font_class": "chakanfenxirenwu1", + "unicode": "e7d7", + "unicode_decimal": 59351 + }, + { + "icon_id": "17253208", + "name": "消息", + "font_class": "xiaoxi", + "unicode": "e7d8", + "unicode_decimal": 59352 + }, + { + "icon_id": "17254065", + "name": "用户名", + "font_class": "yonghuming", + "unicode": "e7d9", + "unicode_decimal": 59353 + }, + { + "icon_id": "17254204", + "name": "退出", + "font_class": "tuichu", + "unicode": "e7da", + "unicode_decimal": 59354 + }, + { + "icon_id": "17251737", + "name": "轨迹追踪nor", + "font_class": "guijizhuizongnor", + "unicode": "e7cb", + "unicode_decimal": 59339 + }, + { + "icon_id": "17251738", + "name": "轨迹追踪", + "font_class": "guijizhuizong2", + "unicode": "e7cc", + "unicode_decimal": 59340 + }, + { + "icon_id": "17190034", + "name": "布控任务", + "font_class": "bukongrenwu1", + "unicode": "e7b7", + "unicode_decimal": 59319 + }, + { + "icon_id": "17190035", + "name": "摄像机", + "font_class": "shexiangji", + "unicode": "e7b8", + "unicode_decimal": 59320 + }, + { + "icon_id": "17190037", + "name": "预警地图", + "font_class": "yujingditu", + "unicode": "e7ba", + "unicode_decimal": 59322 + }, + { + "icon_id": "17190038", + "name": "离线分析", + "font_class": "lixianfenxi2", + "unicode": "e7bb", + "unicode_decimal": 59323 + }, + { + "icon_id": "17190039", + "name": "预案管理", + "font_class": "yuanguanli1", + "unicode": "e7bc", + "unicode_decimal": 59324 + }, + { + "icon_id": "17190040", + "name": "档案库", + "font_class": "danganku", + "unicode": "e7bd", + "unicode_decimal": 59325 + }, + { + "icon_id": "17190041", + "name": "回溯分析", + "font_class": "huisufenxi2", + "unicode": "e7be", + "unicode_decimal": 59326 + }, + { + "icon_id": "17190042", + "name": "库内检索", + "font_class": "kuneijiansuo", + "unicode": "e7bf", + "unicode_decimal": 59327 + }, + { + "icon_id": "17190043", + "name": "结构化查询", + "font_class": "jiegouhuachaxun", + "unicode": "e7c0", + "unicode_decimal": 59328 + }, + { + "icon_id": "17190062", + "name": "布控任务", + "font_class": "bukongrenwu2", + "unicode": "e7c2", + "unicode_decimal": 59330 + }, + { + "icon_id": "17190063", + "name": "预案管理", + "font_class": "yuanguanli2", + "unicode": "e7c3", + "unicode_decimal": 59331 + }, + { + "icon_id": "17190064", + "name": "摄像机", + "font_class": "shexiangji1", + "unicode": "e7c4", + "unicode_decimal": 59332 + }, + { + "icon_id": "17190065", + "name": "库内检索", + "font_class": "kuneijiansuo1", + "unicode": "e7c5", + "unicode_decimal": 59333 + }, + { + "icon_id": "17190066", + "name": "离线分析", + "font_class": "lixianfenxi3", + "unicode": "e7c6", + "unicode_decimal": 59334 + }, + { + "icon_id": "17190067", + "name": "档案库", + "font_class": "danganku1", + "unicode": "e7c7", + "unicode_decimal": 59335 + }, + { + "icon_id": "17190068", + "name": "预警地图", + "font_class": "yujingditu1", + "unicode": "e7c8", + "unicode_decimal": 59336 + }, + { + "icon_id": "17190069", + "name": "回溯分析", + "font_class": "huisufenxi3", + "unicode": "e7c9", + "unicode_decimal": 59337 + }, + { + "icon_id": "17190167", + "name": "结构化查询nor", + "font_class": "jiegouhuachaxunnor", + "unicode": "e7ca", + "unicode_decimal": 59338 + }, + { + "icon_id": "17073967", + "name": "创建新布控", + "font_class": "chuangjianxinbukong", + "unicode": "e7b6", + "unicode_decimal": 59318 + }, + { + "icon_id": "16018746", + "name": "框选", + "font_class": "kuangxuan", + "unicode": "e77f", + "unicode_decimal": 59263 + }, + { + "icon_id": "16018715", + "name": "高级筛选", + "font_class": "gaojishaixuan", + "unicode": "e779", + "unicode_decimal": 59257 + }, + { + "icon_id": "16018716", + "name": "高级筛选收起", + "font_class": "gaojishaixuanshouqi", + "unicode": "e77a", + "unicode_decimal": 59258 + }, + { + "icon_id": "16924391", + "name": "布控任务", + "font_class": "bukongrenwu", + "unicode": "e7b5", + "unicode_decimal": 59317 + }, + { + "icon_id": "16018385", + "name": "日期", + "font_class": "riqi", + "unicode": "e74f", + "unicode_decimal": 59215 + }, + { + "icon_id": "16301333", + "name": "时间切换", + "font_class": "shijianqiehuan", + "unicode": "e797", + "unicode_decimal": 59287 + }, + { + "icon_id": "16905699", + "name": "授权", + "font_class": "shouquan1", + "unicode": "e7b3", + "unicode_decimal": 59315 + }, + { + "icon_id": "647455", + "name": "播放", + "font_class": "video-play", + "unicode": "e653", + "unicode_decimal": 58963 + }, + { + "icon_id": "16611521", + "name": "实时分析", + "font_class": "shishifenxi", + "unicode": "e7af", + "unicode_decimal": 59311 + }, + { + "icon_id": "16611522", + "name": "查看分析任务", + "font_class": "chakanfenxirenwu", + "unicode": "e7b0", + "unicode_decimal": 59312 + }, + { + "icon_id": "16611335", + "name": "结构化分析", + "font_class": "jiegouhuafenxi", + "unicode": "e7ad", + "unicode_decimal": 59309 + }, + { + "icon_id": "14985809", + "name": "添加轨迹", + "font_class": "tianjiaguiji2", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "15056394", + "name": "添加检索目标", + "font_class": "tianjiajiansuomubiao", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "14677591", + "name": "add", + "font_class": "add", + "unicode": "e661", + "unicode_decimal": 58977 + }, + { + "icon_id": "16320529", + "name": "地点", + "font_class": "didian", + "unicode": "e798", + "unicode_decimal": 59288 + }, + { + "icon_id": "16406202", + "name": "播放hov", + "font_class": "bofanghov", + "unicode": "e79f", + "unicode_decimal": 59295 + }, + { + "icon_id": "16406205", + "name": "播放", + "font_class": "bofang3", + "unicode": "e7a0", + "unicode_decimal": 59296 + }, + { + "icon_id": "16018760", + "name": "警告", + "font_class": "jinggao", + "unicode": "e788", + "unicode_decimal": 59272 + }, + { + "icon_id": "16018761", + "name": "提示", + "font_class": "tishi", + "unicode": "e789", + "unicode_decimal": 59273 + }, + { + "icon_id": "16018772", + "name": "帮助", + "font_class": "bangzhu", + "unicode": "e78a", + "unicode_decimal": 59274 + }, + { + "icon_id": "16018774", + "name": "关闭", + "font_class": "guanbi1", + "unicode": "e78b", + "unicode_decimal": 59275 + }, + { + "icon_id": "16018783", + "name": "成功", + "font_class": "chenggong", + "unicode": "e78c", + "unicode_decimal": 59276 + }, + { + "icon_id": "16438442", + "name": "前往", + "font_class": "qianwang", + "unicode": "e7ac", + "unicode_decimal": 59308 + }, + { + "icon_id": "16437744", + "name": "授权", + "font_class": "shouquan", + "unicode": "e7ab", + "unicode_decimal": 59307 + }, + { + "icon_id": "16436820", + "name": "经纬度", + "font_class": "jingweidu", + "unicode": "e7aa", + "unicode_decimal": 59306 + }, + { + "icon_id": "16018384", + "name": "删除", + "font_class": "shanchu1", + "unicode": "e74e", + "unicode_decimal": 59214 + }, + { + "icon_id": "16018750", + "name": "导出", + "font_class": "daochu", + "unicode": "e782", + "unicode_decimal": 59266 + }, + { + "icon_id": "16436718", + "name": "资源管理", + "font_class": "ziyuanguanli", + "unicode": "e7a4", + "unicode_decimal": 59300 + }, + { + "icon_id": "16436719", + "name": "服务器授权", + "font_class": "fuwuqishouquan", + "unicode": "e7a5", + "unicode_decimal": 59301 + }, + { + "icon_id": "16436720", + "name": "修改密码", + "font_class": "xiugaimima", + "unicode": "e7a6", + "unicode_decimal": 59302 + }, + { + "icon_id": "16436721", + "name": "账号管理", + "font_class": "zhanghaoguanli", + "unicode": "e7a7", + "unicode_decimal": 59303 + }, + { + "icon_id": "16436722", + "name": "算力配额", + "font_class": "suanlipeie", + "unicode": "e7a8", + "unicode_decimal": 59304 + }, + { + "icon_id": "16436723", + "name": "VMS配置", + "font_class": "VMSpeizhi", + "unicode": "e7a9", + "unicode_decimal": 59305 + }, + { + "icon_id": "16059984", + "name": "添加", + "font_class": "tianjia1", + "unicode": "e794", + "unicode_decimal": 59284 + }, + { + "icon_id": "16059985", + "name": "移除", + "font_class": "yichu", + "unicode": "e795", + "unicode_decimal": 59285 + }, + { + "icon_id": "15809722", + "name": "路径", + "font_class": "lujing", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "15809625", + "name": "监控信息", + "font_class": "jiankongxinxi", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "15809627", + "name": "范围", + "font_class": "fanwei", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "15809628", + "name": "案发地点", + "font_class": "anfadidian", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "15809688", + "name": "工具箱", + "font_class": "gongjuxiang", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "15809690", + "name": "工具箱关闭1", + "font_class": "gongjuxiangguanbi1", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "15663416", + "name": "截侦", + "font_class": "jiezhen", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "15660940", + "name": "回溯分析1", + "font_class": "huisufenxi1", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "15660941", + "name": "回溯分析", + "font_class": "huisufenxi", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "15492023", + "name": "添加视频文件", + "font_class": "tianjiashipinwenjian1", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "15415140", + "name": "加载失败", + "font_class": "jiazaishibai", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "15415141", + "name": "刷新", + "font_class": "shuaxin", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "15340138", + "name": "全屏", + "font_class": "quanping", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "15340139", + "name": "取消全屏", + "font_class": "quxiaoquanping", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "15329202", + "name": "视频播放", + "font_class": "shipinbofang", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "15329203", + "name": "视频暂停", + "font_class": "shipinzanting", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "15291283", + "name": "离线轨迹", + "font_class": "lixianguiji", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "15291280", + "name": "离线", + "font_class": "lixian", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "15208512", + "name": "小角标", + "font_class": "xiaojiaobiao", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "15136409", + "name": "上传", + "font_class": "shangchuan1", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "15136380", + "name": "添加为检索对象", + "font_class": "tianjiaweijiansuoduixiang", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "15136381", + "name": "添加为检索记录", + "font_class": "tianjiaweijiansuojilu", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "15085430", + "name": "离线分析", + "font_class": "lixianfenxi1", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "15078532", + "name": "快速检索hov", + "font_class": "kuaisujiansuohov", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "15078533", + "name": "快速检索", + "font_class": "kuaisujiansuo1", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "15076848", + "name": "快速检索", + "font_class": "kuaisujiansuo", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "15076727", + "name": "预案管理", + "font_class": "yuanguanli", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "15076728", + "name": "摄像头", + "font_class": "shexiangtou", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "15076729", + "name": "离线分析", + "font_class": "lixianfenxi", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "13838314", + "name": "filter", + "font_class": "filter", + "unicode": "e61a", + "unicode_decimal": 58906 + }, + { + "icon_id": "15010235", + "name": "添加为追踪对象", + "font_class": "tianjiaweizhuizongduixiang2", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "14986007", + "name": "添加为追踪对象", + "font_class": "tianjiaweizhuizongduixiang1", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "14982860", + "name": "保存", + "font_class": "baocun1", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "14981791", + "name": "添加视频文件夹", + "font_class": "tianjiashipinwenjianjia", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "14981792", + "name": "添加视频文件", + "font_class": "tianjiashipinwenjian", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "14981667", + "name": "地图", + "font_class": "ditu", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "14981619", + "name": "新建摄像头", + "font_class": "xinjianshexiangtou", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "14981570", + "name": "历史回溯", + "font_class": "lishihuisu", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "14796345", + "name": "deco已添加为轨迹", + "font_class": "decoyitianjiaweiguiji", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "14796466", + "name": "播放切换", + "font_class": "bofangqiehuan", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "14796642", + "name": "添加", + "font_class": "tianjia", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "14795587", + "name": "保存", + "font_class": "baocun", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "14795971", + "name": "工具箱关闭", + "font_class": "gongjuxiangguanbi", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "14795973", + "name": "上传", + "font_class": "shangchuan", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "14795974", + "name": "工具箱", + "font_class": "gongjuxiang1", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "14682024", + "name": "logo", + "font_class": "logo", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "13841331", + "name": "setting", + "font_class": "setting", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "13841332", + "name": "user", + "font_class": "user", + "unicode": "e628", + "unicode_decimal": 58920 + }, + { + "icon_id": "13841333", + "name": "quit", + "font_class": "quit", + "unicode": "e629", + "unicode_decimal": 58921 + }, + { + "icon_id": "14681873", + "name": "arrow展开没选中", + "font_class": "arrowzhankaimeixuanzhong", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "14681874", + "name": "arrow展开选中", + "font_class": "arrowzhankaixuanzhong", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "14681940", + "name": "选择选中", + "font_class": "xuanzexuanzhong", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "14681960", + "name": "选择半选", + "font_class": "xuanzebanxuan", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "14681963", + "name": "选择nor", + "font_class": "xuanzenor", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "14681709", + "name": "筛选关闭nor", + "font_class": "shaixuanguanbinor", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "14681588", + "name": "更多", + "font_class": "gengduo", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "14681594", + "name": "右展开", + "font_class": "youzhankai", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "14681599", + "name": "左收起", + "font_class": "zuoshouqi", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "14681557", + "name": "圆", + "font_class": "yuan", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "14681559", + "name": "多边形", + "font_class": "duobianxing", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "14681564", + "name": "方", + "font_class": "fang", + "unicode": "e68c", + "unicode_decimal": 59020 + }, + { + "icon_id": "14681566", + "name": "测距", + "font_class": "ceju", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "14681437", + "name": "实时追踪", + "font_class": "shishizhuizong1", + "unicode": "e683", + "unicode_decimal": 59011 + }, + { + "icon_id": "14681438", + "name": "轨迹回溯", + "font_class": "guijihuisu1", + "unicode": "e684", + "unicode_decimal": 59012 + }, + { + "icon_id": "14681441", + "name": "添加轨迹", + "font_class": "tianjiaguiji", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "14681442", + "name": "移除轨迹", + "font_class": "yichuguiji", + "unicode": "e686", + "unicode_decimal": 59014 + }, + { + "icon_id": "14681327", + "name": "放大", + "font_class": "fangda", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "14681332", + "name": "缩小", + "font_class": "suoxiao", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "14681337", + "name": "下载", + "font_class": "xiazai", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "14681144", + "name": "返回", + "font_class": "fanhui", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "14681046", + "name": "搜索", + "font_class": "sousuo", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "14681047", + "name": "取消选中", + "font_class": "quxiaoxuanzhong", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "14681048", + "name": "批量选择nor", + "font_class": "piliangxuanzenor", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "14681051", + "name": "开启分析", + "font_class": "kaiqifenxi", + "unicode": "e66c", + "unicode_decimal": 58988 + }, + { + "icon_id": "14681060", + "name": "取消分析", + "font_class": "quxiaofenxi", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "14681062", + "name": "筛选", + "font_class": "shaixuan", + "unicode": "e66e", + "unicode_decimal": 58990 + }, + { + "icon_id": "14681067", + "name": "档案", + "font_class": "dangan", + "unicode": "e66f", + "unicode_decimal": 58991 + }, + { + "icon_id": "14681071", + "name": "播放", + "font_class": "bofang", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "14681073", + "name": "暂停", + "font_class": "zanting", + "unicode": "e671", + "unicode_decimal": 58993 + }, + { + "icon_id": "14681075", + "name": "删除", + "font_class": "shanchu", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "14681083", + "name": "添加为追踪对象", + "font_class": "tianjiaweizhuizongduixiang", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "14681086", + "name": "查看大图", + "font_class": "chakandatu", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "14681091", + "name": "检索记录", + "font_class": "jiansuojilu", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "14681108", + "name": "阈值", + "font_class": "yuzhi", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "14681117", + "name": "查看详情", + "font_class": "chakanxiangqing", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "14677552", + "name": "轨迹回溯", + "font_class": "guijihuisu", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "14677553", + "name": "点位配置nor", + "font_class": "dianweipeizhinor", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "14677554", + "name": "一人一档", + "font_class": "yirenyidang", + "unicode": "e65e", + "unicode_decimal": 58974 + }, + { + "icon_id": "14677555", + "name": "同伴分析", + "font_class": "tongbanfenxi", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "14677595", + "name": "切换左", + "font_class": "qiehuanzuo", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "14677596", + "name": "切换右", + "font_class": "qiehuanyou", + "unicode": "e663", + "unicode_decimal": 58979 + }, + { + "icon_id": "14677606", + "name": "停止等待", + "font_class": "tingzhidengdai", + "unicode": "e664", + "unicode_decimal": 58980 + }, + { + "icon_id": "14677607", + "name": "已关闭", + "font_class": "yiguanbi", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "14677648", + "name": "弹窗关闭", + "font_class": "danchuangguanbi", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "14071593", + "name": "历史记录", + "font_class": "lishijilu", + "unicode": "e64a", + "unicode_decimal": 58954 + }, + { + "icon_id": "14070176", + "name": "旋转", + "font_class": "xuanzhuan", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "14070177", + "name": "清除", + "font_class": "qingchu", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "14000087", + "name": "dangantianjia", + "font_class": "dangantianjia", + "unicode": "e63d", + "unicode_decimal": 58941 + }, + { + "icon_id": "14000088", + "name": "bianji", + "font_class": "bianji", + "unicode": "e63e", + "unicode_decimal": 58942 + }, + { + "icon_id": "13979358", + "name": "fullscreen", + "font_class": "fullscreen", + "unicode": "e63b", + "unicode_decimal": 58939 + }, + { + "icon_id": "13979359", + "name": "cancle_fullscreen", + "font_class": "cancle_fullscreen", + "unicode": "e63c", + "unicode_decimal": 58940 + }, + { + "icon_id": "13979335", + "name": "quanyujiansuo_nor", + "font_class": "quanyujiansuo_nor", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "13979336", + "name": "guijihuisu_nor", + "font_class": "guijihuisu_nor", + "unicode": "e63a", + "unicode_decimal": 58938 + } + ] +} diff --git a/packages/icon/src/font/iconfont.ttf b/packages/icon/src/font/iconfont.ttf new file mode 100644 index 0000000..c466c9f Binary files /dev/null and b/packages/icon/src/font/iconfont.ttf differ diff --git a/packages/icon/src/font/iconfont.woff b/packages/icon/src/font/iconfont.woff new file mode 100644 index 0000000..f5b4968 Binary files /dev/null and b/packages/icon/src/font/iconfont.woff differ diff --git a/packages/icon/src/font/iconfont.woff2 b/packages/icon/src/font/iconfont.woff2 new file mode 100644 index 0000000..325adce Binary files /dev/null and b/packages/icon/src/font/iconfont.woff2 differ diff --git a/packages/icon/src/index.less b/packages/icon/src/index.less new file mode 100644 index 0000000..23f5dce --- /dev/null +++ b/packages/icon/src/index.less @@ -0,0 +1,3 @@ +.icon:hover { + color: #6accca !important; +} diff --git a/packages/icon/src/index.md b/packages/icon/src/index.md new file mode 100644 index 0000000..e3ddd6a --- /dev/null +++ b/packages/icon/src/index.md @@ -0,0 +1,22 @@ +--- +nav: + title: Icon +order: 1 +toc: content +title: 快速上手 +--- + + + +基本用法 +icon列表 +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| title | 标题 | string | '' | - | +| styles | 样式 | cssProperties | {} | - | +| icon | fontClass名 | string | '' | - | +| size | fontClass名 | integer | 14 | - | +| onIconClick | icon点击事件 | function | ()=>{} | - | +| color | 图标颜色 | string | '' | - | \ No newline at end of file diff --git a/packages/icon/src/index.ts b/packages/icon/src/index.ts new file mode 100644 index 0000000..f9fa9f3 --- /dev/null +++ b/packages/icon/src/index.ts @@ -0,0 +1 @@ +export { default as IconFont } from './Iconfont'; diff --git a/packages/map/.fatherrc.ts b/packages/map/.fatherrc.ts new file mode 100644 index 0000000..447d06b --- /dev/null +++ b/packages/map/.fatherrc.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'father'; + +export default defineConfig({ + // more father config: https://github.com/umijs/father/blob/master/docs/config.md + esm: { + output: 'es', + ignores: ['**/demo/*', 'src/**/demo/*'] + }, + cjs: { + output: 'lib', + ignores: ['**/demo/*', 'src/**/demo/*'] + }, +}); diff --git a/packages/map/CHANGELOG.md b/packages/map/CHANGELOG.md new file mode 100644 index 0000000..7eaf889 --- /dev/null +++ b/packages/map/CHANGELOG.md @@ -0,0 +1,13 @@ +# @zhst/map + +## 0.2.1 + +### Patch Changes + +- 添加 react + +## 0.2.0 + +### Minor Changes + +- 完善地图例子,抛出 mapConfig 定制化参数传入,完善 API 说明 diff --git a/packages/map/README.md b/packages/map/README.md new file mode 100644 index 0000000..ffa1663 --- /dev/null +++ b/packages/map/README.md @@ -0,0 +1,16 @@ +# @zhst/map + +## 介绍 + +地图库,基于map-box开发 + +## 安装 + +> pnpm install @zhst/map + +## 使用 + +```js +import React from 'react'; +import { MapBox } from '@zhst/map' +``` diff --git a/packages/map/es/MapBox.js b/packages/map/es/MapBox.js new file mode 100644 index 0000000..29e7f4b --- /dev/null +++ b/packages/map/es/MapBox.js @@ -0,0 +1,52 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +var _excluded = ["style", "children", "mapRef", "onLoad", "mapCenter", "mapConfig"]; +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } +function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } +import 'mapbox-gl/dist/mapbox-gl.css'; +import Map from 'react-map-gl'; +import "./index.less"; +import React from 'react'; +import { merge } from "./utils"; +import { MAP_CENTER, defaultMapConfig } from "./constants"; +var MapBox = function MapBox(props) { + var _ref = props || {}, + _ref$style = _ref.style, + style = _ref$style === void 0 ? {} : _ref$style, + children = _ref.children, + mapRef = _ref.mapRef, + _onLoad = _ref.onLoad, + _ref$mapCenter = _ref.mapCenter, + mapCenter = _ref$mapCenter === void 0 ? MAP_CENTER : _ref$mapCenter, + _ref$mapConfig = _ref.mapConfig, + mapConfig = _ref$mapConfig === void 0 ? {} : _ref$mapConfig, + others = _objectWithoutProperties(_ref, _excluded); + return ( + /*#__PURE__*/ + //@ts-ignore + React.createElement(Map, _extends({ + ref: function ref(e) { + if (mapRef) { + mapRef.current = e; + } + }, + onLoad: function onLoad(e) { + _onLoad && _onLoad(e); + }, + style: _objectSpread({ + width: '100%', + height: 600 + }, style) + }, merge(defaultMapConfig, mapConfig), { + initialViewState: _objectSpread(_objectSpread({}, mapCenter), {}, { + zoom: 10 + }) + }, others), children) + ); +}; +export default MapBox; \ No newline at end of file diff --git a/packages/map/es/constants.js b/packages/map/es/constants.js new file mode 100644 index 0000000..13c186f --- /dev/null +++ b/packages/map/es/constants.js @@ -0,0 +1,47 @@ +export var mapboxAccessToken = 'pk.eyJ1IjoiZGluZ2xpMTIzIiwiYSI6ImNra204ODhjczBobTgyeHJ6MmJpZHMxNWgifQ.NbKrXh_hb2gvjr5CEMDnyQ'; +export var MAP_CENTER = { + longitude: 120.2667694313269, + latitude: 30.180942826533766 +}; //地图中心 +var MapUrl = 'http://10.0.0.120:30003/map'; +export var defaultMapConfig = { + mapboxAccessToken: mapboxAccessToken, + maxZoom: 18, + minZoom: 4, + dragRotate: false, + mapStyle: { + version: 8, + name: 'Mapbox Streets', + // sprite: `${location.origin}/mapbox/sprite`, // 地图图标 + glyphs: 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf', + // 字体 + sources: { + //数据源 + 'osm-tiles': { + type: 'raster', + //栅格切片。vector:矢量切片 + // Z-瓦片层级,一般支持0-18级,越大代表越清晰; + // X-瓦片列号,从西向东(0->360),依次0,1,2,……; + // Y-瓦片行号,从北向南(有些也可能是从南向北),依次0,1,2,……; + tiles: ["".concat(MapUrl, "/api/tilesets/mapfile/{z}/{x}/{y}.png")], + //在线地址,先写死120 + tileSize: 256 //切片的最小展示尺寸(可选,单位:像素,默认值为 512,即 1024/2 + } + }, + layers: [ + // 图层。图层指定了如何渲染数据源提供的数据 + { + id: 'zhstLayer', + //唯一id + type: 'raster', + //类型 栅格。circle,symbol,line... + source: 'osm-tiles', + // 'source-layer': 'osmtiles',//数据源必须是type:vector + minZoom: 4, + //最小层级 + maxZoom: 17, + //最大层级 + renderingMode: '2d' + }] + } +}; \ No newline at end of file diff --git a/packages/map/es/index.js b/packages/map/es/index.js new file mode 100644 index 0000000..1662d0f --- /dev/null +++ b/packages/map/es/index.js @@ -0,0 +1 @@ +export { default as MapBox } from "./MapBox"; \ No newline at end of file diff --git a/packages/map/es/index.less b/packages/map/es/index.less new file mode 100644 index 0000000..ac327e9 --- /dev/null +++ b/packages/map/es/index.less @@ -0,0 +1,3 @@ +.mapboxgl-ctrl-attrib-button { + display: none; +} diff --git a/packages/map/es/interface.js b/packages/map/es/interface.js new file mode 100644 index 0000000..8cec2e9 --- /dev/null +++ b/packages/map/es/interface.js @@ -0,0 +1 @@ +export {}; \ No newline at end of file diff --git a/packages/map/es/utils.js b/packages/map/es/utils.js new file mode 100644 index 0000000..3e2ee23 --- /dev/null +++ b/packages/map/es/utils.js @@ -0,0 +1,36 @@ +var getRawType = function getRawType(val) { + return Object.prototype.toString.call(val).slice(8, -1); +}; +var isPlainObjectOrArray = function isPlainObjectOrArray(val) { + return isPlainObject(val) || Array.isArray(val); +}; +var isPlainObject = function isPlainObject(val) { + return getRawType(val) === 'Object'; +}; +export var merge = function merge(object) { + for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + for (var _i = 0, _sources = sources; _i < _sources.length; _i++) { + var source = _sources[_i]; + for (var key in source) { + if (source[key] === undefined && key in object) { + continue; + } + if (isPlainObjectOrArray(source[key])) { + if (getRawType(object[key] === getRawType(source[key]))) { + if (isPlainObject(object[key])) { + merge(object[key], source[key]); + } else { + object[key] = object[key].concat(source[key]); + } + } else { + object[key] = source[key]; + } + } else { + object[key] = source[key]; + } + } + } + return object; +}; \ No newline at end of file diff --git a/packages/map/package.json b/packages/map/package.json new file mode 100644 index 0000000..907a3cf --- /dev/null +++ b/packages/map/package.json @@ -0,0 +1,43 @@ +{ + "name": "@zhst/map", + "version": "0.2.1", + "description": "地图库", + "keywords": [ + "map", + "zhst", + "地图库" + ], + "license": "ISC", + "author": "dev", + "sideEffects": [ + "dist/*", + "es/**/style/*", + "lib/**/style/*", + "*.less" + ], + "main": "lib/index.js", + "module": "es/index.js", + "typings": "es/index.d.ts", + "exports": { + ".": { + "require": "./lib/index.js", + "import": "./es/index.js", + "default": "./es/index.js" + } + }, + "files": [ + "es", + "lib" + ], + "scripts": { + "build": "father build" + }, + "publishConfig": { + "access": "public", + "registry": "http://10.0.0.77:4874" + }, + "dependencies": { + "react-map-gl": "^7.1.7", + "mapbox-gl": "^2.15.0" + } +} diff --git a/packages/map/src/MapBox.tsx b/packages/map/src/MapBox.tsx new file mode 100644 index 0000000..4cd886a --- /dev/null +++ b/packages/map/src/MapBox.tsx @@ -0,0 +1,40 @@ +import 'mapbox-gl/dist/mapbox-gl.css'; +import Map from 'react-map-gl'; +import './index.less'; +import React from 'react'; +import { MapProps } from './interface'; +import { merge } from './utils'; +import { MAP_CENTER, defaultMapConfig } from './constants'; + +const MapBox: React.FC = (props) => { + const { + style = {}, + children, + mapRef, + onLoad, + mapCenter = MAP_CENTER, + mapConfig = {}, + ...others + } = props || {}; + return ( + //@ts-ignore + { + if (mapRef) { + mapRef.current = e!; + } + }} + onLoad={(e) => { + onLoad && onLoad(e); + }} + style={{ width: '100%', height: 600, ...style }} + {...merge(defaultMapConfig, mapConfig)} + initialViewState={{ ...mapCenter, zoom: 10 }} + {...others} + > + {children} + + ); +}; + +export default MapBox; diff --git a/packages/map/src/constants.ts b/packages/map/src/constants.ts new file mode 100644 index 0000000..e06b0dc --- /dev/null +++ b/packages/map/src/constants.ts @@ -0,0 +1,42 @@ +export const mapboxAccessToken = + 'pk.eyJ1IjoiZGluZ2xpMTIzIiwiYSI6ImNra204ODhjczBobTgyeHJ6MmJpZHMxNWgifQ.NbKrXh_hb2gvjr5CEMDnyQ'; +export const MAP_CENTER = { + longitude: 120.2667694313269, + latitude: 30.180942826533766, +}; //地图中心 +const MapUrl = 'http://10.0.0.120:30003/map'; +export const defaultMapConfig = { + mapboxAccessToken, + maxZoom: 18, + minZoom: 4, + dragRotate: false, + mapStyle: { + version: 8, + name: 'Mapbox Streets', + // sprite: `${location.origin}/mapbox/sprite`, // 地图图标 + glyphs: 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf', // 字体 + sources: { + //数据源 + 'osm-tiles': { + type: 'raster', //栅格切片。vector:矢量切片 + // Z-瓦片层级,一般支持0-18级,越大代表越清晰; + // X-瓦片列号,从西向东(0->360),依次0,1,2,……; + // Y-瓦片行号,从北向南(有些也可能是从南向北),依次0,1,2,……; + tiles: [`${MapUrl}/api/tilesets/mapfile/{z}/{x}/{y}.png`], //在线地址,先写死120 + tileSize: 256, //切片的最小展示尺寸(可选,单位:像素,默认值为 512,即 1024/2 + }, + }, + layers: [ + // 图层。图层指定了如何渲染数据源提供的数据 + { + id: 'zhstLayer', //唯一id + type: 'raster', //类型 栅格。circle,symbol,line... + source: 'osm-tiles', + // 'source-layer': 'osmtiles',//数据源必须是type:vector + minZoom: 4, //最小层级 + maxZoom: 17, //最大层级 + renderingMode: '2d', + }, + ], + }, +}; \ No newline at end of file diff --git a/packages/map/src/demo/basic.tsx b/packages/map/src/demo/basic.tsx new file mode 100644 index 0000000..0f6c999 --- /dev/null +++ b/packages/map/src/demo/basic.tsx @@ -0,0 +1,25 @@ +import React, { useRef } from 'react'; +import { MapBox } from '@zhst/map'; + +const demo = () => { + const mapRef = useRef(null); + const handleMapLoad = (e: mapboxgl.MapboxEvent) => { + const map = e.target; + if (!map) { + return; + } + map.flyTo({ + center: [120,30], + zoom: map?.getMaxZoom(), + }); + }; + return ( +
+ +
+ ); +}; + +export default demo; diff --git a/packages/map/src/index.less b/packages/map/src/index.less new file mode 100644 index 0000000..ac327e9 --- /dev/null +++ b/packages/map/src/index.less @@ -0,0 +1,3 @@ +.mapboxgl-ctrl-attrib-button { + display: none; +} diff --git a/packages/map/src/index.md b/packages/map/src/index.md new file mode 100644 index 0000000..5cd4835 --- /dev/null +++ b/packages/map/src/index.md @@ -0,0 +1,20 @@ +--- +nav: + title: 地图库 +order: 1 +toc: content +title: 快速上手 +--- + + +基本用法 +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| mapRef | 标题 | React.MutableRefObject | '' | - | +| style | 地图样式 | cssProperties | {} | - | +| mapCenter | 地图中心点 | {longitude: number, latitude: number} | {longitude: 120.2667694313269, latitude: 30.180942826533766} | - | +| children | 内部元素 | JSX.Element或JSX.Element[]或Array | {} | - | +| mapConfig | 地图配置 | MapConfigProps | defaultMapConfig | - | +| onLoad | 地图加载事件 | function | ()=>{} | - | diff --git a/packages/map/src/index.ts b/packages/map/src/index.ts new file mode 100644 index 0000000..6581359 --- /dev/null +++ b/packages/map/src/index.ts @@ -0,0 +1 @@ +export { default as MapBox } from './MapBox'; diff --git a/packages/map/src/interface.ts b/packages/map/src/interface.ts new file mode 100644 index 0000000..4001f43 --- /dev/null +++ b/packages/map/src/interface.ts @@ -0,0 +1,19 @@ +import { CSSProperties } from "react"; +import { MapRef, MapStyle } from "react-map-gl"; + +export interface MapProps { + onLoad?: (e: mapboxgl.MapboxEvent) => void; + mapRef?: React.MutableRefObject; + style?: CSSProperties; + children?: JSX.Element | JSX.Element[] | Array; + mapConfig?: MapConfigProps + mapCenter: {longitude: number, latitude: number} +} + +export interface MapConfigProps { + mapboxAccessToken?: string; //token + minZoom?: number; //最小层级 + maxZoom?: number; //最大层级 + dragRotate?: boolean; //是否支持拖拽旋转 + mapStyle?: MapStyle; //地图样式 +} \ No newline at end of file diff --git a/packages/map/src/utils.ts b/packages/map/src/utils.ts new file mode 100644 index 0000000..f095cdc --- /dev/null +++ b/packages/map/src/utils.ts @@ -0,0 +1,35 @@ +const getRawType = (val: any) => { + return Object.prototype.toString.call(val).slice(8, -1) +} + +const isPlainObjectOrArray = (val: any) => { + return isPlainObject(val) || Array.isArray(val) +} + +const isPlainObject = (val: any) => { + return getRawType(val) === 'Object' +} + +export const merge = (object: any, ...sources: any) => { + for(const source of sources) { + for(const key in source) { + if(source[key] === undefined && key in object) { + continue + } + if(isPlainObjectOrArray(source[key])) { + if(getRawType(object[key] === getRawType(source[key]))) { + if(isPlainObject(object[key])) { + merge(object[key], source[key]) + } else { + object[key] = object[key].concat(source[key]) + } + } else { + object[key] = source[key] + } + } else { + object[key] = source[key] + } + } + } + return object; +} \ No newline at end of file diff --git a/packages/material/.fatherrc.ts b/packages/material/.fatherrc.ts index 9e3a0ef..447d06b 100644 --- a/packages/material/.fatherrc.ts +++ b/packages/material/.fatherrc.ts @@ -2,6 +2,12 @@ import { defineConfig } from 'father'; export default defineConfig({ // more father config: https://github.com/umijs/father/blob/master/docs/config.md - esm: { output: 'es' }, - cjs: { output: 'lib' }, + esm: { + output: 'es', + ignores: ['**/demo/*', 'src/**/demo/*'] + }, + cjs: { + output: 'lib', + ignores: ['**/demo/*', 'src/**/demo/*'] + }, }); diff --git a/packages/material/CHANGELOG.md b/packages/material/CHANGELOG.md index 07153e6..e29de51 100644 --- a/packages/material/CHANGELOG.md +++ b/packages/material/CHANGELOG.md @@ -1,140 +1,103 @@ -# @zhst/biz +# @zhst/material -## 0.5.1 +## 0.7.7 + +### Patch Changes + +- 修改 schema 物料透出 + +## 0.7.6 + +### Patch Changes + +- 修改文件引用出错 + +## 0.7.5 + +### Patch Changes + +- @zhst/func@0.9.1 +- @zhst/biz@0.11.3 +- @zhst/hooks@0.8.10 +- @zhst/meta@0.9.7 + +## 0.7.4 ### Patch Changes - Updated dependencies - - @zhst/hooks@0.6.0 - - @zhst/func@0.6.0 - - @zhst/meta@0.7.0 - - @zhst/biz@0.5.1 + - @zhst/func@0.9.0 + - @zhst/biz@0.11.2 + - @zhst/hooks@0.8.9 + - @zhst/meta@0.9.6 -## 0.5.0 +## 0.7.3 + +### Patch Changes + +- Updated dependencies + - @zhst/biz@0.11.1 + +## 0.7.2 + +### Patch Changes + +- Updated dependencies + - @zhst/biz@0.11.0 + +## 0.7.1 + +### Patch Changes + +- 添加登录 css 属性 + +## 0.7.0 ### Minor Changes -- feat: 初版发布 - -### Patch Changes - -- Updated dependencies - - @zhst/hooks@0.5.0 - - @zhst/func@0.5.0 - - @zhst/meta@0.6.0 - - @zhst/biz@0.5.0 - -## 0.4.2 - -### Patch Changes - -- Updated dependencies - - @zhst/meta@0.5.2 - - @zhst/biz@0.4.2 - -## 0.4.1 - -### Patch Changes - -- feat: 初始化 -- Updated dependencies - - @zhst/hooks@0.4.1 - - @zhst/func@0.4.1 - - @zhst/meta@0.5.1 - - @zhst/biz@0.4.1 - -## 0.4.0 - -### Minor Changes - -- fix: 修改 pkg - -### Patch Changes - -- Updated dependencies - - @zhst/hooks@0.4.0 - - @zhst/func@0.4.0 - - @zhst/meta@0.5.0 - - @zhst/biz@0.4.0 - -## 0.3.6 - -### Patch Changes - -- Updated dependencies - - @zhst/meta@0.4.4 - - @zhst/biz@0.3.6 - -## 0.3.5 - -### Patch Changes - -- Updated dependencies - - @zhst/meta@0.4.3 - - @zhst/biz@0.3.5 - -## 0.3.4 - -### Patch Changes - -- Updated dependencies - - @zhst/meta@0.4.2 - - @zhst/biz@0.3.4 +- 初始化物料库 ## 0.3.3 ### Patch Changes -- Updated dependencies - - @zhst/func@0.3.1 - - @zhst/biz@0.3.3 - - @zhst/hooks@0.3.1 - - @zhst/meta@0.4.1 +- 初始化 ## 0.3.2 ### Patch Changes +- 初始化物料库 - Updated dependencies - - @zhst/meta@0.4.0 - - @zhst/biz@0.3.2 + - @zhst/hooks@0.8.8 + - @zhst/func@0.8.3 + - @zhst/meta@0.9.5 + - @zhst/biz@0.10.5 ## 0.3.1 ### Patch Changes - Updated dependencies - - @zhst/meta@0.3.1 - - @zhst/biz@0.3.1 + - @zhst/hooks@0.8.7 + - @zhst/func@0.8.2 + - @zhst/meta@0.9.4 + - @zhst/biz@0.10.4 ## 0.3.0 ### Minor Changes -- feat: 初始化项目包 +- 新增登录与修改密码模块 -### Patch Changes +## 0.2.0 -- Updated dependencies - - @zhst/hooks@0.3.0 - - @zhst/func@0.3.0 - - @zhst/meta@0.3.0 - - @zhst/biz@0.3.0 +### Minor Changes -## 0.2.4 +- 优化单个算法配置绘制方法 -### Patch Changes +## 0.1.0 -- feat: 新增 meta 包 -- Updated dependencies - - @zhst/func@0.2.4 - - @zhst/hooks@0.2.4 - - @zhst/meta@0.2.4 +### Minor Changes -## 0.2.3 - -### Patch Changes - -- fix: 调试包 link -- Updated dependencies - - @zhst/hooks@0.2.3 +- 添加批量算法配置模块 diff --git a/packages/material/README.md b/packages/material/README.md index 96d7ea4..a57949f 100644 --- a/packages/material/README.md +++ b/packages/material/README.md @@ -1,10 +1,6 @@ -:::warning{title=待开始} -目前项目正在如火如荼的筹备中... -::: - ## 介绍 -物料库,每一个物料都是单独存在的个体,不需要任何依赖,就能形成一个页面,甚至一个项目 +基于 lambo 的物料库 ## 安装 @@ -12,9 +8,9 @@ ## 使用 -```jsx +```js import React from 'react'; -import { Demo } from '@zhst/material' +import { Login } from '@zhst/material' -export default () => +export () => ``` diff --git a/packages/material/es/Demo/index.d.ts b/packages/material/es/Demo/index.d.ts deleted file mode 100644 index bcc157c..0000000 --- a/packages/material/es/Demo/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import React from 'react'; -declare const _default: () => React.JSX.Element; -export default _default; diff --git a/packages/material/es/Demo/index.js b/packages/material/es/Demo/index.js deleted file mode 100644 index 9c21809..0000000 --- a/packages/material/es/Demo/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import React from 'react'; -export default (function () { - return /*#__PURE__*/React.createElement("div", null, "hi"); -}); \ No newline at end of file diff --git a/packages/material/es/algorithmConfig/algorithmConfig.d.ts b/packages/material/es/algorithmConfig/algorithmConfig.d.ts new file mode 100644 index 0000000..9c0101e --- /dev/null +++ b/packages/material/es/algorithmConfig/algorithmConfig.d.ts @@ -0,0 +1,53 @@ +import React from 'react'; +import { AlgorithmTableProps } from './components/algorithmTable/AlgorithmTable'; +import { TimeTemplateTableProps } from './components/timeTemplateTable/TimeTemplateTable'; +export interface AlgorithmConfigProps { + onAddAlgorithm?: () => void; + /** + * 单选的图片数据 + */ + drawData?: { + imageKey: string; + odRect?: { + x: number; + y: number; + w: number; + h: number; + }; + score?: string; + time?: string; + }; + /** + * 单选状态圈选后的监听事件 + */ + drawListener?: (data: any) => void; + algorithmTableDataSource?: { + id: string; + templateName: string; + operatingCycle: string; + algorithmOccupied: number; + }[]; + timeTemplateDataSource?: { + id: string; + templateName: string; + operatingCycle: string; + arrangeWeek: string; + algorithmOccupied: string; + }[]; + boxList: { + id: string; + name: string; + }[]; + algorithmTableProps?: AlgorithmTableProps; + timeTemplateTableProps?: TimeTemplateTableProps; + selectedKey?: string; + rowKey?: string; + type: AlgorithmTableProps['tableType']; + onSelect?: (key: string, info?: any) => void; +} +export interface AlgorithmConfigRef { + draw: () => void; + cancelDraw: () => void; +} +declare const AlgorithmConfig: React.ForwardRefExoticComponent>; +export default AlgorithmConfig; diff --git a/packages/material/es/algorithmConfig/algorithmConfig.js b/packages/material/es/algorithmConfig/algorithmConfig.js new file mode 100644 index 0000000..f283541 --- /dev/null +++ b/packages/material/es/algorithmConfig/algorithmConfig.js @@ -0,0 +1,141 @@ +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +import React, { useRef, forwardRef, useImperativeHandle } from 'react'; +import { Flex, Image } from "antd"; +import theme from 'antd/es/theme'; +import { BigImagePreview } from '@zhst/meta'; +import { AlgorithmConfigImg, ErrorImage } from "../utils/base64Images"; +import AlgorithmTable from "./components/algorithmTable"; +import TimeTemplateTable from "./components/timeTemplateTable"; +var useToken = theme.useToken; +var Title = function Title(props) { + return /*#__PURE__*/React.createElement("h2", { + style: { + margin: '18px 16px', + fontSize: '14px', + color: 'rgba(0, 0, 0, 0.88)' + } + }, props.children); +}; +var AlgorithmConfig = /*#__PURE__*/forwardRef(function (props, ref) { + var _props$algorithmTable = props.algorithmTableDataSource, + algorithmTableDataSource = _props$algorithmTable === void 0 ? [] : _props$algorithmTable, + _props$timeTemplateDa = props.timeTemplateDataSource, + timeTemplateDataSource = _props$timeTemplateDa === void 0 ? [] : _props$timeTemplateDa, + _props$boxList = props.boxList, + boxList = _props$boxList === void 0 ? [] : _props$boxList, + drawData = props.drawData, + drawListener = props.drawListener, + algorithmTableProps = props.algorithmTableProps, + timeTemplateTableProps = props.timeTemplateTableProps, + selectedKey = props.selectedKey, + _props$type = props.type, + type = _props$type === void 0 ? 'multiple' : _props$type, + _props$rowKey = props.rowKey, + rowKey = _props$rowKey === void 0 ? 'id' : _props$rowKey, + onSelect = props.onSelect; + var drawImageRef = useRef(null); + var _useToken = useToken(), + token = _useToken.token; + useImperativeHandle(ref, function () { + return { + draw: function draw() { + var _drawImageRef$current; + (_drawImageRef$current = drawImageRef.current) === null || _drawImageRef$current === void 0 || _drawImageRef$current.setShowCrop(true); + }, + cancelDraw: function cancelDraw() { + var _drawImageRef$current2; + (_drawImageRef$current2 = drawImageRef.current) === null || _drawImageRef$current2 === void 0 || _drawImageRef$current2.setShowCrop(false); + } + }; + }); + return /*#__PURE__*/React.createElement(Flex, { + style: { + border: "1px solid ".concat(token.colorBorder), + backgroundColor: token.colorBgBase + } + }, /*#__PURE__*/React.createElement("div", { + title: "\u76D2\u5B50\u5217\u8868", + style: { + width: '13.9%' + } + }, /*#__PURE__*/React.createElement(Title, null, "\u76D2\u5B50\u5217\u8868"), /*#__PURE__*/React.createElement("div", { + style: { + borderTop: "1px solid ".concat(token.colorBorder) + } + }, boxList.map(function (item) { + return /*#__PURE__*/React.createElement("p", { + key: item.id, + onClick: function onClick() { + return onSelect === null || onSelect === void 0 ? void 0 : onSelect(item.id, item); + }, + style: { + margin: 0, + padding: "".concat(token.paddingXXS, "px ").concat(token.paddingLG, "px"), + cursor: 'pointer', + // @ts-ignore + color: selectedKey === item[rowKey] ? token.colorPrimary : token.colorText, + // @ts-ignore + backgroundColor: selectedKey === item[rowKey] ? token.blue1 : token.colorBgBase, + transition: '0.2s ease' + } + }, item.name); + }))), /*#__PURE__*/React.createElement("div", { + style: { + boxSizing: 'border-box', + width: '46.3%', + textAlign: 'center', + borderLeft: "1px solid ".concat(token.colorBorder), + borderRight: "1px solid ".concat(token.colorBorder) + } + }, type === 'single' ? /*#__PURE__*/React.createElement(BigImagePreview, { + ref: drawImageRef, + hideTypeBtns: true, + type: "CUSTOM", + screenshotButtonRender: function screenshotButtonRender() { + return /*#__PURE__*/React.createElement(React.Fragment, null); + } + // @ts-ignore + , + data: drawData, + onDraw: drawListener + }) : /*#__PURE__*/React.createElement("div", { + style: { + padding: '84px' + } + }, /*#__PURE__*/React.createElement(Image, { + width: '62.5%', + src: AlgorithmConfigImg, + preview: false, + fallback: ErrorImage + }), /*#__PURE__*/React.createElement("h2", null, "\u8BF7\u8FDB\u884C\u6279\u91CF\u914D\u7F6E"), /*#__PURE__*/React.createElement("ul", { + style: { + display: 'inline-block', + paddingLeft: 0, + width: '51.8%', + listStyle: 'none', + textAlign: 'left', + color: token.colorTextLabel + } + }, /*#__PURE__*/React.createElement("li", null, "\xB7 \u76D2\u5B50\u6279\u91CF\u914D\u7F6E\u4EC5\u652F\u6301\u540C\u578B\u53F7\u76D2\u5B50\uFF1B"), /*#__PURE__*/React.createElement("li", null, "\xB7 \u91C7\u53D6\u8986\u76D6\u5F0F\u66F4\u65B0\uFF0C\u4E0D\u4FDD\u7559\u539F\u6709\u914D\u7F6E\uFF0C\u4E14\u9884\u8B66\u68C0\u6D4B\u6846\u9ED8\u8BA4\u5168\u5C4F\u8303\u56F4\uFF1B"), /*#__PURE__*/React.createElement("li", null, "\xB7 \u4EBA\u6D41\u91CF\u7EDF\u8BA1\u9ED8\u8BA4\u68C0\u6D4B\u7EBF\u4E3A\u5C4F\u5E55\u4E2D\u592E\u6A2A\u5411\u7EBF\u6761\uFF0C\u4E14\u7BAD\u5934\u6307\u5411\u4E0B\u65B9\uFF1B"), /*#__PURE__*/React.createElement("li", null, "\xB7 \u4F18\u5148\u9009\u62E9\u62C9\u6D41\u6B63\u5E38\u7684\u6444\u50CF\u5934\u3002")))), /*#__PURE__*/React.createElement("div", { + style: { + width: '39.8%' + } + }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Title, null, "\u65F6\u95F4\u6A21\u677F"), /*#__PURE__*/React.createElement("div", { + style: { + padding: "".concat(token.paddingMD, "px ").concat(token.paddingSM, "px"), + borderTop: "1px solid ".concat(token.colorBorder), + borderBottom: "1px solid ".concat(token.colorBorder) + } + }, /*#__PURE__*/React.createElement(TimeTemplateTable, _extends({ + dataSource: timeTemplateDataSource + }, timeTemplateTableProps)))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Title, null, "\u7B97\u6CD5\u5E94\u7528"), /*#__PURE__*/React.createElement("div", { + style: { + padding: "".concat(token.paddingMD, "px ").concat(token.paddingSM, "px"), + borderTop: "1px solid ".concat(token.colorBorder) + } + }, /*#__PURE__*/React.createElement(AlgorithmTable, _extends({ + dataSource: algorithmTableDataSource, + tableType: type + }, algorithmTableProps)))))); +}); +export default AlgorithmConfig; \ No newline at end of file diff --git a/packages/material/es/algorithmConfig/components/algorithmTable/AlgorithmTable.js b/packages/material/es/algorithmConfig/components/algorithmTable/AlgorithmTable.js new file mode 100644 index 0000000..e952508 --- /dev/null +++ b/packages/material/es/algorithmConfig/components/algorithmTable/AlgorithmTable.js @@ -0,0 +1,129 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } +import React from 'react'; +import { DeleteFilled, EditFilled, ImportOutlined, PlusCircleFilled } from '@ant-design/icons'; +import { ProTable } from '@ant-design/pro-components'; +import { Popconfirm, Select, Space, Switch } from 'antd'; +import theme from 'antd/es/theme'; +import SchemaFormModal from "../schemaFormModal"; +var useToken = theme.useToken; +var AlgorithmTable = function AlgorithmTable(props) { + var onAddAlgorithm = props.onAddAlgorithm, + onItemSwitch = props.onItemSwitch, + onItemEdit = props.onItemEdit, + onItemDelete = props.onItemDelete, + onSortSelect = props.onSortSelect, + selectedKey = props.selectedKey, + onDraw = props.onDraw, + _props$tableType = props.tableType, + tableType = _props$tableType === void 0 ? 'multiple' : _props$tableType, + _props$sortList = props.sortList, + sortList = _props$sortList === void 0 ? [] : _props$sortList; + var _useToken = useToken(), + token = _useToken.token; + var columns = [{ + title: '模板名称', + dataIndex: 'templateName' + }, { + title: '运行周期', + dataIndex: 'runCycle', + valueType: 'select', + width: 80, + valueEnum: { + 1: { + text: '黑夜' + }, + 0: { + text: '白天' + } + } + }, { + title: '算力占用', + dataIndex: 'powerOccupy' + }, { + title: '操作', + key: 'option', + valueType: 'option', + fixed: true, + render: function render(_DOM, record) { + return [/*#__PURE__*/React.createElement(Switch, { + value: record.status, + onChange: function onChange(_status) { + return onItemSwitch === null || onItemSwitch === void 0 ? void 0 : onItemSwitch(_status, record.id, record); + } + }), /*#__PURE__*/React.createElement("a", { + onClick: function onClick() { + return onDraw === null || onDraw === void 0 ? void 0 : onDraw(record.id, record); + }, + style: { + display: tableType === 'single' ? 'block' : 'none' + }, + href: "#" + }, /*#__PURE__*/React.createElement(ImportOutlined, null)), /*#__PURE__*/React.createElement(SchemaFormModal, { + type: record.templateType, + onFinish: ( /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(values) { + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", onItemEdit === null || onItemEdit === void 0 ? void 0 : onItemEdit(values, record)); + case 1: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }()), + trigger: /*#__PURE__*/React.createElement("a", { + href: "#" + }, /*#__PURE__*/React.createElement(EditFilled, null)) + }), /*#__PURE__*/React.createElement(Popconfirm, { + title: "\u786E\u5B9A\u5220\u9664\u5417\uFF1F", + onConfirm: function onConfirm() { + return onItemDelete === null || onItemDelete === void 0 ? void 0 : onItemDelete(record.id, record); + } + }, /*#__PURE__*/React.createElement("a", { + href: "#" + }, /*#__PURE__*/React.createElement(DeleteFilled, null)))]; + } + }]; + return /*#__PURE__*/React.createElement(ProTable, _extends({ + columns: columns, + bordered: true, + scroll: { + y: 240 + }, + dataSource: [], + headerTitle: /*#__PURE__*/React.createElement(Space, { + size: 16 + }, /*#__PURE__*/React.createElement(Select, { + value: selectedKey, + style: { + width: 320 + }, + onChange: onSortSelect, + options: sortList + }), /*#__PURE__*/React.createElement(PlusCircleFilled, { + onClick: function onClick() { + return onAddAlgorithm === null || onAddAlgorithm === void 0 ? void 0 : onAddAlgorithm(); + }, + style: { + fontSize: '24px', + color: token.colorPrimary, + cursor: 'pointer' + } + })), + toolbar: undefined, + rowKey: "id", + search: false, + options: false, + pagination: false + }, props)); +}; +export default AlgorithmTable; \ No newline at end of file diff --git a/packages/material/es/algorithmConfig/components/algorithmTable/index.d.ts b/packages/material/es/algorithmConfig/components/algorithmTable/index.d.ts new file mode 100644 index 0000000..42d422c --- /dev/null +++ b/packages/material/es/algorithmConfig/components/algorithmTable/index.d.ts @@ -0,0 +1,3 @@ +import AlgorithmTable from './AlgorithmTable'; +export type { AlgorithmTableProps } from './AlgorithmTable'; +export default AlgorithmTable; diff --git a/packages/material/es/algorithmConfig/components/algorithmTable/index.js b/packages/material/es/algorithmConfig/components/algorithmTable/index.js new file mode 100644 index 0000000..345e650 --- /dev/null +++ b/packages/material/es/algorithmConfig/components/algorithmTable/index.js @@ -0,0 +1,2 @@ +import AlgorithmTable from "./AlgorithmTable"; +export default AlgorithmTable; \ No newline at end of file diff --git a/packages/material/es/algorithmConfig/components/schemaFormModal/index.js b/packages/material/es/algorithmConfig/components/schemaFormModal/index.js new file mode 100644 index 0000000..deeb691 --- /dev/null +++ b/packages/material/es/algorithmConfig/components/schemaFormModal/index.js @@ -0,0 +1,2 @@ +import SchemaFormModal from "./schemaFormModal"; +export default SchemaFormModal; \ No newline at end of file diff --git a/packages/material/es/algorithmConfig/components/schemaFormModal/schemaFormModal.d.ts b/packages/material/es/algorithmConfig/components/schemaFormModal/schemaFormModal.d.ts new file mode 100644 index 0000000..2c2d7cd --- /dev/null +++ b/packages/material/es/algorithmConfig/components/schemaFormModal/schemaFormModal.d.ts @@ -0,0 +1,8 @@ +import { FC } from 'react'; +import type { ModalFormProps } from '@ant-design/pro-components'; +export interface SchemaFormModalProps extends ModalFormProps { + type: 'fire' | 'smoke' | 'traffic' | 'face' | 'destroy' | 'wander' | 'gather' | 'cameraBlock'; +} +export declare const SCHEME_TYPE_LIST: Map; +declare const SchemaFormModal: FC; +export default SchemaFormModal; diff --git a/packages/material/es/algorithmConfig/components/schemaFormModal/schemaFormModal.js b/packages/material/es/algorithmConfig/components/schemaFormModal/schemaFormModal.js new file mode 100644 index 0000000..b1c56e2 --- /dev/null +++ b/packages/material/es/algorithmConfig/components/schemaFormModal/schemaFormModal.js @@ -0,0 +1,128 @@ +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +import React from 'react'; +import { BetaSchemaForm } from '@ant-design/pro-components'; +import { Input, Space } from 'antd'; +export var SCHEME_TYPE_LIST = new Map([['fire', '火焰识别'], ['smoke', '烟雾识别'], ['traffic', '人流量统计'], ['face', '面部遮挡识别'], ['destroy', '人员破坏识别'], ['wander', '人员徘徊识别'], ['gather', '人员聚集识别'], ['cameraBlock', '摄像头遮挡识别']]); +var SchemaFormModal = function SchemaFormModal(props) { + var _props$type = props.type, + type = _props$type === void 0 ? 'fire' : _props$type, + onFinish = props.onFinish; + var getColumnsByType = function getColumnsByType(type) { + if (!type) return []; + var arr = []; + if (type === 'gather') { + arr.push({ + title: '预警人数:', + dataIndex: 'alarmMember', + formItemProps: { + rules: [{ + required: true, + message: '此项为必填项' + }] + }, + renderFormItem: function renderFormItem() { + return /*#__PURE__*/React.createElement(Space, null, /*#__PURE__*/React.createElement(Input, null), "\u4EBA\uFF083~10\uFF09"); + }, + width: 'm' + }); + } + if (type === 'cameraBlock') { + arr.push({ + title: '遮挡百分比:', + dataIndex: 'blockPercent', + formItemProps: { + rules: [{ + required: true, + message: '此项为必填项' + }] + }, + renderFormItem: function renderFormItem() { + return /*#__PURE__*/React.createElement(Space, null, /*#__PURE__*/React.createElement(Input, null), "%\uFF0830~80\uFF09"); + }, + width: 'm' + }); + } + if (type !== 'traffic') { + arr.push({ + title: '最短持续时间:', + dataIndex: 'minTime', + formItemProps: { + rules: [{ + required: true, + message: '此项为必填项' + }] + }, + renderFormItem: function renderFormItem() { + return /*#__PURE__*/React.createElement(Space, null, /*#__PURE__*/React.createElement(Input, null), "\u79D2\uFF082~10\uFF09"); + }, + width: 'm' + }); + arr.push({ + title: '报警间隔时间:', + dataIndex: 'alarmTime', + formItemProps: { + rules: [{ + required: true, + message: '此项为必填项' + }] + }, + renderFormItem: function renderFormItem() { + return /*#__PURE__*/React.createElement(Space, null, /*#__PURE__*/React.createElement(Input, null), "\u79D2\uFF0810~600\uFF09"); + }, + width: 'm' + }); + } else if (type === 'traffic') { + arr.push({ + title: '灵敏度:', + dataIndex: 'sensitivity', + formItemProps: { + rules: [{ + required: true, + message: '此项为必填项' + }] + }, + renderFormItem: function renderFormItem() { + return /*#__PURE__*/React.createElement(Space, null, /*#__PURE__*/React.createElement(Input, null), "\uFF080~100\uFF09"); + }, + width: 'm' + }); + } + arr.push({ + title: '灵敏度:', + dataIndex: 'sensitivity', + formItemProps: { + rules: [{ + required: true, + message: '此项为必填项' + }] + }, + renderFormItem: function renderFormItem() { + return /*#__PURE__*/React.createElement(Space, null, /*#__PURE__*/React.createElement(Input, null), "\uFF080~100\uFF09"); + }, + width: 'm' + }); + return arr; + }; + return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(BetaSchemaForm, _extends({ + width: 600 + // @ts-ignore + , + title: SCHEME_TYPE_LIST.get(type), + shouldUpdate: false, + layoutType: "ModalForm", + layout: "horizontal", + labelCol: { + span: 6 + }, + wrapperCol: { + span: 18 + }, + preserve: false, + modalProps: { + destroyOnClose: true + }, + onFinish: onFinish, + columns: getColumnsByType(type) + }, props))); +}; +export default SchemaFormModal; \ No newline at end of file diff --git a/packages/material/es/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.d.ts b/packages/material/es/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.d.ts new file mode 100644 index 0000000..102d04a --- /dev/null +++ b/packages/material/es/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.d.ts @@ -0,0 +1,8 @@ +import React from 'react'; +import type { ParamsType, ProTableProps } from '@ant-design/pro-components'; +import { AnyObject } from 'antd/es/_util/type'; +export interface TimeTemplateTableProps extends ProTableProps { + onItemBlur?: (value?: number | string, id?: any, record?: any) => void; +} +declare const TimeTemplateTable: (props: TimeTemplateTableProps) => React.JSX.Element; +export default TimeTemplateTable; diff --git a/packages/material/es/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.js b/packages/material/es/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.js new file mode 100644 index 0000000..aa4c75e --- /dev/null +++ b/packages/material/es/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.js @@ -0,0 +1,47 @@ +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +import React from 'react'; +import { ProTable } from '@ant-design/pro-components'; +import { InputNumber } from 'antd'; +var TimeTemplateTable = function TimeTemplateTable(props) { + var onItemBlur = props.onItemBlur; + var columns = [{ + title: '模板名称', + dataIndex: 'templateName' + }, { + title: '运行周期', + dataIndex: 'runCycle' + }, { + title: '布控星期', + dataIndex: 'arrangeDay' + }, { + title: '算力占用', + dataIndex: 'powerOccupy' + }, { + title: '配置路数', + key: 'option', + valueType: 'option', + render: function render(_, record) { + return /*#__PURE__*/React.createElement(InputNumber, { + value: record.lineNum, + onBlur: function onBlur(e) { + return onItemBlur === null || onItemBlur === void 0 ? void 0 : onItemBlur(e.target.value, record.id, record); + }, + min: 0 + }); + } + }]; + return /*#__PURE__*/React.createElement(ProTable, _extends({ + columns: columns, + bordered: true, + scroll: { + y: 95 + }, + toolbar: undefined, + rowKey: "id", + search: false, + options: false, + pagination: false, + dataSource: [] + }, props)); +}; +export default TimeTemplateTable; \ No newline at end of file diff --git a/packages/material/es/algorithmConfig/components/timeTemplateTable/index.d.ts b/packages/material/es/algorithmConfig/components/timeTemplateTable/index.d.ts new file mode 100644 index 0000000..fefdc38 --- /dev/null +++ b/packages/material/es/algorithmConfig/components/timeTemplateTable/index.d.ts @@ -0,0 +1,3 @@ +import TimeTemplateTable from './TimeTemplateTable'; +export type { TimeTemplateTableProps } from './TimeTemplateTable'; +export default TimeTemplateTable; diff --git a/packages/material/es/algorithmConfig/components/timeTemplateTable/index.js b/packages/material/es/algorithmConfig/components/timeTemplateTable/index.js new file mode 100644 index 0000000..c169e92 --- /dev/null +++ b/packages/material/es/algorithmConfig/components/timeTemplateTable/index.js @@ -0,0 +1,2 @@ +import TimeTemplateTable from "./TimeTemplateTable"; +export default TimeTemplateTable; \ No newline at end of file diff --git a/packages/material/es/algorithmConfig/index.d.ts b/packages/material/es/algorithmConfig/index.d.ts new file mode 100644 index 0000000..7f2faa9 --- /dev/null +++ b/packages/material/es/algorithmConfig/index.d.ts @@ -0,0 +1,5 @@ +import AlgorithmConfig from './algorithmConfig'; +export type { AlgorithmConfigProps, AlgorithmConfigRef } from './algorithmConfig'; +export type { AlgorithmTableProps } from './components/algorithmTable'; +export type { TimeTemplateTableProps } from './components/timeTemplateTable'; +export default AlgorithmConfig; diff --git a/packages/material/es/algorithmConfig/index.js b/packages/material/es/algorithmConfig/index.js new file mode 100644 index 0000000..d37d374 --- /dev/null +++ b/packages/material/es/algorithmConfig/index.js @@ -0,0 +1,2 @@ +import AlgorithmConfig from "./algorithmConfig"; +export default AlgorithmConfig; \ No newline at end of file diff --git a/packages/material/es/algorithmConfigModal/algorithmConfigModal.d.ts b/packages/material/es/algorithmConfigModal/algorithmConfigModal.d.ts new file mode 100644 index 0000000..41b21e2 --- /dev/null +++ b/packages/material/es/algorithmConfigModal/algorithmConfigModal.d.ts @@ -0,0 +1,8 @@ +import { FC } from 'react'; +import { ModalProps } from "antd"; +import { AlgorithmConfigProps } from '../algorithmConfig/algorithmConfig'; +export interface AlgorithmConfigModalProps extends ModalProps { + algorithmConfigProps: AlgorithmConfigProps; +} +declare const AlgorithmConfigModal: FC; +export default AlgorithmConfigModal; diff --git a/packages/material/es/algorithmConfigModal/algorithmConfigModal.js b/packages/material/es/algorithmConfigModal/algorithmConfigModal.js new file mode 100644 index 0000000..6b0abfe --- /dev/null +++ b/packages/material/es/algorithmConfigModal/algorithmConfigModal.js @@ -0,0 +1,22 @@ +function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } +import React from 'react'; +import { ConfigProvider, Modal } from "antd"; +import AlgorithmConfig from "../algorithmConfig/algorithmConfig"; +var AlgorithmConfigModal = function AlgorithmConfigModal(props) { + var algorithmConfigProps = props.algorithmConfigProps; + return /*#__PURE__*/React.createElement(ConfigProvider, { + theme: { + components: { + Modal: { + headerBg: '#EFF2F4', + footerBg: '#EFF2F4', + contentBg: '#EFF2F4' + } + } + } + }, /*#__PURE__*/React.createElement(Modal, _extends({ + okText: "\u786E\u5B9A", + cancelText: "\u53D6\u6D88" + }, props), /*#__PURE__*/React.createElement(AlgorithmConfig, algorithmConfigProps))); +}; +export default AlgorithmConfigModal; \ No newline at end of file diff --git a/packages/material/es/algorithmConfigModal/index.d.ts b/packages/material/es/algorithmConfigModal/index.d.ts new file mode 100644 index 0000000..873cc35 --- /dev/null +++ b/packages/material/es/algorithmConfigModal/index.d.ts @@ -0,0 +1,2 @@ +import AlgorithmConfigModal from './algorithmConfigModal'; +export default AlgorithmConfigModal; diff --git a/packages/material/es/algorithmConfigModal/index.js b/packages/material/es/algorithmConfigModal/index.js new file mode 100644 index 0000000..3a3b16f --- /dev/null +++ b/packages/material/es/algorithmConfigModal/index.js @@ -0,0 +1,2 @@ +import AlgorithmConfigModal from "./algorithmConfigModal"; +export default AlgorithmConfigModal; \ No newline at end of file diff --git a/packages/material/es/index.d.ts b/packages/material/es/index.d.ts index 31f4c03..997d45d 100644 --- a/packages/material/es/index.d.ts +++ b/packages/material/es/index.d.ts @@ -1 +1,7 @@ -export { default as Demo } from './Demo'; +export { default as AlgorithmConfigModal } from './algorithmConfigModal'; +export { default as AlgorithmConfig } from './algorithmConfig'; +export type { AlgorithmConfigRef, AlgorithmConfigProps } from './algorithmConfig'; +export { default as Login } from './login'; +export { default as Password } from './password'; +export { default as SchemaFormModal } from './algorithmConfig/components/schemaFormModal'; +export * from 'rc-util'; diff --git a/packages/material/es/index.js b/packages/material/es/index.js index dd020e4..1b18d5e 100644 --- a/packages/material/es/index.js +++ b/packages/material/es/index.js @@ -1 +1,6 @@ -export { default as Demo } from "./Demo"; \ No newline at end of file +export { default as AlgorithmConfigModal } from "./algorithmConfigModal"; +export { default as AlgorithmConfig } from "./algorithmConfig"; +export { default as Login } from "./login"; +export { default as Password } from "./password"; +export { default as SchemaFormModal } from "./algorithmConfig/components/schemaFormModal"; +export * from 'rc-util'; \ No newline at end of file diff --git a/packages/material/es/login/Login.js b/packages/material/es/login/Login.js new file mode 100644 index 0000000..66e1f6e --- /dev/null +++ b/packages/material/es/login/Login.js @@ -0,0 +1,125 @@ +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +/** + * Created by jiangzhixiong on 2024/03/18 + */ + +import React from 'react'; +import { Button, Checkbox, Flex, Form, Image, Input, theme } from 'antd'; +import { HomeOutlined } from '@ant-design/icons'; +import { isNumber } from '@zhst/func'; +import "./index.less"; +var materialName = 'zhst-material-login'; +var useToken = theme.useToken; +var Login = function Login(props) { + var title = props.title, + onIconClick = props.onIconClick, + _props$rememberPasswo = props.rememberPassword, + rememberPassword = _props$rememberPasswo === void 0 ? true : _props$rememberPasswo, + imageUrl = props.imageUrl, + width = props.width, + height = props.height, + onFinish = props.onFinish; + var _Form$useForm = Form.useForm(), + _Form$useForm2 = _slicedToArray(_Form$useForm, 1), + form = _Form$useForm2[0]; + var _useToken = useToken(), + token = _useToken.token; + console.log('width', width); + return /*#__PURE__*/React.createElement(Flex, { + className: materialName, + style: { + width: isNumber(width) ? "".concat(width, "px") : width, + height: isNumber(height) ? "".concat(height, "px") : height + } + }, /*#__PURE__*/React.createElement(Flex, { + align: "center", + justify: "center", + style: { + position: 'relative', + width: '40%', + padding: "30px" + } + }, /*#__PURE__*/React.createElement(HomeOutlined, { + onClick: onIconClick, + style: { + position: 'absolute', + top: '30px', + left: '30px', + fontSize: "".concat(token.sizeLG, "px"), + cursor: 'pointer' + } + }), /*#__PURE__*/React.createElement("div", { + style: { + width: '56%' + } + }, /*#__PURE__*/React.createElement("h2", { + style: { + margin: '30px 0', + fontSize: '30px' + } + }, title), /*#__PURE__*/React.createElement(Form, { + layout: "vertical", + form: form, + onFinish: onFinish + }, /*#__PURE__*/React.createElement(Form.Item, { + name: "account", + label: "\u8D26\u53F7", + rules: [{ + required: true, + message: '请输入账号!' + }] + }, /*#__PURE__*/React.createElement(Input, { + placeholder: "\u8BF7\u8F93\u5165\u8D26\u53F7", + variant: "borderless", + style: { + border: 'none', + borderBottom: '1px solid rgba(0, 0, 0, 0.06)' + } + })), /*#__PURE__*/React.createElement(Form.Item, { + name: "password", + label: "\u5BC6\u7801", + rules: [{ + required: true, + message: '请输入密码!' + }] + }, /*#__PURE__*/React.createElement(Input.Password, { + placeholder: "\u8BF7\u8F93\u5165\u5BC6\u7801", + variant: "borderless", + style: { + border: 'none', + borderBottom: '1px solid rgba(0, 0, 0, 0.06)' + } + })), /*#__PURE__*/React.createElement(Form.Item, { + style: { + display: rememberPassword ? 'block' : 'none' + } + }, /*#__PURE__*/React.createElement(Form.Item, { + name: "remember", + valuePropName: "checked", + noStyle: true + }, /*#__PURE__*/React.createElement(Checkbox, null, "\u8BB0\u4F4F\u5BC6\u7801"))), /*#__PURE__*/React.createElement(Form.Item, null, /*#__PURE__*/React.createElement(Button, { + block: true, + type: "primary", + htmlType: "submit" + }, "\u767B\u5F55"))))), /*#__PURE__*/React.createElement("div", { + style: { + width: '60%', + height: '100%' + } + }, /*#__PURE__*/React.createElement(Image, { + style: { + width: '100%' + }, + src: imageUrl, + width: '100%', + height: '100%', + preview: false, + fallback: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==" + }))); +}; +export default Login; \ No newline at end of file diff --git a/packages/material/es/login/images/ai-suanfa.png b/packages/material/es/login/images/ai-suanfa.png new file mode 100644 index 0000000..848fc3a Binary files /dev/null and b/packages/material/es/login/images/ai-suanfa.png differ diff --git a/packages/material/es/login/images/ai-video.png b/packages/material/es/login/images/ai-video.png new file mode 100644 index 0000000..99304b7 Binary files /dev/null and b/packages/material/es/login/images/ai-video.png differ diff --git a/packages/material/es/login/images/box-manage.png b/packages/material/es/login/images/box-manage.png new file mode 100644 index 0000000..fcaca42 Binary files /dev/null and b/packages/material/es/login/images/box-manage.png differ diff --git a/packages/material/es/login/index.d.ts b/packages/material/es/login/index.d.ts new file mode 100644 index 0000000..189be5f --- /dev/null +++ b/packages/material/es/login/index.d.ts @@ -0,0 +1,2 @@ +import Login from './Login'; +export default Login; diff --git a/packages/material/es/login/index.js b/packages/material/es/login/index.js new file mode 100644 index 0000000..11d767f --- /dev/null +++ b/packages/material/es/login/index.js @@ -0,0 +1,2 @@ +import Login from "./Login"; +export default Login; \ No newline at end of file diff --git a/packages/material/es/password/Password.d.ts b/packages/material/es/password/Password.d.ts new file mode 100644 index 0000000..47f9c0f --- /dev/null +++ b/packages/material/es/password/Password.d.ts @@ -0,0 +1,11 @@ +/** + * Created by jiangzhixiong on 2024/03/18 + */ +import { FC } from 'react'; +import { FormProps } from 'antd'; +interface PasswordProps { + onFinish: FormProps['onFinish']; + onCancel: () => void; +} +declare const Password: FC; +export default Password; diff --git a/packages/material/es/password/Password.js b/packages/material/es/password/Password.js new file mode 100644 index 0000000..07c03ee --- /dev/null +++ b/packages/material/es/password/Password.js @@ -0,0 +1,101 @@ +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } +/** + * Created by jiangzhixiong on 2024/03/18 + */ + +import React from 'react'; +import { Button, Form, Input, Space } from 'antd'; +var Password = function Password(props) { + var onFinish = props.onFinish, + onCancel = props.onCancel; + var _Form$useForm = Form.useForm(), + _Form$useForm2 = _slicedToArray(_Form$useForm, 1), + form = _Form$useForm2[0]; + return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h2", { + style: { + marginTop: '0', + fontSize: '20px' + } + }, "\u4FEE\u6539\u5BC6\u7801"), /*#__PURE__*/React.createElement(Form, { + labelCol: { + span: 4 + }, + wrapperCol: { + span: 20 + }, + form: form, + onFinish: onFinish + }, /*#__PURE__*/React.createElement(Form.Item, { + name: "password", + label: "\u539F\u5BC6\u7801", + rules: [{ + required: true, + message: '请输入密码!' + }] + }, /*#__PURE__*/React.createElement(Input.Password, { + variant: "borderless", + style: { + border: 'none', + borderBottom: '1px solid rgba(0, 0, 0, 0.06)' + } + })), /*#__PURE__*/React.createElement(Form.Item, { + name: "newPassword", + label: "\u65B0\u5BC6\u7801", + rules: [{ + required: true, + message: '请输入新密码!' + }] + }, /*#__PURE__*/React.createElement(Input.Password, { + variant: "borderless", + style: { + border: 'none', + borderBottom: '1px solid rgba(0, 0, 0, 0.06)' + } + })), /*#__PURE__*/React.createElement(Form.Item, { + name: "rePassword", + label: "\u786E\u8BA4\u5BC6\u7801", + dependencies: ['password'], + rules: [{ + required: true, + message: '请再次输入密码!' + }, function (_ref) { + var getFieldValue = _ref.getFieldValue; + return { + validator: function validator(_, value) { + if (!value || getFieldValue('password') === value) { + return Promise.resolve(); + } + return Promise.reject(new Error('两次输入的密码不一致!')); + } + }; + }] + }, /*#__PURE__*/React.createElement(Input.Password, { + variant: "borderless", + style: { + border: 'none', + borderBottom: '1px solid rgba(0, 0, 0, 0.06)' + } + })), /*#__PURE__*/React.createElement("div", { + style: { + textAlign: 'right' + } + }, /*#__PURE__*/React.createElement(Space, null, /*#__PURE__*/React.createElement(Button, { + htmlType: "reset", + onClick: onCancel, + style: { + width: '100px' + } + }, "\u53D6\u6D88"), /*#__PURE__*/React.createElement(Button, { + type: "primary", + htmlType: "submit", + style: { + width: '100px' + } + }, "\u786E\u8BA4"))))); +}; +export default Password; \ No newline at end of file diff --git a/packages/material/es/password/index.d.ts b/packages/material/es/password/index.d.ts new file mode 100644 index 0000000..b102ba8 --- /dev/null +++ b/packages/material/es/password/index.d.ts @@ -0,0 +1,2 @@ +import Password from './Password'; +export default Password; diff --git a/packages/material/es/password/index.js b/packages/material/es/password/index.js new file mode 100644 index 0000000..19f86b0 --- /dev/null +++ b/packages/material/es/password/index.js @@ -0,0 +1,2 @@ +import Password from "./Password"; +export default Password; \ No newline at end of file diff --git a/packages/material/es/utils/base64Images.d.ts b/packages/material/es/utils/base64Images.d.ts new file mode 100644 index 0000000..0cd9cac --- /dev/null +++ b/packages/material/es/utils/base64Images.d.ts @@ -0,0 +1,2 @@ +export declare const AlgorithmConfigImg = "data:image/png;base64,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"; +export declare const ErrorImage = "data:image/png;base64,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"; diff --git a/packages/material/es/utils/base64Images.js b/packages/material/es/utils/base64Images.js new file mode 100644 index 0000000..26e6b03 --- /dev/null +++ b/packages/material/es/utils/base64Images.js @@ -0,0 +1,2 @@ +export var AlgorithmConfigImg = 'data:image/png;base64,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'; +export var ErrorImage = 'data:image/png;base64,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'; \ No newline at end of file diff --git a/packages/material/es/utils/constants.d.ts b/packages/material/es/utils/constants.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/es/utils/constants.js b/packages/material/es/utils/constants.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/es/utils/index.d.ts b/packages/material/es/utils/index.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/es/utils/index.js b/packages/material/es/utils/index.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/es/utils/types.d.ts b/packages/material/es/utils/types.d.ts new file mode 100644 index 0000000..69d3304 --- /dev/null +++ b/packages/material/es/utils/types.d.ts @@ -0,0 +1 @@ +export type AnyObject = Record; diff --git a/packages/material/es/utils/types.js b/packages/material/es/utils/types.js new file mode 100644 index 0000000..8cec2e9 --- /dev/null +++ b/packages/material/es/utils/types.js @@ -0,0 +1 @@ +export {}; \ No newline at end of file diff --git a/packages/material/lib/Demo/index.d.ts b/packages/material/lib/Demo/index.d.ts deleted file mode 100644 index bcc157c..0000000 --- a/packages/material/lib/Demo/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import React from 'react'; -declare const _default: () => React.JSX.Element; -export default _default; diff --git a/packages/material/lib/algorithmConfig/algorithmConfig.d.ts b/packages/material/lib/algorithmConfig/algorithmConfig.d.ts new file mode 100644 index 0000000..9c0101e --- /dev/null +++ b/packages/material/lib/algorithmConfig/algorithmConfig.d.ts @@ -0,0 +1,53 @@ +import React from 'react'; +import { AlgorithmTableProps } from './components/algorithmTable/AlgorithmTable'; +import { TimeTemplateTableProps } from './components/timeTemplateTable/TimeTemplateTable'; +export interface AlgorithmConfigProps { + onAddAlgorithm?: () => void; + /** + * 单选的图片数据 + */ + drawData?: { + imageKey: string; + odRect?: { + x: number; + y: number; + w: number; + h: number; + }; + score?: string; + time?: string; + }; + /** + * 单选状态圈选后的监听事件 + */ + drawListener?: (data: any) => void; + algorithmTableDataSource?: { + id: string; + templateName: string; + operatingCycle: string; + algorithmOccupied: number; + }[]; + timeTemplateDataSource?: { + id: string; + templateName: string; + operatingCycle: string; + arrangeWeek: string; + algorithmOccupied: string; + }[]; + boxList: { + id: string; + name: string; + }[]; + algorithmTableProps?: AlgorithmTableProps; + timeTemplateTableProps?: TimeTemplateTableProps; + selectedKey?: string; + rowKey?: string; + type: AlgorithmTableProps['tableType']; + onSelect?: (key: string, info?: any) => void; +} +export interface AlgorithmConfigRef { + draw: () => void; + cancelDraw: () => void; +} +declare const AlgorithmConfig: React.ForwardRefExoticComponent>; +export default AlgorithmConfig; diff --git a/packages/material/lib/algorithmConfig/algorithmConfig.js b/packages/material/lib/algorithmConfig/algorithmConfig.js new file mode 100644 index 0000000..b21feb9 --- /dev/null +++ b/packages/material/lib/algorithmConfig/algorithmConfig.js @@ -0,0 +1,122 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfig/algorithmConfig.tsx +var algorithmConfig_exports = {}; +__export(algorithmConfig_exports, { + default: () => algorithmConfig_default +}); +module.exports = __toCommonJS(algorithmConfig_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_theme = __toESM(require("antd/es/theme")); +var import_meta = require("@zhst/meta"); +var import_base64Images = require("../utils/base64Images"); +var import_algorithmTable = __toESM(require("./components/algorithmTable")); +var import_timeTemplateTable = __toESM(require("./components/timeTemplateTable")); +var { useToken } = import_theme.default; +var Title = (props) => /* @__PURE__ */ import_react.default.createElement("h2", { style: { margin: "18px 16px", fontSize: "14px", color: "rgba(0, 0, 0, 0.88)" } }, props.children); +var AlgorithmConfig = (0, import_react.forwardRef)((props, ref) => { + const { + algorithmTableDataSource = [], + timeTemplateDataSource = [], + boxList = [], + drawData, + drawListener, + algorithmTableProps, + timeTemplateTableProps, + selectedKey, + type = "multiple", + rowKey = "id", + onSelect + } = props; + const drawImageRef = (0, import_react.useRef)(null); + const { token } = useToken(); + (0, import_react.useImperativeHandle)(ref, () => ({ + draw: () => { + var _a; + (_a = drawImageRef.current) == null ? void 0 : _a.setShowCrop(true); + }, + cancelDraw: () => { + var _a; + (_a = drawImageRef.current) == null ? void 0 : _a.setShowCrop(false); + } + })); + return /* @__PURE__ */ import_react.default.createElement(import_antd.Flex, { style: { border: `1px solid ${token.colorBorder}`, backgroundColor: token.colorBgBase } }, /* @__PURE__ */ import_react.default.createElement("div", { title: "盒子列表", style: { width: "13.9%" } }, /* @__PURE__ */ import_react.default.createElement(Title, null, "盒子列表"), /* @__PURE__ */ import_react.default.createElement("div", { style: { borderTop: `1px solid ${token.colorBorder}` } }, boxList.map((item) => { + return /* @__PURE__ */ import_react.default.createElement( + "p", + { + key: item.id, + onClick: () => onSelect == null ? void 0 : onSelect(item.id, item), + style: { + margin: 0, + padding: `${token.paddingXXS}px ${token.paddingLG}px`, + cursor: "pointer", + // @ts-ignore + color: selectedKey === item[rowKey] ? token.colorPrimary : token.colorText, + // @ts-ignore + backgroundColor: selectedKey === item[rowKey] ? token.blue1 : token.colorBgBase, + transition: "0.2s ease" + } + }, + item.name + ); + }))), /* @__PURE__ */ import_react.default.createElement("div", { style: { boxSizing: "border-box", width: "46.3%", textAlign: "center", borderLeft: `1px solid ${token.colorBorder}`, borderRight: `1px solid ${token.colorBorder}` } }, type === "single" ? /* @__PURE__ */ import_react.default.createElement( + import_meta.BigImagePreview, + { + ref: drawImageRef, + hideTypeBtns: true, + type: "CUSTOM", + screenshotButtonRender: () => /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null), + data: drawData, + onDraw: drawListener + } + ) : /* @__PURE__ */ import_react.default.createElement("div", { style: { padding: "84px" } }, /* @__PURE__ */ import_react.default.createElement( + import_antd.Image, + { + width: "62.5%", + src: import_base64Images.AlgorithmConfigImg, + preview: false, + fallback: import_base64Images.ErrorImage + } + ), /* @__PURE__ */ import_react.default.createElement("h2", null, "请进行批量配置"), /* @__PURE__ */ import_react.default.createElement("ul", { style: { display: "inline-block", paddingLeft: 0, width: "51.8%", listStyle: "none", textAlign: "left", color: token.colorTextLabel } }, /* @__PURE__ */ import_react.default.createElement("li", null, "· 盒子批量配置仅支持同型号盒子;"), /* @__PURE__ */ import_react.default.createElement("li", null, "· 采取覆盖式更新,不保留原有配置,且预警检测框默认全屏范围;"), /* @__PURE__ */ import_react.default.createElement("li", null, "· 人流量统计默认检测线为屏幕中央横向线条,且箭头指向下方;"), /* @__PURE__ */ import_react.default.createElement("li", null, "· 优先选择拉流正常的摄像头。")))), /* @__PURE__ */ import_react.default.createElement("div", { style: { width: "39.8%" } }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement(Title, null, "时间模板"), /* @__PURE__ */ import_react.default.createElement("div", { style: { padding: `${token.paddingMD}px ${token.paddingSM}px`, borderTop: `1px solid ${token.colorBorder}`, borderBottom: `1px solid ${token.colorBorder}` } }, /* @__PURE__ */ import_react.default.createElement( + import_timeTemplateTable.default, + { + dataSource: timeTemplateDataSource, + ...timeTemplateTableProps + } + ))), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement(Title, null, "算法应用"), /* @__PURE__ */ import_react.default.createElement("div", { style: { padding: `${token.paddingMD}px ${token.paddingSM}px`, borderTop: `1px solid ${token.colorBorder}` } }, /* @__PURE__ */ import_react.default.createElement( + import_algorithmTable.default, + { + dataSource: algorithmTableDataSource, + tableType: type, + ...algorithmTableProps + } + ))))); +}); +var algorithmConfig_default = AlgorithmConfig; diff --git a/packages/material/lib/algorithmConfig/components/algorithmTable/AlgorithmTable.js b/packages/material/lib/algorithmConfig/components/algorithmTable/AlgorithmTable.js new file mode 100644 index 0000000..ced7659 --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/algorithmTable/AlgorithmTable.js @@ -0,0 +1,126 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfig/components/algorithmTable/AlgorithmTable.tsx +var AlgorithmTable_exports = {}; +__export(AlgorithmTable_exports, { + default: () => AlgorithmTable_default +}); +module.exports = __toCommonJS(AlgorithmTable_exports); +var import_react = __toESM(require("react")); +var import_icons = require("@ant-design/icons"); +var import_pro_components = require("@ant-design/pro-components"); +var import_antd = require("antd"); +var import_theme = __toESM(require("antd/es/theme")); +var import_schemaFormModal = __toESM(require("../schemaFormModal")); +var { useToken } = import_theme.default; +var AlgorithmTable = (props) => { + const { + onAddAlgorithm, + onItemSwitch, + onItemEdit, + onItemDelete, + onSortSelect, + selectedKey, + onDraw, + tableType = "multiple", + sortList = [] + } = props; + const { token } = useToken(); + const columns = [ + { + title: "模板名称", + dataIndex: "templateName" + }, + { + title: "运行周期", + dataIndex: "runCycle", + valueType: "select", + width: 80, + valueEnum: { + 1: { text: "黑夜" }, + 0: { text: "白天" } + } + }, + { + title: "算力占用", + dataIndex: "powerOccupy" + }, + { + title: "操作", + key: "option", + valueType: "option", + fixed: true, + render: (_DOM, record) => [ + /* @__PURE__ */ import_react.default.createElement(import_antd.Switch, { value: record.status, onChange: (_status) => onItemSwitch == null ? void 0 : onItemSwitch(_status, record.id, record) }), + /* @__PURE__ */ import_react.default.createElement("a", { onClick: () => onDraw == null ? void 0 : onDraw(record.id, record), style: { display: tableType === "single" ? "block" : "none" }, href: "#" }, /* @__PURE__ */ import_react.default.createElement(import_icons.ImportOutlined, null)), + /* @__PURE__ */ import_react.default.createElement( + import_schemaFormModal.default, + { + type: record.templateType, + onFinish: async (values) => onItemEdit == null ? void 0 : onItemEdit(values, record), + trigger: /* @__PURE__ */ import_react.default.createElement("a", { href: "#" }, /* @__PURE__ */ import_react.default.createElement(import_icons.EditFilled, null)) + } + ), + /* @__PURE__ */ import_react.default.createElement( + import_antd.Popconfirm, + { + title: "确定删除吗?", + onConfirm: () => onItemDelete == null ? void 0 : onItemDelete(record.id, record) + }, + /* @__PURE__ */ import_react.default.createElement("a", { href: "#" }, /* @__PURE__ */ import_react.default.createElement(import_icons.DeleteFilled, null)) + ) + ] + } + ]; + return /* @__PURE__ */ import_react.default.createElement( + import_pro_components.ProTable, + { + columns, + bordered: true, + scroll: { y: 240 }, + dataSource: [], + headerTitle: /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { size: 16 }, /* @__PURE__ */ import_react.default.createElement( + import_antd.Select, + { + value: selectedKey, + style: { width: 320 }, + onChange: onSortSelect, + options: sortList + } + ), /* @__PURE__ */ import_react.default.createElement(import_icons.PlusCircleFilled, { onClick: () => onAddAlgorithm == null ? void 0 : onAddAlgorithm(), style: { fontSize: "24px", color: token.colorPrimary, cursor: "pointer" } })), + toolbar: void 0, + rowKey: "id", + search: false, + options: false, + pagination: false, + ...props + } + ); +}; +var AlgorithmTable_default = AlgorithmTable; diff --git a/packages/material/lib/algorithmConfig/components/algorithmTable/index.d.ts b/packages/material/lib/algorithmConfig/components/algorithmTable/index.d.ts new file mode 100644 index 0000000..42d422c --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/algorithmTable/index.d.ts @@ -0,0 +1,3 @@ +import AlgorithmTable from './AlgorithmTable'; +export type { AlgorithmTableProps } from './AlgorithmTable'; +export default AlgorithmTable; diff --git a/packages/material/lib/algorithmConfig/components/algorithmTable/index.js b/packages/material/lib/algorithmConfig/components/algorithmTable/index.js new file mode 100644 index 0000000..8c7d5fc --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/algorithmTable/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfig/components/algorithmTable/index.tsx +var algorithmTable_exports = {}; +__export(algorithmTable_exports, { + default: () => algorithmTable_default +}); +module.exports = __toCommonJS(algorithmTable_exports); +var import_AlgorithmTable = __toESM(require("./AlgorithmTable")); +var algorithmTable_default = import_AlgorithmTable.default; diff --git a/packages/material/lib/algorithmConfig/components/schemaFormModal/index.js b/packages/material/lib/algorithmConfig/components/schemaFormModal/index.js new file mode 100644 index 0000000..c0d23b6 --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/schemaFormModal/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfig/components/schemaFormModal/index.tsx +var schemaFormModal_exports = {}; +__export(schemaFormModal_exports, { + default: () => schemaFormModal_default +}); +module.exports = __toCommonJS(schemaFormModal_exports); +var import_schemaFormModal = __toESM(require("./schemaFormModal")); +var schemaFormModal_default = import_schemaFormModal.default; diff --git a/packages/material/lib/algorithmConfig/components/schemaFormModal/schemaFormModal.d.ts b/packages/material/lib/algorithmConfig/components/schemaFormModal/schemaFormModal.d.ts new file mode 100644 index 0000000..2c2d7cd --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/schemaFormModal/schemaFormModal.d.ts @@ -0,0 +1,8 @@ +import { FC } from 'react'; +import type { ModalFormProps } from '@ant-design/pro-components'; +export interface SchemaFormModalProps extends ModalFormProps { + type: 'fire' | 'smoke' | 'traffic' | 'face' | 'destroy' | 'wander' | 'gather' | 'cameraBlock'; +} +export declare const SCHEME_TYPE_LIST: Map; +declare const SchemaFormModal: FC; +export default SchemaFormModal; diff --git a/packages/material/lib/algorithmConfig/components/schemaFormModal/schemaFormModal.js b/packages/material/lib/algorithmConfig/components/schemaFormModal/schemaFormModal.js new file mode 100644 index 0000000..25b7dfd --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/schemaFormModal/schemaFormModal.js @@ -0,0 +1,173 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfig/components/schemaFormModal/schemaFormModal.tsx +var schemaFormModal_exports = {}; +__export(schemaFormModal_exports, { + SCHEME_TYPE_LIST: () => SCHEME_TYPE_LIST, + default: () => schemaFormModal_default +}); +module.exports = __toCommonJS(schemaFormModal_exports); +var import_react = __toESM(require("react")); +var import_pro_components = require("@ant-design/pro-components"); +var import_antd = require("antd"); +var SCHEME_TYPE_LIST = /* @__PURE__ */ new Map([ + ["fire", "火焰识别"], + ["smoke", "烟雾识别"], + ["traffic", "人流量统计"], + ["face", "面部遮挡识别"], + ["destroy", "人员破坏识别"], + ["wander", "人员徘徊识别"], + ["gather", "人员聚集识别"], + ["cameraBlock", "摄像头遮挡识别"] +]); +var SchemaFormModal = (props) => { + const { + type = "fire", + onFinish + } = props; + const getColumnsByType = (type2) => { + if (!type2) + return []; + let arr = []; + if (type2 === "gather") { + arr.push({ + title: "预警人数:", + dataIndex: "alarmMember", + formItemProps: { + rules: [ + { + required: true, + message: "此项为必填项" + } + ] + }, + renderFormItem: () => /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Input, null), "人(3~10)"), + width: "m" + }); + } + if (type2 === "cameraBlock") { + arr.push({ + title: "遮挡百分比:", + dataIndex: "blockPercent", + formItemProps: { + rules: [ + { + required: true, + message: "此项为必填项" + } + ] + }, + renderFormItem: () => /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Input, null), "%(30~80)"), + width: "m" + }); + } + if (type2 !== "traffic") { + arr.push({ + title: "最短持续时间:", + dataIndex: "minTime", + formItemProps: { + rules: [ + { + required: true, + message: "此项为必填项" + } + ] + }, + renderFormItem: () => /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Input, null), "秒(2~10)"), + width: "m" + }); + arr.push({ + title: "报警间隔时间:", + dataIndex: "alarmTime", + formItemProps: { + rules: [ + { + required: true, + message: "此项为必填项" + } + ] + }, + renderFormItem: () => /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Input, null), "秒(10~600)"), + width: "m" + }); + } else if (type2 === "traffic") { + arr.push({ + title: "灵敏度:", + dataIndex: "sensitivity", + formItemProps: { + rules: [ + { + required: true, + message: "此项为必填项" + } + ] + }, + renderFormItem: () => /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Input, null), "(0~100)"), + width: "m" + }); + } + arr.push({ + title: "灵敏度:", + dataIndex: "sensitivity", + formItemProps: { + rules: [ + { + required: true, + message: "此项为必填项" + } + ] + }, + renderFormItem: () => /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Input, null), "(0~100)"), + width: "m" + }); + return arr; + }; + return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement( + import_pro_components.BetaSchemaForm, + { + width: 600, + title: SCHEME_TYPE_LIST.get(type), + shouldUpdate: false, + layoutType: "ModalForm", + layout: "horizontal", + labelCol: { span: 6 }, + wrapperCol: { span: 18 }, + preserve: false, + modalProps: { destroyOnClose: true }, + onFinish, + columns: getColumnsByType(type), + ...props + } + )); +}; +var schemaFormModal_default = SchemaFormModal; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + SCHEME_TYPE_LIST +}); diff --git a/packages/material/lib/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.d.ts b/packages/material/lib/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.d.ts new file mode 100644 index 0000000..102d04a --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.d.ts @@ -0,0 +1,8 @@ +import React from 'react'; +import type { ParamsType, ProTableProps } from '@ant-design/pro-components'; +import { AnyObject } from 'antd/es/_util/type'; +export interface TimeTemplateTableProps extends ProTableProps { + onItemBlur?: (value?: number | string, id?: any, record?: any) => void; +} +declare const TimeTemplateTable: (props: TimeTemplateTableProps) => React.JSX.Element; +export default TimeTemplateTable; diff --git a/packages/material/lib/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.js b/packages/material/lib/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.js new file mode 100644 index 0000000..a4c1075 --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.js @@ -0,0 +1,82 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.tsx +var TimeTemplateTable_exports = {}; +__export(TimeTemplateTable_exports, { + default: () => TimeTemplateTable_default +}); +module.exports = __toCommonJS(TimeTemplateTable_exports); +var import_react = __toESM(require("react")); +var import_pro_components = require("@ant-design/pro-components"); +var import_antd = require("antd"); +var TimeTemplateTable = (props) => { + const { + onItemBlur + } = props; + const columns = [ + { + title: "模板名称", + dataIndex: "templateName" + }, + { + title: "运行周期", + dataIndex: "runCycle" + }, + { + title: "布控星期", + dataIndex: "arrangeDay" + }, + { + title: "算力占用", + dataIndex: "powerOccupy" + }, + { + title: "配置路数", + key: "option", + valueType: "option", + render: (_, record) => /* @__PURE__ */ import_react.default.createElement(import_antd.InputNumber, { value: record.lineNum, onBlur: (e) => onItemBlur == null ? void 0 : onItemBlur(e.target.value, record.id, record), min: 0 }) + } + ]; + return /* @__PURE__ */ import_react.default.createElement( + import_pro_components.ProTable, + { + columns, + bordered: true, + scroll: { y: 95 }, + toolbar: void 0, + rowKey: "id", + search: false, + options: false, + pagination: false, + dataSource: [], + ...props + } + ); +}; +var TimeTemplateTable_default = TimeTemplateTable; diff --git a/packages/material/lib/algorithmConfig/components/timeTemplateTable/index.d.ts b/packages/material/lib/algorithmConfig/components/timeTemplateTable/index.d.ts new file mode 100644 index 0000000..fefdc38 --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/timeTemplateTable/index.d.ts @@ -0,0 +1,3 @@ +import TimeTemplateTable from './TimeTemplateTable'; +export type { TimeTemplateTableProps } from './TimeTemplateTable'; +export default TimeTemplateTable; diff --git a/packages/material/lib/algorithmConfig/components/timeTemplateTable/index.js b/packages/material/lib/algorithmConfig/components/timeTemplateTable/index.js new file mode 100644 index 0000000..3ec41fb --- /dev/null +++ b/packages/material/lib/algorithmConfig/components/timeTemplateTable/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfig/components/timeTemplateTable/index.tsx +var timeTemplateTable_exports = {}; +__export(timeTemplateTable_exports, { + default: () => timeTemplateTable_default +}); +module.exports = __toCommonJS(timeTemplateTable_exports); +var import_TimeTemplateTable = __toESM(require("./TimeTemplateTable")); +var timeTemplateTable_default = import_TimeTemplateTable.default; diff --git a/packages/material/lib/algorithmConfig/index.d.ts b/packages/material/lib/algorithmConfig/index.d.ts new file mode 100644 index 0000000..7f2faa9 --- /dev/null +++ b/packages/material/lib/algorithmConfig/index.d.ts @@ -0,0 +1,5 @@ +import AlgorithmConfig from './algorithmConfig'; +export type { AlgorithmConfigProps, AlgorithmConfigRef } from './algorithmConfig'; +export type { AlgorithmTableProps } from './components/algorithmTable'; +export type { TimeTemplateTableProps } from './components/timeTemplateTable'; +export default AlgorithmConfig; diff --git a/packages/material/lib/algorithmConfig/index.js b/packages/material/lib/algorithmConfig/index.js new file mode 100644 index 0000000..2f05c2f --- /dev/null +++ b/packages/material/lib/algorithmConfig/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfig/index.tsx +var algorithmConfig_exports = {}; +__export(algorithmConfig_exports, { + default: () => algorithmConfig_default +}); +module.exports = __toCommonJS(algorithmConfig_exports); +var import_algorithmConfig = __toESM(require("./algorithmConfig")); +var algorithmConfig_default = import_algorithmConfig.default; diff --git a/packages/material/lib/algorithmConfigModal/algorithmConfigModal.d.ts b/packages/material/lib/algorithmConfigModal/algorithmConfigModal.d.ts new file mode 100644 index 0000000..41b21e2 --- /dev/null +++ b/packages/material/lib/algorithmConfigModal/algorithmConfigModal.d.ts @@ -0,0 +1,8 @@ +import { FC } from 'react'; +import { ModalProps } from "antd"; +import { AlgorithmConfigProps } from '../algorithmConfig/algorithmConfig'; +export interface AlgorithmConfigModalProps extends ModalProps { + algorithmConfigProps: AlgorithmConfigProps; +} +declare const AlgorithmConfigModal: FC; +export default AlgorithmConfigModal; diff --git a/packages/material/lib/algorithmConfigModal/algorithmConfigModal.js b/packages/material/lib/algorithmConfigModal/algorithmConfigModal.js new file mode 100644 index 0000000..4ca5a6f --- /dev/null +++ b/packages/material/lib/algorithmConfigModal/algorithmConfigModal.js @@ -0,0 +1,71 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfigModal/algorithmConfigModal.tsx +var algorithmConfigModal_exports = {}; +__export(algorithmConfigModal_exports, { + default: () => algorithmConfigModal_default +}); +module.exports = __toCommonJS(algorithmConfigModal_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_algorithmConfig = __toESM(require("../algorithmConfig/algorithmConfig")); +var AlgorithmConfigModal = (props) => { + const { + algorithmConfigProps + } = props; + return /* @__PURE__ */ import_react.default.createElement( + import_antd.ConfigProvider, + { + theme: { + components: { + Modal: { + headerBg: "#EFF2F4", + footerBg: "#EFF2F4", + contentBg: "#EFF2F4" + } + } + } + }, + /* @__PURE__ */ import_react.default.createElement( + import_antd.Modal, + { + okText: "确定", + cancelText: "取消", + ...props + }, + /* @__PURE__ */ import_react.default.createElement( + import_algorithmConfig.default, + { + ...algorithmConfigProps + } + ) + ) + ); +}; +var algorithmConfigModal_default = AlgorithmConfigModal; diff --git a/packages/material/lib/algorithmConfigModal/index.d.ts b/packages/material/lib/algorithmConfigModal/index.d.ts new file mode 100644 index 0000000..873cc35 --- /dev/null +++ b/packages/material/lib/algorithmConfigModal/index.d.ts @@ -0,0 +1,2 @@ +import AlgorithmConfigModal from './algorithmConfigModal'; +export default AlgorithmConfigModal; diff --git a/packages/material/lib/algorithmConfigModal/index.js b/packages/material/lib/algorithmConfigModal/index.js new file mode 100644 index 0000000..820ec00 --- /dev/null +++ b/packages/material/lib/algorithmConfigModal/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/algorithmConfigModal/index.tsx +var algorithmConfigModal_exports = {}; +__export(algorithmConfigModal_exports, { + default: () => algorithmConfigModal_default +}); +module.exports = __toCommonJS(algorithmConfigModal_exports); +var import_algorithmConfigModal = __toESM(require("./algorithmConfigModal")); +var algorithmConfigModal_default = import_algorithmConfigModal.default; diff --git a/packages/material/lib/index.d.ts b/packages/material/lib/index.d.ts index 31f4c03..997d45d 100644 --- a/packages/material/lib/index.d.ts +++ b/packages/material/lib/index.d.ts @@ -1 +1,7 @@ -export { default as Demo } from './Demo'; +export { default as AlgorithmConfigModal } from './algorithmConfigModal'; +export { default as AlgorithmConfig } from './algorithmConfig'; +export type { AlgorithmConfigRef, AlgorithmConfigProps } from './algorithmConfig'; +export { default as Login } from './login'; +export { default as Password } from './password'; +export { default as SchemaFormModal } from './algorithmConfig/components/schemaFormModal'; +export * from 'rc-util'; diff --git a/packages/material/lib/index.js b/packages/material/lib/index.js index 7462083..b86b1de 100644 --- a/packages/material/lib/index.js +++ b/packages/material/lib/index.js @@ -16,6 +16,7 @@ var __copyProps = (to, from, except, desc) => { } return to; }; +var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- @@ -29,11 +30,25 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru // src/index.tsx var src_exports = {}; __export(src_exports, { - Demo: () => import_Demo.default + AlgorithmConfig: () => import_algorithmConfig.default, + AlgorithmConfigModal: () => import_algorithmConfigModal.default, + Login: () => import_login.default, + Password: () => import_password.default, + SchemaFormModal: () => import_schemaFormModal.default }); module.exports = __toCommonJS(src_exports); -var import_Demo = __toESM(require("./Demo")); +var import_algorithmConfigModal = __toESM(require("./algorithmConfigModal")); +var import_algorithmConfig = __toESM(require("./algorithmConfig")); +var import_login = __toESM(require("./login")); +var import_password = __toESM(require("./password")); +var import_schemaFormModal = __toESM(require("./algorithmConfig/components/schemaFormModal")); +__reExport(src_exports, require("rc-util"), module.exports); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { - Demo + AlgorithmConfig, + AlgorithmConfigModal, + Login, + Password, + SchemaFormModal, + ...require("rc-util") }); diff --git a/packages/material/lib/login/Login.js b/packages/material/lib/login/Login.js new file mode 100644 index 0000000..d0ad60a --- /dev/null +++ b/packages/material/lib/login/Login.js @@ -0,0 +1,110 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/login/Login.tsx +var Login_exports = {}; +__export(Login_exports, { + default: () => Login_default +}); +module.exports = __toCommonJS(Login_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_icons = require("@ant-design/icons"); +var import_func = require("@zhst/func"); +var import_index = require("./index.less"); +var materialName = "zhst-material-login"; +var { useToken } = import_antd.theme; +var Login = (props) => { + const { + title, + onIconClick, + rememberPassword = true, + imageUrl, + width, + height, + onFinish + } = props; + const [form] = import_antd.Form.useForm(); + const { token } = useToken(); + console.log("width", width); + return /* @__PURE__ */ import_react.default.createElement(import_antd.Flex, { className: materialName, style: { width: (0, import_func.isNumber)(width) ? `${width}px` : width, height: (0, import_func.isNumber)(height) ? `${height}px` : height } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Flex, { align: "center", justify: "center", style: { position: "relative", width: "40%", padding: `30px` } }, /* @__PURE__ */ import_react.default.createElement( + import_icons.HomeOutlined, + { + onClick: onIconClick, + style: { + position: "absolute", + top: "30px", + left: "30px", + fontSize: `${token.sizeLG}px`, + cursor: "pointer" + } + } + ), /* @__PURE__ */ import_react.default.createElement("div", { style: { width: "56%" } }, /* @__PURE__ */ import_react.default.createElement("h2", { style: { margin: "30px 0", fontSize: "30px" } }, title), /* @__PURE__ */ import_react.default.createElement( + import_antd.Form, + { + layout: "vertical", + form, + onFinish + }, + /* @__PURE__ */ import_react.default.createElement( + import_antd.Form.Item, + { + name: "account", + label: "账号", + rules: [ + { required: true, message: "请输入账号!" } + ] + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Input, { placeholder: "请输入账号", variant: "borderless", style: { border: "none", borderBottom: "1px solid rgba(0, 0, 0, 0.06)" } }) + ), + /* @__PURE__ */ import_react.default.createElement( + import_antd.Form.Item, + { + name: "password", + label: "密码", + rules: [ + { required: true, message: "请输入密码!" } + ] + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Input.Password, { placeholder: "请输入密码", variant: "borderless", style: { border: "none", borderBottom: "1px solid rgba(0, 0, 0, 0.06)" } }) + ), + /* @__PURE__ */ import_react.default.createElement(import_antd.Form.Item, { style: { display: rememberPassword ? "block" : "none" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Form.Item, { name: "remember", valuePropName: "checked", noStyle: true }, /* @__PURE__ */ import_react.default.createElement(import_antd.Checkbox, null, "记住密码"))), + /* @__PURE__ */ import_react.default.createElement(import_antd.Form.Item, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { block: true, type: "primary", htmlType: "submit" }, "登录")) + ))), /* @__PURE__ */ import_react.default.createElement("div", { style: { width: "60%", height: "100%" } }, /* @__PURE__ */ import_react.default.createElement( + import_antd.Image, + { + style: { width: "100%" }, + src: imageUrl, + width: "100%", + height: "100%", + preview: false, + fallback: "data:image/png;base64,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" + } + ))); +}; +var Login_default = Login; diff --git a/packages/material/lib/login/images/ai-suanfa.png b/packages/material/lib/login/images/ai-suanfa.png new file mode 100644 index 0000000..848fc3a Binary files /dev/null and b/packages/material/lib/login/images/ai-suanfa.png differ diff --git a/packages/material/lib/login/images/ai-video.png b/packages/material/lib/login/images/ai-video.png new file mode 100644 index 0000000..99304b7 Binary files /dev/null and b/packages/material/lib/login/images/ai-video.png differ diff --git a/packages/material/lib/login/images/box-manage.png b/packages/material/lib/login/images/box-manage.png new file mode 100644 index 0000000..fcaca42 Binary files /dev/null and b/packages/material/lib/login/images/box-manage.png differ diff --git a/packages/material/lib/login/index.d.ts b/packages/material/lib/login/index.d.ts new file mode 100644 index 0000000..189be5f --- /dev/null +++ b/packages/material/lib/login/index.d.ts @@ -0,0 +1,2 @@ +import Login from './Login'; +export default Login; diff --git a/packages/material/lib/login/index.js b/packages/material/lib/login/index.js new file mode 100644 index 0000000..9b816ba --- /dev/null +++ b/packages/material/lib/login/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/login/index.tsx +var login_exports = {}; +__export(login_exports, { + default: () => login_default +}); +module.exports = __toCommonJS(login_exports); +var import_Login = __toESM(require("./Login")); +var login_default = import_Login.default; diff --git a/packages/material/lib/password/Password.d.ts b/packages/material/lib/password/Password.d.ts new file mode 100644 index 0000000..47f9c0f --- /dev/null +++ b/packages/material/lib/password/Password.d.ts @@ -0,0 +1,11 @@ +/** + * Created by jiangzhixiong on 2024/03/18 + */ +import { FC } from 'react'; +import { FormProps } from 'antd'; +interface PasswordProps { + onFinish: FormProps['onFinish']; + onCancel: () => void; +} +declare const Password: FC; +export default Password; diff --git a/packages/material/lib/password/Password.js b/packages/material/lib/password/Password.js new file mode 100644 index 0000000..127eefb --- /dev/null +++ b/packages/material/lib/password/Password.js @@ -0,0 +1,96 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/password/Password.tsx +var Password_exports = {}; +__export(Password_exports, { + default: () => Password_default +}); +module.exports = __toCommonJS(Password_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var Password = (props) => { + const { + onFinish, + onCancel + } = props; + const [form] = import_antd.Form.useForm(); + return /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h2", { style: { marginTop: "0", fontSize: "20px" } }, "修改密码"), /* @__PURE__ */ import_react.default.createElement( + import_antd.Form, + { + labelCol: { span: 4 }, + wrapperCol: { span: 20 }, + form, + onFinish + }, + /* @__PURE__ */ import_react.default.createElement( + import_antd.Form.Item, + { + name: "password", + label: "原密码", + rules: [ + { required: true, message: "请输入密码!" } + ] + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Input.Password, { variant: "borderless", style: { border: "none", borderBottom: "1px solid rgba(0, 0, 0, 0.06)" } }) + ), + /* @__PURE__ */ import_react.default.createElement( + import_antd.Form.Item, + { + name: "newPassword", + label: "新密码", + rules: [ + { required: true, message: "请输入新密码!" } + ] + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Input.Password, { variant: "borderless", style: { border: "none", borderBottom: "1px solid rgba(0, 0, 0, 0.06)" } }) + ), + /* @__PURE__ */ import_react.default.createElement( + import_antd.Form.Item, + { + name: "rePassword", + label: "确认密码", + dependencies: ["password"], + rules: [ + { required: true, message: "请再次输入密码!" }, + ({ getFieldValue }) => ({ + validator(_, value) { + if (!value || getFieldValue("password") === value) { + return Promise.resolve(); + } + return Promise.reject(new Error("两次输入的密码不一致!")); + } + }) + ] + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Input.Password, { variant: "borderless", style: { border: "none", borderBottom: "1px solid rgba(0, 0, 0, 0.06)" } }) + ), + /* @__PURE__ */ import_react.default.createElement("div", { style: { textAlign: "right" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Space, null, /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { htmlType: "reset", onClick: onCancel, style: { width: "100px" } }, "取消"), /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { type: "primary", htmlType: "submit", style: { width: "100px" } }, "确认"))) + )); +}; +var Password_default = Password; diff --git a/packages/material/lib/password/index.d.ts b/packages/material/lib/password/index.d.ts new file mode 100644 index 0000000..b102ba8 --- /dev/null +++ b/packages/material/lib/password/index.d.ts @@ -0,0 +1,2 @@ +import Password from './Password'; +export default Password; diff --git a/packages/material/lib/password/index.js b/packages/material/lib/password/index.js new file mode 100644 index 0000000..2112309 --- /dev/null +++ b/packages/material/lib/password/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/password/index.tsx +var password_exports = {}; +__export(password_exports, { + default: () => password_default +}); +module.exports = __toCommonJS(password_exports); +var import_Password = __toESM(require("./Password")); +var password_default = import_Password.default; diff --git a/packages/material/lib/utils/base64Images.d.ts b/packages/material/lib/utils/base64Images.d.ts new file mode 100644 index 0000000..0cd9cac --- /dev/null +++ b/packages/material/lib/utils/base64Images.d.ts @@ -0,0 +1,2 @@ +export declare const AlgorithmConfigImg = "data:image/png;base64,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"; +export declare const ErrorImage = "data:image/png;base64,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"; diff --git a/packages/material/lib/utils/base64Images.js b/packages/material/lib/utils/base64Images.js new file mode 100644 index 0000000..fab01bf --- /dev/null +++ b/packages/material/lib/utils/base64Images.js @@ -0,0 +1,32 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/utils/base64Images.ts +var base64Images_exports = {}; +__export(base64Images_exports, { + AlgorithmConfigImg: () => AlgorithmConfigImg, + ErrorImage: () => ErrorImage +}); +module.exports = __toCommonJS(base64Images_exports); +var AlgorithmConfigImg = "data:image/png;base64,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"; +var ErrorImage = "data:image/png;base64,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"; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + AlgorithmConfigImg, + ErrorImage +}); diff --git a/packages/material/lib/utils/constants.d.ts b/packages/material/lib/utils/constants.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/lib/utils/constants.js b/packages/material/lib/utils/constants.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/lib/utils/index.d.ts b/packages/material/lib/utils/index.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/lib/utils/index.js b/packages/material/lib/utils/index.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/lib/utils/types.d.ts b/packages/material/lib/utils/types.d.ts new file mode 100644 index 0000000..69d3304 --- /dev/null +++ b/packages/material/lib/utils/types.d.ts @@ -0,0 +1 @@ +export type AnyObject = Record; diff --git a/packages/material/lib/utils/types.js b/packages/material/lib/utils/types.js new file mode 100644 index 0000000..f863ceb --- /dev/null +++ b/packages/material/lib/utils/types.js @@ -0,0 +1,17 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/utils/types.ts +var types_exports = {}; +module.exports = __toCommonJS(types_exports); diff --git a/packages/material/package.json b/packages/material/package.json index 3cc40c5..7adce7b 100644 --- a/packages/material/package.json +++ b/packages/material/package.json @@ -1,12 +1,11 @@ { "name": "@zhst/material", - "version": "0.5.1", + "version": "0.7.7", "description": "物料库", "keywords": [ "business", "biz", - "zhst", - "material" + "zhst" ], "license": "ISC", "author": "dev", @@ -19,6 +18,11 @@ "main": "lib/index.js", "module": "es/index.js", "typings": "es/index.d.ts", + "exports": { + ".": { + "import": "./es/index.js" + } + }, "files": [ "es", "lib" @@ -31,9 +35,14 @@ "registry": "http://10.0.0.77:4874" }, "dependencies": { + "@ant-design/icons": "^5.2.6", + "@ant-design/pro-components": "^2.6.49", + "@zhst/biz": "workspace:^", + "@zhst/func": "workspace:^", "@zhst/hooks": "workspace:^", "@zhst/meta": "workspace:^", - "@zhst/func": "workspace:^", - "@zhst/biz": "workspace:^" + "antd": "^5.14.2", + "classnames": "^2.5.1", + "rc-util": "^5.38.1" } } diff --git a/packages/material/src/Demo/index.tsx b/packages/material/src/Demo/index.tsx deleted file mode 100644 index 614fa16..0000000 --- a/packages/material/src/Demo/index.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react' - -export default () => { - - return ( -
hi
- ) -} diff --git a/packages/material/src/algorithmConfig/algorithmConfig.tsx b/packages/material/src/algorithmConfig/algorithmConfig.tsx new file mode 100644 index 0000000..f50c382 --- /dev/null +++ b/packages/material/src/algorithmConfig/algorithmConfig.tsx @@ -0,0 +1,176 @@ +import React, { useRef, forwardRef, useImperativeHandle } from 'react'; +import { Flex, Image } from "antd"; +import theme from 'antd/es/theme' +import { BigImagePreview } from '@zhst/meta' +import type { ImgViewRef } from '@zhst/meta' +import { AlgorithmConfigImg, ErrorImage } from '../utils/base64Images' +import AlgorithmTable from './components/algorithmTable' +import TimeTemplateTable from './components/timeTemplateTable'; +import { AlgorithmTableProps } from './components/algorithmTable/AlgorithmTable'; +import { TimeTemplateTableProps } from './components/timeTemplateTable/TimeTemplateTable'; + +const { useToken } = theme + +const Title = (props: any) =>

{props.children}

+ +export interface AlgorithmConfigProps { + onAddAlgorithm?: () => void + /** + * 单选的图片数据 + */ + drawData?: { + imageKey: string + odRect?: { + x: number + y: number + w: number + h: number + } + score?: string + time?: string + } + /** + * 单选状态圈选后的监听事件 + */ + drawListener?: (data: any) => void; + algorithmTableDataSource?: { + id: string; + // 模板名称 + templateName: string; + // 运行周期 + operatingCycle: string; + // 算力占用 + algorithmOccupied: number; + }[]; + timeTemplateDataSource?: { + id: string; + templateName: string; + operatingCycle: string; + arrangeWeek: string; + algorithmOccupied: string; + }[] + boxList: { + id: string; + name: string; + }[] + algorithmTableProps?: AlgorithmTableProps + timeTemplateTableProps?: TimeTemplateTableProps + selectedKey?: string + rowKey?: string + type: AlgorithmTableProps['tableType'] + onSelect?: (key: string, info?: any) => void +} + +export interface AlgorithmConfigRef { + draw: () => void; + cancelDraw: () => void; +} + +const AlgorithmConfig = forwardRef((props, ref) => { + const { + algorithmTableDataSource = [], + timeTemplateDataSource = [], + boxList = [], + drawData, + drawListener, + algorithmTableProps, + timeTemplateTableProps, + selectedKey, + type = 'multiple', + rowKey = 'id', + onSelect + } = props + const drawImageRef = useRef(null) + const { token } = useToken() + + useImperativeHandle(ref, () => ({ + draw: () => { + drawImageRef.current?.setShowCrop(true) + }, + cancelDraw: () => { + drawImageRef.current?.setShowCrop(false) + }, + })) + + return ( + +
+ 盒子列表 +
+ {boxList.map(item => { + return ( +

onSelect?.(item.id, item)} + style={{ + margin: 0, + padding: `${token.paddingXXS}px ${token.paddingLG}px`, + cursor: 'pointer', + // @ts-ignore + color: selectedKey === item[rowKey] ? token.colorPrimary : token.colorText, + // @ts-ignore + backgroundColor: selectedKey === item[rowKey] ? token.blue1 : token.colorBgBase, + transition: '0.2s ease' + }} + >{item.name}

+ ) + })} +
+
+
+ {type === 'single' ? ( + <>} + // @ts-ignore + data={drawData} + onDraw={drawListener} + /> + ) : ( +
+ +

请进行批量配置

+
    +
  • · 盒子批量配置仅支持同型号盒子;
  • +
  • · 采取覆盖式更新,不保留原有配置,且预警检测框默认全屏范围;
  • +
  • · 人流量统计默认检测线为屏幕中央横向线条,且箭头指向下方;
  • +
  • · 优先选择拉流正常的摄像头。
  • +
+
+ ) + } +
+
+
+ 时间模板 +
+ +
+
+
+ 算法应用 +
+ +
+
+
+
+ ); +}); + +export default AlgorithmConfig; + diff --git a/packages/material/src/algorithmConfig/components/algorithmTable/AlgorithmTable.tsx b/packages/material/src/algorithmConfig/components/algorithmTable/AlgorithmTable.tsx new file mode 100644 index 0000000..ae47860 --- /dev/null +++ b/packages/material/src/algorithmConfig/components/algorithmTable/AlgorithmTable.tsx @@ -0,0 +1,117 @@ +import React from 'react'; +import { DeleteFilled, EditFilled, ImportOutlined, PlusCircleFilled } from '@ant-design/icons'; +import type { ParamsType, ProColumns, ProTableProps } from '@ant-design/pro-components'; +import { + ProTable, +} from '@ant-design/pro-components'; +import { Popconfirm, Select, Space, Switch } from 'antd'; +import theme from 'antd/es/theme'; +import { AnyObject } from 'antd/es/_util/type'; +import { SelectProps } from 'antd/lib'; +import SchemaFormModal from '../schemaFormModal'; + +const { useToken } = theme + +export interface AlgorithmTableProps extends ProTableProps { + onAddAlgorithm?: (id?: string, record?: any) => void + onItemSwitch?: (status?: boolean, id?: string, info?: any) => void + onItemEdit?: (values?: any, info?: any) => void + onItemDelete?: (id?: string, info?: any) => void + onSortSelect?: SelectProps['onChange'] + onDraw?: (id: any, info?: any) => void + selectedKey?: string + sortList?: { + label: string; + value: string; + }[] + tableType?: 'multiple' | 'single' // 多选/单选 +} + +const AlgorithmTable= ( + props: AlgorithmTableProps +) => { + const { + onAddAlgorithm, + onItemSwitch, + onItemEdit, + onItemDelete, + onSortSelect, + selectedKey, + onDraw, + tableType = 'multiple', + sortList = [], + } = props + + const { token } = useToken() + + const columns: ProColumns[] = [ + { + title: '模板名称', + dataIndex: 'templateName', + }, + { + title: '运行周期', + dataIndex: 'runCycle', + valueType: 'select', + width: 80, + valueEnum: { + 1: { text: '黑夜' }, + 0: { text: '白天' }, + }, + }, + { + title: '算力占用', + dataIndex: 'powerOccupy', + }, + { + title: '操作', + key: 'option', + valueType: 'option', + fixed: true, + render: (_DOM, record) => [ + onItemSwitch?.(_status, record.id, record)} />, + onDraw?.(record.id, record)} style={{ display: tableType === 'single' ? 'block' : 'none' }} href="#">, + onItemEdit?.(values, record)} + trigger={} + /> + , + onItemDelete?.(record.id, record)} + > + + , + ], + }, + ]; + + return ( + + columns={columns} + bordered + scroll={{ y: 240 }} + dataSource={[]} + headerTitle={( + + + 人(3~10) + + ), + width: 'm', + }) + } + + if (type === 'cameraBlock') { + arr.push({ + title: '遮挡百分比:', + dataIndex: 'blockPercent', + formItemProps: { + rules: [ + { + required: true, + message: '此项为必填项', + }, + ], + }, + renderFormItem: () => ( + + + %(30~80) + + ), + width: 'm', + }) + } + + if (type !== 'traffic') { + arr.push({ + title: '最短持续时间:', + dataIndex: 'minTime', + formItemProps: { + rules: [ + { + required: true, + message: '此项为必填项', + }, + ], + }, + renderFormItem: () => ( + + + 秒(2~10) + + ), + width: 'm', + }) + arr.push({ + title: '报警间隔时间:', + dataIndex: 'alarmTime', + formItemProps: { + rules: [ + { + required: true, + message: '此项为必填项', + }, + ], + }, + renderFormItem: () => ( + + + 秒(10~600) + + ), + width: 'm', + }) + } else if (type === 'traffic') { + arr.push({ + title: '灵敏度:', + dataIndex: 'sensitivity', + formItemProps: { + rules: [ + { + required: true, + message: '此项为必填项', + }, + ], + }, + renderFormItem: () => ( + + + (0~100) + + ), + width: 'm', + }) + } + + arr.push({ + title: '灵敏度:', + dataIndex: 'sensitivity', + formItemProps: { + rules: [ + { + required: true, + message: '此项为必填项', + }, + ], + }, + renderFormItem: () => ( + + + (0~100) + + ), + width: 'm', + }) + + return arr + } + + return ( + <> + + + ); +}; + +export default SchemaFormModal diff --git a/packages/material/src/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.tsx b/packages/material/src/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.tsx new file mode 100644 index 0000000..3272ded --- /dev/null +++ b/packages/material/src/algorithmConfig/components/timeTemplateTable/TimeTemplateTable.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import type { ParamsType, ProColumns, ProTableProps } from '@ant-design/pro-components'; +import { + ProTable, +} from '@ant-design/pro-components'; +import { InputNumber } from 'antd'; +import { AnyObject } from 'antd/es/_util/type'; + +export interface TimeTemplateTableProps extends ProTableProps { + onItemBlur?: (value?: number | string, id?: any, record?: any) => void, +} + +const TimeTemplateTable = ( + props: TimeTemplateTableProps +) => { + const { + onItemBlur, + } = props + + + const columns: ProColumns[] = [ + { + title: '模板名称', + dataIndex: 'templateName', + }, + { + title: '运行周期', + dataIndex: 'runCycle', + }, + { + title: '布控星期', + dataIndex: 'arrangeDay', + }, + { + title: '算力占用', + dataIndex: 'powerOccupy', + }, + { + title: '配置路数', + key: 'option', + valueType: 'option', + render: (_, record) => onItemBlur?.(e.target.value, record.id, record)} min={0} />, + }, + ]; + + return ( + + columns={columns} + bordered + scroll={{ y: 95 }} + toolbar={undefined} + rowKey="id" + search={false} + options={false} + pagination={false} + dataSource={[]} + {...props} + /> + ) +} + +export default TimeTemplateTable diff --git a/packages/material/src/algorithmConfig/components/timeTemplateTable/index.tsx b/packages/material/src/algorithmConfig/components/timeTemplateTable/index.tsx new file mode 100644 index 0000000..9c01038 --- /dev/null +++ b/packages/material/src/algorithmConfig/components/timeTemplateTable/index.tsx @@ -0,0 +1,5 @@ +import TimeTemplateTable from './TimeTemplateTable'; + +export type { TimeTemplateTableProps } from './TimeTemplateTable' + +export default TimeTemplateTable; diff --git a/packages/material/src/algorithmConfig/demo/basic.tsx b/packages/material/src/algorithmConfig/demo/basic.tsx new file mode 100644 index 0000000..8afd974 --- /dev/null +++ b/packages/material/src/algorithmConfig/demo/basic.tsx @@ -0,0 +1,126 @@ +import React, { useRef, useState } from 'react'; +import { AlgorithmConfig, AlgorithmConfigRef } from '@zhst/material'; +import type { AlgorithmConfigProps } from '@zhst/material'; +import { Button, Space, Switch } from 'antd'; + + +const algorithmTableDataSource: any = [] +const timeTemplateDataSource: any = [] +const boxListData: any[] | (() => any[]) = [] + +for (let i = 0; i < 5; i += 1) { + algorithmTableDataSource.push({ + id: String(i), + templateName: '算法模板' + (i + 1), + templateType: 'fire', // 用来判断操作的标记弹窗 + status: i % 2 !== 0, + powerOccupy: Math.floor(Math.random() * 20), + imageKey: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', + odRect:{ + "x":0.553125,"y":0.29722223,"w":0.048958335,"h":0.2462963 + }, + runCycle: i % 2 !== 0 ? '白天' : '黑夜', + creator: Math.floor(Math.random() * 20), + }); + timeTemplateDataSource.push({ + id: String(i), + templateName: '时间模板' + (i + 1), + lineNum: i + 1, + powerOccupy: Math.floor(Math.random() * 20), + runCycle: i % 2 !== 0 ? '白天' : '黑夜', + arrangeDay: Math.floor(Math.random() * 20), + creator: Math.floor(Math.random() * 20), + }); + boxListData.push({ + id: String(i), + name: '盒子' + (i + 1) + }) +} + +const demo = () => { + const [algorithmTableList, setAlgorithmTableList] = useState(algorithmTableDataSource) + const [timeTemplateData, setTimeTemplateData] = useState(timeTemplateDataSource) + const [boxList, setBoxList] = useState(boxListData) + const [selectedKey, setSelectedKey] = useState('1') + const [algorithmSelectedKey, setAlgorithmSelectedKey] = useState('1') + const [tableType, setTableType] = useState('multiple') + const [drawData, setDrawData] = useState<{ + imageKey: string; + odRect?: { x: number; y: number; h: number; w: number } + }>({ + imageKey: '', + }) + + const algorithmConfigRef = useRef(null) + + // 绘画事件 + const handleDraw = (id: any, info: any) => { + console.log('箭头圈选事件', id, info) + // 先赋值绘画框对象,再打开绘画功能 + setDrawData({ + imageKey: info.imageKey, + odRect: info.odRect, + }) + algorithmConfigRef.current?.draw() + } + + return ( + + + setTableType(_status ? 'single': 'multiple')} /> + + + console.log('监听圈选后的事件', o)} + selectedKey={selectedKey} + onSelect={key => { + setSelectedKey(key) + // setTimeTemplateData([]) + // setTableList([]) + // setBoxList([]) + }} + type={tableType} + algorithmTableProps={{ + onItemSwitch: (status, id) => { + console.log('算法状态 switch 变更') + setAlgorithmTableList((pre: any[]) => { + let arr = pre.map(o => { + if (o.id === id) { + o.status = status + } + return o + }) + return arr + }) + }, + onItemEdit: async (values, itemInfo) => { + console.log('算法单项编辑表单提交', values, itemInfo) + return true + }, + onDraw: (id, info) => handleDraw(id, info), + onItemDelete: (id, itemInfo) => console.log('删除', id, itemInfo), + onAddAlgorithm: (id) => console.log('添加模板', id), + selectedKey: algorithmSelectedKey, + onSortSelect: (value) => setAlgorithmSelectedKey(value), + sortList: [ + { label: '白天', value: '1' }, + { label: '黑夜', value: '2' }, + ] + }} + timeTemplateTableProps={{ + onItemBlur: (val, id, itemInfo) => console.log('失焦事件', val, id, itemInfo), + }} + /> + + ); +}; + +export default demo; diff --git a/packages/material/src/algorithmConfig/demo/empty.tsx b/packages/material/src/algorithmConfig/demo/empty.tsx new file mode 100644 index 0000000..96824e3 --- /dev/null +++ b/packages/material/src/algorithmConfig/demo/empty.tsx @@ -0,0 +1,28 @@ +import React, { useState } from 'react'; +import { AlgorithmConfig, AlgorithmConfigProps } from '@zhst/material'; +import { Space, Switch } from 'antd'; + + +const algorithmTableDataSource: any = [] +const timeTemplateDataSource: any = [] +const boxListData: any[] | (() => any[]) = [] + +const demo = () => { + const [tableType, setTableType] = useState('multiple') + + return ( +
+ + setTableType(_status ? 'single': 'multiple')} /> + + +
+ ); +}; + +export default demo; diff --git a/packages/material/src/algorithmConfig/demo/useSchemaFormModal.tsx b/packages/material/src/algorithmConfig/demo/useSchemaFormModal.tsx new file mode 100644 index 0000000..a051e94 --- /dev/null +++ b/packages/material/src/algorithmConfig/demo/useSchemaFormModal.tsx @@ -0,0 +1,20 @@ +import React from 'react' +import { SchemaFormModal } from '@zhst/material' +import { Button, Space } from 'antd' + +export default () => { + return ( + + console.log('values', values)} + trigger={} + /> + console.log('values', values)} + trigger={} + /> + + ) +} diff --git a/packages/material/src/algorithmConfig/index.md b/packages/material/src/algorithmConfig/index.md new file mode 100644 index 0000000..cf21815 --- /dev/null +++ b/packages/material/src/algorithmConfig/index.md @@ -0,0 +1,71 @@ +--- +category: Components +title: 批量算法配置 +toc: content +group: + title: 智能柜 + order: 2 +--- + +批量算法配置 + +## 代码演示 + +基本用法 +空数据状态 +单独使用schemaFormModal + +## API + + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| boxList | 盒子列表 | Array[] | [] | - | +| algorithmTableDataSource | 算法应用列表 | Array[] | [] | - | +| timeTemplateDataSource | 事件模板列表 | Array[] | [] | - | +| timeTemplateDataSource | 事件模板列表 | Array[] | [] | - | +| selectedKey | 盒子列表选中项 | string | - | - | +| onSelect | 盒子列表选中监听事件 | (key) => void | - | - | +| drawData | 单选状态绘图数据 | 看 meta 组件的 ImgViewProps -> data | - | - | +| drawListener | 单选状态绘图的返回参数 | 看 meta 组件的 ImgViewProps -> onDraw 的回参 | - | - | +| algorithmTableProps | 算法应用表单,在 ProTable 组件基础上拓展 | ant-pro -> ProTable | 见下文 | - | +| timeTemplateTableProps | 时间模板表单,在ProTable 组件基础上拓展 | ant-pro -> ProTable | 见下文 | - | +| ref | algorithmConfigRef | ref| 见下文 | - | + +### algorithmTableProps + +算法应用组件透传,继承 ProTable + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| onItemSwitch | 表单项开关事件监听 | (status?: boolean, id?: string, info?: any) => void | [] | - | +| onItemEdit | 表单项编辑事件监听 | (id?: string, info?: any) => void | - | - | +| onItemDelete | 表单项删除事件监听 | (id?: string, info?: any) => void | - | - | +| onAddAlgorithm | 表单项新增算法规则事件监听 | (id?: string, record?: any) => void | [] | - | +| selectedKey | 过滤选中项 | string | - | - | +| onSortSelect | 筛选下拉框点击事件 | SelectProps['onChange'] | [] | - | +| sortList | 筛选下拉框 | Array[{ label: string; value: string; }] | [] | - | + +### SchemaFormModalProps + +时间模板组件透传,继承 pro-Components 的 BetaSchemaForm + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| type | fire 火焰、smoke:烟雾、traffic: 人流量、face: 面部遮挡、destroy:人员损坏、wander:人员徘徊、cameraBlock:摄像头遮挡、gather:人员聚集 | string | fire | - | +| onFinish | 提交事件,可以通过返回布尔值来判定 | async (values) => Promise | - | - | + +### algorithmConfigRef + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| onDraw | 绘制 | () => void | - | - | +| cancelDraw | 取消绘制 | () => void | - | - | + +### timeTemplateTableProps + +时间模板组件透传,继承 ProTable + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| onItemBlur | 失焦监听事件 | (value?: number | string, id?: any, record?: any) => void | - | diff --git a/packages/material/src/algorithmConfig/index.tsx b/packages/material/src/algorithmConfig/index.tsx new file mode 100644 index 0000000..7666bad --- /dev/null +++ b/packages/material/src/algorithmConfig/index.tsx @@ -0,0 +1,8 @@ +import AlgorithmConfig from './algorithmConfig'; + +export type { AlgorithmConfigProps, AlgorithmConfigRef } from './algorithmConfig' + +export type { AlgorithmTableProps } from './components/algorithmTable' +export type { TimeTemplateTableProps } from './components/timeTemplateTable' + +export default AlgorithmConfig; diff --git a/packages/material/src/algorithmConfigModal/algorithmConfigModal.tsx b/packages/material/src/algorithmConfigModal/algorithmConfigModal.tsx new file mode 100644 index 0000000..555641b --- /dev/null +++ b/packages/material/src/algorithmConfigModal/algorithmConfigModal.tsx @@ -0,0 +1,39 @@ +import React, { FC } from 'react'; +import { ConfigProvider, Modal, ModalProps } from "antd"; +import AlgorithmConfig, { AlgorithmConfigProps } from '../algorithmConfig/algorithmConfig'; +export interface AlgorithmConfigModalProps extends ModalProps { + algorithmConfigProps: AlgorithmConfigProps +} + +const AlgorithmConfigModal: FC = (props) => { + const { + algorithmConfigProps + } = props + + return ( + + + + + + ); +}; + +export default AlgorithmConfigModal; + diff --git a/packages/material/src/algorithmConfigModal/demo/basic.tsx b/packages/material/src/algorithmConfigModal/demo/basic.tsx new file mode 100644 index 0000000..6e3af35 --- /dev/null +++ b/packages/material/src/algorithmConfigModal/demo/basic.tsx @@ -0,0 +1,74 @@ +import React, { useState } from 'react'; +import { AlgorithmConfigModal } from '@zhst/material'; + +const algorithmTableDataSource: any = [] +const timeTemplateDataSource: any = [] +const boxListData: any[] | (() => any[]) = [] + +for (let i = 0; i < 5; i += 1) { + algorithmTableDataSource.push({ + id: i, + name: '算法模板' + (i + 1), + templateType: 'fire', // 用来判断操作的标记弹窗 + round: Math.floor(Math.random() * 1), + creator: Math.floor(Math.random() * 20), + }); + timeTemplateDataSource.push({ + id: i, + tempName: 'AppName' + (i + 1), + count: Math.floor(Math.random() * 1), + creator: Math.floor(Math.random() * 20), + }); + boxListData.push({ + id: i, + name: '盒子' + (i + 1) + }) +} + +const demo = () => { + const [open, setOpen] = useState(true) + const [algorithmTableList, setAlgorithmTableList] = useState(algorithmTableDataSource) + const [timeTemplateData, setTimeTemplateData] = useState(timeTemplateDataSource) + const [boxList, setBoxList] = useState(boxListData) + const [selectedKey, setSelectedKey] = useState('') + const [algorithmSelectedKey, setAlgorithmSelectedKey] = useState('1') + + return ( +
+ setOpen(false)} + algorithmConfigProps={{ + boxList, + selectedKey, + algorithmTableDataSource: algorithmTableList, + timeTemplateDataSource: timeTemplateData, + onSelect: _key => setSelectedKey(_key), + algorithmTableProps: { + onItemSwitch: (status, itemInfo) => console.log('修改开关', status, itemInfo), + onItemEdit: async (values, itemInfo) => { + console.log('算法单项编辑表单提交', values, itemInfo) + return true + }, + onItemDelete: (id, itemInfo) => console.log('删除', id, itemInfo), + onAddAlgorithm: (id) => console.log('添加模板', id), + selectedKey: algorithmSelectedKey, + onSortSelect: (value) => setAlgorithmSelectedKey(value), + sortList: [ + { label: '白天', value: '1' }, + { label: '黑夜', value: '2' }, + ] + }, + timeTemplateTableProps: { + onItemBlur: (id, itemInfo) => console.log('失焦事件', id, itemInfo), + } + }} + /> +
+ ); +}; + +export default demo; diff --git a/packages/material/src/algorithmConfigModal/demo/mock.ts b/packages/material/src/algorithmConfigModal/demo/mock.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/src/algorithmConfigModal/index.md b/packages/material/src/algorithmConfigModal/index.md new file mode 100644 index 0000000..6ece9d4 --- /dev/null +++ b/packages/material/src/algorithmConfigModal/index.md @@ -0,0 +1,23 @@ +--- +category: Components +title: 批量算法配置弹框 +toc: content +demo: + cols: 2 +group: + title: 智能柜 + order: 2 +--- + +批量算法配置弹框 + +## 代码演示 + + +基本用法 + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| data | 数据源 | Array[] | [] | - | diff --git a/packages/material/src/algorithmConfigModal/index.tsx b/packages/material/src/algorithmConfigModal/index.tsx new file mode 100644 index 0000000..d38f217 --- /dev/null +++ b/packages/material/src/algorithmConfigModal/index.tsx @@ -0,0 +1,3 @@ +import AlgorithmConfigModal from './algorithmConfigModal'; + +export default AlgorithmConfigModal; diff --git a/packages/material/src/changelog/index.md b/packages/material/src/changelog/index.md index d4333e4..aa03361 100644 --- a/packages/material/src/changelog/index.md +++ b/packages/material/src/changelog/index.md @@ -1,7 +1,6 @@ --- -nav: - title: 元组件 title: 版本更新日志 +toc: content order: 99 --- diff --git a/packages/material/src/index.md b/packages/material/src/index.md index 6ee14d4..86187b2 100644 --- a/packages/material/src/index.md +++ b/packages/material/src/index.md @@ -1,7 +1,8 @@ --- nav: - title: 业务组件 + title: 物料库 order: 1 +toc: content title: 快速上手 --- diff --git a/packages/material/src/index.tsx b/packages/material/src/index.tsx index 31f4c03..8f16ac8 100644 --- a/packages/material/src/index.tsx +++ b/packages/material/src/index.tsx @@ -1 +1,7 @@ -export { default as Demo } from './Demo'; +export { default as AlgorithmConfigModal } from './algorithmConfigModal'; +export { default as AlgorithmConfig } from './algorithmConfig'; +export type { AlgorithmConfigRef, AlgorithmConfigProps } from './algorithmConfig'; +export { default as Login } from './login'; +export { default as Password } from './password'; +export { default as SchemaFormModal } from './algorithmConfig/components/schemaFormModal'; +export * from 'rc-util' diff --git a/packages/material/src/login/Login.tsx b/packages/material/src/login/Login.tsx new file mode 100644 index 0000000..ec32d5e --- /dev/null +++ b/packages/material/src/login/Login.tsx @@ -0,0 +1,103 @@ +/** + * Created by jiangzhixiong on 2024/03/18 + */ + +import React, { FC } from 'react' +import { Button, Checkbox, Flex, Form, FormProps, Image, Input, theme } from 'antd'; +import { HomeOutlined } from '@ant-design/icons'; +import { isNumber } from '@zhst/func'; +import './index.less' + +const materialName = 'zhst-material-login' + +const { useToken } = theme + +interface LoginProps { + title: string; + onIconClick?: () => void + rememberPassword?: boolean + imageUrl: string; + onFinish: FormProps['onFinish'] + width?: string | number + height?: string | number +} + +const Login: FC = (props) => { + const { + title, + onIconClick, + rememberPassword = true, + imageUrl, + width, + height, + onFinish + } = props + const [form] = Form.useForm(); + const { token } = useToken() + + console.log('width', width) + + return ( + + + +
+

{title}

+
+ + + + + + + + + 记住密码 + + + + + +
+
+
+
+ +
+
+ ) +} + +export default Login diff --git a/packages/material/src/login/demo/basic.tsx b/packages/material/src/login/demo/basic.tsx new file mode 100644 index 0000000..21684dc --- /dev/null +++ b/packages/material/src/login/demo/basic.tsx @@ -0,0 +1,20 @@ +import React, { useState } from 'react'; +import { Login } from '@zhst/material'; + +import bg1 from '../images/ai-suanfa.png' + +const demo = () => { + + return ( +
+ console.log('val', val)} + /> +
+ ); +}; + +export default demo; diff --git a/packages/material/src/login/images/ai-suanfa.png b/packages/material/src/login/images/ai-suanfa.png new file mode 100644 index 0000000..848fc3a Binary files /dev/null and b/packages/material/src/login/images/ai-suanfa.png differ diff --git a/packages/material/src/login/images/ai-video.png b/packages/material/src/login/images/ai-video.png new file mode 100644 index 0000000..99304b7 Binary files /dev/null and b/packages/material/src/login/images/ai-video.png differ diff --git a/packages/material/src/login/images/box-manage.png b/packages/material/src/login/images/box-manage.png new file mode 100644 index 0000000..fcaca42 Binary files /dev/null and b/packages/material/src/login/images/box-manage.png differ diff --git a/packages/material/src/login/index.less b/packages/material/src/login/index.less new file mode 100644 index 0000000..ccd5c73 --- /dev/null +++ b/packages/material/src/login/index.less @@ -0,0 +1,5 @@ +.zhst-material-login { + &::-webkit-scrollbar { + display: none; + } +} diff --git a/packages/material/src/login/index.md b/packages/material/src/login/index.md new file mode 100644 index 0000000..d9d04f3 --- /dev/null +++ b/packages/material/src/login/index.md @@ -0,0 +1,24 @@ +--- +category: Components +title: Login 登录 +toc: content +group: + title: 通用 + order: 2 +--- + +登录事件 + +## 代码演示 + +基本用法 + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| title | 标题 | string | - | - | +| onIconClick | 房子点击触发事件 | () => void | [] | - | +| rememberPassword | 是否显示记住密码 | boolean | true | - | +| imageUrl | 大图链接 | string | - | - | +| onFinish | 登录提交事件 | FormProps['onFinish'] | - | - | diff --git a/packages/material/src/login/index.tsx b/packages/material/src/login/index.tsx new file mode 100644 index 0000000..393a6df --- /dev/null +++ b/packages/material/src/login/index.tsx @@ -0,0 +1,3 @@ +import Login from './Login' + +export default Login diff --git a/packages/material/src/password/Password.tsx b/packages/material/src/password/Password.tsx new file mode 100644 index 0000000..3477c46 --- /dev/null +++ b/packages/material/src/password/Password.tsx @@ -0,0 +1,76 @@ +/** + * Created by jiangzhixiong on 2024/03/18 + */ + +import React, { FC } from 'react' +import { Button, Form, FormProps, Input, Space } from 'antd' + +interface PasswordProps { + onFinish: FormProps['onFinish'] + onCancel: () => void +} + +const Password: FC = (props) => { + const { + onFinish, + onCancel, + } = props + const [form] = Form.useForm(); + + return ( +
+

修改密码

+
+ + + + + + + ({ + validator(_, value) { + if (!value || getFieldValue('password') === value) { + return Promise.resolve(); + } + return Promise.reject(new Error('两次输入的密码不一致!')); + }, + }), + ]} + > + + +
+ + + + +
+
+
+ ) +} + +export default Password diff --git a/packages/material/src/password/demo/basic.tsx b/packages/material/src/password/demo/basic.tsx new file mode 100644 index 0000000..85efb49 --- /dev/null +++ b/packages/material/src/password/demo/basic.tsx @@ -0,0 +1,16 @@ +import React, { useState } from 'react'; +import { Password } from '@zhst/material'; + +const demo = () => { + + return ( +
+ console.log('val', val)} + onCancel={() => console.log('cancel')} + /> +
+ ); +}; + +export default demo; diff --git a/packages/material/src/password/index.md b/packages/material/src/password/index.md new file mode 100644 index 0000000..4963661 --- /dev/null +++ b/packages/material/src/password/index.md @@ -0,0 +1,21 @@ +--- +category: Components +title: Password 修改密码 +toc: content +group: + title: 通用 + order: 2 +--- + +盒子树 + +## 代码演示 + +基本用法 + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| onFinish | 提交事件 | FormProps['onFinish'] | - | - | +| onCancel | 取消 | () => void | - | - | diff --git a/packages/material/src/password/index.tsx b/packages/material/src/password/index.tsx new file mode 100644 index 0000000..fa82596 --- /dev/null +++ b/packages/material/src/password/index.tsx @@ -0,0 +1,3 @@ +import Password from './Password' + +export default Password diff --git a/packages/material/src/utils/base64Images.ts b/packages/material/src/utils/base64Images.ts new file mode 100644 index 0000000..0e4d127 --- /dev/null +++ b/packages/material/src/utils/base64Images.ts @@ -0,0 +1,3 @@ +export const AlgorithmConfigImg = 'data:image/png;base64,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' + +export const ErrorImage = 'data:image/png;base64,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' diff --git a/packages/material/src/utils/constants.ts b/packages/material/src/utils/constants.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/src/utils/index.ts b/packages/material/src/utils/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/material/src/utils/types.ts b/packages/material/src/utils/types.ts new file mode 100644 index 0000000..69d3304 --- /dev/null +++ b/packages/material/src/utils/types.ts @@ -0,0 +1 @@ +export type AnyObject = Record; diff --git a/packages/meta/CHANGELOG.md b/packages/meta/CHANGELOG.md index 6c56910..7bf6e8f 100644 --- a/packages/meta/CHANGELOG.md +++ b/packages/meta/CHANGELOG.md @@ -1,5 +1,142 @@ # @zhst/utils +## 0.9.7 + +### Patch Changes + +- @zhst/func@0.9.1 +- @zhst/hooks@0.8.10 +- @zhst/meta@0.9.7 + +## 0.9.6 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.9.0 + - @zhst/hooks@0.8.9 + - @zhst/meta@0.9.6 + +## 0.9.5 + +### Patch Changes + +- 初始化物料库 +- Updated dependencies + - @zhst/hooks@0.8.8 + - @zhst/func@0.8.3 + - @zhst/meta@0.9.5 + +## 0.9.4 + +### Patch Changes + +- 初始化物料包 +- Updated dependencies + - @zhst/hooks@0.8.7 + - @zhst/func@0.8.2 + - @zhst/meta@0.9.4 + +## 0.9.3 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.8.1 + - @zhst/hooks@0.8.6 + - @zhst/meta@0.9.3 + +## 0.9.2 + +### Patch Changes + +- Updated dependencies + - @zhst/func@0.8.0 + - @zhst/hooks@0.8.5 + - @zhst/meta@0.9.2 + +## 0.9.1 + +### Patch Changes + +- 添加数据为空时自定义 +- Updated dependencies + - @zhst/meta@0.9.1 + +## 0.9.0 + +### Minor Changes + +- 修改 metad 大图组建 + +### Patch Changes + +- Updated dependencies + - @zhst/meta@0.9.0 + +## 0.8.5 + +### Patch Changes + +- @zhst/func@0.7.5 +- @zhst/hooks@0.8.4 +- @zhst/meta@0.8.5 +- 修改大图组组建的手动绘制截图逻辑 +- Updated dependencies + - @zhst/meta@0.8.5 + +## 0.8.4 + +### Patch Changes + +- 新增 tree 组件的监听事件,优化 meta 全选的回调事件监听 +- Updated dependencies + - @zhst/hooks@0.8.3 + - @zhst/func@0.7.4 + - @zhst/meta@0.8.4 + +## 0.8.3 + +### Patch Changes + +- 修改 boxSelectTree 类型提示 +- Updated dependencies + - @zhst/hooks@0.8.2 + - @zhst/func@0.7.3 + - @zhst/meta@0.8.3 + +## 0.8.2 + +### Patch Changes + +- 优化 boxSelectTree 组件,添加可以自定义配置按钮功能 +- Updated dependencies + - @zhst/hooks@0.8.1 + - @zhst/func@0.7.2 + - @zhst/meta@0.8.2 + +## 0.8.1 + +### Patch Changes + +- Updated dependencies + - @zhst/hooks@0.8.0 + - @zhst/func@0.7.1 + - @zhst/meta@0.8.1 + +## 0.8.0 + +### Minor Changes + +- 新增业务组件 Tree、TreeTransfer、TreeTransferModal、BoxSelectTree + +### Patch Changes + +- Updated dependencies + - @zhst/hooks@0.7.0 + - @zhst/func@0.7.0 + - @zhst/meta@0.8.0 + ## 0.7.0 ### Minor Changes diff --git a/packages/meta/es/BigImagePreview/BigImagePreview.js b/packages/meta/es/BigImagePreview/BigImagePreview.js index c1316cf..a7b5d37 100644 --- a/packages/meta/es/BigImagePreview/BigImagePreview.js +++ b/packages/meta/es/BigImagePreview/BigImagePreview.js @@ -13,20 +13,9 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o = function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } -import React, { useEffect, useState, useCallback, useRef, useImperativeHandle } from 'react'; +import React, { useEffect, useState, useRef, useImperativeHandle } from 'react'; import classNames from 'classnames'; -import { useLatest } from '@zhst/hooks'; -import { get, pick, isNull, generateImg, dataURLToBlob, -// @ts-ignore -getOdRect, -// @ts-ignore -getExtendRect, -// @ts-ignore -getTransformRect, -// @ts-ignore -getRotateImg, getTransforms, addEventListenerWrapper, getFileByRect -// @ts-ignore -} from '@zhst/func'; +import { get, pick, isNull, generateImg, dataURLToBlob, getTransforms, addEventListenerWrapper, getFileByRect } from '@zhst/func'; import Align from 'rc-align'; import { Button, Empty } from '..'; import Icon from "../iconfont"; @@ -34,6 +23,7 @@ import { Cropper, Viewer, EVENT_VIEWER_TRANSFORM_CHANGE, EVENT_VIEWER_READY, EVE import BtnGroup from "./components/BtnGroup"; import "./index.less"; import { defaultAlignOption, CROP_TYPE } from "../utils/constants"; +import { getOdRect, getExtendRect, getTransformRect, getRotateImg } from "./bigImagePreviewHelper"; var componentName = "zhst-image__img-view"; var cropBtnDataSource = [{ key: 'close', @@ -65,7 +55,7 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) var width = props.width, height = props.height, _props$showScore = props.showScore, - showScore = _props$showScore === void 0 ? true : _props$showScore, + showScore = _props$showScore === void 0 ? false : _props$showScore, data = props.data, _props$showOpt = props.showOpt, showOpt = _props$showOpt === void 0 ? false : _props$showOpt, @@ -77,14 +67,21 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) screenshotButtonRender = _props$screenshotButt2 === void 0 ? function () { return /*#__PURE__*/React.createElement("div", { style: { - color: '#fff' + color: '#fff', + width: '80px', + top: 0, + fontSize: 12 } }, "\u56DE\u8C03DOM"); } : _props$screenshotButt2, _props$hideLeftTopBtn = props.hideLeftTopBtn, hideLeftTopBtn = _props$hideLeftTopBtn === void 0 ? true : _props$hideLeftTopBtn, + onDraw = props.onDraw, _props$viewOption = props.viewOption, - viewOption = _props$viewOption === void 0 ? {} : _props$viewOption; + viewOption = _props$viewOption === void 0 ? {} : _props$viewOption, + type = props.type, + hideTypeBtns = props.hideTypeBtns, + customEmpty = props.customEmpty; var imageKey = data.imageKey, attachImg = data.attachImg, odRect = data.odRect, @@ -92,22 +89,15 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) _data$objects = data.objects, objects = _data$objects === void 0 ? [] : _data$objects; var imgContainerRef = React.useRef(null); - var _useState = useState(false), - _useState2 = _slicedToArray(_useState, 2), - isReady = _useState2[0], - setIsReady = _useState2[1]; - var init = useCallback(function ($container) { - imgContainerRef.current = $container; - setIsReady(true); - }, []); + // ============================= viewer ========================= var imgInsRef = useRef(null); - var _useState3 = useState(false), - _useState4 = _slicedToArray(_useState3, 2), - isImgReady = _useState4[0], - setIsImgReady = _useState4[1]; + var _useState = useState(false), + _useState2 = _slicedToArray(_useState, 2), + isImgReady = _useState2[0], + setIsImgReady = _useState2[1]; useEffect(function () { - if (!isReady || !(imgContainerRef !== null && imgContainerRef !== void 0 && imgContainerRef.current)) return; + if (!(imgContainerRef !== null && imgContainerRef !== void 0 && imgContainerRef.current)) return; var handleReady = addEventListenerWrapper(imgContainerRef.current, EVENT_VIEWER_READY, function () { setIsImgReady(true); }); @@ -123,7 +113,7 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) imgInsRef === null || imgInsRef === void 0 || (_imgInsRef$current = imgInsRef.current) === null || _imgInsRef$current === void 0 || (_imgInsRef$current$de = _imgInsRef$current.destroy) === null || _imgInsRef$current$de === void 0 || _imgInsRef$current$de.call(_imgInsRef$current); imgInsRef.current = null; }; - }, [isReady, imageKey]); + }, [imageKey]); // ============================= viewer操作按钮 ========================= var handleOptClick = function handleOptClick(v) { @@ -144,42 +134,42 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) // ============================= cropper ========================= // 手动截图相关参数 var cropInsRef = useRef(null); - var _useState5 = useState(showOpt), + var _useState3 = useState(showOpt), + _useState4 = _slicedToArray(_useState3, 2), + showCrop = _useState4[0], + setShowCrop = _useState4[1]; + var _useState5 = useState(type || CROP_TYPE['AUTO']), _useState6 = _slicedToArray(_useState5, 2), - showCrop = _useState6[0], - setShowCrop = _useState6[1]; - var _useState7 = useState(CROP_TYPE['AUTO']), - _useState8 = _slicedToArray(_useState7, 2), - cropType = _useState8[0], - setCropType = _useState8[1]; + cropType = _useState6[0], + setCropType = _useState6[1]; // 自动截图相关参数 + var _useState7 = useState([]), + _useState8 = _slicedToArray(_useState7, 2), + odList = _useState8[0], + setOdList = _useState8[1]; var _useState9 = useState([]), _useState10 = _slicedToArray(_useState9, 2), - odList = _useState10[0], - setOdList = _useState10[1]; - var _useState11 = useState([]), + extendOdList = _useState10[0], + setExtendOdList = _useState10[1]; + var _useState11 = useState(null), _useState12 = _slicedToArray(_useState11, 2), - extendOdList = _useState12[0], - setExtendOdList = _useState12[1]; - var _useState13 = useState(null), - _useState14 = _slicedToArray(_useState13, 2), - selectRectId = _useState14[0], - setSelectRectId = _useState14[1]; + selectRectId = _useState12[0], + setSelectRectId = _useState12[1]; // 定位按钮相关参数 var alginContainerRef = useRef(null); var alignRef = useRef(null); - var _useState15 = useState(null), - _useState16 = _slicedToArray(_useState15, 2), - cropRect = _useState16[0], - setCropRect = _useState16[1]; + var _useState13 = useState(null), + _useState14 = _slicedToArray(_useState13, 2), + cropRect = _useState14[0], + setCropRect = _useState14[1]; // 选中的版本号 - var _useState17 = useState(null), - _useState18 = _slicedToArray(_useState17, 2), - selectAlgorithmVersion = _useState18[0], - setSelectAlgorithmVersion = _useState18[1]; + var _useState15 = useState(null), + _useState16 = _slicedToArray(_useState15, 2), + selectAlgorithmVersion = _useState16[0], + setSelectAlgorithmVersion = _useState16[1]; var handlerCropStartRef = useRef(null); var handlerCropEndRef = useRef(null); var handleShapeSelectRef = useRef(null); @@ -195,6 +185,8 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) cropInsRef.current = null; }; }, [isImgReady, showCrop, cropType, imageKey]); + + // 初始化页面的绘制矩形 var initData = function initData(_objects) { var imgIns = imgInsRef.current; var _odRect = odRect; @@ -220,7 +212,7 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) var shapeList = odList.map(function (rect) { return _objectSpread(_objectSpread({}, rect), {}, { selectAble: true, - id: rect['id'], + id: ['id'], algorithmVersion: rect.algorithmVersion }); }); @@ -233,28 +225,49 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) }); setExtendOdList(extendRect); imgIns.replaceShape(shapeList); - handleShapeSelectRef.current = addEventListenerWrapper(imgContainerRef.current, 'shape-select', function (e) { - var id = e.detail; - setSelectRectId(id); - var selectShape = shapeList.find(function (v) { - return v['id'] === id; - }); - if (selectShape) { - setSelectAlgorithmVersion(selectShape['algorithmVersion']); - //换算成屏幕坐标 - var axisRect = imgIns.imgRectAxisToCanvasAxisRect(selectShape); - var _rect = { - x: axisRect.x2 > axisRect.x ? axisRect.x : axisRect.x2, - y: axisRect.y2 > axisRect.y ? axisRect.y : axisRect.y2, - w: Math.abs(axisRect.x2 - axisRect.x), - h: Math.abs(axisRect.y2 - axisRect.y) - }; - setCropRect(_rect); - } else { - // @ts-ignore - setCropRect(null); - } - }); + // 框选监听事件 + handleShapeSelectRef.current = addEventListenerWrapper(imgContainerRef.current, 'shape-select', /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(e) { + var id, selectShape, axisRect, _rect2; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + id = e.detail; + setSelectRectId(id); + selectShape = shapeList.find(function (v) { + return v['id'] === id; + }); + if (selectShape) { + setSelectAlgorithmVersion(selectShape['algorithmVersion']); + //换算成屏幕坐标 + axisRect = imgIns.imgRectAxisToCanvasAxisRect(selectShape); + _rect2 = { + x: axisRect.x2 > axisRect.x ? axisRect.x : axisRect.x2, + y: axisRect.y2 > axisRect.y ? axisRect.y : axisRect.y2, + w: Math.abs(axisRect.x2 - axisRect.x), + h: Math.abs(axisRect.y2 - axisRect.y) + }; + setCropRect(_rect2); + onDraw === null || onDraw === void 0 || onDraw({ + rectList: [_rect2], + extendRectList: [_rect2], + imgKey: imageKey, + selectIndex: id + }); + } else { + // @ts-ignore + setCropRect(null); + } + case 4: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }()); }; // @ts-ignore var rect = getOdRect({ @@ -273,18 +286,41 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) setSelectAlgorithmVersion(null); setCropRect(null); }); - handlerCropEndRef.current = addEventListenerWrapper(imgContainerRef.current, EVENT_CROP_END, function (event) { - var _alignRef$current, _alignRef$current$for; - var data = event.detail; - setSelectAlgorithmVersion(null); - setCropRect({ - x: data.left, - y: data.top, - w: data.width, - h: data.height - }); - alignRef === null || alignRef === void 0 || (_alignRef$current = alignRef.current) === null || _alignRef$current === void 0 || (_alignRef$current$for = _alignRef$current.forceAlign) === null || _alignRef$current$for === void 0 || _alignRef$current$for.call(_alignRef$current); - }); + handlerCropEndRef.current = addEventListenerWrapper(imgContainerRef.current, EVENT_CROP_END, /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(event) { + var _alignRef$current, _alignRef$current$for; + var data, _rect, _cropData; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + data = event.detail; + setSelectAlgorithmVersion(null); + _rect = { + x: data.left, + y: data.top, + w: data.width, + h: data.height + }; + setCropRect(_rect); + _context2.next = 6; + return getCropInfo({ + type: cropType, + rect: _rect + }); + case 6: + _cropData = _context2.sent; + onDraw === null || onDraw === void 0 || onDraw(_cropData); + alignRef === null || alignRef === void 0 || (_alignRef$current = alignRef.current) === null || _alignRef$current === void 0 || (_alignRef$current$for = _alignRef$current.forceAlign) === null || _alignRef$current$for === void 0 || _alignRef$current$for.call(_alignRef$current); + case 9: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function (_x2) { + return _ref2.apply(this, arguments); + }; + }()); cropInsRef.current = new Cropper(imgContainerRef.current, { showMask: true, viewer: imgIns @@ -293,26 +329,25 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) }; // 获取框选的截图框信息 - var latestCropType = useLatest(cropType); - var latestCropRect = useLatest(cropRect); var getCropInfo = /*#__PURE__*/function () { - var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(cb) { - var cropType, cropRect, imgIns, transform, newImgKey, rectList, extendRectList, selectIndex, shapes, shapeIds, newRect, _data; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) switch (_context3.prev = _context3.next) { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(opt) { + var type, rect, cropType, cropRect, imgIns, transform, newImgKey, rectList, extendRectList, selectIndex, shapes, shapeIds, newRect, _data, data; + return _regeneratorRuntime().wrap(function _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { case 0: - cropType = latestCropType.current; - cropRect = latestCropRect.current; + type = opt.type, rect = opt.rect; + cropType = type; + cropRect = rect; imgIns = imgInsRef.current; transform = imgIns.targetTransform; newImgKey = imageKey; rectList = []; extendRectList = []; selectIndex = 0; - _context3.t0 = cropType; - _context3.next = _context3.t0 === CROP_TYPE['AUTO'] ? 11 : 17; + _context5.t0 = cropType; + _context5.next = _context5.t0 === CROP_TYPE['AUTO'] ? 12 : 18; break; - case 11: + case 12: shapes = imgIns.getSelectShape(); shapeIds = shapes.map(function (v) { return v['id']; @@ -341,8 +376,8 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) selectIndex = rectList.findIndex(function (v) { return v['id'] === selectRectId; }); - return _context3.abrupt("break", 22); - case 17: + return _context5.abrupt("break", 23); + case 18: //获取旋转过的坐标 // @ts-ignore newRect = getTransformRect(imgIns.image, transform, cropRect); //判断是不是旋转过 @@ -352,40 +387,40 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) } rectList.push(newRect); extendRectList.push(newRect); - return _context3.abrupt("break", 22); - case 22: - _context3.next = 24; + return _context5.abrupt("break", 23); + case 23: + _context5.next = 25; return Promise.all(extendRectList.map( /*#__PURE__*/function () { - var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(rect, index) { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(rect, index) { var file, imgKey; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { case 0: - _context.next = 2; + _context3.next = 2; return getFileByRect(imgIns.image, rect); case 2: - file = _context.sent; + file = _context3.sent; imgKey = file; extendRectList[index] = _objectSpread(_objectSpread({}, rect), {}, { imgKey: imgKey }); case 5: case "end": - return _context.stop(); + return _context3.stop(); } - }, _callee); + }, _callee3); })); - return function (_x2, _x3) { - return _ref2.apply(this, arguments); + return function (_x4, _x5) { + return _ref4.apply(this, arguments); }; }())); - case 24: - _context3.next = 26; + case 25: + _context5.next = 27; return Promise.all(rectList.map( /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(rect, index) { + var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(rect, index) { var faceCorrectImage, faceCorrectImageKey, base64, blobData, file, newRect; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) switch (_context2.prev = _context2.next) { + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { case 0: faceCorrectImage = rect['faceCorrectImage']; if (faceCorrectImage) { @@ -401,35 +436,30 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) rectList[index] = newRect; case 5: case "end": - return _context2.stop(); + return _context4.stop(); } - }, _callee2); + }, _callee4); })); - return function (_x4, _x5) { - return _ref3.apply(this, arguments); + return function (_x6, _x7) { + return _ref5.apply(this, arguments); }; }())); - case 26: - cb === null || cb === void 0 || cb({ + case 27: + data = { rectList: rectList, extendRectList: extendRectList, selectIndex: selectIndex, imgKey: newImgKey - }); - return _context3.abrupt("return", { - rectList: rectList, - extendRectList: extendRectList, - selectIndex: selectIndex, - imgKey: newImgKey - }); - case 28: + }; + return _context5.abrupt("return", data); + case 29: case "end": - return _context3.stop(); + return _context5.stop(); } - }, _callee3); + }, _callee5); })); - return function getCropInfo(_x) { - return _ref.apply(this, arguments); + return function getCropInfo(_x3) { + return _ref3.apply(this, arguments); }; }(); @@ -449,23 +479,14 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) }; // ============================= attact img ========================= - var _useState19 = useState(0), + var _useState17 = useState(0), + _useState18 = _slicedToArray(_useState17, 2), + selectAttachImgIndex = _useState18[0], + setSelectAttachImgIndex = _useState18[1]; + var _useState19 = useState(false), _useState20 = _slicedToArray(_useState19, 2), - selectAttachImgIndex = _useState20[0], - setSelectAttachImgIndex = _useState20[1]; - var _useState21 = useState(false), - _useState22 = _slicedToArray(_useState21, 2), - isZoomin = _useState22[0], - setIsZoomin = _useState22[1]; - - /** - * 修改当前图片预览下标 - * @param diff 跳转强度 正向后翻、负值向前翻 - */ - var handleChangeIndex = function handleChangeIndex(cb) { - if (!imageKey) return; - cb === null || cb === void 0 || cb(); - }; + isZoomin = _useState20[0], + setIsZoomin = _useState20[1]; // ============================== Ref =============================== useImperativeHandle(ref, function () { @@ -473,8 +494,7 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) imgInsRef: imgInsRef, setShowCrop: setShowCrop, initData: initData, - getCropInfo: getCropInfo, - handleChangeIndex: handleChangeIndex + getCropInfo: getCropInfo }; }); return /*#__PURE__*/React.createElement("div", { @@ -485,13 +505,14 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) } }, imageKey ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: classNames("".concat(componentName, "-main"), cropType === CROP_TYPE['AUTO'] && "".concat(componentName, "-main--cursor")), - ref: init + ref: imgContainerRef + // style={{ width: width, height: height }} }), !hideLeftTopBtn && /*#__PURE__*/React.createElement(BtnGroup, { className: classNames("".concat(componentName, "-opt")), dataSource: operateBtnDataSource, onClick: handleOptClick, placement: "left" - }), showCrop && /*#__PURE__*/React.createElement(BtnGroup, { + }), !hideTypeBtns && showCrop && /*#__PURE__*/React.createElement(BtnGroup, { circle: true, className: classNames("".concat(componentName, "-crop-opt")), dataSource: cropBtnDataSource, @@ -525,8 +546,8 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) className: classNames("".concat(componentName, "-attach"), isZoomin && "".concat(componentName, "-attach--zoomin"), "".concat(componentName, "-attach--fixed"), isZoomin && "".concat(componentName, "-attach--zoomin--fixed")) }, /*#__PURE__*/React.createElement("div", { className: classNames("".concat(componentName, "-attach__tab")) - }, showAttachImgLabel ? attachImg === null || attachImg === void 0 ? void 0 : attachImg.map(function (_ref4, index) { - var label = _ref4.label; + }, showAttachImgLabel ? attachImg === null || attachImg === void 0 ? void 0 : attachImg.map(function (_ref6, index) { + var label = _ref6.label; return /*#__PURE__*/React.createElement("div", { key: index, className: classNames("".concat(componentName, "-attach__tab-item"), selectAttachImgIndex === index && "".concat(componentName, "-attach__tab-item--select")), @@ -560,15 +581,25 @@ export var BigImagePreview = /*#__PURE__*/React.forwardRef(function (props, ref) draggable: "false", className: classNames("".concat(componentName, "-attach__img"), "".concat(componentName, "-attach__img--fixed")), src: get(attachImg, "".concat(selectAttachImgIndex, ".url"), '') - })), showScore && /*#__PURE__*/React.createElement("div", { + })), (showScore || score) && /*#__PURE__*/React.createElement("div", { style: { bottom: 20 }, className: classNames("".concat(componentName, "__face-score")) - }, "\u4EBA\u8138\u8D28\u91CF\u5206\uFF1A".concat(Number(score).toFixed(2)))) : /*#__PURE__*/React.createElement(Empty, { + }, "\u4EBA\u8138\u8D28\u91CF\u5206\uFF1A".concat(Number(score).toFixed(2)))) : /*#__PURE__*/React.createElement("div", { + style: { + height: '100%', + display: 'flex', + justifyContent: 'center', + alignItems: 'center' + } + }, customEmpty || /*#__PURE__*/React.createElement(Empty, { + style: { + margin: 0 + }, image: Empty.PRESENTED_IMAGE_SIMPLE, description: "\u6682\u65E0\u6570\u636E" - })); + }))); }); BigImagePreview.displayName = 'BigImagePreview'; export default BigImagePreview; \ No newline at end of file diff --git a/packages/meta/es/BigImagePreview/bigImagePreviewHelper.js b/packages/meta/es/BigImagePreview/bigImagePreviewHelper.js index e69de29..05600e3 100644 --- a/packages/meta/es/BigImagePreview/bigImagePreviewHelper.js +++ b/packages/meta/es/BigImagePreview/bigImagePreviewHelper.js @@ -0,0 +1,270 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +import { cloneDeep, dataURLToBlob, get, isNull } from "@zhst/func"; +var proto = { + Common: { + AlgorithmVersion: { + VERSION_REID_HEAD_ATTR: '形体', + VERSION_FACE: '人脸', + VERSION_NON_MOTOR_VEHICLE: '非机动车' + } + } +}; +export var ALGORITHM_VERSION = _defineProperty(_defineProperty(_defineProperty({}, '7', '形体'), '4', '人脸'), '6', '非机动车'); +export var algorithmVersions = _toConsumableArray(Object.keys(ALGORITHM_VERSION)); +/** + * 格式化工具 + * @param originData + * @returns + */ +export var getOdRect = function getOdRect(originData) { + var data = get(originData, 'objects', []).filter(function (v) { + return !isNull(get(v, 'bboxRatio')) || get(v, 'objectIndex.objectId') !== '0'; + }).map(function (v, index) { + var rect = get(v, 'bboxRatio'); + var extendBox = get(v, 'extendBoxRatio'); + var frameTimestamp = get(v, 'timestamp'); //时间戳创建档案的时候需要 + var qualityScore = get(v, 'qualityScore'); + var algorithmVersion = get(v, 'objectType') === 'OBJECT_TYPE_PEDESTRAIN' ? 'VERSION_REID_HEAD_ATTR' : get(v, 'objectType') === 'OBJECT_TYPE_FACE' ? 'VERSION_FACE' : 'VERSION_REID_HEAD_ATTR'; + var objectRectIndex = algorithmVersion === 'VERSION_FACE' ? 0 : 1; + var objectType = get(v, 'objectType'); + var objectId = get(v, 'objectIndex.objectId'); + var sourceObjectId = get(v, 'sourceObjectId'); + return { + x: rect.x, + y: rect.y, + w: rect.w, + h: rect.h, + id: index, + qualityScore: qualityScore, + algorithmVersion: algorithmVersion, + objectRectIndex: objectRectIndex, + objectType: objectType, + objectId: objectId, + frameTimestamp: frameTimestamp, + sourceObjectId: sourceObjectId, + extendBox: extendBox + }; + }); + return data; +}; +export var getNormalization = function getNormalization(srcRect, maxW, maxH) { + var newRect = _objectSpread({}, srcRect); + newRect.x = srcRect.x / maxW; + newRect.y = srcRect.y / maxH; + newRect.w = srcRect.w / maxW; + newRect.h = srcRect.h / maxH; + if (newRect.x + newRect.w > 1) { + newRect.w = 1 - newRect.x; + } + if (newRect.y + newRect.h > 1) { + newRect.h = 1 - newRect.y; + } + return newRect; +}; +//传入od框 穿出 od扩展框 +export var getExtendRect = function getExtendRect(normalizationRect, imgW, imgH, type) { + var rect = { + x: normalizationRect.x * imgW, + y: normalizationRect.y * imgH, + w: normalizationRect.w * imgW, + h: normalizationRect.h * imgH + }; + var newRect; + if (type === proto.Common.AlgorithmVersion.VERSION_NON_MOTOR_VEHICLE) { + newRect = getBikeExtendRect(rect, imgW); + } else { + newRect = getOtherExtendRect(rect, imgW, imgH, type); + } + newRect = getNormalization(newRect, imgW, imgH); + return newRect; +}; +export var getBikeExtendRect = function getBikeExtendRect(rect, maxW) { + var newRect = _objectSpread({}, rect); + //向上扩大一倍 + var oldY = cloneDeep(rect.y); + newRect.y = newRect.y - newRect.h < 0 ? 0 : newRect.y - newRect.h; + newRect.h += oldY - newRect.y; + var newX = Math.round(newRect.x - newRect.w * 0.15); + if (newX < 0) { + newX = 0; + } + var newW = newRect.x - newX + newRect.w + Math.round(newRect.w * 0.15); + if (newX + newW > maxW) { + newW = maxW - newX; + } + newRect.x = newX; + newRect.w = newW; + return newRect; +}; +export var getOtherExtendRect = function getOtherExtendRect(srcRect, maxW, maxH, type) { + var wExtendRadio = 0.25; + var upExtendRadio = 0.25; + var downExtendRadio = 0.25; + var fixPersonExtend = true; + var nx = 0; + var nw = 0; + nx = srcRect.x - Math.round(srcRect.w * wExtendRadio); + if (nx < 0) { + nx = 0; + } + nw = srcRect.x - nx + srcRect.w + Math.round(srcRect.w * wExtendRadio); + if (nx + nw > maxW) { + nw = maxW - nx; + } + var ny = 0; + var nh = 0; + ny = srcRect.y - Math.round(upExtendRadio * srcRect.h); + if (ny < 0) { + ny = 0; + } + nh = srcRect.y - ny + srcRect.h + Math.round(srcRect.h * downExtendRadio); + if (ny + nh > maxH) { + nh = maxH - ny; + } + var newRect = { + x: nx, + y: ny, + w: nw, + h: nh + }; + if ((type === proto.Common.AlgorithmVersion.VERSION_REID_HEAD_ATTR || type === proto.Common.AlgorithmVersion.VERSION_FACE) && fixPersonExtend) { + var fixW = Math.round(nh * 0.75); + if (nw < fixW) { + // 应该扩展宽度 + var newX = nx + Math.round(nw / 2.0 - 0.5 * fixW); + if (newX < 0) { + newX = 0; + } + var newW = fixW; + if (newW + newX > maxW) { + newW = maxW - newX; + } + newRect = { + x: newX, + y: ny, + w: newW, + h: nh + }; + } else if (nw > fixW) { + // 应该扩展高度 + var fixH = Math.round(nw * 1.333); + var newY = ny + Math.round(nh / 2.0 - 0.5 * fixH); + if (newY < 0) { + newY = 0; + } + var newH = fixH; + if (newY + newH > maxH) { + newH = maxH - newY; + } + newRect = { + x: nx, + y: newY, + w: nw, + h: newH + }; + } + } + return newRect; +}; +export var getTransformRect = function getTransformRect(image, transform, rect) { + var canvasRect = { + x: rect.x, + y: rect.y, + x2: rect.x + rect.w, + y2: rect.h + rect.y + }; + //1.转成缩放前的坐标 + var translateX = transform.translateX, + translateY = transform.translateY, + scale = transform.scale, + rotate = transform.rotate; + var originAxisRect = { + x: (canvasRect.x - translateX) / scale, + y: (canvasRect.y - translateY) / scale, + x2: (canvasRect.x2 - translateX) / scale, + y2: (canvasRect.y2 - translateY) / scale + }; + //2.转成图片坐标 + //不考虑旋转 图片原点就是坐标原点 + var imgAxisRect = originAxisRect; + //但是旋转90度后图片不在坐标原点 加上这部分diff + if (rotate % 180 !== 0) { + //90度调整偏移量 + var offsetX = -(image.height - image.width) / 2; + var offsetY = -(image.width - image.height) / 2; + imgAxisRect = { + x: originAxisRect.x - offsetX, + y: originAxisRect.y - offsetY, + x2: originAxisRect.x2 - offsetX, + y2: originAxisRect.y2 - offsetY + }; + } + //3.限制框不要超出图片 + var imgW = image.width; + var imgH = image.height; + if (rotate % 180 !== 0) { + var _ref = [imgH, imgW]; + imgW = _ref[0]; + imgH = _ref[1]; + } + imgAxisRect.x = Math.min(imgW, Math.max(imgAxisRect.x, 0)); + imgAxisRect.y = Math.min(imgH, Math.max(imgAxisRect.y, 0)); + imgAxisRect.x2 = Math.min(imgW, Math.max(imgAxisRect.x2, 0)); + imgAxisRect.y2 = Math.min(imgH, Math.max(imgAxisRect.y2, 0)); + //获取归一化坐标 + var endRect = { + x: imgAxisRect.x2 > imgAxisRect.x ? imgAxisRect.x : imgAxisRect.x2, + y: imgAxisRect.y2 > imgAxisRect.y ? imgAxisRect.y : imgAxisRect.y2, + w: Math.abs(imgAxisRect.x2 - imgAxisRect.x), + h: Math.abs(imgAxisRect.y2 - imgAxisRect.y) + }; + return getNormalization(endRect, imgW, imgH); +}; + +//旋转图片后转成file 对象 +export var getRotateImg = function getRotateImg(image, rotate) { + var _commonCanvas$parentN; + var imgW = image.width; + var imgH = image.height; + if (rotate % 180 !== 0) { + var _ref2 = [imgH, imgW]; + imgW = _ref2[0]; + imgH = _ref2[1]; + } + var commonCanvas = document.createElement('canvas'); + commonCanvas.width = imgW; + commonCanvas.height = imgH; + commonCanvas.style.display = 'none'; + document.body.appendChild(commonCanvas); + var commonCtx = commonCanvas.getContext('2d'); + //移动到图片中心 旋转 + + commonCtx === null || commonCtx === void 0 || commonCtx.save(); + if (rotate % 180 !== 0) { + //90度调整偏移量 + commonCtx === null || commonCtx === void 0 || commonCtx.translate((image.height - image.width) / 2, (image.width - image.height) / 2); + } + commonCtx === null || commonCtx === void 0 || commonCtx.translate(image.width / 2, image.height / 2); + commonCtx === null || commonCtx === void 0 || commonCtx.rotate(rotate / 180 * Math.PI); + commonCtx === null || commonCtx === void 0 || commonCtx.translate(-image.width / 2, -image.height / 2); + commonCtx === null || commonCtx === void 0 || commonCtx.drawImage(image, 0, 0); + commonCtx === null || commonCtx === void 0 || commonCtx.restore(); + var dataUrl = commonCanvas.toDataURL('image/jpeg'); + var blobData = dataURLToBlob(dataUrl); + var file = new window.File([blobData], "".concat(new Date().getTime()), { + type: 'image/jpeg' + }); + (_commonCanvas$parentN = commonCanvas.parentNode) === null || _commonCanvas$parentN === void 0 || _commonCanvas$parentN.removeChild(commonCanvas); + return file; +}; \ No newline at end of file diff --git a/packages/meta/es/BigImagePreview/components/BtnGroup/index.js b/packages/meta/es/BigImagePreview/components/BtnGroup/index.js index 52e621c..c8854d7 100644 --- a/packages/meta/es/BigImagePreview/components/BtnGroup/index.js +++ b/packages/meta/es/BigImagePreview/components/BtnGroup/index.js @@ -1,6 +1,7 @@ import React from 'react'; import classNames from 'classnames'; -import { Button, Tooltip } from 'antd'; +// @ts-ignore +import { Button, Tooltip } from "../../.."; import Icon from "../../../iconfont"; import "./index.less"; var componentName = "zhst-image__btn-group"; diff --git a/packages/meta/es/BigImagePreview/index.less b/packages/meta/es/BigImagePreview/index.less index 829ebe1..7c8f030 100644 --- a/packages/meta/es/BigImagePreview/index.less +++ b/packages/meta/es/BigImagePreview/index.less @@ -2,6 +2,7 @@ position: relative; width: calc(100%); height: 100%; + font-size: 0; &__face-score { position: absolute; @@ -62,14 +63,9 @@ height: 202px; transition: all 200ms; - &--fixed { - } &--zoomin { height: 100%; - - &--fixed { - } } &__tab { diff --git a/packages/meta/es/ImageEditor/cropper/event.js b/packages/meta/es/ImageEditor/cropper/event.js index bd8219c..3d3893a 100644 --- a/packages/meta/es/ImageEditor/cropper/event.js +++ b/packages/meta/es/ImageEditor/cropper/event.js @@ -34,7 +34,7 @@ export default { try { handler.remove(); } catch (error) { - warn('CROP:REMOVE_EVENT_FAIL,', error); + warn('CROP:REMOVE_EVENT_FAIL: ', error); } } }, diff --git a/packages/meta/es/VideoPlayer/VideoPlayer.js b/packages/meta/es/VideoPlayer/VideoPlayer.js index 8bea43e..efae045 100644 --- a/packages/meta/es/VideoPlayer/VideoPlayer.js +++ b/packages/meta/es/VideoPlayer/VideoPlayer.js @@ -14,9 +14,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'; -import { noop, get, addEventListenerWrapper, dataURLToBlob, nextTick, toRealNumber, getTransforms, formatDurationTime -// @ts-ignore -} from '@zhst/func'; +import { noop, get, addEventListenerWrapper, dataURLToBlob, nextTick, toRealNumber, getTransforms, formatDurationTime } from '@zhst/func'; import Align from 'rc-align'; import { useLatest, useUpdateEffect, useFullscreen, useUnmount } from '@zhst/hooks'; import classNames from 'classnames'; @@ -48,7 +46,9 @@ var VideoPlayer = /*#__PURE__*/forwardRef(function (props, ref) { screenshotButtonRender = _props$screenshotButt2 === void 0 ? function () { return /*#__PURE__*/React.createElement("div", { style: { - color: '#fff' + color: '#fff', + width: '80px', + top: 0 } }, "\u56DE\u8C03DOM"); } : _props$screenshotButt2, diff --git a/packages/meta/es/VideoPlayer/components/FlvPlayer/index.js b/packages/meta/es/VideoPlayer/components/FlvPlayer/index.js index a0fa271..b52198d 100644 --- a/packages/meta/es/VideoPlayer/components/FlvPlayer/index.js +++ b/packages/meta/es/VideoPlayer/components/FlvPlayer/index.js @@ -19,7 +19,6 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } import React, { Component } from 'react'; import flvjs from 'flv.js'; -// @ts-ignore import { isEqual } from '@zhst/func'; export var FLV_EVENT = flvjs.Events; var VideoPlayer = /*#__PURE__*/function (_Component) { diff --git a/packages/meta/es/index.js b/packages/meta/es/index.js index 0896856..52607d6 100644 --- a/packages/meta/es/index.js +++ b/packages/meta/es/index.js @@ -41,4 +41,6 @@ export { default as Card } from "./card"; export { default as Skeleton } from "./skeleton"; export { default as Tooltip } from "./tooltip"; export { default as Tour } from "./tour"; -export { default as Segmented } from "./segmented"; \ No newline at end of file +export { default as Segmented } from "./segmented"; +export { default as App } from "./app"; +export { default as notification } from "./notification"; \ No newline at end of file diff --git a/packages/meta/es/utils/constants.js b/packages/meta/es/utils/constants.js index e2357aa..af17f9b 100644 --- a/packages/meta/es/utils/constants.js +++ b/packages/meta/es/utils/constants.js @@ -1,5 +1,5 @@ export var CROP_TYPE = { - CUSTOM: 'CSUTOM', + CUSTOM: 'CUSTOM', AUTO: 'AUTO' }; export var defaultAlignOption = { diff --git a/packages/meta/lib/VideoPlayer/VideoPlayer.d.ts b/packages/meta/lib/VideoPlayer/VideoPlayer.d.ts new file mode 100644 index 0000000..cf56091 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/VideoPlayer.d.ts @@ -0,0 +1,18 @@ +import React, { Dispatch, ReactElement, SetStateAction } from 'react'; +import { Rect, IScreenshotButtonProp, AlignType } from '@zhst/types'; +import './index.less'; +export interface VideoViewProps { + url: string; + maxDuration?: number; + screenshotButtonAlign?: AlignType; + screenshotButtonRender?: (screenshotButtonProp: IScreenshotButtonProp) => ReactElement; + defautlNormalizationRect?: Rect; + onCropChange?: (showCrop: boolean, normalizationRect: null | Rect) => void; +} +export interface VideoViewRef { + cropAble: boolean; + setShowCrop: Dispatch>; + downloadVideoframe: () => void; +} +declare const VideoPlayer: React.ForwardRefExoticComponent>; +export default VideoPlayer; diff --git a/packages/meta/lib/VideoPlayer/VideoPlayer.js b/packages/meta/lib/VideoPlayer/VideoPlayer.js new file mode 100644 index 0000000..64b8172 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/VideoPlayer.js @@ -0,0 +1,592 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/VideoPlayer/VideoPlayer.tsx +var VideoPlayer_exports = {}; +__export(VideoPlayer_exports, { + default: () => VideoPlayer_default +}); +module.exports = __toCommonJS(VideoPlayer_exports); +var import_react = __toESM(require("react")); +var import_func = require("@zhst/func"); +var import_rc_align = __toESM(require("rc-align")); +var import_hooks = require("@zhst/hooks"); +var import_classnames = __toESM(require("classnames")); +var import_downloadjs = __toESM(require("downloadjs")); +var import__ = require(".."); +var import_iconfont = __toESM(require("../iconfont")); +var import_ImageEditor = require("../ImageEditor"); +var import_FlvPlayer = __toESM(require("./components/FlvPlayer")); +var import_Progress = __toESM(require("./components/Progress")); +var import_Loading = __toESM(require("./components/Loading")); +var import_constants = require("../utils/constants"); +var import_videoPlayerHelper = require("./videoPlayerHelper"); +var import_index = require("./index.less"); +var componentName = `zhst-image__video-view`; +var VideoPlayer = (0, import_react.forwardRef)((props, ref) => { + const { + url, + maxDuration = 20, + screenshotButtonAlign = { + points: ["bl", "br"], + offset: [6, 0], + overflow: { + adjustX: true, + adjustY: true + } + }, + screenshotButtonRender = () => /* @__PURE__ */ import_react.default.createElement("div", { style: { color: "#fff", width: "80px", top: 0 } }, "回调DOM"), + onCropChange, + defautlNormalizationRect: defaultNormalizationRect + } = props; + const containerRef = (0, import_react.useRef)(null); + const videoRef = (0, import_react.useRef)(null); + const videoInsRef = (0, import_react.useRef)(null); + const [playSeq, setPlaySeq] = (0, import_react.useState)(0); + const videoRemoveListener = (0, import_react.useRef)(import_func.noop); + const loadingTimeRef = (0, import_react.useRef)(0); + const delayLoadingTimer = (0, import_react.useRef)(null); + const [isReady, setIsReady] = (0, import_react.useState)(false); + const [isPlay, setIsPlay] = (0, import_react.useState)(false); + const [isEnd, setIsEnd] = (0, import_react.useState)(false); + const [isError, setIsError] = (0, import_react.useState)(false); + const [isVideoLoadFinished, setIsVideoLoadFinish] = (0, import_react.useState)(false); + const [playTime, setPlayTime] = (0, import_react.useState)(0); + const [isLoadingVideo, setIsLoadingVideo] = (0, import_react.useState)(true); + const [isDelayLoading, setIsDelayLoading] = (0, import_react.useState)(false); + const latestIsLoadingVideo = (0, import_hooks.useLatest)(isLoadingVideo); + const setIsLoadingVideoWrapper = (isLoading) => { + setIsLoadingVideo((preLoading) => { + if (!preLoading && isLoading) { + loadingTimeRef.current = (/* @__PURE__ */ new Date()).getTime(); + } + if (!isLoading) { + loadingTimeRef.current = null; + } + if (!isLoading) { + setIsDelayLoading(false); + } + if (!delayLoadingTimer.current && preLoading) { + delayLoadingTimer.current = setTimeout(() => { + if (latestIsLoadingVideo.current) { + setIsDelayLoading(true); + } + delayLoadingTimer.current = null; + }, 200); + } + return isLoading; + }); + }; + (0, import_react.useEffect)(() => { + let timer = setInterval(() => { + if (loadingTimeRef.current) { + if ((/* @__PURE__ */ new Date()).getTime() - loadingTimeRef.current > 1e3 * 30) { + checkIsErr(); + } + } + }, 1e3); + return () => { + clearInterval(timer); + }; + }, []); + (0, import_hooks.useUpdateEffect)(() => { + var _a, _b; + if (isEnd) { + (_b = (_a = videoInsRef == null ? void 0 : videoInsRef.current) == null ? void 0 : _a.pause) == null ? void 0 : _b.call(_a); + } + }, [isEnd]); + const checkIsErr = () => { + var _a, _b; + setIsError(true); + try { + (_b = (_a = videoInsRef == null ? void 0 : videoInsRef.current) == null ? void 0 : _a.destroy) == null ? void 0 : _b.call(_a); + } catch (error) { + console.error(error); + } + }; + const latestMaxDuration = (0, import_hooks.useLatest)(maxDuration); + const initPlayer = (0, import_react.useCallback)((ins, dom) => { + videoRef.current = dom; + videoInsRef.current = ins; + const maxDuration2 = latestMaxDuration.current || 0; + let video = dom; + let errorLister = (e) => { + checkIsErr(); + console.error("视频出错了", e, video.currentTime); + }; + let waitingListener = () => { + setIsLoadingVideoWrapper(true); + }; + let playingListener = () => { + setIsLoadingVideoWrapper(false); + setIsError(false); + }; + let playLister = () => { + setIsPlay(true); + setIsError(false); + }; + let pauseListener = () => { + setIsPlay(false); + }; + let endedListner = () => { + setIsEnd(true); + setIsVideoLoadFinish(true); + }; + let timeupdateListner = () => { + let nowTime = video.currentTime; + if (nowTime >= maxDuration2) { + setIsEnd(true); + setIsVideoLoadFinish(true); + } + setPlayTime(nowTime); + }; + let windowErrorHandle = (errorEvent) => { + try { + if (errorEvent["message"] == "Uncaught TypeError: Cannot read property 'flushStashedSamples' of null") { + checkIsErr(); + console.error("视频出错了 window监听", errorEvent); + } + } catch (error) { + console.error(error); + } + }; + video.addEventListener("error", errorLister); + video.addEventListener("waiting", waitingListener); + video.addEventListener("playing", playingListener); + video.addEventListener("play", playLister); + video.addEventListener("pause", pauseListener); + video.addEventListener("ended", endedListner); + video.addEventListener("timeupdate", timeupdateListner); + window.addEventListener("error", windowErrorHandle); + videoRemoveListener.current = () => { + video.removeEventListener("error", errorLister); + video.removeEventListener("waiting", waitingListener); + video.removeEventListener("playing", playingListener); + video.removeEventListener("play", playLister); + video.removeEventListener("pause", pauseListener); + video.removeEventListener("ended", endedListner); + video.removeEventListener("timeupdate", timeupdateListner); + window.removeEventListener("error", windowErrorHandle); + }; + videoInsRef == null ? void 0 : videoInsRef.current.on(import_FlvPlayer.FLV_EVENT.ERROR, (type, errDetail, info) => { + checkIsErr(); + console.error("videoInsRef 错误", type, errDetail, info, video.currentTime); + }); + let playPromise = videoInsRef == null ? void 0 : videoInsRef.current.play(); + setIsReady(true); + playPromise.then(() => { + setIsReady(true); + }).catch((...arg) => { + try { + } catch (error) { + } + console.error("playPromise视频出错了", arg); + }); + }, []); + (0, import_hooks.useUnmount)(() => { + try { + videoRemoveListener.current(); + } catch (e) { + console.error(e); + } + }); + const reload = async () => { + if (videoInsRef.current) { + let oldTime = videoInsRef.current.currentTime; + videoInsRef.current.currentTime = 0; + if (oldTime === videoInsRef.current.currentTime) { + setIsReady(false); + setIsPlay(false); + setIsLoadingVideoWrapper(false); + setIsReady(false); + setIsEnd(false); + setIsVideoLoadFinish(false); + setPlayTime(0); + try { + videoRemoveListener.current(); + } catch (error) { + console.error(error); + } + setPlaySeq((pre) => pre + 1); + return; + } + videoInsRef.current.play(); + } + setPlayTime(0); + setIsEnd(false); + }; + const seek = (v) => { + if (videoInsRef.current && isVideoLoadFinished) { + setPlayTime(parseFloat(v)); + videoInsRef.current.currentTime = parseFloat(v); + } else { + import__.message.warning("待视频加载完,才可操作进度条"); + } + }; + const [isFullscreen, { toggleFullscreen }] = (0, import_hooks.useFullscreen)(containerRef, { + pageFullscreen: true + }); + const showMaxDuration = !!maxDuration ? maxDuration : (0, import_func.toRealNumber)((0, import_func.get)(videoRef, "current.duration", 0)); + const showSlider = videoInsRef.current && isVideoLoadFinished; + const showStatus = (0, import_videoPlayerHelper.getShowStatus)(isDelayLoading, isEnd, isError); + const corpContainerRef = (0, import_react.useRef)(); + const cropInsRef = (0, import_react.useRef)(null); + const [showCrop, setShowCrop] = (0, import_react.useState)(false); + const isFirstFlagRef = (0, import_react.useRef)(true); + (0, import_react.useEffect)(() => { + const isFirst = isFirstFlagRef.current; + if (!isLoadingVideo && isReady && isFirst && defaultNormalizationRect && !showStatus) { + (0, import_func.nextTick)(() => { + setShowCrop(true); + }); + } + }, [isLoadingVideo, showStatus]); + const alginContainerRef = (0, import_react.useRef)(null); + const alignRef = (0, import_react.useRef)(null); + const [cropRect, setCropRect] = (0, import_react.useState)(null); + (0, import_react.useEffect)(() => { + var _a, _b; + showCrop ? (_a = videoInsRef == null ? void 0 : videoInsRef.current) == null ? void 0 : _a.pause() : (_b = videoInsRef == null ? void 0 : videoInsRef.current) == null ? void 0 : _b.play(); + }, [showCrop]); + (0, import_react.useEffect)(() => { + var _a; + let handlerCropStart; + let handlerCropEnd; + setCropRect(null); + if (!isReady) + return; + if (showCrop) { + handlerCropStart = (0, import_func.addEventListenerWrapper)(corpContainerRef.current, import_ImageEditor.EVENT_CROP_START, () => { + setCropRect(null); + }); + handlerCropEnd = (0, import_func.addEventListenerWrapper)(corpContainerRef.current, import_ImageEditor.EVENT_CROP_END, (event) => { + var _a2, _b; + const data = event.detail; + setCropRect({ + x: data.left, + y: data.top, + w: data.width, + h: data.height + }); + (_b = (_a2 = alignRef == null ? void 0 : alignRef.current) == null ? void 0 : _a2.forceAlign) == null ? void 0 : _b.call(_a2); + }); + let video = videoRef.current; + let scale = Math.min( + video.offsetWidth / video.videoWidth, + video.offsetHeight / video.videoHeight + ); + let finalVideoWidth = video.videoWidth * scale; + let finalVideoHeight = video.videoHeight * scale; + let cropBoxLimited = { + width: finalVideoWidth, + height: finalVideoHeight, + top: (video.offsetHeight - finalVideoHeight) / 2, + left: (video.offsetWidth - finalVideoWidth) / 2 + }; + let canvas = document.createElement("canvas"); + canvas.width = video.offsetWidth; + canvas.height = video.offsetHeight; + canvas.style.display = "none"; + document.body.appendChild(canvas); + let ctx = canvas.getContext("2d"); + ctx == null ? void 0 : ctx.drawImage( + video, + (video.offsetWidth - finalVideoWidth) / 2, + (video.offsetHeight - finalVideoHeight) / 2, + finalVideoWidth, + finalVideoHeight + ); + let imageData = canvas.toDataURL("image/png"); + (_a = canvas.parentNode) == null ? void 0 : _a.removeChild(canvas); + const isFirst = isFirstFlagRef.current; + let initialCropBoxData = null; + if (isFirst && defaultNormalizationRect) { + initialCropBoxData = { + left: defaultNormalizationRect.x * finalVideoWidth + cropBoxLimited.left, + top: defaultNormalizationRect.y * finalVideoHeight + cropBoxLimited.top, + width: defaultNormalizationRect.w * finalVideoWidth, + height: defaultNormalizationRect.h * finalVideoHeight + }; + } + isFirstFlagRef.current = false; + cropInsRef.current = new import_ImageEditor.Cropper(corpContainerRef.current, { + showMask: true, + cropBoxLimited, + img: imageData, + initialCropBoxData + }); + } + return () => { + var _a2, _b; + handlerCropStart == null ? void 0 : handlerCropStart.remove(); + handlerCropEnd == null ? void 0 : handlerCropEnd.remove(); + (_b = (_a2 = cropInsRef == null ? void 0 : cropInsRef.current) == null ? void 0 : _a2.destroy) == null ? void 0 : _b.call(_a2); + cropInsRef.current = null; + }; + }, [showCrop, isReady]); + const latestCropRect = (0, import_hooks.useLatest)(cropRect); + const getCropInfo = async () => { + var _a; + const cropRect2 = latestCropRect.current; + let video = videoRef.current; + if (!video) + return; + let rectList = []; + let extendRectList = []; + let selectIndex = 0; + let scale = Math.min( + video.offsetWidth / video.videoWidth, + video.offsetHeight / video.videoHeight + ); + let finalVideoWidth = video.videoWidth * scale; + let finalVideoHeight = video.videoHeight * scale; + let canvas = document.createElement("canvas"); + canvas.width = finalVideoWidth; + canvas.height = finalVideoHeight; + canvas.style.display = "none"; + document.body.appendChild(canvas); + let ctx = canvas.getContext("2d"); + ctx.drawImage( + video, + 0, + 0, + finalVideoWidth, + finalVideoHeight + ); + let base64 = canvas.toDataURL("image/jpeg"); + const blobData = (0, import_func.dataURLToBlob)(base64); + (_a = canvas.parentNode) == null ? void 0 : _a.removeChild(canvas); + const file = new window.File([blobData], `${(/* @__PURE__ */ new Date()).getTime()}`); + let newRect = { + w: cropRect2.w / finalVideoWidth, + h: cropRect2.h / finalVideoHeight, + x: (cropRect2.x - (video.offsetWidth - finalVideoWidth) / 2) / finalVideoWidth, + y: (cropRect2.y - (video.offsetHeight - finalVideoHeight) / 2) / finalVideoHeight + }; + rectList.push(newRect); + extendRectList.push(newRect); + extendRectList.forEach(async (rect, index) => { + extendRectList[index] = { + ...rect + }; + }); + return { + rectList, + extendRectList, + selectIndex, + file + }; + }; + (0, import_react.useEffect)(() => { + let normalizationRect = null; + if (showCrop && cropRect) { + let video = videoRef.current; + let scale = Math.min( + video.offsetWidth / video.videoWidth, + video.offsetHeight / video.videoHeight + ); + let finalVideoWidth = video.videoWidth * scale; + let finalVideoHeight = video.videoHeight * scale; + let cropBoxLimited = { + width: finalVideoWidth, + height: finalVideoHeight, + top: (video.offsetHeight - finalVideoHeight) / 2, + left: (video.offsetWidth - finalVideoWidth) / 2 + }; + normalizationRect = { + x: (cropRect.x - cropBoxLimited.left) / cropBoxLimited.width, + y: (cropRect.y - cropBoxLimited.top) / cropBoxLimited.height, + w: cropRect.w / cropBoxLimited.width, + h: cropRect.h / cropBoxLimited.height + }; + } + onCropChange == null ? void 0 : onCropChange(showCrop, normalizationRect); + }, [showCrop, cropRect]); + const downloadVideoframe = (0, import_react.useCallback)(async () => { + var _a, _b; + try { + (_b = (_a = videoInsRef == null ? void 0 : videoInsRef.current) == null ? void 0 : _a.pause) == null ? void 0 : _b.call(_a); + let video = videoRef.current; + var canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + let base64; + if (video.readyState === 0) { + ctx == null ? void 0 : ctx.clearRect(0, 0, canvas.width, canvas.height); + canvas.width = video.offsetWidth; + canvas.height = video.offsetHeight; + ctx.fillStyle = "black"; + ctx == null ? void 0 : ctx.fillRect(0, 0, canvas.width, canvas.height); + base64 = canvas.toDataURL(); + } else { + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; + ctx == null ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height); + base64 = canvas.toDataURL("image/png"); + } + (0, import_downloadjs.default)(base64); + } catch (error) { + console.error(error); + } + }, []); + const latestIsReady = (0, import_hooks.useLatest)(isReady); + const cropAble = !showStatus && isReady; + (0, import_react.useImperativeHandle)(ref, () => ({ + cropAble, + setShowCrop: (dispatch) => { + const isReady2 = latestIsReady.current; + if (!isReady2) + return; + setShowCrop(dispatch); + }, + downloadVideoframe + })); + return /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_classnames.default)(`${componentName}`), ref: containerRef }, url && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement( + import_FlvPlayer.default, + { + playId: playSeq, + autoPlay: true, + className: (0, import_classnames.default)(`${componentName}-flv`), + type: url.startsWith("http") ? "mp4" : "flv", + url, + config: { + enableStashBuffer: true, + stashInitialSize: 1024 * 700, + isLive: true, + hasAudio: false, + hasVideo: true + }, + onCreat: initPlayer + } + ), /* @__PURE__ */ import_react.default.createElement( + "div", + { + className: (0, import_classnames.default)(`${componentName}-crop-container`), + ref: corpContainerRef, + style: { + display: isFullscreen ? "none" : "block" + } + } + ), showCrop && cropRect && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement( + "div", + { + ref: alginContainerRef, + className: (0, import_classnames.default)(`${componentName}-align`), + style: Object.assign( + { + width: cropRect.w, + height: cropRect.h + }, + (0, import_func.getTransforms)({ + translateX: cropRect.x, + translateY: cropRect.y + }) + ) + } + ), /* @__PURE__ */ import_react.default.createElement( + import_rc_align.default, + { + ref: alignRef, + monitorWindowResize: true, + align: screenshotButtonAlign, + target: function() { + return alginContainerRef.current; + } + }, + screenshotButtonRender({ + model: "IMAGE", + getCropInfo, + setShowCrop, + cropType: import_constants.CROP_TYPE["CUSTOM"] + }) + )), !showCrop && /* @__PURE__ */ import_react.default.createElement("div", { className: `${componentName}-opt` }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement( + import__.Button, + { + type: "text", + onClick: () => { + var _a, _b; + if (!isPlay) { + (_a = videoInsRef == null ? void 0 : videoInsRef.current) == null ? void 0 : _a.play(); + setShowCrop(false); + } else { + (_b = videoInsRef == null ? void 0 : videoInsRef.current) == null ? void 0 : _b.pause(); + } + } + }, + /* @__PURE__ */ import_react.default.createElement( + import_iconfont.default, + { + styles: { + color: "#fff", + display: "flex" + }, + color: "#1890ff", + icon: !isPlay ? "icon-shipinbofang" : "icon-shipinzanting" + } + ) + )), /* @__PURE__ */ import_react.default.createElement( + "div", + { + className: `${componentName}-opt-range`, + onClick: (e) => { + e.stopPropagation(); + } + }, + /* @__PURE__ */ import_react.default.createElement( + import_Progress.default, + { + value: playTime, + min: 0, + max: showMaxDuration, + showSlider, + onChange: seek + } + ), + /* @__PURE__ */ import_react.default.createElement("div", null, (0, import_func.formatDurationTime)(playTime), "/", (0, import_func.formatDurationTime)(showMaxDuration)) + ), /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement( + import__.Button, + { + type: "text", + onClick: (e) => { + e.stopPropagation(); + toggleFullscreen(); + } + }, + /* @__PURE__ */ import_react.default.createElement( + import_iconfont.default, + { + styles: { + color: "#fff", + display: "flex" + }, + size: 18, + icon: isFullscreen ? "icon-cancle_fullscreen" : "icon-fullscreen" + } + ) + ))), !!showStatus && /* @__PURE__ */ import_react.default.createElement(import_Loading.default, { status: showStatus, reload: () => reload() }))); +}); +var VideoPlayer_default = VideoPlayer; diff --git a/packages/meta/lib/VideoPlayer/components/FlvPlayer/index.d.ts b/packages/meta/lib/VideoPlayer/components/FlvPlayer/index.d.ts new file mode 100644 index 0000000..646b267 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/components/FlvPlayer/index.d.ts @@ -0,0 +1,46 @@ +import React, { Component, CSSProperties } from 'react'; +import flvjs from 'flv.js'; +export declare const FLV_EVENT: Readonly; +export interface VideoPlayerProps { + className: string; + style?: CSSProperties; + type: string; + isLive?: boolean; + cors?: boolean; + withCredentials?: boolean; + playId?: number; + hasAudio?: boolean; + hasVideo?: boolean; + duration?: number; + filesize?: number; + url?: string; + autoPlay?: boolean; + onCreat?: any; + /** + * @see https://github.com/Bilibili/flv.js/blob/master/docs/api.md#config + */ + config: object; +} +export default class VideoPlayer extends Component { + state: { + curPlayUrl: string; + shouldReinit: boolean; + }; + flvPlayer: any; + videoElement: null; + static getDerivedStateFromProps: (nextProps: { + url?: any; + playId?: any; + }, prevState: { + curPlayUrl?: any; + playId?: any; + }) => { + playId: any; + curPlayUrl: any; + shouldReinit: boolean; + } | null; + initFlv: ($video: null) => void; + componentWillUnmount(): void; + componentDidUpdate(): void; + render(): React.JSX.Element; +} diff --git a/packages/meta/lib/VideoPlayer/components/FlvPlayer/index.js b/packages/meta/lib/VideoPlayer/components/FlvPlayer/index.js new file mode 100644 index 0000000..38230d2 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/components/FlvPlayer/index.js @@ -0,0 +1,144 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/VideoPlayer/components/FlvPlayer/index.tsx +var FlvPlayer_exports = {}; +__export(FlvPlayer_exports, { + FLV_EVENT: () => FLV_EVENT, + default: () => VideoPlayer +}); +module.exports = __toCommonJS(FlvPlayer_exports); +var import_react = __toESM(require("react")); +var import_flv = __toESM(require("flv.js")); +var import_func = require("@zhst/func"); +var FLV_EVENT = import_flv.default.Events; +var VideoPlayer = class extends import_react.Component { + constructor() { + super(...arguments); + this.state = { + curPlayUrl: "", + shouldReinit: false + }; + this.flvPlayer = null; + this.videoElement = null; + this.initFlv = ($video) => { + this.videoElement = $video; + const { className, autoPlay = true, config = {}, onCreat, playId, ...others } = this.props; + if ($video) { + if (import_flv.default.isSupported() && this.props.url && this.props.url) { + const reload = () => { + if (this.flvPlayer && this.flvPlayer.destroy) { + try { + this.flvPlayer.destroy(); + } catch (error) { + console.error(error); + } + } + let flvPlayer = import_flv.default.createPlayer({ ...others }, { + deferLoadAfterSourceOpen: false, + ...config + }); + flvPlayer.attachMediaElement($video); + flvPlayer.load(); + this.flvPlayer = flvPlayer; + let controller = this.flvPlayer._transmuxer._controller; + let wsLoader = controller._ioctl._loader; + const oldWsOnCompleteFunc = wsLoader._onComplete; + wsLoader._onComplete = function() { + if (!controller._remuxer) { + controller._remuxer = { + destroy: () => { + console.log("组件销毁"); + }, + flushStashedSamples: () => { + console.log("flushStashedSamples"); + } + }; + } + oldWsOnCompleteFunc(); + }; + this.flvPlayer.reload = reload; + onCreat && onCreat(this.flvPlayer, $video); + }; + reload(); + onCreat && onCreat(this.flvPlayer, $video); + } + } + }; + } + componentWillUnmount() { + var _a, _b; + if (this.flvPlayer) { + (_a = this.flvPlayer) == null ? void 0 : _a.unload(); + (_b = this.flvPlayer) == null ? void 0 : _b.detachMediaElement(); + } + } + componentDidUpdate() { + if (this.state.shouldReinit) { + this.setState({ shouldReinit: false }); + this.initFlv(this.videoElement); + } + } + render() { + const { className, style } = this.props; + return /* @__PURE__ */ import_react.default.createElement( + "video", + { + muted: true, + preload: "metadata", + className, + style: Object.assign( + { + width: "100%", + height: "100%" + }, + style ? style : {} + ), + ref: this.initFlv + } + ); + } +}; +VideoPlayer.getDerivedStateFromProps = (nextProps, prevState) => { + const { playId = 0 } = nextProps; + const { playId: prePlayId = 0 } = prevState; + if (nextProps.url !== void 0) { + if (!(0, import_func.isEqual)(nextProps.url, prevState.curPlayUrl) || !(0, import_func.isEqual)(playId, prePlayId)) { + return { + playId, + curPlayUrl: nextProps.url, + shouldReinit: true + }; + } + } + return null; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + FLV_EVENT +}); diff --git a/packages/meta/lib/VideoPlayer/components/Loading/index.d.ts b/packages/meta/lib/VideoPlayer/components/Loading/index.d.ts new file mode 100644 index 0000000..1509947 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/components/Loading/index.d.ts @@ -0,0 +1,8 @@ +import { FC } from 'react'; +import './index.less'; +export interface ILoading { + status: 'LOADING' | 'COMPLETED' | 'END' | 'ERROR' | null; + reload: () => void; +} +declare const Loading: FC; +export default Loading; diff --git a/packages/meta/lib/VideoPlayer/components/Loading/index.js b/packages/meta/lib/VideoPlayer/components/Loading/index.js new file mode 100644 index 0000000..150c54d --- /dev/null +++ b/packages/meta/lib/VideoPlayer/components/Loading/index.js @@ -0,0 +1,84 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/VideoPlayer/components/Loading/index.tsx +var Loading_exports = {}; +__export(Loading_exports, { + default: () => Loading_default +}); +module.exports = __toCommonJS(Loading_exports); +var import_react = __toESM(require("react")); +var import_antd = require("antd"); +var import_classnames = __toESM(require("classnames")); +var import_iconfont = __toESM(require("../../../iconfont")); +var import_index = require("./index.less"); +var componentName = `zhst-image__video-view`; +var Loading = (props) => { + const { status, reload } = props; + return /* @__PURE__ */ import_react.default.createElement( + "div", + { + className: (0, import_classnames.default)(`${componentName}__player-mask`), + onClick: (e) => { + e.stopPropagation(); + } + }, + status === "LOADING" && /* @__PURE__ */ import_react.default.createElement(import_antd.Spin, { tip: "加载中...", spinning: status === "LOADING" }), + status === "END" && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement( + "div", + { + onClick: () => { + reload(); + }, + className: (0, import_classnames.default)(`${componentName}__icon-wraper`) + }, + /* @__PURE__ */ import_react.default.createElement( + import_iconfont.default, + { + styles: { + fill: "#ffffff", + color: "#ffffff" + }, + size: 54, + icon: "icon-shuaxin" + } + ) + ), /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_classnames.default)(`${componentName}__player-mask-title`) }, "点击刷新后,将重新播放")), + status === "ERROR" && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_classnames.default)(`${componentName}__icon-wraper`) }, /* @__PURE__ */ import_react.default.createElement( + import_iconfont.default, + { + styles: { + color: "#ffffff" + }, + size: 54, + icon: "icon-jiazaishibai" + } + )), /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_classnames.default)(`${componentName}__player-mask-title`) }, "视频加载失败,", /* @__PURE__ */ import_react.default.createElement("a", { onClick: reload }, " ", "刷新"))) + ); +}; +var Loading_default = Loading; diff --git a/packages/meta/lib/VideoPlayer/components/Loading/index.less b/packages/meta/lib/VideoPlayer/components/Loading/index.less new file mode 100644 index 0000000..b6c11a2 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/components/Loading/index.less @@ -0,0 +1,53 @@ +.zhst-image__video-view__player-mask { + position: absolute; + width: 100%; + height: 100%; + z-index: 99; + top: 0; + right: 0; + bottom: 0; + left: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: rgb(4 4 4 / 70%); + + &--bg { + z-index: 999; + background-color: rgb(4 4 4 / 100%); + } + + i { + cursor: pointer; + } + + &-title { + margin-top: 12px; + color: #fff; + text-align: center; + + & a { + color: #09f; + cursor: pointer; + text-decoration: underline; + } + } +} + +.zhst-image__video-view__icon-wraper { + display: flex; + width: 80px; + height: 80px; + align-items: center; + justify-content: center; + background-color: rgb(255 255 255 / 10%); + border-radius: 50%; + cursor: pointer; + line-height: 80px; + text-align: center; + + // &:hover { + // background: #0099ff; + // } +} diff --git a/packages/meta/lib/VideoPlayer/components/Progress/index.d.ts b/packages/meta/lib/VideoPlayer/components/Progress/index.d.ts new file mode 100644 index 0000000..7fb0a10 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/components/Progress/index.d.ts @@ -0,0 +1,10 @@ +import React from 'react'; +import type { SliderSingleProps } from 'antd'; +import './index.less'; +export interface RangeWrapperProps extends SliderSingleProps { + showSlider: boolean; + className?: string; + min: number; +} +export declare const Range: React.FC; +export default Range; diff --git a/packages/meta/lib/VideoPlayer/components/Progress/index.js b/packages/meta/lib/VideoPlayer/components/Progress/index.js new file mode 100644 index 0000000..92e0d85 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/components/Progress/index.js @@ -0,0 +1,60 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/VideoPlayer/components/Progress/index.tsx +var Progress_exports = {}; +__export(Progress_exports, { + Range: () => Range, + default: () => Progress_default +}); +module.exports = __toCommonJS(Progress_exports); +var import_react = __toESM(require("react")); +var import_classnames = __toESM(require("classnames")); +var import_antd = require("antd"); +var import_index = require("./index.less"); +var componentName = `zhst-image__range`; +var Range = (props) => { + const { className, style, showSlider = true, ...others } = props; + return /* @__PURE__ */ import_react.default.createElement( + "div", + { + style, + className: (0, import_classnames.default)( + `${componentName}`, + !showSlider && `${componentName}--no-slider`, + className + ) + }, + /* @__PURE__ */ import_react.default.createElement(import_antd.Slider, { ...others }) + ); +}; +var Progress_default = Range; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + Range +}); diff --git a/packages/meta/lib/VideoPlayer/components/Progress/index.less b/packages/meta/lib/VideoPlayer/components/Progress/index.less new file mode 100644 index 0000000..e922211 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/components/Progress/index.less @@ -0,0 +1,49 @@ +.zhst-image__range { + position: relative; + + &--no-slider { + .next-range-slider { + display: none; + } + } + + & .next-range .next-range-track { + height: 8px; + margin-top: -4px; + border-radius: 8px; + } + + & .next-range .next-range-selected { + height: 8px; + margin-top: -4px; + border-radius: 8px; + } + + & .next-range .next-range-slider-inner { + width: 14px; + height: 14px; + border-color: #fff; + margin-top: -7px; + margin-left: -7px; + background-color: #0098ff; + } + + & .next-range .next-range-slider { + width: 14px; + height: 14px; + margin-top: -7px; + margin-left: -7px; + } + + & .next-range.simulation-click>.next-range-slider-inner { + border: 2px solid #fff !important; + } + + & .next-range .next-range-frag.next-range-active .next-range-slider .next-range-slider-inner { + border: 2px solid #fff !important; + } + + & .next-range .next-range-slider.next-range-slider-moving .next-range-slider-inner { + border: 2px solid #fff !important; + } +} diff --git a/packages/meta/lib/VideoPlayer/index.d.ts b/packages/meta/lib/VideoPlayer/index.d.ts new file mode 100644 index 0000000..a1993e1 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/index.d.ts @@ -0,0 +1,3 @@ +import VideoPlayer from './VideoPlayer'; +export type { VideoViewProps, VideoViewRef } from './VideoPlayer'; +export default VideoPlayer; diff --git a/packages/meta/lib/VideoPlayer/index.js b/packages/meta/lib/VideoPlayer/index.js new file mode 100644 index 0000000..7d136ea --- /dev/null +++ b/packages/meta/lib/VideoPlayer/index.js @@ -0,0 +1,36 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/VideoPlayer/index.tsx +var VideoPlayer_exports = {}; +__export(VideoPlayer_exports, { + default: () => VideoPlayer_default +}); +module.exports = __toCommonJS(VideoPlayer_exports); +var import_VideoPlayer = __toESM(require("./VideoPlayer")); +var VideoPlayer_default = import_VideoPlayer.default; diff --git a/packages/meta/lib/VideoPlayer/index.less b/packages/meta/lib/VideoPlayer/index.less new file mode 100644 index 0000000..181e65c --- /dev/null +++ b/packages/meta/lib/VideoPlayer/index.less @@ -0,0 +1,75 @@ +.zhst-image__video-view { + position: relative; + overflow: hidden; + width: 100%; + height: 532px; + background-color: #333; + + // &-flv { + // width: 85%; + // } + &-screenshot { + position: absolute; + z-index: 10; + } + + &-crop-container { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + } + + &-align { + position: absolute; + top: 0; + left: 0; + pointer-events: none; + } + + &-opt { + position: absolute; + z-index: 99; + bottom: 0; + display: flex; + width: 100%; + height: 32px; + box-sizing: border-box; + align-items: center; + padding: 0 12px; + background-color: rgb(0 0 0 / 80%); + line-height: 32px; + + &>div:first-child { + display: flex; + align-items: center; + margin-right: 12px; + } + + &>div:last-child { + display: flex; + align-items: center; + margin-left: 12px; + } + + &-range { + display: flex; + height: 32px; + flex: 1; + align-items: center; + line-height: 32px; + text-align: center; + + &>div:first-child { + flex: 1; + } + + &>div:last-child { + width: 100px; + margin-left: 8px; + color: #fff; + } + } + } +} diff --git a/packages/meta/lib/VideoPlayer/videoPlayerHelper.d.ts b/packages/meta/lib/VideoPlayer/videoPlayerHelper.d.ts new file mode 100644 index 0000000..661a7c1 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/videoPlayerHelper.d.ts @@ -0,0 +1 @@ +export declare function getShowStatus(isLoadingVideo: boolean, isEnd: boolean, isError: boolean): string | null; diff --git a/packages/meta/lib/VideoPlayer/videoPlayerHelper.js b/packages/meta/lib/VideoPlayer/videoPlayerHelper.js new file mode 100644 index 0000000..6ef0b97 --- /dev/null +++ b/packages/meta/lib/VideoPlayer/videoPlayerHelper.js @@ -0,0 +1,41 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/VideoPlayer/videoPlayerHelper.ts +var videoPlayerHelper_exports = {}; +__export(videoPlayerHelper_exports, { + getShowStatus: () => getShowStatus +}); +module.exports = __toCommonJS(videoPlayerHelper_exports); +function getShowStatus(isLoadingVideo, isEnd, isError) { + let status = null; + if (isLoadingVideo) { + status = "LOADING"; + } + if (isError) { + status = "ERROR"; + } + if (isEnd) { + status = "END"; + } + return status; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getShowStatus +}); diff --git a/packages/meta/lib/_util/ActionButton.d.ts b/packages/meta/lib/_util/ActionButton.d.ts new file mode 100644 index 0000000..c4f4df3 --- /dev/null +++ b/packages/meta/lib/_util/ActionButton.d.ts @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { ButtonProps, LegacyButtonType } from '../button/button'; +export interface ActionButtonProps { + type?: LegacyButtonType; + actionFn?: (...args: any[]) => any | PromiseLike; + close?: Function; + autoFocus?: boolean; + prefixCls: string; + buttonProps?: ButtonProps; + emitEvent?: boolean; + quitOnNullishReturnValue?: boolean; + children?: React.ReactNode; + /** + * Do not throw if is await mode + */ + isSilent?: () => boolean; +} +declare const ActionButton: React.FC; +export default ActionButton; diff --git a/packages/meta/lib/_util/ActionButton.js b/packages/meta/lib/_util/ActionButton.js new file mode 100644 index 0000000..dff757d --- /dev/null +++ b/packages/meta/lib/_util/ActionButton.js @@ -0,0 +1,138 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/ActionButton.tsx +var ActionButton_exports = {}; +__export(ActionButton_exports, { + default: () => ActionButton_default +}); +module.exports = __toCommonJS(ActionButton_exports); +var import_useState = __toESM(require("rc-util/lib/hooks/useState")); +var React = __toESM(require("react")); +var import_button = __toESM(require("../button")); +var import_buttonHelpers = require("../button/buttonHelpers"); +function isThenable(thing) { + return !!(thing && thing.then); +} +var ActionButton = (props) => { + const { + type, + children, + prefixCls, + buttonProps, + close, + autoFocus, + emitEvent, + isSilent, + quitOnNullishReturnValue, + actionFn + } = props; + const clickedRef = React.useRef(false); + const buttonRef = React.useRef(null); + const [loading, setLoading] = (0, import_useState.default)(false); + const onInternalClose = (...args) => { + close == null ? void 0 : close(...args); + }; + React.useEffect(() => { + let timeoutId = null; + if (autoFocus) { + timeoutId = setTimeout(() => { + var _a; + (_a = buttonRef.current) == null ? void 0 : _a.focus(); + }); + } + return () => { + if (timeoutId) { + clearTimeout(timeoutId); + } + }; + }, []); + const handlePromiseOnOk = (returnValueOfOnOk) => { + if (!isThenable(returnValueOfOnOk)) { + return; + } + setLoading(true); + returnValueOfOnOk.then( + (...args) => { + setLoading(false, true); + onInternalClose(...args); + clickedRef.current = false; + }, + (e) => { + setLoading(false, true); + clickedRef.current = false; + if (isSilent == null ? void 0 : isSilent()) { + return; + } + return Promise.reject(e); + } + ); + }; + const onClick = (e) => { + if (clickedRef.current) { + return; + } + clickedRef.current = true; + if (!actionFn) { + onInternalClose(); + return; + } + let returnValueOfOnOk; + if (emitEvent) { + returnValueOfOnOk = actionFn(e); + if (quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) { + clickedRef.current = false; + onInternalClose(e); + return; + } + } else if (actionFn.length) { + returnValueOfOnOk = actionFn(close); + clickedRef.current = false; + } else { + returnValueOfOnOk = actionFn(); + if (!returnValueOfOnOk) { + onInternalClose(); + return; + } + } + handlePromiseOnOk(returnValueOfOnOk); + }; + return /* @__PURE__ */ React.createElement( + import_button.default, + { + ...(0, import_buttonHelpers.convertLegacyProps)(type), + onClick, + loading, + prefixCls, + ...buttonProps, + ref: buttonRef + }, + children + ); +}; +var ActionButton_default = ActionButton; diff --git a/packages/meta/lib/_util/PurePanel.d.ts b/packages/meta/lib/_util/PurePanel.d.ts new file mode 100644 index 0000000..6637350 --- /dev/null +++ b/packages/meta/lib/_util/PurePanel.d.ts @@ -0,0 +1,9 @@ +import * as React from 'react'; +import type { AnyObject } from './type'; +export declare function withPureRenderTheme(Component: React.FC): (props: T) => React.JSX.Element; +export interface BaseProps { + prefixCls?: string; + style?: React.CSSProperties; +} +declare const genPurePanel: (Component: any, defaultPrefixCls?: string, getDropdownCls?: ((prefixCls: string) => string) | null | undefined, postProps?: ((props: ComponentProps) => ComponentProps) | undefined) => (props: AnyObject) => React.JSX.Element; +export default genPurePanel; diff --git a/packages/meta/lib/_util/PurePanel.js b/packages/meta/lib/_util/PurePanel.js new file mode 100644 index 0000000..b3e5440 --- /dev/null +++ b/packages/meta/lib/_util/PurePanel.js @@ -0,0 +1,102 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/PurePanel.tsx +var PurePanel_exports = {}; +__export(PurePanel_exports, { + default: () => PurePanel_default, + withPureRenderTheme: () => withPureRenderTheme +}); +module.exports = __toCommonJS(PurePanel_exports); +var React = __toESM(require("react")); +var import_useMergedState = __toESM(require("rc-util/lib/hooks/useMergedState")); +var import_config_provider = __toESM(require("../config-provider")); +function withPureRenderTheme(Component) { + return (props) => /* @__PURE__ */ React.createElement(import_config_provider.default, { theme: { token: { motion: false, zIndexPopupBase: 0 } } }, /* @__PURE__ */ React.createElement(Component, { ...props })); +} +var genPurePanel = (Component, defaultPrefixCls, getDropdownCls, postProps) => { + const PurePanel = (props) => { + const { prefixCls: customizePrefixCls, style } = props; + const holderRef = React.useRef(null); + const [popupHeight, setPopupHeight] = React.useState(0); + const [popupWidth, setPopupWidth] = React.useState(0); + const [open, setOpen] = (0, import_useMergedState.default)(false, { + value: props.open + }); + const { getPrefixCls } = React.useContext(import_config_provider.ConfigContext); + const prefixCls = getPrefixCls(defaultPrefixCls || "select", customizePrefixCls); + React.useEffect(() => { + setOpen(true); + if (typeof ResizeObserver !== "undefined") { + const resizeObserver = new ResizeObserver((entries) => { + const element = entries[0].target; + setPopupHeight(element.offsetHeight + 8); + setPopupWidth(element.offsetWidth); + }); + const interval = setInterval(() => { + var _a; + const dropdownCls = getDropdownCls ? `.${getDropdownCls(prefixCls)}` : `.${prefixCls}-dropdown`; + const popup = (_a = holderRef.current) == null ? void 0 : _a.querySelector(dropdownCls); + if (popup) { + clearInterval(interval); + resizeObserver.observe(popup); + } + }, 10); + return () => { + clearInterval(interval); + resizeObserver.disconnect(); + }; + } + }, []); + let mergedProps = { + ...props, + style: { + ...style, + margin: 0 + }, + open, + visible: open, + getPopupContainer: () => holderRef.current + }; + if (postProps) { + mergedProps = postProps(mergedProps); + } + const mergedStyle = { + paddingBottom: popupHeight, + position: "relative", + minWidth: popupWidth + }; + return /* @__PURE__ */ React.createElement("div", { ref: holderRef, style: mergedStyle }, /* @__PURE__ */ React.createElement(Component, { ...mergedProps })); + }; + return withPureRenderTheme(PurePanel); +}; +var PurePanel_default = genPurePanel; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + withPureRenderTheme +}); diff --git a/packages/meta/lib/_util/capitalize.d.ts b/packages/meta/lib/_util/capitalize.d.ts new file mode 100644 index 0000000..56a42d7 --- /dev/null +++ b/packages/meta/lib/_util/capitalize.d.ts @@ -0,0 +1 @@ +export default function capitalize(str: T): Capitalize; diff --git a/packages/meta/lib/_util/capitalize.js b/packages/meta/lib/_util/capitalize.js new file mode 100644 index 0000000..9a44513 --- /dev/null +++ b/packages/meta/lib/_util/capitalize.js @@ -0,0 +1,31 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/capitalize.ts +var capitalize_exports = {}; +__export(capitalize_exports, { + default: () => capitalize +}); +module.exports = __toCommonJS(capitalize_exports); +function capitalize(str) { + if (typeof str !== "string") { + return str; + } + const ret = str.charAt(0).toUpperCase() + str.slice(1); + return ret; +} diff --git a/packages/meta/lib/_util/colors.d.ts b/packages/meta/lib/_util/colors.d.ts new file mode 100644 index 0000000..a058c3d --- /dev/null +++ b/packages/meta/lib/_util/colors.d.ts @@ -0,0 +1,13 @@ +import type { PresetColorKey } from '../theme/interface'; +type InverseColor = `${PresetColorKey}-inverse`; +export declare const PresetStatusColorTypes: readonly ["success", "processing", "error", "default", "warning"]; +export type PresetColorType = PresetColorKey | InverseColor; +export type PresetStatusColorType = typeof PresetStatusColorTypes[number]; +/** + * determine if the color keyword belongs to the `Ant Design` {@link PresetColors}. + * @param color color to be judged + * @param includeInverse whether to include reversed colors + */ +export declare function isPresetColor(color?: any, includeInverse?: boolean): boolean; +export declare function isPresetStatusColor(color?: any): color is PresetStatusColorType; +export {}; diff --git a/packages/meta/lib/_util/colors.js b/packages/meta/lib/_util/colors.js new file mode 100644 index 0000000..b066b89 --- /dev/null +++ b/packages/meta/lib/_util/colors.js @@ -0,0 +1,50 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/colors.ts +var colors_exports = {}; +__export(colors_exports, { + PresetStatusColorTypes: () => PresetStatusColorTypes, + isPresetColor: () => isPresetColor, + isPresetStatusColor: () => isPresetStatusColor +}); +module.exports = __toCommonJS(colors_exports); +var import_interface = require("../theme/interface"); +var inverseColors = import_interface.PresetColors.map((color) => `${color}-inverse`); +var PresetStatusColorTypes = [ + "success", + "processing", + "error", + "default", + "warning" +]; +function isPresetColor(color, includeInverse = true) { + if (includeInverse) { + return [...inverseColors, ...import_interface.PresetColors].includes(color); + } + return import_interface.PresetColors.includes(color); +} +function isPresetStatusColor(color) { + return PresetStatusColorTypes.includes(color); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + PresetStatusColorTypes, + isPresetColor, + isPresetStatusColor +}); diff --git a/packages/meta/lib/_util/easings.d.ts b/packages/meta/lib/_util/easings.d.ts new file mode 100644 index 0000000..86c44ba --- /dev/null +++ b/packages/meta/lib/_util/easings.d.ts @@ -0,0 +1 @@ +export declare function easeInOutCubic(t: number, b: number, c: number, d: number): number; diff --git a/packages/constants/lib/index.js b/packages/meta/lib/_util/easings.js similarity index 60% rename from packages/constants/lib/index.js rename to packages/meta/lib/_util/easings.js index 4aa07fe..ad48853 100644 --- a/packages/constants/lib/index.js +++ b/packages/meta/lib/_util/easings.js @@ -2,6 +2,10 @@ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) @@ -10,18 +14,23 @@ var __copyProps = (to, from, except, desc) => { } return to; }; -var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -// src/index.ts -var src_exports = {}; -module.exports = __toCommonJS(src_exports); -__reExport(src_exports, require("./camera"), module.exports); -__reExport(src_exports, require("./base"), module.exports); -__reExport(src_exports, require("./user"), module.exports); +// src/_util/easings.ts +var easings_exports = {}; +__export(easings_exports, { + easeInOutCubic: () => easeInOutCubic +}); +module.exports = __toCommonJS(easings_exports); +function easeInOutCubic(t, b, c, d) { + const cc = c - b; + t /= d / 2; + if (t < 1) { + return cc / 2 * t * t * t + b; + } + return cc / 2 * ((t -= 2) * t * t + 2) + b; +} // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { - ...require("./camera"), - ...require("./base"), - ...require("./user") + easeInOutCubic }); diff --git a/packages/meta/lib/_util/extendsObject.d.ts b/packages/meta/lib/_util/extendsObject.d.ts new file mode 100644 index 0000000..66ece2f --- /dev/null +++ b/packages/meta/lib/_util/extendsObject.d.ts @@ -0,0 +1,3 @@ +import type { AnyObject } from './type'; +declare const extendsObject: (...list: T[]) => AnyObject; +export default extendsObject; diff --git a/packages/meta/lib/_util/extendsObject.js b/packages/meta/lib/_util/extendsObject.js new file mode 100644 index 0000000..d69f012 --- /dev/null +++ b/packages/meta/lib/_util/extendsObject.js @@ -0,0 +1,40 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/extendsObject.ts +var extendsObject_exports = {}; +__export(extendsObject_exports, { + default: () => extendsObject_default +}); +module.exports = __toCommonJS(extendsObject_exports); +var extendsObject = (...list) => { + const result = { ...list[0] }; + for (let i = 1; i < list.length; i++) { + const obj = list[i]; + if (obj) { + Object.keys(obj).forEach((key) => { + const val = obj[key]; + if (val !== void 0) { + result[key] = val; + } + }); + } + } + return result; +}; +var extendsObject_default = extendsObject; diff --git a/packages/meta/lib/_util/gapSize.d.ts b/packages/meta/lib/_util/gapSize.d.ts new file mode 100644 index 0000000..c0ad4d6 --- /dev/null +++ b/packages/meta/lib/_util/gapSize.d.ts @@ -0,0 +1,3 @@ +import type { SizeType } from '../config-provider/SizeContext'; +export declare function isPresetSize(size?: SizeType | string | number): size is SizeType; +export declare function isValidGapNumber(size?: SizeType | string | number): size is number; diff --git a/packages/meta/lib/_util/gapSize.js b/packages/meta/lib/_util/gapSize.js new file mode 100644 index 0000000..b329bcc --- /dev/null +++ b/packages/meta/lib/_util/gapSize.js @@ -0,0 +1,39 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/gapSize.ts +var gapSize_exports = {}; +__export(gapSize_exports, { + isPresetSize: () => isPresetSize, + isValidGapNumber: () => isValidGapNumber +}); +module.exports = __toCommonJS(gapSize_exports); +function isPresetSize(size) { + return ["small", "middle", "large"].includes(size); +} +function isValidGapNumber(size) { + if (!size) { + return false; + } + return typeof size === "number" && !Number.isNaN(size); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + isPresetSize, + isValidGapNumber +}); diff --git a/packages/meta/lib/_util/getRenderPropValue.d.ts b/packages/meta/lib/_util/getRenderPropValue.d.ts new file mode 100644 index 0000000..76a463b --- /dev/null +++ b/packages/meta/lib/_util/getRenderPropValue.d.ts @@ -0,0 +1,3 @@ +import type * as React from 'react'; +export type RenderFunction = () => React.ReactNode; +export declare const getRenderPropValue: (propValue?: React.ReactNode | RenderFunction) => React.ReactNode; diff --git a/packages/meta/lib/_util/getRenderPropValue.js b/packages/meta/lib/_util/getRenderPropValue.js new file mode 100644 index 0000000..c5fc23a --- /dev/null +++ b/packages/meta/lib/_util/getRenderPropValue.js @@ -0,0 +1,34 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/getRenderPropValue.ts +var getRenderPropValue_exports = {}; +__export(getRenderPropValue_exports, { + getRenderPropValue: () => getRenderPropValue +}); +module.exports = __toCommonJS(getRenderPropValue_exports); +var getRenderPropValue = (propValue) => { + if (!propValue) { + return null; + } + return typeof propValue === "function" ? propValue() : propValue; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getRenderPropValue +}); diff --git a/packages/meta/lib/_util/getScroll.d.ts b/packages/meta/lib/_util/getScroll.d.ts new file mode 100644 index 0000000..6db588e --- /dev/null +++ b/packages/meta/lib/_util/getScroll.d.ts @@ -0,0 +1,2 @@ +export declare function isWindow(obj: any): obj is Window; +export default function getScroll(target: HTMLElement | Window | Document | null, top: boolean): number; diff --git a/packages/meta/lib/_util/getScroll.js b/packages/meta/lib/_util/getScroll.js new file mode 100644 index 0000000..fabc0bb --- /dev/null +++ b/packages/meta/lib/_util/getScroll.js @@ -0,0 +1,53 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/getScroll.ts +var getScroll_exports = {}; +__export(getScroll_exports, { + default: () => getScroll, + isWindow: () => isWindow +}); +module.exports = __toCommonJS(getScroll_exports); +function isWindow(obj) { + return obj !== null && obj !== void 0 && obj === obj.window; +} +function getScroll(target, top) { + var _a; + if (typeof window === "undefined") { + return 0; + } + const method = top ? "scrollTop" : "scrollLeft"; + let result = 0; + if (isWindow(target)) { + result = target[top ? "pageYOffset" : "pageXOffset"]; + } else if (target instanceof Document) { + result = target.documentElement[method]; + } else if (target instanceof HTMLElement) { + result = target[method]; + } else if (target) { + result = target[method]; + } + if (target && !isWindow(target) && typeof result !== "number") { + result = (_a = (target.ownerDocument ?? target).documentElement) == null ? void 0 : _a[method]; + } + return result; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + isWindow +}); diff --git a/packages/meta/lib/_util/hooks/useClosable.d.ts b/packages/meta/lib/_util/hooks/useClosable.d.ts new file mode 100644 index 0000000..eea0042 --- /dev/null +++ b/packages/meta/lib/_util/hooks/useClosable.d.ts @@ -0,0 +1,10 @@ +import type { ReactNode } from 'react'; +import React from 'react'; +export type UseClosableParams = { + closable?: boolean; + closeIcon?: boolean | ReactNode; + defaultClosable?: boolean; + defaultCloseIcon?: ReactNode; + customCloseIconRender?: (closeIcon: ReactNode) => ReactNode; +}; +export default function useClosable(closable?: boolean, closeIcon?: boolean | ReactNode, customCloseIconRender?: (closeIcon: ReactNode) => ReactNode, defaultCloseIcon?: ReactNode, defaultClosable?: boolean): [closable: boolean, closeIcon: React.ReactNode | null]; diff --git a/packages/meta/lib/_util/hooks/useClosable.js b/packages/meta/lib/_util/hooks/useClosable.js new file mode 100644 index 0000000..7760da8 --- /dev/null +++ b/packages/meta/lib/_util/hooks/useClosable.js @@ -0,0 +1,53 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/hooks/useClosable.tsx +var useClosable_exports = {}; +__export(useClosable_exports, { + default: () => useClosable +}); +module.exports = __toCommonJS(useClosable_exports); +var import_CloseOutlined = __toESM(require("@ant-design/icons/CloseOutlined")); +var import_react = __toESM(require("react")); +function useInnerClosable(closable, closeIcon, defaultClosable) { + if (typeof closable === "boolean") { + return closable; + } + if (closeIcon === void 0) { + return !!defaultClosable; + } + return closeIcon !== false && closeIcon !== null; +} +function useClosable(closable, closeIcon, customCloseIconRender, defaultCloseIcon = /* @__PURE__ */ import_react.default.createElement(import_CloseOutlined.default, null), defaultClosable = false) { + const mergedClosable = useInnerClosable(closable, closeIcon, defaultClosable); + if (!mergedClosable) { + return [false, null]; + } + const mergedCloseIcon = typeof closeIcon === "boolean" || closeIcon === void 0 || closeIcon === null ? defaultCloseIcon : closeIcon; + return [true, customCloseIconRender ? customCloseIconRender(mergedCloseIcon) : mergedCloseIcon]; +} diff --git a/packages/meta/lib/_util/hooks/useForceUpdate.d.ts b/packages/meta/lib/_util/hooks/useForceUpdate.d.ts new file mode 100644 index 0000000..b6b0e9f --- /dev/null +++ b/packages/meta/lib/_util/hooks/useForceUpdate.d.ts @@ -0,0 +1,2 @@ +import * as React from 'react'; +export default function useForceUpdate(): React.DispatchWithoutAction; diff --git a/packages/meta/lib/_util/hooks/useForceUpdate.js b/packages/meta/lib/_util/hooks/useForceUpdate.js new file mode 100644 index 0000000..54beae2 --- /dev/null +++ b/packages/meta/lib/_util/hooks/useForceUpdate.js @@ -0,0 +1,39 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/hooks/useForceUpdate.ts +var useForceUpdate_exports = {}; +__export(useForceUpdate_exports, { + default: () => useForceUpdate +}); +module.exports = __toCommonJS(useForceUpdate_exports); +var React = __toESM(require("react")); +function useForceUpdate() { + const [, forceUpdate] = React.useReducer((x) => x + 1, 0); + return forceUpdate; +} diff --git a/packages/meta/lib/_util/hooks/useMultipleSelect.d.ts b/packages/meta/lib/_util/hooks/useMultipleSelect.d.ts new file mode 100644 index 0000000..d613a5c --- /dev/null +++ b/packages/meta/lib/_util/hooks/useMultipleSelect.d.ts @@ -0,0 +1,6 @@ +export type PrevSelectedIndex = null | number; +/** + * @title multipleSelect hooks + * @description multipleSelect by hold down shift key + */ +export default function useMultipleSelect(getKey: (item: T) => K): readonly [(currentSelectedIndex: number, data: T[], selectedKeys: Set) => K[], (val: PrevSelectedIndex) => void]; diff --git a/packages/meta/lib/_util/hooks/useMultipleSelect.js b/packages/meta/lib/_util/hooks/useMultipleSelect.js new file mode 100644 index 0000000..50139cf --- /dev/null +++ b/packages/meta/lib/_util/hooks/useMultipleSelect.js @@ -0,0 +1,56 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/hooks/useMultipleSelect.ts +var useMultipleSelect_exports = {}; +__export(useMultipleSelect_exports, { + default: () => useMultipleSelect +}); +module.exports = __toCommonJS(useMultipleSelect_exports); +var import_react = require("react"); +function useMultipleSelect(getKey) { + const [prevSelectedIndex, setPrevSelectedIndex] = (0, import_react.useState)(null); + const multipleSelect = (0, import_react.useCallback)( + (currentSelectedIndex, data, selectedKeys) => { + const configPrevSelectedIndex = prevSelectedIndex ?? currentSelectedIndex; + const startIndex = Math.min(configPrevSelectedIndex || 0, currentSelectedIndex); + const endIndex = Math.max(configPrevSelectedIndex || 0, currentSelectedIndex); + const rangeKeys = data.slice(startIndex, endIndex + 1).map((item) => getKey(item)); + const shouldSelected = rangeKeys.some((rangeKey) => !selectedKeys.has(rangeKey)); + const changedKeys = []; + rangeKeys.forEach((item) => { + if (shouldSelected) { + if (!selectedKeys.has(item)) { + changedKeys.push(item); + } + selectedKeys.add(item); + } else { + selectedKeys.delete(item); + changedKeys.push(item); + } + }); + setPrevSelectedIndex(shouldSelected ? endIndex : null); + return changedKeys; + }, + [prevSelectedIndex] + ); + const updatePrevSelectedIndex = (val) => { + setPrevSelectedIndex(val); + }; + return [multipleSelect, updatePrevSelectedIndex]; +} diff --git a/packages/meta/lib/_util/hooks/usePatchElement.d.ts b/packages/meta/lib/_util/hooks/usePatchElement.d.ts new file mode 100644 index 0000000..e53aa7e --- /dev/null +++ b/packages/meta/lib/_util/hooks/usePatchElement.d.ts @@ -0,0 +1,5 @@ +import * as React from 'react'; +export default function usePatchElement(): [ + React.ReactElement[], + (element: React.ReactElement) => Function +]; diff --git a/packages/meta/lib/_util/hooks/usePatchElement.js b/packages/meta/lib/_util/hooks/usePatchElement.js new file mode 100644 index 0000000..75aa9f1 --- /dev/null +++ b/packages/meta/lib/_util/hooks/usePatchElement.js @@ -0,0 +1,45 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/hooks/usePatchElement.ts +var usePatchElement_exports = {}; +__export(usePatchElement_exports, { + default: () => usePatchElement +}); +module.exports = __toCommonJS(usePatchElement_exports); +var React = __toESM(require("react")); +function usePatchElement() { + const [elements, setElements] = React.useState([]); + const patchElement = React.useCallback((element) => { + setElements((originElements) => [...originElements, element]); + return () => { + setElements((originElements) => originElements.filter((ele) => ele !== element)); + }; + }, []); + return [elements, patchElement]; +} diff --git a/packages/meta/lib/_util/hooks/useProxyImperativeHandle.d.ts b/packages/meta/lib/_util/hooks/useProxyImperativeHandle.d.ts new file mode 100644 index 0000000..2004e3b --- /dev/null +++ b/packages/meta/lib/_util/hooks/useProxyImperativeHandle.d.ts @@ -0,0 +1,4 @@ +import { type Ref } from 'react'; +export default function useProxyImperativeHandle(ref: Ref | undefined, init: () => ReturnRefType): void; diff --git a/packages/meta/lib/_util/hooks/useProxyImperativeHandle.js b/packages/meta/lib/_util/hooks/useProxyImperativeHandle.js new file mode 100644 index 0000000..8d180d5 --- /dev/null +++ b/packages/meta/lib/_util/hooks/useProxyImperativeHandle.js @@ -0,0 +1,53 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/hooks/useProxyImperativeHandle.ts +var useProxyImperativeHandle_exports = {}; +__export(useProxyImperativeHandle_exports, { + default: () => useProxyImperativeHandle +}); +module.exports = __toCommonJS(useProxyImperativeHandle_exports); +var import_react = require("react"); +function fillProxy(element, handler) { + element._antProxy = element._antProxy || {}; + Object.keys(handler).forEach((key) => { + if (!(key in element._antProxy)) { + const ori = element[key]; + element._antProxy[key] = ori; + element[key] = handler[key]; + } + }); + return element; +} +function useProxyImperativeHandle(ref, init) { + return (0, import_react.useImperativeHandle)(ref, () => { + const refObj = init(); + const { nativeElement } = refObj; + if (typeof Proxy !== "undefined") { + return new Proxy(nativeElement, { + get(obj, prop) { + if (refObj[prop]) { + return refObj[prop]; + } + return Reflect.get(obj, prop); + } + }); + } + return fillProxy(nativeElement, refObj); + }); +} diff --git a/packages/meta/lib/_util/hooks/useSyncState.d.ts b/packages/meta/lib/_util/hooks/useSyncState.d.ts new file mode 100644 index 0000000..ad9131c --- /dev/null +++ b/packages/meta/lib/_util/hooks/useSyncState.d.ts @@ -0,0 +1,3 @@ +type UseSyncStateProps = readonly [() => T, (newValue: T) => void]; +export default function useSyncState(initialValue: T): UseSyncStateProps; +export {}; diff --git a/packages/meta/lib/_util/hooks/useSyncState.js b/packages/meta/lib/_util/hooks/useSyncState.js new file mode 100644 index 0000000..d30dd81 --- /dev/null +++ b/packages/meta/lib/_util/hooks/useSyncState.js @@ -0,0 +1,47 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/hooks/useSyncState.ts +var useSyncState_exports = {}; +__export(useSyncState_exports, { + default: () => useSyncState +}); +module.exports = __toCommonJS(useSyncState_exports); +var React = __toESM(require("react")); +var import_useForceUpdate = __toESM(require("./useForceUpdate")); +function useSyncState(initialValue) { + const ref = React.useRef(initialValue); + const forceUpdate = (0, import_useForceUpdate.default)(); + return [ + () => ref.current, + (newValue) => { + ref.current = newValue; + forceUpdate(); + } + ]; +} diff --git a/packages/meta/lib/_util/hooks/useZIndex.d.ts b/packages/meta/lib/_util/hooks/useZIndex.d.ts new file mode 100644 index 0000000..856f9d3 --- /dev/null +++ b/packages/meta/lib/_util/hooks/useZIndex.d.ts @@ -0,0 +1,6 @@ +export type ZIndexContainer = 'Modal' | 'Drawer' | 'Popover' | 'Popconfirm' | 'Tooltip' | 'Tour'; +export type ZIndexConsumer = 'SelectLike' | 'Dropdown' | 'DatePicker' | 'Menu' | 'ImagePreview'; +export declare const CONTAINER_MAX_OFFSET: number; +export declare const containerBaseZIndexOffset: Record; +export declare const consumerBaseZIndexOffset: Record; +export declare function useZIndex(componentType: ZIndexContainer | ZIndexConsumer, customZIndex?: number): [zIndex: number | undefined, contextZIndex: number]; diff --git a/packages/meta/lib/_util/hooks/useZIndex.js b/packages/meta/lib/_util/hooks/useZIndex.js new file mode 100644 index 0000000..4654505 --- /dev/null +++ b/packages/meta/lib/_util/hooks/useZIndex.js @@ -0,0 +1,86 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/hooks/useZIndex.ts +var useZIndex_exports = {}; +__export(useZIndex_exports, { + CONTAINER_MAX_OFFSET: () => CONTAINER_MAX_OFFSET, + consumerBaseZIndexOffset: () => consumerBaseZIndexOffset, + containerBaseZIndexOffset: () => containerBaseZIndexOffset, + useZIndex: () => useZIndex +}); +module.exports = __toCommonJS(useZIndex_exports); +var import_react = __toESM(require("react")); +var import_useToken = __toESM(require("../../theme/useToken")); +var import_zindexContext = __toESM(require("../zindexContext")); +var CONTAINER_OFFSET = 100; +var CONTAINER_OFFSET_MAX_COUNT = 10; +var CONTAINER_MAX_OFFSET = CONTAINER_OFFSET * CONTAINER_OFFSET_MAX_COUNT; +var containerBaseZIndexOffset = { + Modal: CONTAINER_OFFSET, + Drawer: CONTAINER_OFFSET, + Popover: CONTAINER_OFFSET, + Popconfirm: CONTAINER_OFFSET, + Tooltip: CONTAINER_OFFSET, + Tour: CONTAINER_OFFSET +}; +var consumerBaseZIndexOffset = { + SelectLike: 50, + Dropdown: 50, + DatePicker: 50, + Menu: 50, + ImagePreview: 1 +}; +function isContainerType(type) { + return type in containerBaseZIndexOffset; +} +function useZIndex(componentType, customZIndex) { + const [, token] = (0, import_useToken.default)(); + const parentZIndex = import_react.default.useContext(import_zindexContext.default); + const isContainer = isContainerType(componentType); + if (customZIndex !== void 0) { + return [customZIndex, customZIndex]; + } + let zIndex = parentZIndex ?? 0; + if (isContainer) { + zIndex += // Use preset token zIndex by default but not stack when has parent container + (parentZIndex ? 0 : token.zIndexPopupBase) + // Container offset + containerBaseZIndexOffset[componentType]; + zIndex = Math.min(zIndex, token.zIndexPopupBase + CONTAINER_MAX_OFFSET); + } else { + zIndex += consumerBaseZIndexOffset[componentType]; + } + return [parentZIndex === void 0 ? customZIndex : zIndex, zIndex]; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + CONTAINER_MAX_OFFSET, + consumerBaseZIndexOffset, + containerBaseZIndexOffset, + useZIndex +}); diff --git a/packages/meta/lib/_util/isNumeric.d.ts b/packages/meta/lib/_util/isNumeric.d.ts new file mode 100644 index 0000000..249431b --- /dev/null +++ b/packages/meta/lib/_util/isNumeric.d.ts @@ -0,0 +1,2 @@ +declare const isNumeric: (value: any) => boolean; +export default isNumeric; diff --git a/packages/meta/lib/_util/isNumeric.js b/packages/meta/lib/_util/isNumeric.js new file mode 100644 index 0000000..7cfc437 --- /dev/null +++ b/packages/meta/lib/_util/isNumeric.js @@ -0,0 +1,26 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/isNumeric.ts +var isNumeric_exports = {}; +__export(isNumeric_exports, { + default: () => isNumeric_default +}); +module.exports = __toCommonJS(isNumeric_exports); +var isNumeric = (value) => !isNaN(parseFloat(value)) && isFinite(value); +var isNumeric_default = isNumeric; diff --git a/packages/meta/lib/_util/motion.d.ts b/packages/meta/lib/_util/motion.d.ts new file mode 100644 index 0000000..db7cff4 --- /dev/null +++ b/packages/meta/lib/_util/motion.d.ts @@ -0,0 +1,7 @@ +import type { CSSMotionProps } from 'rc-motion'; +declare const initCollapseMotion: (rootCls?: string) => CSSMotionProps; +declare const SelectPlacements: readonly ["bottomLeft", "bottomRight", "topLeft", "topRight"]; +export type SelectCommonPlacement = typeof SelectPlacements[number]; +declare const getTransitionName: (rootPrefixCls: string, motion: string, transitionName?: string) => string; +export { getTransitionName }; +export default initCollapseMotion; diff --git a/packages/meta/lib/_util/motion.js b/packages/meta/lib/_util/motion.js new file mode 100644 index 0000000..6f886c6 --- /dev/null +++ b/packages/meta/lib/_util/motion.js @@ -0,0 +1,56 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/motion.ts +var motion_exports = {}; +__export(motion_exports, { + default: () => motion_default, + getTransitionName: () => getTransitionName +}); +module.exports = __toCommonJS(motion_exports); +var getCollapsedHeight = () => ({ height: 0, opacity: 0 }); +var getRealHeight = (node) => { + const { scrollHeight } = node; + return { height: scrollHeight, opacity: 1 }; +}; +var getCurrentHeight = (node) => ({ height: node ? node.offsetHeight : 0 }); +var skipOpacityTransition = (_, event) => (event == null ? void 0 : event.deadline) === true || event.propertyName === "height"; +var initCollapseMotion = (rootCls = "ant") => ({ + motionName: `${rootCls}-motion-collapse`, + onAppearStart: getCollapsedHeight, + onEnterStart: getCollapsedHeight, + onAppearActive: getRealHeight, + onEnterActive: getRealHeight, + onLeaveStart: getCurrentHeight, + onLeaveActive: getCollapsedHeight, + onAppearEnd: skipOpacityTransition, + onEnterEnd: skipOpacityTransition, + onLeaveEnd: skipOpacityTransition, + motionDeadline: 500 +}); +var getTransitionName = (rootPrefixCls, motion, transitionName) => { + if (transitionName !== void 0) { + return transitionName; + } + return `${rootPrefixCls}-${motion}`; +}; +var motion_default = initCollapseMotion; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getTransitionName +}); diff --git a/packages/meta/lib/_util/placements.d.ts b/packages/meta/lib/_util/placements.d.ts new file mode 100644 index 0000000..de2bf6b --- /dev/null +++ b/packages/meta/lib/_util/placements.d.ts @@ -0,0 +1,21 @@ +import type { BuildInPlacements } from '@rc-component/trigger'; +import { getArrowOffsetToken } from '../style/placementArrow'; +export interface AdjustOverflow { + adjustX?: 0 | 1; + adjustY?: 0 | 1; +} +export interface PlacementsConfig { + arrowWidth: number; + arrowPointAtCenter?: boolean; + autoAdjustOverflow?: boolean | AdjustOverflow; + offset: number; + borderRadius: number; + visibleFirst?: boolean; +} +export declare function getOverflowOptions(placement: string, arrowOffset: ReturnType, arrowWidth: number, autoAdjustOverflow?: boolean | AdjustOverflow): { + adjustX?: number | boolean | undefined; + adjustY?: number | boolean | undefined; + shiftX?: number | boolean | undefined; + shiftY?: number | boolean | undefined; +}; +export default function getPlacements(config: PlacementsConfig): BuildInPlacements; diff --git a/packages/meta/lib/_util/placements.js b/packages/meta/lib/_util/placements.js new file mode 100644 index 0000000..8e3c118 --- /dev/null +++ b/packages/meta/lib/_util/placements.js @@ -0,0 +1,207 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/placements.ts +var placements_exports = {}; +__export(placements_exports, { + default: () => getPlacements, + getOverflowOptions: () => getOverflowOptions +}); +module.exports = __toCommonJS(placements_exports); +var import_placementArrow = require("../style/placementArrow"); +function getOverflowOptions(placement, arrowOffset, arrowWidth, autoAdjustOverflow) { + if (autoAdjustOverflow === false) { + return { + adjustX: false, + adjustY: false + }; + } + const overflow = autoAdjustOverflow && typeof autoAdjustOverflow === "object" ? autoAdjustOverflow : {}; + const baseOverflow = {}; + switch (placement) { + case "top": + case "bottom": + baseOverflow.shiftX = arrowOffset.arrowOffsetHorizontal * 2 + arrowWidth; + baseOverflow.shiftY = true; + baseOverflow.adjustY = true; + break; + case "left": + case "right": + baseOverflow.shiftY = arrowOffset.arrowOffsetVertical * 2 + arrowWidth; + baseOverflow.shiftX = true; + baseOverflow.adjustX = true; + break; + } + const mergedOverflow = { + ...baseOverflow, + ...overflow + }; + if (!mergedOverflow.shiftX) { + mergedOverflow.adjustX = true; + } + if (!mergedOverflow.shiftY) { + mergedOverflow.adjustY = true; + } + return mergedOverflow; +} +var PlacementAlignMap = { + left: { + points: ["cr", "cl"] + }, + right: { + points: ["cl", "cr"] + }, + top: { + points: ["bc", "tc"] + }, + bottom: { + points: ["tc", "bc"] + }, + topLeft: { + points: ["bl", "tl"] + }, + leftTop: { + points: ["tr", "tl"] + }, + topRight: { + points: ["br", "tr"] + }, + rightTop: { + points: ["tl", "tr"] + }, + bottomRight: { + points: ["tr", "br"] + }, + rightBottom: { + points: ["bl", "br"] + }, + bottomLeft: { + points: ["tl", "bl"] + }, + leftBottom: { + points: ["br", "bl"] + } +}; +var ArrowCenterPlacementAlignMap = { + topLeft: { + points: ["bl", "tc"] + }, + leftTop: { + points: ["tr", "cl"] + }, + topRight: { + points: ["br", "tc"] + }, + rightTop: { + points: ["tl", "cr"] + }, + bottomRight: { + points: ["tr", "bc"] + }, + rightBottom: { + points: ["bl", "cr"] + }, + bottomLeft: { + points: ["tl", "bc"] + }, + leftBottom: { + points: ["br", "cl"] + } +}; +var DisableAutoArrowList = /* @__PURE__ */ new Set([ + "topLeft", + "topRight", + "bottomLeft", + "bottomRight", + "leftTop", + "leftBottom", + "rightTop", + "rightBottom" +]); +function getPlacements(config) { + const { arrowWidth, autoAdjustOverflow, arrowPointAtCenter, offset, borderRadius, visibleFirst } = config; + const halfArrowWidth = arrowWidth / 2; + const placementMap = {}; + Object.keys(PlacementAlignMap).forEach((key) => { + const template = arrowPointAtCenter && ArrowCenterPlacementAlignMap[key] || PlacementAlignMap[key]; + const placementInfo = { + ...template, + offset: [0, 0], + dynamicInset: true + }; + placementMap[key] = placementInfo; + if (DisableAutoArrowList.has(key)) { + placementInfo.autoArrow = false; + } + switch (key) { + case "top": + case "topLeft": + case "topRight": + placementInfo.offset[1] = -halfArrowWidth - offset; + break; + case "bottom": + case "bottomLeft": + case "bottomRight": + placementInfo.offset[1] = halfArrowWidth + offset; + break; + case "left": + case "leftTop": + case "leftBottom": + placementInfo.offset[0] = -halfArrowWidth - offset; + break; + case "right": + case "rightTop": + case "rightBottom": + placementInfo.offset[0] = halfArrowWidth + offset; + break; + } + const arrowOffset = (0, import_placementArrow.getArrowOffsetToken)({ + contentRadius: borderRadius, + limitVerticalRadius: true + }); + if (arrowPointAtCenter) { + switch (key) { + case "topLeft": + case "bottomLeft": + placementInfo.offset[0] = -arrowOffset.arrowOffsetHorizontal - halfArrowWidth; + break; + case "topRight": + case "bottomRight": + placementInfo.offset[0] = arrowOffset.arrowOffsetHorizontal + halfArrowWidth; + break; + case "leftTop": + case "rightTop": + placementInfo.offset[1] = -arrowOffset.arrowOffsetHorizontal - halfArrowWidth; + break; + case "leftBottom": + case "rightBottom": + placementInfo.offset[1] = arrowOffset.arrowOffsetHorizontal + halfArrowWidth; + break; + } + } + placementInfo.overflow = getOverflowOptions(key, arrowOffset, arrowWidth, autoAdjustOverflow); + if (visibleFirst) { + placementInfo.htmlRegion = "visibleFirst"; + } + }); + return placementMap; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getOverflowOptions +}); diff --git a/packages/meta/lib/_util/reactNode.d.ts b/packages/meta/lib/_util/reactNode.d.ts new file mode 100644 index 0000000..76a8884 --- /dev/null +++ b/packages/meta/lib/_util/reactNode.d.ts @@ -0,0 +1,8 @@ +import * as React from 'react'; +import type { AnyObject } from './type'; +export declare const isValidElement: typeof React.isValidElement; +export declare function isFragment(child: any): boolean; +type RenderProps = AnyObject | ((originProps: AnyObject) => AnyObject | void); +export declare function replaceElement(element: React.ReactNode, replacement: React.ReactNode, props?: RenderProps): React.ReactNode; +export declare function cloneElement(element: React.ReactNode, props?: RenderProps): React.ReactElement; +export {}; diff --git a/packages/meta/lib/_util/reactNode.js b/packages/meta/lib/_util/reactNode.js new file mode 100644 index 0000000..6d6f752 --- /dev/null +++ b/packages/meta/lib/_util/reactNode.js @@ -0,0 +1,61 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/reactNode.ts +var reactNode_exports = {}; +__export(reactNode_exports, { + cloneElement: () => cloneElement2, + isFragment: () => isFragment, + isValidElement: () => isValidElement, + replaceElement: () => replaceElement +}); +module.exports = __toCommonJS(reactNode_exports); +var React = __toESM(require("react")); +var { isValidElement } = React; +function isFragment(child) { + return child && isValidElement(child) && child.type === React.Fragment; +} +function replaceElement(element, replacement, props) { + if (!isValidElement(element)) { + return replacement; + } + return React.cloneElement( + element, + typeof props === "function" ? props(element.props || {}) : props + ); +} +function cloneElement2(element, props) { + return replaceElement(element, element, props); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + cloneElement, + isFragment, + isValidElement, + replaceElement +}); diff --git a/packages/meta/lib/_util/responsiveObserver.d.ts b/packages/meta/lib/_util/responsiveObserver.d.ts new file mode 100644 index 0000000..275cc88 --- /dev/null +++ b/packages/meta/lib/_util/responsiveObserver.d.ts @@ -0,0 +1,22 @@ +export type Breakpoint = 'xxl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs'; +export type BreakpointMap = Record; +export type ScreenMap = Partial>; +export type ScreenSizeMap = Partial>; +export declare const responsiveArray: Breakpoint[]; +type SubscribeFunc = (screens: ScreenMap) => void; +export default function useResponsiveObserver(): { + matchHandlers: { + [prop: string]: { + mql: MediaQueryList; + listener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null; + }; + }; + dispatch(pointMap: ScreenMap): boolean; + subscribe(func: SubscribeFunc): number; + unsubscribe(paramToken: number): void; + unregister(): void; + register(): void; + responsiveMap: BreakpointMap; +}; +export declare const matchScreen: (screens: ScreenMap, screenSizes?: ScreenSizeMap) => number | undefined; +export {}; diff --git a/packages/meta/lib/_util/responsiveObserver.js b/packages/meta/lib/_util/responsiveObserver.js new file mode 100644 index 0000000..7ffe879 --- /dev/null +++ b/packages/meta/lib/_util/responsiveObserver.js @@ -0,0 +1,149 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/responsiveObserver.ts +var responsiveObserver_exports = {}; +__export(responsiveObserver_exports, { + default: () => useResponsiveObserver, + matchScreen: () => matchScreen, + responsiveArray: () => responsiveArray +}); +module.exports = __toCommonJS(responsiveObserver_exports); +var import_react = __toESM(require("react")); +var import_internal = require("../theme/internal"); +var responsiveArray = ["xxl", "xl", "lg", "md", "sm", "xs"]; +var getResponsiveMap = (token) => ({ + xs: `(max-width: ${token.screenXSMax}px)`, + sm: `(min-width: ${token.screenSM}px)`, + md: `(min-width: ${token.screenMD}px)`, + lg: `(min-width: ${token.screenLG}px)`, + xl: `(min-width: ${token.screenXL}px)`, + xxl: `(min-width: ${token.screenXXL}px)` +}); +var validateBreakpoints = (token) => { + const indexableToken = token; + const revBreakpoints = [...responsiveArray].reverse(); + revBreakpoints.forEach((breakpoint, i) => { + const breakpointUpper = breakpoint.toUpperCase(); + const screenMin = `screen${breakpointUpper}Min`; + const screen = `screen${breakpointUpper}`; + if (!(indexableToken[screenMin] <= indexableToken[screen])) { + throw new Error( + `${screenMin}<=${screen} fails : !(${indexableToken[screenMin]}<=${indexableToken[screen]})` + ); + } + if (i < revBreakpoints.length - 1) { + const screenMax = `screen${breakpointUpper}Max`; + if (!(indexableToken[screen] <= indexableToken[screenMax])) { + throw new Error( + `${screen}<=${screenMax} fails : !(${indexableToken[screen]}<=${indexableToken[screenMax]})` + ); + } + const nextBreakpointUpperMin = revBreakpoints[i + 1].toUpperCase(); + const nextScreenMin = `screen${nextBreakpointUpperMin}Min`; + if (!(indexableToken[screenMax] <= indexableToken[nextScreenMin])) { + throw new Error( + `${screenMax}<=${nextScreenMin} fails : !(${indexableToken[screenMax]}<=${indexableToken[nextScreenMin]})` + ); + } + } + }); + return token; +}; +function useResponsiveObserver() { + const [, token] = (0, import_internal.useToken)(); + const responsiveMap = getResponsiveMap(validateBreakpoints(token)); + return import_react.default.useMemo(() => { + const subscribers = /* @__PURE__ */ new Map(); + let subUid = -1; + let screens = {}; + return { + matchHandlers: {}, + dispatch(pointMap) { + screens = pointMap; + subscribers.forEach((func) => func(screens)); + return subscribers.size >= 1; + }, + subscribe(func) { + if (!subscribers.size) + this.register(); + subUid += 1; + subscribers.set(subUid, func); + func(screens); + return subUid; + }, + unsubscribe(paramToken) { + subscribers.delete(paramToken); + if (!subscribers.size) + this.unregister(); + }, + unregister() { + Object.keys(responsiveMap).forEach((screen) => { + const matchMediaQuery = responsiveMap[screen]; + const handler = this.matchHandlers[matchMediaQuery]; + handler == null ? void 0 : handler.mql.removeListener(handler == null ? void 0 : handler.listener); + }); + subscribers.clear(); + }, + register() { + Object.keys(responsiveMap).forEach((screen) => { + const matchMediaQuery = responsiveMap[screen]; + const listener = ({ matches }) => { + this.dispatch({ + ...screens, + [screen]: matches + }); + }; + const mql = window.matchMedia(matchMediaQuery); + mql.addListener(listener); + this.matchHandlers[matchMediaQuery] = { + mql, + listener + }; + listener(mql); + }); + }, + responsiveMap + }; + }, [token]); +} +var matchScreen = (screens, screenSizes) => { + if (screenSizes && typeof screenSizes === "object") { + for (let i = 0; i < responsiveArray.length; i++) { + const breakpoint = responsiveArray[i]; + if (screens[breakpoint] && screenSizes[breakpoint] !== void 0) { + return screenSizes[breakpoint]; + } + } + } +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + matchScreen, + responsiveArray +}); diff --git a/packages/meta/lib/_util/scrollTo.d.ts b/packages/meta/lib/_util/scrollTo.d.ts new file mode 100644 index 0000000..21fd3f9 --- /dev/null +++ b/packages/meta/lib/_util/scrollTo.d.ts @@ -0,0 +1,10 @@ +interface ScrollToOptions { + /** Scroll container, default as window */ + getContainer?: () => HTMLElement | Window | Document; + /** Scroll end callback */ + callback?: () => void; + /** Animation duration, default as 450 */ + duration?: number; +} +export default function scrollTo(y: number, options?: ScrollToOptions): void; +export {}; diff --git a/packages/meta/lib/_util/scrollTo.js b/packages/meta/lib/_util/scrollTo.js new file mode 100644 index 0000000..e37c33c --- /dev/null +++ b/packages/meta/lib/_util/scrollTo.js @@ -0,0 +1,61 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/scrollTo.ts +var scrollTo_exports = {}; +__export(scrollTo_exports, { + default: () => scrollTo +}); +module.exports = __toCommonJS(scrollTo_exports); +var import_raf = __toESM(require("rc-util/lib/raf")); +var import_easings = require("./easings"); +var import_getScroll = __toESM(require("./getScroll")); +function scrollTo(y, options = {}) { + const { getContainer = () => window, callback, duration = 450 } = options; + const container = getContainer(); + const scrollTop = (0, import_getScroll.default)(container, true); + const startTime = Date.now(); + const frameFunc = () => { + const timestamp = Date.now(); + const time = timestamp - startTime; + const nextScrollTop = (0, import_easings.easeInOutCubic)(time > duration ? duration : time, scrollTop, y, duration); + if ((0, import_getScroll.isWindow)(container)) { + container.scrollTo(window.pageXOffset, nextScrollTop); + } else if (container instanceof Document || container.constructor.name === "HTMLDocument") { + container.documentElement.scrollTop = nextScrollTop; + } else { + container.scrollTop = nextScrollTop; + } + if (time < duration) { + (0, import_raf.default)(frameFunc); + } else if (typeof callback === "function") { + callback(); + } + }; + (0, import_raf.default)(frameFunc); +} diff --git a/packages/meta/lib/_util/statusUtils.d.ts b/packages/meta/lib/_util/statusUtils.d.ts new file mode 100644 index 0000000..c66d2a1 --- /dev/null +++ b/packages/meta/lib/_util/statusUtils.d.ts @@ -0,0 +1,6 @@ +import type { ValidateStatus } from '../form/FormItem'; +declare const InputStatuses: readonly ["warning", "error", ""]; +export type InputStatus = typeof InputStatuses[number]; +export declare function getStatusClassNames(prefixCls: string, status?: ValidateStatus, hasFeedback?: boolean): string; +export declare const getMergedStatus: (contextStatus?: ValidateStatus, customStatus?: InputStatus) => "" | "success" | "error" | "warning" | "validating" | undefined; +export {}; diff --git a/packages/meta/lib/_util/statusUtils.js b/packages/meta/lib/_util/statusUtils.js new file mode 100644 index 0000000..2867bfd --- /dev/null +++ b/packages/meta/lib/_util/statusUtils.js @@ -0,0 +1,51 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/statusUtils.ts +var statusUtils_exports = {}; +__export(statusUtils_exports, { + getMergedStatus: () => getMergedStatus, + getStatusClassNames: () => getStatusClassNames +}); +module.exports = __toCommonJS(statusUtils_exports); +var import_classnames = __toESM(require("classnames")); +function getStatusClassNames(prefixCls, status, hasFeedback) { + return (0, import_classnames.default)({ + [`${prefixCls}-status-success`]: status === "success", + [`${prefixCls}-status-warning`]: status === "warning", + [`${prefixCls}-status-error`]: status === "error", + [`${prefixCls}-status-validating`]: status === "validating", + [`${prefixCls}-has-feedback`]: hasFeedback + }); +} +var getMergedStatus = (contextStatus, customStatus) => customStatus || contextStatus; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getMergedStatus, + getStatusClassNames +}); diff --git a/packages/meta/lib/_util/styleChecker.d.ts b/packages/meta/lib/_util/styleChecker.d.ts new file mode 100644 index 0000000..d7cf1e9 --- /dev/null +++ b/packages/meta/lib/_util/styleChecker.d.ts @@ -0,0 +1,3 @@ +import { isStyleSupport } from 'rc-util/lib/Dom/styleChecker'; +export declare const canUseDocElement: () => false | HTMLElement; +export { isStyleSupport }; diff --git a/packages/meta/lib/_util/styleChecker.js b/packages/meta/lib/_util/styleChecker.js new file mode 100644 index 0000000..399b851 --- /dev/null +++ b/packages/meta/lib/_util/styleChecker.js @@ -0,0 +1,43 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/styleChecker.ts +var styleChecker_exports = {}; +__export(styleChecker_exports, { + canUseDocElement: () => canUseDocElement, + isStyleSupport: () => import_styleChecker.isStyleSupport +}); +module.exports = __toCommonJS(styleChecker_exports); +var import_canUseDom = __toESM(require("rc-util/lib/Dom/canUseDom")); +var import_styleChecker = require("rc-util/lib/Dom/styleChecker"); +var canUseDocElement = () => (0, import_canUseDom.default)() && window.document.documentElement; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + canUseDocElement, + isStyleSupport +}); diff --git a/packages/meta/lib/_util/throttleByAnimationFrame.d.ts b/packages/meta/lib/_util/throttleByAnimationFrame.d.ts new file mode 100644 index 0000000..a19c9ca --- /dev/null +++ b/packages/meta/lib/_util/throttleByAnimationFrame.d.ts @@ -0,0 +1,5 @@ +declare function throttleByAnimationFrame(fn: (...args: T) => void): { + (...args: T): void; + cancel(): void; +}; +export default throttleByAnimationFrame; diff --git a/packages/meta/lib/_util/throttleByAnimationFrame.js b/packages/meta/lib/_util/throttleByAnimationFrame.js new file mode 100644 index 0000000..7f0a50c --- /dev/null +++ b/packages/meta/lib/_util/throttleByAnimationFrame.js @@ -0,0 +1,53 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/throttleByAnimationFrame.ts +var throttleByAnimationFrame_exports = {}; +__export(throttleByAnimationFrame_exports, { + default: () => throttleByAnimationFrame_default +}); +module.exports = __toCommonJS(throttleByAnimationFrame_exports); +var import_raf = __toESM(require("rc-util/lib/raf")); +function throttleByAnimationFrame(fn) { + let requestId; + const later = (args) => () => { + requestId = null; + fn(...args); + }; + const throttled = (...args) => { + if (requestId == null) { + requestId = (0, import_raf.default)(later(args)); + } + }; + throttled.cancel = () => { + import_raf.default.cancel(requestId); + requestId = null; + }; + return throttled; +} +var throttleByAnimationFrame_default = throttleByAnimationFrame; diff --git a/packages/meta/lib/_util/transButton.d.ts b/packages/meta/lib/_util/transButton.d.ts new file mode 100644 index 0000000..e12e191 --- /dev/null +++ b/packages/meta/lib/_util/transButton.d.ts @@ -0,0 +1,9 @@ +import * as React from 'react'; +interface TransButtonProps extends React.HTMLAttributes { + onClick?: (e?: React.MouseEvent) => void; + noStyle?: boolean; + autoFocus?: boolean; + disabled?: boolean; +} +declare const TransButton: React.ForwardRefExoticComponent>; +export default TransButton; diff --git a/packages/meta/lib/_util/transButton.js b/packages/meta/lib/_util/transButton.js new file mode 100644 index 0000000..ef6cd78 --- /dev/null +++ b/packages/meta/lib/_util/transButton.js @@ -0,0 +1,85 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/transButton.tsx +var transButton_exports = {}; +__export(transButton_exports, { + default: () => transButton_default +}); +module.exports = __toCommonJS(transButton_exports); +var import_KeyCode = __toESM(require("rc-util/lib/KeyCode")); +var React = __toESM(require("react")); +var inlineStyle = { + border: 0, + background: "transparent", + padding: 0, + lineHeight: "inherit", + display: "inline-block" +}; +var TransButton = React.forwardRef((props, ref) => { + const onKeyDown = (event) => { + const { keyCode } = event; + if (keyCode === import_KeyCode.default.ENTER) { + event.preventDefault(); + } + }; + const onKeyUp = (event) => { + const { keyCode } = event; + const { onClick } = props; + if (keyCode === import_KeyCode.default.ENTER && onClick) { + onClick(); + } + }; + const { style, noStyle, disabled, ...restProps } = props; + let mergedStyle = {}; + if (!noStyle) { + mergedStyle = { + ...inlineStyle + }; + } + if (disabled) { + mergedStyle.pointerEvents = "none"; + } + mergedStyle = { + ...mergedStyle, + ...style + }; + return /* @__PURE__ */ React.createElement( + "div", + { + role: "button", + tabIndex: 0, + ref, + ...restProps, + onKeyDown, + onKeyUp, + style: mergedStyle + } + ); +}); +var transButton_default = TransButton; diff --git a/packages/meta/lib/_util/transKeys.d.ts b/packages/meta/lib/_util/transKeys.d.ts new file mode 100644 index 0000000..50106b1 --- /dev/null +++ b/packages/meta/lib/_util/transKeys.d.ts @@ -0,0 +1,2 @@ +export declare const groupKeysMap: (keys: string[]) => Map; +export declare const groupDisabledKeysMap: (dataSource: RecordType) => Map; diff --git a/packages/meta/lib/_util/transKeys.js b/packages/meta/lib/_util/transKeys.js new file mode 100644 index 0000000..97bda1c --- /dev/null +++ b/packages/meta/lib/_util/transKeys.js @@ -0,0 +1,46 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/transKeys.ts +var transKeys_exports = {}; +__export(transKeys_exports, { + groupDisabledKeysMap: () => groupDisabledKeysMap, + groupKeysMap: () => groupKeysMap +}); +module.exports = __toCommonJS(transKeys_exports); +var groupKeysMap = (keys) => { + const map = /* @__PURE__ */ new Map(); + keys.forEach((key, index) => { + map.set(key, index); + }); + return map; +}; +var groupDisabledKeysMap = (dataSource) => { + const map = /* @__PURE__ */ new Map(); + dataSource.forEach(({ disabled, key }, index) => { + if (disabled) { + map.set(key, index); + } + }); + return map; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + groupDisabledKeysMap, + groupKeysMap +}); diff --git a/packages/meta/lib/_util/type.d.ts b/packages/meta/lib/_util/type.d.ts new file mode 100644 index 0000000..691eb85 --- /dev/null +++ b/packages/meta/lib/_util/type.d.ts @@ -0,0 +1,5 @@ +/// +/** https://github.com/Microsoft/TypeScript/issues/29729 */ +export type LiteralUnion = T | (string & {}); +export type AnyObject = Record; +export type CustomComponent

= React.ComponentType

| string; diff --git a/packages/meta/lib/_util/type.js b/packages/meta/lib/_util/type.js new file mode 100644 index 0000000..65dea9e --- /dev/null +++ b/packages/meta/lib/_util/type.js @@ -0,0 +1,17 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/type.ts +var type_exports = {}; +module.exports = __toCommonJS(type_exports); diff --git a/packages/meta/lib/_util/warning.d.ts b/packages/meta/lib/_util/warning.d.ts new file mode 100644 index 0000000..bbacf62 --- /dev/null +++ b/packages/meta/lib/_util/warning.d.ts @@ -0,0 +1,26 @@ +import * as React from 'react'; +export declare function noop(): void; +export declare function resetWarned(): void; +type Warning = (valid: boolean, component: string, message?: string) => void; +declare let warning: Warning; +type BaseTypeWarning = (valid: boolean, +/** + * - deprecated: Some API will be removed in future but still support now. + * - usage: Some API usage is not correct. + * - breaking: Breaking change like API is removed. + */ +type: 'deprecated' | 'usage' | 'breaking', message?: string) => void; +type TypeWarning = BaseTypeWarning & { + deprecated: (valid: boolean, oldProp: string, newProp: string, message?: string) => void; +}; +export interface WarningContextProps { + strict?: boolean; +} +export declare const WarningContext: React.Context; +/** + * This is a hook but we not named as `useWarning` + * since this is only used in development. + * We should always wrap this in `if (process.env.NODE_ENV !== 'production')` condition + */ +export declare const devUseWarning: (component: string) => TypeWarning; +export default warning; diff --git a/packages/meta/lib/_util/warning.js b/packages/meta/lib/_util/warning.js new file mode 100644 index 0000000..deca5aa --- /dev/null +++ b/packages/meta/lib/_util/warning.js @@ -0,0 +1,103 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/warning.ts +var warning_exports = {}; +__export(warning_exports, { + WarningContext: () => WarningContext, + default: () => warning_default, + devUseWarning: () => devUseWarning, + noop: () => noop, + resetWarned: () => resetWarned +}); +module.exports = __toCommonJS(warning_exports); +var React = __toESM(require("react")); +var import_warning = __toESM(require("rc-util/lib/warning")); +function noop() { +} +var deprecatedWarnList = null; +function resetWarned() { + deprecatedWarnList = null; + (0, import_warning.resetWarned)(); +} +var warning = noop; +if (process.env.NODE_ENV !== "production") { + warning = (valid, component, message) => { + (0, import_warning.default)(valid, `[antd: ${component}] ${message}`); + if (process.env.NODE_ENV === "test") { + resetWarned(); + } + }; +} +var WarningContext = React.createContext({}); +var devUseWarning = process.env.NODE_ENV !== "production" ? (component) => { + const { strict } = React.useContext(WarningContext); + const typeWarning = (valid, type, message) => { + if (!valid) { + if (strict === false && type === "deprecated") { + const existWarning = deprecatedWarnList; + if (!deprecatedWarnList) { + deprecatedWarnList = {}; + } + deprecatedWarnList[component] = deprecatedWarnList[component] || []; + if (!deprecatedWarnList[component].includes(message || "")) { + deprecatedWarnList[component].push(message || ""); + } + if (!existWarning) { + console.warn( + "[antd] There exists deprecated usage in your code:", + deprecatedWarnList + ); + } + } else { + warning(valid, component, message); + } + } + }; + typeWarning.deprecated = (valid, oldProp, newProp, message) => { + typeWarning( + valid, + "deprecated", + `\`${oldProp}\` is deprecated. Please use \`${newProp}\` instead.${message ? ` ${message}` : ""}` + ); + }; + return typeWarning; +} : () => { + const noopWarning = () => { + }; + noopWarning.deprecated = noop; + return noopWarning; +}; +var warning_default = warning; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + WarningContext, + devUseWarning, + noop, + resetWarned +}); diff --git a/packages/meta/lib/_util/wave/WaveEffect.d.ts b/packages/meta/lib/_util/wave/WaveEffect.d.ts new file mode 100644 index 0000000..37d4798 --- /dev/null +++ b/packages/meta/lib/_util/wave/WaveEffect.d.ts @@ -0,0 +1,8 @@ +import { type ShowWaveEffect } from './interface'; +export interface WaveEffectProps { + className: string; + target: HTMLElement; + component?: string; +} +declare const showWaveEffect: ShowWaveEffect; +export default showWaveEffect; diff --git a/packages/meta/lib/_util/wave/WaveEffect.js b/packages/meta/lib/_util/wave/WaveEffect.js new file mode 100644 index 0000000..3d282ab --- /dev/null +++ b/packages/meta/lib/_util/wave/WaveEffect.js @@ -0,0 +1,157 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/wave/WaveEffect.tsx +var WaveEffect_exports = {}; +__export(WaveEffect_exports, { + default: () => WaveEffect_default +}); +module.exports = __toCommonJS(WaveEffect_exports); +var import_classnames = __toESM(require("classnames")); +var import_rc_motion = __toESM(require("rc-motion")); +var import_render = require("rc-util/lib/React/render"); +var import_raf = __toESM(require("rc-util/lib/raf")); +var React = __toESM(require("react")); +var import_util = require("./util"); +var import_interface = require("./interface"); +function validateNum(value) { + return Number.isNaN(value) ? 0 : value; +} +var WaveEffect = (props) => { + const { className, target, component } = props; + const divRef = React.useRef(null); + const [color, setWaveColor] = React.useState(null); + const [borderRadius, setBorderRadius] = React.useState([]); + const [left, setLeft] = React.useState(0); + const [top, setTop] = React.useState(0); + const [width, setWidth] = React.useState(0); + const [height, setHeight] = React.useState(0); + const [enabled, setEnabled] = React.useState(false); + const waveStyle = { + left, + top, + width, + height, + borderRadius: borderRadius.map((radius) => `${radius}px`).join(" ") + }; + if (color) { + waveStyle["--wave-color"] = color; + } + function syncPos() { + const nodeStyle = getComputedStyle(target); + setWaveColor((0, import_util.getTargetWaveColor)(target)); + const isStatic = nodeStyle.position === "static"; + const { borderLeftWidth, borderTopWidth } = nodeStyle; + setLeft(isStatic ? target.offsetLeft : validateNum(-parseFloat(borderLeftWidth))); + setTop(isStatic ? target.offsetTop : validateNum(-parseFloat(borderTopWidth))); + setWidth(target.offsetWidth); + setHeight(target.offsetHeight); + const { + borderTopLeftRadius, + borderTopRightRadius, + borderBottomLeftRadius, + borderBottomRightRadius + } = nodeStyle; + setBorderRadius( + [ + borderTopLeftRadius, + borderTopRightRadius, + borderBottomRightRadius, + borderBottomLeftRadius + ].map((radius) => validateNum(parseFloat(radius))) + ); + } + React.useEffect(() => { + if (target) { + const id = (0, import_raf.default)(() => { + syncPos(); + setEnabled(true); + }); + let resizeObserver; + if (typeof ResizeObserver !== "undefined") { + resizeObserver = new ResizeObserver(syncPos); + resizeObserver.observe(target); + } + return () => { + import_raf.default.cancel(id); + resizeObserver == null ? void 0 : resizeObserver.disconnect(); + }; + } + }, []); + if (!enabled) { + return null; + } + const isSmallComponent = (component === "Checkbox" || component === "Radio") && (target == null ? void 0 : target.classList.contains(import_interface.TARGET_CLS)); + return /* @__PURE__ */ React.createElement( + import_rc_motion.default, + { + visible: true, + motionAppear: true, + motionName: "wave-motion", + motionDeadline: 5e3, + onAppearEnd: (_, event) => { + var _a; + if (event.deadline || event.propertyName === "opacity") { + const holder = (_a = divRef.current) == null ? void 0 : _a.parentElement; + (0, import_render.unmount)(holder).then(() => { + holder == null ? void 0 : holder.remove(); + }); + } + return false; + } + }, + ({ className: motionClassName }) => /* @__PURE__ */ React.createElement( + "div", + { + ref: divRef, + className: (0, import_classnames.default)( + className, + { + "wave-quick": isSmallComponent + }, + motionClassName + ), + style: waveStyle + } + ) + ); +}; +var showWaveEffect = (target, info) => { + var _a; + const { component } = info; + if (component === "Checkbox" && !((_a = target.querySelector("input")) == null ? void 0 : _a.checked)) { + return; + } + const holder = document.createElement("div"); + holder.style.position = "absolute"; + holder.style.left = "0px"; + holder.style.top = "0px"; + target == null ? void 0 : target.insertBefore(holder, target == null ? void 0 : target.firstChild); + (0, import_render.render)(/* @__PURE__ */ React.createElement(WaveEffect, { ...info, target }), holder); +}; +var WaveEffect_default = showWaveEffect; diff --git a/packages/meta/lib/_util/wave/index.d.ts b/packages/meta/lib/_util/wave/index.d.ts new file mode 100644 index 0000000..e53b2e7 --- /dev/null +++ b/packages/meta/lib/_util/wave/index.d.ts @@ -0,0 +1,8 @@ +import React from 'react'; +export interface WaveProps { + disabled?: boolean; + children?: React.ReactNode; + component?: string; +} +declare const Wave: React.FC; +export default Wave; diff --git a/packages/meta/lib/_util/wave/index.js b/packages/meta/lib/_util/wave/index.js new file mode 100644 index 0000000..d26c96c --- /dev/null +++ b/packages/meta/lib/_util/wave/index.js @@ -0,0 +1,76 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/wave/index.ts +var wave_exports = {}; +__export(wave_exports, { + default: () => wave_default +}); +module.exports = __toCommonJS(wave_exports); +var import_classnames = __toESM(require("classnames")); +var import_ref = require("rc-util/lib/ref"); +var import_isVisible = __toESM(require("rc-util/lib/Dom/isVisible")); +var import_react = __toESM(require("react")); +var import_config_provider = require("../../config-provider"); +var import_reactNode = require("../reactNode"); +var import_style = __toESM(require("./style")); +var import_useWave = __toESM(require("./useWave")); +var Wave = (props) => { + const { children, disabled, component } = props; + const { getPrefixCls } = (0, import_react.useContext)(import_config_provider.ConfigContext); + const containerRef = (0, import_react.useRef)(null); + const prefixCls = getPrefixCls("wave"); + const [, hashId] = (0, import_style.default)(prefixCls); + const showWave = (0, import_useWave.default)(containerRef, (0, import_classnames.default)(prefixCls, hashId), component); + import_react.default.useEffect(() => { + const node = containerRef.current; + if (!node || node.nodeType !== 1 || disabled) { + return; + } + const onClick = (e) => { + if (!(0, import_isVisible.default)(e.target) || // No need wave + !node.getAttribute || node.getAttribute("disabled") || node.disabled || node.className.includes("disabled") || node.className.includes("-leave")) { + return; + } + showWave(e); + }; + node.addEventListener("click", onClick, true); + return () => { + node.removeEventListener("click", onClick, true); + }; + }, [disabled]); + if (!import_react.default.isValidElement(children)) { + return children ?? null; + } + const ref = (0, import_ref.supportRef)(children) ? (0, import_ref.composeRef)(children.ref, containerRef) : containerRef; + return (0, import_reactNode.cloneElement)(children, { ref }); +}; +if (process.env.NODE_ENV !== "production") { + Wave.displayName = "Wave"; +} +var wave_default = Wave; diff --git a/packages/meta/lib/_util/wave/interface.d.ts b/packages/meta/lib/_util/wave/interface.d.ts new file mode 100644 index 0000000..2431aec --- /dev/null +++ b/packages/meta/lib/_util/wave/interface.d.ts @@ -0,0 +1,10 @@ +import type { GlobalToken } from '../../theme'; +export declare const TARGET_CLS = "ant-wave-target"; +export type ShowWaveEffect = (element: HTMLElement, info: { + className: string; + token: GlobalToken; + component?: string; + event: MouseEvent; + hashId: string; +}) => void; +export type ShowWave = (event: MouseEvent) => void; diff --git a/packages/constants/lib/camera/index.js b/packages/meta/lib/_util/wave/interface.js similarity index 80% rename from packages/constants/lib/camera/index.js rename to packages/meta/lib/_util/wave/interface.js index 19931cc..a83dd84 100644 --- a/packages/constants/lib/camera/index.js +++ b/packages/meta/lib/_util/wave/interface.js @@ -16,14 +16,14 @@ var __copyProps = (to, from, except, desc) => { }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -// src/camera/index.ts -var camera_exports = {}; -__export(camera_exports, { - TYPE: () => TYPE +// src/_util/wave/interface.ts +var interface_exports = {}; +__export(interface_exports, { + TARGET_CLS: () => TARGET_CLS }); -module.exports = __toCommonJS(camera_exports); -var TYPE = ""; +module.exports = __toCommonJS(interface_exports); +var TARGET_CLS = "ant-wave-target"; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { - TYPE + TARGET_CLS }); diff --git a/packages/meta/lib/_util/wave/style.d.ts b/packages/meta/lib/_util/wave/style.d.ts new file mode 100644 index 0000000..afdaedb --- /dev/null +++ b/packages/meta/lib/_util/wave/style.d.ts @@ -0,0 +1,7 @@ +import type { FullToken } from '../../theme/internal'; +export interface ComponentToken { +} +export interface WaveToken extends FullToken<'Wave'> { +} +declare const _default: (prefixCls: string) => import("../../theme/interface").UseComponentStyleResult; +export default _default; diff --git a/packages/meta/lib/_util/wave/style.js b/packages/meta/lib/_util/wave/style.js new file mode 100644 index 0000000..eacd24d --- /dev/null +++ b/packages/meta/lib/_util/wave/style.js @@ -0,0 +1,57 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/wave/style.ts +var style_exports = {}; +__export(style_exports, { + default: () => style_default +}); +module.exports = __toCommonJS(style_exports); +var import_internal = require("../../theme/internal"); +var genWaveStyle = (token) => { + const { componentCls, colorPrimary } = token; + return { + [componentCls]: { + position: "absolute", + background: "transparent", + pointerEvents: "none", + boxSizing: "border-box", + color: `var(--wave-color, ${colorPrimary})`, + boxShadow: `0 0 0 0 currentcolor`, + opacity: 0.2, + // =================== Motion =================== + "&.wave-motion-appear": { + transition: [ + `box-shadow 0.4s ${token.motionEaseOutCirc}`, + `opacity 2s ${token.motionEaseOutCirc}` + ].join(","), + "&-active": { + boxShadow: `0 0 0 6px currentcolor`, + opacity: 0 + }, + "&.wave-quick": { + transition: [ + `box-shadow 0.3s ${token.motionEaseInOut}`, + `opacity 0.35s ${token.motionEaseInOut}` + ].join(",") + } + } + } + }; +}; +var style_default = (0, import_internal.genComponentStyleHook)("Wave", (token) => [genWaveStyle(token)]); diff --git a/packages/meta/lib/_util/wave/useWave.d.ts b/packages/meta/lib/_util/wave/useWave.d.ts new file mode 100644 index 0000000..312e512 --- /dev/null +++ b/packages/meta/lib/_util/wave/useWave.d.ts @@ -0,0 +1,3 @@ +import * as React from 'react'; +import { type ShowWave } from './interface'; +export default function useWave(nodeRef: React.RefObject, className: string, component?: string): ShowWave; diff --git a/packages/meta/lib/_util/wave/useWave.js b/packages/meta/lib/_util/wave/useWave.js new file mode 100644 index 0000000..142c3ad --- /dev/null +++ b/packages/meta/lib/_util/wave/useWave.js @@ -0,0 +1,62 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/wave/useWave.ts +var useWave_exports = {}; +__export(useWave_exports, { + default: () => useWave +}); +module.exports = __toCommonJS(useWave_exports); +var React = __toESM(require("react")); +var import_rc_util = require("rc-util"); +var import_raf = __toESM(require("rc-util/lib/raf")); +var import_WaveEffect = __toESM(require("./WaveEffect")); +var import_config_provider = require("../../config-provider"); +var import_useToken = __toESM(require("../../theme/useToken")); +var import_interface = require("./interface"); +function useWave(nodeRef, className, component) { + const { wave } = React.useContext(import_config_provider.ConfigContext); + const [, token, hashId] = (0, import_useToken.default)(); + const showWave = (0, import_rc_util.useEvent)((event) => { + const node = nodeRef.current; + if ((wave == null ? void 0 : wave.disabled) || !node) { + return; + } + const targetNode = node.querySelector(`.${import_interface.TARGET_CLS}`) || node; + const { showEffect } = wave || {}; + (showEffect || import_WaveEffect.default)(targetNode, { className, token, component, event, hashId }); + }); + const rafId = React.useRef(); + const showDebounceWave = (event) => { + import_raf.default.cancel(rafId.current); + rafId.current = (0, import_raf.default)(() => { + showWave(event); + }); + }; + return showDebounceWave; +} diff --git a/packages/meta/lib/_util/wave/util.d.ts b/packages/meta/lib/_util/wave/util.d.ts new file mode 100644 index 0000000..f2c1ead --- /dev/null +++ b/packages/meta/lib/_util/wave/util.d.ts @@ -0,0 +1,3 @@ +export declare function isNotGrey(color: string): boolean; +export declare function isValidWaveColor(color: string): boolean | ""; +export declare function getTargetWaveColor(node: HTMLElement): string | null; diff --git a/packages/meta/lib/_util/wave/util.js b/packages/meta/lib/_util/wave/util.js new file mode 100644 index 0000000..66b5324 --- /dev/null +++ b/packages/meta/lib/_util/wave/util.js @@ -0,0 +1,56 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/wave/util.ts +var util_exports = {}; +__export(util_exports, { + getTargetWaveColor: () => getTargetWaveColor, + isNotGrey: () => isNotGrey, + isValidWaveColor: () => isValidWaveColor +}); +module.exports = __toCommonJS(util_exports); +function isNotGrey(color) { + const match = (color || "").match(/rgba?\((\d*), (\d*), (\d*)(, [\d.]*)?\)/); + if (match && match[1] && match[2] && match[3]) { + return !(match[1] === match[2] && match[2] === match[3]); + } + return true; +} +function isValidWaveColor(color) { + return color && color !== "#fff" && color !== "#ffffff" && color !== "rgb(255, 255, 255)" && color !== "rgba(255, 255, 255, 1)" && isNotGrey(color) && !/rgba\((?:\d*, ){3}0\)/.test(color) && // any transparent rgba color + color !== "transparent"; +} +function getTargetWaveColor(node) { + const { borderTopColor, borderColor, backgroundColor } = getComputedStyle(node); + if (isValidWaveColor(borderTopColor)) { + return borderTopColor; + } + if (isValidWaveColor(borderColor)) { + return borderColor; + } + if (isValidWaveColor(backgroundColor)) { + return backgroundColor; + } + return null; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getTargetWaveColor, + isNotGrey, + isValidWaveColor +}); diff --git a/packages/meta/lib/_util/zindexContext.d.ts b/packages/meta/lib/_util/zindexContext.d.ts new file mode 100644 index 0000000..e5c11be --- /dev/null +++ b/packages/meta/lib/_util/zindexContext.d.ts @@ -0,0 +1,3 @@ +import React from 'react'; +declare const zIndexContext: React.Context; +export default zIndexContext; diff --git a/packages/meta/lib/_util/zindexContext.js b/packages/meta/lib/_util/zindexContext.js new file mode 100644 index 0000000..2ce2106 --- /dev/null +++ b/packages/meta/lib/_util/zindexContext.js @@ -0,0 +1,40 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/_util/zindexContext.ts +var zindexContext_exports = {}; +__export(zindexContext_exports, { + default: () => zindexContext_default +}); +module.exports = __toCommonJS(zindexContext_exports); +var import_react = __toESM(require("react")); +var zIndexContext = import_react.default.createContext(void 0); +if (process.env.NODE_ENV !== "production") { + zIndexContext.displayName = "zIndexContext"; +} +var zindexContext_default = zIndexContext; diff --git a/packages/meta/lib/theme/internal.d.ts b/packages/meta/lib/theme/internal.d.ts new file mode 100644 index 0000000..67c4f77 --- /dev/null +++ b/packages/meta/lib/theme/internal.d.ts @@ -0,0 +1,13 @@ +import { useStyleRegister } from '@ant-design/cssinjs'; +import type { AliasToken, GenerateStyle, PresetColorKey, PresetColorType, SeedToken, UseComponentStyleResult } from './interface'; +import { PresetColors } from './interface'; +import useToken from './useToken'; +import type { FullToken, GetDefaultToken } from './util/genComponentStyleHook'; +import genComponentStyleHook, { genSubStyleComponent, genStyleHooks } from './util/genComponentStyleHook'; +import genPresetColor from './util/genPresetColor'; +import statisticToken, { merge as mergeToken } from './util/statistic'; +import useResetIconStyle from './util/useResetIconStyle'; +import calc from './util/calc'; +export { DesignTokenContext, defaultConfig } from './context'; +export { PresetColors, genComponentStyleHook, genSubStyleComponent, genPresetColor, genStyleHooks, mergeToken, statisticToken, calc, useResetIconStyle, useStyleRegister, useToken, }; +export type { AliasToken, AliasToken as DerivativeToken, FullToken, GenerateStyle, PresetColorKey, PresetColorType, SeedToken, UseComponentStyleResult, GetDefaultToken, }; diff --git a/packages/meta/lib/theme/internal.js b/packages/meta/lib/theme/internal.js new file mode 100644 index 0000000..92f8c77 --- /dev/null +++ b/packages/meta/lib/theme/internal.js @@ -0,0 +1,71 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/internal.ts +var internal_exports = {}; +__export(internal_exports, { + DesignTokenContext: () => import_context.DesignTokenContext, + PresetColors: () => import_interface.PresetColors, + calc: () => import_calc.default, + defaultConfig: () => import_context.defaultConfig, + genComponentStyleHook: () => import_genComponentStyleHook.default, + genPresetColor: () => import_genPresetColor.default, + genStyleHooks: () => import_genComponentStyleHook.genStyleHooks, + genSubStyleComponent: () => import_genComponentStyleHook.genSubStyleComponent, + mergeToken: () => import_statistic.merge, + statisticToken: () => import_statistic.default, + useResetIconStyle: () => import_useResetIconStyle.default, + useStyleRegister: () => import_cssinjs.useStyleRegister, + useToken: () => import_useToken.default +}); +module.exports = __toCommonJS(internal_exports); +var import_cssinjs = require("@ant-design/cssinjs"); +var import_interface = require("./interface"); +var import_useToken = __toESM(require("./useToken")); +var import_genComponentStyleHook = __toESM(require("./util/genComponentStyleHook")); +var import_genPresetColor = __toESM(require("./util/genPresetColor")); +var import_statistic = __toESM(require("./util/statistic")); +var import_useResetIconStyle = __toESM(require("./util/useResetIconStyle")); +var import_calc = __toESM(require("./util/calc")); +var import_context = require("./context"); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + DesignTokenContext, + PresetColors, + calc, + defaultConfig, + genComponentStyleHook, + genPresetColor, + genStyleHooks, + genSubStyleComponent, + mergeToken, + statisticToken, + useResetIconStyle, + useStyleRegister, + useToken +}); diff --git a/packages/meta/lib/theme/themes/ColorMap.d.ts b/packages/meta/lib/theme/themes/ColorMap.d.ts new file mode 100644 index 0000000..be0dba1 --- /dev/null +++ b/packages/meta/lib/theme/themes/ColorMap.d.ts @@ -0,0 +1,15 @@ +import type { ColorNeutralMapToken } from '../interface'; +export interface ColorMap { + 1: string; + 2: string; + 3: string; + 4: string; + 5: string; + 6: string; + 7: string; + 8: string; + 9: string; + 10: string; +} +export type GenerateColorMap = (baseColor: string) => ColorMap; +export type GenerateNeutralColorMap = (bgBaseColor: string, textBaseColor: string) => ColorNeutralMapToken; diff --git a/packages/meta/lib/theme/themes/ColorMap.js b/packages/meta/lib/theme/themes/ColorMap.js new file mode 100644 index 0000000..b56de09 --- /dev/null +++ b/packages/meta/lib/theme/themes/ColorMap.js @@ -0,0 +1,17 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/ColorMap.ts +var ColorMap_exports = {}; +module.exports = __toCommonJS(ColorMap_exports); diff --git a/packages/meta/lib/theme/themes/compact/genCompactSizeMapToken.d.ts b/packages/meta/lib/theme/themes/compact/genCompactSizeMapToken.d.ts new file mode 100644 index 0000000..87332e7 --- /dev/null +++ b/packages/meta/lib/theme/themes/compact/genCompactSizeMapToken.d.ts @@ -0,0 +1,2 @@ +import type { SeedToken, SizeMapToken } from '../../interface'; +export default function genSizeMapToken(token: SeedToken): SizeMapToken; diff --git a/packages/meta/lib/theme/themes/compact/genCompactSizeMapToken.js b/packages/meta/lib/theme/themes/compact/genCompactSizeMapToken.js new file mode 100644 index 0000000..fef3a77 --- /dev/null +++ b/packages/meta/lib/theme/themes/compact/genCompactSizeMapToken.js @@ -0,0 +1,39 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/compact/genCompactSizeMapToken.ts +var genCompactSizeMapToken_exports = {}; +__export(genCompactSizeMapToken_exports, { + default: () => genSizeMapToken +}); +module.exports = __toCommonJS(genCompactSizeMapToken_exports); +function genSizeMapToken(token) { + const { sizeUnit, sizeStep } = token; + const compactSizeStep = sizeStep - 2; + return { + sizeXXL: sizeUnit * (compactSizeStep + 10), + sizeXL: sizeUnit * (compactSizeStep + 6), + sizeLG: sizeUnit * (compactSizeStep + 2), + sizeMD: sizeUnit * (compactSizeStep + 2), + sizeMS: sizeUnit * (compactSizeStep + 1), + size: sizeUnit * compactSizeStep, + sizeSM: sizeUnit * compactSizeStep, + sizeXS: sizeUnit * (compactSizeStep - 1), + sizeXXS: sizeUnit * (compactSizeStep - 1) + }; +} diff --git a/packages/meta/lib/theme/themes/compact/index.d.ts b/packages/meta/lib/theme/themes/compact/index.d.ts new file mode 100644 index 0000000..d5901cb --- /dev/null +++ b/packages/meta/lib/theme/themes/compact/index.d.ts @@ -0,0 +1,4 @@ +import type { DerivativeFunc } from '@ant-design/cssinjs'; +import type { MapToken, SeedToken } from '../../interface'; +declare const derivative: DerivativeFunc; +export default derivative; diff --git a/packages/meta/lib/theme/themes/compact/index.js b/packages/meta/lib/theme/themes/compact/index.js new file mode 100644 index 0000000..55c93d6 --- /dev/null +++ b/packages/meta/lib/theme/themes/compact/index.js @@ -0,0 +1,53 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/compact/index.ts +var compact_exports = {}; +__export(compact_exports, { + default: () => compact_default +}); +module.exports = __toCommonJS(compact_exports); +var import_genControlHeight = __toESM(require("../shared/genControlHeight")); +var import_default = __toESM(require("../default")); +var import_genCompactSizeMapToken = __toESM(require("./genCompactSizeMapToken")); +var import_genFontMapToken = __toESM(require("../shared/genFontMapToken")); +var derivative = (token, mapToken) => { + const mergedMapToken = mapToken ?? (0, import_default.default)(token); + const fontSize = mergedMapToken.fontSizeSM; + const controlHeight = mergedMapToken.controlHeight - 4; + return { + ...mergedMapToken, + ...(0, import_genCompactSizeMapToken.default)(mapToken ?? token), + // font + ...(0, import_genFontMapToken.default)(fontSize), + // controlHeight + controlHeight, + ...(0, import_genControlHeight.default)({ ...mergedMapToken, controlHeight }) + }; +}; +var compact_default = derivative; diff --git a/packages/meta/lib/theme/themes/dark/colorAlgorithm.d.ts b/packages/meta/lib/theme/themes/dark/colorAlgorithm.d.ts new file mode 100644 index 0000000..e1b0d62 --- /dev/null +++ b/packages/meta/lib/theme/themes/dark/colorAlgorithm.d.ts @@ -0,0 +1,2 @@ +export declare const getAlphaColor: (baseColor: string, alpha: number) => string; +export declare const getSolidColor: (baseColor: string, brightness: number) => string; diff --git a/packages/meta/lib/theme/themes/dark/colorAlgorithm.js b/packages/meta/lib/theme/themes/dark/colorAlgorithm.js new file mode 100644 index 0000000..c550320 --- /dev/null +++ b/packages/meta/lib/theme/themes/dark/colorAlgorithm.js @@ -0,0 +1,36 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/dark/colorAlgorithm.ts +var colorAlgorithm_exports = {}; +__export(colorAlgorithm_exports, { + getAlphaColor: () => getAlphaColor, + getSolidColor: () => getSolidColor +}); +module.exports = __toCommonJS(colorAlgorithm_exports); +var import_tinycolor = require("@ctrl/tinycolor"); +var getAlphaColor = (baseColor, alpha) => new import_tinycolor.TinyColor(baseColor).setAlpha(alpha).toRgbString(); +var getSolidColor = (baseColor, brightness) => { + const instance = new import_tinycolor.TinyColor(baseColor); + return instance.lighten(brightness).toHexString(); +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getAlphaColor, + getSolidColor +}); diff --git a/packages/meta/lib/theme/themes/dark/colors.d.ts b/packages/meta/lib/theme/themes/dark/colors.d.ts new file mode 100644 index 0000000..80ddcce --- /dev/null +++ b/packages/meta/lib/theme/themes/dark/colors.d.ts @@ -0,0 +1,3 @@ +import type { GenerateColorMap, GenerateNeutralColorMap } from '../ColorMap'; +export declare const generateColorPalettes: GenerateColorMap; +export declare const generateNeutralColorPalettes: GenerateNeutralColorMap; diff --git a/packages/meta/lib/theme/themes/dark/colors.js b/packages/meta/lib/theme/themes/dark/colors.js new file mode 100644 index 0000000..24c081b --- /dev/null +++ b/packages/meta/lib/theme/themes/dark/colors.js @@ -0,0 +1,73 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/dark/colors.ts +var colors_exports = {}; +__export(colors_exports, { + generateColorPalettes: () => generateColorPalettes, + generateNeutralColorPalettes: () => generateNeutralColorPalettes +}); +module.exports = __toCommonJS(colors_exports); +var import_colors = require("@ant-design/colors"); +var import_colorAlgorithm = require("./colorAlgorithm"); +var generateColorPalettes = (baseColor) => { + const colors = (0, import_colors.generate)(baseColor, { theme: "dark" }); + return { + 1: colors[0], + 2: colors[1], + 3: colors[2], + 4: colors[3], + 5: colors[6], + 6: colors[5], + 7: colors[4], + 8: colors[6], + 9: colors[5], + 10: colors[4] + // 8: colors[9], + // 9: colors[8], + // 10: colors[7], + }; +}; +var generateNeutralColorPalettes = (bgBaseColor, textBaseColor) => { + const colorBgBase = bgBaseColor || "#000"; + const colorTextBase = textBaseColor || "#fff"; + return { + colorBgBase, + colorTextBase, + colorText: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.85), + colorTextSecondary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.65), + colorTextTertiary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.45), + colorTextQuaternary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.25), + colorFill: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.18), + colorFillSecondary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.12), + colorFillTertiary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.08), + colorFillQuaternary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.04), + colorBgElevated: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 12), + colorBgContainer: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 8), + colorBgLayout: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 0), + colorBgSpotlight: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 26), + colorBgBlur: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.04), + colorBorder: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 26), + colorBorderSecondary: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 19) + }; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + generateColorPalettes, + generateNeutralColorPalettes +}); diff --git a/packages/meta/lib/theme/themes/dark/index.d.ts b/packages/meta/lib/theme/themes/dark/index.d.ts new file mode 100644 index 0000000..d5901cb --- /dev/null +++ b/packages/meta/lib/theme/themes/dark/index.d.ts @@ -0,0 +1,4 @@ +import type { DerivativeFunc } from '@ant-design/cssinjs'; +import type { MapToken, SeedToken } from '../../interface'; +declare const derivative: DerivativeFunc; +export default derivative; diff --git a/packages/meta/lib/theme/themes/dark/index.js b/packages/meta/lib/theme/themes/dark/index.js new file mode 100644 index 0000000..3bafb34 --- /dev/null +++ b/packages/meta/lib/theme/themes/dark/index.js @@ -0,0 +1,70 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/dark/index.ts +var dark_exports = {}; +__export(dark_exports, { + default: () => dark_default +}); +module.exports = __toCommonJS(dark_exports); +var import_colors = require("@ant-design/colors"); +var import_seed = require("../seed"); +var import_genColorMapToken = __toESM(require("../shared/genColorMapToken")); +var import_colors2 = require("./colors"); +var import_default = __toESM(require("../default")); +var derivative = (token, mapToken) => { + const colorPalettes = Object.keys(import_seed.defaultPresetColors).map((colorKey) => { + const colors = (0, import_colors.generate)(token[colorKey], { theme: "dark" }); + return new Array(10).fill(1).reduce((prev, _, i) => { + prev[`${colorKey}-${i + 1}`] = colors[i]; + prev[`${colorKey}${i + 1}`] = colors[i]; + return prev; + }, {}); + }).reduce( + (prev, cur) => { + prev = { + ...prev, + ...cur + }; + return prev; + }, + {} + ); + const mergedMapToken = mapToken ?? (0, import_default.default)(token); + return { + ...mergedMapToken, + // Dark tokens + ...colorPalettes, + // Colors + ...(0, import_genColorMapToken.default)(token, { + generateColorPalettes: import_colors2.generateColorPalettes, + generateNeutralColorPalettes: import_colors2.generateNeutralColorPalettes + }) + }; +}; +var dark_default = derivative; diff --git a/packages/meta/lib/theme/themes/default/colorAlgorithm.d.ts b/packages/meta/lib/theme/themes/default/colorAlgorithm.d.ts new file mode 100644 index 0000000..e1b0d62 --- /dev/null +++ b/packages/meta/lib/theme/themes/default/colorAlgorithm.d.ts @@ -0,0 +1,2 @@ +export declare const getAlphaColor: (baseColor: string, alpha: number) => string; +export declare const getSolidColor: (baseColor: string, brightness: number) => string; diff --git a/packages/meta/lib/theme/themes/default/colorAlgorithm.js b/packages/meta/lib/theme/themes/default/colorAlgorithm.js new file mode 100644 index 0000000..18fabc8 --- /dev/null +++ b/packages/meta/lib/theme/themes/default/colorAlgorithm.js @@ -0,0 +1,36 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/default/colorAlgorithm.ts +var colorAlgorithm_exports = {}; +__export(colorAlgorithm_exports, { + getAlphaColor: () => getAlphaColor, + getSolidColor: () => getSolidColor +}); +module.exports = __toCommonJS(colorAlgorithm_exports); +var import_tinycolor = require("@ctrl/tinycolor"); +var getAlphaColor = (baseColor, alpha) => new import_tinycolor.TinyColor(baseColor).setAlpha(alpha).toRgbString(); +var getSolidColor = (baseColor, brightness) => { + const instance = new import_tinycolor.TinyColor(baseColor); + return instance.darken(brightness).toHexString(); +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getAlphaColor, + getSolidColor +}); diff --git a/packages/meta/lib/theme/themes/default/colors.d.ts b/packages/meta/lib/theme/themes/default/colors.d.ts new file mode 100644 index 0000000..80ddcce --- /dev/null +++ b/packages/meta/lib/theme/themes/default/colors.d.ts @@ -0,0 +1,3 @@ +import type { GenerateColorMap, GenerateNeutralColorMap } from '../ColorMap'; +export declare const generateColorPalettes: GenerateColorMap; +export declare const generateNeutralColorPalettes: GenerateNeutralColorMap; diff --git a/packages/meta/lib/theme/themes/default/colors.js b/packages/meta/lib/theme/themes/default/colors.js new file mode 100644 index 0000000..113efd3 --- /dev/null +++ b/packages/meta/lib/theme/themes/default/colors.js @@ -0,0 +1,73 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/default/colors.ts +var colors_exports = {}; +__export(colors_exports, { + generateColorPalettes: () => generateColorPalettes, + generateNeutralColorPalettes: () => generateNeutralColorPalettes +}); +module.exports = __toCommonJS(colors_exports); +var import_colors = require("@ant-design/colors"); +var import_colorAlgorithm = require("./colorAlgorithm"); +var generateColorPalettes = (baseColor) => { + const colors = (0, import_colors.generate)(baseColor); + return { + 1: colors[0], + 2: colors[1], + 3: colors[2], + 4: colors[3], + 5: colors[4], + 6: colors[5], + 7: colors[6], + 8: colors[4], + 9: colors[5], + 10: colors[6] + // 8: colors[7], + // 9: colors[8], + // 10: colors[9], + }; +}; +var generateNeutralColorPalettes = (bgBaseColor, textBaseColor) => { + const colorBgBase = bgBaseColor || "#fff"; + const colorTextBase = textBaseColor || "#000"; + return { + colorBgBase, + colorTextBase, + colorText: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.88), + colorTextSecondary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.65), + colorTextTertiary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.45), + colorTextQuaternary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.25), + colorFill: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.15), + colorFillSecondary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.06), + colorFillTertiary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.04), + colorFillQuaternary: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.02), + colorBgLayout: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 4), + colorBgContainer: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 0), + colorBgElevated: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 0), + colorBgSpotlight: (0, import_colorAlgorithm.getAlphaColor)(colorTextBase, 0.85), + colorBgBlur: "transparent", + colorBorder: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 15), + colorBorderSecondary: (0, import_colorAlgorithm.getSolidColor)(colorBgBase, 6) + }; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + generateColorPalettes, + generateNeutralColorPalettes +}); diff --git a/packages/meta/lib/theme/themes/default/index.d.ts b/packages/meta/lib/theme/themes/default/index.d.ts new file mode 100644 index 0000000..b11222d --- /dev/null +++ b/packages/meta/lib/theme/themes/default/index.d.ts @@ -0,0 +1,2 @@ +import type { MapToken, SeedToken } from '../../interface'; +export default function derivative(token: SeedToken): MapToken; diff --git a/packages/meta/lib/theme/themes/default/index.js b/packages/meta/lib/theme/themes/default/index.js new file mode 100644 index 0000000..e384325 --- /dev/null +++ b/packages/meta/lib/theme/themes/default/index.js @@ -0,0 +1,78 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/default/index.ts +var default_exports = {}; +__export(default_exports, { + default: () => derivative +}); +module.exports = __toCommonJS(default_exports); +var import_colors = require("@ant-design/colors"); +var import_genControlHeight = __toESM(require("../shared/genControlHeight")); +var import_genSizeMapToken = __toESM(require("../shared/genSizeMapToken")); +var import_seed = require("../seed"); +var import_genColorMapToken = __toESM(require("../shared/genColorMapToken")); +var import_genCommonMapToken = __toESM(require("../shared/genCommonMapToken")); +var import_colors2 = require("./colors"); +var import_genFontMapToken = __toESM(require("../shared/genFontMapToken")); +function derivative(token) { + const colorPalettes = Object.keys(import_seed.defaultPresetColors).map((colorKey) => { + const colors = (0, import_colors.generate)(token[colorKey]); + return new Array(10).fill(1).reduce((prev, _, i) => { + prev[`${colorKey}-${i + 1}`] = colors[i]; + prev[`${colorKey}${i + 1}`] = colors[i]; + return prev; + }, {}); + }).reduce( + (prev, cur) => { + prev = { + ...prev, + ...cur + }; + return prev; + }, + {} + ); + return { + ...token, + ...colorPalettes, + // Colors + ...(0, import_genColorMapToken.default)(token, { + generateColorPalettes: import_colors2.generateColorPalettes, + generateNeutralColorPalettes: import_colors2.generateNeutralColorPalettes + }), + // Font + ...(0, import_genFontMapToken.default)(token.fontSize), + // Size + ...(0, import_genSizeMapToken.default)(token), + // Height + ...(0, import_genControlHeight.default)(token), + // Others + ...(0, import_genCommonMapToken.default)(token) + }; +} diff --git a/packages/meta/lib/theme/themes/seed.d.ts b/packages/meta/lib/theme/themes/seed.d.ts new file mode 100644 index 0000000..e0ac654 --- /dev/null +++ b/packages/meta/lib/theme/themes/seed.d.ts @@ -0,0 +1,4 @@ +import type { PresetColorType, SeedToken } from '../internal'; +export declare const defaultPresetColors: PresetColorType; +declare const seedToken: SeedToken; +export default seedToken; diff --git a/packages/meta/lib/theme/themes/seed.js b/packages/meta/lib/theme/themes/seed.js new file mode 100644 index 0000000..fcf3ac1 --- /dev/null +++ b/packages/meta/lib/theme/themes/seed.js @@ -0,0 +1,95 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/seed.ts +var seed_exports = {}; +__export(seed_exports, { + default: () => seed_default, + defaultPresetColors: () => defaultPresetColors +}); +module.exports = __toCommonJS(seed_exports); +var defaultPresetColors = { + blue: "#0099FF", + purple: "#722ED1", + cyan: "#13C2C2", + green: "#52C41A", + magenta: "#EB2F96", + pink: "#eb2f96", + red: "#FF4D4F", + orange: "#FA8C16", + yellow: "#FADB14", + volcano: "#FA541C", + geekblue: "#0099FF", + gold: "#FAAD14", + lime: "#A0D911" +}; +var seedToken = { + // preset color palettes + ...defaultPresetColors, + // Color + colorPrimary: "#0099FF", + colorSuccess: "#52C41A", + colorWarning: "#FAAD14", + colorError: "#FF4D4F", + colorInfo: "#0099FF", + colorLink: "", + colorTextBase: "", + colorBgBase: "", + // Font + fontFamily: `-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'`, + fontFamilyCode: `'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace`, + fontSize: 14, + // Line + lineWidth: 1, + lineType: "solid", + // Motion + motionUnit: 0.1, + motionBase: 0, + motionEaseOutCirc: "cubic-bezier(0.08, 0.82, 0.17, 1)", + motionEaseInOutCirc: "cubic-bezier(0.78, 0.14, 0.15, 0.86)", + motionEaseOut: "cubic-bezier(0.215, 0.61, 0.355, 1)", + motionEaseInOut: "cubic-bezier(0.645, 0.045, 0.355, 1)", + motionEaseOutBack: "cubic-bezier(0.12, 0.4, 0.29, 1.46)", + motionEaseInBack: "cubic-bezier(0.71, -0.46, 0.88, 0.6)", + motionEaseInQuint: "cubic-bezier(0.755, 0.05, 0.855, 0.06)", + motionEaseOutQuint: "cubic-bezier(0.23, 1, 0.32, 1)", + // Radius + borderRadius: 6, + // Size + sizeUnit: 4, + sizeStep: 4, + sizePopupArrow: 16, + // Control Base + controlHeight: 32, + // zIndex + zIndexBase: 0, + zIndexPopupBase: 1e3, + // Image + opacityImage: 1, + // Wireframe + wireframe: false, + // Motion + motion: true +}; +var seed_default = seedToken; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + defaultPresetColors +}); diff --git a/packages/meta/lib/theme/themes/shared/genColorMapToken.d.ts b/packages/meta/lib/theme/themes/shared/genColorMapToken.d.ts new file mode 100644 index 0000000..9f038ea --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genColorMapToken.d.ts @@ -0,0 +1,8 @@ +import type { ColorMapToken, SeedToken } from '../../interface'; +import type { GenerateColorMap, GenerateNeutralColorMap } from '../ColorMap'; +interface PaletteGenerators { + generateColorPalettes: GenerateColorMap; + generateNeutralColorPalettes: GenerateNeutralColorMap; +} +export default function genColorMapToken(seed: SeedToken, { generateColorPalettes, generateNeutralColorPalettes }: PaletteGenerators): ColorMapToken; +export {}; diff --git a/packages/meta/lib/theme/themes/shared/genColorMapToken.js b/packages/meta/lib/theme/themes/shared/genColorMapToken.js new file mode 100644 index 0000000..eda9ec4 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genColorMapToken.js @@ -0,0 +1,102 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/shared/genColorMapToken.ts +var genColorMapToken_exports = {}; +__export(genColorMapToken_exports, { + default: () => genColorMapToken +}); +module.exports = __toCommonJS(genColorMapToken_exports); +var import_tinycolor = require("@ctrl/tinycolor"); +function genColorMapToken(seed, { generateColorPalettes, generateNeutralColorPalettes }) { + const { + colorSuccess: colorSuccessBase, + colorWarning: colorWarningBase, + colorError: colorErrorBase, + colorInfo: colorInfoBase, + colorPrimary: colorPrimaryBase, + colorBgBase, + colorTextBase + } = seed; + const primaryColors = generateColorPalettes(colorPrimaryBase); + const successColors = generateColorPalettes(colorSuccessBase); + const warningColors = generateColorPalettes(colorWarningBase); + const errorColors = generateColorPalettes(colorErrorBase); + const infoColors = generateColorPalettes(colorInfoBase); + const neutralColors = generateNeutralColorPalettes(colorBgBase, colorTextBase); + const colorLink = seed.colorLink || seed.colorInfo; + const linkColors = generateColorPalettes(colorLink); + return { + ...neutralColors, + colorPrimaryBg: primaryColors[1], + colorPrimaryBgHover: primaryColors[2], + colorPrimaryBorder: primaryColors[3], + colorPrimaryBorderHover: primaryColors[4], + colorPrimaryHover: primaryColors[5], + colorPrimary: primaryColors[6], + colorPrimaryActive: primaryColors[7], + colorPrimaryTextHover: primaryColors[8], + colorPrimaryText: primaryColors[9], + colorPrimaryTextActive: primaryColors[10], + colorSuccessBg: successColors[1], + colorSuccessBgHover: successColors[2], + colorSuccessBorder: successColors[3], + colorSuccessBorderHover: successColors[4], + colorSuccessHover: successColors[4], + colorSuccess: successColors[6], + colorSuccessActive: successColors[7], + colorSuccessTextHover: successColors[8], + colorSuccessText: successColors[9], + colorSuccessTextActive: successColors[10], + colorErrorBg: errorColors[1], + colorErrorBgHover: errorColors[2], + colorErrorBorder: errorColors[3], + colorErrorBorderHover: errorColors[4], + colorErrorHover: errorColors[5], + colorError: errorColors[6], + colorErrorActive: errorColors[7], + colorErrorTextHover: errorColors[8], + colorErrorText: errorColors[9], + colorErrorTextActive: errorColors[10], + colorWarningBg: warningColors[1], + colorWarningBgHover: warningColors[2], + colorWarningBorder: warningColors[3], + colorWarningBorderHover: warningColors[4], + colorWarningHover: warningColors[4], + colorWarning: warningColors[6], + colorWarningActive: warningColors[7], + colorWarningTextHover: warningColors[8], + colorWarningText: warningColors[9], + colorWarningTextActive: warningColors[10], + colorInfoBg: infoColors[1], + colorInfoBgHover: infoColors[2], + colorInfoBorder: infoColors[3], + colorInfoBorderHover: infoColors[4], + colorInfoHover: infoColors[4], + colorInfo: infoColors[6], + colorInfoActive: infoColors[7], + colorInfoTextHover: infoColors[8], + colorInfoText: infoColors[9], + colorInfoTextActive: infoColors[10], + colorLinkHover: linkColors[4], + colorLink: linkColors[6], + colorLinkActive: linkColors[7], + colorBgMask: new import_tinycolor.TinyColor("#000").setAlpha(0.45).toRgbString(), + colorWhite: "#fff" + }; +} diff --git a/packages/meta/lib/theme/themes/shared/genCommonMapToken.d.ts b/packages/meta/lib/theme/themes/shared/genCommonMapToken.d.ts new file mode 100644 index 0000000..bdaac10 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genCommonMapToken.d.ts @@ -0,0 +1,2 @@ +import type { CommonMapToken, SeedToken } from '../../interface'; +export default function genCommonMapToken(token: SeedToken): CommonMapToken; diff --git a/packages/meta/lib/theme/themes/shared/genCommonMapToken.js b/packages/meta/lib/theme/themes/shared/genCommonMapToken.js new file mode 100644 index 0000000..9375bce --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genCommonMapToken.js @@ -0,0 +1,48 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/shared/genCommonMapToken.ts +var genCommonMapToken_exports = {}; +__export(genCommonMapToken_exports, { + default: () => genCommonMapToken +}); +module.exports = __toCommonJS(genCommonMapToken_exports); +var import_genRadius = __toESM(require("./genRadius")); +function genCommonMapToken(token) { + const { motionUnit, motionBase, borderRadius, lineWidth } = token; + return { + // motion + motionDurationFast: `${(motionBase + motionUnit).toFixed(1)}s`, + motionDurationMid: `${(motionBase + motionUnit * 2).toFixed(1)}s`, + motionDurationSlow: `${(motionBase + motionUnit * 3).toFixed(1)}s`, + // line + lineWidthBold: lineWidth + 1, + // radius + ...(0, import_genRadius.default)(borderRadius) + }; +} diff --git a/packages/meta/lib/theme/themes/shared/genControlHeight.d.ts b/packages/meta/lib/theme/themes/shared/genControlHeight.d.ts new file mode 100644 index 0000000..b898549 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genControlHeight.d.ts @@ -0,0 +1,3 @@ +import type { HeightMapToken, SeedToken } from '../../interface'; +declare const genControlHeight: (token: SeedToken) => HeightMapToken; +export default genControlHeight; diff --git a/packages/meta/lib/theme/themes/shared/genControlHeight.js b/packages/meta/lib/theme/themes/shared/genControlHeight.js new file mode 100644 index 0000000..d477f06 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genControlHeight.js @@ -0,0 +1,33 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/shared/genControlHeight.ts +var genControlHeight_exports = {}; +__export(genControlHeight_exports, { + default: () => genControlHeight_default +}); +module.exports = __toCommonJS(genControlHeight_exports); +var genControlHeight = (token) => { + const { controlHeight } = token; + return { + controlHeightSM: controlHeight * 0.75, + controlHeightXS: controlHeight * 0.5, + controlHeightLG: controlHeight * 1.25 + }; +}; +var genControlHeight_default = genControlHeight; diff --git a/packages/meta/lib/theme/themes/shared/genFontMapToken.d.ts b/packages/meta/lib/theme/themes/shared/genFontMapToken.d.ts new file mode 100644 index 0000000..a5ddc2a --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genFontMapToken.d.ts @@ -0,0 +1,3 @@ +import type { FontMapToken } from '../../interface'; +declare const genFontMapToken: (fontSize: number) => FontMapToken; +export default genFontMapToken; diff --git a/packages/meta/lib/theme/themes/shared/genFontMapToken.js b/packages/meta/lib/theme/themes/shared/genFontMapToken.js new file mode 100644 index 0000000..c27e6da --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genFontMapToken.js @@ -0,0 +1,69 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/shared/genFontMapToken.ts +var genFontMapToken_exports = {}; +__export(genFontMapToken_exports, { + default: () => genFontMapToken_default +}); +module.exports = __toCommonJS(genFontMapToken_exports); +var import_genFontSizes = __toESM(require("./genFontSizes")); +var genFontMapToken = (fontSize) => { + const fontSizePairs = (0, import_genFontSizes.default)(fontSize); + const fontSizes = fontSizePairs.map((pair) => pair.size); + const lineHeights = fontSizePairs.map((pair) => pair.lineHeight); + const fontSizeMD = fontSizes[1]; + const fontSizeSM = fontSizes[0]; + const fontSizeLG = fontSizes[2]; + const lineHeight = lineHeights[1]; + const lineHeightSM = lineHeights[0]; + const lineHeightLG = lineHeights[2]; + return { + fontSizeSM, + fontSize: fontSizeMD, + fontSizeLG, + fontSizeXL: fontSizes[3], + fontSizeHeading1: fontSizes[6], + fontSizeHeading2: fontSizes[5], + fontSizeHeading3: fontSizes[4], + fontSizeHeading4: fontSizes[3], + fontSizeHeading5: fontSizes[2], + lineHeight, + lineHeightLG, + lineHeightSM, + fontHeight: Math.round(lineHeight * fontSizeMD), + fontHeightLG: Math.round(lineHeightLG * fontSizeLG), + fontHeightSM: Math.round(lineHeightSM * fontSizeSM), + lineHeightHeading1: lineHeights[6], + lineHeightHeading2: lineHeights[5], + lineHeightHeading3: lineHeights[4], + lineHeightHeading4: lineHeights[3], + lineHeightHeading5: lineHeights[2] + }; +}; +var genFontMapToken_default = genFontMapToken; diff --git a/packages/meta/lib/theme/themes/shared/genFontSizes.d.ts b/packages/meta/lib/theme/themes/shared/genFontSizes.d.ts new file mode 100644 index 0000000..0507980 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genFontSizes.d.ts @@ -0,0 +1,4 @@ +export default function getFontSizes(base: number): { + size: number; + lineHeight: number; +}[]; diff --git a/packages/meta/lib/theme/themes/shared/genFontSizes.js b/packages/meta/lib/theme/themes/shared/genFontSizes.js new file mode 100644 index 0000000..130d288 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genFontSizes.js @@ -0,0 +1,40 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/shared/genFontSizes.ts +var genFontSizes_exports = {}; +__export(genFontSizes_exports, { + default: () => getFontSizes +}); +module.exports = __toCommonJS(genFontSizes_exports); +function getFontSizes(base) { + const fontSizes = new Array(10).fill(null).map((_, index) => { + const i = index - 1; + const baseSize = base * 2.71828 ** (i / 5); + const intSize = index > 1 ? Math.floor(baseSize) : Math.ceil(baseSize); + return Math.floor(intSize / 2) * 2; + }); + fontSizes[1] = base; + return fontSizes.map((size) => { + const height = size + 8; + return { + size, + lineHeight: height / size + }; + }); +} diff --git a/packages/meta/lib/theme/themes/shared/genRadius.d.ts b/packages/meta/lib/theme/themes/shared/genRadius.d.ts new file mode 100644 index 0000000..f41fd71 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genRadius.d.ts @@ -0,0 +1,3 @@ +import type { MapToken } from '../../interface'; +declare const genRadius: (radiusBase: number) => Pick; +export default genRadius; diff --git a/packages/meta/lib/theme/themes/shared/genRadius.js b/packages/meta/lib/theme/themes/shared/genRadius.js new file mode 100644 index 0000000..579b210 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genRadius.js @@ -0,0 +1,66 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/shared/genRadius.ts +var genRadius_exports = {}; +__export(genRadius_exports, { + default: () => genRadius_default +}); +module.exports = __toCommonJS(genRadius_exports); +var genRadius = (radiusBase) => { + let radiusLG = radiusBase; + let radiusSM = radiusBase; + let radiusXS = radiusBase; + let radiusOuter = radiusBase; + if (radiusBase < 6 && radiusBase >= 5) { + radiusLG = radiusBase + 1; + } else if (radiusBase < 16 && radiusBase >= 6) { + radiusLG = radiusBase + 2; + } else if (radiusBase >= 16) { + radiusLG = 16; + } + if (radiusBase < 7 && radiusBase >= 5) { + radiusSM = 4; + } else if (radiusBase < 8 && radiusBase >= 7) { + radiusSM = 5; + } else if (radiusBase < 14 && radiusBase >= 8) { + radiusSM = 6; + } else if (radiusBase < 16 && radiusBase >= 14) { + radiusSM = 7; + } else if (radiusBase >= 16) { + radiusSM = 8; + } + if (radiusBase < 6 && radiusBase >= 2) { + radiusXS = 1; + } else if (radiusBase >= 6) { + radiusXS = 2; + } + if (radiusBase > 4 && radiusBase < 8) { + radiusOuter = 4; + } else if (radiusBase >= 8) { + radiusOuter = 6; + } + return { + borderRadius: radiusBase, + borderRadiusXS: radiusXS, + borderRadiusSM: radiusSM, + borderRadiusLG: radiusLG, + borderRadiusOuter: radiusOuter + }; +}; +var genRadius_default = genRadius; diff --git a/packages/meta/lib/theme/themes/shared/genSizeMapToken.d.ts b/packages/meta/lib/theme/themes/shared/genSizeMapToken.d.ts new file mode 100644 index 0000000..87332e7 --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genSizeMapToken.d.ts @@ -0,0 +1,2 @@ +import type { SeedToken, SizeMapToken } from '../../interface'; +export default function genSizeMapToken(token: SeedToken): SizeMapToken; diff --git a/packages/meta/lib/theme/themes/shared/genSizeMapToken.js b/packages/meta/lib/theme/themes/shared/genSizeMapToken.js new file mode 100644 index 0000000..11dc1ed --- /dev/null +++ b/packages/meta/lib/theme/themes/shared/genSizeMapToken.js @@ -0,0 +1,47 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/themes/shared/genSizeMapToken.ts +var genSizeMapToken_exports = {}; +__export(genSizeMapToken_exports, { + default: () => genSizeMapToken +}); +module.exports = __toCommonJS(genSizeMapToken_exports); +function genSizeMapToken(token) { + const { sizeUnit, sizeStep } = token; + return { + sizeXXL: sizeUnit * (sizeStep + 8), + // 48 + sizeXL: sizeUnit * (sizeStep + 4), + // 32 + sizeLG: sizeUnit * (sizeStep + 2), + // 24 + sizeMD: sizeUnit * (sizeStep + 1), + // 20 + sizeMS: sizeUnit * sizeStep, + // 16 + size: sizeUnit * sizeStep, + // 16 + sizeSM: sizeUnit * (sizeStep - 1), + // 12 + sizeXS: sizeUnit * (sizeStep - 2), + // 8 + sizeXXS: sizeUnit * (sizeStep - 3) + // 4 + }; +} diff --git a/packages/meta/lib/theme/useToken.d.ts b/packages/meta/lib/theme/useToken.d.ts new file mode 100644 index 0000000..d7e4c14 --- /dev/null +++ b/packages/meta/lib/theme/useToken.d.ts @@ -0,0 +1,19 @@ +import type { Theme } from '@ant-design/cssinjs'; +import type { DesignTokenProviderProps } from './context'; +import type { AliasToken, GlobalToken, MapToken, SeedToken } from './interface'; +export declare const unitless: { + [key in keyof AliasToken]?: boolean; +}; +export declare const ignore: { + [key in keyof AliasToken]?: boolean; +}; +export declare const getComputedToken: (originToken: SeedToken, overrideToken: DesignTokenProviderProps['components'] & { + override?: Partial; +}, theme: Theme) => any; +export default function useToken(): [ + theme: Theme, + token: GlobalToken, + hashId: string, + realToken: GlobalToken, + cssVar?: DesignTokenProviderProps['cssVar'] +]; diff --git a/packages/meta/lib/theme/useToken.js b/packages/meta/lib/theme/useToken.js new file mode 100644 index 0000000..3063421 --- /dev/null +++ b/packages/meta/lib/theme/useToken.js @@ -0,0 +1,157 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/useToken.ts +var useToken_exports = {}; +__export(useToken_exports, { + default: () => useToken, + getComputedToken: () => getComputedToken, + ignore: () => ignore, + unitless: () => unitless +}); +module.exports = __toCommonJS(useToken_exports); +var import_react = __toESM(require("react")); +var import_cssinjs = require("@ant-design/cssinjs"); +var import_version = __toESM(require("../version")); +var import_context = require("./context"); +var import_seed = __toESM(require("./themes/seed")); +var import_alias = __toESM(require("./util/alias")); +var unitless = { + lineHeight: true, + lineHeightSM: true, + lineHeightLG: true, + lineHeightHeading1: true, + lineHeightHeading2: true, + lineHeightHeading3: true, + lineHeightHeading4: true, + lineHeightHeading5: true, + opacityLoading: true, + fontWeightStrong: true, + zIndexPopupBase: true, + zIndexBase: true +}; +var ignore = { + size: true, + sizeSM: true, + sizeLG: true, + sizeMD: true, + sizeXS: true, + sizeXXS: true, + sizeMS: true, + sizeXL: true, + sizeXXL: true, + sizeUnit: true, + sizeStep: true, + motionBase: true, + motionUnit: true +}; +var preserve = { + screenXS: true, + screenXSMin: true, + screenXSMax: true, + screenSM: true, + screenSMMin: true, + screenSMMax: true, + screenMD: true, + screenMDMin: true, + screenMDMax: true, + screenLG: true, + screenLGMin: true, + screenLGMax: true, + screenXL: true, + screenXLMin: true, + screenXLMax: true, + screenXXL: true, + screenXXLMin: true +}; +var getComputedToken = (originToken, overrideToken, theme) => { + const derivativeToken = theme.getDerivativeToken(originToken); + const { override, ...components } = overrideToken; + let mergedDerivativeToken = { + ...derivativeToken, + override + }; + mergedDerivativeToken = (0, import_alias.default)(mergedDerivativeToken); + if (components) { + Object.entries(components).forEach(([key, value]) => { + const { theme: componentTheme, ...componentTokens } = value; + let mergedComponentToken = componentTokens; + if (componentTheme) { + mergedComponentToken = getComputedToken( + { + ...mergedDerivativeToken, + ...componentTokens + }, + { + override: componentTokens + }, + componentTheme + ); + } + mergedDerivativeToken[key] = mergedComponentToken; + }); + } + return mergedDerivativeToken; +}; +function useToken() { + const { + token: rootDesignToken, + hashed, + theme, + override, + cssVar + } = import_react.default.useContext(import_context.DesignTokenContext); + const salt = `${import_version.default}-${hashed || ""}`; + const mergedTheme = theme || import_context.defaultTheme; + const [token, hashId, realToken] = (0, import_cssinjs.useCacheToken)( + mergedTheme, + [import_seed.default, rootDesignToken], + { + salt, + override, + getComputedToken, + // formatToken will not be consumed after 1.15.0 with getComputedToken. + // But token will break if @ant-design/cssinjs is under 1.15.0 without it + formatToken: import_alias.default, + cssVar: cssVar && { + prefix: cssVar.prefix, + key: cssVar.key, + unitless, + ignore, + preserve + } + } + ); + return [mergedTheme, realToken, hashed ? hashId : "", token, cssVar]; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getComputedToken, + ignore, + unitless +}); diff --git a/packages/meta/lib/theme/util/alias.d.ts b/packages/meta/lib/theme/util/alias.d.ts new file mode 100644 index 0000000..e41cbaa --- /dev/null +++ b/packages/meta/lib/theme/util/alias.d.ts @@ -0,0 +1,12 @@ +import type { AliasToken, MapToken, OverrideToken } from '../interface'; +/** Raw merge of `@ant-design/cssinjs` token. Which need additional process */ +type RawMergedToken = MapToken & OverrideToken & { + override: Partial; +}; +/** + * Seed (designer) > Derivative (designer) > Alias (developer). + * + * Merge seed & derivative & override token and generate alias token for developer. + */ +export default function formatToken(derivativeToken: RawMergedToken): AliasToken; +export {}; diff --git a/packages/meta/lib/theme/util/alias.js b/packages/meta/lib/theme/util/alias.js new file mode 100644 index 0000000..1be1d7b --- /dev/null +++ b/packages/meta/lib/theme/util/alias.js @@ -0,0 +1,198 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/alias.ts +var alias_exports = {}; +__export(alias_exports, { + default: () => formatToken +}); +module.exports = __toCommonJS(alias_exports); +var import_tinycolor = require("@ctrl/tinycolor"); +var import_seed = __toESM(require("../themes/seed")); +var import_getAlphaColor = __toESM(require("./getAlphaColor")); +function formatToken(derivativeToken) { + const { override, ...restToken } = derivativeToken; + const overrideTokens = { ...override }; + Object.keys(import_seed.default).forEach((token) => { + delete overrideTokens[token]; + }); + const mergedToken = { + ...restToken, + ...overrideTokens + }; + const screenXS = 480; + const screenSM = 576; + const screenMD = 768; + const screenLG = 992; + const screenXL = 1200; + const screenXXL = 1600; + if (mergedToken.motion === false) { + const fastDuration = "0s"; + mergedToken.motionDurationFast = fastDuration; + mergedToken.motionDurationMid = fastDuration; + mergedToken.motionDurationSlow = fastDuration; + } + const aliasToken = { + ...mergedToken, + // ============== Background ============== // + colorFillContent: mergedToken.colorFillSecondary, + colorFillContentHover: mergedToken.colorFill, + colorFillAlter: mergedToken.colorFillQuaternary, + colorBgContainerDisabled: mergedToken.colorFillTertiary, + // ============== Split ============== // + colorBorderBg: mergedToken.colorBgContainer, + colorSplit: (0, import_getAlphaColor.default)(mergedToken.colorBorderSecondary, mergedToken.colorBgContainer), + // ============== Text ============== // + colorTextPlaceholder: mergedToken.colorTextQuaternary, + colorTextDisabled: mergedToken.colorTextQuaternary, + colorTextHeading: mergedToken.colorText, + colorTextLabel: mergedToken.colorTextSecondary, + colorTextDescription: mergedToken.colorTextTertiary, + colorTextLightSolid: mergedToken.colorWhite, + colorHighlight: mergedToken.colorError, + colorBgTextHover: mergedToken.colorFillSecondary, + colorBgTextActive: mergedToken.colorFill, + colorIcon: mergedToken.colorTextTertiary, + colorIconHover: mergedToken.colorText, + colorErrorOutline: (0, import_getAlphaColor.default)(mergedToken.colorErrorBg, mergedToken.colorBgContainer), + colorWarningOutline: (0, import_getAlphaColor.default)(mergedToken.colorWarningBg, mergedToken.colorBgContainer), + // Font + fontSizeIcon: mergedToken.fontSizeSM, + // Line + lineWidthFocus: mergedToken.lineWidth * 4, + // Control + lineWidth: mergedToken.lineWidth, + controlOutlineWidth: mergedToken.lineWidth * 2, + // Checkbox size and expand icon size + controlInteractiveSize: mergedToken.controlHeight / 2, + controlItemBgHover: mergedToken.colorFillTertiary, + controlItemBgActive: mergedToken.colorPrimaryBg, + controlItemBgActiveHover: mergedToken.colorPrimaryBgHover, + controlItemBgActiveDisabled: mergedToken.colorFill, + controlTmpOutline: mergedToken.colorFillQuaternary, + controlOutline: (0, import_getAlphaColor.default)(mergedToken.colorPrimaryBg, mergedToken.colorBgContainer), + lineType: mergedToken.lineType, + borderRadius: mergedToken.borderRadius, + borderRadiusXS: mergedToken.borderRadiusXS, + borderRadiusSM: mergedToken.borderRadiusSM, + borderRadiusLG: mergedToken.borderRadiusLG, + fontWeightStrong: 600, + opacityLoading: 0.65, + linkDecoration: "none", + linkHoverDecoration: "none", + linkFocusDecoration: "none", + controlPaddingHorizontal: 12, + controlPaddingHorizontalSM: 8, + paddingXXS: mergedToken.sizeXXS, + paddingXS: mergedToken.sizeXS, + paddingSM: mergedToken.sizeSM, + padding: mergedToken.size, + paddingMD: mergedToken.sizeMD, + paddingLG: mergedToken.sizeLG, + paddingXL: mergedToken.sizeXL, + paddingContentHorizontalLG: mergedToken.sizeLG, + paddingContentVerticalLG: mergedToken.sizeMS, + paddingContentHorizontal: mergedToken.sizeMS, + paddingContentVertical: mergedToken.sizeSM, + paddingContentHorizontalSM: mergedToken.size, + paddingContentVerticalSM: mergedToken.sizeXS, + marginXXS: mergedToken.sizeXXS, + marginXS: mergedToken.sizeXS, + marginSM: mergedToken.sizeSM, + margin: mergedToken.size, + marginMD: mergedToken.sizeMD, + marginLG: mergedToken.sizeLG, + marginXL: mergedToken.sizeXL, + marginXXL: mergedToken.sizeXXL, + boxShadow: ` + 0 6px 16px 0 rgba(0, 0, 0, 0.08), + 0 3px 6px -4px rgba(0, 0, 0, 0.12), + 0 9px 28px 8px rgba(0, 0, 0, 0.05) + `, + boxShadowSecondary: ` + 0 6px 16px 0 rgba(0, 0, 0, 0.08), + 0 3px 6px -4px rgba(0, 0, 0, 0.12), + 0 9px 28px 8px rgba(0, 0, 0, 0.05) + `, + boxShadowTertiary: ` + 0 1px 2px 0 rgba(0, 0, 0, 0.03), + 0 1px 6px -1px rgba(0, 0, 0, 0.02), + 0 2px 4px 0 rgba(0, 0, 0, 0.02) + `, + screenXS, + screenXSMin: screenXS, + screenXSMax: screenSM - 1, + screenSM, + screenSMMin: screenSM, + screenSMMax: screenMD - 1, + screenMD, + screenMDMin: screenMD, + screenMDMax: screenLG - 1, + screenLG, + screenLGMin: screenLG, + screenLGMax: screenXL - 1, + screenXL, + screenXLMin: screenXL, + screenXLMax: screenXXL - 1, + screenXXL, + screenXXLMin: screenXXL, + boxShadowPopoverArrow: "2px 2px 5px rgba(0, 0, 0, 0.05)", + boxShadowCard: ` + 0 1px 2px -2px ${new import_tinycolor.TinyColor("rgba(0, 0, 0, 0.16)").toRgbString()}, + 0 3px 6px 0 ${new import_tinycolor.TinyColor("rgba(0, 0, 0, 0.12)").toRgbString()}, + 0 5px 12px 4px ${new import_tinycolor.TinyColor("rgba(0, 0, 0, 0.09)").toRgbString()} + `, + boxShadowDrawerRight: ` + -6px 0 16px 0 rgba(0, 0, 0, 0.08), + -3px 0 6px -4px rgba(0, 0, 0, 0.12), + -9px 0 28px 8px rgba(0, 0, 0, 0.05) + `, + boxShadowDrawerLeft: ` + 6px 0 16px 0 rgba(0, 0, 0, 0.08), + 3px 0 6px -4px rgba(0, 0, 0, 0.12), + 9px 0 28px 8px rgba(0, 0, 0, 0.05) + `, + boxShadowDrawerUp: ` + 0 6px 16px 0 rgba(0, 0, 0, 0.08), + 0 3px 6px -4px rgba(0, 0, 0, 0.12), + 0 9px 28px 8px rgba(0, 0, 0, 0.05) + `, + boxShadowDrawerDown: ` + 0 -6px 16px 0 rgba(0, 0, 0, 0.08), + 0 -3px 6px -4px rgba(0, 0, 0, 0.12), + 0 -9px 28px 8px rgba(0, 0, 0, 0.05) + `, + boxShadowTabsOverflowLeft: "inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)", + boxShadowTabsOverflowRight: "inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)", + boxShadowTabsOverflowTop: "inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)", + boxShadowTabsOverflowBottom: "inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)", + // Override AliasToken + ...overrideTokens + }; + return aliasToken; +} diff --git a/packages/meta/lib/theme/util/calc/CSSCalculator.d.ts b/packages/meta/lib/theme/util/calc/CSSCalculator.d.ts new file mode 100644 index 0000000..3346945 --- /dev/null +++ b/packages/meta/lib/theme/util/calc/CSSCalculator.d.ts @@ -0,0 +1,14 @@ +import AbstractCalculator from './calculator'; +export default class CSSCalculator extends AbstractCalculator { + result: string; + lowPriority?: boolean; + constructor(num: number | string | AbstractCalculator); + add(num: number | string | AbstractCalculator): this; + sub(num: number | string | AbstractCalculator): this; + mul(num: number | string | AbstractCalculator): this; + div(num: number | string | AbstractCalculator): this; + getResult(force?: boolean): string; + equal(options?: { + unit?: boolean; + }): string; +} diff --git a/packages/meta/lib/theme/util/calc/CSSCalculator.js b/packages/meta/lib/theme/util/calc/CSSCalculator.js new file mode 100644 index 0000000..78c11db --- /dev/null +++ b/packages/meta/lib/theme/util/calc/CSSCalculator.js @@ -0,0 +1,109 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/calc/CSSCalculator.ts +var CSSCalculator_exports = {}; +__export(CSSCalculator_exports, { + default: () => CSSCalculator +}); +module.exports = __toCommonJS(CSSCalculator_exports); +var import_calculator = __toESM(require("./calculator")); +var CALC_UNIT = "CALC_UNIT"; +function unit(value) { + if (typeof value === "number") { + return `${value}${CALC_UNIT}`; + } + return value; +} +var CSSCalculator = class extends import_calculator.default { + constructor(num) { + super(); + this.result = ""; + if (num instanceof CSSCalculator) { + this.result = `(${num.result})`; + } else if (typeof num === "number") { + this.result = unit(num); + } else if (typeof num === "string") { + this.result = num; + } + } + add(num) { + if (num instanceof CSSCalculator) { + this.result = `${this.result} + ${num.getResult()}`; + } else if (typeof num === "number" || typeof num === "string") { + this.result = `${this.result} + ${unit(num)}`; + } + this.lowPriority = true; + return this; + } + sub(num) { + if (num instanceof CSSCalculator) { + this.result = `${this.result} - ${num.getResult()}`; + } else if (typeof num === "number" || typeof num === "string") { + this.result = `${this.result} - ${unit(num)}`; + } + this.lowPriority = true; + return this; + } + mul(num) { + if (this.lowPriority) { + this.result = `(${this.result})`; + } + if (num instanceof CSSCalculator) { + this.result = `${this.result} * ${num.getResult(true)}`; + } else if (typeof num === "number" || typeof num === "string") { + this.result = `${this.result} * ${num}`; + } + this.lowPriority = false; + return this; + } + div(num) { + if (this.lowPriority) { + this.result = `(${this.result})`; + } + if (num instanceof CSSCalculator) { + this.result = `${this.result} / ${num.getResult(true)}`; + } else if (typeof num === "number" || typeof num === "string") { + this.result = `${this.result} / ${num}`; + } + this.lowPriority = false; + return this; + } + getResult(force) { + return this.lowPriority || force ? `(${this.result})` : this.result; + } + equal(options) { + const { unit: cssUnit = true } = options || {}; + const regexp = new RegExp(`${CALC_UNIT}`, "g"); + this.result = this.result.replace(regexp, cssUnit ? "px" : ""); + if (typeof this.lowPriority !== "undefined") { + return `calc(${this.result})`; + } + return this.result; + } +}; diff --git a/packages/meta/lib/theme/util/calc/NumCalculator.d.ts b/packages/meta/lib/theme/util/calc/NumCalculator.d.ts new file mode 100644 index 0000000..cd886f6 --- /dev/null +++ b/packages/meta/lib/theme/util/calc/NumCalculator.d.ts @@ -0,0 +1,10 @@ +import AbstractCalculator from './calculator'; +export default class NumCalculator extends AbstractCalculator { + result: number; + constructor(num: number | string | AbstractCalculator); + add(num: number | string | AbstractCalculator): this; + sub(num: number | string | AbstractCalculator): this; + mul(num: number | string | AbstractCalculator): this; + div(num: number | string | AbstractCalculator): this; + equal(): number; +} diff --git a/packages/meta/lib/theme/util/calc/NumCalculator.js b/packages/meta/lib/theme/util/calc/NumCalculator.js new file mode 100644 index 0000000..8a768e2 --- /dev/null +++ b/packages/meta/lib/theme/util/calc/NumCalculator.js @@ -0,0 +1,81 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/calc/NumCalculator.ts +var NumCalculator_exports = {}; +__export(NumCalculator_exports, { + default: () => NumCalculator +}); +module.exports = __toCommonJS(NumCalculator_exports); +var import_calculator = __toESM(require("./calculator")); +var NumCalculator = class extends import_calculator.default { + constructor(num) { + super(); + this.result = 0; + if (num instanceof NumCalculator) { + this.result = num.result; + } else if (typeof num === "number") { + this.result = num; + } + } + add(num) { + if (num instanceof NumCalculator) { + this.result += num.result; + } else if (typeof num === "number") { + this.result += num; + } + return this; + } + sub(num) { + if (num instanceof NumCalculator) { + this.result -= num.result; + } else if (typeof num === "number") { + this.result -= num; + } + return this; + } + mul(num) { + if (num instanceof NumCalculator) { + this.result *= num.result; + } else if (typeof num === "number") { + this.result *= num; + } + return this; + } + div(num) { + if (num instanceof NumCalculator) { + this.result /= num.result; + } else if (typeof num === "number") { + this.result /= num; + } + return this; + } + equal() { + return this.result; + } +}; diff --git a/packages/meta/lib/theme/util/calc/calculator.d.ts b/packages/meta/lib/theme/util/calc/calculator.d.ts new file mode 100644 index 0000000..81fe701 --- /dev/null +++ b/packages/meta/lib/theme/util/calc/calculator.d.ts @@ -0,0 +1,30 @@ +declare abstract class AbstractCalculator { + /** + * @descCN 计算两数的和,例如:1 + 2 + * @descEN Calculate the sum of two numbers, e.g. 1 + 2 + */ + abstract add(num: number | string | AbstractCalculator): this; + /** + * @descCN 计算两数的差,例如:1 - 2 + * @descEN Calculate the difference between two numbers, e.g. 1 - 2 + */ + abstract sub(num: number | string | AbstractCalculator): this; + /** + * @descCN 计算两数的积,例如:1 * 2 + * @descEN Calculate the product of two numbers, e.g. 1 * 2 + */ + abstract mul(num: number | string | AbstractCalculator): this; + /** + * @descCN 计算两数的商,例如:1 / 2 + * @descEN Calculate the quotient of two numbers, e.g. 1 / 2 + */ + abstract div(num: number | string | AbstractCalculator): this; + /** + * @descCN 获取计算结果 + * @descEN Get the calculation result + */ + abstract equal(options?: { + unit?: boolean; + }): string | number; +} +export default AbstractCalculator; diff --git a/packages/meta/lib/theme/util/calc/calculator.js b/packages/meta/lib/theme/util/calc/calculator.js new file mode 100644 index 0000000..22c8b8b --- /dev/null +++ b/packages/meta/lib/theme/util/calc/calculator.js @@ -0,0 +1,27 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/calc/calculator.ts +var calculator_exports = {}; +__export(calculator_exports, { + default: () => calculator_default +}); +module.exports = __toCommonJS(calculator_exports); +var AbstractCalculator = class { +}; +var calculator_default = AbstractCalculator; diff --git a/packages/meta/lib/theme/util/calc/index.d.ts b/packages/meta/lib/theme/util/calc/index.d.ts new file mode 100644 index 0000000..0b23166 --- /dev/null +++ b/packages/meta/lib/theme/util/calc/index.d.ts @@ -0,0 +1,5 @@ +import NumCalculator from './NumCalculator'; +import CSSCalculator from './CSSCalculator'; +import type AbstractCalculator from './calculator'; +declare const genCalc: (type: 'css' | 'js') => (num: number | string | AbstractCalculator) => CSSCalculator | NumCalculator; +export default genCalc; diff --git a/packages/meta/lib/theme/util/calc/index.js b/packages/meta/lib/theme/util/calc/index.js new file mode 100644 index 0000000..01f07fc --- /dev/null +++ b/packages/meta/lib/theme/util/calc/index.js @@ -0,0 +1,41 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/calc/index.ts +var calc_exports = {}; +__export(calc_exports, { + default: () => calc_default +}); +module.exports = __toCommonJS(calc_exports); +var import_NumCalculator = __toESM(require("./NumCalculator")); +var import_CSSCalculator = __toESM(require("./CSSCalculator")); +var genCalc = (type) => { + const Calculator = type === "css" ? import_CSSCalculator.default : import_NumCalculator.default; + return (num) => new Calculator(num); +}; +var calc_default = genCalc; diff --git a/packages/meta/lib/theme/util/genComponentStyleHook.d.ts b/packages/meta/lib/theme/util/genComponentStyleHook.d.ts new file mode 100644 index 0000000..f443993 --- /dev/null +++ b/packages/meta/lib/theme/util/genComponentStyleHook.d.ts @@ -0,0 +1,90 @@ +import type { ComponentType, ReactElement } from 'react'; +import type { CSSInterpolation } from '@ant-design/cssinjs'; +import type { ComponentTokenMap, GlobalToken, OverrideToken, UseComponentStyleResult } from '../interface'; +import { unitless } from '../useToken'; +import type AbstractCalculator from './calc/calculator'; +export type OverrideTokenWithoutDerivative = ComponentTokenMap; +export type OverrideComponent = keyof OverrideTokenWithoutDerivative; +export type GlobalTokenWithComponent = GlobalToken & ComponentTokenMap[C]; +type ComponentToken = Exclude; +type ComponentTokenKey = keyof ComponentToken; +export interface StyleInfo { + hashId: string; + prefixCls: string; + rootPrefixCls: string; + iconPrefixCls: string; +} +export type CSSUtil = { + calc: (number: any) => AbstractCalculator; + max: (...values: (number | string)[]) => number | string; + min: (...values: (number | string)[]) => number | string; +}; +export type TokenWithCommonCls = T & { + /** Wrap component class with `.` prefix */ + componentCls: string; + /** Origin prefix which do not have `.` prefix */ + prefixCls: string; + /** Wrap icon class with `.` prefix */ + iconCls: string; + /** Wrap ant prefixCls class with `.` prefix */ + antCls: string; +} & CSSUtil; +export type FullToken = TokenWithCommonCls>; +export type GenStyleFn = (token: FullToken, info: StyleInfo) => CSSInterpolation; +export type GetDefaultToken = null | OverrideTokenWithoutDerivative[C] | ((token: GlobalToken) => OverrideTokenWithoutDerivative[C]); +export type FormatComponentToken = (token: NonNullable) => NonNullable; +export default function genComponentStyleHook(componentName: C | [C, string], styleFn: GenStyleFn, getDefaultToken?: null | OverrideTokenWithoutDerivative[C] | ((token: GlobalToken) => OverrideTokenWithoutDerivative[C]), options?: { + resetStyle?: boolean; + deprecatedTokens?: [ComponentTokenKey, ComponentTokenKey][]; + /** + * Only use component style in client side. Ignore in SSR. + */ + clientOnly?: boolean; + /** + * Set order of component style. Default is -999. + */ + order?: number; + format?: FormatComponentToken; + injectStyle?: boolean; +}): (prefixCls: string) => UseComponentStyleResult; +export interface SubStyleComponentProps { + prefixCls: string; +} +type RestParameters = T extends [any, ...infer Rest] ? Rest : never; +export declare const genSubStyleComponent: (componentName: [C, string], ...args: RestParameters>>) => ComponentType; +export type CSSVarRegisterProps = { + rootCls: string; + component: string; + cssVar: { + prefix?: string; + key?: string; + }; +}; +export declare const genStyleHooks: (component: C | [C, string], styleFn: GenStyleFn, getDefaultToken?: GetDefaultToken | undefined, options?: { + resetStyle?: boolean | undefined; + deprecatedTokens?: [keyof Exclude, keyof Exclude][] | undefined; + /** + * Chance to format component token with user input. + * Useful when need calculated token as css variables. + */ + format?: FormatComponentToken | undefined; + /** + * Component tokens that do not need unit. + */ + unitless?: { [key in keyof Exclude]: boolean; } | undefined; + /** + * Only use component style in client side. Ignore in SSR. + */ + clientOnly?: boolean | undefined; + /** + * Set order of component style. + * @default -999 + */ + order?: number | undefined; + /** + * Whether generate styles + * @default true + */ + injectStyle?: boolean | undefined; +} | undefined) => (prefixCls: string, rootCls?: string) => readonly [(node: ReactElement) => ReactElement, string, string | undefined]; +export {}; diff --git a/packages/meta/lib/theme/util/genComponentStyleHook.js b/packages/meta/lib/theme/util/genComponentStyleHook.js new file mode 100644 index 0000000..fd8e2a9 --- /dev/null +++ b/packages/meta/lib/theme/util/genComponentStyleHook.js @@ -0,0 +1,257 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/genComponentStyleHook.tsx +var genComponentStyleHook_exports = {}; +__export(genComponentStyleHook_exports, { + default: () => genComponentStyleHook, + genStyleHooks: () => genStyleHooks, + genSubStyleComponent: () => genSubStyleComponent +}); +module.exports = __toCommonJS(genComponentStyleHook_exports); +var import_react = __toESM(require("react")); +var import_cssinjs = require("@ant-design/cssinjs"); +var import_rc_util = require("rc-util"); +var import_context = require("../../config-provider/context"); +var import_style = require("../../style"); +var import_useToken = __toESM(require("../useToken")); +var import_calc = __toESM(require("./calc")); +var import_maxmin = __toESM(require("./maxmin")); +var import_statistic = __toESM(require("./statistic")); +var import_useResetIconStyle = __toESM(require("./useResetIconStyle")); +var getDefaultComponentToken = (component, token, getDefaultToken) => { + if (typeof getDefaultToken === "function") { + return getDefaultToken((0, import_statistic.merge)(token, token[component] ?? {})); + } + return getDefaultToken ?? {}; +}; +var getComponentToken = (component, token, defaultToken, options) => { + const customToken = { ...token[component] }; + if (options == null ? void 0 : options.deprecatedTokens) { + const { deprecatedTokens } = options; + deprecatedTokens.forEach(([oldTokenKey, newTokenKey]) => { + if (process.env.NODE_ENV !== "production") { + (0, import_rc_util.warning)( + !(customToken == null ? void 0 : customToken[oldTokenKey]), + `The token '${String(oldTokenKey)}' of ${component} had deprecated, use '${String( + newTokenKey + )}' instead.` + ); + } + if ((customToken == null ? void 0 : customToken[oldTokenKey]) || (customToken == null ? void 0 : customToken[newTokenKey])) { + customToken[newTokenKey] ?? (customToken[newTokenKey] = customToken == null ? void 0 : customToken[oldTokenKey]); + } + }); + } + let mergedToken = { ...defaultToken, ...customToken }; + if (options == null ? void 0 : options.format) { + mergedToken = options.format(mergedToken); + } + Object.keys(mergedToken).forEach((key) => { + if (mergedToken[key] === token[key]) { + delete mergedToken[key]; + } + }); + return mergedToken; +}; +var getCompVarPrefix = (component, prefix) => `${[ + prefix, + component.replace(/([A-Z]+)([A-Z][a-z]+)/g, "$1-$2").replace(/([a-z])([A-Z])/g, "$1-$2") +].filter(Boolean).join("-")}`; +function genComponentStyleHook(componentName, styleFn, getDefaultToken, options = {}) { + const cells = Array.isArray(componentName) ? componentName : [componentName, componentName]; + const [component] = cells; + const concatComponent = cells.join("-"); + return (prefixCls) => { + const [theme, realToken, hashId, token, cssVar] = (0, import_useToken.default)(); + const { getPrefixCls, iconPrefixCls, csp } = (0, import_react.useContext)(import_context.ConfigContext); + const rootPrefixCls = getPrefixCls(); + const type = cssVar ? "css" : "js"; + const calc = (0, import_calc.default)(type); + const { max, min } = (0, import_maxmin.default)(type); + const sharedConfig = { + theme, + token, + hashId, + nonce: () => csp == null ? void 0 : csp.nonce, + clientOnly: options.clientOnly, + // antd is always at top of styles + order: options.order || -999 + }; + (0, import_cssinjs.useStyleRegister)( + { ...sharedConfig, clientOnly: false, path: ["Shared", rootPrefixCls] }, + () => [ + { + // Link + "&": (0, import_style.genLinkStyle)(token) + } + ] + ); + (0, import_useResetIconStyle.default)(iconPrefixCls, csp); + const wrapSSR = (0, import_cssinjs.useStyleRegister)( + { ...sharedConfig, path: [concatComponent, prefixCls, iconPrefixCls] }, + () => { + if (options.injectStyle === false) { + return []; + } + const { token: proxyToken, flush } = (0, import_statistic.default)(token); + const defaultComponentToken = getDefaultComponentToken( + component, + realToken, + getDefaultToken + ); + const componentCls = `.${prefixCls}`; + const componentToken = getComponentToken(component, realToken, defaultComponentToken, { + deprecatedTokens: options.deprecatedTokens, + format: options.format + }); + if (cssVar) { + Object.keys(defaultComponentToken).forEach((key) => { + defaultComponentToken[key] = `var(${(0, import_cssinjs.token2CSSVar)( + key, + getCompVarPrefix(component, cssVar.prefix) + )})`; + }); + } + const mergedToken = (0, import_statistic.merge)( + proxyToken, + { + componentCls, + prefixCls, + iconCls: `.${iconPrefixCls}`, + antCls: `.${rootPrefixCls}`, + calc, + // @ts-ignore + max, + // @ts-ignore + min + }, + cssVar ? defaultComponentToken : componentToken + ); + const styleInterpolation = styleFn(mergedToken, { + hashId, + prefixCls, + rootPrefixCls, + iconPrefixCls + }); + flush(component, componentToken); + return [ + options.resetStyle === false ? null : (0, import_style.genCommonStyle)(mergedToken, prefixCls), + styleInterpolation + ]; + } + ); + return [wrapSSR, hashId]; + }; +} +var genSubStyleComponent = (componentName, styleFn, getDefaultToken, options) => { + const useStyle = genComponentStyleHook(componentName, styleFn, getDefaultToken, { + resetStyle: false, + // Sub Style should default after root one + order: -998, + ...options + }); + const StyledComponent = ({ + prefixCls + }) => { + useStyle(prefixCls); + return null; + }; + if (process.env.NODE_ENV !== "production") { + StyledComponent.displayName = `SubStyle_${Array.isArray(componentName) ? componentName.join(".") : componentName}`; + } + return StyledComponent; +}; +var genCSSVarRegister = (component, getDefaultToken, options) => { + function prefixToken(key) { + return `${component}${key.slice(0, 1).toUpperCase()}${key.slice(1)}`; + } + const { unitless: originUnitless = {}, injectStyle = true } = options ?? {}; + const compUnitless = { + [prefixToken("zIndexPopup")]: true + }; + Object.keys(originUnitless).forEach((key) => { + compUnitless[prefixToken(key)] = originUnitless[key]; + }); + const CSSVarRegister = ({ rootCls, cssVar }) => { + const [, realToken] = (0, import_useToken.default)(); + (0, import_cssinjs.useCSSVarRegister)( + { + path: [component], + prefix: cssVar.prefix, + key: cssVar == null ? void 0 : cssVar.key, + unitless: { + ...import_useToken.unitless, + ...compUnitless + }, + ignore: import_useToken.ignore, + token: realToken, + scope: rootCls + }, + () => { + const defaultToken = getDefaultComponentToken(component, realToken, getDefaultToken); + const componentToken = getComponentToken(component, realToken, defaultToken, { + format: options == null ? void 0 : options.format, + deprecatedTokens: options == null ? void 0 : options.deprecatedTokens + }); + Object.keys(defaultToken).forEach((key) => { + componentToken[prefixToken(key)] = componentToken[key]; + delete componentToken[key]; + }); + return componentToken; + } + ); + return null; + }; + const useCSSVar = (rootCls) => { + const [, , , , cssVar] = (0, import_useToken.default)(); + return [ + (node) => injectStyle && cssVar ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(CSSVarRegister, { rootCls, cssVar, component }), node) : node, + cssVar == null ? void 0 : cssVar.key + ]; + }; + return useCSSVar; +}; +var genStyleHooks = (component, styleFn, getDefaultToken, options) => { + const useStyle = genComponentStyleHook(component, styleFn, getDefaultToken, options); + const useCSSVar = genCSSVarRegister( + Array.isArray(component) ? component[0] : component, + getDefaultToken, + options + ); + return (prefixCls, rootCls = prefixCls) => { + const [, hashId] = useStyle(prefixCls); + const [wrapCSSVar, cssVarCls] = useCSSVar(rootCls); + return [wrapCSSVar, hashId, cssVarCls]; + }; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + genStyleHooks, + genSubStyleComponent +}); diff --git a/packages/meta/lib/theme/util/genPresetColor.d.ts b/packages/meta/lib/theme/util/genPresetColor.d.ts new file mode 100644 index 0000000..2a67c06 --- /dev/null +++ b/packages/meta/lib/theme/util/genPresetColor.d.ts @@ -0,0 +1,16 @@ +import type { CSSObject } from '@ant-design/cssinjs'; +import type { AliasToken, PresetColorKey } from '../internal'; +import type { TokenWithCommonCls } from './genComponentStyleHook'; +interface CalcColor { + /** token[`${colorKey}-1`] */ + lightColor: string; + /** token[`${colorKey}-3`] */ + lightBorderColor: string; + /** token[`${colorKey}-6`] */ + darkColor: string; + /** token[`${colorKey}-7`] */ + textColor: string; +} +type GenCSS = (colorKey: PresetColorKey, calcColor: CalcColor) => CSSObject; +export default function genPresetColor>(token: Token, genCss: GenCSS): CSSObject; +export {}; diff --git a/packages/meta/lib/theme/util/genPresetColor.js b/packages/meta/lib/theme/util/genPresetColor.js new file mode 100644 index 0000000..120483e --- /dev/null +++ b/packages/meta/lib/theme/util/genPresetColor.js @@ -0,0 +1,37 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/genPresetColor.ts +var genPresetColor_exports = {}; +__export(genPresetColor_exports, { + default: () => genPresetColor +}); +module.exports = __toCommonJS(genPresetColor_exports); +var import_interface = require("../interface"); +function genPresetColor(token, genCss) { + return import_interface.PresetColors.reduce((prev, colorKey) => { + const lightColor = token[`${colorKey}1`]; + const lightBorderColor = token[`${colorKey}3`]; + const darkColor = token[`${colorKey}6`]; + const textColor = token[`${colorKey}7`]; + return { + ...prev, + ...genCss(colorKey, { lightColor, lightBorderColor, darkColor, textColor }) + }; + }, {}); +} diff --git a/packages/meta/lib/theme/util/getAlphaColor.d.ts b/packages/meta/lib/theme/util/getAlphaColor.d.ts new file mode 100644 index 0000000..29e519d --- /dev/null +++ b/packages/meta/lib/theme/util/getAlphaColor.d.ts @@ -0,0 +1,2 @@ +declare function getAlphaColor(frontColor: string, backgroundColor: string): string; +export default getAlphaColor; diff --git a/packages/meta/lib/theme/util/getAlphaColor.js b/packages/meta/lib/theme/util/getAlphaColor.js new file mode 100644 index 0000000..b0ee7b0 --- /dev/null +++ b/packages/meta/lib/theme/util/getAlphaColor.js @@ -0,0 +1,45 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/getAlphaColor.ts +var getAlphaColor_exports = {}; +__export(getAlphaColor_exports, { + default: () => getAlphaColor_default +}); +module.exports = __toCommonJS(getAlphaColor_exports); +var import_tinycolor = require("@ctrl/tinycolor"); +function isStableColor(color) { + return color >= 0 && color <= 255; +} +function getAlphaColor(frontColor, backgroundColor) { + const { r: fR, g: fG, b: fB, a: originAlpha } = new import_tinycolor.TinyColor(frontColor).toRgb(); + if (originAlpha < 1) { + return frontColor; + } + const { r: bR, g: bG, b: bB } = new import_tinycolor.TinyColor(backgroundColor).toRgb(); + for (let fA = 0.01; fA <= 1; fA += 0.01) { + const r = Math.round((fR - bR * (1 - fA)) / fA); + const g = Math.round((fG - bG * (1 - fA)) / fA); + const b = Math.round((fB - bB * (1 - fA)) / fA); + if (isStableColor(r) && isStableColor(g) && isStableColor(b)) { + return new import_tinycolor.TinyColor({ r, g, b, a: Math.round(fA * 100) / 100 }).toRgbString(); + } + } + return new import_tinycolor.TinyColor({ r: fR, g: fG, b: fB, a: 1 }).toRgbString(); +} +var getAlphaColor_default = getAlphaColor; diff --git a/packages/meta/lib/theme/util/maxmin.d.ts b/packages/meta/lib/theme/util/maxmin.d.ts new file mode 100644 index 0000000..b513264 --- /dev/null +++ b/packages/meta/lib/theme/util/maxmin.d.ts @@ -0,0 +1,7 @@ +export default function genMaxMin(type: 'css' | 'js'): { + max: (...values: number[]) => number; + min: (...values: number[]) => number; +} | { + max: (...args: (string | number)[]) => string; + min: (...args: (string | number)[]) => string; +}; diff --git a/packages/meta/lib/theme/util/maxmin.js b/packages/meta/lib/theme/util/maxmin.js new file mode 100644 index 0000000..577e3d1 --- /dev/null +++ b/packages/meta/lib/theme/util/maxmin.js @@ -0,0 +1,37 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/maxmin.ts +var maxmin_exports = {}; +__export(maxmin_exports, { + default: () => genMaxMin +}); +module.exports = __toCommonJS(maxmin_exports); +var import_cssinjs = require("@ant-design/cssinjs"); +function genMaxMin(type) { + if (type === "js") { + return { + max: Math.max, + min: Math.min + }; + } + return { + max: (...args) => `max(${args.map((value) => (0, import_cssinjs.unit)(value)).join(",")})`, + min: (...args) => `min(${args.map((value) => (0, import_cssinjs.unit)(value)).join(",")})` + }; +} diff --git a/packages/meta/lib/theme/util/statistic.d.ts b/packages/meta/lib/theme/util/statistic.d.ts new file mode 100644 index 0000000..32ab0d9 --- /dev/null +++ b/packages/meta/lib/theme/util/statistic.d.ts @@ -0,0 +1,13 @@ +import type { AnyObject } from '../../_util/type'; +/** + * This function will do as `Object.assign` in production. But will use Object.defineProperty:get to + * pass all value access in development. To support statistic field usage with alias token. + */ +export declare function merge(...objs: Partial[]): T; +/** Statistic token usage case. Should use `merge` function if you do not want spread record. */ +declare const statisticToken: (token: T) => { + token: T; + keys: Set | undefined; + flush: (componentName: string, componentToken: Record) => void; +}; +export default statisticToken; diff --git a/packages/meta/lib/theme/util/statistic.js b/packages/meta/lib/theme/util/statistic.js new file mode 100644 index 0000000..2c861d2 --- /dev/null +++ b/packages/meta/lib/theme/util/statistic.js @@ -0,0 +1,86 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/statistic.ts +var statistic_exports = {}; +__export(statistic_exports, { + _statistic_build_: () => _statistic_build_, + default: () => statistic_default, + merge: () => merge, + statistic: () => statistic +}); +module.exports = __toCommonJS(statistic_exports); +var enableStatistic = process.env.NODE_ENV !== "production" || typeof CSSINJS_STATISTIC !== "undefined"; +var recording = true; +function merge(...objs) { + if (!enableStatistic) { + return Object.assign({}, ...objs); + } + recording = false; + const ret = {}; + objs.forEach((obj) => { + const keys = Object.keys(obj); + keys.forEach((key) => { + Object.defineProperty(ret, key, { + configurable: true, + enumerable: true, + get: () => obj[key] + }); + }); + }); + recording = true; + return ret; +} +var statistic = {}; +var _statistic_build_ = {}; +function noop() { +} +var statisticToken = (token) => { + let tokenKeys; + let proxy = token; + let flush = noop; + if (enableStatistic && typeof Proxy !== "undefined") { + tokenKeys = /* @__PURE__ */ new Set(); + proxy = new Proxy(token, { + get(obj, prop) { + if (recording) { + tokenKeys.add(prop); + } + return obj[prop]; + } + }); + flush = (componentName, componentToken) => { + var _a; + statistic[componentName] = { + global: Array.from(tokenKeys), + component: { + ...(_a = statistic[componentName]) == null ? void 0 : _a.component, + ...componentToken + } + }; + }; + } + return { token: proxy, keys: tokenKeys, flush }; +}; +var statistic_default = statisticToken; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + _statistic_build_, + merge, + statistic +}); diff --git a/packages/meta/lib/theme/util/useResetIconStyle.d.ts b/packages/meta/lib/theme/util/useResetIconStyle.d.ts new file mode 100644 index 0000000..3ca562f --- /dev/null +++ b/packages/meta/lib/theme/util/useResetIconStyle.d.ts @@ -0,0 +1,4 @@ +/// +import type { CSPConfig } from '../../config-provider'; +declare const useResetIconStyle: (iconPrefixCls: string, csp?: CSPConfig) => (node: import("react").ReactElement>) => import("react").JSX.Element; +export default useResetIconStyle; diff --git a/packages/meta/lib/theme/util/useResetIconStyle.js b/packages/meta/lib/theme/util/useResetIconStyle.js new file mode 100644 index 0000000..d05e077 --- /dev/null +++ b/packages/meta/lib/theme/util/useResetIconStyle.js @@ -0,0 +1,60 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/theme/util/useResetIconStyle.ts +var useResetIconStyle_exports = {}; +__export(useResetIconStyle_exports, { + default: () => useResetIconStyle_default +}); +module.exports = __toCommonJS(useResetIconStyle_exports); +var import_cssinjs = require("@ant-design/cssinjs"); +var import_style = require("../../style"); +var import_useToken = __toESM(require("../useToken")); +var useResetIconStyle = (iconPrefixCls, csp) => { + const [theme, token] = (0, import_useToken.default)(); + return (0, import_cssinjs.useStyleRegister)( + { + theme, + token, + hashId: "", + path: ["ant-design-icons", iconPrefixCls], + nonce: () => csp == null ? void 0 : csp.nonce + }, + () => [ + { + [`.${iconPrefixCls}`]: { + ...(0, import_style.resetIcon)(), + [`.${iconPrefixCls} .${iconPrefixCls}-icon`]: { + display: "block" + } + } + } + ] + ); +}; +var useResetIconStyle_default = useResetIconStyle; diff --git a/packages/meta/lib/time-picker/index.d.ts b/packages/meta/lib/time-picker/index.d.ts new file mode 100644 index 0000000..ff773b8 --- /dev/null +++ b/packages/meta/lib/time-picker/index.d.ts @@ -0,0 +1,26 @@ +import * as React from 'react'; +import type { Dayjs } from 'dayjs'; +import type { InputStatus } from '../_util/statusUtils'; +import type { PickerTimeProps, RangePickerTimeProps } from '../date-picker/generatePicker'; +export interface TimePickerLocale { + placeholder?: string; + rangePlaceholder?: [string, string]; +} +export interface TimeRangePickerProps extends Omit, 'picker'> { + popupClassName?: string; +} +declare const RangePicker: React.ForwardRefExoticComponent>; +export interface TimePickerProps extends Omit, 'picker'> { + addon?: () => React.ReactNode; + status?: InputStatus; + popupClassName?: string; + rootClassName?: string; +} +declare const TimePicker: React.ForwardRefExoticComponent & React.RefAttributes>; +declare const PurePanel: (props: import("../_util/type").AnyObject) => React.JSX.Element; +type MergedTimePicker = typeof TimePicker & { + RangePicker: typeof RangePicker; + _InternalPanelDoNotUseOrYouWillBeFired: typeof PurePanel; +}; +declare const _default: MergedTimePicker; +export default _default; diff --git a/packages/meta/lib/time-picker/index.js b/packages/meta/lib/time-picker/index.js new file mode 100644 index 0000000..7fb453e --- /dev/null +++ b/packages/meta/lib/time-picker/index.js @@ -0,0 +1,77 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/index.tsx +var time_picker_exports = {}; +__export(time_picker_exports, { + default: () => time_picker_default +}); +module.exports = __toCommonJS(time_picker_exports); +var React = __toESM(require("react")); +var import_PurePanel = __toESM(require("../_util/PurePanel")); +var import_warning = require("../_util/warning"); +var import_date_picker = __toESM(require("../date-picker")); +var { TimePicker: InternalTimePicker, RangePicker: InternalRangePicker } = import_date_picker.default; +var RangePicker = React.forwardRef((props, ref) => ( + // @ts-ignore + /* @__PURE__ */ React.createElement(InternalRangePicker, { ...props, picker: "time", mode: void 0, ref }) +)); +var TimePicker = React.forwardRef( + ({ addon, renderExtraFooter, ...restProps }, ref) => { + if (process.env.NODE_ENV !== "production") { + const warning = (0, import_warning.devUseWarning)("TimePicker"); + warning.deprecated(!addon, "addon", "renderExtraFooter"); + } + const internalRenderExtraFooter = React.useMemo(() => { + if (renderExtraFooter) { + return renderExtraFooter; + } + if (addon) { + return addon; + } + return void 0; + }, [addon, renderExtraFooter]); + return /* @__PURE__ */ React.createElement( + InternalTimePicker, + { + ...restProps, + mode: void 0, + ref, + renderExtraFooter: internalRenderExtraFooter + } + ); + } +); +if (process.env.NODE_ENV !== "production") { + TimePicker.displayName = "TimePicker"; +} +var PurePanel = (0, import_PurePanel.default)(TimePicker, "picker"); +TimePicker._InternalPanelDoNotUseOrYouWillBeFired = PurePanel; +TimePicker.RangePicker = RangePicker; +TimePicker._InternalPanelDoNotUseOrYouWillBeFired = PurePanel; +var time_picker_default = TimePicker; diff --git a/packages/meta/lib/time-picker/locale/ar_EG.d.ts b/packages/meta/lib/time-picker/locale/ar_EG.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ar_EG.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ar_EG.js b/packages/meta/lib/time-picker/locale/ar_EG.js new file mode 100644 index 0000000..a35918b --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ar_EG.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ar_EG.ts +var ar_EG_exports = {}; +__export(ar_EG_exports, { + default: () => ar_EG_default +}); +module.exports = __toCommonJS(ar_EG_exports); +var locale = { + placeholder: "اختيار الوقت" +}; +var ar_EG_default = locale; diff --git a/packages/meta/lib/time-picker/locale/az_AZ.d.ts b/packages/meta/lib/time-picker/locale/az_AZ.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/az_AZ.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/az_AZ.js b/packages/meta/lib/time-picker/locale/az_AZ.js new file mode 100644 index 0000000..429dd5c --- /dev/null +++ b/packages/meta/lib/time-picker/locale/az_AZ.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/az_AZ.ts +var az_AZ_exports = {}; +__export(az_AZ_exports, { + default: () => az_AZ_default +}); +module.exports = __toCommonJS(az_AZ_exports); +var locale = { + placeholder: "Vaxtı seç" +}; +var az_AZ_default = locale; diff --git a/packages/meta/lib/time-picker/locale/bg_BG.d.ts b/packages/meta/lib/time-picker/locale/bg_BG.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/bg_BG.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/bg_BG.js b/packages/meta/lib/time-picker/locale/bg_BG.js new file mode 100644 index 0000000..468d69c --- /dev/null +++ b/packages/meta/lib/time-picker/locale/bg_BG.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/bg_BG.ts +var bg_BG_exports = {}; +__export(bg_BG_exports, { + default: () => bg_BG_default +}); +module.exports = __toCommonJS(bg_BG_exports); +var locale = { + placeholder: "Избор на час" +}; +var bg_BG_default = locale; diff --git a/packages/meta/lib/time-picker/locale/bn_BD.d.ts b/packages/meta/lib/time-picker/locale/bn_BD.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/bn_BD.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/bn_BD.js b/packages/meta/lib/time-picker/locale/bn_BD.js new file mode 100644 index 0000000..76c71c2 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/bn_BD.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/bn_BD.ts +var bn_BD_exports = {}; +__export(bn_BD_exports, { + default: () => bn_BD_default +}); +module.exports = __toCommonJS(bn_BD_exports); +var locale = { + placeholder: "সময় নির্বাচন", + rangePlaceholder: ["সময় শুরু", "শেষ সময়"] +}; +var bn_BD_default = locale; diff --git a/packages/meta/lib/time-picker/locale/by_BY.d.ts b/packages/meta/lib/time-picker/locale/by_BY.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/by_BY.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/by_BY.js b/packages/meta/lib/time-picker/locale/by_BY.js new file mode 100644 index 0000000..d606e2c --- /dev/null +++ b/packages/meta/lib/time-picker/locale/by_BY.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/by_BY.ts +var by_BY_exports = {}; +__export(by_BY_exports, { + default: () => by_BY_default +}); +module.exports = __toCommonJS(by_BY_exports); +var locale = { + placeholder: "Выберыце час", + rangePlaceholder: ["Час пачатку", "Час заканчэння"] +}; +var by_BY_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ca_ES.d.ts b/packages/meta/lib/time-picker/locale/ca_ES.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ca_ES.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ca_ES.js b/packages/meta/lib/time-picker/locale/ca_ES.js new file mode 100644 index 0000000..820b753 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ca_ES.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ca_ES.ts +var ca_ES_exports = {}; +__export(ca_ES_exports, { + default: () => ca_ES_default +}); +module.exports = __toCommonJS(ca_ES_exports); +var locale = { + placeholder: "Seleccionar hora" +}; +var ca_ES_default = locale; diff --git a/packages/meta/lib/time-picker/locale/cs_CZ.d.ts b/packages/meta/lib/time-picker/locale/cs_CZ.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/cs_CZ.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/cs_CZ.js b/packages/meta/lib/time-picker/locale/cs_CZ.js new file mode 100644 index 0000000..2e0af53 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/cs_CZ.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/cs_CZ.ts +var cs_CZ_exports = {}; +__export(cs_CZ_exports, { + default: () => cs_CZ_default +}); +module.exports = __toCommonJS(cs_CZ_exports); +var locale = { + placeholder: "Vybrat čas" +}; +var cs_CZ_default = locale; diff --git a/packages/meta/lib/time-picker/locale/da_DK.d.ts b/packages/meta/lib/time-picker/locale/da_DK.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/da_DK.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/da_DK.js b/packages/meta/lib/time-picker/locale/da_DK.js new file mode 100644 index 0000000..661947f --- /dev/null +++ b/packages/meta/lib/time-picker/locale/da_DK.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/da_DK.ts +var da_DK_exports = {}; +__export(da_DK_exports, { + default: () => da_DK_default +}); +module.exports = __toCommonJS(da_DK_exports); +var locale = { + placeholder: "Vælg tid", + rangePlaceholder: ["Starttidspunkt", "Sluttidspunkt"] +}; +var da_DK_default = locale; diff --git a/packages/meta/lib/time-picker/locale/de_DE.d.ts b/packages/meta/lib/time-picker/locale/de_DE.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/de_DE.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/de_DE.js b/packages/meta/lib/time-picker/locale/de_DE.js new file mode 100644 index 0000000..c7e0231 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/de_DE.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/de_DE.ts +var de_DE_exports = {}; +__export(de_DE_exports, { + default: () => de_DE_default +}); +module.exports = __toCommonJS(de_DE_exports); +var locale = { + placeholder: "Zeit auswählen", + rangePlaceholder: ["Anfangszeit", "Endzeit"] +}; +var de_DE_default = locale; diff --git a/packages/meta/lib/time-picker/locale/el_GR.d.ts b/packages/meta/lib/time-picker/locale/el_GR.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/el_GR.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/el_GR.js b/packages/meta/lib/time-picker/locale/el_GR.js new file mode 100644 index 0000000..34ca458 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/el_GR.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/el_GR.ts +var el_GR_exports = {}; +__export(el_GR_exports, { + default: () => el_GR_default +}); +module.exports = __toCommonJS(el_GR_exports); +var locale = { + placeholder: "Επιλέξτε ώρα" +}; +var el_GR_default = locale; diff --git a/packages/meta/lib/time-picker/locale/en_GB.d.ts b/packages/meta/lib/time-picker/locale/en_GB.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/en_GB.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/en_GB.js b/packages/meta/lib/time-picker/locale/en_GB.js new file mode 100644 index 0000000..29d5f97 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/en_GB.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/en_GB.ts +var en_GB_exports = {}; +__export(en_GB_exports, { + default: () => en_GB_default +}); +module.exports = __toCommonJS(en_GB_exports); +var locale = { + placeholder: "Select time" +}; +var en_GB_default = locale; diff --git a/packages/meta/lib/time-picker/locale/en_US.d.ts b/packages/meta/lib/time-picker/locale/en_US.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/en_US.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/en_US.js b/packages/meta/lib/time-picker/locale/en_US.js new file mode 100644 index 0000000..5489525 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/en_US.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/en_US.ts +var en_US_exports = {}; +__export(en_US_exports, { + default: () => en_US_default +}); +module.exports = __toCommonJS(en_US_exports); +var locale = { + placeholder: "Select time", + rangePlaceholder: ["Start time", "End time"] +}; +var en_US_default = locale; diff --git a/packages/meta/lib/time-picker/locale/es_ES.d.ts b/packages/meta/lib/time-picker/locale/es_ES.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/es_ES.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/es_ES.js b/packages/meta/lib/time-picker/locale/es_ES.js new file mode 100644 index 0000000..250ab7b --- /dev/null +++ b/packages/meta/lib/time-picker/locale/es_ES.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/es_ES.ts +var es_ES_exports = {}; +__export(es_ES_exports, { + default: () => es_ES_default +}); +module.exports = __toCommonJS(es_ES_exports); +var locale = { + placeholder: "Seleccionar hora" +}; +var es_ES_default = locale; diff --git a/packages/meta/lib/time-picker/locale/et_EE.d.ts b/packages/meta/lib/time-picker/locale/et_EE.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/et_EE.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/et_EE.js b/packages/meta/lib/time-picker/locale/et_EE.js new file mode 100644 index 0000000..4d0a346 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/et_EE.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/et_EE.ts +var et_EE_exports = {}; +__export(et_EE_exports, { + default: () => et_EE_default +}); +module.exports = __toCommonJS(et_EE_exports); +var locale = { + placeholder: "Vali aeg" +}; +var et_EE_default = locale; diff --git a/packages/meta/lib/time-picker/locale/eu_ES.d.ts b/packages/meta/lib/time-picker/locale/eu_ES.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/eu_ES.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/eu_ES.js b/packages/meta/lib/time-picker/locale/eu_ES.js new file mode 100644 index 0000000..590c28f --- /dev/null +++ b/packages/meta/lib/time-picker/locale/eu_ES.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/eu_ES.ts +var eu_ES_exports = {}; +__export(eu_ES_exports, { + default: () => eu_ES_default +}); +module.exports = __toCommonJS(eu_ES_exports); +var locale = { + placeholder: "Aukeratu ordua" +}; +var eu_ES_default = locale; diff --git a/packages/meta/lib/time-picker/locale/fa_IR.d.ts b/packages/meta/lib/time-picker/locale/fa_IR.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fa_IR.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/fa_IR.js b/packages/meta/lib/time-picker/locale/fa_IR.js new file mode 100644 index 0000000..b03a9c2 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fa_IR.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/fa_IR.ts +var fa_IR_exports = {}; +__export(fa_IR_exports, { + default: () => fa_IR_default +}); +module.exports = __toCommonJS(fa_IR_exports); +var locale = { + placeholder: "انتخاب زمان", + rangePlaceholder: ["زمان شروع", "زمان پایان"] +}; +var fa_IR_default = locale; diff --git a/packages/meta/lib/time-picker/locale/fi_FI.d.ts b/packages/meta/lib/time-picker/locale/fi_FI.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fi_FI.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/fi_FI.js b/packages/meta/lib/time-picker/locale/fi_FI.js new file mode 100644 index 0000000..a33e8fd --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fi_FI.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/fi_FI.ts +var fi_FI_exports = {}; +__export(fi_FI_exports, { + default: () => fi_FI_default +}); +module.exports = __toCommonJS(fi_FI_exports); +var locale = { + placeholder: "Valitse aika" +}; +var fi_FI_default = locale; diff --git a/packages/meta/lib/time-picker/locale/fr_BE.d.ts b/packages/meta/lib/time-picker/locale/fr_BE.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fr_BE.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/fr_BE.js b/packages/meta/lib/time-picker/locale/fr_BE.js new file mode 100644 index 0000000..2d03b1c --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fr_BE.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/fr_BE.ts +var fr_BE_exports = {}; +__export(fr_BE_exports, { + default: () => fr_BE_default +}); +module.exports = __toCommonJS(fr_BE_exports); +var locale = { + placeholder: "Sélectionner l'heure", + rangePlaceholder: ["Heure de début", "Heure de fin"] +}; +var fr_BE_default = locale; diff --git a/packages/meta/lib/time-picker/locale/fr_CA.d.ts b/packages/meta/lib/time-picker/locale/fr_CA.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fr_CA.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/fr_CA.js b/packages/meta/lib/time-picker/locale/fr_CA.js new file mode 100644 index 0000000..5619e0f --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fr_CA.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/fr_CA.ts +var fr_CA_exports = {}; +__export(fr_CA_exports, { + default: () => fr_CA_default +}); +module.exports = __toCommonJS(fr_CA_exports); +var locale = { + placeholder: "Sélectionner l'heure", + rangePlaceholder: ["Heure de début", "Heure de fin"] +}; +var fr_CA_default = locale; diff --git a/packages/meta/lib/time-picker/locale/fr_FR.d.ts b/packages/meta/lib/time-picker/locale/fr_FR.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fr_FR.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/fr_FR.js b/packages/meta/lib/time-picker/locale/fr_FR.js new file mode 100644 index 0000000..9df8677 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/fr_FR.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/fr_FR.ts +var fr_FR_exports = {}; +__export(fr_FR_exports, { + default: () => fr_FR_default +}); +module.exports = __toCommonJS(fr_FR_exports); +var locale = { + placeholder: "Sélectionner l'heure", + rangePlaceholder: ["Heure de début", "Heure de fin"] +}; +var fr_FR_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ga_IE.d.ts b/packages/meta/lib/time-picker/locale/ga_IE.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ga_IE.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ga_IE.js b/packages/meta/lib/time-picker/locale/ga_IE.js new file mode 100644 index 0000000..7b0058c --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ga_IE.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ga_IE.ts +var ga_IE_exports = {}; +__export(ga_IE_exports, { + default: () => ga_IE_default +}); +module.exports = __toCommonJS(ga_IE_exports); +var locale = { + placeholder: "Roghnaigh am", + rangePlaceholder: ["Am tosaigh", "Am deiridh"] +}; +var ga_IE_default = locale; diff --git a/packages/meta/lib/time-picker/locale/gl_ES.d.ts b/packages/meta/lib/time-picker/locale/gl_ES.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/gl_ES.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/gl_ES.js b/packages/meta/lib/time-picker/locale/gl_ES.js new file mode 100644 index 0000000..5c89b63 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/gl_ES.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/gl_ES.ts +var gl_ES_exports = {}; +__export(gl_ES_exports, { + default: () => gl_ES_default +}); +module.exports = __toCommonJS(gl_ES_exports); +var locale = { + placeholder: "Escolla hora" +}; +var gl_ES_default = locale; diff --git a/packages/meta/lib/time-picker/locale/he_IL.d.ts b/packages/meta/lib/time-picker/locale/he_IL.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/he_IL.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/he_IL.js b/packages/meta/lib/time-picker/locale/he_IL.js new file mode 100644 index 0000000..7eca6be --- /dev/null +++ b/packages/meta/lib/time-picker/locale/he_IL.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/he_IL.ts +var he_IL_exports = {}; +__export(he_IL_exports, { + default: () => he_IL_default +}); +module.exports = __toCommonJS(he_IL_exports); +var locale = { + placeholder: "בחר שעה" +}; +var he_IL_default = locale; diff --git a/packages/meta/lib/time-picker/locale/hi_IN.d.ts b/packages/meta/lib/time-picker/locale/hi_IN.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/hi_IN.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/hi_IN.js b/packages/meta/lib/time-picker/locale/hi_IN.js new file mode 100644 index 0000000..31a170f --- /dev/null +++ b/packages/meta/lib/time-picker/locale/hi_IN.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/hi_IN.ts +var hi_IN_exports = {}; +__export(hi_IN_exports, { + default: () => hi_IN_default +}); +module.exports = __toCommonJS(hi_IN_exports); +var locale = { + placeholder: "समय का चयन करें", + rangePlaceholder: ["आरंभिक समय", "अंत समय"] +}; +var hi_IN_default = locale; diff --git a/packages/meta/lib/time-picker/locale/hr_HR.d.ts b/packages/meta/lib/time-picker/locale/hr_HR.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/hr_HR.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/hr_HR.js b/packages/meta/lib/time-picker/locale/hr_HR.js new file mode 100644 index 0000000..d73a28f --- /dev/null +++ b/packages/meta/lib/time-picker/locale/hr_HR.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/hr_HR.ts +var hr_HR_exports = {}; +__export(hr_HR_exports, { + default: () => hr_HR_default +}); +module.exports = __toCommonJS(hr_HR_exports); +var locale = { + placeholder: "Odaberite vrijeme", + rangePlaceholder: ["Vrijeme početka", "Vrijeme završetka"] +}; +var hr_HR_default = locale; diff --git a/packages/meta/lib/time-picker/locale/hu_HU.d.ts b/packages/meta/lib/time-picker/locale/hu_HU.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/hu_HU.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/hu_HU.js b/packages/meta/lib/time-picker/locale/hu_HU.js new file mode 100644 index 0000000..b3aef3f --- /dev/null +++ b/packages/meta/lib/time-picker/locale/hu_HU.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/hu_HU.ts +var hu_HU_exports = {}; +__export(hu_HU_exports, { + default: () => hu_HU_default +}); +module.exports = __toCommonJS(hu_HU_exports); +var locale = { + placeholder: "Válasszon időt" +}; +var hu_HU_default = locale; diff --git a/packages/meta/lib/time-picker/locale/id_ID.d.ts b/packages/meta/lib/time-picker/locale/id_ID.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/id_ID.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/id_ID.js b/packages/meta/lib/time-picker/locale/id_ID.js new file mode 100644 index 0000000..39f8a99 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/id_ID.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/id_ID.ts +var id_ID_exports = {}; +__export(id_ID_exports, { + default: () => id_ID_default +}); +module.exports = __toCommonJS(id_ID_exports); +var locale = { + placeholder: "Pilih waktu" +}; +var id_ID_default = locale; diff --git a/packages/meta/lib/time-picker/locale/is_IS.d.ts b/packages/meta/lib/time-picker/locale/is_IS.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/is_IS.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/is_IS.js b/packages/meta/lib/time-picker/locale/is_IS.js new file mode 100644 index 0000000..aea4e37 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/is_IS.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/is_IS.ts +var is_IS_exports = {}; +__export(is_IS_exports, { + default: () => is_IS_default +}); +module.exports = __toCommonJS(is_IS_exports); +var locale = { + placeholder: "Velja tíma" +}; +var is_IS_default = locale; diff --git a/packages/meta/lib/time-picker/locale/it_IT.d.ts b/packages/meta/lib/time-picker/locale/it_IT.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/it_IT.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/it_IT.js b/packages/meta/lib/time-picker/locale/it_IT.js new file mode 100644 index 0000000..24f7c8c --- /dev/null +++ b/packages/meta/lib/time-picker/locale/it_IT.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/it_IT.ts +var it_IT_exports = {}; +__export(it_IT_exports, { + default: () => it_IT_default +}); +module.exports = __toCommonJS(it_IT_exports); +var locale = { + placeholder: "Selezionare l'orario" +}; +var it_IT_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ja_JP.d.ts b/packages/meta/lib/time-picker/locale/ja_JP.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ja_JP.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ja_JP.js b/packages/meta/lib/time-picker/locale/ja_JP.js new file mode 100644 index 0000000..5cad281 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ja_JP.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ja_JP.ts +var ja_JP_exports = {}; +__export(ja_JP_exports, { + default: () => ja_JP_default +}); +module.exports = __toCommonJS(ja_JP_exports); +var locale = { + placeholder: "時間を選択", + rangePlaceholder: ["開始時間", "終了時間"] +}; +var ja_JP_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ka_GE.d.ts b/packages/meta/lib/time-picker/locale/ka_GE.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ka_GE.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ka_GE.js b/packages/meta/lib/time-picker/locale/ka_GE.js new file mode 100644 index 0000000..ca8e392 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ka_GE.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ka_GE.ts +var ka_GE_exports = {}; +__export(ka_GE_exports, { + default: () => ka_GE_default +}); +module.exports = __toCommonJS(ka_GE_exports); +var locale = { + placeholder: "აირჩიეთ დრო", + rangePlaceholder: ["საწყისი თარიღი", "საბოლოო თარიღი"] +}; +var ka_GE_default = locale; diff --git a/packages/meta/lib/time-picker/locale/kk_KZ.d.ts b/packages/meta/lib/time-picker/locale/kk_KZ.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/kk_KZ.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/kk_KZ.js b/packages/meta/lib/time-picker/locale/kk_KZ.js new file mode 100644 index 0000000..88c2402 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/kk_KZ.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/kk_KZ.ts +var kk_KZ_exports = {}; +__export(kk_KZ_exports, { + default: () => kk_KZ_default +}); +module.exports = __toCommonJS(kk_KZ_exports); +var locale = { + placeholder: "Уақытты таңдаңыз", + rangePlaceholder: ["Бастау уақыты", "Аяқталу уақыты"] +}; +var kk_KZ_default = locale; diff --git a/packages/meta/lib/time-picker/locale/km_KH.d.ts b/packages/meta/lib/time-picker/locale/km_KH.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/km_KH.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/km_KH.js b/packages/meta/lib/time-picker/locale/km_KH.js new file mode 100644 index 0000000..043e131 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/km_KH.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/km_KH.ts +var km_KH_exports = {}; +__export(km_KH_exports, { + default: () => km_KH_default +}); +module.exports = __toCommonJS(km_KH_exports); +var locale = { + placeholder: "រើសម៉ោង", + rangePlaceholder: ["ម៉ោងចប់ផ្ដើម", "ម៉ោងបញ្ចប់"] +}; +var km_KH_default = locale; diff --git a/packages/meta/lib/time-picker/locale/kmr_IQ.d.ts b/packages/meta/lib/time-picker/locale/kmr_IQ.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/kmr_IQ.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/kmr_IQ.js b/packages/meta/lib/time-picker/locale/kmr_IQ.js new file mode 100644 index 0000000..f9a4ee0 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/kmr_IQ.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/kmr_IQ.ts +var kmr_IQ_exports = {}; +__export(kmr_IQ_exports, { + default: () => kmr_IQ_default +}); +module.exports = __toCommonJS(kmr_IQ_exports); +var locale = { + placeholder: "Demê hilbijêre" +}; +var kmr_IQ_default = locale; diff --git a/packages/meta/lib/time-picker/locale/kn_IN.d.ts b/packages/meta/lib/time-picker/locale/kn_IN.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/kn_IN.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/kn_IN.js b/packages/meta/lib/time-picker/locale/kn_IN.js new file mode 100644 index 0000000..b419c7f --- /dev/null +++ b/packages/meta/lib/time-picker/locale/kn_IN.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/kn_IN.ts +var kn_IN_exports = {}; +__export(kn_IN_exports, { + default: () => kn_IN_default +}); +module.exports = __toCommonJS(kn_IN_exports); +var locale = { + placeholder: "ಸಮಯ ಆಯ್ಕೆಮಾಡಿ" +}; +var kn_IN_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ko_KR.d.ts b/packages/meta/lib/time-picker/locale/ko_KR.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ko_KR.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ko_KR.js b/packages/meta/lib/time-picker/locale/ko_KR.js new file mode 100644 index 0000000..ccc67d7 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ko_KR.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ko_KR.ts +var ko_KR_exports = {}; +__export(ko_KR_exports, { + default: () => ko_KR_default +}); +module.exports = __toCommonJS(ko_KR_exports); +var locale = { + placeholder: "시간 선택", + rangePlaceholder: ["시작 시간", "종료 시간"] +}; +var ko_KR_default = locale; diff --git a/packages/meta/lib/time-picker/locale/lt_LT.d.ts b/packages/meta/lib/time-picker/locale/lt_LT.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/lt_LT.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/lt_LT.js b/packages/meta/lib/time-picker/locale/lt_LT.js new file mode 100644 index 0000000..fd180d4 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/lt_LT.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/lt_LT.ts +var lt_LT_exports = {}; +__export(lt_LT_exports, { + default: () => lt_LT_default +}); +module.exports = __toCommonJS(lt_LT_exports); +var locale = { + placeholder: "Pasirinkite laiką", + rangePlaceholder: ["Pradžios laikas", "Pabaigos laikas"] +}; +var lt_LT_default = locale; diff --git a/packages/meta/lib/time-picker/locale/lv_LV.d.ts b/packages/meta/lib/time-picker/locale/lv_LV.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/lv_LV.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/lv_LV.js b/packages/meta/lib/time-picker/locale/lv_LV.js new file mode 100644 index 0000000..99fa25c --- /dev/null +++ b/packages/meta/lib/time-picker/locale/lv_LV.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/lv_LV.ts +var lv_LV_exports = {}; +__export(lv_LV_exports, { + default: () => lv_LV_default +}); +module.exports = __toCommonJS(lv_LV_exports); +var locale = { + placeholder: "Izvēlieties laiku" +}; +var lv_LV_default = locale; diff --git a/packages/meta/lib/time-picker/locale/mk_MK.d.ts b/packages/meta/lib/time-picker/locale/mk_MK.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/mk_MK.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/mk_MK.js b/packages/meta/lib/time-picker/locale/mk_MK.js new file mode 100644 index 0000000..e17a1d6 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/mk_MK.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/mk_MK.ts +var mk_MK_exports = {}; +__export(mk_MK_exports, { + default: () => mk_MK_default +}); +module.exports = __toCommonJS(mk_MK_exports); +var locale = { + placeholder: "Избери време" +}; +var mk_MK_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ml_IN.d.ts b/packages/meta/lib/time-picker/locale/ml_IN.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ml_IN.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ml_IN.js b/packages/meta/lib/time-picker/locale/ml_IN.js new file mode 100644 index 0000000..d2987f3 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ml_IN.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ml_IN.ts +var ml_IN_exports = {}; +__export(ml_IN_exports, { + default: () => ml_IN_default +}); +module.exports = __toCommonJS(ml_IN_exports); +var locale = { + placeholder: "സമയം തിരഞ്ഞെടുക്കുക", + rangePlaceholder: ["ആരംഭ സമയം", "അവസാന സമയം"] +}; +var ml_IN_default = locale; diff --git a/packages/meta/lib/time-picker/locale/mn_MN.d.ts b/packages/meta/lib/time-picker/locale/mn_MN.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/mn_MN.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/mn_MN.js b/packages/meta/lib/time-picker/locale/mn_MN.js new file mode 100644 index 0000000..7c4be1e --- /dev/null +++ b/packages/meta/lib/time-picker/locale/mn_MN.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/mn_MN.ts +var mn_MN_exports = {}; +__export(mn_MN_exports, { + default: () => mn_MN_default +}); +module.exports = __toCommonJS(mn_MN_exports); +var locale = { + placeholder: "Цаг сонгох" +}; +var mn_MN_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ms_MY.d.ts b/packages/meta/lib/time-picker/locale/ms_MY.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ms_MY.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ms_MY.js b/packages/meta/lib/time-picker/locale/ms_MY.js new file mode 100644 index 0000000..79c67d2 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ms_MY.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ms_MY.ts +var ms_MY_exports = {}; +__export(ms_MY_exports, { + default: () => ms_MY_default +}); +module.exports = __toCommonJS(ms_MY_exports); +var locale = { + placeholder: "Sila pilih masa" +}; +var ms_MY_default = locale; diff --git a/packages/meta/lib/time-picker/locale/my_MM.d.ts b/packages/meta/lib/time-picker/locale/my_MM.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/my_MM.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/my_MM.js b/packages/meta/lib/time-picker/locale/my_MM.js new file mode 100644 index 0000000..3fe891c --- /dev/null +++ b/packages/meta/lib/time-picker/locale/my_MM.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/my_MM.ts +var my_MM_exports = {}; +__export(my_MM_exports, { + default: () => my_MM_default +}); +module.exports = __toCommonJS(my_MM_exports); +var locale = { + placeholder: "အချိန်ရွေးပါ။", + rangePlaceholder: ["စတင်ချိန်", "ကုန်ဆုံးချိန်"] +}; +var my_MM_default = locale; diff --git a/packages/meta/lib/time-picker/locale/nb_NO.d.ts b/packages/meta/lib/time-picker/locale/nb_NO.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/nb_NO.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/nb_NO.js b/packages/meta/lib/time-picker/locale/nb_NO.js new file mode 100644 index 0000000..e291642 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/nb_NO.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/nb_NO.ts +var nb_NO_exports = {}; +__export(nb_NO_exports, { + default: () => nb_NO_default +}); +module.exports = __toCommonJS(nb_NO_exports); +var locale = { + placeholder: "Velg tid", + rangePlaceholder: ["Starttid", "Sluttid"] +}; +var nb_NO_default = locale; diff --git a/packages/meta/lib/time-picker/locale/nl_BE.d.ts b/packages/meta/lib/time-picker/locale/nl_BE.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/nl_BE.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/nl_BE.js b/packages/meta/lib/time-picker/locale/nl_BE.js new file mode 100644 index 0000000..f9077fa --- /dev/null +++ b/packages/meta/lib/time-picker/locale/nl_BE.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/nl_BE.ts +var nl_BE_exports = {}; +__export(nl_BE_exports, { + default: () => nl_BE_default +}); +module.exports = __toCommonJS(nl_BE_exports); +var locale = { + placeholder: "Selecteer tijd", + rangePlaceholder: ["Start tijd", "Eind tijd"] +}; +var nl_BE_default = locale; diff --git a/packages/meta/lib/time-picker/locale/nl_NL.d.ts b/packages/meta/lib/time-picker/locale/nl_NL.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/nl_NL.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/nl_NL.js b/packages/meta/lib/time-picker/locale/nl_NL.js new file mode 100644 index 0000000..747eb6e --- /dev/null +++ b/packages/meta/lib/time-picker/locale/nl_NL.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/nl_NL.ts +var nl_NL_exports = {}; +__export(nl_NL_exports, { + default: () => nl_NL_default +}); +module.exports = __toCommonJS(nl_NL_exports); +var locale = { + placeholder: "Selecteer tijd", + rangePlaceholder: ["Start tijd", "Eind tijd"] +}; +var nl_NL_default = locale; diff --git a/packages/meta/lib/time-picker/locale/pl_PL.d.ts b/packages/meta/lib/time-picker/locale/pl_PL.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/pl_PL.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/pl_PL.js b/packages/meta/lib/time-picker/locale/pl_PL.js new file mode 100644 index 0000000..158ac58 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/pl_PL.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/pl_PL.ts +var pl_PL_exports = {}; +__export(pl_PL_exports, { + default: () => pl_PL_default +}); +module.exports = __toCommonJS(pl_PL_exports); +var locale = { + placeholder: "Wybierz godzinę" +}; +var pl_PL_default = locale; diff --git a/packages/meta/lib/time-picker/locale/pt_BR.d.ts b/packages/meta/lib/time-picker/locale/pt_BR.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/pt_BR.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/pt_BR.js b/packages/meta/lib/time-picker/locale/pt_BR.js new file mode 100644 index 0000000..37e9967 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/pt_BR.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/pt_BR.ts +var pt_BR_exports = {}; +__export(pt_BR_exports, { + default: () => pt_BR_default +}); +module.exports = __toCommonJS(pt_BR_exports); +var locale = { + placeholder: "Hora" +}; +var pt_BR_default = locale; diff --git a/packages/meta/lib/time-picker/locale/pt_PT.d.ts b/packages/meta/lib/time-picker/locale/pt_PT.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/pt_PT.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/pt_PT.js b/packages/meta/lib/time-picker/locale/pt_PT.js new file mode 100644 index 0000000..7214141 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/pt_PT.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/pt_PT.ts +var pt_PT_exports = {}; +__export(pt_PT_exports, { + default: () => pt_PT_default +}); +module.exports = __toCommonJS(pt_PT_exports); +var locale = { + placeholder: "Hora" +}; +var pt_PT_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ro_RO.d.ts b/packages/meta/lib/time-picker/locale/ro_RO.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ro_RO.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ro_RO.js b/packages/meta/lib/time-picker/locale/ro_RO.js new file mode 100644 index 0000000..23cb8d3 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ro_RO.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ro_RO.ts +var ro_RO_exports = {}; +__export(ro_RO_exports, { + default: () => ro_RO_default +}); +module.exports = __toCommonJS(ro_RO_exports); +var locale = { + placeholder: "Selectează ora" +}; +var ro_RO_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ru_RU.d.ts b/packages/meta/lib/time-picker/locale/ru_RU.d.ts new file mode 100644 index 0000000..ea3ada2 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ru_RU.d.ts @@ -0,0 +1,4 @@ +/** Created by Andrey Gayvoronsky on 13/04/16. */ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ru_RU.js b/packages/meta/lib/time-picker/locale/ru_RU.js new file mode 100644 index 0000000..b2a6dfe --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ru_RU.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ru_RU.ts +var ru_RU_exports = {}; +__export(ru_RU_exports, { + default: () => ru_RU_default +}); +module.exports = __toCommonJS(ru_RU_exports); +var locale = { + placeholder: "Выберите время", + rangePlaceholder: ["Время начала", "Время окончания"] +}; +var ru_RU_default = locale; diff --git a/packages/meta/lib/time-picker/locale/si_LK.d.ts b/packages/meta/lib/time-picker/locale/si_LK.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/si_LK.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/si_LK.js b/packages/meta/lib/time-picker/locale/si_LK.js new file mode 100644 index 0000000..58fd79f --- /dev/null +++ b/packages/meta/lib/time-picker/locale/si_LK.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/si_LK.ts +var si_LK_exports = {}; +__export(si_LK_exports, { + default: () => si_LK_default +}); +module.exports = __toCommonJS(si_LK_exports); +var locale = { + placeholder: "වේලාව තෝරන්න", + rangePlaceholder: ["ආරම්භක වේලාව", "නිමවන වේලාව"] +}; +var si_LK_default = locale; diff --git a/packages/meta/lib/time-picker/locale/sk_SK.d.ts b/packages/meta/lib/time-picker/locale/sk_SK.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/sk_SK.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/sk_SK.js b/packages/meta/lib/time-picker/locale/sk_SK.js new file mode 100644 index 0000000..5fd9c9e --- /dev/null +++ b/packages/meta/lib/time-picker/locale/sk_SK.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/sk_SK.ts +var sk_SK_exports = {}; +__export(sk_SK_exports, { + default: () => sk_SK_default +}); +module.exports = __toCommonJS(sk_SK_exports); +var locale = { + placeholder: "Vybrať čas" +}; +var sk_SK_default = locale; diff --git a/packages/meta/lib/time-picker/locale/sl_SI.d.ts b/packages/meta/lib/time-picker/locale/sl_SI.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/sl_SI.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/sl_SI.js b/packages/meta/lib/time-picker/locale/sl_SI.js new file mode 100644 index 0000000..2417cf7 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/sl_SI.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/sl_SI.ts +var sl_SI_exports = {}; +__export(sl_SI_exports, { + default: () => sl_SI_default +}); +module.exports = __toCommonJS(sl_SI_exports); +var locale = { + placeholder: "Izberite čas" +}; +var sl_SI_default = locale; diff --git a/packages/meta/lib/time-picker/locale/sr_RS.d.ts b/packages/meta/lib/time-picker/locale/sr_RS.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/sr_RS.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/sr_RS.js b/packages/meta/lib/time-picker/locale/sr_RS.js new file mode 100644 index 0000000..b37827b --- /dev/null +++ b/packages/meta/lib/time-picker/locale/sr_RS.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/sr_RS.ts +var sr_RS_exports = {}; +__export(sr_RS_exports, { + default: () => sr_RS_default +}); +module.exports = __toCommonJS(sr_RS_exports); +var locale = { + placeholder: "Izaberi vreme", + rangePlaceholder: ["Vreme početka", "Vreme završetka"] +}; +var sr_RS_default = locale; diff --git a/packages/meta/lib/time-picker/locale/sv_SE.d.ts b/packages/meta/lib/time-picker/locale/sv_SE.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/sv_SE.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/sv_SE.js b/packages/meta/lib/time-picker/locale/sv_SE.js new file mode 100644 index 0000000..796ca85 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/sv_SE.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/sv_SE.ts +var sv_SE_exports = {}; +__export(sv_SE_exports, { + default: () => sv_SE_default +}); +module.exports = __toCommonJS(sv_SE_exports); +var locale = { + placeholder: "Välj tid" +}; +var sv_SE_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ta_IN.d.ts b/packages/meta/lib/time-picker/locale/ta_IN.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ta_IN.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ta_IN.js b/packages/meta/lib/time-picker/locale/ta_IN.js new file mode 100644 index 0000000..a51e868 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ta_IN.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ta_IN.ts +var ta_IN_exports = {}; +__export(ta_IN_exports, { + default: () => ta_IN_default +}); +module.exports = __toCommonJS(ta_IN_exports); +var locale = { + placeholder: "நேரத்தைத் தேர்ந்தெடுக்கவும்" +}; +var ta_IN_default = locale; diff --git a/packages/meta/lib/time-picker/locale/th_TH.d.ts b/packages/meta/lib/time-picker/locale/th_TH.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/th_TH.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/th_TH.js b/packages/meta/lib/time-picker/locale/th_TH.js new file mode 100644 index 0000000..239887e --- /dev/null +++ b/packages/meta/lib/time-picker/locale/th_TH.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/th_TH.ts +var th_TH_exports = {}; +__export(th_TH_exports, { + default: () => th_TH_default +}); +module.exports = __toCommonJS(th_TH_exports); +var locale = { + placeholder: "เลือกเวลา" +}; +var th_TH_default = locale; diff --git a/packages/meta/lib/time-picker/locale/tk_TK.d.ts b/packages/meta/lib/time-picker/locale/tk_TK.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/tk_TK.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/tk_TK.js b/packages/meta/lib/time-picker/locale/tk_TK.js new file mode 100644 index 0000000..d8296cd --- /dev/null +++ b/packages/meta/lib/time-picker/locale/tk_TK.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/tk_TK.ts +var tk_TK_exports = {}; +__export(tk_TK_exports, { + default: () => tk_TK_default +}); +module.exports = __toCommonJS(tk_TK_exports); +var locale = { + placeholder: "Wagty saýlaň", + rangePlaceholder: ["Başlanýan wagty", "Gutarýan wagty"] +}; +var tk_TK_default = locale; diff --git a/packages/meta/lib/time-picker/locale/tr_TR.d.ts b/packages/meta/lib/time-picker/locale/tr_TR.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/tr_TR.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/tr_TR.js b/packages/meta/lib/time-picker/locale/tr_TR.js new file mode 100644 index 0000000..1f83bc4 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/tr_TR.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/tr_TR.ts +var tr_TR_exports = {}; +__export(tr_TR_exports, { + default: () => tr_TR_default +}); +module.exports = __toCommonJS(tr_TR_exports); +var locale = { + placeholder: "Zaman seç", + rangePlaceholder: ["Başlangıç zamanı", "Bitiş zamanı"] +}; +var tr_TR_default = locale; diff --git a/packages/meta/lib/time-picker/locale/uk_UA.d.ts b/packages/meta/lib/time-picker/locale/uk_UA.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/uk_UA.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/uk_UA.js b/packages/meta/lib/time-picker/locale/uk_UA.js new file mode 100644 index 0000000..e09fb53 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/uk_UA.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/uk_UA.ts +var uk_UA_exports = {}; +__export(uk_UA_exports, { + default: () => uk_UA_default +}); +module.exports = __toCommonJS(uk_UA_exports); +var locale = { + placeholder: "Оберіть час" +}; +var uk_UA_default = locale; diff --git a/packages/meta/lib/time-picker/locale/ur_PK.d.ts b/packages/meta/lib/time-picker/locale/ur_PK.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ur_PK.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/ur_PK.js b/packages/meta/lib/time-picker/locale/ur_PK.js new file mode 100644 index 0000000..b45e5dc --- /dev/null +++ b/packages/meta/lib/time-picker/locale/ur_PK.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/ur_PK.ts +var ur_PK_exports = {}; +__export(ur_PK_exports, { + default: () => ur_PK_default +}); +module.exports = __toCommonJS(ur_PK_exports); +var locale = { + placeholder: "وقت منتخب کریں", + rangePlaceholder: ["وقت منتخب کریں", "آخر وقت"] +}; +var ur_PK_default = locale; diff --git a/packages/meta/lib/time-picker/locale/vi_VN.d.ts b/packages/meta/lib/time-picker/locale/vi_VN.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/vi_VN.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/vi_VN.js b/packages/meta/lib/time-picker/locale/vi_VN.js new file mode 100644 index 0000000..4768de3 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/vi_VN.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/vi_VN.ts +var vi_VN_exports = {}; +__export(vi_VN_exports, { + default: () => vi_VN_default +}); +module.exports = __toCommonJS(vi_VN_exports); +var locale = { + placeholder: "Chọn thời gian", + rangePlaceholder: ["Bắt đầu", "Kết thúc"] +}; +var vi_VN_default = locale; diff --git a/packages/meta/lib/time-picker/locale/zh_CN.d.ts b/packages/meta/lib/time-picker/locale/zh_CN.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/zh_CN.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/zh_CN.js b/packages/meta/lib/time-picker/locale/zh_CN.js new file mode 100644 index 0000000..aaaefd7 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/zh_CN.js @@ -0,0 +1,29 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/zh_CN.ts +var zh_CN_exports = {}; +__export(zh_CN_exports, { + default: () => zh_CN_default +}); +module.exports = __toCommonJS(zh_CN_exports); +var locale = { + placeholder: "请选择时间", + rangePlaceholder: ["开始时间", "结束时间"] +}; +var zh_CN_default = locale; diff --git a/packages/meta/lib/time-picker/locale/zh_TW.d.ts b/packages/meta/lib/time-picker/locale/zh_TW.d.ts new file mode 100644 index 0000000..151bba9 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/zh_TW.d.ts @@ -0,0 +1,3 @@ +import type { TimePickerLocale } from '../index'; +declare const locale: TimePickerLocale; +export default locale; diff --git a/packages/meta/lib/time-picker/locale/zh_TW.js b/packages/meta/lib/time-picker/locale/zh_TW.js new file mode 100644 index 0000000..1ca7425 --- /dev/null +++ b/packages/meta/lib/time-picker/locale/zh_TW.js @@ -0,0 +1,28 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/time-picker/locale/zh_TW.ts +var zh_TW_exports = {}; +__export(zh_TW_exports, { + default: () => zh_TW_default +}); +module.exports = __toCommonJS(zh_TW_exports); +var locale = { + placeholder: "請選擇時間" +}; +var zh_TW_default = locale; diff --git a/packages/meta/lib/tooltip/PurePanel.d.ts b/packages/meta/lib/tooltip/PurePanel.d.ts new file mode 100644 index 0000000..55b6b4b --- /dev/null +++ b/packages/meta/lib/tooltip/PurePanel.d.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; +import type { TooltipProps } from '.'; +export interface PurePanelProps extends Omit { +} +/** @private Internal Component. Do not use in your production. */ +declare const PurePanel: React.FC; +export default PurePanel; diff --git a/packages/meta/lib/tooltip/PurePanel.js b/packages/meta/lib/tooltip/PurePanel.js new file mode 100644 index 0000000..3e03086 --- /dev/null +++ b/packages/meta/lib/tooltip/PurePanel.js @@ -0,0 +1,81 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tooltip/PurePanel.tsx +var PurePanel_exports = {}; +__export(PurePanel_exports, { + default: () => PurePanel_default +}); +module.exports = __toCommonJS(PurePanel_exports); +var import_classnames = __toESM(require("classnames")); +var import_rc_tooltip = require("rc-tooltip"); +var React = __toESM(require("react")); +var import_config_provider = require("../config-provider"); +var import_style = __toESM(require("./style")); +var import_util = require("./util"); +var PurePanel = (props) => { + const { + prefixCls: customizePrefixCls, + className, + placement = "top", + title, + color, + overlayInnerStyle + } = props; + const { getPrefixCls } = React.useContext(import_config_provider.ConfigContext); + const prefixCls = getPrefixCls("tooltip", customizePrefixCls); + const [wrapCSSVar, hashId, cssVarCls] = (0, import_style.default)(prefixCls); + const colorInfo = (0, import_util.parseColor)(prefixCls, color); + const arrowContentStyle = colorInfo.arrowStyle; + const formattedOverlayInnerStyle = { + ...overlayInnerStyle, + ...colorInfo.overlayStyle + }; + const cls = (0, import_classnames.default)( + hashId, + cssVarCls, + prefixCls, + `${prefixCls}-pure`, + `${prefixCls}-placement-${placement}`, + className, + colorInfo.className + ); + return wrapCSSVar( + /* @__PURE__ */ React.createElement("div", { className: cls, style: arrowContentStyle }, /* @__PURE__ */ React.createElement("div", { className: `${prefixCls}-arrow` }), /* @__PURE__ */ React.createElement( + import_rc_tooltip.Popup, + { + ...props, + className: hashId, + prefixCls, + overlayInnerStyle: formattedOverlayInnerStyle + }, + title + )) + ); +}; +var PurePanel_default = PurePanel; diff --git a/packages/meta/lib/tooltip/index.d.ts b/packages/meta/lib/tooltip/index.d.ts new file mode 100644 index 0000000..9177762 --- /dev/null +++ b/packages/meta/lib/tooltip/index.d.ts @@ -0,0 +1,76 @@ +import * as React from 'react'; +import type { placements as Placements } from 'rc-tooltip/lib/placements'; +import type { TooltipProps as RcTooltipProps } from 'rc-tooltip/lib/Tooltip'; +import type { PresetColorType } from '../_util/colors'; +import type { RenderFunction } from '../_util/getRenderPropValue'; +import type { AdjustOverflow, PlacementsConfig } from '../_util/placements'; +import type { LiteralUnion } from '../_util/type'; +import PurePanel from './PurePanel'; +export type { AdjustOverflow, PlacementsConfig }; +export interface TooltipRef { + /** @deprecated Please use `forceAlign` instead */ + forcePopupAlign: VoidFunction; + forceAlign: VoidFunction; +} +export type TooltipPlacement = 'top' | 'left' | 'right' | 'bottom' | 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom'; +export interface TooltipAlignConfig { + points?: [string, string]; + offset?: [number | string, number | string]; + targetOffset?: [number | string, number | string]; + overflow?: { + adjustX: boolean; + adjustY: boolean; + }; + useCssRight?: boolean; + useCssBottom?: boolean; + useCssTransform?: boolean; +} +interface LegacyTooltipProps extends Partial> { + open?: RcTooltipProps['visible']; + defaultOpen?: RcTooltipProps['defaultVisible']; + onOpenChange?: RcTooltipProps['onVisibleChange']; + afterOpenChange?: RcTooltipProps['afterVisibleChange']; + /** @deprecated Please use `open` instead. */ + visible?: RcTooltipProps['visible']; + /** @deprecated Please use `defaultOpen` instead. */ + defaultVisible?: RcTooltipProps['defaultVisible']; + /** @deprecated Please use `onOpenChange` instead. */ + onVisibleChange?: RcTooltipProps['onVisibleChange']; + /** @deprecated Please use `afterOpenChange` instead. */ + afterVisibleChange?: RcTooltipProps['afterVisibleChange']; +} +export interface AbstractTooltipProps extends LegacyTooltipProps { + style?: React.CSSProperties; + className?: string; + rootClassName?: string; + color?: LiteralUnion; + placement?: TooltipPlacement; + builtinPlacements?: typeof Placements; + openClassName?: string; + /** @deprecated Please use `arrow={{ pointAtCenter: true }}` instead. */ + arrowPointAtCenter?: boolean; + arrow?: boolean | { + /** @deprecated Please use `pointAtCenter` instead. */ + arrowPointAtCenter?: boolean; + pointAtCenter?: boolean; + }; + autoAdjustOverflow?: boolean | AdjustOverflow; + getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement; + children?: React.ReactNode; + destroyTooltipOnHide?: boolean | { + keepParent?: boolean; + }; +} +export interface TooltipPropsWithOverlay extends AbstractTooltipProps { + title?: React.ReactNode | RenderFunction; + overlay?: React.ReactNode | RenderFunction; +} +export interface TooltipPropsWithTitle extends AbstractTooltipProps { + title: React.ReactNode | RenderFunction; + overlay?: React.ReactNode | RenderFunction; +} +export declare type TooltipProps = TooltipPropsWithTitle | TooltipPropsWithOverlay; +declare const Tooltip: React.ForwardRefExoticComponent> & { + _InternalPanelDoNotUseOrYouWillBeFired: typeof PurePanel; +}; +export default Tooltip; diff --git a/packages/meta/lib/tooltip/index.js b/packages/meta/lib/tooltip/index.js new file mode 100644 index 0000000..d16ec57 --- /dev/null +++ b/packages/meta/lib/tooltip/index.js @@ -0,0 +1,219 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tooltip/index.tsx +var tooltip_exports = {}; +__export(tooltip_exports, { + default: () => tooltip_default +}); +module.exports = __toCommonJS(tooltip_exports); +var React = __toESM(require("react")); +var import_classnames = __toESM(require("classnames")); +var import_rc_tooltip = __toESM(require("rc-tooltip")); +var import_useMergedState = __toESM(require("rc-util/lib/hooks/useMergedState")); +var import_useZIndex = require("../_util/hooks/useZIndex"); +var import_motion = require("../_util/motion"); +var import_placements = __toESM(require("../_util/placements")); +var import_reactNode = require("../_util/reactNode"); +var import_warning = require("../_util/warning"); +var import_zindexContext = __toESM(require("../_util/zindexContext")); +var import_config_provider = require("../config-provider"); +var import_Compact = require("../space/Compact"); +var import_internal = require("../theme/internal"); +var import_PurePanel = __toESM(require("./PurePanel")); +var import_style = __toESM(require("./style")); +var import_util = require("./util"); +var Tooltip = React.forwardRef((props, ref) => { + const { + prefixCls: customizePrefixCls, + openClassName, + getTooltipContainer, + overlayClassName, + color, + overlayInnerStyle, + children, + afterOpenChange, + afterVisibleChange, + destroyTooltipOnHide, + arrow = true, + title, + overlay, + builtinPlacements, + arrowPointAtCenter = false, + autoAdjustOverflow = true + } = props; + const mergedShowArrow = !!arrow; + const [, token] = (0, import_internal.useToken)(); + const { + getPopupContainer: getContextPopupContainer, + getPrefixCls, + direction + } = React.useContext(import_config_provider.ConfigContext); + const warning = (0, import_warning.devUseWarning)("Tooltip"); + const tooltipRef = React.useRef(null); + const forceAlign = () => { + var _a; + (_a = tooltipRef.current) == null ? void 0 : _a.forceAlign(); + }; + React.useImperativeHandle(ref, () => ({ + forceAlign, + forcePopupAlign: () => { + warning.deprecated(false, "forcePopupAlign", "forceAlign"); + forceAlign(); + } + })); + if (process.env.NODE_ENV !== "production") { + [ + ["visible", "open"], + ["defaultVisible", "defaultOpen"], + ["onVisibleChange", "onOpenChange"], + ["afterVisibleChange", "afterOpenChange"], + ["arrowPointAtCenter", "arrow={{ pointAtCenter: true }}"] + ].forEach(([deprecatedName, newName]) => { + warning.deprecated(!(deprecatedName in props), deprecatedName, newName); + }); + warning( + !destroyTooltipOnHide || typeof destroyTooltipOnHide === "boolean", + "usage", + "`destroyTooltipOnHide` no need config `keepParent` anymore. Please use `boolean` value directly." + ); + warning( + !arrow || typeof arrow === "boolean" || !("arrowPointAtCenter" in arrow), + "deprecated", + "`arrowPointAtCenter` in `arrow` is deprecated. Please use `pointAtCenter` instead." + ); + } + const [open, setOpen] = (0, import_useMergedState.default)(false, { + value: props.open ?? props.visible, + defaultValue: props.defaultOpen ?? props.defaultVisible + }); + const noTitle = !title && !overlay && title !== 0; + const onOpenChange = (vis) => { + var _a, _b; + setOpen(noTitle ? false : vis); + if (!noTitle) { + (_a = props.onOpenChange) == null ? void 0 : _a.call(props, vis); + (_b = props.onVisibleChange) == null ? void 0 : _b.call(props, vis); + } + }; + const tooltipPlacements = React.useMemo(() => { + let mergedArrowPointAtCenter = arrowPointAtCenter; + if (typeof arrow === "object") { + mergedArrowPointAtCenter = arrow.pointAtCenter ?? arrow.arrowPointAtCenter ?? arrowPointAtCenter; + } + return builtinPlacements || (0, import_placements.default)({ + arrowPointAtCenter: mergedArrowPointAtCenter, + autoAdjustOverflow, + arrowWidth: mergedShowArrow ? token.sizePopupArrow : 0, + borderRadius: token.borderRadius, + offset: token.marginXXS, + visibleFirst: true + }); + }, [arrowPointAtCenter, arrow, builtinPlacements, token]); + const memoOverlay = React.useMemo(() => { + if (title === 0) { + return title; + } + return overlay || title || ""; + }, [overlay, title]); + const memoOverlayWrapper = /* @__PURE__ */ React.createElement(import_Compact.NoCompactStyle, null, typeof memoOverlay === "function" ? memoOverlay() : memoOverlay); + const { + getPopupContainer, + placement = "top", + mouseEnterDelay = 0.1, + mouseLeaveDelay = 0.1, + overlayStyle, + rootClassName, + ...otherProps + } = props; + const prefixCls = getPrefixCls("tooltip", customizePrefixCls); + const rootPrefixCls = getPrefixCls(); + const injectFromPopover = props["data-popover-inject"]; + let tempOpen = open; + if (!("open" in props) && !("visible" in props) && noTitle) { + tempOpen = false; + } + const child = (0, import_reactNode.isValidElement)(children) && !(0, import_reactNode.isFragment)(children) ? children : /* @__PURE__ */ React.createElement("span", null, children); + const childProps = child.props; + const childCls = !childProps.className || typeof childProps.className === "string" ? (0, import_classnames.default)(childProps.className, openClassName || `${prefixCls}-open`) : childProps.className; + const [wrapCSSVar, hashId, cssVarCls] = (0, import_style.default)(prefixCls, !injectFromPopover); + const colorInfo = (0, import_util.parseColor)(prefixCls, color); + const arrowContentStyle = colorInfo.arrowStyle; + const formattedOverlayInnerStyle = { + ...overlayInnerStyle, + ...colorInfo.overlayStyle + }; + const customOverlayClassName = (0, import_classnames.default)( + overlayClassName, + { + [`${prefixCls}-rtl`]: direction === "rtl" + }, + colorInfo.className, + rootClassName, + hashId, + cssVarCls + ); + const [zIndex, contextZIndex] = (0, import_useZIndex.useZIndex)("Tooltip", otherProps.zIndex); + const content = /* @__PURE__ */ React.createElement( + import_rc_tooltip.default, + { + ...otherProps, + zIndex, + showArrow: mergedShowArrow, + placement, + mouseEnterDelay, + mouseLeaveDelay, + prefixCls, + overlayClassName: customOverlayClassName, + overlayStyle: { ...arrowContentStyle, ...overlayStyle }, + getTooltipContainer: getPopupContainer || getTooltipContainer || getContextPopupContainer, + ref: tooltipRef, + builtinPlacements: tooltipPlacements, + overlay: memoOverlayWrapper, + visible: tempOpen, + onVisibleChange: onOpenChange, + afterVisibleChange: afterOpenChange ?? afterVisibleChange, + overlayInnerStyle: formattedOverlayInnerStyle, + arrowContent: /* @__PURE__ */ React.createElement("span", { className: `${prefixCls}-arrow-content` }), + motion: { + motionName: (0, import_motion.getTransitionName)(rootPrefixCls, "zoom-big-fast", props.transitionName), + motionDeadline: 1e3 + }, + destroyTooltipOnHide: !!destroyTooltipOnHide + }, + tempOpen ? (0, import_reactNode.cloneElement)(child, { className: childCls }) : child + ); + return wrapCSSVar( + /* @__PURE__ */ React.createElement(import_zindexContext.default.Provider, { value: contextZIndex }, content) + ); +}); +if (process.env.NODE_ENV !== "production") { + Tooltip.displayName = "Tooltip"; +} +Tooltip._InternalPanelDoNotUseOrYouWillBeFired = import_PurePanel.default; +var tooltip_default = Tooltip; diff --git a/packages/meta/lib/tooltip/style/index.d.ts b/packages/meta/lib/tooltip/style/index.d.ts new file mode 100644 index 0000000..d8cb1e8 --- /dev/null +++ b/packages/meta/lib/tooltip/style/index.d.ts @@ -0,0 +1,14 @@ +/// +import type { ArrowOffsetToken } from '../../style/placementArrow'; +import type { GetDefaultToken } from '../../theme/internal'; +import type { ArrowToken } from '../../style/roundedArrow'; +export interface ComponentToken extends ArrowOffsetToken, ArrowToken { + /** + * @desc 文字提示 z-index + * @descEN z-index of tooltip + */ + zIndexPopup: number; +} +export declare const prepareComponentToken: GetDefaultToken<'Tooltip'>; +declare const _default: (prefixCls: string, injectStyle?: boolean) => readonly [(node: import("react").ReactElement>) => import("react").ReactElement>, string, string | undefined]; +export default _default; diff --git a/packages/meta/lib/tooltip/style/index.js b/packages/meta/lib/tooltip/style/index.js new file mode 100644 index 0000000..eb9ed01 --- /dev/null +++ b/packages/meta/lib/tooltip/style/index.js @@ -0,0 +1,168 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tooltip/style/index.ts +var style_exports = {}; +__export(style_exports, { + default: () => style_default, + prepareComponentToken: () => prepareComponentToken +}); +module.exports = __toCommonJS(style_exports); +var import_style = require("../../style"); +var import_motion = require("../../style/motion"); +var import_placementArrow = __toESM(require("../../style/placementArrow")); +var import_internal = require("../../theme/internal"); +var import_cssinjs = require("@ant-design/cssinjs"); +var import_roundedArrow = require("../../style/roundedArrow"); +var genTooltipStyle = (token) => { + const { + componentCls, + // ant-tooltip + tooltipMaxWidth, + tooltipColor, + tooltipBg, + tooltipBorderRadius, + zIndexPopup, + controlHeight, + boxShadowSecondary, + paddingSM, + paddingXS + } = token; + return [ + { + [componentCls]: { + ...(0, import_style.resetComponent)(token), + position: "absolute", + zIndex: zIndexPopup, + display: "block", + width: "max-content", + maxWidth: tooltipMaxWidth, + visibility: "visible", + transformOrigin: `var(--arrow-x, 50%) var(--arrow-y, 50%)`, + "&-hidden": { + display: "none" + }, + "--antd-arrow-background-color": tooltipBg, + // Wrapper for the tooltip content + [`${componentCls}-inner`]: { + minWidth: controlHeight, + minHeight: controlHeight, + padding: `${(0, import_cssinjs.unit)(token.calc(paddingSM).div(2).equal())} ${(0, import_cssinjs.unit)(paddingXS)}`, + color: tooltipColor, + textAlign: "start", + textDecoration: "none", + wordWrap: "break-word", + backgroundColor: tooltipBg, + borderRadius: tooltipBorderRadius, + boxShadow: boxShadowSecondary, + boxSizing: "border-box" + }, + // Limit left and right placement radius + [[ + `&-placement-left`, + `&-placement-leftTop`, + `&-placement-leftBottom`, + `&-placement-right`, + `&-placement-rightTop`, + `&-placement-rightBottom` + ].join(",")]: { + [`${componentCls}-inner`]: { + borderRadius: token.min(tooltipBorderRadius, import_placementArrow.MAX_VERTICAL_CONTENT_RADIUS) + } + }, + [`${componentCls}-content`]: { + position: "relative" + }, + // generator for preset color + ...(0, import_internal.genPresetColor)(token, (colorKey, { darkColor }) => ({ + [`&${componentCls}-${colorKey}`]: { + [`${componentCls}-inner`]: { + backgroundColor: darkColor + }, + [`${componentCls}-arrow`]: { + "--antd-arrow-background-color": darkColor + } + } + })), + // RTL + "&-rtl": { + direction: "rtl" + } + } + }, + // Arrow Style + (0, import_placementArrow.default)(token, "var(--antd-arrow-background-color)"), + // Pure Render + { + [`${componentCls}-pure`]: { + position: "relative", + maxWidth: "none", + margin: token.sizePopupArrow + } + } + ]; +}; +var prepareComponentToken = (token) => ({ + zIndexPopup: token.zIndexPopupBase + 70, + ...(0, import_placementArrow.getArrowOffsetToken)({ + contentRadius: token.borderRadius, + limitVerticalRadius: true + }), + ...(0, import_roundedArrow.getArrowToken)( + (0, import_internal.mergeToken)(token, { + borderRadiusOuter: Math.min(token.borderRadiusOuter, 4) + }) + ) +}); +var style_default = (prefixCls, injectStyle = true) => { + const useStyle = (0, import_internal.genStyleHooks)( + "Tooltip", + (token) => { + const { borderRadius, colorTextLightSolid, colorBgSpotlight } = token; + const TooltipToken = (0, import_internal.mergeToken)(token, { + // default variables + tooltipMaxWidth: 250, + tooltipColor: colorTextLightSolid, + tooltipBorderRadius: borderRadius, + tooltipBg: colorBgSpotlight + }); + return [genTooltipStyle(TooltipToken), (0, import_motion.initZoomMotion)(token, "zoom-big-fast")]; + }, + prepareComponentToken, + { + resetStyle: false, + // Popover use Tooltip as internal component. We do not need to handle this. + injectStyle + } + ); + return useStyle(prefixCls); +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + prepareComponentToken +}); diff --git a/packages/meta/lib/tooltip/util.d.ts b/packages/meta/lib/tooltip/util.d.ts new file mode 100644 index 0000000..73ebec2 --- /dev/null +++ b/packages/meta/lib/tooltip/util.d.ts @@ -0,0 +1,6 @@ +import type * as React from 'react'; +export declare function parseColor(prefixCls: string, color?: string): { + className: string; + overlayStyle: React.CSSProperties; + arrowStyle: React.CSSProperties; +}; diff --git a/packages/meta/lib/tooltip/util.js b/packages/meta/lib/tooltip/util.js new file mode 100644 index 0000000..4fd73c8 --- /dev/null +++ b/packages/meta/lib/tooltip/util.js @@ -0,0 +1,53 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tooltip/util.ts +var util_exports = {}; +__export(util_exports, { + parseColor: () => parseColor +}); +module.exports = __toCommonJS(util_exports); +var import_classnames = __toESM(require("classnames")); +var import_colors = require("../_util/colors"); +function parseColor(prefixCls, color) { + const isInternalColor = (0, import_colors.isPresetColor)(color); + const className = (0, import_classnames.default)({ + [`${prefixCls}-${color}`]: color && isInternalColor + }); + const overlayStyle = {}; + const arrowStyle = {}; + if (color && !isInternalColor) { + overlayStyle.background = color; + arrowStyle["--antd-arrow-background-color"] = color; + } + return { className, overlayStyle, arrowStyle }; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + parseColor +}); diff --git a/packages/meta/lib/tour/PurePanel.d.ts b/packages/meta/lib/tour/PurePanel.d.ts new file mode 100644 index 0000000..e52af68 --- /dev/null +++ b/packages/meta/lib/tour/PurePanel.d.ts @@ -0,0 +1,6 @@ +import * as React from 'react'; +import type { TourStepProps } from './interface'; +export interface PurePanelProps extends TourStepProps { +} +declare const _default: (props: PurePanelProps) => React.JSX.Element; +export default _default; diff --git a/packages/meta/lib/tour/PurePanel.js b/packages/meta/lib/tour/PurePanel.js new file mode 100644 index 0000000..505d464 --- /dev/null +++ b/packages/meta/lib/tour/PurePanel.js @@ -0,0 +1,73 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tour/PurePanel.tsx +var PurePanel_exports = {}; +__export(PurePanel_exports, { + default: () => PurePanel_default +}); +module.exports = __toCommonJS(PurePanel_exports); +var import_classnames = __toESM(require("classnames")); +var React = __toESM(require("react")); +var import_config_provider = require("../config-provider"); +var import_PurePanel = require("../popover/PurePanel"); +var import_panelRender = __toESM(require("./panelRender")); +var import_style = __toESM(require("./style")); +var import_PurePanel2 = require("../_util/PurePanel"); +var PurePanel = (props) => { + const { + prefixCls: customizePrefixCls, + current = 0, + total = 6, + className, + style, + type, + ...restProps + } = props; + const { getPrefixCls } = React.useContext(import_config_provider.ConfigContext); + const prefixCls = getPrefixCls("tour", customizePrefixCls); + const [wrapCSSVar, hashId, cssVarCls] = (0, import_style.default)(prefixCls); + return wrapCSSVar( + /* @__PURE__ */ React.createElement( + import_PurePanel.RawPurePanel, + { + prefixCls, + hashId, + className: (0, import_classnames.default)( + className, + `${prefixCls}-pure`, + type && `${prefixCls}-${type}`, + cssVarCls + ), + style + }, + /* @__PURE__ */ React.createElement(import_panelRender.default, { stepProps: { ...restProps, prefixCls, total }, current, type }) + ) + ); +}; +var PurePanel_default = (0, import_PurePanel2.withPureRenderTheme)(PurePanel); diff --git a/packages/meta/lib/tour/index.d.ts b/packages/meta/lib/tour/index.d.ts new file mode 100644 index 0000000..41c2ee2 --- /dev/null +++ b/packages/meta/lib/tour/index.d.ts @@ -0,0 +1,7 @@ +import React from 'react'; +import type { TourProps } from './interface'; +import PurePanel from './PurePanel'; +declare const Tour: React.FC & { + _InternalPanelDoNotUseOrYouWillBeFired: typeof PurePanel; +}; +export default Tour; diff --git a/packages/meta/lib/tour/index.js b/packages/meta/lib/tour/index.js new file mode 100644 index 0000000..a838ba8 --- /dev/null +++ b/packages/meta/lib/tour/index.js @@ -0,0 +1,113 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tour/index.tsx +var tour_exports = {}; +__export(tour_exports, { + default: () => tour_default +}); +module.exports = __toCommonJS(tour_exports); +var import_react = __toESM(require("react")); +var import_tour = __toESM(require("@rc-component/tour")); +var import_classnames = __toESM(require("classnames")); +var import_useZIndex = require("../_util/hooks/useZIndex"); +var import_placements = __toESM(require("../_util/placements")); +var import_zindexContext = __toESM(require("../_util/zindexContext")); +var import_config_provider = require("../config-provider"); +var import_internal = require("../theme/internal"); +var import_panelRender = __toESM(require("./panelRender")); +var import_PurePanel = __toESM(require("./PurePanel")); +var import_style = __toESM(require("./style")); +var Tour = (props) => { + const { + prefixCls: customizePrefixCls, + type, + rootClassName, + indicatorsRender, + steps, + ...restProps + } = props; + const { getPrefixCls, direction } = (0, import_react.useContext)(import_config_provider.ConfigContext); + const prefixCls = getPrefixCls("tour", customizePrefixCls); + const [wrapCSSVar, hashId, cssVarCls] = (0, import_style.default)(prefixCls); + const [, token] = (0, import_internal.useToken)(); + const mergedSteps = (0, import_react.useMemo)( + () => steps == null ? void 0 : steps.map((step) => ({ + ...step, + className: (0, import_classnames.default)(step.className, { + [`${prefixCls}-primary`]: (step.type ?? type) === "primary" + }) + })), + [steps, type] + ); + const builtinPlacements = (0, import_placements.default)({ + arrowPointAtCenter: true, + autoAdjustOverflow: true, + offset: token.marginXXS, + arrowWidth: token.sizePopupArrow, + borderRadius: token.borderRadius + }); + const customClassName = (0, import_classnames.default)( + { + [`${prefixCls}-rtl`]: direction === "rtl" + }, + hashId, + cssVarCls, + rootClassName + ); + const mergedRenderPanel = (stepProps, stepCurrent) => /* @__PURE__ */ import_react.default.createElement( + import_panelRender.default, + { + type, + stepProps, + current: stepCurrent, + indicatorsRender + } + ); + const [zIndex, contextZIndex] = (0, import_useZIndex.useZIndex)("Tour", restProps.zIndex); + return wrapCSSVar( + /* @__PURE__ */ import_react.default.createElement(import_zindexContext.default.Provider, { value: contextZIndex }, /* @__PURE__ */ import_react.default.createElement( + import_tour.default, + { + ...restProps, + zIndex, + rootClassName: customClassName, + prefixCls, + animated: true, + renderPanel: mergedRenderPanel, + builtinPlacements, + steps: mergedSteps + } + )) + ); +}; +if (process.env.NODE_ENV !== "production") { + Tour.displayName = "Tour"; +} +Tour._InternalPanelDoNotUseOrYouWillBeFired = import_PurePanel.default; +var tour_default = Tour; diff --git a/packages/meta/lib/tour/interface.d.ts b/packages/meta/lib/tour/interface.d.ts new file mode 100644 index 0000000..8b2e7d2 --- /dev/null +++ b/packages/meta/lib/tour/interface.d.ts @@ -0,0 +1,32 @@ +import type { TourProps as RCTourProps, TourStepProps as RCTourStepProps } from '@rc-component/tour'; +import type { ReactNode } from 'react'; +export interface TourProps extends Omit { + steps?: TourStepProps[]; + className?: string; + prefixCls?: string; + current?: number; + indicatorsRender?: (current: number, total: number) => ReactNode; + type?: 'default' | 'primary'; +} +export interface TourStepProps extends RCTourStepProps { + cover?: ReactNode; + nextButtonProps?: { + children?: ReactNode; + onClick?: () => void; + className?: string; + style?: React.CSSProperties; + }; + prevButtonProps?: { + children?: ReactNode; + onClick?: () => void; + className?: string; + style?: React.CSSProperties; + }; + indicatorsRender?: (current: number, total: number) => ReactNode; + type?: 'default' | 'primary'; +} +export interface TourLocale { + Next: string; + Previous: string; + Finish: string; +} diff --git a/packages/meta/lib/tour/interface.js b/packages/meta/lib/tour/interface.js new file mode 100644 index 0000000..a6d11ed --- /dev/null +++ b/packages/meta/lib/tour/interface.js @@ -0,0 +1,17 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tour/interface.ts +var interface_exports = {}; +module.exports = __toCommonJS(interface_exports); diff --git a/packages/meta/lib/tour/panelRender.d.ts b/packages/meta/lib/tour/panelRender.d.ts new file mode 100644 index 0000000..e46526d --- /dev/null +++ b/packages/meta/lib/tour/panelRender.d.ts @@ -0,0 +1,12 @@ +import type { ReactNode } from 'react'; +import React from 'react'; +import type { TourStepProps } from './interface'; +interface TourPanelProps { + stepProps: TourStepProps; + current: number; + type: TourStepProps['type']; + indicatorsRender?: TourStepProps['indicatorsRender']; + closeIcon?: ReactNode; +} +declare const TourPanel: React.FC; +export default TourPanel; diff --git a/packages/meta/lib/tour/panelRender.js b/packages/meta/lib/tour/panelRender.js new file mode 100644 index 0000000..335e102 --- /dev/null +++ b/packages/meta/lib/tour/panelRender.js @@ -0,0 +1,140 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tour/panelRender.tsx +var panelRender_exports = {}; +__export(panelRender_exports, { + default: () => panelRender_default +}); +module.exports = __toCommonJS(panelRender_exports); +var import_CloseOutlined = __toESM(require("@ant-design/icons/CloseOutlined")); +var import_classnames = __toESM(require("classnames")); +var import_react = __toESM(require("react")); +var import_button = __toESM(require("../button")); +var import_locale = require("../locale"); +var import_en_US = __toESM(require("../locale/en_US")); +var import_useClosable = __toESM(require("../_util/hooks/useClosable")); +function isValidNode(node) { + return node !== void 0 && node !== null; +} +var TourPanel = ({ + stepProps, + current, + type, + indicatorsRender, + closeIcon +}) => { + const { + prefixCls, + total = 1, + title, + onClose, + onPrev, + onNext, + onFinish, + cover, + description, + nextButtonProps, + prevButtonProps, + type: stepType, + closeIcon: stepCloseIcon + } = stepProps; + const mergedType = stepType ?? type; + const mergedCloseIcon = stepCloseIcon ?? closeIcon; + const mergedClosable = mergedCloseIcon !== false && mergedCloseIcon !== null; + const [closable, mergedDisplayCloseIcon] = (0, import_useClosable.default)( + mergedClosable, + mergedCloseIcon, + (icon) => /* @__PURE__ */ import_react.default.createElement("span", { onClick: onClose, "aria-label": "Close", className: `${prefixCls}-close` }, icon), + /* @__PURE__ */ import_react.default.createElement(import_CloseOutlined.default, { className: `${prefixCls}-close-icon` }), + true + ); + const isLastStep = current === total - 1; + const prevBtnClick = () => { + var _a; + onPrev == null ? void 0 : onPrev(); + (_a = prevButtonProps == null ? void 0 : prevButtonProps.onClick) == null ? void 0 : _a.call(prevButtonProps); + }; + const nextBtnClick = () => { + var _a; + if (isLastStep) { + onFinish == null ? void 0 : onFinish(); + } else { + onNext == null ? void 0 : onNext(); + } + (_a = nextButtonProps == null ? void 0 : nextButtonProps.onClick) == null ? void 0 : _a.call(nextButtonProps); + }; + const headerNode = isValidNode(title) ? /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-header` }, /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-title` }, title)) : null; + const descriptionNode = isValidNode(description) ? /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-description` }, description) : null; + const coverNode = isValidNode(cover) ? /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-cover` }, cover) : null; + let mergeIndicatorNode; + if (indicatorsRender) { + mergeIndicatorNode = indicatorsRender(current, total); + } else { + mergeIndicatorNode = [...Array.from({ length: total }).keys()].map( + (stepItem, index) => /* @__PURE__ */ import_react.default.createElement( + "span", + { + key: stepItem, + className: (0, import_classnames.default)( + index === current && `${prefixCls}-indicator-active`, + `${prefixCls}-indicator` + ) + } + ) + ); + } + const mainBtnType = mergedType === "primary" ? "default" : "primary"; + const secondaryBtnProps = { + type: "default", + ghost: mergedType === "primary" + }; + const [contextLocale] = (0, import_locale.useLocale)("Tour", import_en_US.default.Tour); + return /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-content` }, /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-inner` }, closable && mergedDisplayCloseIcon, coverNode, headerNode, descriptionNode, /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-footer` }, total > 1 && /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-indicators` }, mergeIndicatorNode), /* @__PURE__ */ import_react.default.createElement("div", { className: `${prefixCls}-buttons` }, current !== 0 ? /* @__PURE__ */ import_react.default.createElement( + import_button.default, + { + ...secondaryBtnProps, + ...prevButtonProps, + onClick: prevBtnClick, + size: "small", + className: (0, import_classnames.default)(`${prefixCls}-prev-btn`, prevButtonProps == null ? void 0 : prevButtonProps.className) + }, + (prevButtonProps == null ? void 0 : prevButtonProps.children) ?? (contextLocale == null ? void 0 : contextLocale.Previous) + ) : null, /* @__PURE__ */ import_react.default.createElement( + import_button.default, + { + type: mainBtnType, + ...nextButtonProps, + onClick: nextBtnClick, + size: "small", + className: (0, import_classnames.default)(`${prefixCls}-next-btn`, nextButtonProps == null ? void 0 : nextButtonProps.className) + }, + (nextButtonProps == null ? void 0 : nextButtonProps.children) ?? (isLastStep ? contextLocale == null ? void 0 : contextLocale.Finish : contextLocale == null ? void 0 : contextLocale.Next) + ))))); +}; +var panelRender_default = TourPanel; diff --git a/packages/meta/lib/tour/style/index.d.ts b/packages/meta/lib/tour/style/index.d.ts new file mode 100644 index 0000000..1d5acec --- /dev/null +++ b/packages/meta/lib/tour/style/index.d.ts @@ -0,0 +1,29 @@ +/// +import type { ArrowOffsetToken } from '../../style/placementArrow'; +import type { GetDefaultToken } from '../../theme/internal'; +import type { ArrowToken } from '../../style/roundedArrow'; +export interface ComponentToken extends ArrowOffsetToken, ArrowToken { + /** + * @desc 弹层 z-index + * @descEN Tour popup z-index + */ + zIndexPopup: number; + /** + * @desc 关闭按钮尺寸 + * @descEN Close button size + */ + closeBtnSize: number; + /** + * @desc Primary 模式上一步按钮背景色 + * @descEN Background color of previous button in primary type + */ + primaryPrevBtnBg: string; + /** + * @desc Primary 模式下一步按钮悬浮背景色 + * @descEN Hover background color of next button in primary type + */ + primaryNextBtnHoverBg: string; +} +export declare const prepareComponentToken: GetDefaultToken<'Tour'>; +declare const _default: (prefixCls: string, rootCls?: string) => readonly [(node: import("react").ReactElement>) => import("react").ReactElement>, string, string | undefined]; +export default _default; diff --git a/packages/meta/lib/tour/style/index.js b/packages/meta/lib/tour/style/index.js new file mode 100644 index 0000000..5e789f6 --- /dev/null +++ b/packages/meta/lib/tour/style/index.js @@ -0,0 +1,267 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/tour/style/index.ts +var style_exports = {}; +__export(style_exports, { + default: () => style_default, + prepareComponentToken: () => prepareComponentToken +}); +module.exports = __toCommonJS(style_exports); +var import_tinycolor = require("@ctrl/tinycolor"); +var import_style = require("../../style"); +var import_placementArrow = __toESM(require("../../style/placementArrow")); +var import_internal = require("../../theme/internal"); +var import_roundedArrow = require("../../style/roundedArrow"); +var import_cssinjs = require("@ant-design/cssinjs"); +var genBaseStyle = (token) => { + const { + componentCls, + lineHeight, + padding, + paddingXS, + borderRadius, + borderRadiusXS, + colorPrimary, + colorText, + colorFill, + indicatorHeight, + indicatorWidth, + boxShadowTertiary, + tourZIndexPopup, + fontSize, + colorBgElevated, + fontWeightStrong, + marginXS, + colorTextLightSolid, + tourBorderRadius, + colorWhite, + primaryNextBtnHoverBg, + closeBtnSize, + motionDurationSlow, + antCls, + primaryPrevBtnBg + } = token; + return [ + { + [componentCls]: { + ...(0, import_style.resetComponent)(token), + color: colorText, + position: "absolute", + zIndex: tourZIndexPopup, + display: "block", + visibility: "visible", + fontSize, + lineHeight, + width: 520, + "--antd-arrow-background-color": colorBgElevated, + "&-pure": { + maxWidth: "100%", + position: "relative" + }, + [`&${componentCls}-hidden`]: { + display: "none" + }, + // ============================= panel content ============================ + [`${componentCls}-content`]: { + position: "relative" + }, + [`${componentCls}-inner`]: { + textAlign: "start", + textDecoration: "none", + borderRadius: tourBorderRadius, + boxShadow: boxShadowTertiary, + position: "relative", + backgroundColor: colorBgElevated, + border: "none", + backgroundClip: "padding-box", + [`${componentCls}-close`]: { + position: "absolute", + top: padding, + insetInlineEnd: padding, + color: token.colorIcon, + outline: "none", + width: closeBtnSize, + height: closeBtnSize, + borderRadius: token.borderRadiusSM, + transition: `background-color ${token.motionDurationMid}, color ${token.motionDurationMid}`, + display: "flex", + alignItems: "center", + justifyContent: "center", + cursor: "pointer", + "&:hover": { + color: token.colorIconHover, + backgroundColor: token.closeBtnHoverBg + } + }, + [`${componentCls}-cover`]: { + textAlign: "center", + padding: `${(0, import_cssinjs.unit)(token.calc(padding).add(closeBtnSize).add(paddingXS).equal())} ${(0, import_cssinjs.unit)( + padding + )} 0`, + img: { + width: "100%" + } + }, + [`${componentCls}-header`]: { + padding: `${(0, import_cssinjs.unit)(padding)} ${(0, import_cssinjs.unit)(padding)} ${(0, import_cssinjs.unit)(paddingXS)}`, + [`${componentCls}-title`]: { + lineHeight, + fontSize, + fontWeight: fontWeightStrong + } + }, + [`${componentCls}-description`]: { + padding: `0 ${(0, import_cssinjs.unit)(padding)}`, + lineHeight, + wordWrap: "break-word" + }, + [`${componentCls}-footer`]: { + padding: `${(0, import_cssinjs.unit)(paddingXS)} ${(0, import_cssinjs.unit)(padding)} ${(0, import_cssinjs.unit)(padding)}`, + textAlign: "end", + borderRadius: `0 0 ${(0, import_cssinjs.unit)(borderRadiusXS)} ${(0, import_cssinjs.unit)(borderRadiusXS)}`, + display: "flex", + [`${componentCls}-indicators`]: { + display: "inline-block", + [`${componentCls}-indicator`]: { + width: indicatorWidth, + height: indicatorHeight, + display: "inline-block", + borderRadius: "50%", + background: colorFill, + "&:not(:last-child)": { + marginInlineEnd: indicatorHeight + }, + "&-active": { + background: colorPrimary + } + } + }, + [`${componentCls}-buttons`]: { + marginInlineStart: "auto", + [`${antCls}-btn`]: { + marginInlineStart: marginXS + } + } + } + }, + // ============================= primary type =========================== + // `$` for panel, `&$` for pure panel + [`${componentCls}-primary, &${componentCls}-primary`]: { + "--antd-arrow-background-color": colorPrimary, + [`${componentCls}-inner`]: { + color: colorTextLightSolid, + textAlign: "start", + textDecoration: "none", + backgroundColor: colorPrimary, + borderRadius, + boxShadow: boxShadowTertiary, + [`${componentCls}-close`]: { + color: colorTextLightSolid + }, + [`${componentCls}-indicators`]: { + [`${componentCls}-indicator`]: { + background: primaryPrevBtnBg, + "&-active": { + background: colorTextLightSolid + } + } + }, + [`${componentCls}-prev-btn`]: { + color: colorTextLightSolid, + borderColor: primaryPrevBtnBg, + backgroundColor: colorPrimary, + "&:hover": { + backgroundColor: primaryPrevBtnBg, + borderColor: "transparent" + } + }, + [`${componentCls}-next-btn`]: { + color: colorPrimary, + borderColor: "transparent", + background: colorWhite, + "&:hover": { + background: primaryNextBtnHoverBg + } + } + } + } + }, + // ============================= mask =========================== + [`${componentCls}-mask`]: { + [`${componentCls}-placeholder-animated`]: { + transition: `all ${motionDurationSlow}` + } + }, + // =========== Limit left and right placement radius ============== + [[ + "&-placement-left", + "&-placement-leftTop", + "&-placement-leftBottom", + "&-placement-right", + "&-placement-rightTop", + "&-placement-rightBottom" + ].join(",")]: { + [`${componentCls}-inner`]: { + borderRadius: token.min(tourBorderRadius, import_placementArrow.MAX_VERTICAL_CONTENT_RADIUS) + } + } + }, + // ============================= Arrow =========================== + (0, import_placementArrow.default)(token, "var(--antd-arrow-background-color)") + ]; +}; +var prepareComponentToken = (token) => ({ + zIndexPopup: token.zIndexPopupBase + 70, + closeBtnSize: token.fontSize * token.lineHeight, + primaryPrevBtnBg: new import_tinycolor.TinyColor(token.colorTextLightSolid).setAlpha(0.15).toRgbString(), + closeBtnHoverBg: token.wireframe ? "transparent" : token.colorFillContent, + primaryNextBtnHoverBg: new import_tinycolor.TinyColor(token.colorBgTextHover).onBackground(token.colorWhite).toRgbString(), + ...(0, import_placementArrow.getArrowOffsetToken)({ + contentRadius: token.borderRadiusLG, + limitVerticalRadius: true + }), + ...(0, import_roundedArrow.getArrowToken)(token) +}); +var style_default = (0, import_internal.genStyleHooks)( + "Tour", + (token) => { + const { borderRadiusLG } = token; + const TourToken = (0, import_internal.mergeToken)(token, { + indicatorWidth: 6, + indicatorHeight: 6, + tourBorderRadius: borderRadiusLG + }); + return [genBaseStyle(TourToken)]; + }, + prepareComponentToken +); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + prepareComponentToken +}); diff --git a/packages/meta/lib/typography/Base/Ellipsis.d.ts b/packages/meta/lib/typography/Base/Ellipsis.d.ts new file mode 100644 index 0000000..610f26f --- /dev/null +++ b/packages/meta/lib/typography/Base/Ellipsis.d.ts @@ -0,0 +1,12 @@ +import * as React from 'react'; +export interface EllipsisProps { + enabledMeasure?: boolean; + text?: React.ReactNode; + width: number; + fontSize: number; + rows: number; + children: (cutChildren: React.ReactNode[], needEllipsis: boolean) => React.ReactNode; + onEllipsis: (isEllipsis: boolean) => void; +} +declare const Ellipsis: React.FC; +export default Ellipsis; diff --git a/packages/meta/lib/typography/Base/Ellipsis.js b/packages/meta/lib/typography/Base/Ellipsis.js new file mode 100644 index 0000000..317dcc6 --- /dev/null +++ b/packages/meta/lib/typography/Base/Ellipsis.js @@ -0,0 +1,185 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Base/Ellipsis.tsx +var Ellipsis_exports = {}; +__export(Ellipsis_exports, { + default: () => Ellipsis_default +}); +module.exports = __toCommonJS(Ellipsis_exports); +var React = __toESM(require("react")); +var import_toArray = __toESM(require("rc-util/lib/Children/toArray")); +var import_useLayoutEffect = __toESM(require("rc-util/lib/hooks/useLayoutEffect")); +function cuttable(node) { + const type = typeof node; + return type === "string" || type === "number"; +} +function getNodesLen(nodeList) { + let totalLen = 0; + nodeList.forEach((node) => { + if (cuttable(node)) { + totalLen += String(node).length; + } else { + totalLen += 1; + } + }); + return totalLen; +} +function sliceNodes(nodeList, len) { + let currLen = 0; + const currentNodeList = []; + for (let i = 0; i < nodeList.length; i += 1) { + if (currLen === len) { + return currentNodeList; + } + const node = nodeList[i]; + const canCut = cuttable(node); + const nodeLen = canCut ? String(node).length : 1; + const nextLen = currLen + nodeLen; + if (nextLen > len) { + const restLen = len - currLen; + currentNodeList.push(String(node).slice(0, restLen)); + return currentNodeList; + } + currentNodeList.push(node); + currLen = nextLen; + } + return nodeList; +} +var NONE = 0; +var PREPARE = 1; +var WALKING = 2; +var DONE_WITH_ELLIPSIS = 3; +var DONE_WITHOUT_ELLIPSIS = 4; +var Ellipsis = ({ + enabledMeasure, + children, + text, + width, + fontSize, + rows, + onEllipsis +}) => { + const [[startLen, midLen, endLen], setCutLength] = React.useState([0, 0, 0]); + const [lastLen, setLastLen] = React.useState(0); + const [walkingState, setWalkingState] = React.useState(NONE); + const [singleRowHeight, setSingleRowHeight] = React.useState(0); + const singleRowRef = React.useRef(null); + const midRowRef = React.useRef(null); + const nodeList = React.useMemo(() => (0, import_toArray.default)(text), [text]); + const totalLen = React.useMemo(() => getNodesLen(nodeList), [nodeList]); + const mergedChildren = React.useMemo(() => { + if (!enabledMeasure || walkingState !== DONE_WITH_ELLIPSIS) { + if (lastLen && walkingState !== DONE_WITHOUT_ELLIPSIS && enabledMeasure) + return children(sliceNodes(nodeList, lastLen), lastLen < totalLen); + return children(nodeList, false); + } + return children(sliceNodes(nodeList, midLen), midLen < totalLen); + }, [enabledMeasure, walkingState, children, nodeList, midLen, totalLen]); + (0, import_useLayoutEffect.default)(() => { + if (enabledMeasure && width && fontSize && totalLen) { + setWalkingState(PREPARE); + setCutLength([0, Math.ceil(totalLen / 2), totalLen]); + } + }, [enabledMeasure, width, fontSize, text, totalLen, rows]); + (0, import_useLayoutEffect.default)(() => { + var _a; + if (walkingState === PREPARE) { + setSingleRowHeight(((_a = singleRowRef.current) == null ? void 0 : _a.offsetHeight) || 0); + } + }, [walkingState]); + (0, import_useLayoutEffect.default)(() => { + var _a, _b; + if (singleRowHeight) { + if (walkingState === PREPARE) { + const midHeight = ((_a = midRowRef.current) == null ? void 0 : _a.offsetHeight) || 0; + const maxHeight = rows * singleRowHeight; + if (midHeight <= maxHeight) { + setWalkingState(DONE_WITHOUT_ELLIPSIS); + onEllipsis(false); + } else { + setWalkingState(WALKING); + } + } else if (walkingState === WALKING) { + if (startLen !== endLen) { + const midHeight = ((_b = midRowRef.current) == null ? void 0 : _b.offsetHeight) || 0; + const maxHeight = rows * singleRowHeight; + let nextStartLen = startLen; + let nextEndLen = endLen; + if (startLen === endLen - 1) { + nextEndLen = startLen; + } else if (midHeight <= maxHeight) { + nextStartLen = midLen; + } else { + nextEndLen = midLen; + } + const nextMidLen = Math.ceil((nextStartLen + nextEndLen) / 2); + setCutLength([nextStartLen, nextMidLen, nextEndLen]); + } else { + setWalkingState(DONE_WITH_ELLIPSIS); + setLastLen(midLen); + onEllipsis(true); + } + } + } + }, [walkingState, startLen, endLen, rows, singleRowHeight]); + const measureStyle = { + width, + whiteSpace: "normal", + margin: 0, + padding: 0 + }; + const renderMeasure = (content, ref, style) => /* @__PURE__ */ React.createElement( + "span", + { + "aria-hidden": true, + ref, + style: { + position: "fixed", + display: "block", + left: 0, + top: 0, + zIndex: -9999, + visibility: "hidden", + pointerEvents: "none", + fontSize: Math.ceil(fontSize / 2) * 2, + ...style + } + }, + content + ); + const renderMeasureSlice = (len, ref) => { + const sliceNodeList = sliceNodes(nodeList, len); + return renderMeasure(children(sliceNodeList, true), ref, measureStyle); + }; + return /* @__PURE__ */ React.createElement(React.Fragment, null, mergedChildren, enabledMeasure && walkingState !== DONE_WITH_ELLIPSIS && walkingState !== DONE_WITHOUT_ELLIPSIS && /* @__PURE__ */ React.createElement(React.Fragment, null, renderMeasure("lg", singleRowRef, { wordBreak: "keep-all", whiteSpace: "nowrap" }), walkingState === PREPARE ? renderMeasure(children(nodeList, false), midRowRef, measureStyle) : renderMeasureSlice(midLen, midRowRef))); +}; +if (process.env.NODE_ENV !== "production") { + Ellipsis.displayName = "Ellipsis"; +} +var Ellipsis_default = Ellipsis; diff --git a/packages/meta/lib/typography/Base/EllipsisTooltip.d.ts b/packages/meta/lib/typography/Base/EllipsisTooltip.d.ts new file mode 100644 index 0000000..5125044 --- /dev/null +++ b/packages/meta/lib/typography/Base/EllipsisTooltip.d.ts @@ -0,0 +1,10 @@ +import * as React from 'react'; +import type { TooltipProps } from '../../tooltip'; +export interface EllipsisTooltipProps { + tooltipProps?: TooltipProps; + enabledEllipsis: boolean; + isEllipsis?: boolean; + children: React.ReactElement; +} +declare const EllipsisTooltip: React.FC; +export default EllipsisTooltip; diff --git a/packages/meta/lib/typography/Base/EllipsisTooltip.js b/packages/meta/lib/typography/Base/EllipsisTooltip.js new file mode 100644 index 0000000..2cfafd2 --- /dev/null +++ b/packages/meta/lib/typography/Base/EllipsisTooltip.js @@ -0,0 +1,51 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Base/EllipsisTooltip.tsx +var EllipsisTooltip_exports = {}; +__export(EllipsisTooltip_exports, { + default: () => EllipsisTooltip_default +}); +module.exports = __toCommonJS(EllipsisTooltip_exports); +var React = __toESM(require("react")); +var import_tooltip = __toESM(require("../../tooltip")); +var EllipsisTooltip = ({ + enabledEllipsis, + isEllipsis, + children, + tooltipProps +}) => { + if (!(tooltipProps == null ? void 0 : tooltipProps.title) || !enabledEllipsis) { + return children; + } + return /* @__PURE__ */ React.createElement(import_tooltip.default, { open: isEllipsis ? void 0 : false, ...tooltipProps }, children); +}; +if (process.env.NODE_ENV !== "production") { + EllipsisTooltip.displayName = "EllipsisTooltip"; +} +var EllipsisTooltip_default = EllipsisTooltip; diff --git a/packages/meta/lib/typography/Base/index.d.ts b/packages/meta/lib/typography/Base/index.d.ts new file mode 100644 index 0000000..64aaba8 --- /dev/null +++ b/packages/meta/lib/typography/Base/index.d.ts @@ -0,0 +1,52 @@ +import * as React from 'react'; +import type { AutoSizeType } from 'rc-textarea'; +import type { TooltipProps } from '../../tooltip'; +import type { TypographyProps } from '../Typography'; +export type BaseType = 'secondary' | 'success' | 'warning' | 'danger'; +interface CopyConfig { + text?: string; + onCopy?: (event?: React.MouseEvent) => void; + icon?: React.ReactNode; + tooltips?: boolean | React.ReactNode; + format?: 'text/plain' | 'text/html'; +} +interface EditConfig { + text?: string; + editing?: boolean; + icon?: React.ReactNode; + tooltip?: boolean | React.ReactNode; + onStart?: () => void; + onChange?: (value: string) => void; + onCancel?: () => void; + onEnd?: () => void; + maxLength?: number; + autoSize?: boolean | AutoSizeType; + triggerType?: ('icon' | 'text')[]; + enterIcon?: React.ReactNode; +} +export interface EllipsisConfig { + rows?: number; + expandable?: boolean; + suffix?: string; + symbol?: React.ReactNode; + onExpand?: React.MouseEventHandler; + onEllipsis?: (ellipsis: boolean) => void; + tooltip?: React.ReactNode | TooltipProps; +} +export interface BlockProps extends TypographyProps { + title?: string; + editable?: boolean | EditConfig; + copyable?: boolean | CopyConfig; + type?: BaseType; + disabled?: boolean; + ellipsis?: boolean | EllipsisConfig; + code?: boolean; + mark?: boolean; + underline?: boolean; + delete?: boolean; + strong?: boolean; + keyboard?: boolean; + italic?: boolean; +} +declare const Base: React.ForwardRefExoticComponent & React.RefAttributes>; +export default Base; diff --git a/packages/meta/lib/typography/Base/index.js b/packages/meta/lib/typography/Base/index.js new file mode 100644 index 0000000..a37db95 --- /dev/null +++ b/packages/meta/lib/typography/Base/index.js @@ -0,0 +1,431 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Base/index.tsx +var Base_exports = {}; +__export(Base_exports, { + default: () => Base_default +}); +module.exports = __toCommonJS(Base_exports); +var React = __toESM(require("react")); +var import_CheckOutlined = __toESM(require("@ant-design/icons/CheckOutlined")); +var import_CopyOutlined = __toESM(require("@ant-design/icons/CopyOutlined")); +var import_EditOutlined = __toESM(require("@ant-design/icons/EditOutlined")); +var import_classnames = __toESM(require("classnames")); +var import_copy_to_clipboard = __toESM(require("copy-to-clipboard")); +var import_rc_resize_observer = __toESM(require("rc-resize-observer")); +var import_toArray = __toESM(require("rc-util/lib/Children/toArray")); +var import_useLayoutEffect = __toESM(require("rc-util/lib/hooks/useLayoutEffect")); +var import_useMergedState = __toESM(require("rc-util/lib/hooks/useMergedState")); +var import_omit = __toESM(require("rc-util/lib/omit")); +var import_ref = require("rc-util/lib/ref"); +var import_styleChecker = require("../../_util/styleChecker"); +var import_transButton = __toESM(require("../../_util/transButton")); +var import_config_provider = require("../../config-provider"); +var import_useLocale = __toESM(require("../../locale/useLocale")); +var import_tooltip = __toESM(require("../../tooltip")); +var import_Editable = __toESM(require("../Editable")); +var import_useMergedConfig = __toESM(require("../hooks/useMergedConfig")); +var import_useUpdatedEffect = __toESM(require("../hooks/useUpdatedEffect")); +var import_Typography = __toESM(require("../Typography")); +var import_Ellipsis = __toESM(require("./Ellipsis")); +var import_EllipsisTooltip = __toESM(require("./EllipsisTooltip")); +function wrapperDecorations({ mark, code, underline, delete: del, strong, keyboard, italic }, content) { + let currentContent = content; + function wrap(tag, needed) { + if (!needed) { + return; + } + currentContent = React.createElement(tag, {}, currentContent); + } + wrap("strong", strong); + wrap("u", underline); + wrap("del", del); + wrap("code", code); + wrap("mark", mark); + wrap("kbd", keyboard); + wrap("i", italic); + return currentContent; +} +function getNode(dom, defaultNode, needDom) { + if (dom === true || dom === void 0) { + return defaultNode; + } + return dom || needDom && defaultNode; +} +function toList(val) { + if (val === false) { + return [false, false]; + } + return Array.isArray(val) ? val : [val]; +} +var ELLIPSIS_STR = "..."; +var Base = React.forwardRef((props, ref) => { + const { + prefixCls: customizePrefixCls, + className, + style, + type, + disabled, + children, + ellipsis, + editable, + copyable, + component, + title, + ...restProps + } = props; + const { getPrefixCls, direction } = React.useContext(import_config_provider.ConfigContext); + const [textLocale] = (0, import_useLocale.default)("Text"); + const typographyRef = React.useRef(null); + const editIconRef = React.useRef(null); + const prefixCls = getPrefixCls("typography", customizePrefixCls); + const textProps = (0, import_omit.default)(restProps, [ + "mark", + "code", + "delete", + "underline", + "strong", + "keyboard", + "italic" + ]); + const [enableEdit, editConfig] = (0, import_useMergedConfig.default)(editable); + const [editing, setEditing] = (0, import_useMergedState.default)(false, { + value: editConfig.editing + }); + const { triggerType = ["icon"] } = editConfig; + const triggerEdit = (edit) => { + var _a; + if (edit) { + (_a = editConfig.onStart) == null ? void 0 : _a.call(editConfig); + } + setEditing(edit); + }; + (0, import_useUpdatedEffect.default)(() => { + var _a; + if (!editing) { + (_a = editIconRef.current) == null ? void 0 : _a.focus(); + } + }, [editing]); + const onEditClick = (e) => { + e == null ? void 0 : e.preventDefault(); + triggerEdit(true); + }; + const onEditChange = (value) => { + var _a; + (_a = editConfig.onChange) == null ? void 0 : _a.call(editConfig, value); + triggerEdit(false); + }; + const onEditCancel = () => { + var _a; + (_a = editConfig.onCancel) == null ? void 0 : _a.call(editConfig); + triggerEdit(false); + }; + const [enableCopy, copyConfig] = (0, import_useMergedConfig.default)(copyable); + const [copied, setCopied] = React.useState(false); + const copyIdRef = React.useRef(null); + const copyOptions = {}; + if (copyConfig.format) { + copyOptions.format = copyConfig.format; + } + const cleanCopyId = () => { + if (copyIdRef.current) { + clearTimeout(copyIdRef.current); + } + }; + const onCopyClick = (e) => { + var _a; + e == null ? void 0 : e.preventDefault(); + e == null ? void 0 : e.stopPropagation(); + (0, import_copy_to_clipboard.default)(copyConfig.text || String(children) || "", copyOptions); + setCopied(true); + cleanCopyId(); + copyIdRef.current = setTimeout(() => { + setCopied(false); + }, 3e3); + (_a = copyConfig.onCopy) == null ? void 0 : _a.call(copyConfig, e); + }; + React.useEffect(() => cleanCopyId, []); + const [isLineClampSupport, setIsLineClampSupport] = React.useState(false); + const [isTextOverflowSupport, setIsTextOverflowSupport] = React.useState(false); + const [expanded, setExpanded] = React.useState(false); + const [isJsEllipsis, setIsJsEllipsis] = React.useState(false); + const [isNativeEllipsis, setIsNativeEllipsis] = React.useState(false); + const [isNativeVisible, setIsNativeVisible] = React.useState(true); + const [enableEllipsis, ellipsisConfig] = (0, import_useMergedConfig.default)(ellipsis, { + expandable: false + }); + const mergedEnableEllipsis = enableEllipsis && !expanded; + const { rows = 1 } = ellipsisConfig; + const needMeasureEllipsis = React.useMemo( + () => ( + // Disable ellipsis + !mergedEnableEllipsis || // Provide suffix + ellipsisConfig.suffix !== void 0 || ellipsisConfig.onEllipsis || // Can't use css ellipsis since we need to provide the place for button + ellipsisConfig.expandable || enableEdit || enableCopy + ), + [mergedEnableEllipsis, ellipsisConfig, enableEdit, enableCopy] + ); + (0, import_useLayoutEffect.default)(() => { + if (enableEllipsis && !needMeasureEllipsis) { + setIsLineClampSupport((0, import_styleChecker.isStyleSupport)("webkitLineClamp")); + setIsTextOverflowSupport((0, import_styleChecker.isStyleSupport)("textOverflow")); + } + }, [needMeasureEllipsis, enableEllipsis]); + const cssEllipsis = React.useMemo(() => { + if (needMeasureEllipsis) { + return false; + } + if (rows === 1) { + return isTextOverflowSupport; + } + return isLineClampSupport; + }, [needMeasureEllipsis, isTextOverflowSupport, isLineClampSupport]); + const isMergedEllipsis = mergedEnableEllipsis && (cssEllipsis ? isNativeEllipsis : isJsEllipsis); + const cssTextOverflow = mergedEnableEllipsis && rows === 1 && cssEllipsis; + const cssLineClamp = mergedEnableEllipsis && rows > 1 && cssEllipsis; + const onExpandClick = (e) => { + var _a; + setExpanded(true); + (_a = ellipsisConfig.onExpand) == null ? void 0 : _a.call(ellipsisConfig, e); + }; + const [ellipsisWidth, setEllipsisWidth] = React.useState(0); + const [ellipsisFontSize, setEllipsisFontSize] = React.useState(0); + const onResize = ({ offsetWidth }, element) => { + var _a; + setEllipsisWidth(offsetWidth); + setEllipsisFontSize(parseInt((_a = window.getComputedStyle) == null ? void 0 : _a.call(window, element).fontSize, 10) || 0); + }; + const onJsEllipsis = (jsEllipsis) => { + var _a; + setIsJsEllipsis(jsEllipsis); + if (isJsEllipsis !== jsEllipsis) { + (_a = ellipsisConfig.onEllipsis) == null ? void 0 : _a.call(ellipsisConfig, jsEllipsis); + } + }; + React.useEffect(() => { + const textEle = typographyRef.current; + if (enableEllipsis && cssEllipsis && textEle) { + const currentEllipsis = cssLineClamp ? textEle.offsetHeight < textEle.scrollHeight : textEle.offsetWidth < textEle.scrollWidth; + if (isNativeEllipsis !== currentEllipsis) { + setIsNativeEllipsis(currentEllipsis); + } + } + }, [enableEllipsis, cssEllipsis, children, cssLineClamp, isNativeVisible, ellipsisWidth]); + React.useEffect(() => { + const textEle = typographyRef.current; + if (typeof IntersectionObserver === "undefined" || !textEle || !cssEllipsis || !mergedEnableEllipsis) { + return; + } + const observer = new IntersectionObserver(() => { + setIsNativeVisible(!!textEle.offsetParent); + }); + observer.observe(textEle); + return () => { + observer.disconnect(); + }; + }, [cssEllipsis, mergedEnableEllipsis]); + let tooltipProps = {}; + if (ellipsisConfig.tooltip === true) { + tooltipProps = { title: editConfig.text ?? children }; + } else if (React.isValidElement(ellipsisConfig.tooltip)) { + tooltipProps = { title: ellipsisConfig.tooltip }; + } else if (typeof ellipsisConfig.tooltip === "object") { + tooltipProps = { title: editConfig.text ?? children, ...ellipsisConfig.tooltip }; + } else { + tooltipProps = { title: ellipsisConfig.tooltip }; + } + const topAriaLabel = React.useMemo(() => { + const isValid = (val) => ["string", "number"].includes(typeof val); + if (!enableEllipsis || cssEllipsis) { + return void 0; + } + if (isValid(editConfig.text)) { + return editConfig.text; + } + if (isValid(children)) { + return children; + } + if (isValid(title)) { + return title; + } + if (isValid(tooltipProps.title)) { + return tooltipProps.title; + } + return void 0; + }, [enableEllipsis, cssEllipsis, title, tooltipProps.title, isMergedEllipsis]); + if (editing) { + return /* @__PURE__ */ React.createElement( + import_Editable.default, + { + value: editConfig.text ?? (typeof children === "string" ? children : ""), + onSave: onEditChange, + onCancel: onEditCancel, + onEnd: editConfig.onEnd, + prefixCls, + className, + style, + direction, + component, + maxLength: editConfig.maxLength, + autoSize: editConfig.autoSize, + enterIcon: editConfig.enterIcon + } + ); + } + const renderExpand = () => { + const { expandable, symbol } = ellipsisConfig; + if (!expandable) + return null; + let expandContent; + if (symbol) { + expandContent = symbol; + } else { + expandContent = textLocale == null ? void 0 : textLocale.expand; + } + return /* @__PURE__ */ React.createElement( + "a", + { + key: "expand", + className: `${prefixCls}-expand`, + onClick: onExpandClick, + "aria-label": textLocale == null ? void 0 : textLocale.expand + }, + expandContent + ); + }; + const renderEdit = () => { + if (!enableEdit) + return; + const { icon, tooltip } = editConfig; + const editTitle = (0, import_toArray.default)(tooltip)[0] || (textLocale == null ? void 0 : textLocale.edit); + const ariaLabel = typeof editTitle === "string" ? editTitle : ""; + return triggerType.includes("icon") ? /* @__PURE__ */ React.createElement(import_tooltip.default, { key: "edit", title: tooltip === false ? "" : editTitle }, /* @__PURE__ */ React.createElement( + import_transButton.default, + { + ref: editIconRef, + className: `${prefixCls}-edit`, + onClick: onEditClick, + "aria-label": ariaLabel + }, + icon || /* @__PURE__ */ React.createElement(import_EditOutlined.default, { role: "button" }) + )) : null; + }; + const renderCopy = () => { + if (!enableCopy) { + return null; + } + const { tooltips, icon } = copyConfig; + const tooltipNodes = toList(tooltips); + const iconNodes = toList(icon); + const copyTitle = copied ? getNode(tooltipNodes[1], textLocale == null ? void 0 : textLocale.copied) : getNode(tooltipNodes[0], textLocale == null ? void 0 : textLocale.copy); + const systemStr = copied ? textLocale == null ? void 0 : textLocale.copied : textLocale == null ? void 0 : textLocale.copy; + const ariaLabel = typeof copyTitle === "string" ? copyTitle : systemStr; + return /* @__PURE__ */ React.createElement(import_tooltip.default, { key: "copy", title: copyTitle }, /* @__PURE__ */ React.createElement( + import_transButton.default, + { + className: (0, import_classnames.default)(`${prefixCls}-copy`, { + [`${prefixCls}-copy-success`]: copied, + [`${prefixCls}-copy-icon-only`]: children === null || children === void 0 + }), + onClick: onCopyClick, + "aria-label": ariaLabel + }, + copied ? getNode(iconNodes[1], /* @__PURE__ */ React.createElement(import_CheckOutlined.default, null), true) : getNode(iconNodes[0], /* @__PURE__ */ React.createElement(import_CopyOutlined.default, null), true) + )); + }; + const renderOperations = (renderExpanded) => [ + renderExpanded && renderExpand(), + renderEdit(), + renderCopy() + ]; + const renderEllipsis = (needEllipsis) => [ + needEllipsis && /* @__PURE__ */ React.createElement("span", { "aria-hidden": true, key: "ellipsis" }, ELLIPSIS_STR), + ellipsisConfig.suffix, + renderOperations(needEllipsis) + ]; + return /* @__PURE__ */ React.createElement(import_rc_resize_observer.default, { onResize, disabled: !mergedEnableEllipsis }, (resizeRef) => /* @__PURE__ */ React.createElement( + import_EllipsisTooltip.default, + { + tooltipProps, + enabledEllipsis: mergedEnableEllipsis, + isEllipsis: isMergedEllipsis + }, + /* @__PURE__ */ React.createElement( + import_Typography.default, + { + className: (0, import_classnames.default)( + { + [`${prefixCls}-${type}`]: type, + [`${prefixCls}-disabled`]: disabled, + [`${prefixCls}-ellipsis`]: enableEllipsis, + [`${prefixCls}-single-line`]: mergedEnableEllipsis && rows === 1, + [`${prefixCls}-ellipsis-single-line`]: cssTextOverflow, + [`${prefixCls}-ellipsis-multiple-line`]: cssLineClamp + }, + className + ), + prefixCls: customizePrefixCls, + style: { + ...style, + WebkitLineClamp: cssLineClamp ? rows : void 0 + }, + component, + ref: (0, import_ref.composeRef)(resizeRef, typographyRef, ref), + direction, + onClick: triggerType.includes("text") ? onEditClick : void 0, + "aria-label": topAriaLabel == null ? void 0 : topAriaLabel.toString(), + title, + ...textProps + }, + /* @__PURE__ */ React.createElement( + import_Ellipsis.default, + { + enabledMeasure: mergedEnableEllipsis && !cssEllipsis, + text: children, + rows, + width: ellipsisWidth, + fontSize: ellipsisFontSize, + onEllipsis: onJsEllipsis + }, + (node, needEllipsis) => { + let renderNode = node; + if (node.length && needEllipsis && topAriaLabel) { + renderNode = /* @__PURE__ */ React.createElement("span", { key: "show-content", "aria-hidden": true }, renderNode); + } + const wrappedContext = wrapperDecorations( + props, + /* @__PURE__ */ React.createElement(React.Fragment, null, renderNode, renderEllipsis(needEllipsis)) + ); + return wrappedContext; + } + ) + ) + )); +}); +var Base_default = Base; diff --git a/packages/meta/lib/typography/Editable.d.ts b/packages/meta/lib/typography/Editable.d.ts new file mode 100644 index 0000000..7508ed9 --- /dev/null +++ b/packages/meta/lib/typography/Editable.d.ts @@ -0,0 +1,20 @@ +import type { AutoSizeType } from 'rc-textarea'; +import * as React from 'react'; +import type { DirectionType } from '../config-provider'; +interface EditableProps { + prefixCls: string; + value: string; + ['aria-label']?: string; + onSave: (value: string) => void; + onCancel: () => void; + onEnd?: () => void; + className?: string; + style?: React.CSSProperties; + direction?: DirectionType; + maxLength?: number; + autoSize?: boolean | AutoSizeType; + enterIcon?: React.ReactNode; + component?: string; +} +declare const Editable: React.FC; +export default Editable; diff --git a/packages/meta/lib/typography/Editable.js b/packages/meta/lib/typography/Editable.js new file mode 100644 index 0000000..2eca3d7 --- /dev/null +++ b/packages/meta/lib/typography/Editable.js @@ -0,0 +1,142 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Editable.tsx +var Editable_exports = {}; +__export(Editable_exports, { + default: () => Editable_default +}); +module.exports = __toCommonJS(Editable_exports); +var import_EnterOutlined = __toESM(require("@ant-design/icons/EnterOutlined")); +var import_classnames = __toESM(require("classnames")); +var import_KeyCode = __toESM(require("rc-util/lib/KeyCode")); +var React = __toESM(require("react")); +var import_reactNode = require("../_util/reactNode"); +var import_TextArea = __toESM(require("../input/TextArea")); +var import_style = __toESM(require("./style")); +var Editable = (props) => { + const { + prefixCls, + "aria-label": ariaLabel, + className, + style, + direction, + maxLength, + autoSize = true, + value, + onSave, + onCancel, + onEnd, + component, + enterIcon = /* @__PURE__ */ React.createElement(import_EnterOutlined.default, null) + } = props; + const ref = React.useRef(null); + const inComposition = React.useRef(false); + const lastKeyCode = React.useRef(); + const [current, setCurrent] = React.useState(value); + React.useEffect(() => { + setCurrent(value); + }, [value]); + React.useEffect(() => { + if (ref.current && ref.current.resizableTextArea) { + const { textArea } = ref.current.resizableTextArea; + textArea.focus(); + const { length } = textArea.value; + textArea.setSelectionRange(length, length); + } + }, []); + const onChange = ({ target }) => { + setCurrent(target.value.replace(/[\n\r]/g, "")); + }; + const onCompositionStart = () => { + inComposition.current = true; + }; + const onCompositionEnd = () => { + inComposition.current = false; + }; + const onKeyDown = ({ keyCode }) => { + if (inComposition.current) + return; + lastKeyCode.current = keyCode; + }; + const confirmChange = () => { + onSave(current.trim()); + }; + const onKeyUp = ({ + keyCode, + ctrlKey, + altKey, + metaKey, + shiftKey + }) => { + if (lastKeyCode.current === keyCode && !inComposition.current && !ctrlKey && !altKey && !metaKey && !shiftKey) { + if (keyCode === import_KeyCode.default.ENTER) { + confirmChange(); + onEnd == null ? void 0 : onEnd(); + } else if (keyCode === import_KeyCode.default.ESC) { + onCancel(); + } + } + }; + const onBlur = () => { + confirmChange(); + }; + const textClassName = component ? `${prefixCls}-${component}` : ""; + const [wrapCSSVar, hashId, cssVarCls] = (0, import_style.default)(prefixCls); + const textAreaClassName = (0, import_classnames.default)( + prefixCls, + `${prefixCls}-edit-content`, + { + [`${prefixCls}-rtl`]: direction === "rtl" + }, + className, + textClassName, + hashId, + cssVarCls + ); + return wrapCSSVar( + /* @__PURE__ */ React.createElement("div", { className: textAreaClassName, style }, /* @__PURE__ */ React.createElement( + import_TextArea.default, + { + ref, + maxLength, + value: current, + onChange, + onKeyDown, + onKeyUp, + onCompositionStart, + onCompositionEnd, + onBlur, + "aria-label": ariaLabel, + rows: 1, + autoSize + } + ), enterIcon !== null ? (0, import_reactNode.cloneElement)(enterIcon, { className: `${prefixCls}-edit-content-confirm` }) : null) + ); +}; +var Editable_default = Editable; diff --git a/packages/meta/lib/typography/Link.d.ts b/packages/meta/lib/typography/Link.d.ts new file mode 100644 index 0000000..a2c2a06 --- /dev/null +++ b/packages/meta/lib/typography/Link.d.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; +import type { BlockProps } from './Base'; +export interface LinkProps extends BlockProps<'a'>, Omit, 'type' | keyof BlockProps<'a'>> { + ellipsis?: boolean; +} +declare const Link: React.ForwardRefExoticComponent>; +export default Link; diff --git a/packages/meta/lib/typography/Link.js b/packages/meta/lib/typography/Link.js new file mode 100644 index 0000000..d51381d --- /dev/null +++ b/packages/meta/lib/typography/Link.js @@ -0,0 +1,50 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Link.tsx +var Link_exports = {}; +__export(Link_exports, { + default: () => Link_default +}); +module.exports = __toCommonJS(Link_exports); +var React = __toESM(require("react")); +var import_warning = require("../_util/warning"); +var import_Base = __toESM(require("./Base")); +var Link = React.forwardRef(({ ellipsis, rel, ...restProps }, ref) => { + if (process.env.NODE_ENV !== "production") { + const warning = (0, import_warning.devUseWarning)("Typography.Link"); + warning(typeof ellipsis !== "object", "usage", "`ellipsis` only supports boolean value."); + } + const mergedProps = { + ...restProps, + rel: rel === void 0 && restProps.target === "_blank" ? "noopener noreferrer" : rel + }; + delete mergedProps.navigate; + return /* @__PURE__ */ React.createElement(import_Base.default, { ...mergedProps, ref, ellipsis: !!ellipsis, component: "a" }); +}); +var Link_default = Link; diff --git a/packages/meta/lib/typography/Paragraph.d.ts b/packages/meta/lib/typography/Paragraph.d.ts new file mode 100644 index 0000000..d1d3168 --- /dev/null +++ b/packages/meta/lib/typography/Paragraph.d.ts @@ -0,0 +1,6 @@ +import * as React from 'react'; +import type { BlockProps } from './Base'; +export interface ParagraphProps extends BlockProps<'div'>, Omit, 'type' | keyof BlockProps<'div'>> { +} +declare const Paragraph: React.ForwardRefExoticComponent>; +export default Paragraph; diff --git a/packages/meta/lib/typography/Paragraph.js b/packages/meta/lib/typography/Paragraph.js new file mode 100644 index 0000000..4a71c44 --- /dev/null +++ b/packages/meta/lib/typography/Paragraph.js @@ -0,0 +1,38 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Paragraph.tsx +var Paragraph_exports = {}; +__export(Paragraph_exports, { + default: () => Paragraph_default +}); +module.exports = __toCommonJS(Paragraph_exports); +var React = __toESM(require("react")); +var import_Base = __toESM(require("./Base")); +var Paragraph = React.forwardRef((props, ref) => /* @__PURE__ */ React.createElement(import_Base.default, { ref, ...props, component: "div" })); +var Paragraph_default = Paragraph; diff --git a/packages/meta/lib/typography/Text.d.ts b/packages/meta/lib/typography/Text.d.ts new file mode 100644 index 0000000..6bd3ea1 --- /dev/null +++ b/packages/meta/lib/typography/Text.d.ts @@ -0,0 +1,7 @@ +import * as React from 'react'; +import type { BlockProps, EllipsisConfig } from './Base'; +export interface TextProps extends BlockProps<'span'>, Omit, 'type' | keyof BlockProps<'span'>> { + ellipsis?: boolean | Omit; +} +declare const _default: React.ForwardRefExoticComponent>; +export default _default; diff --git a/packages/meta/lib/typography/Text.js b/packages/meta/lib/typography/Text.js new file mode 100644 index 0000000..cba9c2f --- /dev/null +++ b/packages/meta/lib/typography/Text.js @@ -0,0 +1,56 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Text.tsx +var Text_exports = {}; +__export(Text_exports, { + default: () => Text_default +}); +module.exports = __toCommonJS(Text_exports); +var React = __toESM(require("react")); +var import_omit = __toESM(require("rc-util/lib/omit")); +var import_warning = require("../_util/warning"); +var import_Base = __toESM(require("./Base")); +var Text = ({ ellipsis, ...restProps }, ref) => { + const mergedEllipsis = React.useMemo(() => { + if (ellipsis && typeof ellipsis === "object") { + return (0, import_omit.default)(ellipsis, ["expandable", "rows"]); + } + return ellipsis; + }, [ellipsis]); + if (process.env.NODE_ENV !== "production") { + const warning = (0, import_warning.devUseWarning)("Typography.Text"); + warning( + typeof ellipsis !== "object" || !ellipsis || !("expandable" in ellipsis) && !("rows" in ellipsis), + "usage", + "`ellipsis` do not support `expandable` or `rows` props." + ); + } + return /* @__PURE__ */ React.createElement(import_Base.default, { ref, ...restProps, ellipsis: mergedEllipsis, component: "span" }); +}; +var Text_default = React.forwardRef(Text); diff --git a/packages/meta/lib/typography/Title.d.ts b/packages/meta/lib/typography/Title.d.ts new file mode 100644 index 0000000..4b01fde --- /dev/null +++ b/packages/meta/lib/typography/Title.d.ts @@ -0,0 +1,8 @@ +import * as React from 'react'; +import type { BlockProps } from './Base'; +declare const TITLE_ELE_LIST: readonly [1, 2, 3, 4, 5]; +export interface TitleProps extends Omit, 'strong'>, Omit, 'type' | keyof BlockProps<'h1' | 'h2' | 'h3' | 'h4' | 'h5'>> { + level?: typeof TITLE_ELE_LIST[number]; +} +declare const Title: React.ForwardRefExoticComponent>; +export default Title; diff --git a/packages/meta/lib/typography/Title.js b/packages/meta/lib/typography/Title.js new file mode 100644 index 0000000..1d01319 --- /dev/null +++ b/packages/meta/lib/typography/Title.js @@ -0,0 +1,57 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Title.tsx +var Title_exports = {}; +__export(Title_exports, { + default: () => Title_default +}); +module.exports = __toCommonJS(Title_exports); +var React = __toESM(require("react")); +var import_warning = require("../_util/warning"); +var import_Base = __toESM(require("./Base")); +var TITLE_ELE_LIST = [1, 2, 3, 4, 5]; +var Title = React.forwardRef((props, ref) => { + const { level = 1, ...restProps } = props; + let component; + if (process.env.NODE_ENV !== "production") { + const warning = (0, import_warning.devUseWarning)("Typography.Title"); + warning( + TITLE_ELE_LIST.includes(level), + "usage", + "Title only accept `1 | 2 | 3 | 4 | 5` as `level` value. And `5` need 4.6.0+ version." + ); + } + if (TITLE_ELE_LIST.includes(level)) { + component = `h${level}`; + } else { + component = "h1"; + } + return /* @__PURE__ */ React.createElement(import_Base.default, { ref, ...restProps, component }); +}); +var Title_default = Title; diff --git a/packages/meta/lib/typography/Typography.d.ts b/packages/meta/lib/typography/Typography.d.ts new file mode 100644 index 0000000..c75aa48 --- /dev/null +++ b/packages/meta/lib/typography/Typography.d.ts @@ -0,0 +1,18 @@ +import * as React from 'react'; +import type { DirectionType } from '../config-provider'; +export interface TypographyProps extends React.HTMLAttributes { + id?: string; + prefixCls?: string; + className?: string; + rootClassName?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + ['aria-label']?: string; + direction?: DirectionType; +} +interface InternalTypographyProps extends TypographyProps { + /** @deprecated Use `ref` directly if using React 16 */ + setContentRef?: (node: HTMLElement) => void; +} +declare const Typography: React.ForwardRefExoticComponent & React.RefAttributes>; +export default Typography; diff --git a/packages/meta/lib/typography/Typography.js b/packages/meta/lib/typography/Typography.js new file mode 100644 index 0000000..70eb68e --- /dev/null +++ b/packages/meta/lib/typography/Typography.js @@ -0,0 +1,89 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/Typography.tsx +var Typography_exports = {}; +__export(Typography_exports, { + default: () => Typography_default +}); +module.exports = __toCommonJS(Typography_exports); +var React = __toESM(require("react")); +var import_classnames = __toESM(require("classnames")); +var import_ref = require("rc-util/lib/ref"); +var import_warning = require("../_util/warning"); +var import_config_provider = require("../config-provider"); +var import_style = __toESM(require("./style")); +var Typography = React.forwardRef((props, ref) => { + const { + prefixCls: customizePrefixCls, + component: Component = "article", + className, + rootClassName, + setContentRef, + children, + direction: typographyDirection, + style, + ...restProps + } = props; + const { + getPrefixCls, + direction: contextDirection, + typography + } = React.useContext(import_config_provider.ConfigContext); + const direction = typographyDirection ?? contextDirection; + let mergedRef = ref; + if (setContentRef) { + mergedRef = (0, import_ref.composeRef)(ref, setContentRef); + } + if (process.env.NODE_ENV !== "production") { + const warning = (0, import_warning.devUseWarning)("Typography"); + warning.deprecated(!setContentRef, "setContentRef", "ref"); + } + const prefixCls = getPrefixCls("typography", customizePrefixCls); + const [wrapCSSVar, hashId, cssVarCls] = (0, import_style.default)(prefixCls); + const componentClassName = (0, import_classnames.default)( + prefixCls, + typography == null ? void 0 : typography.className, + { + [`${prefixCls}-rtl`]: direction === "rtl" + }, + className, + rootClassName, + hashId, + cssVarCls + ); + const mergedStyle = { ...typography == null ? void 0 : typography.style, ...style }; + return wrapCSSVar( + // @ts-expect-error: Expression produces a union type that is too complex to represent. + /* @__PURE__ */ React.createElement(Component, { className: componentClassName, style: mergedStyle, ref: mergedRef, ...restProps }, children) + ); +}); +if (process.env.NODE_ENV !== "production") { + Typography.displayName = "Typography"; +} +var Typography_default = Typography; diff --git a/packages/meta/lib/typography/hooks/useMergedConfig.d.ts b/packages/meta/lib/typography/hooks/useMergedConfig.d.ts new file mode 100644 index 0000000..dda4bc3 --- /dev/null +++ b/packages/meta/lib/typography/hooks/useMergedConfig.d.ts @@ -0,0 +1 @@ +export default function useMergedConfig(propConfig: any, templateConfig?: Target): readonly [boolean, Target]; diff --git a/packages/meta/lib/typography/hooks/useMergedConfig.js b/packages/meta/lib/typography/hooks/useMergedConfig.js new file mode 100644 index 0000000..c59f004 --- /dev/null +++ b/packages/meta/lib/typography/hooks/useMergedConfig.js @@ -0,0 +1,47 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/hooks/useMergedConfig.ts +var useMergedConfig_exports = {}; +__export(useMergedConfig_exports, { + default: () => useMergedConfig +}); +module.exports = __toCommonJS(useMergedConfig_exports); +var React = __toESM(require("react")); +function useMergedConfig(propConfig, templateConfig) { + return React.useMemo(() => { + const support = !!propConfig; + return [ + support, + { + ...templateConfig, + ...support && typeof propConfig === "object" ? propConfig : null + } + ]; + }, [propConfig]); +} diff --git a/packages/meta/lib/typography/hooks/useUpdatedEffect.d.ts b/packages/meta/lib/typography/hooks/useUpdatedEffect.d.ts new file mode 100644 index 0000000..5db26a3 --- /dev/null +++ b/packages/meta/lib/typography/hooks/useUpdatedEffect.d.ts @@ -0,0 +1,4 @@ +import * as React from 'react'; +/** Similar with `useEffect` but only trigger after mounted */ +declare const useUpdatedEffect: (callback: () => void, conditions?: React.DependencyList) => void; +export default useUpdatedEffect; diff --git a/packages/biz/lib/useSocket/onceChannel.js b/packages/meta/lib/typography/hooks/useUpdatedEffect.js similarity index 67% rename from packages/biz/lib/useSocket/onceChannel.js rename to packages/meta/lib/typography/hooks/useUpdatedEffect.js index 2dc648e..70344b9 100644 --- a/packages/biz/lib/useSocket/onceChannel.js +++ b/packages/meta/lib/typography/hooks/useUpdatedEffect.js @@ -26,26 +26,21 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -// src/useSocket/onceChannel.tsx -var onceChannel_exports = {}; -__export(onceChannel_exports, { - default: () => onceChannel_default +// src/typography/hooks/useUpdatedEffect.ts +var useUpdatedEffect_exports = {}; +__export(useUpdatedEffect_exports, { + default: () => useUpdatedEffect_default }); -module.exports = __toCommonJS(onceChannel_exports); -var import_ws = __toESM(require("./ws")); -var startChannel = (topic, req, callback) => { - let reqstring = JSON.stringify({ - ...req, - extraHeaders: { - authorization: localStorage.getItem("USER-TOKEN") +module.exports = __toCommonJS(useUpdatedEffect_exports); +var React = __toESM(require("react")); +var useUpdatedEffect = (callback, conditions) => { + const mountRef = React.useRef(false); + React.useEffect(() => { + if (mountRef.current) { + callback(); + } else { + mountRef.current = true; } - }); - let unSubscribe = import_ws.default.subscribe(topic, reqstring, (socketData) => { - let shouldStop = callback(socketData); - if (shouldStop) { - unSubscribe == null ? void 0 : unSubscribe(); - } - }); - return unSubscribe; + }, conditions); }; -var onceChannel_default = startChannel; +var useUpdatedEffect_default = useUpdatedEffect; diff --git a/packages/meta/lib/typography/index.d.ts b/packages/meta/lib/typography/index.d.ts new file mode 100644 index 0000000..a526689 --- /dev/null +++ b/packages/meta/lib/typography/index.d.ts @@ -0,0 +1,13 @@ +import Link from './Link'; +import Paragraph from './Paragraph'; +import Text from './Text'; +import Title from './Title'; +import OriginTypography from './Typography'; +export type TypographyProps = typeof OriginTypography & { + Text: typeof Text; + Link: typeof Link; + Title: typeof Title; + Paragraph: typeof Paragraph; +}; +declare const Typography: TypographyProps; +export default Typography; diff --git a/packages/meta/lib/typography/index.js b/packages/meta/lib/typography/index.js new file mode 100644 index 0000000..f255ee6 --- /dev/null +++ b/packages/meta/lib/typography/index.js @@ -0,0 +1,45 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/index.ts +var typography_exports = {}; +__export(typography_exports, { + default: () => typography_default +}); +module.exports = __toCommonJS(typography_exports); +var import_Link = __toESM(require("./Link")); +var import_Paragraph = __toESM(require("./Paragraph")); +var import_Text = __toESM(require("./Text")); +var import_Title = __toESM(require("./Title")); +var import_Typography = __toESM(require("./Typography")); +var Typography = import_Typography.default; +Typography.Text = import_Text.default; +Typography.Link = import_Link.default; +Typography.Title = import_Title.default; +Typography.Paragraph = import_Paragraph.default; +var typography_default = Typography; diff --git a/packages/meta/lib/typography/style/index.d.ts b/packages/meta/lib/typography/style/index.d.ts new file mode 100644 index 0000000..247d08d --- /dev/null +++ b/packages/meta/lib/typography/style/index.d.ts @@ -0,0 +1,19 @@ +/// +import type { FullToken, GetDefaultToken } from '../../theme/internal'; +/** Component only token. Which will handle additional calculation of alias token */ +export interface ComponentToken { + /** + * @desc 标题上间距 + * @descEN Margin top of title + */ + titleMarginTop: number | string; + /** + * @desc 标题下间距 + * @descEN Margin bottom of title + */ + titleMarginBottom: number | string; +} +export type TypographyToken = FullToken<'Typography'>; +export declare const prepareComponentToken: GetDefaultToken<'Typography'>; +declare const _default: (prefixCls: string, rootCls?: string) => readonly [(node: import("react").ReactElement>) => import("react").ReactElement>, string, string | undefined]; +export default _default; diff --git a/packages/meta/lib/typography/style/index.js b/packages/meta/lib/typography/style/index.js new file mode 100644 index 0000000..c1f6684 --- /dev/null +++ b/packages/meta/lib/typography/style/index.js @@ -0,0 +1,127 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/style/index.ts +var style_exports = {}; +__export(style_exports, { + default: () => style_default, + prepareComponentToken: () => prepareComponentToken +}); +module.exports = __toCommonJS(style_exports); +var import_style = require("../../style"); +var import_internal = require("../../theme/internal"); +var import_mixins = require("./mixins"); +var genTypographyStyle = (token) => { + const { componentCls, titleMarginTop } = token; + return { + [componentCls]: { + color: token.colorText, + wordBreak: "break-word", + lineHeight: token.lineHeight, + [`&${componentCls}-secondary`]: { + color: token.colorTextDescription + }, + [`&${componentCls}-success`]: { + color: token.colorSuccess + }, + [`&${componentCls}-warning`]: { + color: token.colorWarning + }, + [`&${componentCls}-danger`]: { + color: token.colorError, + "a&:active, a&:focus": { + color: token.colorErrorActive + }, + "a&:hover": { + color: token.colorErrorHover + } + }, + [`&${componentCls}-disabled`]: { + color: token.colorTextDisabled, + cursor: "not-allowed", + userSelect: "none" + }, + [` + div&, + p + `]: { + marginBottom: "1em" + }, + ...(0, import_mixins.getTitleStyles)(token), + [` + & + h1${componentCls}, + & + h2${componentCls}, + & + h3${componentCls}, + & + h4${componentCls}, + & + h5${componentCls} + `]: { + marginTop: titleMarginTop + }, + [` + div, + ul, + li, + p, + h1, + h2, + h3, + h4, + h5`]: { + [` + + h1, + + h2, + + h3, + + h4, + + h5 + `]: { + marginTop: titleMarginTop + } + }, + ...(0, import_mixins.getResetStyles)(token), + ...(0, import_mixins.getLinkStyles)(token), + // Operation + [` + ${componentCls}-expand, + ${componentCls}-edit, + ${componentCls}-copy + `]: { + ...(0, import_style.operationUnit)(token), + marginInlineStart: token.marginXXS + }, + ...(0, import_mixins.getEditableStyles)(token), + ...(0, import_mixins.getCopyableStyles)(token), + ...(0, import_mixins.getEllipsisStyles)(), + "&-rtl": { + direction: "rtl" + } + } + }; +}; +var prepareComponentToken = () => ({ + titleMarginTop: "1.2em", + titleMarginBottom: "0.5em" +}); +var style_default = (0, import_internal.genStyleHooks)( + "Typography", + (token) => [genTypographyStyle(token)], + prepareComponentToken +); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + prepareComponentToken +}); diff --git a/packages/meta/lib/typography/style/mixins.d.ts b/packages/meta/lib/typography/style/mixins.d.ts new file mode 100644 index 0000000..3e8df66 --- /dev/null +++ b/packages/meta/lib/typography/style/mixins.d.ts @@ -0,0 +1,9 @@ +import { type CSSObject } from '@ant-design/cssinjs'; +import type { TypographyToken } from '.'; +import type { GenerateStyle } from '../../theme/internal'; +export declare const getTitleStyles: GenerateStyle; +export declare const getLinkStyles: GenerateStyle; +export declare const getResetStyles: GenerateStyle; +export declare const getEditableStyles: GenerateStyle; +export declare const getCopyableStyles: GenerateStyle; +export declare const getEllipsisStyles: () => CSSObject; diff --git a/packages/meta/lib/typography/style/mixins.js b/packages/meta/lib/typography/style/mixins.js new file mode 100644 index 0000000..4788eeb --- /dev/null +++ b/packages/meta/lib/typography/style/mixins.js @@ -0,0 +1,259 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/typography/style/mixins.ts +var mixins_exports = {}; +__export(mixins_exports, { + getCopyableStyles: () => getCopyableStyles, + getEditableStyles: () => getEditableStyles, + getEllipsisStyles: () => getEllipsisStyles, + getLinkStyles: () => getLinkStyles, + getResetStyles: () => getResetStyles, + getTitleStyles: () => getTitleStyles +}); +module.exports = __toCommonJS(mixins_exports); +var import_colors = require("@ant-design/colors"); +var import_cssinjs = require("@ant-design/cssinjs"); +var import_style = require("../../style"); +var getTitleStyle = (fontSize, lineHeight, color, token) => { + const { titleMarginBottom, fontWeightStrong } = token; + return { + marginBottom: titleMarginBottom, + color, + fontWeight: fontWeightStrong, + fontSize, + lineHeight + }; +}; +var getTitleStyles = (token) => { + const headings = [1, 2, 3, 4, 5]; + const styles = {}; + headings.forEach((headingLevel) => { + styles[` + h${headingLevel}&, + div&-h${headingLevel}, + div&-h${headingLevel} > textarea, + h${headingLevel} + `] = getTitleStyle( + token[`fontSizeHeading${headingLevel}`], + token[`lineHeightHeading${headingLevel}`], + token.colorTextHeading, + token + ); + }); + return styles; +}; +var getLinkStyles = (token) => { + const { componentCls } = token; + return { + "a&, a": { + ...(0, import_style.operationUnit)(token), + textDecoration: token.linkDecoration, + "&:active, &:hover": { + textDecoration: token.linkHoverDecoration + }, + [`&[disabled], &${componentCls}-disabled`]: { + color: token.colorTextDisabled, + cursor: "not-allowed", + "&:active, &:hover": { + color: token.colorTextDisabled + }, + "&:active": { + pointerEvents: "none" + } + } + } + }; +}; +var getResetStyles = (token) => ({ + code: { + margin: "0 0.2em", + paddingInline: "0.4em", + paddingBlock: "0.2em 0.1em", + fontSize: "85%", + fontFamily: token.fontFamilyCode, + background: "rgba(150, 150, 150, 0.1)", + border: "1px solid rgba(100, 100, 100, 0.2)", + borderRadius: 3 + }, + kbd: { + margin: "0 0.2em", + paddingInline: "0.4em", + paddingBlock: "0.15em 0.1em", + fontSize: "90%", + fontFamily: token.fontFamilyCode, + background: "rgba(150, 150, 150, 0.06)", + border: "1px solid rgba(100, 100, 100, 0.2)", + borderBottomWidth: 2, + borderRadius: 3 + }, + mark: { + padding: 0, + // FIXME hardcode in v4 + backgroundColor: import_colors.gold[2] + }, + "u, ins": { + textDecoration: "underline", + textDecorationSkipInk: "auto" + }, + "s, del": { + textDecoration: "line-through" + }, + strong: { + fontWeight: 600 + }, + // list + "ul, ol": { + marginInline: 0, + marginBlock: "0 1em", + padding: 0, + li: { + marginInline: "20px 0", + marginBlock: 0, + paddingInline: "4px 0", + paddingBlock: 0 + } + }, + ul: { + listStyleType: "circle", + ul: { + listStyleType: "disc" + } + }, + ol: { + listStyleType: "decimal" + }, + // pre & block + "pre, blockquote": { + margin: "1em 0" + }, + pre: { + padding: "0.4em 0.6em", + whiteSpace: "pre-wrap", + wordWrap: "break-word", + background: "rgba(150, 150, 150, 0.1)", + border: "1px solid rgba(100, 100, 100, 0.2)", + borderRadius: 3, + fontFamily: token.fontFamilyCode, + // Compatible for marked + code: { + display: "inline", + margin: 0, + padding: 0, + fontSize: "inherit", + fontFamily: "inherit", + background: "transparent", + border: 0 + } + }, + blockquote: { + paddingInline: "0.6em 0", + paddingBlock: 0, + borderInlineStart: "4px solid rgba(100, 100, 100, 0.2)", + opacity: 0.85 + } +}); +var getEditableStyles = (token) => { + const { componentCls, paddingSM } = token; + const inputShift = paddingSM; + return { + "&-edit-content": { + position: "relative", + "div&": { + insetInlineStart: token.calc(token.paddingSM).mul(-1).equal(), + marginTop: token.calc(inputShift).mul(-1).equal(), + marginBottom: `calc(1em - ${(0, import_cssinjs.unit)(inputShift)})` + }, + [`${componentCls}-edit-content-confirm`]: { + position: "absolute", + insetInlineEnd: token.calc(token.marginXS).add(2).equal(), + insetBlockEnd: token.marginXS, + color: token.colorTextDescription, + // default style + fontWeight: "normal", + fontSize: token.fontSize, + fontStyle: "normal", + pointerEvents: "none" + }, + textarea: { + margin: "0!important", + // Fix Editable Textarea flash in Firefox + MozTransition: "none", + height: "1em" + } + } + }; +}; +var getCopyableStyles = (token) => ({ + [`${token.componentCls}-copy-success`]: { + [` + &, + &:hover, + &:focus`]: { + color: token.colorSuccess + } + }, + [`${token.componentCls}-copy-icon-only`]: { + marginInlineStart: 0 + } +}); +var getEllipsisStyles = () => ({ + [` + a&-ellipsis, + span&-ellipsis + `]: { + display: "inline-block", + maxWidth: "100%" + }, + "&-single-line": { + whiteSpace: "nowrap" + }, + "&-ellipsis-single-line": { + overflow: "hidden", + textOverflow: "ellipsis", + // https://blog.csdn.net/iefreer/article/details/50421025 + "a&, span&": { + verticalAlign: "bottom" + }, + "> code": { + paddingBlock: 0, + maxWidth: "calc(100% - 1.2em)", + display: "inline-block", + overflow: "hidden", + textOverflow: "ellipsis", + verticalAlign: "bottom", + // https://github.com/ant-design/ant-design/issues/45953 + boxSizing: "content-box" + } + }, + "&-ellipsis-multiple-line": { + display: "-webkit-box", + overflow: "hidden", + WebkitLineClamp: 3, + WebkitBoxOrient: "vertical" + } +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getCopyableStyles, + getEditableStyles, + getEllipsisStyles, + getLinkStyles, + getResetStyles, + getTitleStyles +}); diff --git a/packages/meta/lib/upload/Dragger.d.ts b/packages/meta/lib/upload/Dragger.d.ts new file mode 100644 index 0000000..9d099e1 --- /dev/null +++ b/packages/meta/lib/upload/Dragger.d.ts @@ -0,0 +1,10 @@ +import * as React from 'react'; +import type { UploadRef } from './Upload'; +import type { UploadProps } from './interface'; +export type DraggerProps = UploadProps & { + height?: number; +}; +declare const Dragger: React.ForwardRefExoticComponent & { + height?: number | undefined; +} & React.RefAttributes>>; +export default Dragger; diff --git a/packages/meta/lib/upload/Dragger.js b/packages/meta/lib/upload/Dragger.js new file mode 100644 index 0000000..62cd981 --- /dev/null +++ b/packages/meta/lib/upload/Dragger.js @@ -0,0 +1,52 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/Dragger.tsx +var Dragger_exports = {}; +__export(Dragger_exports, { + default: () => Dragger_default +}); +module.exports = __toCommonJS(Dragger_exports); +var React = __toESM(require("react")); +var import_Upload = __toESM(require("./Upload")); +var Dragger = React.forwardRef( + ({ style, height, hasControlInside = false, ...restProps }, ref) => /* @__PURE__ */ React.createElement( + import_Upload.default, + { + ref, + hasControlInside, + ...restProps, + type: "drag", + style: { ...style, height } + } + ) +); +if (process.env.NODE_ENV !== "production") { + Dragger.displayName = "Dragger"; +} +var Dragger_default = Dragger; diff --git a/packages/meta/lib/upload/Upload.d.ts b/packages/meta/lib/upload/Upload.d.ts new file mode 100644 index 0000000..1b6eefa --- /dev/null +++ b/packages/meta/lib/upload/Upload.d.ts @@ -0,0 +1,18 @@ +import * as React from 'react'; +import type { UploadProps as RcUploadProps } from 'rc-upload'; +import RcUpload from 'rc-upload'; +import type { RcFile, UploadFile, UploadProps } from './interface'; +export declare const LIST_IGNORE: string; +export type { UploadProps }; +export interface UploadRef { + onBatchStart: RcUploadProps['onBatchStart']; + onSuccess: (response: any, file: RcFile, xhr: any) => void; + onProgress: (e: { + percent: number; + }, file: RcFile) => void; + onError: (error: Error, response: any, file: RcFile) => void; + fileList: UploadFile[]; + upload: RcUpload | null; +} +declare const Upload: React.ForwardRefExoticComponent & React.RefAttributes>>; +export default Upload; diff --git a/packages/meta/lib/upload/Upload.js b/packages/meta/lib/upload/Upload.js new file mode 100644 index 0000000..2acf89e --- /dev/null +++ b/packages/meta/lib/upload/Upload.js @@ -0,0 +1,393 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/Upload.tsx +var Upload_exports = {}; +__export(Upload_exports, { + LIST_IGNORE: () => LIST_IGNORE, + default: () => Upload_default +}); +module.exports = __toCommonJS(Upload_exports); +var React = __toESM(require("react")); +var import_react_dom = require("react-dom"); +var import_classnames = __toESM(require("classnames")); +var import_rc_upload = __toESM(require("rc-upload")); +var import_useMergedState = __toESM(require("rc-util/lib/hooks/useMergedState")); +var import_warning = require("../_util/warning"); +var import_config_provider = require("../config-provider"); +var import_DisabledContext = __toESM(require("../config-provider/DisabledContext")); +var import_locale = require("../locale"); +var import_en_US = __toESM(require("../locale/en_US")); +var import_style = __toESM(require("./style")); +var import_UploadList = __toESM(require("./UploadList")); +var import_utils = require("./utils"); +var LIST_IGNORE = `__LIST_IGNORE_${Date.now()}__`; +var InternalUpload = (props, ref) => { + const { + fileList, + defaultFileList, + onRemove, + showUploadList = true, + listType = "text", + onPreview, + onDownload, + onChange, + onDrop, + previewFile, + disabled: customDisabled, + locale: propLocale, + iconRender, + isImageUrl, + progress, + prefixCls: customizePrefixCls, + className, + type = "select", + children, + style, + itemRender, + maxCount, + data = {}, + multiple = false, + hasControlInside = true, + action = "", + accept = "", + supportServerRender = true, + rootClassName + } = props; + const disabled = React.useContext(import_DisabledContext.default); + const mergedDisabled = customDisabled ?? disabled; + const [mergedFileList, setMergedFileList] = (0, import_useMergedState.default)(defaultFileList || [], { + value: fileList, + postState: (list) => list ?? [] + }); + const [dragState, setDragState] = React.useState("drop"); + const upload = React.useRef(null); + if (process.env.NODE_ENV !== "production") { + const warning = (0, import_warning.devUseWarning)("Upload"); + warning( + "fileList" in props || !("value" in props), + "usage", + "`value` is not a valid prop, do you mean `fileList`?" + ); + warning.deprecated(!("transformFile" in props), "transformFile", "beforeUpload"); + } + React.useMemo(() => { + const timestamp = Date.now(); + (fileList || []).forEach((file, index) => { + if (!file.uid && !Object.isFrozen(file)) { + file.uid = `__AUTO__${timestamp}_${index}__`; + } + }); + }, [fileList]); + const onInternalChange = (file, changedFileList, event) => { + let cloneList = [...changedFileList]; + let exceedMaxCount = false; + if (maxCount === 1) { + cloneList = cloneList.slice(-1); + } else if (maxCount) { + exceedMaxCount = cloneList.length > maxCount; + cloneList = cloneList.slice(0, maxCount); + } + (0, import_react_dom.flushSync)(() => { + setMergedFileList(cloneList); + }); + const changeInfo = { + file, + fileList: cloneList + }; + if (event) { + changeInfo.event = event; + } + if (!exceedMaxCount || // We should ignore event if current file is exceed `maxCount` + cloneList.some((f) => f.uid === file.uid)) { + (0, import_react_dom.flushSync)(() => { + onChange == null ? void 0 : onChange(changeInfo); + }); + } + }; + const mergedBeforeUpload = async (file, fileListArgs) => { + const { beforeUpload, transformFile } = props; + let parsedFile = file; + if (beforeUpload) { + const result = await beforeUpload(file, fileListArgs); + if (result === false) { + return false; + } + delete file[LIST_IGNORE]; + if (result === LIST_IGNORE) { + Object.defineProperty(file, LIST_IGNORE, { + value: true, + configurable: true + }); + return false; + } + if (typeof result === "object" && result) { + parsedFile = result; + } + } + if (transformFile) { + parsedFile = await transformFile(parsedFile); + } + return parsedFile; + }; + const onBatchStart = (batchFileInfoList) => { + const filteredFileInfoList = batchFileInfoList.filter( + (info) => !info.file[LIST_IGNORE] + ); + if (!filteredFileInfoList.length) { + return; + } + const objectFileList = filteredFileInfoList.map((info) => (0, import_utils.file2Obj)(info.file)); + let newFileList = [...mergedFileList]; + objectFileList.forEach((fileObj) => { + newFileList = (0, import_utils.updateFileList)(fileObj, newFileList); + }); + objectFileList.forEach((fileObj, index) => { + let triggerFileObj = fileObj; + if (!filteredFileInfoList[index].parsedFile) { + const { originFileObj } = fileObj; + let clone; + try { + clone = new File([originFileObj], originFileObj.name, { + type: originFileObj.type + }); + } catch (e) { + clone = new Blob([originFileObj], { + type: originFileObj.type + }); + clone.name = originFileObj.name; + clone.lastModifiedDate = /* @__PURE__ */ new Date(); + clone.lastModified = (/* @__PURE__ */ new Date()).getTime(); + } + clone.uid = fileObj.uid; + triggerFileObj = clone; + } else { + fileObj.status = "uploading"; + } + onInternalChange(triggerFileObj, newFileList); + }); + }; + const onSuccess = (response, file, xhr) => { + try { + if (typeof response === "string") { + response = JSON.parse(response); + } + } catch (e) { + } + if (!(0, import_utils.getFileItem)(file, mergedFileList)) { + return; + } + const targetItem = (0, import_utils.file2Obj)(file); + targetItem.status = "done"; + targetItem.percent = 100; + targetItem.response = response; + targetItem.xhr = xhr; + const nextFileList = (0, import_utils.updateFileList)(targetItem, mergedFileList); + onInternalChange(targetItem, nextFileList); + }; + const onProgress = (e, file) => { + if (!(0, import_utils.getFileItem)(file, mergedFileList)) { + return; + } + const targetItem = (0, import_utils.file2Obj)(file); + targetItem.status = "uploading"; + targetItem.percent = e.percent; + const nextFileList = (0, import_utils.updateFileList)(targetItem, mergedFileList); + onInternalChange(targetItem, nextFileList, e); + }; + const onError = (error, response, file) => { + if (!(0, import_utils.getFileItem)(file, mergedFileList)) { + return; + } + const targetItem = (0, import_utils.file2Obj)(file); + targetItem.error = error; + targetItem.response = response; + targetItem.status = "error"; + const nextFileList = (0, import_utils.updateFileList)(targetItem, mergedFileList); + onInternalChange(targetItem, nextFileList); + }; + const handleRemove = (file) => { + let currentFile; + Promise.resolve(typeof onRemove === "function" ? onRemove(file) : onRemove).then((ret) => { + var _a; + if (ret === false) { + return; + } + const removedFileList = (0, import_utils.removeFileItem)(file, mergedFileList); + if (removedFileList) { + currentFile = { ...file, status: "removed" }; + mergedFileList == null ? void 0 : mergedFileList.forEach((item) => { + const matchKey = currentFile.uid !== void 0 ? "uid" : "name"; + if (item[matchKey] === currentFile[matchKey] && !Object.isFrozen(item)) { + item.status = "removed"; + } + }); + (_a = upload.current) == null ? void 0 : _a.abort(currentFile); + onInternalChange(currentFile, removedFileList); + } + }); + }; + const onFileDrop = (e) => { + setDragState(e.type); + if (e.type === "drop") { + onDrop == null ? void 0 : onDrop(e); + } + }; + React.useImperativeHandle(ref, () => ({ + onBatchStart, + onSuccess, + onProgress, + onError, + fileList: mergedFileList, + upload: upload.current + })); + const { getPrefixCls, direction, upload: ctxUpload } = React.useContext(import_config_provider.ConfigContext); + const prefixCls = getPrefixCls("upload", customizePrefixCls); + const rcUploadProps = { + onBatchStart, + onError, + onProgress, + onSuccess, + ...props, + data, + multiple, + action, + accept, + supportServerRender, + prefixCls, + disabled: mergedDisabled, + beforeUpload: mergedBeforeUpload, + onChange: void 0, + hasControlInside + }; + delete rcUploadProps.className; + delete rcUploadProps.style; + if (!children || mergedDisabled) { + delete rcUploadProps.id; + } + const wrapperCls = `${prefixCls}-wrapper`; + const [wrapCSSVar, hashId, cssVarCls] = (0, import_style.default)(prefixCls, wrapperCls); + const [contextLocale] = (0, import_locale.useLocale)("Upload", import_en_US.default.Upload); + const { + showRemoveIcon, + showPreviewIcon, + showDownloadIcon, + removeIcon, + previewIcon, + downloadIcon + } = typeof showUploadList === "boolean" ? {} : showUploadList; + const realShowRemoveIcon = typeof showRemoveIcon === "undefined" ? !mergedDisabled : !!showRemoveIcon; + const renderUploadList = (button, buttonVisible) => { + if (!showUploadList) { + return button; + } + return /* @__PURE__ */ React.createElement( + import_UploadList.default, + { + prefixCls, + listType, + items: mergedFileList, + previewFile, + onPreview, + onDownload, + onRemove: handleRemove, + showRemoveIcon: realShowRemoveIcon, + showPreviewIcon, + showDownloadIcon, + removeIcon, + previewIcon, + downloadIcon, + iconRender, + locale: { ...contextLocale, ...propLocale }, + isImageUrl, + progress, + appendAction: button, + appendActionVisible: buttonVisible, + itemRender, + disabled: mergedDisabled + } + ); + }; + const mergedCls = (0, import_classnames.default)( + wrapperCls, + className, + rootClassName, + hashId, + cssVarCls, + ctxUpload == null ? void 0 : ctxUpload.className, + { + [`${prefixCls}-rtl`]: direction === "rtl", + [`${prefixCls}-picture-card-wrapper`]: listType === "picture-card", + [`${prefixCls}-picture-circle-wrapper`]: listType === "picture-circle" + } + ); + const mergedStyle = { ...ctxUpload == null ? void 0 : ctxUpload.style, ...style }; + if (type === "drag") { + const dragCls = (0, import_classnames.default)(hashId, prefixCls, `${prefixCls}-drag`, { + [`${prefixCls}-drag-uploading`]: mergedFileList.some((file) => file.status === "uploading"), + [`${prefixCls}-drag-hover`]: dragState === "dragover", + [`${prefixCls}-disabled`]: mergedDisabled, + [`${prefixCls}-rtl`]: direction === "rtl" + }); + return wrapCSSVar( + /* @__PURE__ */ React.createElement("span", { className: mergedCls }, /* @__PURE__ */ React.createElement( + "div", + { + className: dragCls, + style: mergedStyle, + onDrop: onFileDrop, + onDragOver: onFileDrop, + onDragLeave: onFileDrop + }, + /* @__PURE__ */ React.createElement(import_rc_upload.default, { ...rcUploadProps, ref: upload, className: `${prefixCls}-btn` }, /* @__PURE__ */ React.createElement("div", { className: `${prefixCls}-drag-container` }, children)) + ), renderUploadList()) + ); + } + const uploadButtonCls = (0, import_classnames.default)(prefixCls, `${prefixCls}-select`, { + [`${prefixCls}-disabled`]: mergedDisabled + }); + const renderUploadButton = (uploadButtonStyle) => /* @__PURE__ */ React.createElement("div", { className: uploadButtonCls, style: uploadButtonStyle }, /* @__PURE__ */ React.createElement(import_rc_upload.default, { ...rcUploadProps, ref: upload })); + const uploadButton = renderUploadButton(children ? void 0 : { display: "none" }); + if (listType === "picture-card" || listType === "picture-circle") { + return wrapCSSVar( + /* @__PURE__ */ React.createElement("span", { className: mergedCls }, renderUploadList(uploadButton, !!children)) + ); + } + return wrapCSSVar( + /* @__PURE__ */ React.createElement("span", { className: mergedCls }, uploadButton, renderUploadList()) + ); +}; +var Upload = React.forwardRef(InternalUpload); +if (process.env.NODE_ENV !== "production") { + Upload.displayName = "Upload"; +} +var Upload_default = Upload; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + LIST_IGNORE +}); diff --git a/packages/meta/lib/upload/UploadList/ListItem.d.ts b/packages/meta/lib/upload/UploadList/ListItem.d.ts new file mode 100644 index 0000000..1a7d6eb --- /dev/null +++ b/packages/meta/lib/upload/UploadList/ListItem.d.ts @@ -0,0 +1,27 @@ +import * as React from 'react'; +import type { ItemRender, UploadFile, UploadListProgressProps, UploadListType, UploadLocale } from '../interface'; +export interface ListItemProps { + prefixCls: string; + className?: string; + style?: React.CSSProperties; + locale: UploadLocale; + file: UploadFile; + items: UploadFile[]; + listType?: UploadListType; + isImgUrl?: (file: UploadFile) => boolean; + showRemoveIcon?: boolean; + showDownloadIcon?: boolean; + showPreviewIcon?: boolean; + removeIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); + downloadIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); + previewIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); + iconRender: (file: UploadFile) => React.ReactNode; + actionIconRender: (customIcon: React.ReactNode, callback: () => void, prefixCls: string, title?: string, acceptUploadDisabled?: boolean) => React.ReactNode; + itemRender?: ItemRender; + onPreview: (file: UploadFile, e: React.SyntheticEvent) => void; + onClose: (file: UploadFile) => void; + onDownload: (file: UploadFile) => void; + progress?: UploadListProgressProps; +} +declare const ListItem: React.ForwardRefExoticComponent>; +export default ListItem; diff --git a/packages/meta/lib/upload/UploadList/ListItem.js b/packages/meta/lib/upload/UploadList/ListItem.js new file mode 100644 index 0000000..5f4a644 --- /dev/null +++ b/packages/meta/lib/upload/UploadList/ListItem.js @@ -0,0 +1,233 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/UploadList/ListItem.tsx +var ListItem_exports = {}; +__export(ListItem_exports, { + default: () => ListItem_default +}); +module.exports = __toCommonJS(ListItem_exports); +var import_DeleteOutlined = __toESM(require("@ant-design/icons/DeleteOutlined")); +var import_DownloadOutlined = __toESM(require("@ant-design/icons/DownloadOutlined")); +var import_EyeOutlined = __toESM(require("@ant-design/icons/EyeOutlined")); +var import_classnames = __toESM(require("classnames")); +var import_rc_motion = __toESM(require("rc-motion")); +var React = __toESM(require("react")); +var import_config_provider = require("../../config-provider"); +var import_progress = __toESM(require("../../progress")); +var import_tooltip = __toESM(require("../../tooltip")); +var ListItem = React.forwardRef( + ({ + prefixCls, + className, + style, + locale, + listType, + file, + items, + progress: progressProps, + iconRender, + actionIconRender, + itemRender, + isImgUrl, + showPreviewIcon, + showRemoveIcon, + showDownloadIcon, + previewIcon: customPreviewIcon, + removeIcon: customRemoveIcon, + downloadIcon: customDownloadIcon, + onPreview, + onDownload, + onClose + }, ref) => { + var _a, _b; + const { status } = file; + const [mergedStatus, setMergedStatus] = React.useState(status); + React.useEffect(() => { + if (status !== "removed") { + setMergedStatus(status); + } + }, [status]); + const [showProgress, setShowProgress] = React.useState(false); + React.useEffect(() => { + const timer = setTimeout(() => { + setShowProgress(true); + }, 300); + return () => { + clearTimeout(timer); + }; + }, []); + const iconNode = iconRender(file); + let icon = /* @__PURE__ */ React.createElement("div", { className: `${prefixCls}-icon` }, iconNode); + if (listType === "picture" || listType === "picture-card" || listType === "picture-circle") { + if (mergedStatus === "uploading" || !file.thumbUrl && !file.url) { + const uploadingClassName = (0, import_classnames.default)(`${prefixCls}-list-item-thumbnail`, { + [`${prefixCls}-list-item-file`]: mergedStatus !== "uploading" + }); + icon = /* @__PURE__ */ React.createElement("div", { className: uploadingClassName }, iconNode); + } else { + const thumbnail = (isImgUrl == null ? void 0 : isImgUrl(file)) ? /* @__PURE__ */ React.createElement( + "img", + { + src: file.thumbUrl || file.url, + alt: file.name, + className: `${prefixCls}-list-item-image`, + crossOrigin: file.crossOrigin + } + ) : iconNode; + const aClassName = (0, import_classnames.default)(`${prefixCls}-list-item-thumbnail`, { + [`${prefixCls}-list-item-file`]: isImgUrl && !isImgUrl(file) + }); + icon = /* @__PURE__ */ React.createElement( + "a", + { + className: aClassName, + onClick: (e) => onPreview(file, e), + href: file.url || file.thumbUrl, + target: "_blank", + rel: "noopener noreferrer" + }, + thumbnail + ); + } + } + const listItemClassName = (0, import_classnames.default)( + `${prefixCls}-list-item`, + `${prefixCls}-list-item-${mergedStatus}` + ); + const linkProps = typeof file.linkProps === "string" ? JSON.parse(file.linkProps) : file.linkProps; + const removeIcon = showRemoveIcon ? actionIconRender( + (typeof customRemoveIcon === "function" ? customRemoveIcon(file) : customRemoveIcon) || /* @__PURE__ */ React.createElement(import_DeleteOutlined.default, null), + () => onClose(file), + prefixCls, + locale.removeFile, + // acceptUploadDisabled is true, only remove icon will follow Upload disabled prop + // https://github.com/ant-design/ant-design/issues/46171 + true + ) : null; + const downloadIcon = showDownloadIcon && mergedStatus === "done" ? actionIconRender( + (typeof customDownloadIcon === "function" ? customDownloadIcon(file) : customDownloadIcon) || /* @__PURE__ */ React.createElement(import_DownloadOutlined.default, null), + () => onDownload(file), + prefixCls, + locale.downloadFile + ) : null; + const downloadOrDelete = listType !== "picture-card" && listType !== "picture-circle" && /* @__PURE__ */ React.createElement( + "span", + { + key: "download-delete", + className: (0, import_classnames.default)(`${prefixCls}-list-item-actions`, { + picture: listType === "picture" + }) + }, + downloadIcon, + removeIcon + ); + const listItemNameClass = (0, import_classnames.default)(`${prefixCls}-list-item-name`); + const fileName = file.url ? [ + /* @__PURE__ */ React.createElement( + "a", + { + key: "view", + target: "_blank", + rel: "noopener noreferrer", + className: listItemNameClass, + title: file.name, + ...linkProps, + href: file.url, + onClick: (e) => onPreview(file, e) + }, + file.name + ), + downloadOrDelete + ] : [ + /* @__PURE__ */ React.createElement( + "span", + { + key: "view", + className: listItemNameClass, + onClick: (e) => onPreview(file, e), + title: file.name + }, + file.name + ), + downloadOrDelete + ]; + const previewIcon = showPreviewIcon && (file.url || file.thumbUrl) ? /* @__PURE__ */ React.createElement( + "a", + { + href: file.url || file.thumbUrl, + target: "_blank", + rel: "noopener noreferrer", + onClick: (e) => onPreview(file, e), + title: locale.previewFile + }, + typeof customPreviewIcon === "function" ? customPreviewIcon(file) : customPreviewIcon || /* @__PURE__ */ React.createElement(import_EyeOutlined.default, null) + ) : null; + const pictureCardActions = (listType === "picture-card" || listType === "picture-circle") && mergedStatus !== "uploading" && /* @__PURE__ */ React.createElement("span", { className: `${prefixCls}-list-item-actions` }, previewIcon, mergedStatus === "done" && downloadIcon, removeIcon); + const { getPrefixCls } = React.useContext(import_config_provider.ConfigContext); + const rootPrefixCls = getPrefixCls(); + const dom = /* @__PURE__ */ React.createElement("div", { className: listItemClassName }, icon, fileName, pictureCardActions, showProgress && /* @__PURE__ */ React.createElement( + import_rc_motion.default, + { + motionName: `${rootPrefixCls}-fade`, + visible: mergedStatus === "uploading", + motionDeadline: 2e3 + }, + ({ className: motionClassName }) => { + const loadingProgress = "percent" in file ? /* @__PURE__ */ React.createElement( + import_progress.default, + { + ...progressProps, + type: "line", + percent: file.percent, + "aria-label": file["aria-label"], + "aria-labelledby": file["aria-labelledby"] + } + ) : null; + return /* @__PURE__ */ React.createElement("div", { className: (0, import_classnames.default)(`${prefixCls}-list-item-progress`, motionClassName) }, loadingProgress); + } + )); + const message = file.response && typeof file.response === "string" ? file.response : ((_a = file.error) == null ? void 0 : _a.statusText) || ((_b = file.error) == null ? void 0 : _b.message) || locale.uploadError; + const item = mergedStatus === "error" ? /* @__PURE__ */ React.createElement(import_tooltip.default, { title: message, getPopupContainer: (node) => node.parentNode }, dom) : dom; + return /* @__PURE__ */ React.createElement( + "div", + { + className: (0, import_classnames.default)(`${prefixCls}-list-item-container`, className), + style, + ref + }, + itemRender ? itemRender(item, file, items, { + download: onDownload.bind(null, file), + // @ts-ignore + preview: onPreview.bind(null, file), + remove: onClose.bind(null, file) + }) : item + ); + } +); +var ListItem_default = ListItem; diff --git a/packages/meta/lib/upload/UploadList/index.d.ts b/packages/meta/lib/upload/UploadList/index.d.ts new file mode 100644 index 0000000..3d9a101 --- /dev/null +++ b/packages/meta/lib/upload/UploadList/index.d.ts @@ -0,0 +1,8 @@ +import * as React from 'react'; +import type { UploadFile, UploadListProps } from '../interface'; +interface UploadListRef { + handlePreview: (file: UploadFile, e?: React.SyntheticEvent) => void; + handleDownload: (file: UploadFile) => void; +} +declare const UploadList: React.ForwardRefExoticComponent & React.RefAttributes>; +export default UploadList; diff --git a/packages/meta/lib/upload/UploadList/index.js b/packages/meta/lib/upload/UploadList/index.js new file mode 100644 index 0000000..b392e69 --- /dev/null +++ b/packages/meta/lib/upload/UploadList/index.js @@ -0,0 +1,223 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/UploadList/index.tsx +var UploadList_exports = {}; +__export(UploadList_exports, { + default: () => UploadList_default +}); +module.exports = __toCommonJS(UploadList_exports); +var React = __toESM(require("react")); +var import_FileTwoTone = __toESM(require("@ant-design/icons/FileTwoTone")); +var import_LoadingOutlined = __toESM(require("@ant-design/icons/LoadingOutlined")); +var import_PaperClipOutlined = __toESM(require("@ant-design/icons/PaperClipOutlined")); +var import_PictureTwoTone = __toESM(require("@ant-design/icons/PictureTwoTone")); +var import_classnames = __toESM(require("classnames")); +var import_rc_motion = __toESM(require("rc-motion")); +var import_useForceUpdate = __toESM(require("../../_util/hooks/useForceUpdate")); +var import_motion = __toESM(require("../../_util/motion")); +var import_reactNode = require("../../_util/reactNode"); +var import_button = __toESM(require("../../button")); +var import_config_provider = require("../../config-provider"); +var import_utils = require("../utils"); +var import_ListItem = __toESM(require("./ListItem")); +var InternalUploadList = (props, ref) => { + const { + listType = "text", + previewFile = import_utils.previewImage, + onPreview, + onDownload, + onRemove, + locale, + iconRender, + isImageUrl: isImgUrl = import_utils.isImageUrl, + prefixCls: customizePrefixCls, + items = [], + showPreviewIcon = true, + showRemoveIcon = true, + showDownloadIcon = false, + removeIcon, + previewIcon, + downloadIcon, + progress = { size: [-1, 2], showInfo: false }, + appendAction, + appendActionVisible = true, + itemRender, + disabled + } = props; + const forceUpdate = (0, import_useForceUpdate.default)(); + const [motionAppear, setMotionAppear] = React.useState(false); + React.useEffect(() => { + if (listType !== "picture" && listType !== "picture-card" && listType !== "picture-circle") { + return; + } + (items || []).forEach((file) => { + if (typeof document === "undefined" || typeof window === "undefined" || !window.FileReader || !window.File || !(file.originFileObj instanceof File || file.originFileObj instanceof Blob) || file.thumbUrl !== void 0) { + return; + } + file.thumbUrl = ""; + if (previewFile) { + previewFile(file.originFileObj).then((previewDataUrl) => { + file.thumbUrl = previewDataUrl || ""; + forceUpdate(); + }); + } + }); + }, [listType, items, previewFile]); + React.useEffect(() => { + setMotionAppear(true); + }, []); + const onInternalPreview = (file, e) => { + if (!onPreview) { + return; + } + e == null ? void 0 : e.preventDefault(); + return onPreview(file); + }; + const onInternalDownload = (file) => { + if (typeof onDownload === "function") { + onDownload(file); + } else if (file.url) { + window.open(file.url); + } + }; + const onInternalClose = (file) => { + onRemove == null ? void 0 : onRemove(file); + }; + const internalIconRender = (file) => { + if (iconRender) { + return iconRender(file, listType); + } + const isLoading = file.status === "uploading"; + const fileIcon = isImgUrl && isImgUrl(file) ? /* @__PURE__ */ React.createElement(import_PictureTwoTone.default, null) : /* @__PURE__ */ React.createElement(import_FileTwoTone.default, null); + let icon = isLoading ? /* @__PURE__ */ React.createElement(import_LoadingOutlined.default, null) : /* @__PURE__ */ React.createElement(import_PaperClipOutlined.default, null); + if (listType === "picture") { + icon = isLoading ? /* @__PURE__ */ React.createElement(import_LoadingOutlined.default, null) : fileIcon; + } else if (listType === "picture-card" || listType === "picture-circle") { + icon = isLoading ? locale.uploading : fileIcon; + } + return icon; + }; + const actionIconRender = (customIcon, callback, prefixCls2, title, acceptUploadDisabled) => { + const btnProps = { + type: "text", + size: "small", + title, + onClick: (e) => { + callback(); + if ((0, import_reactNode.isValidElement)(customIcon) && customIcon.props.onClick) { + customIcon.props.onClick(e); + } + }, + className: `${prefixCls2}-list-item-action` + }; + if (acceptUploadDisabled) { + btnProps.disabled = disabled; + } + if ((0, import_reactNode.isValidElement)(customIcon)) { + const btnIcon = (0, import_reactNode.cloneElement)(customIcon, { + ...customIcon.props, + onClick: () => { + } + }); + return /* @__PURE__ */ React.createElement(import_button.default, { ...btnProps, icon: btnIcon }); + } + return /* @__PURE__ */ React.createElement(import_button.default, { ...btnProps }, /* @__PURE__ */ React.createElement("span", null, customIcon)); + }; + React.useImperativeHandle(ref, () => ({ + handlePreview: onInternalPreview, + handleDownload: onInternalDownload + })); + const { getPrefixCls } = React.useContext(import_config_provider.ConfigContext); + const prefixCls = getPrefixCls("upload", customizePrefixCls); + const rootPrefixCls = getPrefixCls(); + const listClassNames = (0, import_classnames.default)(`${prefixCls}-list`, `${prefixCls}-list-${listType}`); + const motionKeyList = [...items.map((file) => ({ key: file.uid, file }))]; + const animationDirection = listType === "picture-card" || listType === "picture-circle" ? "animate-inline" : "animate"; + let motionConfig = { + motionDeadline: 2e3, + motionName: `${prefixCls}-${animationDirection}`, + keys: motionKeyList, + motionAppear + }; + const listItemMotion = React.useMemo(() => { + const motion = { + ...(0, import_motion.default)(rootPrefixCls) + }; + delete motion.onAppearEnd; + delete motion.onEnterEnd; + delete motion.onLeaveEnd; + return motion; + }, [rootPrefixCls]); + if (listType !== "picture-card" && listType !== "picture-circle") { + motionConfig = { + ...listItemMotion, + ...motionConfig + }; + } + return /* @__PURE__ */ React.createElement("div", { className: listClassNames }, /* @__PURE__ */ React.createElement(import_rc_motion.CSSMotionList, { ...motionConfig, component: false }, ({ key, file, className: motionClassName, style: motionStyle }) => /* @__PURE__ */ React.createElement( + import_ListItem.default, + { + key, + locale, + prefixCls, + className: motionClassName, + style: motionStyle, + file, + items, + progress, + listType, + isImgUrl, + showPreviewIcon, + showRemoveIcon, + showDownloadIcon, + removeIcon, + previewIcon, + downloadIcon, + iconRender: internalIconRender, + actionIconRender, + itemRender, + onPreview: onInternalPreview, + onDownload: onInternalDownload, + onClose: onInternalClose + } + )), appendAction && /* @__PURE__ */ React.createElement(import_rc_motion.default, { ...motionConfig, visible: appendActionVisible, forceRender: true }, ({ className: motionClassName, style: motionStyle }) => (0, import_reactNode.cloneElement)(appendAction, (oriProps) => ({ + className: (0, import_classnames.default)(oriProps.className, motionClassName), + style: { + ...motionStyle, + // prevent the element has hover css pseudo-class that may cause animation to end prematurely. + pointerEvents: motionClassName ? "none" : void 0, + ...oriProps.style + } + })))); +}; +var UploadList = React.forwardRef(InternalUploadList); +if (process.env.NODE_ENV !== "production") { + UploadList.displayName = "UploadList"; +} +var UploadList_default = UploadList; diff --git a/packages/meta/lib/upload/demo/utils/request.d.ts b/packages/meta/lib/upload/demo/utils/request.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/meta/lib/upload/demo/utils/request.js b/packages/meta/lib/upload/demo/utils/request.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/meta/lib/upload/index.d.ts b/packages/meta/lib/upload/index.d.ts new file mode 100644 index 0000000..ef91453 --- /dev/null +++ b/packages/meta/lib/upload/index.d.ts @@ -0,0 +1,14 @@ +/// +import Dragger from './Dragger'; +import type { UploadProps } from './Upload'; +import InternalUpload from './Upload'; +export type { DraggerProps } from './Dragger'; +export type { RcFile, UploadChangeParam, UploadFile, UploadListProps, UploadProps, } from './interface'; +type InternalUploadType = typeof InternalUpload; +type CompoundedComponent = InternalUploadType & { + (props: React.PropsWithChildren> & React.RefAttributes): React.ReactElement; + Dragger: typeof Dragger; + LIST_IGNORE: string; +}; +declare const Upload: CompoundedComponent; +export default Upload; diff --git a/packages/meta/lib/upload/index.js b/packages/meta/lib/upload/index.js new file mode 100644 index 0000000..0149330 --- /dev/null +++ b/packages/meta/lib/upload/index.js @@ -0,0 +1,40 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/index.ts +var upload_exports = {}; +__export(upload_exports, { + default: () => upload_default +}); +module.exports = __toCommonJS(upload_exports); +var import_Dragger = __toESM(require("./Dragger")); +var import_Upload = __toESM(require("./Upload")); +var Upload = import_Upload.default; +Upload.Dragger = import_Dragger.default; +Upload.LIST_IGNORE = import_Upload.LIST_IGNORE; +var upload_default = Upload; diff --git a/packages/meta/lib/upload/interface.d.ts b/packages/meta/lib/upload/interface.d.ts new file mode 100644 index 0000000..b6032f3 --- /dev/null +++ b/packages/meta/lib/upload/interface.d.ts @@ -0,0 +1,136 @@ +import type * as React from 'react'; +import type { RcFile as OriRcFile, UploadRequestOption as RcCustomRequestOptions, UploadProps as RcUploadProps } from 'rc-upload/lib/interface'; +import type { ProgressAriaProps, ProgressProps } from '../progress'; +export interface RcFile extends OriRcFile { + readonly lastModifiedDate: Date; +} +export type UploadFileStatus = 'error' | 'done' | 'uploading' | 'removed'; +export interface HttpRequestHeader { + [key: string]: string; +} +export interface UploadFile extends ProgressAriaProps { + uid: string; + size?: number; + name: string; + fileName?: string; + lastModified?: number; + lastModifiedDate?: Date; + url?: string; + status?: UploadFileStatus; + percent?: number; + thumbUrl?: string; + crossOrigin?: React.ImgHTMLAttributes['crossOrigin']; + originFileObj?: RcFile; + response?: T; + error?: any; + linkProps?: any; + type?: string; + xhr?: T; + preview?: string; +} +export interface InternalUploadFile extends UploadFile { + originFileObj: RcFile; +} +export interface UploadChangeParam { + file: T; + fileList: T[]; + event?: { + percent: number; + }; +} +export interface ShowUploadListInterface { + showRemoveIcon?: boolean; + showPreviewIcon?: boolean; + showDownloadIcon?: boolean; + removeIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); + downloadIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); + previewIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); +} +export interface UploadLocale { + uploading?: string; + removeFile?: string; + downloadFile?: string; + uploadError?: string; + previewFile?: string; +} +export type UploadType = 'drag' | 'select'; +export type UploadListType = 'text' | 'picture' | 'picture-card' | 'picture-circle'; +export type UploadListProgressProps = Omit; +export type ItemRender = (originNode: React.ReactElement, file: UploadFile, fileList: Array>, actions: { + download: () => void; + preview: () => void; + remove: () => void; +}) => React.ReactNode; +type PreviewFileHandler = (file: File | Blob) => PromiseLike; +type TransformFileHandler = (file: RcFile) => string | Blob | File | PromiseLike; +type BeforeUploadValueType = void | boolean | string | Blob | File; +export interface UploadProps extends Pick { + type?: UploadType; + name?: string; + defaultFileList?: Array>; + fileList?: Array>; + action?: string | ((file: RcFile) => string) | ((file: RcFile) => PromiseLike); + directory?: boolean; + data?: Record | ((file: UploadFile) => Record | Promise>); + method?: 'POST' | 'PUT' | 'PATCH' | 'post' | 'put' | 'patch'; + headers?: HttpRequestHeader; + showUploadList?: boolean | ShowUploadListInterface; + multiple?: boolean; + accept?: string; + beforeUpload?: (file: RcFile, FileList: RcFile[]) => BeforeUploadValueType | Promise; + onChange?: (info: UploadChangeParam>) => void; + onDrop?: (event: React.DragEvent) => void; + listType?: UploadListType; + className?: string; + rootClassName?: string; + onPreview?: (file: UploadFile) => void; + onDownload?: (file: UploadFile) => void; + onRemove?: (file: UploadFile) => void | boolean | Promise; + supportServerRender?: boolean; + style?: React.CSSProperties; + disabled?: boolean; + prefixCls?: string; + customRequest?: (options: RcCustomRequestOptions) => void; + withCredentials?: boolean; + openFileDialogOnClick?: boolean; + locale?: UploadLocale; + id?: string; + previewFile?: PreviewFileHandler; + /** @deprecated Please use `beforeUpload` directly */ + transformFile?: TransformFileHandler; + iconRender?: (file: UploadFile, listType?: UploadListType) => React.ReactNode; + isImageUrl?: (file: UploadFile) => boolean; + progress?: UploadListProgressProps; + itemRender?: ItemRender; + /** Config max count of `fileList`. Will replace current one when `maxCount` is 1 */ + maxCount?: number; + children?: React.ReactNode; +} +export interface UploadState { + fileList: UploadFile[]; + dragState: string; +} +export interface UploadListProps { + listType?: UploadListType; + onPreview?: (file: UploadFile) => void; + onDownload?: (file: UploadFile) => void; + onRemove?: (file: UploadFile) => void | boolean; + items?: Array>; + progress?: UploadListProgressProps; + prefixCls?: string; + className?: string; + showRemoveIcon?: boolean; + showDownloadIcon?: boolean; + showPreviewIcon?: boolean; + removeIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); + downloadIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); + previewIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); + locale: UploadLocale; + previewFile?: PreviewFileHandler; + iconRender?: (file: UploadFile, listType?: UploadListType) => React.ReactNode; + isImageUrl?: (file: UploadFile) => boolean; + appendAction?: React.ReactNode; + appendActionVisible?: boolean; + itemRender?: ItemRender; +} +export {}; diff --git a/packages/meta/lib/upload/interface.js b/packages/meta/lib/upload/interface.js new file mode 100644 index 0000000..6b4e8ab --- /dev/null +++ b/packages/meta/lib/upload/interface.js @@ -0,0 +1,17 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/interface.ts +var interface_exports = {}; +module.exports = __toCommonJS(interface_exports); diff --git a/packages/meta/lib/upload/style/dragger.d.ts b/packages/meta/lib/upload/style/dragger.d.ts new file mode 100644 index 0000000..f955226 --- /dev/null +++ b/packages/meta/lib/upload/style/dragger.d.ts @@ -0,0 +1,4 @@ +import type { UploadToken } from '.'; +import type { GenerateStyle } from '../../theme/internal'; +declare const genDraggerStyle: GenerateStyle; +export default genDraggerStyle; diff --git a/packages/meta/lib/upload/style/dragger.js b/packages/meta/lib/upload/style/dragger.js new file mode 100644 index 0000000..2a38d21 --- /dev/null +++ b/packages/meta/lib/upload/style/dragger.js @@ -0,0 +1,92 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/style/dragger.ts +var dragger_exports = {}; +__export(dragger_exports, { + default: () => dragger_default +}); +module.exports = __toCommonJS(dragger_exports); +var import_cssinjs = require("@ant-design/cssinjs"); +var genDraggerStyle = (token) => { + const { componentCls, iconCls } = token; + return { + [`${componentCls}-wrapper`]: { + [`${componentCls}-drag`]: { + position: "relative", + width: "100%", + height: "100%", + textAlign: "center", + background: token.colorFillAlter, + border: `${(0, import_cssinjs.unit)(token.lineWidth)} dashed ${token.colorBorder}`, + borderRadius: token.borderRadiusLG, + cursor: "pointer", + transition: `border-color ${token.motionDurationSlow}`, + [componentCls]: { + padding: token.padding + }, + [`${componentCls}-btn`]: { + display: "table", + width: "100%", + height: "100%", + outline: "none", + borderRadius: token.borderRadiusLG, + "&:focus-visible": { + outline: `${(0, import_cssinjs.unit)(token.lineWidthFocus)} solid ${token.colorPrimaryBorder}` + } + }, + [`${componentCls}-drag-container`]: { + display: "table-cell", + verticalAlign: "middle" + }, + [` + &:not(${componentCls}-disabled):hover, + &-hover:not(${componentCls}-disabled) + `]: { + borderColor: token.colorPrimaryHover + }, + [`p${componentCls}-drag-icon`]: { + marginBottom: token.margin, + [iconCls]: { + color: token.colorPrimary, + fontSize: token.uploadThumbnailSize + } + }, + [`p${componentCls}-text`]: { + margin: `0 0 ${(0, import_cssinjs.unit)(token.marginXXS)}`, + color: token.colorTextHeading, + fontSize: token.fontSizeLG + }, + [`p${componentCls}-hint`]: { + color: token.colorTextDescription, + fontSize: token.fontSize + }, + // ===================== Disabled ===================== + [`&${componentCls}-disabled`]: { + [`p${componentCls}-drag-icon ${iconCls}, + p${componentCls}-text, + p${componentCls}-hint + `]: { + color: token.colorTextDisabled + } + } + } + } + }; +}; +var dragger_default = genDraggerStyle; diff --git a/packages/meta/lib/upload/style/index.d.ts b/packages/meta/lib/upload/style/index.d.ts new file mode 100644 index 0000000..54a1088 --- /dev/null +++ b/packages/meta/lib/upload/style/index.d.ts @@ -0,0 +1,17 @@ +/// +import type { FullToken, GetDefaultToken } from '../../theme/internal'; +export interface ComponentToken { + /** + * @desc 操作按扭颜色 + * @descEN Action button color + */ + actionsColor: string; +} +export interface UploadToken extends FullToken<'Upload'> { + uploadThumbnailSize: number | string; + uploadProgressOffset: number | string; + uploadPicCardSize: number | string; +} +export declare const prepareComponentToken: GetDefaultToken<'Upload'>; +declare const _default: (prefixCls: string, rootCls?: string) => readonly [(node: import("react").ReactElement>) => import("react").ReactElement>, string, string | undefined]; +export default _default; diff --git a/packages/meta/lib/upload/style/index.js b/packages/meta/lib/upload/style/index.js new file mode 100644 index 0000000..4ad5e7f --- /dev/null +++ b/packages/meta/lib/upload/style/index.js @@ -0,0 +1,93 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/style/index.ts +var style_exports = {}; +__export(style_exports, { + default: () => style_default, + prepareComponentToken: () => prepareComponentToken +}); +module.exports = __toCommonJS(style_exports); +var import_style = require("../../style"); +var import_motion = require("../../style/motion"); +var import_internal = require("../../theme/internal"); +var import_dragger = __toESM(require("./dragger")); +var import_list = __toESM(require("./list")); +var import_motion2 = __toESM(require("./motion")); +var import_picture = require("./picture"); +var import_rtl = __toESM(require("./rtl")); +var genBaseStyle = (token) => { + const { componentCls, colorTextDisabled } = token; + return { + [`${componentCls}-wrapper`]: { + ...(0, import_style.resetComponent)(token), + [componentCls]: { + outline: 0, + "input[type='file']": { + cursor: "pointer" + } + }, + [`${componentCls}-select`]: { + display: "inline-block" + }, + [`${componentCls}-disabled`]: { + color: colorTextDisabled, + cursor: "not-allowed" + } + } + }; +}; +var prepareComponentToken = (token) => ({ + actionsColor: token.colorTextDescription +}); +var style_default = (0, import_internal.genStyleHooks)( + "Upload", + (token) => { + const { fontSizeHeading3, fontHeight, lineWidth, controlHeightLG, calc } = token; + const uploadToken = (0, import_internal.mergeToken)(token, { + uploadThumbnailSize: calc(fontSizeHeading3).mul(2).equal(), + uploadProgressOffset: calc(calc(fontHeight).div(2)).add(lineWidth).equal(), + uploadPicCardSize: calc(controlHeightLG).mul(2.55).equal() + }); + return [ + genBaseStyle(uploadToken), + (0, import_dragger.default)(uploadToken), + (0, import_picture.genPictureStyle)(uploadToken), + (0, import_picture.genPictureCardStyle)(uploadToken), + (0, import_list.default)(uploadToken), + (0, import_motion2.default)(uploadToken), + (0, import_rtl.default)(uploadToken), + (0, import_motion.genCollapseMotion)(uploadToken) + ]; + }, + prepareComponentToken +); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + prepareComponentToken +}); diff --git a/packages/meta/lib/upload/style/list.d.ts b/packages/meta/lib/upload/style/list.d.ts new file mode 100644 index 0000000..002c486 --- /dev/null +++ b/packages/meta/lib/upload/style/list.d.ts @@ -0,0 +1,4 @@ +import type { UploadToken } from '.'; +import type { GenerateStyle } from '../../theme/internal'; +declare const genListStyle: GenerateStyle; +export default genListStyle; diff --git a/packages/meta/lib/upload/style/list.js b/packages/meta/lib/upload/style/list.js new file mode 100644 index 0000000..5255d6a --- /dev/null +++ b/packages/meta/lib/upload/style/list.js @@ -0,0 +1,124 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/style/list.ts +var list_exports = {}; +__export(list_exports, { + default: () => list_default +}); +module.exports = __toCommonJS(list_exports); +var import_cssinjs = require("@ant-design/cssinjs"); +var import_style = require("../../style"); +var genListStyle = (token) => { + const { componentCls, antCls, iconCls, fontSize, lineHeight, calc } = token; + const itemCls = `${componentCls}-list-item`; + const actionsCls = `${itemCls}-actions`; + const actionCls = `${itemCls}-action`; + const listItemHeightSM = token.fontHeightSM; + return { + [`${componentCls}-wrapper`]: { + [`${componentCls}-list`]: { + ...(0, import_style.clearFix)(), + lineHeight: token.lineHeight, + [itemCls]: { + position: "relative", + height: calc(token.lineHeight).mul(fontSize).equal(), + marginTop: token.marginXS, + fontSize, + display: "flex", + alignItems: "center", + transition: `background-color ${token.motionDurationSlow}`, + "&:hover": { + backgroundColor: token.controlItemBgHover + }, + [`${itemCls}-name`]: { + ...import_style.textEllipsis, + padding: `0 ${(0, import_cssinjs.unit)(token.paddingXS)}`, + lineHeight, + flex: "auto", + transition: `all ${token.motionDurationSlow}` + }, + [actionsCls]: { + [actionCls]: { + opacity: 0 + }, + [iconCls]: { + color: token.actionsColor, + transition: `all ${token.motionDurationSlow}` + }, + [` + ${actionCls}:focus-visible, + &.picture ${actionCls} + `]: { + opacity: 1 + }, + [`${actionCls}${antCls}-btn`]: { + height: listItemHeightSM, + border: 0, + lineHeight: 1 + } + }, + [`${componentCls}-icon ${iconCls}`]: { + color: token.colorTextDescription, + fontSize + }, + [`${itemCls}-progress`]: { + position: "absolute", + bottom: token.calc(token.uploadProgressOffset).mul(-1).equal(), + width: "100%", + paddingInlineStart: calc(fontSize).add(token.paddingXS).equal(), + fontSize, + lineHeight: 0, + pointerEvents: "none", + "> div": { + margin: 0 + } + } + }, + [`${itemCls}:hover ${actionCls}`]: { + opacity: 1 + }, + [`${itemCls}-error`]: { + color: token.colorError, + [`${itemCls}-name, ${componentCls}-icon ${iconCls}`]: { + color: token.colorError + }, + [actionsCls]: { + [`${iconCls}, ${iconCls}:hover`]: { + color: token.colorError + }, + [actionCls]: { + opacity: 1 + } + } + }, + [`${componentCls}-list-item-container`]: { + transition: `opacity ${token.motionDurationSlow}, height ${token.motionDurationSlow}`, + // For smooth removing animation + "&::before": { + display: "table", + width: 0, + height: 0, + content: '""' + } + } + } + } + }; +}; +var list_default = genListStyle; diff --git a/packages/meta/lib/upload/style/motion.d.ts b/packages/meta/lib/upload/style/motion.d.ts new file mode 100644 index 0000000..47dcd20 --- /dev/null +++ b/packages/meta/lib/upload/style/motion.d.ts @@ -0,0 +1,4 @@ +import type { UploadToken } from '.'; +import type { GenerateStyle } from '../../theme/internal'; +declare const genMotionStyle: GenerateStyle; +export default genMotionStyle; diff --git a/packages/meta/lib/upload/style/motion.js b/packages/meta/lib/upload/style/motion.js new file mode 100644 index 0000000..9d2c282 --- /dev/null +++ b/packages/meta/lib/upload/style/motion.js @@ -0,0 +1,71 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/style/motion.ts +var motion_exports = {}; +__export(motion_exports, { + default: () => motion_default +}); +module.exports = __toCommonJS(motion_exports); +var import_cssinjs = require("@ant-design/cssinjs"); +var import_motion = require("../../style/motion"); +var uploadAnimateInlineIn = new import_cssinjs.Keyframes("uploadAnimateInlineIn", { + from: { + width: 0, + height: 0, + margin: 0, + padding: 0, + opacity: 0 + } +}); +var uploadAnimateInlineOut = new import_cssinjs.Keyframes("uploadAnimateInlineOut", { + to: { + width: 0, + height: 0, + margin: 0, + padding: 0, + opacity: 0 + } +}); +var genMotionStyle = (token) => { + const { componentCls } = token; + const inlineCls = `${componentCls}-animate-inline`; + return [ + { + [`${componentCls}-wrapper`]: { + [`${inlineCls}-appear, ${inlineCls}-enter, ${inlineCls}-leave`]: { + animationDuration: token.motionDurationSlow, + animationTimingFunction: token.motionEaseInOutCirc, + animationFillMode: "forwards" + }, + [`${inlineCls}-appear, ${inlineCls}-enter`]: { + animationName: uploadAnimateInlineIn + }, + [`${inlineCls}-leave`]: { + animationName: uploadAnimateInlineOut + } + } + }, + { + [`${componentCls}-wrapper`]: (0, import_motion.initFadeMotion)(token) + }, + uploadAnimateInlineIn, + uploadAnimateInlineOut + ]; +}; +var motion_default = genMotionStyle; diff --git a/packages/meta/lib/upload/style/picture.d.ts b/packages/meta/lib/upload/style/picture.d.ts new file mode 100644 index 0000000..f5d75d1 --- /dev/null +++ b/packages/meta/lib/upload/style/picture.d.ts @@ -0,0 +1,5 @@ +import type { UploadToken } from '.'; +import type { GenerateStyle } from '../../theme/internal'; +declare const genPictureStyle: GenerateStyle; +declare const genPictureCardStyle: GenerateStyle; +export { genPictureStyle, genPictureCardStyle }; diff --git a/packages/meta/lib/upload/style/picture.js b/packages/meta/lib/upload/style/picture.js new file mode 100644 index 0000000..9325bf3 --- /dev/null +++ b/packages/meta/lib/upload/style/picture.js @@ -0,0 +1,242 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/style/picture.ts +var picture_exports = {}; +__export(picture_exports, { + genPictureCardStyle: () => genPictureCardStyle, + genPictureStyle: () => genPictureStyle +}); +module.exports = __toCommonJS(picture_exports); +var import_colors = require("@ant-design/colors"); +var import_style = require("../../style"); +var import_cssinjs = require("@ant-design/cssinjs"); +var genPictureStyle = (token) => { + const { componentCls, iconCls, uploadThumbnailSize, uploadProgressOffset, calc } = token; + const listCls = `${componentCls}-list`; + const itemCls = `${listCls}-item`; + return { + [`${componentCls}-wrapper`]: { + // ${listCls} 增加优先级 + [` + ${listCls}${listCls}-picture, + ${listCls}${listCls}-picture-card, + ${listCls}${listCls}-picture-circle + `]: { + [itemCls]: { + position: "relative", + height: calc(uploadThumbnailSize).add(calc(token.lineWidth).mul(2)).add(calc(token.paddingXS).mul(2)).equal(), + padding: token.paddingXS, + border: `${(0, import_cssinjs.unit)(token.lineWidth)} ${token.lineType} ${token.colorBorder}`, + borderRadius: token.borderRadiusLG, + "&:hover": { + background: "transparent" + }, + [`${itemCls}-thumbnail`]: { + ...import_style.textEllipsis, + width: uploadThumbnailSize, + height: uploadThumbnailSize, + lineHeight: (0, import_cssinjs.unit)(calc(uploadThumbnailSize).add(token.paddingSM).equal()), + textAlign: "center", + flex: "none", + [iconCls]: { + fontSize: token.fontSizeHeading2, + color: token.colorPrimary + }, + img: { + display: "block", + width: "100%", + height: "100%", + overflow: "hidden" + } + }, + [`${itemCls}-progress`]: { + bottom: uploadProgressOffset, + width: `calc(100% - ${(0, import_cssinjs.unit)(calc(token.paddingSM).mul(2).equal())})`, + marginTop: 0, + paddingInlineStart: calc(uploadThumbnailSize).add(token.paddingXS).equal() + } + }, + [`${itemCls}-error`]: { + borderColor: token.colorError, + // Adjust the color of the error icon : https://github.com/ant-design/ant-design/pull/24160 + [`${itemCls}-thumbnail ${iconCls}`]: { + [`svg path[fill='${import_colors.blue[0]}']`]: { + fill: token.colorErrorBg + }, + [`svg path[fill='${import_colors.blue.primary}']`]: { + fill: token.colorError + } + } + }, + [`${itemCls}-uploading`]: { + borderStyle: "dashed", + [`${itemCls}-name`]: { + marginBottom: uploadProgressOffset + } + } + }, + [`${listCls}${listCls}-picture-circle ${itemCls}`]: { + [`&, &::before, ${itemCls}-thumbnail`]: { + borderRadius: "50%" + } + } + } + }; +}; +var genPictureCardStyle = (token) => { + const { componentCls, iconCls, fontSizeLG, colorTextLightSolid, calc } = token; + const listCls = `${componentCls}-list`; + const itemCls = `${listCls}-item`; + const uploadPictureCardSize = token.uploadPicCardSize; + return { + [` + ${componentCls}-wrapper${componentCls}-picture-card-wrapper, + ${componentCls}-wrapper${componentCls}-picture-circle-wrapper + `]: { + ...(0, import_style.clearFix)(), + display: "inline-block", + width: "100%", + [`${componentCls}${componentCls}-select`]: { + width: uploadPictureCardSize, + height: uploadPictureCardSize, + marginInlineEnd: token.marginXS, + marginBottom: token.marginXS, + textAlign: "center", + verticalAlign: "top", + backgroundColor: token.colorFillAlter, + border: `${(0, import_cssinjs.unit)(token.lineWidth)} dashed ${token.colorBorder}`, + borderRadius: token.borderRadiusLG, + cursor: "pointer", + transition: `border-color ${token.motionDurationSlow}`, + [`> ${componentCls}`]: { + display: "flex", + alignItems: "center", + justifyContent: "center", + height: "100%", + textAlign: "center" + }, + [`&:not(${componentCls}-disabled):hover`]: { + borderColor: token.colorPrimary + } + }, + // list + [`${listCls}${listCls}-picture-card, ${listCls}${listCls}-picture-circle`]: { + [`${listCls}-item-container`]: { + display: "inline-block", + width: uploadPictureCardSize, + height: uploadPictureCardSize, + marginBlock: `0 ${(0, import_cssinjs.unit)(token.marginXS)}`, + marginInline: `0 ${(0, import_cssinjs.unit)(token.marginXS)}`, + verticalAlign: "top" + }, + "&::after": { + display: "none" + }, + [itemCls]: { + height: "100%", + margin: 0, + "&::before": { + position: "absolute", + zIndex: 1, + width: `calc(100% - ${(0, import_cssinjs.unit)(calc(token.paddingXS).mul(2).equal())})`, + height: `calc(100% - ${(0, import_cssinjs.unit)(calc(token.paddingXS).mul(2).equal())})`, + backgroundColor: token.colorBgMask, + opacity: 0, + transition: `all ${token.motionDurationSlow}`, + content: '" "' + } + }, + [`${itemCls}:hover`]: { + [`&::before, ${itemCls}-actions`]: { + opacity: 1 + } + }, + [`${itemCls}-actions`]: { + position: "absolute", + insetInlineStart: 0, + zIndex: 10, + width: "100%", + whiteSpace: "nowrap", + textAlign: "center", + opacity: 0, + transition: `all ${token.motionDurationSlow}`, + [` + ${iconCls}-eye, + ${iconCls}-download, + ${iconCls}-delete + `]: { + zIndex: 10, + width: fontSizeLG, + margin: `0 ${(0, import_cssinjs.unit)(token.marginXXS)}`, + fontSize: fontSizeLG, + cursor: "pointer", + transition: `all ${token.motionDurationSlow}`, + color: colorTextLightSolid, + "&:hover": { + color: colorTextLightSolid + }, + svg: { + verticalAlign: "baseline" + } + } + }, + [`${itemCls}-thumbnail, ${itemCls}-thumbnail img`]: { + position: "static", + display: "block", + width: "100%", + height: "100%", + objectFit: "contain" + }, + [`${itemCls}-name`]: { + display: "none", + textAlign: "center" + }, + [`${itemCls}-file + ${itemCls}-name`]: { + position: "absolute", + bottom: token.margin, + display: "block", + width: `calc(100% - ${(0, import_cssinjs.unit)(calc(token.paddingXS).mul(2).equal())})` + }, + [`${itemCls}-uploading`]: { + [`&${itemCls}`]: { + backgroundColor: token.colorFillAlter + }, + [`&::before, ${iconCls}-eye, ${iconCls}-download, ${iconCls}-delete`]: { + display: "none" + } + }, + [`${itemCls}-progress`]: { + bottom: token.marginXL, + width: `calc(100% - ${(0, import_cssinjs.unit)(calc(token.paddingXS).mul(2).equal())})`, + paddingInlineStart: 0 + } + } + }, + [`${componentCls}-wrapper${componentCls}-picture-circle-wrapper`]: { + [`${componentCls}${componentCls}-select`]: { + borderRadius: "50%" + } + } + }; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + genPictureCardStyle, + genPictureStyle +}); diff --git a/packages/meta/lib/upload/style/rtl.d.ts b/packages/meta/lib/upload/style/rtl.d.ts new file mode 100644 index 0000000..67fcebd --- /dev/null +++ b/packages/meta/lib/upload/style/rtl.d.ts @@ -0,0 +1,4 @@ +import type { UploadToken } from '.'; +import type { GenerateStyle } from '../../theme/internal'; +declare const genRtlStyle: GenerateStyle; +export default genRtlStyle; diff --git a/packages/meta/lib/upload/style/rtl.js b/packages/meta/lib/upload/style/rtl.js new file mode 100644 index 0000000..a31d2de --- /dev/null +++ b/packages/meta/lib/upload/style/rtl.js @@ -0,0 +1,33 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/style/rtl.ts +var rtl_exports = {}; +__export(rtl_exports, { + default: () => rtl_default +}); +module.exports = __toCommonJS(rtl_exports); +var genRtlStyle = (token) => { + const { componentCls } = token; + return { + [`${componentCls}-rtl`]: { + direction: "rtl" + } + }; +}; +var rtl_default = genRtlStyle; diff --git a/packages/meta/lib/upload/utils.d.ts b/packages/meta/lib/upload/utils.d.ts new file mode 100644 index 0000000..1b5f202 --- /dev/null +++ b/packages/meta/lib/upload/utils.d.ts @@ -0,0 +1,8 @@ +import type { InternalUploadFile, RcFile, UploadFile } from './interface'; +export declare function file2Obj(file: RcFile): InternalUploadFile; +/** Upload fileList. Replace file if exist or just push into it. */ +export declare function updateFileList(file: UploadFile, fileList: (UploadFile | Readonly)[]): (UploadFile | Readonly>)[]; +export declare function getFileItem(file: RcFile, fileList: (UploadFile | Readonly)[]): UploadFile | Readonly>; +export declare function removeFileItem(file: UploadFile, fileList: (UploadFile | Readonly)[]): (UploadFile | Readonly>)[] | null; +export declare const isImageUrl: (file: UploadFile) => boolean; +export declare function previewImage(file: File | Blob): Promise; diff --git a/packages/meta/lib/upload/utils.js b/packages/meta/lib/upload/utils.js new file mode 100644 index 0000000..62b8912 --- /dev/null +++ b/packages/meta/lib/upload/utils.js @@ -0,0 +1,150 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/upload/utils.ts +var utils_exports = {}; +__export(utils_exports, { + file2Obj: () => file2Obj, + getFileItem: () => getFileItem, + isImageUrl: () => isImageUrl, + previewImage: () => previewImage, + removeFileItem: () => removeFileItem, + updateFileList: () => updateFileList +}); +module.exports = __toCommonJS(utils_exports); +function file2Obj(file) { + return { + ...file, + lastModified: file.lastModified, + lastModifiedDate: file.lastModifiedDate, + name: file.name, + size: file.size, + type: file.type, + uid: file.uid, + percent: 0, + originFileObj: file + }; +} +function updateFileList(file, fileList) { + const nextFileList = [...fileList]; + const fileIndex = nextFileList.findIndex(({ uid }) => uid === file.uid); + if (fileIndex === -1) { + nextFileList.push(file); + } else { + nextFileList[fileIndex] = file; + } + return nextFileList; +} +function getFileItem(file, fileList) { + const matchKey = file.uid !== void 0 ? "uid" : "name"; + return fileList.filter((item) => item[matchKey] === file[matchKey])[0]; +} +function removeFileItem(file, fileList) { + const matchKey = file.uid !== void 0 ? "uid" : "name"; + const removed = fileList.filter((item) => item[matchKey] !== file[matchKey]); + if (removed.length === fileList.length) { + return null; + } + return removed; +} +var extname = (url = "") => { + const temp = url.split("/"); + const filename = temp[temp.length - 1]; + const filenameWithoutSuffix = filename.split(/#|\?/)[0]; + return (/\.[^./\\]*$/.exec(filenameWithoutSuffix) || [""])[0]; +}; +var isImageFileType = (type) => type.indexOf("image/") === 0; +var isImageUrl = (file) => { + if (file.type && !file.thumbUrl) { + return isImageFileType(file.type); + } + const url = file.thumbUrl || file.url || ""; + const extension = extname(url); + if (/^data:image\//.test(url) || /(webp|svg|png|gif|jpg|jpeg|jfif|bmp|dpg|ico|heic|heif)$/i.test(extension)) { + return true; + } + if (/^data:/.test(url)) { + return false; + } + if (extension) { + return false; + } + return true; +}; +var MEASURE_SIZE = 200; +function previewImage(file) { + return new Promise((resolve) => { + if (!file.type || !isImageFileType(file.type)) { + resolve(""); + return; + } + const canvas = document.createElement("canvas"); + canvas.width = MEASURE_SIZE; + canvas.height = MEASURE_SIZE; + canvas.style.cssText = `position: fixed; left: 0; top: 0; width: ${MEASURE_SIZE}px; height: ${MEASURE_SIZE}px; z-index: 9999; display: none;`; + document.body.appendChild(canvas); + const ctx = canvas.getContext("2d"); + const img = new Image(); + img.onload = () => { + const { width, height } = img; + let drawWidth = MEASURE_SIZE; + let drawHeight = MEASURE_SIZE; + let offsetX = 0; + let offsetY = 0; + if (width > height) { + drawHeight = height * (MEASURE_SIZE / width); + offsetY = -(drawHeight - drawWidth) / 2; + } else { + drawWidth = width * (MEASURE_SIZE / height); + offsetX = -(drawWidth - drawHeight) / 2; + } + ctx.drawImage(img, offsetX, offsetY, drawWidth, drawHeight); + const dataURL = canvas.toDataURL(); + document.body.removeChild(canvas); + window.URL.revokeObjectURL(img.src); + resolve(dataURL); + }; + img.crossOrigin = "anonymous"; + if (file.type.startsWith("image/svg+xml")) { + const reader = new FileReader(); + reader.onload = () => { + if (reader.result) + img.src = reader.result; + }; + reader.readAsDataURL(file); + } else if (file.type.startsWith("image/gif")) { + const reader = new FileReader(); + reader.onload = () => { + if (reader.result) + resolve(reader.result); + }; + reader.readAsDataURL(file); + } else { + img.src = window.URL.createObjectURL(file); + } + }); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + file2Obj, + getFileItem, + isImageUrl, + previewImage, + removeFileItem, + updateFileList +}); diff --git a/packages/meta/lib/utils/constants.js b/packages/meta/lib/utils/constants.js new file mode 100644 index 0000000..a565792 --- /dev/null +++ b/packages/meta/lib/utils/constants.js @@ -0,0 +1,42 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/utils/constants.ts +var constants_exports = {}; +__export(constants_exports, { + CROP_TYPE: () => CROP_TYPE, + defaultAlignOption: () => defaultAlignOption +}); +module.exports = __toCommonJS(constants_exports); +var CROP_TYPE = { + CUSTOM: "CUSTOM", + AUTO: "AUTO" +}; +var defaultAlignOption = { + points: ["bl", "br"], + offset: [6, 0], + overflow: { + adjustX: true, + adjustY: true + } +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + CROP_TYPE, + defaultAlignOption +}); diff --git a/packages/meta/lib/utils/index.d.ts b/packages/meta/lib/utils/index.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/meta/lib/utils/index.js b/packages/meta/lib/utils/index.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/meta/lib/version/index.d.ts b/packages/meta/lib/version/index.d.ts new file mode 100644 index 0000000..1bb395b --- /dev/null +++ b/packages/meta/lib/version/index.d.ts @@ -0,0 +1,2 @@ +declare const _default: "3.2"; +export default _default; diff --git a/packages/meta/lib/version/index.js b/packages/meta/lib/version/index.js new file mode 100644 index 0000000..79773d8 --- /dev/null +++ b/packages/meta/lib/version/index.js @@ -0,0 +1,25 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/version/index.ts +var version_exports = {}; +__export(version_exports, { + default: () => version_default +}); +module.exports = __toCommonJS(version_exports); +var version_default = "3.2"; diff --git a/packages/meta/lib/watermark/context.d.ts b/packages/meta/lib/watermark/context.d.ts new file mode 100644 index 0000000..0a07cbe --- /dev/null +++ b/packages/meta/lib/watermark/context.d.ts @@ -0,0 +1,8 @@ +import * as React from 'react'; +export interface WatermarkContextProps { + add: (ele: HTMLElement) => void; + remove: (ele: HTMLElement) => void; +} +declare const WatermarkContext: React.Context; +export declare function usePanelRef(panelSelector?: string): (ele: HTMLElement | null) => void; +export default WatermarkContext; diff --git a/packages/meta/lib/watermark/context.js b/packages/meta/lib/watermark/context.js new file mode 100644 index 0000000..76219df --- /dev/null +++ b/packages/meta/lib/watermark/context.js @@ -0,0 +1,62 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/watermark/context.ts +var context_exports = {}; +__export(context_exports, { + default: () => context_default, + usePanelRef: () => usePanelRef +}); +module.exports = __toCommonJS(context_exports); +var import_rc_util = require("rc-util"); +var React = __toESM(require("react")); +function voidFunc() { +} +var WatermarkContext = React.createContext({ + add: voidFunc, + remove: voidFunc +}); +function usePanelRef(panelSelector) { + const watermark = React.useContext(WatermarkContext); + const panelEleRef = React.useRef(); + const panelRef = (0, import_rc_util.useEvent)((ele) => { + if (ele) { + const innerContentEle = panelSelector ? ele.querySelector(panelSelector) : ele; + watermark.add(innerContentEle); + panelEleRef.current = innerContentEle; + } else { + watermark.remove(panelEleRef.current); + } + }); + return panelRef; +} +var context_default = WatermarkContext; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + usePanelRef +}); diff --git a/packages/meta/lib/watermark/index.d.ts b/packages/meta/lib/watermark/index.d.ts new file mode 100644 index 0000000..b13715d --- /dev/null +++ b/packages/meta/lib/watermark/index.d.ts @@ -0,0 +1,26 @@ +import React from 'react'; +export interface WatermarkProps { + zIndex?: number; + rotate?: number; + width?: number; + height?: number; + image?: string; + content?: string | string[]; + font?: { + color?: CanvasFillStrokeStyles['fillStyle']; + fontSize?: number | string; + fontWeight?: 'normal' | 'light' | 'weight' | number; + fontStyle?: 'none' | 'normal' | 'italic' | 'oblique'; + fontFamily?: string; + textAlign?: CanvasTextAlign; + }; + style?: React.CSSProperties; + className?: string; + rootClassName?: string; + gap?: [number, number]; + offset?: [number, number]; + children?: React.ReactNode; + inherit?: boolean; +} +declare const Watermark: React.FC; +export default Watermark; diff --git a/packages/meta/lib/watermark/index.js b/packages/meta/lib/watermark/index.js new file mode 100644 index 0000000..b6577b7 --- /dev/null +++ b/packages/meta/lib/watermark/index.js @@ -0,0 +1,246 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/watermark/index.tsx +var watermark_exports = {}; +__export(watermark_exports, { + default: () => watermark_default +}); +module.exports = __toCommonJS(watermark_exports); +var import_react = __toESM(require("react")); +var import_mutate_observer = require("@rc-component/mutate-observer"); +var import_classnames = __toESM(require("classnames")); +var import_internal = require("../theme/internal"); +var import_context = __toESM(require("./context")); +var import_useClips = __toESM(require("./useClips")); +var import_useRafDebounce = __toESM(require("./useRafDebounce")); +var import_useWatermark = __toESM(require("./useWatermark")); +var import_utils = require("./utils"); +function getSizeDiff(prev, next) { + return prev.size === next.size ? prev : next; +} +var DEFAULT_GAP_X = 100; +var DEFAULT_GAP_Y = 100; +var Watermark = (props) => { + const { + /** + * The antd content layer zIndex is basically below 10 + * https://github.com/ant-design/ant-design/blob/6192403b2ce517c017f9e58a32d58774921c10cd/components/style/themes/default.less#L335 + */ + zIndex = 9, + rotate = -22, + width, + height, + image, + content, + font = {}, + style, + className, + rootClassName, + gap = [DEFAULT_GAP_X, DEFAULT_GAP_Y], + offset, + children, + inherit = true + } = props; + const [, token] = (0, import_internal.useToken)(); + const { + color = token.colorFill, + fontSize = token.fontSizeLG, + fontWeight = "normal", + fontStyle = "normal", + fontFamily = "sans-serif", + textAlign = "center" + } = font; + const [gapX = DEFAULT_GAP_X, gapY = DEFAULT_GAP_Y] = gap; + const gapXCenter = gapX / 2; + const gapYCenter = gapY / 2; + const offsetLeft = (offset == null ? void 0 : offset[0]) ?? gapXCenter; + const offsetTop = (offset == null ? void 0 : offset[1]) ?? gapYCenter; + const markStyle = import_react.default.useMemo(() => { + const mergedStyle = { + zIndex, + position: "absolute", + left: 0, + top: 0, + width: "100%", + height: "100%", + pointerEvents: "none", + backgroundRepeat: "repeat" + }; + let positionLeft = offsetLeft - gapXCenter; + let positionTop = offsetTop - gapYCenter; + if (positionLeft > 0) { + mergedStyle.left = `${positionLeft}px`; + mergedStyle.width = `calc(100% - ${positionLeft}px)`; + positionLeft = 0; + } + if (positionTop > 0) { + mergedStyle.top = `${positionTop}px`; + mergedStyle.height = `calc(100% - ${positionTop}px)`; + positionTop = 0; + } + mergedStyle.backgroundPosition = `${positionLeft}px ${positionTop}px`; + return mergedStyle; + }, [zIndex, offsetLeft, gapXCenter, offsetTop, gapYCenter]); + const [container, setContainer] = import_react.default.useState(); + const [subElements, setSubElements] = import_react.default.useState(/* @__PURE__ */ new Set()); + const targetElements = import_react.default.useMemo(() => { + const list = container ? [container] : []; + return [...list, ...Array.from(subElements)]; + }, [container, subElements]); + const getMarkSize = (ctx) => { + let defaultWidth = 120; + let defaultHeight = 64; + if (!image && ctx.measureText) { + ctx.font = `${Number(fontSize)}px ${fontFamily}`; + const contents = Array.isArray(content) ? content : [content]; + const sizes = contents.map((item) => { + const metrics = ctx.measureText(item); + return [metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent]; + }); + defaultWidth = Math.ceil(Math.max(...sizes.map((size) => size[0]))); + defaultHeight = Math.ceil(Math.max(...sizes.map((size) => size[1]))) * contents.length + (contents.length - 1) * import_useClips.FontGap; + } + return [width ?? defaultWidth, height ?? defaultHeight]; + }; + const getClips = (0, import_useClips.default)(); + const [watermarkInfo, setWatermarkInfo] = import_react.default.useState( + null + ); + const renderWatermark = () => { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + if (ctx) { + const ratio = (0, import_utils.getPixelRatio)(); + const [markWidth, markHeight] = getMarkSize(ctx); + const drawCanvas = (drawContent) => { + const [nextClips, clipWidth] = getClips( + drawContent || "", + rotate, + ratio, + markWidth, + markHeight, + { + color, + fontSize, + fontStyle, + fontWeight, + fontFamily, + textAlign + }, + gapX, + gapY + ); + setWatermarkInfo([nextClips, clipWidth]); + }; + if (image) { + const img = new Image(); + img.onload = () => { + drawCanvas(img); + }; + img.onerror = () => { + drawCanvas(content); + }; + img.crossOrigin = "anonymous"; + img.referrerPolicy = "no-referrer"; + img.src = image; + } else { + drawCanvas(content); + } + } + }; + const syncWatermark = (0, import_useRafDebounce.default)(renderWatermark); + const [appendWatermark, removeWatermark, isWatermarkEle] = (0, import_useWatermark.default)(markStyle); + (0, import_react.useEffect)(() => { + if (watermarkInfo) { + targetElements.forEach((holder) => { + appendWatermark(watermarkInfo[0], watermarkInfo[1], holder); + }); + } + }, [watermarkInfo, targetElements]); + const onMutate = (mutations) => { + mutations.forEach((mutation) => { + if ((0, import_utils.reRendering)(mutation, isWatermarkEle)) { + syncWatermark(); + } + }); + }; + (0, import_mutate_observer.useMutateObserver)(targetElements, onMutate); + (0, import_react.useEffect)(syncWatermark, [ + rotate, + zIndex, + width, + height, + image, + content, + color, + fontSize, + fontWeight, + fontStyle, + fontFamily, + textAlign, + gapX, + gapY, + offsetLeft, + offsetTop + ]); + const watermarkContext = import_react.default.useMemo( + () => ({ + add: (ele) => { + setSubElements((prev) => { + const clone = new Set(prev); + clone.add(ele); + return getSizeDiff(prev, clone); + }); + }, + remove: (ele) => { + removeWatermark(ele); + setSubElements((prev) => { + const clone = new Set(prev); + clone.delete(ele); + return getSizeDiff(prev, clone); + }); + } + }), + [] + ); + const childNode = inherit ? /* @__PURE__ */ import_react.default.createElement(import_context.default.Provider, { value: watermarkContext }, children) : children; + return /* @__PURE__ */ import_react.default.createElement( + "div", + { + ref: setContainer, + className: (0, import_classnames.default)(className, rootClassName), + style: { position: "relative", ...style } + }, + childNode + ); +}; +if (process.env.NODE_ENV !== "production") { + Watermark.displayName = "Watermark"; +} +var watermark_default = Watermark; diff --git a/packages/meta/lib/watermark/useClips.d.ts b/packages/meta/lib/watermark/useClips.d.ts new file mode 100644 index 0000000..c00fa28 --- /dev/null +++ b/packages/meta/lib/watermark/useClips.d.ts @@ -0,0 +1,7 @@ +import type { WatermarkProps } from '.'; +export declare const FontGap = 3; +/** + * Get the clips of text content. + * This is a lazy hook function since SSR no need this + */ +export default function useClips(): (content: NonNullable | HTMLImageElement, rotate: number, ratio: number, width: number, height: number, font: Required>, gapX: number, gapY: number) => [dataURL: string, finalWidth: number, finalHeight: number]; diff --git a/packages/meta/lib/watermark/useClips.js b/packages/meta/lib/watermark/useClips.js new file mode 100644 index 0000000..5e5167b --- /dev/null +++ b/packages/meta/lib/watermark/useClips.js @@ -0,0 +1,118 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/watermark/useClips.ts +var useClips_exports = {}; +__export(useClips_exports, { + FontGap: () => FontGap, + default: () => useClips +}); +module.exports = __toCommonJS(useClips_exports); +var FontGap = 3; +function prepareCanvas(width, height, ratio = 1) { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + const realWidth = width * ratio; + const realHeight = height * ratio; + canvas.setAttribute("width", `${realWidth}px`); + canvas.setAttribute("height", `${realHeight}px`); + ctx.save(); + return [ctx, canvas, realWidth, realHeight]; +} +function useClips() { + function getClips(content, rotate, ratio, width, height, font, gapX, gapY) { + const [ctx, canvas, contentWidth, contentHeight] = prepareCanvas(width, height, ratio); + if (content instanceof HTMLImageElement) { + ctx.drawImage(content, 0, 0, contentWidth, contentHeight); + } else { + const { color, fontSize, fontStyle, fontWeight, fontFamily, textAlign } = font; + const mergedFontSize = Number(fontSize) * ratio; + ctx.font = `${fontStyle} normal ${fontWeight} ${mergedFontSize}px/${height}px ${fontFamily}`; + ctx.fillStyle = color; + ctx.textAlign = textAlign; + ctx.textBaseline = "top"; + const contents = Array.isArray(content) ? content : [content]; + contents == null ? void 0 : contents.forEach((item, index) => { + ctx.fillText(item ?? "", contentWidth / 2, index * (mergedFontSize + FontGap * ratio)); + }); + } + const angle = Math.PI / 180 * Number(rotate); + const maxSize = Math.max(width, height); + const [rCtx, rCanvas, realMaxSize] = prepareCanvas(maxSize, maxSize, ratio); + rCtx.translate(realMaxSize / 2, realMaxSize / 2); + rCtx.rotate(angle); + if (contentWidth > 0 && contentHeight > 0) { + rCtx.drawImage(canvas, -contentWidth / 2, -contentHeight / 2); + } + function getRotatePos(x, y) { + const targetX = x * Math.cos(angle) - y * Math.sin(angle); + const targetY = x * Math.sin(angle) + y * Math.cos(angle); + return [targetX, targetY]; + } + let left = 0; + let right = 0; + let top = 0; + let bottom = 0; + const halfWidth = contentWidth / 2; + const halfHeight = contentHeight / 2; + const points = [ + [0 - halfWidth, 0 - halfHeight], + [0 + halfWidth, 0 - halfHeight], + [0 + halfWidth, 0 + halfHeight], + [0 - halfWidth, 0 + halfHeight] + ]; + points.forEach(([x, y]) => { + const [targetX, targetY] = getRotatePos(x, y); + left = Math.min(left, targetX); + right = Math.max(right, targetX); + top = Math.min(top, targetY); + bottom = Math.max(bottom, targetY); + }); + const cutLeft = left + realMaxSize / 2; + const cutTop = top + realMaxSize / 2; + const cutWidth = right - left; + const cutHeight = bottom - top; + const realGapX = gapX * ratio; + const realGapY = gapY * ratio; + const filledWidth = (cutWidth + realGapX) * 2; + const filledHeight = cutHeight + realGapY; + const [fCtx, fCanvas] = prepareCanvas(filledWidth, filledHeight); + function drawImg(targetX = 0, targetY = 0) { + fCtx.drawImage( + rCanvas, + cutLeft, + cutTop, + cutWidth, + cutHeight, + targetX, + targetY, + cutWidth, + cutHeight + ); + } + drawImg(); + drawImg(cutWidth + realGapX, -cutHeight / 2 - realGapY / 2); + drawImg(cutWidth + realGapX, +cutHeight / 2 + realGapY / 2); + return [fCanvas.toDataURL(), filledWidth / ratio, filledHeight / ratio]; + } + return getClips; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + FontGap +}); diff --git a/packages/meta/lib/watermark/useRafDebounce.d.ts b/packages/meta/lib/watermark/useRafDebounce.d.ts new file mode 100644 index 0000000..e1fd572 --- /dev/null +++ b/packages/meta/lib/watermark/useRafDebounce.d.ts @@ -0,0 +1,4 @@ +/** + * Callback will only execute last one for each raf + */ +export default function useRafDebounce(callback: VoidFunction): () => void; diff --git a/packages/meta/lib/watermark/useRafDebounce.js b/packages/meta/lib/watermark/useRafDebounce.js new file mode 100644 index 0000000..7a43713 --- /dev/null +++ b/packages/meta/lib/watermark/useRafDebounce.js @@ -0,0 +1,52 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/watermark/useRafDebounce.ts +var useRafDebounce_exports = {}; +__export(useRafDebounce_exports, { + default: () => useRafDebounce +}); +module.exports = __toCommonJS(useRafDebounce_exports); +var import_react = __toESM(require("react")); +var import_raf = __toESM(require("rc-util/lib/raf")); +var import_rc_util = require("rc-util"); +function useRafDebounce(callback) { + const executeRef = import_react.default.useRef(false); + const rafRef = import_react.default.useRef(); + const wrapperCallback = (0, import_rc_util.useEvent)(callback); + return () => { + if (executeRef.current) { + return; + } + executeRef.current = true; + wrapperCallback(); + rafRef.current = (0, import_raf.default)(() => { + executeRef.current = false; + }); + }; +} diff --git a/packages/meta/lib/watermark/useWatermark.d.ts b/packages/meta/lib/watermark/useWatermark.d.ts new file mode 100644 index 0000000..3276756 --- /dev/null +++ b/packages/meta/lib/watermark/useWatermark.d.ts @@ -0,0 +1,13 @@ +import * as React from 'react'; +/** + * Base size of the canvas, 1 for parallel layout and 2 for alternate layout + * Only alternate layout is currently supported + */ +export declare const BaseSize = 2; +export declare const FontGap = 3; +export type AppendWatermark = (base64Url: string, markWidth: number, container: HTMLElement) => void; +export default function useWatermark(markStyle: React.CSSProperties): [ + appendWatermark: AppendWatermark, + removeWatermark: (container: HTMLElement) => void, + isWatermarkEle: (ele: Node) => boolean +]; diff --git a/packages/meta/lib/watermark/useWatermark.js b/packages/meta/lib/watermark/useWatermark.js new file mode 100644 index 0000000..84a596d --- /dev/null +++ b/packages/meta/lib/watermark/useWatermark.js @@ -0,0 +1,80 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/watermark/useWatermark.ts +var useWatermark_exports = {}; +__export(useWatermark_exports, { + BaseSize: () => BaseSize, + FontGap: () => FontGap, + default: () => useWatermark +}); +module.exports = __toCommonJS(useWatermark_exports); +var React = __toESM(require("react")); +var import_utils = require("./utils"); +var BaseSize = 2; +var FontGap = 3; +var emphasizedStyle = { + visibility: "visible !important" +}; +function useWatermark(markStyle) { + const [watermarkMap] = React.useState(() => /* @__PURE__ */ new Map()); + const appendWatermark = (base64Url, markWidth, container) => { + if (container) { + if (!watermarkMap.get(container)) { + const newWatermarkEle = document.createElement("div"); + watermarkMap.set(container, newWatermarkEle); + } + const watermarkEle = watermarkMap.get(container); + watermarkEle.setAttribute( + "style", + (0, import_utils.getStyleStr)({ + ...markStyle, + backgroundImage: `url('${base64Url}')`, + backgroundSize: `${Math.floor(markWidth)}px`, + ...emphasizedStyle + }) + ); + watermarkEle.removeAttribute("class"); + container.append(watermarkEle); + } + }; + const removeWatermark = (container) => { + const watermarkEle = watermarkMap.get(container); + if (watermarkEle && container) { + container.removeChild(watermarkEle); + } + watermarkMap.delete(container); + }; + const isWatermarkEle = (ele) => Array.from(watermarkMap.values()).includes(ele); + return [appendWatermark, removeWatermark, isWatermarkEle]; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + BaseSize, + FontGap +}); diff --git a/packages/meta/lib/watermark/utils.d.ts b/packages/meta/lib/watermark/utils.d.ts new file mode 100644 index 0000000..799f8a3 --- /dev/null +++ b/packages/meta/lib/watermark/utils.d.ts @@ -0,0 +1,8 @@ +/// +/** converting camel-cased strings to be lowercase and link it with Separato */ +export declare function toLowercaseSeparator(key: string): string; +export declare function getStyleStr(style: React.CSSProperties): string; +/** Returns the ratio of the device's physical pixel resolution to the css pixel resolution */ +export declare function getPixelRatio(): number; +/** Whether to re-render the watermark */ +export declare const reRendering: (mutation: MutationRecord, isWatermarkEle: (ele: Node) => boolean) => boolean; diff --git a/packages/meta/lib/watermark/utils.js b/packages/meta/lib/watermark/utils.js new file mode 100644 index 0000000..7df1d32 --- /dev/null +++ b/packages/meta/lib/watermark/utils.js @@ -0,0 +1,53 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/watermark/utils.ts +var utils_exports = {}; +__export(utils_exports, { + getPixelRatio: () => getPixelRatio, + getStyleStr: () => getStyleStr, + reRendering: () => reRendering, + toLowercaseSeparator: () => toLowercaseSeparator +}); +module.exports = __toCommonJS(utils_exports); +function toLowercaseSeparator(key) { + return key.replace(/([A-Z])/g, "-$1").toLowerCase(); +} +function getStyleStr(style) { + return Object.keys(style).map((key) => `${toLowercaseSeparator(key)}: ${style[key]};`).join(" "); +} +function getPixelRatio() { + return window.devicePixelRatio || 1; +} +var reRendering = (mutation, isWatermarkEle) => { + let flag = false; + if (mutation.removedNodes.length) { + flag = Array.from(mutation.removedNodes).some((node) => isWatermarkEle(node)); + } + if (mutation.type === "attributes" && isWatermarkEle(mutation.target)) { + flag = true; + } + return flag; +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getPixelRatio, + getStyleStr, + reRendering, + toLowercaseSeparator +}); diff --git a/packages/meta/package.json b/packages/meta/package.json index 3d3dfea..b1b58a0 100644 --- a/packages/meta/package.json +++ b/packages/meta/package.json @@ -1,6 +1,6 @@ { "name": "@zhst/meta", - "version": "0.7.0", + "version": "0.9.7", "description": "原子组件", "keywords": [ "meta", @@ -67,9 +67,9 @@ "@types/tar": "^6.1.10", "@types/throttle-debounce": "^5.0.2", "@types/warning": "^3.0.3", - "@types/zhst": "workspace:^", "@typescript-eslint/eslint-plugin": "^6.17.0", "@typescript-eslint/parser": "^6.17.0", + "@zhst/types": "workspace:^", "react": "^18.2.0", "react-copy-to-clipboard": "^5.1.0", "react-countup": "^6.5.0", @@ -88,6 +88,7 @@ "@types/downloadjs": "^1.4.6", "@zhst/func": "workspace:^", "@zhst/hooks": "workspace:^", + "@zhst/icon": "workspace:^", "@zhst/meta": "workspace:^", "antd": "^5.12.5", "antd-img-crop": "^4.21.0", diff --git a/packages/meta/src/BigImagePreview/BigImagePreview.tsx b/packages/meta/src/BigImagePreview/BigImagePreview.tsx index 78e9752..b531541 100644 --- a/packages/meta/src/BigImagePreview/BigImagePreview.tsx +++ b/packages/meta/src/BigImagePreview/BigImagePreview.tsx @@ -1,28 +1,18 @@ -import React, { useEffect, ReactElement, useState, useCallback, useRef, useImperativeHandle } from 'react'; +import React, { useEffect, ReactElement, useState, useRef, useImperativeHandle } from 'react'; import classNames from 'classnames'; -import { useLatest } from '@zhst/hooks'; import { get, pick, isNull, generateImg, dataURLToBlob, - // @ts-ignore - getOdRect, - // @ts-ignore - getExtendRect, - // @ts-ignore - getTransformRect, - // @ts-ignore - getRotateImg, getTransforms, addEventListenerWrapper, getFileByRect -// @ts-ignore } from '@zhst/func'; import Align from 'rc-align'; import { Button, Empty } from '..'; -import { type Rect, type IScreenshotButtonProp, type AlignType, type IOdRectOrigin } from '@zhst/types' +import { type Rect, type IScreenshotButtonProp, type AlignType } from '@zhst/types' import Icon from '../iconfont'; import { Cropper, @@ -35,10 +25,15 @@ import { import BtnGroup from './components/BtnGroup'; import './index.less' import { defaultAlignOption, CROP_TYPE } from '../utils/constants' +import { + getOdRect, + IOdObject, + getExtendRect, + getTransformRect, + getRotateImg, } from './bigImagePreviewHelper' const componentName = `zhst-image__img-view`; - export interface ViewOption { /* 图片url */ image?: string | HTMLImageElement; @@ -72,7 +67,7 @@ export interface ImgViewProps extends React.HTMLAttributes { attachImg?: Array<{ label: string; url: string }>; // 缩略图列表 odRect?: Rect score?: number - objects?: IOdRectOrigin[] // 图片人物框选 + objects?: IOdObject } showAttachImgLabel?: boolean; // 是否显示缩略图 showOpt?: boolean; // 是否显示操作面板 @@ -82,8 +77,28 @@ export interface ImgViewProps extends React.HTMLAttributes { screenshotButtonAlign?: AlignType; screenshotButtonRender?: (screenshotButtonProp: IScreenshotButtonProp) => ReactElement; hideLeftTopBtn?: boolean; + onDraw?: (obj: { + rectList: any; + extendRectList: { + x: number; + y: number; + w: number; + h: number; + }[]; + selectIndex: number; + imgKey: string; + }) => void showScore?: boolean // 是否显示相似度 viewOption?: ViewOption; + onRectSelect?: (data: { + rectList: any[]; + extendRectList: any[]; + selectIndex: number; + imgKey: string; + }) => void + type?: 'CUSTOM' | 'AUTO' + hideTypeBtns?: boolean + customEmpty?: any } export interface ImgViewRef { /* 图片实例 */ @@ -132,14 +147,18 @@ export const BigImagePreview = React.forwardRef((props const { width, height, - showScore = true, + showScore = false, data, showOpt = false, showAttachImgLabel = true, screenshotButtonAlign = defaultAlignOption, - screenshotButtonRender = () =>

回调DOM
, + screenshotButtonRender = () =>
回调DOM
, hideLeftTopBtn = true, - viewOption = {} + onDraw, + viewOption = {}, + type, + hideTypeBtns, + customEmpty, } = props; const { imageKey, @@ -149,18 +168,13 @@ export const BigImagePreview = React.forwardRef((props objects = [], } = data const imgContainerRef = React.useRef(null); - const [isReady, setIsReady] = useState(false); - const init = useCallback(($container: null) => { - imgContainerRef.current = $container; - setIsReady(true); - }, []); // ============================= viewer ========================= const imgInsRef = useRef(null); const [isImgReady, setIsImgReady] = useState(false); useEffect(() => { - if (!isReady || !imgContainerRef?.current) return; + if (!imgContainerRef?.current) return; const handleReady = addEventListenerWrapper(imgContainerRef.current, EVENT_VIEWER_READY, () => { setIsImgReady(true); }); @@ -181,7 +195,7 @@ export const BigImagePreview = React.forwardRef((props imgInsRef?.current?.destroy?.(); imgInsRef.current = null; }; - }, [isReady, imageKey]); + }, [imageKey]); // ============================= viewer操作按钮 ========================= const handleOptClick = (v: string) => { @@ -202,7 +216,7 @@ export const BigImagePreview = React.forwardRef((props // 手动截图相关参数 const cropInsRef: any = useRef(null); const [showCrop, setShowCrop] = useState(showOpt); - const [cropType, setCropType] = useState(CROP_TYPE['AUTO']); + const [cropType, setCropType] = useState(type || CROP_TYPE['AUTO']); // 自动截图相关参数 const [odList, setOdList] = useState([]); @@ -232,7 +246,8 @@ export const BigImagePreview = React.forwardRef((props }; }, [isImgReady, showCrop, cropType, imageKey]); - const initData = (_objects: IOdRectOrigin[]) => { + // 初始化页面的绘制矩形 + const initData = (_objects: IOdObject | never[]) => { const imgIns = imgInsRef.current; const _odRect = odRect //清理crop @@ -256,7 +271,8 @@ export const BigImagePreview = React.forwardRef((props const shapeList = odList.map((rect: { [x: string]: any; algorithmVersion: any; }) => ({ ...rect, selectAble: true, - id: rect['id'], + id: + ['id'], algorithmVersion: rect.algorithmVersion, })); imgIns.replaceShape(shapeList); @@ -268,7 +284,8 @@ export const BigImagePreview = React.forwardRef((props }); setExtendOdList(extendRect); imgIns.replaceShape(shapeList); - handleShapeSelectRef.current = addEventListenerWrapper(imgContainerRef.current, 'shape-select', (e: { detail: any; }) => { + // 框选监听事件 + handleShapeSelectRef.current = addEventListenerWrapper(imgContainerRef.current, 'shape-select', async (e: { detail: any; }) => { const id = e.detail; setSelectRectId(id); const selectShape = shapeList.find((v: { [x: string]: any; }) => v['id'] === id); @@ -283,6 +300,7 @@ export const BigImagePreview = React.forwardRef((props h: Math.abs(axisRect.y2 - axisRect.y), }; setCropRect(rect); + onDraw?.({ rectList: [rect], extendRectList: [rect], imgKey: imageKey, selectIndex: id }) } else { // @ts-ignore setCropRect(null); @@ -303,15 +321,18 @@ export const BigImagePreview = React.forwardRef((props setSelectAlgorithmVersion(null); setCropRect(null); }); - handlerCropEndRef.current = addEventListenerWrapper(imgContainerRef.current, EVENT_CROP_END, (event: { detail: any; }) => { + handlerCropEndRef.current = addEventListenerWrapper(imgContainerRef.current, EVENT_CROP_END, async (event: { detail: any; }) => { const data = event.detail; setSelectAlgorithmVersion(null); - setCropRect({ + const _rect = { x: data.left, y: data.top, w: data.width, h: data.height, - }); + } + setCropRect(_rect); + const _cropData = await getCropInfo({ type: cropType, rect: _rect }) + onDraw?.(_cropData) alignRef?.current?.forceAlign?.(); }); cropInsRef.current = new Cropper(imgContainerRef.current, { @@ -322,11 +343,10 @@ export const BigImagePreview = React.forwardRef((props } // 获取框选的截图框信息 - const latestCropType = useLatest(cropType); - const latestCropRect = useLatest(cropRect); - const getCropInfo = async (cb: (data: any) => void) => { - const cropType = latestCropType.current; - const cropRect = latestCropRect.current; + const getCropInfo = async (opt: { type: string; rect: Rect }) => { + const { type, rect } = opt + const cropType = type; + const cropRect = rect; const imgIns = imgInsRef.current; const transform = imgIns.targetTransform; let newImgKey = imageKey; @@ -403,8 +423,15 @@ export const BigImagePreview = React.forwardRef((props rectList[index] = newRect; }) ); - cb?.({ rectList, extendRectList, selectIndex, imgKey: newImgKey }) - return { rectList, extendRectList, selectIndex, imgKey: newImgKey }; + + let data = { + rectList, + extendRectList, + selectIndex, + imgKey: newImgKey + } + + return data; }; // 操作界面判断 @@ -426,22 +453,12 @@ export const BigImagePreview = React.forwardRef((props const [selectAttachImgIndex, setSelectAttachImgIndex] = useState(0); const [isZoomin, setIsZoomin] = useState(false); - /** - * 修改当前图片预览下标 - * @param diff 跳转强度 正向后翻、负值向前翻 - */ - const handleChangeIndex = (cb?: () => void) => { - if (!imageKey) return - cb?.() - } - // ============================== Ref =============================== useImperativeHandle(ref, () => ({ imgInsRef, setShowCrop, initData, getCropInfo, - handleChangeIndex })); return ( @@ -454,7 +471,8 @@ export const BigImagePreview = React.forwardRef((props `${componentName}-main`, cropType === CROP_TYPE['AUTO'] && `${componentName}-main--cursor` )} - ref={init} + ref={imgContainerRef} + // style={{ width: width, height: height }} /> {/* 图片操作 */} {!hideLeftTopBtn && ( @@ -465,7 +483,7 @@ export const BigImagePreview = React.forwardRef((props placement="left" /> )} - {showCrop && ( + {!hideTypeBtns && showCrop && ( ((props />
)} - {showScore &&
@@ -575,7 +593,9 @@ export const BigImagePreview = React.forwardRef((props
} : - +
+ {customEmpty || } +
} ); diff --git a/packages/meta/src/BigImagePreview/bigImagePreviewHelper.ts b/packages/meta/src/BigImagePreview/bigImagePreviewHelper.ts index e69de29..653dec6 100644 --- a/packages/meta/src/BigImagePreview/bigImagePreviewHelper.ts +++ b/packages/meta/src/BigImagePreview/bigImagePreviewHelper.ts @@ -0,0 +1,300 @@ +import { cloneDeep, dataURLToBlob, get, isNull } from "@zhst/func"; +import { ObjectType, Rect } from "@zhst/types"; + +const proto = { + Common: { + AlgorithmVersion: { + VERSION_REID_HEAD_ATTR: '形体', + VERSION_FACE: '人脸', + VERSION_NON_MOTOR_VEHICLE: '非机动车', + }, + }, +}; +export const ALGORITHM_VERSION = { + ['7']: '形体', + ['4']: '人脸', + ['6']: '非机动车', +}; + +export const algorithmVersions = [...Object.keys(ALGORITHM_VERSION)] + + +export interface IOdObject { + objects: { + bboxRatio: Rect + timestamp?: string + qualityScore?: string + extendBoxRatio?: any + objectType?: ObjectType + objectIndex?: { + objectId: string + } + sourceObjectId?: string + }[] +} + +/** + * 格式化工具 + * @param originData + * @returns + */ +export const getOdRect = (originData: IOdObject) => { + let data = get(originData, 'objects', []) + .filter((v: any) => !isNull(get(v, 'bboxRatio')) || get(v, 'objectIndex.objectId') !== '0' ) + .map((v: any, index: any) => { + const rect = get(v, 'bboxRatio'); + const extendBox = get(v, 'extendBoxRatio'); + const frameTimestamp = get(v, 'timestamp'); //时间戳创建档案的时候需要 + const qualityScore = get(v, 'qualityScore'); + const algorithmVersion = + get(v, 'objectType') === 'OBJECT_TYPE_PEDESTRAIN' + ? 'VERSION_REID_HEAD_ATTR' + : get(v, 'objectType') === 'OBJECT_TYPE_FACE' + ? 'VERSION_FACE' + : 'VERSION_REID_HEAD_ATTR'; + const objectRectIndex = algorithmVersion === 'VERSION_FACE' ? 0 : 1; + const objectType = get(v, 'objectType'); + const objectId = get(v, 'objectIndex.objectId'); + const sourceObjectId = get(v, 'sourceObjectId'); + return { + x: rect.x, + y: rect.y, + w: rect.w, + h: rect.h, + id: index, + qualityScore, + algorithmVersion, + objectRectIndex, + objectType, + objectId, + frameTimestamp, + sourceObjectId, + extendBox, + }; + }); + return data; +}; + +export const getNormalization = (srcRect: Rect, maxW: number, maxH: number) => { + const newRect = { + ...srcRect, + }; + newRect.x = srcRect.x / maxW; + newRect.y = srcRect.y / maxH; + newRect.w = srcRect.w / maxW; + newRect.h = srcRect.h / maxH; + if (newRect.x + newRect.w > 1) { + newRect.w = 1 - newRect.x; + } + if (newRect.y + newRect.h > 1) { + newRect.h = 1 - newRect.y; + } + return newRect; +}; +//传入od框 穿出 od扩展框 +export const getExtendRect = (normalizationRect: Rect, imgW: number, imgH: number, type: string) => { + const rect = { + x: normalizationRect.x * imgW, + y: normalizationRect.y * imgH, + w: normalizationRect.w * imgW, + h: normalizationRect.h * imgH, + }; + + let newRect; + if (type === proto.Common.AlgorithmVersion.VERSION_NON_MOTOR_VEHICLE) { + newRect = getBikeExtendRect(rect, imgW); + } else { + newRect = getOtherExtendRect(rect, imgW, imgH, type); + } + newRect = getNormalization(newRect, imgW, imgH); + return newRect; +}; + + +export const getBikeExtendRect = (rect: Rect, maxW: number) => { + const newRect = { ...rect }; + //向上扩大一倍 + const oldY = cloneDeep(rect.y); + newRect.y = newRect.y - newRect.h < 0 ? 0 : newRect.y - newRect.h; + newRect.h += oldY - newRect.y; + + let newX = Math.round(newRect.x - newRect.w * 0.15); + if (newX < 0) { + newX = 0; + } + let newW = newRect.x - newX + newRect.w + Math.round(newRect.w * 0.15); + if (newX + newW > maxW) { + newW = maxW - newX; + } + newRect.x = newX; + newRect.w = newW; + + return newRect; +}; + +export const getOtherExtendRect = (srcRect: Rect, maxW: number, maxH: number, type: string) => { + const wExtendRadio = 0.25; + const upExtendRadio = 0.25; + const downExtendRadio = 0.25; + const fixPersonExtend = true; + + let nx = 0; + let nw = 0; + + nx = srcRect.x - Math.round(srcRect.w * wExtendRadio); + if (nx < 0) { + nx = 0; + } + nw = srcRect.x - nx + srcRect.w + Math.round(srcRect.w * wExtendRadio); + if (nx + nw > maxW) { + nw = maxW - nx; + } + + let ny = 0; + let nh = 0; + ny = srcRect.y - Math.round(upExtendRadio * srcRect.h); + if (ny < 0) { + ny = 0; + } + nh = srcRect.y - ny + srcRect.h + Math.round(srcRect.h * downExtendRadio); + if (ny + nh > maxH) { + nh = maxH - ny; + } + + let newRect = { + x: nx, + y: ny, + w: nw, + h: nh, + }; + if ( + (type === proto.Common.AlgorithmVersion.VERSION_REID_HEAD_ATTR || + type === proto.Common.AlgorithmVersion.VERSION_FACE) && + fixPersonExtend + ) { + const fixW = Math.round(nh * 0.75); + if (nw < fixW) { + // 应该扩展宽度 + let newX = nx + Math.round(nw / 2.0 - 0.5 * fixW); + if (newX < 0) { + newX = 0; + } + let newW = fixW; + if (newW + newX > maxW) { + newW = maxW - newX; + } + + newRect = { + x: newX, + y: ny, + w: newW, + h: nh, + }; + } else if (nw > fixW) { + // 应该扩展高度 + const fixH = Math.round(nw * 1.333); + let newY = ny + Math.round(nh / 2.0 - 0.5 * fixH); + if (newY < 0) { + newY = 0; + } + let newH = fixH; + if (newY + newH > maxH) { + newH = maxH - newY; + } + newRect = { + x: nx, + y: newY, + w: nw, + h: newH, + }; + } + } + return newRect; +}; + + +export const getTransformRect = (image: { height: number; width: number; }, transform: { translateX: any; translateY: any; scale: any; rotate: any; }, rect: Rect) => { + const canvasRect = { + x: rect.x, + y: rect.y, + x2: rect.x + rect.w, + y2: rect.h + rect.y, + }; + //1.转成缩放前的坐标 + const { translateX, translateY, scale, rotate } = transform; + const originAxisRect = { + x: (canvasRect.x - translateX) / scale, + y: (canvasRect.y - translateY) / scale, + x2: (canvasRect.x2 - translateX) / scale, + y2: (canvasRect.y2 - translateY) / scale, + }; + //2.转成图片坐标 + //不考虑旋转 图片原点就是坐标原点 + let imgAxisRect = originAxisRect; + //但是旋转90度后图片不在坐标原点 加上这部分diff + if (rotate % 180 !== 0) { + //90度调整偏移量 + const offsetX = -(image.height - image.width) / 2; + const offsetY = -(image.width - image.height) / 2; + imgAxisRect = { + x: originAxisRect.x - offsetX, + y: originAxisRect.y - offsetY, + x2: originAxisRect.x2 - offsetX, + y2: originAxisRect.y2 - offsetY, + }; + } + //3.限制框不要超出图片 + let imgW = image.width; + let imgH = image.height; + if (rotate % 180 !== 0) { + [imgW, imgH] = [imgH, imgW]; + } + imgAxisRect.x = Math.min(imgW, Math.max(imgAxisRect.x, 0)); + imgAxisRect.y = Math.min(imgH, Math.max(imgAxisRect.y, 0)); + imgAxisRect.x2 = Math.min(imgW, Math.max(imgAxisRect.x2, 0)); + imgAxisRect.y2 = Math.min(imgH, Math.max(imgAxisRect.y2, 0)); + //获取归一化坐标 + const endRect = { + x: imgAxisRect.x2 > imgAxisRect.x ? imgAxisRect.x : imgAxisRect.x2, + y: imgAxisRect.y2 > imgAxisRect.y ? imgAxisRect.y : imgAxisRect.y2, + w: Math.abs(imgAxisRect.x2 - imgAxisRect.x), + h: Math.abs(imgAxisRect.y2 - imgAxisRect.y), + }; + + return getNormalization(endRect, imgW, imgH); +}; + +//旋转图片后转成file 对象 +export const getRotateImg = (image: HTMLImageElement, rotate: number) => { + let imgW = image.width; + let imgH = image.height; + if (rotate % 180 !== 0) { + [imgW, imgH] = [imgH, imgW]; + } + const commonCanvas = document.createElement('canvas'); + commonCanvas.width = imgW; + commonCanvas.height = imgH; + commonCanvas.style.display = 'none'; + document.body.appendChild(commonCanvas); + const commonCtx = commonCanvas.getContext('2d'); + //移动到图片中心 旋转 + + commonCtx?.save(); + if (rotate % 180 !== 0) { + //90度调整偏移量 + commonCtx?.translate((image.height - image.width) / 2, (image.width - image.height) / 2); + } + commonCtx?.translate(image.width / 2, image.height / 2); + commonCtx?.rotate((rotate / 180) * Math.PI); + commonCtx?.translate(-image.width / 2, -image.height / 2); + commonCtx?.drawImage(image, 0, 0); + commonCtx?.restore(); + + const dataUrl = commonCanvas.toDataURL('image/jpeg'); + const blobData = dataURLToBlob(dataUrl); + const file = new window.File([blobData], `${new Date().getTime()}`, { + type: 'image/jpeg', + }); + commonCanvas.parentNode?.removeChild(commonCanvas); + return file; +}; diff --git a/packages/meta/src/BigImagePreview/components/BtnGroup/index.tsx b/packages/meta/src/BigImagePreview/components/BtnGroup/index.tsx index ba70c12..c7e8019 100644 --- a/packages/meta/src/BigImagePreview/components/BtnGroup/index.tsx +++ b/packages/meta/src/BigImagePreview/components/BtnGroup/index.tsx @@ -1,6 +1,7 @@ import React, { MouseEvent } from 'react'; import classNames from 'classnames'; -import { Button, Tooltip, TooltipProps } from 'antd'; +// @ts-ignore +import { Button, Tooltip, TooltipProps } from '../../..'; import Icon from '../../../iconfont'; import './index.less'; @@ -38,7 +39,7 @@ export const BtnGroup: React.FC = (props) => { > - diff --git a/packages/meta/src/BigImagePreview/demo/empty.tsx b/packages/meta/src/BigImagePreview/demo/empty.tsx new file mode 100644 index 0000000..3f83414 --- /dev/null +++ b/packages/meta/src/BigImagePreview/demo/empty.tsx @@ -0,0 +1,28 @@ + +import React, { useRef } from 'react'; +import { Button, ImgViewRef, Space } from '@zhst/meta' +import { BigImagePreview } from '@zhst/meta' + + +const props = { + height: '320px', + width: '640px', + data: { + imageKey: '', + }, +} + +// FIXME:需要优化 props +export default () => { + const imgRef = useRef(null) + + return ( + + + + + + + + ) +} diff --git a/packages/meta/src/BigImagePreview/demo/noAttach.tsx b/packages/meta/src/BigImagePreview/demo/noAttach.tsx new file mode 100644 index 0000000..f5f6244 --- /dev/null +++ b/packages/meta/src/BigImagePreview/demo/noAttach.tsx @@ -0,0 +1,35 @@ + +import React, { useRef } from 'react'; +import { Button, Space } from '@zhst/meta' +import { BigImagePreview } from '@zhst/meta' +import type { ImgViewRef } from '@zhst/meta' + + +const props = { + height: '320px', + width: '640px', + data: { + imageKey: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', + odRect:{ + "x":0.553125,"y":0.29722223,"w":0.048958335,"h":0.2462963 + }, + cameraPosition: 'string', // 摄像头位置 + time: '2022-01-01', // 摄像头拍摄时间 + }, + onDraw: (data: any) => console.log('data', data), + hideTypeBtns: true, +} + +export default () => { + const imgRef = useRef(null) + + return ( + + + + + + + + ) +} diff --git a/packages/meta/src/BigImagePreview/index.less b/packages/meta/src/BigImagePreview/index.less index 829ebe1..7c8f030 100644 --- a/packages/meta/src/BigImagePreview/index.less +++ b/packages/meta/src/BigImagePreview/index.less @@ -2,6 +2,7 @@ position: relative; width: calc(100%); height: 100%; + font-size: 0; &__face-score { position: absolute; @@ -62,14 +63,9 @@ height: 202px; transition: all 200ms; - &--fixed { - } &--zoomin { height: 100%; - - &--fixed { - } } &__tab { diff --git a/packages/meta/src/BigImagePreview/index.md b/packages/meta/src/BigImagePreview/index.md index 84dd881..35a5d3c 100644 --- a/packages/meta/src/BigImagePreview/index.md +++ b/packages/meta/src/BigImagePreview/index.md @@ -2,21 +2,67 @@ group: 媒体 category: Components subtitle: 大图预览组件 +toc: content title: BigImagePreview 大图预览组件 --- # BigImagePreview 大图预览组件 基本 +不展示小图 +空数据 ## API | 参数 | 说明 | 类型 | 默认值 | 版本 | | --- | --- | --- | --- | --- | +| data | 当前组件数据对象 | IData(必填) | - | | | imageKey | 当前大图链接 | string(必填) | - | | -| odRect | 圈选矩形参数 | { x: number; y: number; w: number; h: number } | - | | | height | 高度 | number(选填) | - | | | width | 宽度 | number(选填) | - | | + +### IData + +可以通过组件的 props 获取ts 定义: + +```js +import type { ImgViewProps } from '@zhst/meta' + +const data: ImgViewProps['data'] = { + imageKey: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', + odRect:{ + "x":0.553125,"y":0.29722223,"w":0.048958335,"h":0.2462963 + }, + attachImg: [ + { + "url": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png","label": "形体" + },{ + "url": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png", + "label": "人脸" + } + ], + score: 0.815207, // 人脸质量分 + showScore: true, // 人脸质量分 + cameraPosition: 'string', // 摄像头位置 + time: '2022-01-01', // 摄像头拍摄时间 + objects: [ + { + "bboxRatio": { + "x": 0.5519352, + "y": 0.2965385, + "w": 0.05185461, + "h": 0.24698898 + }, + } + ] +} +``` + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| imageKey | 当前大图链接 | string | - | | +| odRect | 初始化OD | { x: number; y: number; w: number; h: number } | - | | +| attachImg | 缩略图对象 | { url: string; label: string; }[](选填) | - | | +| objects | 多OD状态列表 | IOdRectOrigin[](选填) | - | | +| objects | 多OD状态列表 | IOdRectOrigin[](选填) | - | | | score | 相似度 | number(选填) | - | | -| attachImg | 缩略图 | { url: string; label: string; }[](选填) | - | | -| objects | 编辑状态参数 | IOdRectOrigin[](选填) | - | | diff --git a/packages/meta/src/BigImagePreview/interface.ts b/packages/meta/src/BigImagePreview/interface.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/meta/src/CompareImage/CompareImage.tsx b/packages/meta/src/CompareImage/CompareImage.tsx index cda03e6..0b10d75 100644 --- a/packages/meta/src/CompareImage/CompareImage.tsx +++ b/packages/meta/src/CompareImage/CompareImage.tsx @@ -1,15 +1,15 @@ -import React, { useRef, useState, useEffect, forwardRef, useImperativeHandle } from 'react' +import React, { useRef, useState, useEffect, forwardRef, useImperativeHandle, useContext } from 'react' // @ts-ignore import { generateImg, get, addEventListenerWrapper } from '@zhst/func'; import { useUpdateEffect } from '@zhst/hooks'; +import { IconFont } from '@zhst/icon' import Button from '../button'; import classNames from 'classnames' import Viewer from '../ImageEditor/viewer'; -import Icon from '../iconfont' import CornerScore from './components/CornerScore'; import './index.less' - -const componentName = `zhst-image__compater-view`; +import { ConfigContext } from '../config-provider'; +import { EMPTY_BASE64 } from '../utils/constants'; export interface CompareImageProps { /** @@ -17,9 +17,11 @@ export interface CompareImageProps { * @default "默认值" */ label?: string; + showTools?: boolean; + prefixCls?: string; openRoll?: boolean; //开启翻页 url: string; - score?: number; + score?: number | string; onPre?: () => void; onNext?: () => void; preDisable?: boolean; // 向前翻页禁用 @@ -35,16 +37,21 @@ export interface CompareImageRefProps { // 对比图组件 const CompareImage = forwardRef((props, ref) => { const { + prefixCls: customizePrefixCls, label = '标题', openRoll = true, url = '', score = 0, preDisable, nextDisable, - showScore = true, + showScore, onNext, + showTools = true, onPre } = props; + const { getPrefixCls } = useContext(ConfigContext); + const componentName = getPrefixCls('image__compater-view', customizePrefixCls); + const imgContainerRef = useRef(null); const imgInsRef = useRef(null); const [scale, setScale] = useState(0); @@ -95,7 +102,7 @@ const CompareImage = forwardRef((props, {!url ? (
暂无匹配数据
@@ -107,63 +114,65 @@ const CompareImage = forwardRef((props,
{/*
*/}
+ )} + {(showScore || score) && } + {showTools && ( +
+ + + {/* */} +
)} - {showScore && } -
- - - {/* */} - -
); }) diff --git a/packages/meta/src/CompareImage/demo/basic.tsx b/packages/meta/src/CompareImage/demo/basic.tsx index 11578c1..f9303fb 100644 --- a/packages/meta/src/CompareImage/demo/basic.tsx +++ b/packages/meta/src/CompareImage/demo/basic.tsx @@ -1,30 +1,35 @@ -import React, { useRef } from 'react'; +import React, { useRef, useState } from 'react'; import { CompareImage, Space, Button } from '@zhst/meta' -const props = { - label: "目标图", - openRoll:true, - dataSource:[ - { - url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', - score: '0.5' - }, - { - url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', - score: '0.8' - }, - ] -} - export default () => { const ref = useRef(null) + const [data, setData] = useState({ + url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', + score: '0.8' + }) return ( - - - + { + setData({ + url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', + score: '0.8' + }) + }} + onNext={() => { + setData({ + url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', + score: '0.4' + }) + }} + /> ) } diff --git a/packages/meta/src/CompareImage/demo/noTools.tsx b/packages/meta/src/CompareImage/demo/noTools.tsx new file mode 100644 index 0000000..e9d983d --- /dev/null +++ b/packages/meta/src/CompareImage/demo/noTools.tsx @@ -0,0 +1,21 @@ + +import React, { useRef } from 'react'; +import { CompareImage, Space } from '@zhst/meta' + + +export default () => { + const ref = useRef(null) + + return ( + + + + ) +} diff --git a/packages/meta/src/CompareImage/index.less b/packages/meta/src/CompareImage/index.less index 6b69829..a5955a8 100644 --- a/packages/meta/src/CompareImage/index.less +++ b/packages/meta/src/CompareImage/index.less @@ -113,25 +113,17 @@ &__scoll-module { position: absolute; - top: 0%; - left: 0%; + padding: 12px; + bottom: 48px; display: flex; width: 100%; - height: 100%; align-items: flex-end; justify-content: space-between; pointer-events: none; + box-sizing: border-box; &__btn { - display: flex; - width: 50px; - height: 50px; - bottom: 45px; - align-items: center; - justify-content: center; - margin: 6px; - border-radius: 50%; - opacity: 0.5; + opacity: 0.4; pointer-events: all; &>span { @@ -142,6 +134,7 @@ } &__btn:hover { + opacity: 0.6; background-color: #09f !important; color: #fff !important; } diff --git a/packages/meta/src/CompareImage/index.md b/packages/meta/src/CompareImage/index.md index d403218..6d9af33 100644 --- a/packages/meta/src/CompareImage/index.md +++ b/packages/meta/src/CompareImage/index.md @@ -2,20 +2,28 @@ group: 媒体 category: Components subtitle: 图片预览 +toc: content title: CompareImage 图片预览 --- # CompareImage 图片预览 基本 +没有工具栏 ## API | 参数 | 说明 | 类型 | 默认值 | 版本 | | --- | --- | --- | --- | --- | +| url | 链接 | string | - | | | label | 左上角标题 | string(必填) | - | | -| openRoll | 是否支持鼠标滚动放大缩小 | boolean | - | | -| urls | 链接数组 | string[] | - | | +| showTools | 是否展示底部工具栏 | boolean | true | | +| openRoll | 是否展示翻页组件 | boolean | - | | | width | 宽度 | string(选填) | - | | | height | 高度 | string(选填) | - | | | score | 相似度 | string(选填) | - | | +| nextDisable | 禁止下一页 | boolean | false | | +| preDisable | 禁止上一页 | boolean | false | | +| prefixCls | 样式前缀 | string | - | | +| onPre | 往前翻页 | () => void; | - | | +| onNext | 往后翻页 | () => void; | - | | diff --git a/packages/meta/src/ImageEditor/cropper/event.ts b/packages/meta/src/ImageEditor/cropper/event.ts index 09b4cd6..0d75383 100644 --- a/packages/meta/src/ImageEditor/cropper/event.ts +++ b/packages/meta/src/ImageEditor/cropper/event.ts @@ -66,7 +66,7 @@ export default { try { handler.remove(); } catch (error) { - warn('CROP:REMOVE_EVENT_FAIL,', error); + warn('CROP:REMOVE_EVENT_FAIL: ', error); } } }, diff --git a/packages/meta/src/VideoPlayer/VideoPlayer.tsx b/packages/meta/src/VideoPlayer/VideoPlayer.tsx index bfce83f..56ddf4d 100644 --- a/packages/meta/src/VideoPlayer/VideoPlayer.tsx +++ b/packages/meta/src/VideoPlayer/VideoPlayer.tsx @@ -8,7 +8,6 @@ import { toRealNumber, getTransforms, formatDurationTime - // @ts-ignore } from '@zhst/func'; import Align from 'rc-align'; import { Rect, IScreenshotButtonProp, AlignType } from '@zhst/types' @@ -64,7 +63,7 @@ const VideoPlayer = forwardRef((props, ref) => { adjustY: true, }, }, - screenshotButtonRender = () =>
回调DOM
, + screenshotButtonRender = () =>
回调DOM
, onCropChange, defautlNormalizationRect: defaultNormalizationRect, } = props; diff --git a/packages/meta/src/VideoPlayer/components/FlvPlayer/index.tsx b/packages/meta/src/VideoPlayer/components/FlvPlayer/index.tsx index a7a76c1..b34b981 100644 --- a/packages/meta/src/VideoPlayer/components/FlvPlayer/index.tsx +++ b/packages/meta/src/VideoPlayer/components/FlvPlayer/index.tsx @@ -1,6 +1,5 @@ import React, { Component, CSSProperties } from 'react'; import flvjs from 'flv.js'; -// @ts-ignore import { isEqual } from '@zhst/func'; export const FLV_EVENT = flvjs.Events; diff --git a/packages/meta/src/VideoPlayer/index.md b/packages/meta/src/VideoPlayer/index.md index 5780cb6..70face2 100644 --- a/packages/meta/src/VideoPlayer/index.md +++ b/packages/meta/src/VideoPlayer/index.md @@ -3,6 +3,7 @@ group: 媒体 category: Components subtitle: 视频播放 title: VideoPlayer 视频播放 +toc: content demo: cols: 2 --- diff --git a/packages/meta/src/app/__tests__/__snapshots__/demo-extend.test.ts.snap b/packages/meta/src/app/__tests__/__snapshots__/demo-extend.test.ts.snap new file mode 100644 index 0000000..8f2b149 --- /dev/null +++ b/packages/meta/src/app/__tests__/__snapshots__/demo-extend.test.ts.snap @@ -0,0 +1,87 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders components/app/demo/basic.tsx extend context correctly 1`] = ` +
+
+
+ +
+
+ +
+
+ +
+
+
+`; + +exports[`renders components/app/demo/basic.tsx extend context correctly 2`] = `[]`; + +exports[`renders components/app/demo/config.tsx extend context correctly 1`] = ` +
+
+
+ +
+
+ +
+
+
+`; + +exports[`renders components/app/demo/config.tsx extend context correctly 2`] = `[]`; diff --git a/packages/meta/src/app/__tests__/__snapshots__/demo.test.ts.snap b/packages/meta/src/app/__tests__/__snapshots__/demo.test.ts.snap new file mode 100644 index 0000000..293802c --- /dev/null +++ b/packages/meta/src/app/__tests__/__snapshots__/demo.test.ts.snap @@ -0,0 +1,83 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders components/app/demo/basic.tsx correctly 1`] = ` +
+
+
+ +
+
+ +
+
+ +
+
+
+`; + +exports[`renders components/app/demo/config.tsx correctly 1`] = ` +
+
+
+ +
+
+ +
+
+
+`; diff --git a/packages/meta/src/app/__tests__/__snapshots__/index.test.tsx.snap b/packages/meta/src/app/__tests__/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000..9d7d652 --- /dev/null +++ b/packages/meta/src/app/__tests__/__snapshots__/index.test.tsx.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`App rtl render component should be rendered correctly in RTL direction 1`] = ` +
+`; + +exports[`App single 1`] = ` +
+
+ Hello World +
+
+`; diff --git a/packages/meta/src/app/__tests__/demo-extend.test.ts b/packages/meta/src/app/__tests__/demo-extend.test.ts new file mode 100644 index 0000000..6ef0a0d --- /dev/null +++ b/packages/meta/src/app/__tests__/demo-extend.test.ts @@ -0,0 +1,3 @@ +import { extendTest } from '../../../tests/shared/demoTest'; + +extendTest('app'); diff --git a/packages/meta/src/app/__tests__/demo.test.ts b/packages/meta/src/app/__tests__/demo.test.ts new file mode 100644 index 0000000..fbcb9a7 --- /dev/null +++ b/packages/meta/src/app/__tests__/demo.test.ts @@ -0,0 +1,3 @@ +import demoTest from '../../../tests/shared/demoTest'; + +demoTest('app'); diff --git a/packages/meta/src/app/__tests__/image.test.ts b/packages/meta/src/app/__tests__/image.test.ts new file mode 100644 index 0000000..8d3a083 --- /dev/null +++ b/packages/meta/src/app/__tests__/image.test.ts @@ -0,0 +1,5 @@ +import { imageDemoTest } from '../../../tests/shared/imageTest'; + +describe('app', () => { + imageDemoTest('app'); +}); diff --git a/packages/meta/src/app/__tests__/index.test.tsx b/packages/meta/src/app/__tests__/index.test.tsx new file mode 100644 index 0000000..aafcac0 --- /dev/null +++ b/packages/meta/src/app/__tests__/index.test.tsx @@ -0,0 +1,236 @@ +import React, { useEffect } from 'react'; +import { SmileOutlined } from '@ant-design/icons'; +import type { NotificationConfig } from 'antd/es/notification/interface'; + +import App from '..'; +import mountTest from '../../../tests/shared/mountTest'; +import rtlTest from '../../../tests/shared/rtlTest'; +import { render, waitFakeTimer } from '../../../tests/utils'; +import type { AppConfig } from '../context'; +import { AppConfigContext } from '../context'; + +describe('App', () => { + mountTest(App); + rtlTest(App); + + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.clearAllTimers(); + jest.useRealTimers(); + }); + + it('single', () => { + // Sub page + const MyPage: React.FC = () => { + const { message } = App.useApp(); + React.useEffect(() => { + message.success('Good!'); + }, [message]); + + return
Hello World
; + }; + + // Entry component + const MyApp: React.FC = () => ( + + + + ); + + const { getByText, container } = render(); + expect(getByText('Hello World')).toBeTruthy(); + expect(container.firstChild).toMatchSnapshot(); + }); + + it('should work as message and notification config configured in app', async () => { + let consumedConfig: AppConfig | undefined; + const Consumer = () => { + const { message, notification } = App.useApp(); + consumedConfig = React.useContext(AppConfigContext); + + useEffect(() => { + message.success('Message 1'); + message.success('Message 2'); + notification.success({ message: 'Notification 1' }); + notification.success({ message: 'Notification 2' }); + notification.success({ message: 'Notification 3' }); + }, [message, notification]); + + return
; + }; + const Wrapper = () => ( + + + + ); + + render(); + + await waitFakeTimer(); + + expect(consumedConfig?.message).toStrictEqual({ maxCount: 1 }); + expect(consumedConfig?.notification).toStrictEqual({ maxCount: 2 }); + + expect(document.querySelectorAll('.ant-message-notice')).toHaveLength(1); + expect(document.querySelectorAll('.ant-notification-notice')).toHaveLength(2); + }); + + it('should be a merged config configured in nested app', async () => { + let offsetConsumedConfig: AppConfig | undefined; + let maxCountConsumedConfig: AppConfig | undefined; + const OffsetConsumer = () => { + offsetConsumedConfig = React.useContext(AppConfigContext); + return
; + }; + const MaxCountConsumer = () => { + maxCountConsumedConfig = React.useContext(AppConfigContext); + return
; + }; + const Wrapper = () => ( + + + + + + + ); + + render(); + + expect(offsetConsumedConfig?.message).toStrictEqual({ maxCount: 1, top: 32 }); + expect(offsetConsumedConfig?.notification).toStrictEqual({ maxCount: 2, top: 96 }); + expect(maxCountConsumedConfig?.message).toStrictEqual({ maxCount: 1 }); + expect(maxCountConsumedConfig?.notification).toStrictEqual({ maxCount: 2 }); + }); + + it('should respect config from props in priority', async () => { + let config: AppConfig | undefined; + const Consumer = () => { + config = React.useContext(AppConfigContext); + return
; + }; + const Wrapper = () => ( + + + + + + ); + + render(); + + expect(config?.message).toStrictEqual({ maxCount: 11, top: 20 }); + expect(config?.notification).toStrictEqual({ maxCount: 30, bottom: 41 }); + }); + + it('should respect notification placement config from props in priority', async () => { + let consumedConfig: AppConfig | undefined; + + const Consumer = () => { + const { notification } = App.useApp(); + consumedConfig = React.useContext(AppConfigContext); + + useEffect(() => { + notification.success({ message: 'Notification 1' }); + notification.success({ message: 'Notification 2' }); + notification.success({ message: 'Notification 3' }); + }, [notification]); + + return
; + }; + + const config: NotificationConfig = { + placement: 'bottomLeft', + top: 100, + bottom: 50, + }; + + const Wrapper = () => ( + + + + ); + + render(); + await waitFakeTimer(); + + expect(consumedConfig?.notification).toStrictEqual(config); + expect(document.querySelector('.ant-notification-topRight')).not.toBeInTheDocument(); + expect(document.querySelector('.ant-notification-bottomLeft')).toHaveStyle({ + top: '', + left: '0px', + bottom: '50px', + }); + }); + + it('support className', () => { + const { container } = render( + +
test
+
, + ); + expect(container.querySelector('.ant-app')).toHaveClass('test-class'); + }); + + it('support style', () => { + const { container } = render( + +
test
+
, + ); + expect(container.querySelector('.ant-app')).toHaveStyle('color: blue;'); + }); + + // https://github.com/ant-design/ant-design/issues/41197#issuecomment-1465803061 + describe('restIcon style', () => { + beforeEach(() => { + Array.from(document.querySelectorAll('style')).forEach((style) => { + style.parentNode?.removeChild(style); + }); + }); + + it('should work by default', () => { + const { container } = render( + + + , + ); + + expect(container.querySelector('.anticon')).toBeTruthy(); + const dynamicStyles = Array.from(document.querySelectorAll('style[data-css-hash]')); + expect( + dynamicStyles.some((style) => { + const { innerHTML } = style; + return innerHTML.startsWith('.anticon'); + }), + ).toBeTruthy(); + }); + }); + + describe('component', () => { + it('replace', () => { + const { container } = render( + +

+ , + ); + + expect(container.querySelector('section.ant-app')).toBeTruthy(); + }); + + it('to false', () => { + const warnSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); + const { container } = render( + +

+ , + ); + expect(warnSpy).not.toHaveBeenCalled(); + expect(container.querySelector('.ant-app')).toBeFalsy(); + warnSpy.mockRestore(); + }); + }); +}); diff --git a/packages/meta/src/app/context.ts b/packages/meta/src/app/context.ts new file mode 100644 index 0000000..4b3220a --- /dev/null +++ b/packages/meta/src/app/context.ts @@ -0,0 +1,26 @@ +import React from 'react'; + +import type { ConfigOptions as MessageConfig, MessageInstance } from '../message/interface'; +import type { HookAPI as ModalHookAPI } from '../modal/useModal'; +import type { NotificationConfig, NotificationInstance } from '../notification/interface'; + +export interface AppConfig { + message?: MessageConfig; + notification?: NotificationConfig; +} + +export const AppConfigContext = React.createContext({}); + +export interface useAppProps { + message: MessageInstance; + notification: NotificationInstance; + modal: ModalHookAPI; +} + +const AppContext = React.createContext({ + message: {}, + notification: {}, + modal: {}, +} as useAppProps); + +export default AppContext; diff --git a/packages/meta/src/app/demo/basic.md b/packages/meta/src/app/demo/basic.md new file mode 100644 index 0000000..9976b03 --- /dev/null +++ b/packages/meta/src/app/demo/basic.md @@ -0,0 +1,7 @@ +## zh-CN + +获取 `message`、`notification`、`modal` 实例。 + +## en-US + +Get instance for `message`, `notification`, `modal`. diff --git a/packages/meta/src/app/demo/basic.tsx b/packages/meta/src/app/demo/basic.tsx new file mode 100644 index 0000000..62692e0 --- /dev/null +++ b/packages/meta/src/app/demo/basic.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { App, Button, Space } from 'antd'; + +// Sub page +const MyPage = () => { + const { message, modal, notification } = App.useApp(); + + const showMessage = () => { + message.success('Success!'); + }; + + const showModal = () => { + modal.warning({ + title: 'This is a warning message', + content: 'some messages...some messages...', + }); + }; + + const showNotification = () => { + notification.info({ + message: `Notification topLeft`, + description: 'Hello, Ant Design!!', + placement: 'topLeft', + }); + }; + + return ( + + + + + + ); +}; + +// Entry component +export default () => ( + + + +); diff --git a/packages/meta/src/app/demo/config.md b/packages/meta/src/app/demo/config.md new file mode 100644 index 0000000..200dc53 --- /dev/null +++ b/packages/meta/src/app/demo/config.md @@ -0,0 +1,7 @@ +## zh-CN + +对 `message`、`notification` 进行配置。 + +## en-US + +Config for `message`, `notification`. diff --git a/packages/meta/src/app/demo/config.tsx b/packages/meta/src/app/demo/config.tsx new file mode 100644 index 0000000..fdc25a6 --- /dev/null +++ b/packages/meta/src/app/demo/config.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { App, Button, Space } from 'antd'; + +// Sub page +const MyPage = () => { + const { message, notification } = App.useApp(); + + const showMessage = () => { + message.success('Success!'); + }; + + const showNotification = () => { + notification.info({ + message: `Notification`, + description: 'Hello, Ant Design!!', + }); + }; + + return ( + + + + + ); +}; + +// Entry component +export default () => ( + + + +); diff --git a/packages/meta/src/app/index.tsx b/packages/meta/src/app/index.tsx new file mode 100644 index 0000000..dafb414 --- /dev/null +++ b/packages/meta/src/app/index.tsx @@ -0,0 +1,94 @@ +import type { ReactNode } from 'react'; +import React, { useContext } from 'react'; +import classNames from 'classnames'; + +import type { AnyObject, CustomComponent } from '../_util/type'; +import type { ConfigConsumerProps } from '../config-provider'; +import { ConfigContext } from '../config-provider'; +import useMessage from '../message/useMessage'; +import useModal from '../modal/useModal'; +import useNotification from '../notification/useNotification'; +import type { AppConfig, useAppProps } from './context'; +import AppContext, { AppConfigContext } from './context'; +import useStyle from './style'; + +export interface AppProps

extends AppConfig { + style?: React.CSSProperties; + className?: string; + rootClassName?: string; + prefixCls?: string; + children?: ReactNode; + component?: CustomComponent

| false; +} + +const useApp = () => React.useContext(AppContext); + +const App: React.FC & { useApp: () => useAppProps } = (props) => { + const { + prefixCls: customizePrefixCls, + children, + className, + rootClassName, + message, + notification, + style, + component = 'div', + } = props; + const { getPrefixCls } = useContext(ConfigContext); + const prefixCls = getPrefixCls('app', customizePrefixCls); + const [wrapCSSVar, hashId, cssVarCls] = useStyle(prefixCls); + const customClassName = classNames(hashId, prefixCls, className, rootClassName, cssVarCls); + + const appConfig = useContext(AppConfigContext); + + const mergedAppConfig = React.useMemo( + () => ({ + message: { ...appConfig.message, ...message }, + notification: { ...appConfig.notification, ...notification }, + }), + [message, notification, appConfig.message, appConfig.notification], + ); + + const [messageApi, messageContextHolder] = useMessage(mergedAppConfig.message); + const [notificationApi, notificationContextHolder] = useNotification( + mergedAppConfig.notification, + ); + const [ModalApi, ModalContextHolder] = useModal(); + + const memoizedContextValue = React.useMemo( + () => ({ + message: messageApi, + notification: notificationApi, + modal: ModalApi, + }), + [messageApi, notificationApi, ModalApi], + ); + + // ============================ Render ============================ + const Component = component === false ? React.Fragment : component; + const rootProps: AppProps = { + className: customClassName, + style, + }; + + return wrapCSSVar( + + + + {ModalContextHolder} + {messageContextHolder} + {notificationContextHolder} + {children} + + + , + ); +}; + +if (process.env.NODE_ENV !== 'production') { + App.displayName = 'App'; +} + +App.useApp = useApp; + +export default App; diff --git a/packages/meta/src/app/index.zh-CN.md b/packages/meta/src/app/index.zh-CN.md new file mode 100644 index 0000000..30798de --- /dev/null +++ b/packages/meta/src/app/index.zh-CN.md @@ -0,0 +1,134 @@ +--- +category: Components +subtitle: 包裹组件 +group: 其他 +toc: content +title: App 包裹组件 +demo: + cols: 2 +--- + +新的包裹组件,提供重置样式和提供消费上下文的默认环境。 + +## 何时使用 + +- 提供可消费 React context 的 `message.xxx`、`Modal.xxx`、`notification.xxx` 的静态方法,可以简化 useMessage 等方法需要手动植入 `contextHolder` 的问题。 +- 提供基于 `.ant-app` 的默认重置样式,解决原生元素没有 antd 规范样式的问题。 + +## 代码演示 + + +基本用法 +Hooks 配置 + +## 如何使用 + +### 基础用法 + +App 组件通过 `Context` 提供上下文方法调用,因而 useApp 需要作为子组件才能使用,我们推荐在应用中顶层包裹 App。 + +```ts +import React from 'react'; +import { App } from 'antd'; + +const MyPage: React.FC = () => { + const { message, notification, modal } = App.useApp(); + message.success('Good!'); + notification.info({ message: 'Good' }); + modal.warning({ title: 'Good' }); + // .... + // other message, notification, modal static function + return

Hello word
; +}; + +const MyApp: React.FC = () => ( + + + +); + +export default MyApp; +``` + +注意:App.useApp 必须在 App 之下方可使用。 + +### 与 ConfigProvider 先后顺序 + +App 组件只能在 `ConfigProvider` 之下才能使用 Design Token, 如果需要使用其样式重置能力,则 ConfigProvider 与 App 组件必须成对出现。 + +```ts + + + ... + + +``` + +### 内嵌使用场景(如无必要,尽量不做嵌套) + +```ts + + + ... + ... + + +``` + +### 全局场景(redux 场景) + +```ts +// Entry component +import { App } from 'antd'; +import type { MessageInstance } from 'antd/es/message/interface'; +import type { ModalStaticFunctions } from 'antd/es/modal/confirm'; +import type { NotificationInstance } from 'antd/es/notification/interface'; + +let message: MessageInstance; +let notification: NotificationInstance; +let modal: Omit; + +export default () => { + const staticFunction = App.useApp(); + message = staticFunction.message; + modal = staticFunction.modal; + notification = staticFunction.notification; + return null; +}; + +export { message, notification, modal }; +``` + +```ts +// sub page +import React from 'react'; +import { Button, Space } from 'antd'; + +import { message } from './store'; + +export default () => { + const showMessage = () => { + message.success('Success!'); + }; + + return ( + + + + ); +}; +``` + +## API + +通用属性参考:[通用属性](/docs/react/common-props) + +### App + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| component | 设置渲染元素,为 `false` 则不创建 DOM 节点 | ComponentType | div | 5.11.0 | +| message | App 内 Message 的全局配置 | [MessageConfig](/components/message-cn/#messageconfig) | - | 5.3.0 | +| notification | App 内 Notification 的全局配置 | [NotificationConfig](/components/notification-cn/#notificationconfig) | - | 5.3.0 | diff --git a/packages/meta/src/app/style/index.ts b/packages/meta/src/app/style/index.ts new file mode 100644 index 0000000..939261f --- /dev/null +++ b/packages/meta/src/app/style/index.ts @@ -0,0 +1,25 @@ +import type { FullToken, GenerateStyle, GetDefaultToken } from '../../theme/internal'; +import { genStyleHooks } from '../../theme/internal'; + +export type ComponentToken = {}; +// @ts-ignore +interface AppToken extends FullToken<'App'> {} + +// =============================== Base =============================== +const genBaseStyle: GenerateStyle = (token) => { + const { componentCls, colorText, fontSize, lineHeight, fontFamily } = token; + return { + [componentCls]: { + color: colorText, + fontSize, + lineHeight, + fontFamily, + }, + }; +}; +// @ts-ignore +export const prepareComponentToken: GetDefaultToken<'App'> = () => ({}); + +// ============================== Export ============================== +// @ts-ignore +export default genStyleHooks('App', genBaseStyle, prepareComponentToken); diff --git a/packages/meta/src/button/index.zh-CN.md b/packages/meta/src/button/index.zh-CN.md index 1a83924..e5de939 100644 --- a/packages/meta/src/button/index.zh-CN.md +++ b/packages/meta/src/button/index.zh-CN.md @@ -4,6 +4,7 @@ title: Button 按钮 subtitle: 按钮 demo: cols: 2 +toc: content group: title: 通用 order: 1 diff --git a/packages/meta/src/card/index.zh-CN.md b/packages/meta/src/card/index.zh-CN.md index 5b0fca8..f82f29a 100644 --- a/packages/meta/src/card/index.zh-CN.md +++ b/packages/meta/src/card/index.zh-CN.md @@ -2,6 +2,7 @@ category: Components group: 数据展示 title: Card 卡片 +toc: content subtitle: 卡片 --- diff --git a/packages/meta/src/changelog/index.md b/packages/meta/src/changelog/index.md index 23dfb51..496ce52 100644 --- a/packages/meta/src/changelog/index.md +++ b/packages/meta/src/changelog/index.md @@ -1,8 +1,10 @@ --- nav: - title: 元组件 -title: 版本更新日志 -order: 9999 + title: 组件库 +title: 元组件 +toc: content --- + + diff --git a/packages/meta/src/checkbox/index.zh-CN.md b/packages/meta/src/checkbox/index.zh-CN.md index a4ff54c..370bec3 100644 --- a/packages/meta/src/checkbox/index.zh-CN.md +++ b/packages/meta/src/checkbox/index.zh-CN.md @@ -2,6 +2,7 @@ category: Components subtitle: 多选框 group: 数据录入 +toc: content title: Checkbox 多选框 demo: cols: 2 diff --git a/packages/meta/src/config-provider/context.ts b/packages/meta/src/config-provider/context.ts index 6546c44..c010252 100644 --- a/packages/meta/src/config-provider/context.ts +++ b/packages/meta/src/config-provider/context.ts @@ -190,12 +190,6 @@ export interface ConfigConsumerProps { warning?: WarningContextProps; } -/** - * - * @param suffixCls - * @param customizePrefixCls - * @returns - */ const defaultGetPrefixCls = (suffixCls?: string, customizePrefixCls?: string) => { if (customizePrefixCls) { return customizePrefixCls; diff --git a/packages/meta/src/config-provider/demo/direction.tsx b/packages/meta/src/config-provider/demo/direction.tsx index 6bfdc4d..bb6cb8a 100644 --- a/packages/meta/src/config-provider/demo/direction.tsx +++ b/packages/meta/src/config-provider/demo/direction.tsx @@ -8,7 +8,7 @@ import { SmileOutlined, } from '@ant-design/icons'; import React, { useState } from 'react'; -import type { RadioChangeEvent } from '@zhst/meta'; +import type { RadioChangeEvent } from 'antd'; import { Badge, Button, @@ -29,7 +29,7 @@ import { Switch, Tree, TreeSelect, -} from '@zhst/meta'; +} from 'antd'; import type { DirectionType } from 'antd/es/config-provider'; const InputGroup = Input.Group; diff --git a/packages/meta/src/config-provider/demo/locale.tsx b/packages/meta/src/config-provider/demo/locale.tsx index 09fdc50..f49a206 100644 --- a/packages/meta/src/config-provider/demo/locale.tsx +++ b/packages/meta/src/config-provider/demo/locale.tsx @@ -5,7 +5,7 @@ import { EllipsisOutlined } from '@ant-design/icons'; import dayjs from 'dayjs'; import React, { useState } from 'react'; -import type { RadioChangeEvent, TourProps, UploadFile } from '@zhst/meta'; +import type { RadioChangeEvent, TourProps, UploadFile } from 'antd'; import { Upload, Tour, @@ -29,7 +29,7 @@ import { Image, InputNumber, Divider, -} from '@zhst/meta'; +} from 'antd'; import type { Locale } from 'antd/es/locale'; import enUS from 'antd/locale/en_US'; import zhCN from 'antd/locale/zh_CN'; diff --git a/packages/meta/src/config-provider/demo/theme.tsx b/packages/meta/src/config-provider/demo/theme.tsx index 00f154b..f710355 100644 --- a/packages/meta/src/config-provider/demo/theme.tsx +++ b/packages/meta/src/config-provider/demo/theme.tsx @@ -1,16 +1,11 @@ import React from 'react'; import { Button, - ColorPicker, - ConfigProvider, Divider, - Form, Input, - InputNumber, Space, - Switch, -} from 'antd'; -import type { Color } from 'antd/es/color-picker'; + ConfigProvider, +} from '@zhst/meta'; type ThemeData = { borderRadius: number; @@ -30,8 +25,6 @@ const defaultData: ThemeData = { }; export default () => { - const [form] = Form.useForm(); - const [data, setData] = React.useState(defaultData); return ( @@ -56,46 +49,6 @@ export default () => { -
{ - setData({ - ...allValues, - }); - }} - name="theme" - initialValues={defaultData} - labelCol={{ span: 4 }} - wrapperCol={{ span: 20 }} - > - color.toHexString()} - > - - - - - - - - - - color.toHexString()} - > - - - - - - -
); }; diff --git a/packages/meta/src/config-provider/index.tsx b/packages/meta/src/config-provider/index.tsx index 064845c..8b66ad0 100644 --- a/packages/meta/src/config-provider/index.tsx +++ b/packages/meta/src/config-provider/index.tsx @@ -212,7 +212,7 @@ interface ProviderChildrenProps extends ConfigProviderProps { legacyLocale: Locale; } -export const defaultPrefixCls = 'zhst'; +export const defaultPrefixCls = 'ant'; let globalPrefixCls: string; let globalIconPrefixCls: string; let globalTheme: ThemeConfig; diff --git a/packages/meta/src/config-provider/index.zh-CN.md b/packages/meta/src/config-provider/index.zh-CN.md new file mode 100644 index 0000000..d453253 --- /dev/null +++ b/packages/meta/src/config-provider/index.zh-CN.md @@ -0,0 +1,202 @@ +--- +category: Components +subtitle: 全局化配置 +group: 其他 +toc: content +title: ConfigProvider 全局化配置 +--- + +为组件提供统一的全局化配置。 + +## 使用 + +ConfigProvider 使用 React 的 [context](https://facebook.github.io/react/docs/context.html) 特性,只需在应用外围包裹一次即可全局生效。 + +```ts +import React from 'react'; +import { ConfigProvider } from 'antd'; + +// ... +const Demo: React.FC = () => ( + + + +); + +export default Demo; +``` + +### Content Security Policy + +部分组件为了支持波纹效果,使用了动态样式。如果开启了 Content Security Policy (CSP),你可以通过 `csp` 属性来进行配置: + +```ts + + + +``` + +## 代码演示 + + + +主题 + + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| autoInsertSpaceInButton | 设置为 `false` 时,移除按钮中 2 个汉字之间的空格 | boolean | true | | +| componentDisabled | 设置 antd 组件禁用状态 | boolean | - | 4.21.0 | +| componentSize | 设置 antd 组件大小 | `small` \| `middle` \| `large` | - | | +| csp | 设置 [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) 配置 | { nonce: string } | - | | +| direction | 设置文本展示方向。 [示例](#components-config-provider-demo-direction) | `ltr` \| `rtl` | `ltr` | | +| getPopupContainer | 弹出框(Select, Tooltip, Menu 等等)渲染父节点,默认渲染到 body 上。 | function(triggerNode) | () => document.body | | +| getTargetContainer | 配置 Affix、Anchor 滚动监听容器。 | () => HTMLElement | () => window | 4.2.0 | +| iconPrefixCls | 设置图标统一样式前缀 | string | `anticon` | 4.11.0 | +| locale | 语言包配置,语言包可到 [antd/locale](http://unpkg.com/antd/locale/) 目录下寻找 | object | - | | +| popupMatchSelectWidth | 下拉菜单和选择器同宽。默认将设置 `min-width`,当值小于选择框宽度时会被忽略。`false` 时会关闭虚拟滚动 | boolean \| number | - | 5.5.0 | +| popupOverflow | Select 类组件弹层展示逻辑,默认为可视区域滚动,可配置成滚动区域滚动 | 'viewport' \| 'scroll' | 'viewport' | 5.5.0 | +| prefixCls | 设置统一样式前缀 | string | `ant` | | +| renderEmpty | 自定义组件空状态。参考 [空状态](/components/empty-cn) | function(componentName: string): ReactNode | - | | +| theme | 设置主题,参考 [定制主题](/docs/react/customize-theme-cn) | [Theme](/docs/react/customize-theme-cn#theme) | - | 5.0.0 | +| virtual | 设置 `false` 时关闭虚拟滚动 | boolean | - | 4.3.0 | +| warning | 设置警告等级,`strict` 为 `false` 时会将废弃相关信息聚合为单条信息 | { strict: boolean } | - | 5.10.0 | + +### ConfigProvider.config() + +设置 `Modal`、`Message`、`Notification` 静态方法配置,只会对非 hooks 的静态方法调用生效。 + +```ts +ConfigProvider.config({ + prefixCls: 'ant', + iconPrefixCls: 'anticon', + + // 5.6.0+ + // 请优先考虑使用 hooks 版本 + theme: { token: { colorPrimary: 'red' } }, +}); +``` + +### ConfigProvider.useConfig() `5.3.0+` + +`5.2.0` 版本后可用。获取父级 `Provider` 的值。如 `DisabledContextProvider`、`SizeContextProvider`。 + +```js +const { + componentDisabled, // 5.3.0+ + componentSize, // 5.3.0+ +} = ConfigProvider.useConfig(); +``` + + +| 返回值 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| componentDisabled | antd 组件禁用状态 | boolean | - | 5.3.0 | +| componentSize | antd 组件大小状态 | `small` \| `middle` \| `large` | - | 5.3.0 | + +### 组件配置 + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| alert | 设置 Alert 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| anchor | 设置 Anchor 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| avatar | 设置 Avatar 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| badge | 设置 Badge 组件的通用属性 | { className?: string, style?: React.CSSProperties, classNames?: { count?: string, indicator?: string }, styles?: { count?: React.CSSProperties, indicator?: React.CSSProperties } } | - | 5.7.0 | +| breadcrumb | 设置 Breadcrumb 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| button | 设置 Button 组件的通用属性 | { className?: string, style?: React.CSSProperties, classNames?: { icon: string }, styles?: { icon: React.CSSProperties } } | - | 5.6.0 | +| calendar | 设置 Calendar 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| card | 设置 Card 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| carousel | 设置 Carousel 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| cascader | 设置 Cascader 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| checkbox | 设置 Checkbox 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| collapse | 设置 Collapse 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| colorPicker | 设置 ColorPicker 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| datePicker | 设置 DatePicker 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| rangePicker | 设置 RangePicker 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.11.0 | +| descriptions | 设置 Descriptions 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| divider | 设置 Divider 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| drawer | 设置 Drawer 组件的通用属性 | { className?: string, style?: React.CSSProperties, classNames?: [DrawerProps\["classNames"\]](/components/drawer-cn#api), styles?: [DrawerProps\["styles"\]](/components/drawer-cn#api) } | - | 5.7.0, `classNames` 和 `styles`: 5.10.0 | +| dropdown | 设置 Dropdown 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.11.0 | +| empty | 设置 Empty 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| flex | 设置 Flex 组件的通用属性 | { className?: string, style?: React.CSSProperties, vertical?: boolean } | - | 5.10.0 | +| form | 设置 Form 组件的通用属性 | { className?: string, style?: React.CSSProperties, validateMessages?: [ValidateMessages](/components/form-cn#validatemessages), requiredMark?: boolean \| `optional`, colon?: boolean, scrollToFirstError?: boolean \| [Options](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options)} | - | requiredMark: 4.8.0; colon: 4.18.0; scrollToFirstError: 5.2.0; className: 5.7.0; style: 5.7.0 | +| image | 设置 Image 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| input | 设置 Input 组件的通用属性 | { autoComplete?: string, className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| layout | 设置 Layout 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| list | 设置 List 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| menu | 设置 Menu 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| mentions | 设置 Mentions 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| message | 设置 Message 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| modal | 设置 Modal 组件的通用属性 | { className?: string, style?: React.CSSProperties, classNames?: [ModalProps\["classNames"\]](/components/modal-cn#api), styles?: [ModalProps\["styles"\]](/components/modal-cn#api) } | - | 5.7.0, `classNames` 和 `styles`: 5.10.0 | +| notification | 设置 Notification 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| pagination | 设置 Pagination 组件的通用属性 | { showSizeChanger?: boolean, className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| progress | 设置 Progress 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| radio | 设置 Radio 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| rate | 设置 Rate 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| result | 设置 Result 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| skeleton | 设置 Skeleton 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| segmented | 设置 Segmented 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| select | 设置 Select 组件的通用属性 | { className?: string, showSearch?: boolean, style?: React.CSSProperties } | - | 5.7.0 | +| slider | 设置 Slider 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| switch | 设置 Switch 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| space | 设置 Space 的通用属性,参考 [Space](/components/space-cn) | { size: `small` \| `middle` \| `large` \| `number`, className?: string, style?: React.CSSProperties, classNames?: { item: string }, styles?: { item: React.CSSProperties } } | - | 5.6.0 | +| spin | 设置 Spin 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| statistic | 设置 Statistic 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| steps | 设置 Steps 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| table | 设置 Table 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| tabs | 设置 Tabs 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| tag | 设置 Tag 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| timeline | 设置 Timeline 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| timePicker | 设置 TimePicker 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| transfer | 设置 Transfer 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| tree | 设置 Tree 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| typography | 设置 Typography 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| upload | 设置 Upload 组件的通用属性 | { className?: string, style?: React.CSSProperties } | - | 5.7.0 | +| wave | 设置水波纹特效 | { disabled?: boolean, showEffect?: (node: HTMLElement, info: { className, token, component }) => void } | - | 5.8.0 | + +## FAQ + +#### 如何增加一个新的语言包? + +参考[《增加语言包》](/docs/react/i18n#%E5%A2%9E%E5%8A%A0%E8%AF%AD%E8%A8%80%E5%8C%85)。 + +#### 为什么时间类组件的国际化 locale 设置不生效? + +参考 FAQ [为什么时间类组件的国际化 locale 设置不生效?](/docs/react/faq#为什么时间类组件的国际化-locale-设置不生效)。 + +#### 配置 `getPopupContainer` 导致 Modal 报错? + +相关 issue: + +当如下全局设置 `getPopupContainer` 为触发节点的 parentNode 时,由于 Modal 的用法不存在 `triggerNode`,这样会导致 `triggerNode is undefined` 的报错,需要增加一个[判断条件](https://github.com/afc163/feedback-antd/commit/3e4d1ad1bc1a38460dc3bf3c56517f737fe7d44a)。 + +```diff + triggerNode.parentNode} ++ getPopupContainer={node => { ++ if (node) { ++ return node.parentNode; ++ } ++ return document.body; ++ }} + > + + +``` + +#### 为什么 message.info、notification.open 或 Modal.confirm 等方法内的 ReactNode 无法继承 ConfigProvider 的属性?比如 `prefixCls` 和 `theme`。 + +静态方法是使用 ReactDOM.render 重新渲染一个 React 根节点上,和主应用的 React 节点是脱离的。我们建议使用 useMessage、useNotification 和 useModal 来使用相关方法。原先的静态方法在 5.0 中已被废弃。 + +#### Vite 生产模式打包后国际化 locale 设置不生效? + +相关 issue:[#39045](https://github.com/ant-design/ant-design/issues/39045) + +由于 Vite 生产模式下打包与开发模式不同,cjs 格式的文件会多一层,需要 `zhCN.default` 来获取。推荐 Vite 用户直接从 `antd/es/locale` 目录下引入 esm 格式的 locale 文件。 diff --git a/packages/meta/src/date-picker/index.md b/packages/meta/src/date-picker/index.md index 9e6a36d..08b9e06 100644 --- a/packages/meta/src/date-picker/index.md +++ b/packages/meta/src/date-picker/index.md @@ -3,6 +3,7 @@ category: Components group: 数据录入 title: DatePicker 日期选择框 subtitle: 日期选择框 +toc: content description: 输入或选择日期的控件。 demo: cols: 2 diff --git a/packages/meta/src/descriptions/index.zh-CN.md b/packages/meta/src/descriptions/index.zh-CN.md index 020174c..84d0f55 100644 --- a/packages/meta/src/descriptions/index.zh-CN.md +++ b/packages/meta/src/descriptions/index.zh-CN.md @@ -2,6 +2,7 @@ category: Components subtitle: 描述列表 group: 数据展示 +toc: content title: Descriptions 描述列表 --- diff --git a/packages/meta/src/divider/index.zh-CN.md b/packages/meta/src/divider/index.zh-CN.md index 4888b1a..03e770c 100644 --- a/packages/meta/src/divider/index.zh-CN.md +++ b/packages/meta/src/divider/index.zh-CN.md @@ -2,6 +2,7 @@ category: Components title: Divider 分割线 subtitle: 分割线 +toc: content demo: cols: 2 group: diff --git a/packages/meta/src/flex/index.zh-CN.md b/packages/meta/src/flex/index.zh-CN.md index 2772040..0152064 100644 --- a/packages/meta/src/flex/index.zh-CN.md +++ b/packages/meta/src/flex/index.zh-CN.md @@ -2,6 +2,7 @@ category: Components subtitle: 弹性布局 group: 布局 +toc: content title: Flex 弹性布局 tag: New --- diff --git a/packages/meta/src/form/FormItem/index.tsx b/packages/meta/src/form/FormItem/index.tsx index 39cdf55..7020d0b 100644 --- a/packages/meta/src/form/FormItem/index.tsx +++ b/packages/meta/src/form/FormItem/index.tsx @@ -302,7 +302,7 @@ function InternalFormItem(props: FormItemProps): React.Rea validateTrigger={mergedValidateTrigger} onMetaChange={onMetaChange} > - {/* @ts-ignore */} + {/* @ts-ignore */} {(control, renderMeta, context: FormInstance) => { const mergedName = toArray(name).length && renderMeta ? renderMeta.name : []; const fieldId = getFieldId(mergedName, formName); diff --git a/packages/meta/src/form/changelog.md b/packages/meta/src/form/changelog.md new file mode 100644 index 0000000..7c4bbc4 --- /dev/null +++ b/packages/meta/src/form/changelog.md @@ -0,0 +1,5 @@ +# Form Dom 变化 + +- 状态 className 现在移动到顶层,不再是 input only +- 去除 `ant-form-item-control-wrapper` 一层 div +- `.has-success` 等状态样式添加 `ant-form-item` 前缀 diff --git a/packages/meta/src/form/demo/advanced-search.tsx b/packages/meta/src/form/demo/advanced-search.tsx index dafa85e..3ab8b7d 100644 --- a/packages/meta/src/form/demo/advanced-search.tsx +++ b/packages/meta/src/form/demo/advanced-search.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { DownOutlined } from '@ant-design/icons'; -import { Button, Col, Form, Input, Row, Select, Space, theme } from 'antd'; +import { Button, Col, Form, Input, Row, Select, Space, theme } from '@zhst/meta'; const { Option } = Select; diff --git a/packages/meta/src/form/demo/custom-feedback-icons.tsx b/packages/meta/src/form/demo/custom-feedback-icons.tsx index 4719749..311c471 100644 --- a/packages/meta/src/form/demo/custom-feedback-icons.tsx +++ b/packages/meta/src/form/demo/custom-feedback-icons.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { AlertFilled, CloseSquareFilled } from '@ant-design/icons'; import { Button, Form, Input, Tooltip } from 'antd'; import { createStyles, css } from 'antd-style'; -import uniqueId from 'lodash/uniqueId'; +import { uniqueId } from '@zhst/func'; const useStyle = createStyles(() => ({ 'custom-feedback-icons': css` diff --git a/packages/meta/src/form/demo/register.tsx b/packages/meta/src/form/demo/register.tsx index 8279012..1568abf 100644 --- a/packages/meta/src/form/demo/register.tsx +++ b/packages/meta/src/form/demo/register.tsx @@ -1,9 +1,7 @@ import React, { useState } from 'react'; -import type { CascaderProps } from 'antd'; +import type { CascaderProps } from '@zhst/meta'; import { - AutoComplete, Button, - Cascader, Checkbox, Col, Form, @@ -11,7 +9,7 @@ import { InputNumber, Row, Select, -} from 'antd'; +} from '@zhst/meta'; const { Option } = Select; @@ -193,16 +191,6 @@ const App: React.FC = () => { - - - - { > - - - - - - - +基本使用 +表单方法调用 +表单布局 +表单禁用 +必选样式 +表单尺寸 +表单标签可换行 +非阻塞校验 +字段监听 Hooks +校验时机 +仅校验 +字段路径前缀 +动态增减表单项 +动态增减嵌套字段 +动态增减嵌套纯字段 +复杂的动态增减表单项 +嵌套结构与校验信息 +复杂一点的控件 +自定义表单控件 +表单数据存储于上层组件 +多表单联动 +内联登录栏 +登录框 +注册新用户 +高级搜索 +弹出层中的新建表单 +时间类控件 +自行处理表单数据 + +动态校验规则 +校验与更新依赖 +校验其他组件 +Disabled Input Debug +测试 label 省略 +测试特殊 col 24 用法 +引用字段 +Custom feedback icons +组件 Token + +## API + +通用属性参考:[通用属性](/docs/react/common-props) + +### Form + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| colon | 配置 Form.Item 的 `colon` 的默认值。表示是否显示 label 后面的冒号 (只有在属性 layout 为 horizontal 时有效) | boolean | true | | +| disabled | 设置表单组件禁用,仅对 antd 组件有效 | boolean | false | 4.21.0 | +| component | 设置 Form 渲染元素,为 `false` 则不创建 DOM 节点 | ComponentType \| false | form | | +| fields | 通过状态管理(如 redux)控制表单字段,如非强需求不推荐使用。查看[示例](#components-form-demo-global-state) | [FieldData](#fielddata)\[] | - | | +| form | 经 `Form.useForm()` 创建的 form 控制实例,不提供时会自动创建 | [FormInstance](#forminstance) | - | | +| feedbackIcons | 当 `Form.Item` 有 `hasFeedback` 属性时可以自定义图标 | [FeedbackIcons](#feedbackicons) | - | 5.9.0 | +| initialValues | 表单默认值,只有初始化以及重置时生效 | object | - | | +| labelAlign | label 标签的文本对齐方式 | `left` \| `right` | `right` | | +| labelWrap | label 标签的文本换行方式 | boolean | false | 4.18.0 | +| labelCol | label 标签布局,同 `` 组件,设置 `span` `offset` 值,如 `{span: 3, offset: 12}` 或 `sm: {span: 3, offset: 12}` | [object](/components/grid-cn#col) | - | | +| layout | 表单布局 | `horizontal` \| `vertical` \| `inline` | `horizontal` | | +| name | 表单名称,会作为表单字段 `id` 前缀使用 | string | - | | +| preserve | 当字段被删除时保留字段值。你可以通过 `getFieldsValue(true)` 来获取保留字段值 | boolean | true | 4.4.0 | +| requiredMark | 必选样式,可以切换为必选或者可选展示样式。此为 Form 配置,Form.Item 无法单独配置 | boolean \| `optional` \| ((label: ReactNode, info: { required: boolean }) => ReactNode) | true | `renderProps`: 5.9.0 | +| scrollToFirstError | 提交失败自动滚动到第一个错误字段 | boolean \| [Options](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options) | false | | +| size | 设置字段组件的尺寸(仅限 antd 组件) | `small` \| `middle` \| `large` | - | | +| validateMessages | 验证提示模板,说明[见下](#validatemessages) | [ValidateMessages](https://github.com/ant-design/ant-design/blob/6234509d18bac1ac60fbb3f92a5b2c6a6361295a/components/locale/en_US.ts#L88-L134) | - | | +| validateTrigger | 统一设置字段触发验证的时机 | string \| string\[] | `onChange` | 4.3.0 | +| wrapperCol | 需要为输入控件设置布局样式时,使用该属性,用法同 labelCol | [object](/components/grid-cn#col) | - | | +| onFieldsChange | 字段更新时触发回调事件 | function(changedFields, allFields) | - | | +| onFinish | 提交表单且数据验证成功后回调事件 | function(values) | - | | +| onFinishFailed | 提交表单且数据验证失败后回调事件 | function({ values, errorFields, outOfDate }) | - | | +| onValuesChange | 字段值更新时触发回调事件 | function(changedValues, allValues) | - | | + +### validateMessages + +Form 为验证提供了[默认的错误提示信息](https://github.com/ant-design/ant-design/blob/6234509d18bac1ac60fbb3f92a5b2c6a6361295a/components/locale/en_US.ts#L88-L134),你可以通过配置 `validateMessages` 属性,修改对应的提示模板。一种常见的使用方式,是配置国际化提示信息: + +```js +const validateMessages = { + required: "'${name}' 是必选字段", + // ... +}; + +
; +``` + +此外,[ConfigProvider](/components/config-provider-cn) 也提供了全局化配置方案,允许统一配置错误提示模板: + +```js +const validateMessages = { + required: "'${name}' 是必选字段", + // ... +}; + + + +; +``` + +## Form.Item + +表单字段组件,用于数据双向绑定、校验、布局等。 + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| colon | 配合 `label` 属性使用,表示是否显示 `label` 后面的冒号 | boolean | true | | +| dependencies | 设置依赖字段,说明[见下](#dependencies) | [NamePath](#namepath)\[] | - | | +| extra | 额外的提示信息,和 `help` 类似,当需要错误信息和提示文案同时出现时,可以使用这个。 | ReactNode | - | | +| getValueFromEvent | 设置如何将 event 的值转换成字段值 | (..args: any\[]) => any | - | | +| getValueProps | 为子元素添加额外的属性 (不建议通过 `getValueProps` 生成动态函数 prop,请直接将其传递给子组件) | (value: any) => Record | - | 4.2.0 | +| hasFeedback | 配合 `validateStatus` 属性使用,展示校验状态图标,建议只配合 Input 组件使用 此外,它还可以通过 Icons 属性获取反馈图标。 | boolean \| { icons: [FeedbackIcons](#feedbackicons) } | false | icons: 5.9.0 | +| help | 提示信息,如不设置,则会根据校验规则自动生成 | ReactNode | - | | +| hidden | 是否隐藏字段(依然会收集和校验字段) | boolean | false | 4.4.0 | +| htmlFor | 设置子元素 label `htmlFor` 属性 | string | - | | +| initialValue | 设置子元素默认值,如果与 Form 的 `initialValues` 冲突则以 Form 为准 | string | - | 4.2.0 | +| label | `label` 标签的文本 | ReactNode | - | | +| labelAlign | 标签文本对齐方式 | `left` \| `right` | `right` | | +| labelCol | `label` 标签布局,同 `` 组件,设置 `span` `offset` 值,如 `{span: 3, offset: 12}` 或 `sm: {span: 3, offset: 12}`。你可以通过 Form 的 `labelCol` 进行统一设置,不会作用于嵌套 Item。当和 Form 同时设置时,以 Item 为准 | [object](/components/grid-cn#col) | - | | +| messageVariables | 默认验证字段的信息 | Record<string, string> | - | 4.7.0 | +| name | 字段名,支持数组 | [NamePath](#namepath) | - | | +| normalize | 组件获取值后进行转换,再放入 Form 中。不支持异步 | (value, prevValue, prevValues) => any | - | | +| noStyle | 为 `true` 时不带样式,作为纯字段控件使用。当自身没有 `validateStatus` 而父元素存在有 `validateStatus` 的 Form.Item 会继承父元素的 `validateStatus` | boolean | false | | +| preserve | 当字段被删除时保留字段值 | boolean | true | 4.4.0 | +| required | 必填样式设置。如不设置,则会根据校验规则自动生成 | boolean | false | | +| rules | 校验规则,设置字段的校验逻辑。点击[此处](#components-form-demo-basic)查看示例 | [Rule](#rule)\[] | - | | +| shouldUpdate | 自定义字段更新逻辑,说明[见下](#shouldupdate) | boolean \| (prevValue, curValue) => boolean | false | | +| tooltip | 配置提示信息 | ReactNode \| [TooltipProps & { icon: ReactNode }](/components/tooltip-cn#api) | - | 4.7.0 | +| trigger | 设置收集字段值变更的时机。点击[此处](#components-form-demo-customized-form-controls)查看示例 | string | `onChange` | | +| validateFirst | 当某一规则校验不通过时,是否停止剩下的规则的校验。设置 `parallel` 时会并行校验 | boolean \| `parallel` | false | `parallel`: 4.5.0 | +| validateDebounce | 设置防抖,延迟毫秒数后进行校验 | number | - | 5.9.0 | +| validateStatus | 校验状态,如不设置,则会根据校验规则自动生成,可选:'success' 'warning' 'error' 'validating' | string | - | | +| validateTrigger | 设置字段校验的时机 | string \| string\[] | `onChange` | | +| valuePropName | 子节点的值的属性,如 Switch、Checkbox 的是 `checked`。该属性为 `getValueProps` 的封装,自定义 `getValueProps` 后会失效 | string | `value` | | +| wrapperCol | 需要为输入控件设置布局样式时,使用该属性,用法同 `labelCol`。你可以通过 Form 的 `wrapperCol` 进行统一设置,不会作用于嵌套 Item。当和 Form 同时设置时,以 Item 为准 | [object](/components/grid-cn#col) | - | | + +被设置了 `name` 属性的 `Form.Item` 包装的控件,表单控件会自动添加 `value`(或 `valuePropName` 指定的其他属性) `onChange`(或 `trigger` 指定的其他属性),数据同步将被 Form 接管,这会导致以下结果: + +1. 你**不再需要也不应该**用 `onChange` 来做数据收集同步(你可以使用 Form 的 `onValuesChange`),但还是可以继续监听 `onChange` 事件。 +2. 你不能用控件的 `value` 或 `defaultValue` 等属性来设置表单域的值,默认值可以用 Form 里的 `initialValues` 来设置。注意 `initialValues` 不能被 `setState` 动态更新,你需要用 `setFieldsValue` 来更新。 +3. 你不应该用 `setState`,可以使用 `form.setFieldsValue` 来动态改变表单值。 + +### dependencies + +当字段间存在依赖关系时使用。如果一个字段设置了 `dependencies` 属性。那么它所依赖的字段更新时,该字段将自动触发更新与校验。一种常见的场景,就是注册用户表单的“密码”与“确认密码”字段。“确认密码”校验依赖于“密码”字段,设置 `dependencies` 后,“密码”字段更新会重新触发“校验密码”的校验逻辑。你可以参考[具体例子](#components-form-demo-dependencies)。 + +`dependencies` 不应和 `shouldUpdate` 一起使用,因为这可能带来更新逻辑的混乱。 + +### FeedbackIcons + +`({ status: ValidateStatus, errors: ReactNode, warnings: ReactNode }) => Record` + +### shouldUpdate + +Form 通过增量更新方式,只更新被修改的字段相关组件以达到性能优化目的。大部分场景下,你只需要编写代码或者与 [`dependencies`](#dependencies) 属性配合校验即可。而在某些特定场景,例如修改某个字段值后出现新的字段选项、或者纯粹希望表单任意变化都对某一个区域进行渲染。你可以通过 `shouldUpdate` 修改 Form.Item 的更新逻辑。 + +当 `shouldUpdate` 为 `true` 时,Form 的任意变化都会使该 Form.Item 重新渲染。这对于自定义渲染一些区域十分有帮助,要注意 Form.Item 里包裹的子组件必须由函数返回,否则 `shouldUpdate` 不会起作用: + +相关issue:[#34500](https://github.com/ant-design/ant-design/issues/34500) + +```js + + {() => { + return
{JSON.stringify(form.getFieldsValue(), null, 2)}
; + }} +
+``` + +你可以参考[示例](#components-form-demo-horizontal-login)查看具体使用场景。 + +当 `shouldUpdate` 为方法时,表单的每次数值更新都会调用该方法,提供原先的值与当前的值以供你比较是否需要更新。这对于是否根据值来渲染额外字段十分有帮助: + +```js + prevValues.additional !== curValues.additional}> + {() => { + return ( + + + + ); + }} + +``` + +你可以参考[示例](#components-form-demo-control-hooks)查看具体使用场景。 + +### messageVariables + +你可以通过 `messageVariables` 修改 Form.Item 的默认验证信息。 + +```js + + + + + user} + rules={[{ required: true, message: '${label} is required' }]} + > + + + +``` + +## Form.List + +为字段提供数组化管理。 + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| children | 渲染函数 | (fields: Field\[], operation: { add, remove, move }, meta: { errors }) => React.ReactNode | - | | +| initialValue | 设置子元素默认值,如果与 Form 的 `initialValues` 冲突则以 Form 为准 | any\[] | - | 4.9.0 | +| name | 字段名,支持数组。List 本身也是字段,因而 `getFieldsValue()` 默认会返回 List 下所有值,你可以通过[参数](#getfieldsvalue)改变这一行为 | [NamePath](#namepath) | - | | +| rules | 校验规则,仅支持自定义规则。需要配合 [ErrorList](#formerrorlist) 一同使用。 | { validator, message }\[] | - | 4.7.0 | + +```ts + + {(fields) => + fields.map((field) => ( + + + + )) + } + +``` + +注意:Form.List 下的字段不应该配置 `initialValue`,你始终应该通过 Form.List 的 `initialValue` 或者 Form 的 `initialValues` 来配置。 + +## operation + +Form.List 渲染表单相关操作函数。 + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| ------ | ---------- | -------------------------------------------------- | ----------- | ----- | +| add | 新增表单项 | (defaultValue?: any, insertIndex?: number) => void | insertIndex | 4.6.0 | +| move | 移动表单项 | (from: number, to: number) => void | - | | +| remove | 删除表单项 | (index: number \| number\[]) => void | number\[] | 4.5.0 | + +## Form.ErrorList + +4.7.0 新增。错误展示组件,仅限配合 Form.List 的 rules 一同使用。参考[示例](#components-form-demo-dynamic-form-item)。 + +| 参数 | 说明 | 类型 | 默认值 | +| ------ | -------- | ------------ | ------ | +| errors | 错误列表 | ReactNode\[] | - | + +## Form.Provider + +提供表单间联动功能,其下设置 `name` 的 Form 更新时,会自动触发对应事件。查看[示例](#components-form-demo-form-context)。 + +| 参数 | 说明 | 类型 | 默认值 | +| --- | --- | --- | --- | +| onFormChange | 子表单字段更新时触发 | function(formName: string, info: { changedFields, forms }) | - | +| onFormFinish | 子表单提交时触发 | function(formName: string, info: { values, forms }) | - | + +```js + { + if (name === 'form1') { + // Do something... + } + }} +> +
...
+
...
+
+``` + +### FormInstance + +| 名称 | 说明 | 类型 | 版本 | +| --- | --- | --- | --- | +| getFieldError | 获取对应字段名的错误信息 | (name: [NamePath](#namepath)) => string\[] | | +| getFieldInstance | 获取对应字段实例 | (name: [NamePath](#namepath)) => any | 4.4.0 | +| getFieldsError | 获取一组字段名对应的错误信息,返回为数组形式 | (nameList?: [NamePath](#namepath)\[]) => FieldError\[] | | +| getFieldsValue | 获取一组字段名对应的值,会按照对应结构返回。默认返回现存字段值,当调用 `getFieldsValue(true)` 时返回所有值 | [GetFieldsValue](#getfieldsvalue) | | +| getFieldValue | 获取对应字段名的值 | (name: [NamePath](#namepath)) => any | | +| isFieldsTouched | 检查一组字段是否被用户操作过,`allTouched` 为 `true` 时检查是否所有字段都被操作过 | (nameList?: [NamePath](#namepath)\[], allTouched?: boolean) => boolean | | +| isFieldTouched | 检查对应字段是否被用户操作过 | (name: [NamePath](#namepath)) => boolean | | +| isFieldValidating | 检查对应字段是否正在校验 | (name: [NamePath](#namepath)) => boolean | | +| resetFields | 重置一组字段到 `initialValues` | (fields?: [NamePath](#namepath)\[]) => void | | +| scrollToField | 滚动到对应字段位置 | (name: [NamePath](#namepath), options: [ScrollOptions](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options)) => void | | +| setFields | 设置一组字段状态 | (fields: [FieldData](#fielddata)\[]) => void | | +| setFieldValue | 设置表单的值(该值将直接传入 form store 中并且**重置错误信息**。如果你不希望传入对象被修改,请克隆后传入) | (name: [NamePath](#namepath), value: any) => void | 4.22.0 | +| setFieldsValue | 设置表单的值(该值将直接传入 form store 中并且**重置错误信息**。如果你不希望传入对象被修改,请克隆后传入)。如果你只想修改 Form.List 中单项值,请通过 `setFieldValue` 进行指定 | (values) => void | | +| submit | 提交表单,与点击 `submit` 按钮效果相同 | () => void | | +| validateFields | 触发表单验证,设置 `recursive` 时会递归校验所有包含的路径 | (nameList?: [NamePath](#namepath)\[], config?: [ValidateConfig](#validateFields)) => Promise | | + +#### validateFields + +```ts +export interface ValidateConfig { + // 5.5.0 新增。仅校验内容而不会将错误信息展示到 UI 上。 + validateOnly?: boolean; + // 5.9.0 新增。对提供的 `nameList` 与其子路径进行递归校验。 + recursive?: boolean; + // 5.11.0 新增。校验 dirty 的字段(touched + validated)。 + // 使用 `dirty` 可以很方便的仅校验用户操作过和被校验过的字段。 + dirty?: boolean; +} +``` + +返回示例: + +```js +validateFields() + .then((values) => { + /* + values: + { + username: 'username', + password: 'password', + } + */ + }) + .catch((errorInfo) => { + /* + errorInfo: + { + values: { + username: 'username', + password: 'password', + }, + errorFields: [ + { name: ['password'], errors: ['Please input your Password!'] }, + ], + outOfDate: false, + } + */ + }); +``` + +## Hooks + +### Form.useForm + +`type Form.useForm = (): [FormInstance]` + +创建 Form 实例,用于管理所有数据状态。 + +### Form.useFormInstance + +`type Form.useFormInstance = (): FormInstance` + +`4.20.0` 新增,获取当前上下文正在使用的 Form 实例,常见于封装子组件消费无需透传 Form 实例: + +```ts +const Sub = () => { + const form = Form.useFormInstance(); + + return +
+ + + +
+
+ ); +}; +``` + +### Form.Item.useStatus + +`type Form.Item.useStatus = (): { status: ValidateStatus | undefined, errors: ReactNode[], warnings: ReactNode[] }` + +`4.22.0` 新增,可用于获取当前 Form.Item 的校验状态,如果上层没有 Form.Item,`status` 将会返回 `undefined`。`5.4.0` 新增 `errors` 和 `warnings`,可用于获取当前 Form.Item 的错误信息和警告信息: + +```ts +const CustomInput = ({ value, onChange }) => { + const { status, errors } = Form.Item.useStatus(); + return ( + + ); +}; + +export default () => ( +
+ + + +
+); +``` + +#### 与其他获取数据的方式的区别 + +Form 仅会对变更的 Field 进行刷新,从而避免完整的组件刷新可能引发的性能问题。因而你无法在 render 阶段通过 `form.getFieldsValue` 来实时获取字段值,而 `useWatch` 提供了一种特定字段访问的方式,从而使得在当前组件中可以直接消费字段的值。同时,如果为了更好的渲染性能,你可以通过 Field 的 renderProps 仅更新需要更新的部分。而当当前组件更新或者 effect 都不需要消费字段值时,则可以通过 `onValuesChange` 将数据抛出,从而避免组件更新。 + +### Interface + +#### NamePath + +`string | number | (string | number)[]` + +#### GetFieldsValue + +`getFieldsValue` 提供了多种重载方法: + +##### getFieldsValue(nameList?: true | [NamePath](#namepath)\[], filterFunc?: FilterFunc) + +当不提供 `nameList` 时,返回所有注册字段,这也包含 List 下所有的值(即便 List 下没有绑定 Item)。 + +当 `nameList` 为 `true` 时,返回 store 中所有的值,包含未注册字段。例如通过 `setFieldsValue` 设置了不存在的 Item 的值,也可以通过 `true` 全部获取。 + +当 `nameList` 为数组时,返回规定路径的值。需要注意的是,`nameList` 为嵌套数组。例如你需要某路径值应该如下: + +```ts +// 单个路径 +form.getFieldsValue([['user', 'age']]); + +// 多个路径 +form.getFieldsValue([ + ['user', 'age'], + ['preset', 'account'], +]); +``` + +##### getFieldsValue({ strict?: boolean, filter?: FilterFunc }) + +`5.8.0` 新增接受配置参数。当 `strict` 为 `true` 时会仅匹配 Item 的值。例如 `{ list: [{ bamboo: 1, little: 2 }] }` 中,如果 List 仅绑定了 `bamboo` 字段,那么 `getFieldsValue({ strict: true })` 会只获得 `{ list: [{ bamboo: 1 }] }`。 + +#### FilterFunc + +用于过滤一些字段值,`meta` 会返回字段相关信息。例如可以用来获取仅被用户修改过的值等等。 + +```ts +type FilterFunc = (meta: { touched: boolean; validating: boolean }) => boolean; +``` + +#### FieldData + +| 名称 | 说明 | 类型 | +| ---------- | ---------------- | ------------------------ | +| errors | 错误信息 | string\[] | +| warnings | 警告信息 | string\[] | +| name | 字段名称 | [NamePath](#namepath)\[] | +| touched | 是否被用户操作过 | boolean | +| validating | 是否正在校验 | boolean | +| value | 字段对应值 | any | + +#### Rule + +Rule 支持接收 object 进行配置,也支持 function 来动态获取 form 的数据: + +```ts +type Rule = RuleConfig | ((form: FormInstance) => RuleConfig); +``` + +| 名称 | 说明 | 类型 | 版本 | +| --- | --- | --- | --- | +| defaultField | 仅在 `type` 为 `array` 类型时有效,用于指定数组元素的校验规则 | [rule](#rule) | | +| enum | 是否匹配枚举中的值(需要将 `type` 设置为 `enum`) | any\[] | | +| fields | 仅在 `type` 为 `array` 或 `object` 类型时有效,用于指定子元素的校验规则 | Record<string, [rule](#rule)> | | +| len | string 类型时为字符串长度;number 类型时为确定数字; array 类型时为数组长度 | number | | +| max | 必须设置 `type`:string 类型为字符串最大长度;number 类型时为最大值;array 类型时为数组最大长度 | number | | +| message | 错误信息,不设置时会通过[模板](#validatemessages)自动生成 | string | | +| min | 必须设置 `type`:string 类型为字符串最小长度;number 类型时为最小值;array 类型时为数组最小长度 | number | | +| pattern | 正则表达式匹配 | RegExp | | +| required | 是否为必选字段 | boolean | | +| transform | 将字段值转换成目标值后进行校验 | (value) => any | | +| type | 类型,常见有 `string` \|`number` \|`boolean` \|`url` \| `email`。更多请参考[此处](https://github.com/yiminghe/async-validator#type) | string | | +| validateTrigger | 设置触发验证时机,必须是 Form.Item 的 `validateTrigger` 的子集 | string \| string\[] | | +| validator | 自定义校验,接收 Promise 作为返回值。[示例](#components-form-demo-register)参考 | ([rule](#rule), value) => Promise | | +| warningOnly | 仅警告,不阻塞表单提交 | boolean | 4.17.0 | +| whitespace | 如果字段仅包含空格则校验不通过,只在 `type: 'string'` 时生效 | boolean | | + +#### WatchOptions + +| 名称 | 说明 | 类型 | 默认值 | 版本 | +| -------- | ------------------------------------- | ------------ | ---------------------- | ----- | +| form | 指定 Form 实例 | FormInstance | 当前 context 中的 Form | 5.4.0 | +| preserve | 是否监视没有对应的 `Form.Item` 的字段 | boolean | false | 5.4.0 | + +## FAQ + +### Switch、Checkbox 为什么不能绑定数据? + +Form.Item 默认绑定值属性到 `value` 上,而 Switch、Checkbox 等组件的值属性为 `checked`。你可以通过 `valuePropName` 来修改绑定的值属性。 + +```ts | pure + + + +``` + +### name 为数组时的转换规则? + +当 `name` 为数组时,会按照顺序填充路径。当存在数字且 form store 中没有该字段时会自动转变成数组。因而如果需要数组为 key 时请使用 string 如:`['1', 'name']`。 + +### 为何在 Modal 中调用 form 控制台会报错? + +> Warning: Instance created by `useForm` is not connect to any Form element. Forget to pass `form` prop? + +这是因为你在调用 form 方法时,Modal 还未初始化导致 form 没有关联任何 Form 组件。你可以通过给 Modal 设置 `forceRender` 将其预渲染。示例点击[此处](https://codesandbox.io/s/antd-reproduction-template-ibu5c)。 + +### 为什么 Form.Item 下的子组件 `defaultValue` 不生效? + +当你为 Form.Item 设置 `name` 属性后,子组件会转为受控模式。因而 `defaultValue` 不会生效。你需要在 Form 上通过 `initialValues` 设置默认值。 + +### 为什么第一次调用 `ref` 的 Form 为空? + +`ref` 仅在节点被加载时才会被赋值,请参考 React 官方文档: + +### 为什么 `resetFields` 会重新 mount 组件? + +`resetFields` 会重置整个 Field,因而其子组件也会重新 mount 从而消除自定义组件可能存在的副作用(例如异步数据、状态等等)。 + +### Form 的 initialValues 与 Item 的 initialValue 区别? + +在大部分场景下,我们总是推荐优先使用 Form 的 `initialValues`。只有存在动态字段时你才应该使用 Item 的 `initialValue`。默认值遵循以下规则: + +1. Form 的 `initialValues` 拥有最高优先级 +2. Field 的 `initialValue` 次之 \*. 多个同 `name` Item 都设置 `initialValue` 时,则 Item 的 `initialValue` 不生效 + +### 为什么 `getFieldsValue` 在初次渲染的时候拿不到值? + +`getFieldsValue` 默认返回收集的字段数据,而在初次渲染时 Form.Item 节点尚未渲染,因而无法收集到数据。你可以通过 `getFieldsValue(true)` 来获取所有字段数据。 + +### 为什么 `setFieldsValue` 设置字段为 `undefined` 时,有的组件不会重置为空? + +在 React 中,`value` 从确定值改为 `undefined` 表示从受控变为非受控,因而不会重置展示值(但是 Form 中的值确实已经改变)。你可以通过 HOC 改变这一逻辑: + +```js +const MyInput = ({ + // 强制保持受控逻辑 + value = '', + ...rest +}) => ; + + + +; +``` + +### 为什么字段设置 `rules` 后更改值 `onFieldsChange` 会触发三次? + +字段除了本身的值变化外,校验也是其状态之一。因而在触发字段变化会经历以下几个阶段: + +1. Trigger value change +2. Rule validating +3. Rule validated + +在触发过程中,调用 `isFieldValidating` 会经历 `false` > `true` > `false` 的变化过程。 + +### 为什么 Form.List 不支持 `label` 还需要使用 ErrorList 展示错误? + +Form.List 本身是 renderProps,内部样式非常自由。因而默认配置 `label` 和 `error` 节点很难与之配合。如果你需要 antd 样式的 `label`,可以通过外部包裹 Form.Item 来实现。 + +### 为什么 Form.Item 的 `dependencies` 对 Form.List 下的字段没有效果? + +Form.List 下的字段需要包裹 Form.List 本身的 `name`,比如: + +```ts + + {(fields) => + fields.map((field) => ( + + + + + )) + } + +``` + +依赖则是:`['users', 0, 'name']` + +### 为什么 `normalize` 不能是异步方法? + +React 中异步更新会导致受控组件交互行为异常。当用户交互触发 `onChange` 后,通过异步改变值会导致组件 `value` 不会立刻更新,使得组件呈现假死状态。如果你需要异步触发变更,请通过自定义组件实现内部异步状态。 + + + +### `scrollToFirstError` 和 `scrollToField` 失效? + +1. 使用了自定义表单控件 + +类似问题:[#28370](https://github.com/ant-design/ant-design/issues/28370) [#27994](https://github.com/ant-design/ant-design/issues/27994) + +滚动依赖于表单控件元素上绑定的 `id` 字段,如果自定义控件没有将 `id` 赋到正确的元素上,这个功能将失效。你可以参考这个 [codesandbox](https://codesandbox.io/s/antd-reproduction-template-forked-25nul?file=/index.js)。 + +2. 页面内有多个表单 + +页面内如果有多个表单,且存在表单项 `name` 重复,表单滚动定位可能会查找到另一个表单的同名表单项上。需要给表单 `Form` 组件设置不同的 `name` 以区分。 + +### 继上,为何不通过 `ref` 绑定元素? + +当自定义组件不支持 `ref` 时,Form 无法获取子元素真实 DOM 节点,而通过包裹 Class Component 调用 `findDOMNode` 会在 React Strict Mode 下触发警告。因而我们使用 id 来进行元素定位。 + +### `setFieldsValue` 不会触发 `onFieldsChange` 和 `onValuesChange`? + +是的,change 事件仅当用户交互才会触发。该设计是为了防止在 change 事件中调用 `setFieldsValue` 导致的循环问题。如果仅仅需要组件内消费,可以通过 `useWatch` 或者 `Field.renderProps` 来实现。 + +### 为什么 Form.Item 嵌套子组件后,不更新表单值? + +Form.Item 在渲染时会注入 `value` 与 `onChange` 事件给子元素,当你的字段组件被包裹时属性将无法传递。所以以下代码是不会生效的: + +```js + +
+

I am a wrapped Input

+ +
+
+``` + +你可以通过 HOC 自定义组件形式来解决这个问题: + +```js +const MyInput = (props) => ( +
+

I am a wrapped Input

+ +
+); + + + +; +``` + +### 有更多参考文档吗? + +- 你可以阅读[《antd v4 Form 使用心得》](https://zhuanlan.zhihu.com/p/375753910)获得一些使用帮助以及建议。 +- 想在 DatePicker、Switch 也使用 before、after?可以参考[《如何优雅的对 Form.Item 的 children 增加 before、after》](https://zhuanlan.zhihu.com/p/422752055)。 +- 优雅的 Form + Modal 结合使用方案[《如何优雅的使用 Form + Modal》](https://zhuanlan.zhihu.com/p/388222294)。 diff --git a/packages/meta/src/grid/index.zh-CN.md b/packages/meta/src/grid/index.zh-CN.md index 36c5d18..232f61a 100644 --- a/packages/meta/src/grid/index.zh-CN.md +++ b/packages/meta/src/grid/index.zh-CN.md @@ -3,6 +3,8 @@ category: Components subtitle: 栅格 group: 布局 title: Grid 栅格 +toc: content + --- 24 栅格系统。 diff --git a/packages/meta/src/index.md b/packages/meta/src/index.md deleted file mode 100644 index c54cdfa..0000000 --- a/packages/meta/src/index.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -nav: - title: 元组件 -title: 快速上手 -order: 1 ---- - -## 目录结构 - - -
    -
  • - src - 开发文件夹 -
      -
    • - Component1 - 组件目录 -
        -
      • - index.ts - 入口文件 -
      • -
      • - Component1.tsx - 组件1 -
      • -
      • - Component1Helper.ts - 组件函数 -
      • -
      • - index.less - 样式文件 -
      • -
      • - index.md - 说明文档 -
      • -
      -
    • -
    • - utils - 公共函数文件夹 -
    • -
    • - index.ts - 总入口文件 -
    • -
    -
  • -
  • - .dumirc.ts - 文档配置 -
  • -
  • - package.json - 这是 package.json -
  • -
-
- - - - diff --git a/packages/meta/src/index.tsx b/packages/meta/src/index.tsx index 84e9055..bddba51 100644 --- a/packages/meta/src/index.tsx +++ b/packages/meta/src/index.tsx @@ -30,8 +30,15 @@ export { default as Calendar } from './calendar' export type { CalendarProps } from './calendar'; export { default as Empty } from './empty' export type { EmptyProps } from './empty'; -export { default as Form } from './form' -export type { FormProps, FormItemProps } from './form'; +export { default as Form } from './form'; +export type { + FormInstance, + FormItemProps, + FormListFieldData, + FormListOperation, + FormProps, + Rule as FormRule, +} from './form'; export { default as Select } from './select' export type { SelectProps } from './select'; export { default as Radio } from './radio' @@ -81,4 +88,8 @@ export { default as Tour } from './tour' export type { TourLocale, TourProps, TourStepProps } from './tour/interface' export { default as Segmented } from './segmented' export type { SegmentedLabeledOption, SegmentedProps, SegmentedValue } from './segmented' +export { default as App } from './app'; +export type { AppProps } from './app'; +export { default as notification } from './notification'; +export type { ArgsProps as NotificationArgsProps } from './notification'; export { default as ButtonList } from './ButtonList' diff --git a/packages/meta/src/input-number/index.zh-CN.md b/packages/meta/src/input-number/index.zh-CN.md index cd104d3..4fdb66f 100644 --- a/packages/meta/src/input-number/index.zh-CN.md +++ b/packages/meta/src/input-number/index.zh-CN.md @@ -3,6 +3,7 @@ category: Components subtitle: 数字输入框 group: 数据录入 title: InputNumber 数字输入框 +toc: content demo: cols: 2 --- diff --git a/packages/meta/src/input/index.zh-CN.md b/packages/meta/src/input/index.zh-CN.md index ef1dd44..6739e30 100644 --- a/packages/meta/src/input/index.zh-CN.md +++ b/packages/meta/src/input/index.zh-CN.md @@ -2,6 +2,7 @@ category: Components subtitle: 输入框 group: 数据录入 +toc: content title: Input 输入框 demo: cols: 2 diff --git a/packages/meta/src/message/index.zh-CN.md b/packages/meta/src/message/index.zh-CN.md index e5a5d22..b89f7fe 100644 --- a/packages/meta/src/message/index.zh-CN.md +++ b/packages/meta/src/message/index.zh-CN.md @@ -2,6 +2,7 @@ category: Components subtitle: 全局提示 group: 反馈 +toc: content noinstant: true title: Message 全局提示 demo: diff --git a/packages/meta/src/modal/index.zh-CN.md b/packages/meta/src/modal/index.zh-CN.md index 6e2f17b..45b1533 100644 --- a/packages/meta/src/modal/index.zh-CN.md +++ b/packages/meta/src/modal/index.zh-CN.md @@ -2,6 +2,7 @@ group: 反馈 category: Components subtitle: 对话框 +toc: content title: Modal 对话框 demo: cols: 2 diff --git a/packages/meta/src/notification/PurePanel.tsx b/packages/meta/src/notification/PurePanel.tsx new file mode 100644 index 0000000..7d27d45 --- /dev/null +++ b/packages/meta/src/notification/PurePanel.tsx @@ -0,0 +1,135 @@ +import * as React from 'react'; +import CheckCircleFilled from '@ant-design/icons/CheckCircleFilled'; +import CloseCircleFilled from '@ant-design/icons/CloseCircleFilled'; +import CloseOutlined from '@ant-design/icons/CloseOutlined'; +import ExclamationCircleFilled from '@ant-design/icons/ExclamationCircleFilled'; +import InfoCircleFilled from '@ant-design/icons/InfoCircleFilled'; +import LoadingOutlined from '@ant-design/icons/LoadingOutlined'; +import classNames from 'classnames'; +import { Notice } from 'rc-notification'; +import type { NoticeProps } from 'rc-notification/lib/Notice'; + +import { ConfigContext } from '../config-provider'; +import useCSSVarCls from '../config-provider/hooks/useCSSVarCls'; +import type { IconType } from './interface'; +import useStyle from './style'; +import PurePanelStyle from './style/pure-panel'; + +export const TypeIcon = { + info: , + success: , + error: , + warning: , + loading: , +}; + +export function getCloseIcon(prefixCls: string, closeIcon?: React.ReactNode): React.ReactNode { + if (closeIcon === null || closeIcon === false) { + return null; + } + return ( + closeIcon || ( + + + + ) + ); +} + +export interface PureContentProps { + prefixCls: string; + icon?: React.ReactNode; + message?: React.ReactNode; + description?: React.ReactNode; + btn?: React.ReactNode; + type?: IconType; + role?: 'alert' | 'status'; +} + +const typeToIcon = { + success: CheckCircleFilled, + info: InfoCircleFilled, + error: CloseCircleFilled, + warning: ExclamationCircleFilled, +}; + +export const PureContent: React.FC = (props) => { + const { prefixCls, icon, type, message, description, btn, role = 'alert' } = props; + let iconNode: React.ReactNode = null; + if (icon) { + iconNode = {icon}; + } else if (type) { + iconNode = React.createElement(typeToIcon[type] || null, { + className: classNames(`${prefixCls}-icon`, `${prefixCls}-icon-${type}`), + }); + } + return ( +
+ {iconNode} +
{message}
+
{description}
+ {btn &&
{btn}
} +
+ ); +}; + +export interface PurePanelProps + extends Omit, + Omit { + prefixCls?: string; +} + +/** @private Internal Component. Do not use in your production. */ +const PurePanel: React.FC = (props) => { + const { + prefixCls: staticPrefixCls, + className, + icon, + type, + message, + description, + btn, + closable = true, + closeIcon, + className: notificationClassName, + ...restProps + } = props; + const { getPrefixCls } = React.useContext(ConfigContext); + + const prefixCls = staticPrefixCls || getPrefixCls('notification'); + const noticePrefixCls = `${prefixCls}-notice`; + + const rootCls = useCSSVarCls(prefixCls); + const [wrapCSSVar, hashId, cssVarCls] = useStyle(prefixCls, rootCls); + + return wrapCSSVar( +
+ + + } + /> +
, + ); +}; + +export default PurePanel; diff --git a/packages/meta/src/notification/__tests__/__snapshots__/demo-extend.test.ts.snap b/packages/meta/src/notification/__tests__/__snapshots__/demo-extend.test.ts.snap new file mode 100644 index 0000000..54e8351 --- /dev/null +++ b/packages/meta/src/notification/__tests__/__snapshots__/demo-extend.test.ts.snap @@ -0,0 +1,783 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders components/notification/demo/basic.tsx extend context correctly 1`] = ` + +`; + +exports[`renders components/notification/demo/basic.tsx extend context correctly 2`] = `[]`; + +exports[`renders components/notification/demo/custom-icon.tsx extend context correctly 1`] = ` + +`; + +exports[`renders components/notification/demo/custom-icon.tsx extend context correctly 2`] = `[]`; + +exports[`renders components/notification/demo/custom-style.tsx extend context correctly 1`] = ` + +`; + +exports[`renders components/notification/demo/custom-style.tsx extend context correctly 2`] = `[]`; + +exports[`renders components/notification/demo/duration.tsx extend context correctly 1`] = ` + +`; + +exports[`renders components/notification/demo/duration.tsx extend context correctly 2`] = `[]`; + +exports[`renders components/notification/demo/hooks.tsx extend context correctly 1`] = ` +Array [ +
+
+ +
+
+ +
+
, +