From f64a661e052b1a6afca7c792e2d6c39d29e8528e Mon Sep 17 00:00:00 2001 From: sealday Date: Mon, 15 Apr 2024 01:58:18 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=B8=85=E7=90=86=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=EF=BC=8C=E4=BF=AE=E5=A4=8D=20@tachybase/cli?= =?UTF-8?q?=20=E5=B7=A5=E5=85=B7=20=E5=85=B3=E8=81=94=20#704?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.daoyoucloud.com/daoyoucloud/tachycode/pulls/706 --- packages/core/build/tsconfig.json | 22 + packages/core/build/tsup.config.ts | 3 +- packages/core/cli/src/cli.ts | 3 +- packages/core/cli/src/util.ts | 6 +- .../.dumi/theme/builtins/LangSwitch/index.tsx | 11 - .../.dumi/theme/builtins/Previewer/index.tsx | 23 - .../.dumi/theme/slots/PreviewerActions.tsx | 219 - packages/core/client/.dumi/tsconfig.json | 4 - packages/core/client/.dumirc.ts | 469 --- .../en-US/core/application/application.md | 374 -- .../en-US/core/application/plugin-manager.md | 122 - .../application/plugin-settings-manager.md | 269 -- .../docs/en-US/core/application/plugin.md | 89 - .../en-US/core/application/router-manager.md | 386 -- .../data-block/collection-record-provider.md | 259 -- .../core/data-block/collection-record.md | 194 - .../core/data-block/data-block-provider.md | 246 -- .../data-block/data-block-request-provider.md | 139 - .../data-block-resource-provider.md | 36 - ...sociation-table-list-and-parent-record.tsx | 97 - .../association-table-list-and-source-id.tsx | 132 - .../collection-form-create.tsx | 95 - .../collection-form-get-and-update.tsx | 158 - .../collection-form-record-and-update.tsx | 137 - .../collection-table-list.tsx | 59 - .../data-block-provider/complete-demo.tsx | 162 - .../core/data-block/demos/settings/demo1.tsx | 99 - .../core/data-block/images/data-block.png | Bin 29926 -> 0 bytes .../core/data-block/images/markdown-block.png | Bin 4962 -> 0 bytes .../core/data-source/association-provider.md | 13 - .../collection-field-interface-manager.md | 171 - .../data-source/collection-field-interface.md | 94 - .../core/data-source/collection-field.md | 164 - .../collection-manager-provider.md | 52 - .../core/data-source/collection-manager.md | 175 - .../core/data-source/collection-mixins.md | 57 - .../core/data-source/collection-provider.md | 63 - .../collection-template-manager.md | 86 - .../core/data-source/collection-template.md | 249 -- .../docs/en-US/core/data-source/collection.md | 293 -- .../data-source-manager-provider.md | 25 - .../core/data-source/data-source-manager.md | 334 -- .../core/data-source/data-source-provider.md | 66 - .../en-US/core/data-source/data-source.md | 176 - .../demos/collection-field/demo1.tsx | 136 - .../demos/collection-field/demo2.tsx | 89 - .../data-source/demos/collection/demo1.tsx | 18 - .../core/data-source/demos/collections.json | 198 - .../core/data-source/demos/createApp.tsx | 98 - .../demos/data-source-manager/mixins.tsx | 46 - .../extend-collections-provider.md | 79 - .../collection-field-interface-form.png | Bin 26025 -> 0 bytes .../images/collection-field-interface.png | Bin 18213 -> 0 bytes .../images/collection-template-form.png | Bin 28054 -> 0 bytes .../images/collection-template.png | Bin 10153 -> 0 bytes .../core/data-source/images/field-groups.png | Bin 51287 -> 0 bytes .../static/CxjJbp0pcogYn6xviVyc6QT8nUg.png | Bin 97084 -> 0 bytes .../static/KTUWb69kioUg8bxYTAMc2ReDnRg.png | Bin 22194 -> 0 bytes .../static/VfPGbhWo9os0qTxcITkcHNfin4g.png | Bin 14642 -> 0 bytes .../docs/en-US/core/static/designer.png | Bin 24769 -> 0 bytes .../en-US/core/static/plugin-settings.jpg | Bin 134578 -> 0 bytes .../demos/schema-initializer-basic.tsx | 125 - .../demos/schema-initializer-common.tsx | 38 - .../demos/schema-initializer-component.tsx | 133 - .../schema-initializer-components-divider.tsx | 57 - .../schema-initializer-components-group.tsx | 71 - .../schema-initializer-components-item.tsx | 88 - .../schema-initializer-components-menu.tsx | 53 - .../schema-initializer-components-select.tsx | 53 - .../schema-initializer-components-switch.tsx | 88 - .../demos/schema-initializer-hooks-item.tsx | 33 - .../demos/schema-initializer-items.tsx | 146 - ...hema-initializer-options-item-children.tsx | 61 - ...schema-initializer-options-item-define.tsx | 34 - .../schema-initializer-options-item-props.tsx | 40 - ...chema-initializer-options-item-visible.tsx | 32 - .../demos/schema-initializer-popover.tsx | 114 - .../demos/schema-initializer-render.tsx | 127 - .../demos/schema-settings-common.tsx | 48 - ...chema-settings-components-action-modal.tsx | 66 - .../schema-settings-components-divider.tsx | 68 - .../schema-settings-components-group.tsx | 64 - .../demos/schema-settings-components-item.tsx | 76 - .../schema-settings-components-modal.tsx | 66 - .../schema-settings-components-remove.tsx | 28 - .../schema-settings-components-select.tsx | 82 - .../schema-settings-components-sub-menu.tsx | 64 - .../schema-settings-components-switch.tsx | 74 - .../schema-settings-options-item-children.tsx | 72 - .../schema-settings-options-item-define.tsx | 35 - .../schema-settings-options-item-props.tsx | 39 - .../schema-settings-options-item-visible.tsx | 35 - .../demos/schema-settings-render.tsx | 150 - .../docs/en-US/core/ui-schema/designable.md | 791 ---- .../en-US/core/ui-schema/schema-component.md | 212 - .../ui-schema/schema-initializer-manager.md | 186 - .../core/ui-schema/schema-initializer.md | 704 ---- .../core/ui-schema/schema-settings-manager.md | 188 - .../en-US/core/ui-schema/schema-settings.md | 467 --- .../en-US/core/ui-schema/schema-toolbar.md | 427 -- packages/core/client/docs/en-US/core/utils.md | 13 - packages/core/client/docs/en-US/index.md | 3 - .../docs/en-US/ui-schema/actions/add-new.md | 82 - .../en-US/ui-schema/actions/add-record.md | 1 - .../docs/en-US/ui-schema/actions/bulk-edit.md | 1 - .../en-US/ui-schema/actions/bulk-update.md | 1 - .../en-US/ui-schema/actions/custom-request.md | 88 - .../docs/en-US/ui-schema/actions/delete.md | 1 - .../docs/en-US/ui-schema/actions/duplicate.md | 1 - .../docs/en-US/ui-schema/actions/edit.md | 1 - .../docs/en-US/ui-schema/actions/export.md | 1 - .../docs/en-US/ui-schema/actions/filter.md | 1 - .../docs/en-US/ui-schema/actions/import.md | 1 - .../docs/en-US/ui-schema/actions/index.md | 51 - .../docs/en-US/ui-schema/actions/print.md | 1 - .../docs/en-US/ui-schema/actions/refresh.md | 1 - .../en-US/ui-schema/actions/save-record.md | 1 - .../ui-schema/actions/submit-to-workflow.md | 1 - .../docs/en-US/ui-schema/actions/submit.md | 28 - .../en-US/ui-schema/actions/update-record.md | 1 - .../docs/en-US/ui-schema/actions/view.md | 1 - .../en-US/ui-schema/blocks/data/calendar.md | 282 -- .../en-US/ui-schema/blocks/data/charts.md | 143 - .../en-US/ui-schema/blocks/data/details.md | 169 - .../ui-schema/blocks/data/form-read-pretty.md | 286 -- .../docs/en-US/ui-schema/blocks/data/form.md | 418 -- .../docs/en-US/ui-schema/blocks/data/gantt.md | 185 - .../en-US/ui-schema/blocks/data/grid-card.md | 219 - .../docs/en-US/ui-schema/blocks/data/index.md | 255 -- .../en-US/ui-schema/blocks/data/kanban.md | 160 - .../docs/en-US/ui-schema/blocks/data/list.md | 213 - .../docs/en-US/ui-schema/blocks/data/map.md | 115 - .../docs/en-US/ui-schema/blocks/data/table.md | 193 - .../en-US/ui-schema/blocks/filter/collapse.md | 41 - .../en-US/ui-schema/blocks/filter/form.md | 63 - .../docs/en-US/ui-schema/blocks/index.md | 1 - .../en-US/ui-schema/blocks/others/iframe.md | 22 - .../en-US/ui-schema/blocks/others/markdown.md | 24 - .../ui-schema/blocks/others/workflow-todo.md | 33 - .../association-components/cascader-select.md | 1 - .../association-components/file-manager.md | 1 - .../fields/association-components/index.md | 21 - .../association-components/record-picker.md | 1 - .../fields/association-components/select.md | 1 - .../association-components/sub-details.md | 1 - .../sub-form-popover.md | 1 - .../fields/association-components/sub-form.md | 1 - .../association-components/sub-table.md | 1 - .../fields/association-components/tag.md | 1 - .../fields/association-components/title.md | 1 - .../docs/en-US/ui-schema/fields/form-item.md | 22 - .../docs/en-US/ui-schema/fields/index.md | 5 - .../en-US/ui-schema/fields/table-column.md | 40 - .../docs/en-US/ui-schema/globals/menu.md | 127 - .../docs/en-US/ui-schema/globals/page.md | 94 - .../docs/en-US/ui-schema/globals/tabs.md | 5 - .../core/client/docs/en-US/ui-schema/index.md | 25 - .../zh-CN/core/application/application.md | 374 -- .../zh-CN/core/application/plugin-manager.md | 122 - .../application/plugin-settings-manager.md | 269 -- .../docs/zh-CN/core/application/plugin.md | 89 - .../zh-CN/core/application/router-manager.md | 386 -- .../data-block/collection-record-provider.md | 259 -- .../core/data-block/collection-record.md | 194 - .../core/data-block/data-block-provider.md | 246 -- .../data-block/data-block-request-provider.md | 139 - .../data-block-resource-provider.md | 36 - ...sociation-table-list-and-parent-record.tsx | 97 - .../association-table-list-and-source-id.tsx | 132 - .../collection-form-create.tsx | 95 - .../collection-form-get-and-update.tsx | 158 - .../collection-form-record-and-update.tsx | 137 - .../collection-table-list.tsx | 59 - .../data-block-provider/complete-demo.tsx | 162 - .../core/data-block/demos/settings/demo1.tsx | 99 - .../core/data-block/images/data-block.png | Bin 29926 -> 0 bytes .../core/data-block/images/markdown-block.png | Bin 4962 -> 0 bytes .../core/data-source/association-provider.md | 13 - .../collection-field-interface-manager.md | 171 - .../data-source/collection-field-interface.md | 94 - .../core/data-source/collection-field.md | 164 - .../collection-manager-provider.md | 52 - .../core/data-source/collection-manager.md | 175 - .../core/data-source/collection-mixins.md | 57 - .../core/data-source/collection-provider.md | 63 - .../collection-template-manager.md | 86 - .../core/data-source/collection-template.md | 249 -- .../docs/zh-CN/core/data-source/collection.md | 293 -- .../data-source-manager-provider.md | 25 - .../core/data-source/data-source-manager.md | 334 -- .../core/data-source/data-source-provider.md | 66 - .../zh-CN/core/data-source/data-source.md | 176 - .../demos/collection-field/demo1.tsx | 136 - .../demos/collection-field/demo2.tsx | 89 - .../data-source/demos/collection/demo1.tsx | 18 - .../core/data-source/demos/collections.json | 198 - .../core/data-source/demos/createApp.tsx | 98 - .../demos/data-source-manager/mixins.tsx | 46 - .../extend-collections-provider.md | 79 - .../collection-field-interface-form.png | Bin 26025 -> 0 bytes .../images/collection-field-interface.png | Bin 18213 -> 0 bytes .../images/collection-template-form.png | Bin 28054 -> 0 bytes .../images/collection-template.png | Bin 10153 -> 0 bytes .../core/data-source/images/field-groups.png | Bin 51287 -> 0 bytes .../static/CxjJbp0pcogYn6xviVyc6QT8nUg.png | Bin 97084 -> 0 bytes .../static/KTUWb69kioUg8bxYTAMc2ReDnRg.png | Bin 22194 -> 0 bytes .../static/VfPGbhWo9os0qTxcITkcHNfin4g.png | Bin 14642 -> 0 bytes .../docs/zh-CN/core/static/designer.png | Bin 24769 -> 0 bytes .../zh-CN/core/static/plugin-settings.jpg | Bin 134578 -> 0 bytes .../demos/schema-initializer-basic.tsx | 125 - .../demos/schema-initializer-common.tsx | 38 - .../demos/schema-initializer-component.tsx | 133 - .../schema-initializer-components-divider.tsx | 57 - .../schema-initializer-components-group.tsx | 71 - .../schema-initializer-components-item.tsx | 88 - .../schema-initializer-components-menu.tsx | 53 - .../schema-initializer-components-select.tsx | 53 - .../schema-initializer-components-switch.tsx | 88 - .../demos/schema-initializer-hooks-item.tsx | 33 - .../demos/schema-initializer-items.tsx | 146 - ...hema-initializer-options-item-children.tsx | 61 - ...schema-initializer-options-item-define.tsx | 34 - .../schema-initializer-options-item-props.tsx | 40 - ...chema-initializer-options-item-visible.tsx | 32 - .../demos/schema-initializer-popover.tsx | 114 - .../demos/schema-initializer-render.tsx | 127 - .../demos/schema-settings-common.tsx | 48 - ...chema-settings-components-action-modal.tsx | 66 - .../schema-settings-components-divider.tsx | 68 - .../schema-settings-components-group.tsx | 64 - .../demos/schema-settings-components-item.tsx | 76 - .../schema-settings-components-modal.tsx | 66 - .../schema-settings-components-remove.tsx | 28 - .../schema-settings-components-select.tsx | 82 - .../schema-settings-components-sub-menu.tsx | 64 - .../schema-settings-components-switch.tsx | 74 - .../schema-settings-options-item-children.tsx | 72 - .../schema-settings-options-item-define.tsx | 35 - .../schema-settings-options-item-props.tsx | 39 - .../schema-settings-options-item-visible.tsx | 35 - .../demos/schema-settings-render.tsx | 150 - .../docs/zh-CN/core/ui-schema/designable.md | 791 ---- .../zh-CN/core/ui-schema/schema-component.md | 212 - .../ui-schema/schema-initializer-manager.md | 186 - .../core/ui-schema/schema-initializer.md | 704 ---- .../core/ui-schema/schema-settings-manager.md | 188 - .../zh-CN/core/ui-schema/schema-settings.md | 467 --- .../zh-CN/core/ui-schema/schema-toolbar.md | 427 -- packages/core/client/docs/zh-CN/core/utils.md | 13 - packages/core/client/docs/zh-CN/index.md | 3 - .../docs/zh-CN/ui-schema/actions/add-new.md | 82 - .../zh-CN/ui-schema/actions/add-record.md | 1 - .../docs/zh-CN/ui-schema/actions/bulk-edit.md | 1 - .../zh-CN/ui-schema/actions/bulk-update.md | 1 - .../zh-CN/ui-schema/actions/custom-request.md | 88 - .../docs/zh-CN/ui-schema/actions/delete.md | 1 - .../docs/zh-CN/ui-schema/actions/duplicate.md | 1 - .../docs/zh-CN/ui-schema/actions/edit.md | 1 - .../docs/zh-CN/ui-schema/actions/export.md | 1 - .../docs/zh-CN/ui-schema/actions/filter.md | 1 - .../docs/zh-CN/ui-schema/actions/import.md | 1 - .../docs/zh-CN/ui-schema/actions/index.md | 51 - .../docs/zh-CN/ui-schema/actions/print.md | 1 - .../docs/zh-CN/ui-schema/actions/refresh.md | 1 - .../zh-CN/ui-schema/actions/save-record.md | 1 - .../ui-schema/actions/submit-to-workflow.md | 1 - .../docs/zh-CN/ui-schema/actions/submit.md | 28 - .../zh-CN/ui-schema/actions/update-record.md | 1 - .../docs/zh-CN/ui-schema/actions/view.md | 1 - .../zh-CN/ui-schema/blocks/data/calendar.md | 282 -- .../zh-CN/ui-schema/blocks/data/charts.md | 143 - .../zh-CN/ui-schema/blocks/data/details.md | 169 - .../ui-schema/blocks/data/form-read-pretty.md | 286 -- .../docs/zh-CN/ui-schema/blocks/data/form.md | 418 -- .../docs/zh-CN/ui-schema/blocks/data/gantt.md | 185 - .../zh-CN/ui-schema/blocks/data/grid-card.md | 219 - .../docs/zh-CN/ui-schema/blocks/data/index.md | 255 -- .../zh-CN/ui-schema/blocks/data/kanban.md | 160 - .../docs/zh-CN/ui-schema/blocks/data/list.md | 213 - .../docs/zh-CN/ui-schema/blocks/data/map.md | 115 - .../docs/zh-CN/ui-schema/blocks/data/table.md | 193 - .../zh-CN/ui-schema/blocks/filter/collapse.md | 41 - .../zh-CN/ui-schema/blocks/filter/form.md | 63 - .../docs/zh-CN/ui-schema/blocks/index.md | 1 - .../zh-CN/ui-schema/blocks/others/iframe.md | 22 - .../zh-CN/ui-schema/blocks/others/markdown.md | 24 - .../ui-schema/blocks/others/workflow-todo.md | 33 - .../association-components/cascader-select.md | 1 - .../association-components/file-manager.md | 1 - .../fields/association-components/index.md | 21 - .../association-components/record-picker.md | 1 - .../fields/association-components/select.md | 1 - .../association-components/sub-details.md | 1 - .../sub-form-popover.md | 1 - .../fields/association-components/sub-form.md | 1 - .../association-components/sub-table.md | 1 - .../fields/association-components/tag.md | 1 - .../fields/association-components/title.md | 1 - .../docs/zh-CN/ui-schema/fields/form-item.md | 22 - .../docs/zh-CN/ui-schema/fields/index.md | 5 - .../zh-CN/ui-schema/fields/table-column.md | 40 - .../docs/zh-CN/ui-schema/globals/menu.md | 127 - .../docs/zh-CN/ui-schema/globals/page.md | 94 - .../docs/zh-CN/ui-schema/globals/tabs.md | 5 - .../core/client/docs/zh-CN/ui-schema/index.md | 25 - packages/core/client/package.json | 4 +- .../core/client/src/formula/Expression.tsx | 239 -- packages/core/client/src/formula/Result.tsx | 53 - .../core/client/src/formula/demos/demo2.tsx | 51 - packages/core/client/src/formula/index.md | 9 - packages/core/client/src/formula/index.tsx | 9 - packages/core/client/src/index.ts | 1 - packages/core/client/tsconfig.json | 7 - packages/core/test/vitest.mjs | 4 +- packages/core/utils/tsconfig.json | 31 + .../plugin-excel-formula-field/.npmignore | 2 - .../plugin-excel-formula-field/LICENSE | 661 --- .../plugin-excel-formula-field/README.md | 9 - .../README.zh-CN.md | 9 - .../plugin-excel-formula-field/client.d.ts | 2 - .../plugin-excel-formula-field/client.js | 1 - .../plugin-excel-formula-field/package.json | 23 - .../plugin-excel-formula-field/server.d.ts | 2 - .../plugin-excel-formula-field/server.js | 1 - .../src/client/ExcelFormula/index.ts | 24 - .../src/client/ExcelFormulaFieldProvider.tsx | 30 - .../src/client/excel-formula.ts | 82 - .../src/client/index.tsx | 12 - .../plugin-excel-formula-field/src/index.ts | 2 - .../src/server/excel-formula-field.ts | 106 - .../src/server/index.ts | 1 - .../src/server/plugin.ts | 24 - .../src/utils/evaluate.ts | 9 - .../plugin-formula-field/src/client/index.tsx | 10 +- .../{FormulaFieldProvider.tsx => scopes.tsx} | 22 +- .../plugin-math-formula-field/.npmignore | 2 - .../plugin-math-formula-field/LICENSE | 661 --- .../plugin-math-formula-field/README.md | 9 - .../plugin-math-formula-field/README.zh-CN.md | 9 - .../plugin-math-formula-field/client.d.ts | 2 - .../plugin-math-formula-field/client.js | 1 - .../plugin-math-formula-field/package.json | 26 - .../plugin-math-formula-field/server.d.ts | 2 - .../plugin-math-formula-field/server.js | 1 - .../src/client/MathFormula/index.tsx | 22 - .../src/client/MathFormulaFieldProvider.tsx | 26 - .../src/client/index.tsx | 12 - .../src/client/math-formula.tsx | 82 - .../plugin-math-formula-field/src/index.ts | 2 - .../server/__tests__/formula-field.test.ts | 91 - .../src/server/index.ts | 1 - .../src/server/math-formula-field.ts | 106 - .../migrations/20230110103214-alert-field.ts | 24 - .../src/server/plugin.ts | 34 - .../src/utils/evaluate.ts | 8 - pnpm-lock.yaml | 3526 +---------------- tsconfig.json | 2 +- 357 files changed, 154 insertions(+), 35537 deletions(-) create mode 100644 packages/core/build/tsconfig.json delete mode 100644 packages/core/client/.dumi/theme/builtins/LangSwitch/index.tsx delete mode 100644 packages/core/client/.dumi/theme/builtins/Previewer/index.tsx delete mode 100644 packages/core/client/.dumi/theme/slots/PreviewerActions.tsx delete mode 100644 packages/core/client/.dumi/tsconfig.json delete mode 100644 packages/core/client/.dumirc.ts delete mode 100644 packages/core/client/docs/en-US/core/application/application.md delete mode 100644 packages/core/client/docs/en-US/core/application/plugin-manager.md delete mode 100644 packages/core/client/docs/en-US/core/application/plugin-settings-manager.md delete mode 100644 packages/core/client/docs/en-US/core/application/plugin.md delete mode 100644 packages/core/client/docs/en-US/core/application/router-manager.md delete mode 100644 packages/core/client/docs/en-US/core/data-block/collection-record-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-block/collection-record.md delete mode 100644 packages/core/client/docs/en-US/core/data-block/data-block-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-block/data-block-request-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-block/data-block-resource-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/association-table-list-and-parent-record.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/association-table-list-and-source-id.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-create.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-get-and-update.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-record-and-update.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-table-list.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/complete-demo.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-block/demos/settings/demo1.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-block/images/data-block.png delete mode 100644 packages/core/client/docs/en-US/core/data-block/images/markdown-block.png delete mode 100644 packages/core/client/docs/en-US/core/data-source/association-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-field-interface-manager.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-field-interface.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-field.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-manager-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-manager.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-mixins.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-template-manager.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection-template.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/collection.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/data-source-manager-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/data-source-manager.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/data-source-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/data-source.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/demos/collection-field/demo1.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-source/demos/collection-field/demo2.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-source/demos/collection/demo1.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-source/demos/collections.json delete mode 100644 packages/core/client/docs/en-US/core/data-source/demos/createApp.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-source/demos/data-source-manager/mixins.tsx delete mode 100644 packages/core/client/docs/en-US/core/data-source/extend-collections-provider.md delete mode 100644 packages/core/client/docs/en-US/core/data-source/images/collection-field-interface-form.png delete mode 100644 packages/core/client/docs/en-US/core/data-source/images/collection-field-interface.png delete mode 100644 packages/core/client/docs/en-US/core/data-source/images/collection-template-form.png delete mode 100644 packages/core/client/docs/en-US/core/data-source/images/collection-template.png delete mode 100644 packages/core/client/docs/en-US/core/data-source/images/field-groups.png delete mode 100644 packages/core/client/docs/en-US/core/static/CxjJbp0pcogYn6xviVyc6QT8nUg.png delete mode 100644 packages/core/client/docs/en-US/core/static/KTUWb69kioUg8bxYTAMc2ReDnRg.png delete mode 100644 packages/core/client/docs/en-US/core/static/VfPGbhWo9os0qTxcITkcHNfin4g.png delete mode 100644 packages/core/client/docs/en-US/core/static/designer.png delete mode 100644 packages/core/client/docs/en-US/core/static/plugin-settings.jpg delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-basic.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-common.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-component.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-divider.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-group.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-item.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-menu.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-select.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-switch.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-hooks-item.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-items.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-children.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-define.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-props.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-visible.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-popover.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-render.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-common.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-action-modal.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-divider.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-group.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-item.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-modal.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-remove.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-select.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-sub-menu.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-switch.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-children.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-define.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-props.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-visible.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-render.tsx delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/designable.md delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/schema-component.md delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/schema-initializer-manager.md delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/schema-initializer.md delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/schema-settings-manager.md delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/schema-settings.md delete mode 100644 packages/core/client/docs/en-US/core/ui-schema/schema-toolbar.md delete mode 100644 packages/core/client/docs/en-US/core/utils.md delete mode 100644 packages/core/client/docs/en-US/index.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/add-new.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/add-record.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/bulk-edit.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/bulk-update.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/custom-request.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/delete.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/duplicate.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/edit.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/export.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/filter.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/import.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/index.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/print.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/refresh.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/save-record.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/submit-to-workflow.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/submit.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/update-record.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/actions/view.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/calendar.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/charts.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/details.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/form-read-pretty.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/form.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/gantt.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/grid-card.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/index.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/kanban.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/list.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/map.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/data/table.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/filter/collapse.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/filter/form.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/index.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/others/iframe.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/others/markdown.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/blocks/others/workflow-todo.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/cascader-select.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/file-manager.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/index.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/record-picker.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/select.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-details.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-form-popover.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-form.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-table.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/tag.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/association-components/title.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/form-item.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/index.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/fields/table-column.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/globals/menu.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/globals/page.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/globals/tabs.md delete mode 100644 packages/core/client/docs/en-US/ui-schema/index.md delete mode 100644 packages/core/client/docs/zh-CN/core/application/application.md delete mode 100644 packages/core/client/docs/zh-CN/core/application/plugin-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/application/plugin-settings-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/application/plugin.md delete mode 100644 packages/core/client/docs/zh-CN/core/application/router-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/collection-record-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/collection-record.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/data-block-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/data-block-request-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/data-block-resource-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/association-table-list-and-parent-record.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/association-table-list-and-source-id.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-create.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-get-and-update.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-record-and-update.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-table-list.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/complete-demo.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/demos/settings/demo1.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/images/data-block.png delete mode 100644 packages/core/client/docs/zh-CN/core/data-block/images/markdown-block.png delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/association-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-field-interface-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-field-interface.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-field.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-manager-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-mixins.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-template-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection-template.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/collection.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/data-source-manager-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/data-source-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/data-source-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/data-source.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/demos/collection-field/demo1.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/demos/collection-field/demo2.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/demos/collection/demo1.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/demos/collections.json delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/demos/createApp.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/demos/data-source-manager/mixins.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/extend-collections-provider.md delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/images/collection-field-interface-form.png delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/images/collection-field-interface.png delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/images/collection-template-form.png delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/images/collection-template.png delete mode 100644 packages/core/client/docs/zh-CN/core/data-source/images/field-groups.png delete mode 100644 packages/core/client/docs/zh-CN/core/static/CxjJbp0pcogYn6xviVyc6QT8nUg.png delete mode 100644 packages/core/client/docs/zh-CN/core/static/KTUWb69kioUg8bxYTAMc2ReDnRg.png delete mode 100644 packages/core/client/docs/zh-CN/core/static/VfPGbhWo9os0qTxcITkcHNfin4g.png delete mode 100644 packages/core/client/docs/zh-CN/core/static/designer.png delete mode 100644 packages/core/client/docs/zh-CN/core/static/plugin-settings.jpg delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-basic.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-common.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-component.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-divider.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-group.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-item.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-menu.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-select.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-switch.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-hooks-item.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-items.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-children.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-define.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-props.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-visible.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-popover.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-render.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-common.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-action-modal.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-divider.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-group.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-item.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-modal.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-remove.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-select.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-sub-menu.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-switch.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-children.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-define.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-props.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-visible.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-render.tsx delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/designable.md delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/schema-component.md delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/schema-initializer-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/schema-initializer.md delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/schema-settings-manager.md delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/schema-settings.md delete mode 100644 packages/core/client/docs/zh-CN/core/ui-schema/schema-toolbar.md delete mode 100644 packages/core/client/docs/zh-CN/core/utils.md delete mode 100644 packages/core/client/docs/zh-CN/index.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/add-new.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/add-record.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/bulk-edit.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/bulk-update.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/custom-request.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/delete.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/duplicate.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/edit.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/export.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/filter.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/import.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/index.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/print.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/refresh.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/save-record.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/submit-to-workflow.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/submit.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/update-record.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/actions/view.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/calendar.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/charts.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/details.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/form-read-pretty.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/form.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/gantt.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/grid-card.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/index.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/kanban.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/list.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/map.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/data/table.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/filter/collapse.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/filter/form.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/index.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/others/iframe.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/others/markdown.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/blocks/others/workflow-todo.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/cascader-select.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/file-manager.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/index.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/record-picker.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/select.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-details.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-form-popover.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-form.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-table.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/tag.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/association-components/title.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/form-item.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/index.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/fields/table-column.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/globals/menu.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/globals/page.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/globals/tabs.md delete mode 100644 packages/core/client/docs/zh-CN/ui-schema/index.md delete mode 100644 packages/core/client/src/formula/Expression.tsx delete mode 100644 packages/core/client/src/formula/Result.tsx delete mode 100644 packages/core/client/src/formula/demos/demo2.tsx delete mode 100644 packages/core/client/src/formula/index.md delete mode 100644 packages/core/client/src/formula/index.tsx delete mode 100644 packages/core/client/tsconfig.json create mode 100644 packages/core/utils/tsconfig.json delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/.npmignore delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/LICENSE delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/README.md delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/README.zh-CN.md delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/client.d.ts delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/client.js delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/package.json delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/server.d.ts delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/server.js delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/client/ExcelFormula/index.ts delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/client/ExcelFormulaFieldProvider.tsx delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/client/excel-formula.ts delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/client/index.tsx delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/index.ts delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/server/excel-formula-field.ts delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/server/index.ts delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/server/plugin.ts delete mode 100644 packages/plugins/@nocobase/plugin-excel-formula-field/src/utils/evaluate.ts rename packages/plugins/@nocobase/plugin-formula-field/src/client/{FormulaFieldProvider.tsx => scopes.tsx} (55%) delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/.npmignore delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/LICENSE delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/README.md delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/README.zh-CN.md delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/client.d.ts delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/client.js delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/package.json delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/server.d.ts delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/server.js delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/client/MathFormula/index.tsx delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/client/MathFormulaFieldProvider.tsx delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/client/index.tsx delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/client/math-formula.tsx delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/index.ts delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/server/__tests__/formula-field.test.ts delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/server/index.ts delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/server/math-formula-field.ts delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/server/migrations/20230110103214-alert-field.ts delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/server/plugin.ts delete mode 100644 packages/plugins/@nocobase/plugin-math-formula-field/src/utils/evaluate.ts diff --git a/packages/core/build/tsconfig.json b/packages/core/build/tsconfig.json new file mode 100644 index 000000000..a0f4c89ef --- /dev/null +++ b/packages/core/build/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "lib": ["esnext", "DOM.Iterable", "DOM"], + "esModuleInterop": true, + "moduleResolution": "node", + "jsx": "react", + "target": "esnext", + "module": "esnext", + "allowJs": true, + "noUnusedLocals": false, + "preserveConstEnums": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "sourceMap": true, + "inlineSources": true, + "resolveJsonModule": true, + "declaration": true, + "experimentalDecorators": true, + "downlevelIteration": true + }, + "exclude": ["bin", "node_modules", "lib"] +} diff --git a/packages/core/build/tsup.config.ts b/packages/core/build/tsup.config.ts index 5d962ca85..d8d4e0dd2 100644 --- a/packages/core/build/tsup.config.ts +++ b/packages/core/build/tsup.config.ts @@ -7,6 +7,7 @@ const entry = fg.globSync(['src/**', ...globExcludeFiles], { cwd: __dirname, abs export default defineConfig({ entry, + tsconfig: path.join(__dirname, 'tsconfig.json'), outDir: path.join(__dirname, 'lib'), splitting: false, silent: true, @@ -14,7 +15,7 @@ export default defineConfig({ clean: true, bundle: false, loader: { - '.d.ts': 'copy' + '.d.ts': 'copy', }, skipNodeModulesBundle: true, }); diff --git a/packages/core/cli/src/cli.ts b/packages/core/cli/src/cli.ts index d1dd6e64f..06484d920 100755 --- a/packages/core/cli/src/cli.ts +++ b/packages/core/cli/src/cli.ts @@ -9,11 +9,12 @@ import semver from 'semver'; const cli = new Command(); cli.version((await import('../package.json')).version); -await commands(cli); initEnv(); genTsConfigPaths(); +await commands(cli); + if (semver.satisfies(process.version, '<20')) { console.error(chalk.red('[tachybase cli]: Node.js version must be >= 20')); process.exit(1); diff --git a/packages/core/cli/src/util.ts b/packages/core/cli/src/util.ts index 8443365bb..b550028d7 100644 --- a/packages/core/cli/src/util.ts +++ b/packages/core/cli/src/util.ts @@ -222,9 +222,7 @@ export async function genTsConfigPaths() { const cwd = process.cwd(); const cwdLength = cwd.length; - const paths: Record = { - '@@/*': ['.dumi/tmp/*'], - }; + const paths: Record = {}; const packages = fastGlob.sync(['packages/*/*/package.json', 'packages/*/*/*/package.json'], { absolute: true, onlyFiles: true, @@ -324,7 +322,7 @@ export function initEnv() { SOCKET_PATH: 'storage/gateway.sock', NODE_MODULES_PATH: resolve(process.cwd(), 'node_modules'), PM2_HOME: resolve(process.cwd(), './storage/.pm2'), - PLUGIN_PACKAGE_PREFIX: '@nocobase/plugin-,@nocobase/plugin-sample-,@nocobase/preset-', + PLUGIN_PACKAGE_PREFIX: '@nocobase/plugin-,@nocobase/plugin-sample-,@nocobase/preset-,@hera/plugin-', SERVER_TSCONFIG_PATH: './tsconfig.server.json', PLAYWRIGHT_AUTH_FILE: resolve(process.cwd(), 'storage/playwright/.auth/admin.json'), CACHE_DEFAULT_STORE: 'memory', diff --git a/packages/core/client/.dumi/theme/builtins/LangSwitch/index.tsx b/packages/core/client/.dumi/theme/builtins/LangSwitch/index.tsx deleted file mode 100644 index 4111f9eb6..000000000 --- a/packages/core/client/.dumi/theme/builtins/LangSwitch/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from "react"; - -const LangSwitch = () => { - const { hostname } = window.location - if (hostname === 'localhost') return null; - const en = window.location.href.replace(hostname, 'docs.nocobase.com') - const cn = window.location.href.replace(hostname, 'docs-cn.nocobase.com') - return EN | 中文 -} - -export default LangSwitch; diff --git a/packages/core/client/.dumi/theme/builtins/Previewer/index.tsx b/packages/core/client/.dumi/theme/builtins/Previewer/index.tsx deleted file mode 100644 index 9ec63f2cc..000000000 --- a/packages/core/client/.dumi/theme/builtins/Previewer/index.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React, { FC, useRef, useEffect, Suspense } from 'react'; -import { Root, createRoot } from 'react-dom/client'; -import { IPreviewerProps } from 'dumi'; -import DefaultPreviewer from 'dumi/theme-default/builtins/Previewer'; - -const Previewer: FC = ({ children, ...props }) => { - const ref = useRef(null); - useEffect(() => { - let root: Root - if (ref.current) { - root = createRoot(ref.current) - root.render(loading...}>{children}) - } - return () => { - if (root) { - root.unmount() - } - } - }, []); - return
; -}; - -export default Previewer; diff --git a/packages/core/client/.dumi/theme/slots/PreviewerActions.tsx b/packages/core/client/.dumi/theme/slots/PreviewerActions.tsx deleted file mode 100644 index 15a86df5d..000000000 --- a/packages/core/client/.dumi/theme/slots/PreviewerActions.tsx +++ /dev/null @@ -1,219 +0,0 @@ -import DumiPreviewerActions from 'dumi/theme-default/slots/PreviewerActions'; -import React, { useRef, useEffect, useState } from 'react'; -import { Spin } from 'antd' - -import { IPreviewerProps } from 'dumi'; - -const indexHtml = ` -
- - -` - -const mainTsx = ` -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - , -) -` - -const packageJson = ` -{ - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview" - }, - "dependencies": { - }, - "devDependencies": { - "flat": "^5.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@vitejs/plugin-react": "^4.0.3", - "less": "^4.2.0", - "typescript": "^5.0.2", - "vite": "^4.4.5" - } -} -` - -const tsConfigJson = ` -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], - "module": "ESNext", - "skipLibCheck": true, - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "composite": true, - "strict": false, - "noUnusedLocals": true, - "noUnusedParameters": true, - "allowSyntheticDefaultImports": true, - "noFallthroughCasesInSwitch": true - }, - "include": [ - "src", - "vite.config.ts" - ] -} -` - -const viteConfigTs = ` -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -export default defineConfig({ - plugins: [react()], -}) -` - -const sandboxTask = ` -{ - "setupTasks": [ - { - "name": "Install Dependencies", - "command": "pnpm install" - } - ], - "tasks": { - "dev": { - "name": "dev", - "command": "pnpm dev", - "runAtStart": true, - "preview": { - "port": 5173 - } - }, - "build": { - "name": "build", - "command": "pnpm build", - "runAtStart": false - }, - "preview": { - "name": "preview", - "command": "pnpm preview", - "runAtStart": false - } - } -} -` - -function getCSBData(opts: IPreviewerProps, ext: string) { - - const files: Record< - string, - { - content: string; - isBinary: boolean; - } - > = {}; - const deps: Record = {}; - const entryFileName = `index${ext}`; - - Object.entries(opts.asset.dependencies).forEach(([name, { type, value }]) => { - if (type === 'NPM') { - // generate dependencies - deps[name] = value; - } else { - // append other imported local files - files[name === entryFileName ? `src/App${ext}` : name] = { - content: value, - isBinary: false, - }; - } - }); - - // append package.json - let pkg = JSON.parse(packageJson) - try { - for (let key in deps) { - if (!pkg['devDependencies'][key]) { - pkg.dependencies[key] = deps[key] - } - } - } catch (e) { - console.log(e) - } - files['package.json'] = { - content: JSON.stringify( - { - name: opts.title, - ...pkg, - }, - null, - 2, - ), - isBinary: false, - }; - - files['index.html'] = { content: indexHtml, isBinary: false }; - files['src/main.tsx'] = { content: mainTsx, isBinary: false }; - files['package.json'] = { content: JSON.stringify(pkg, null, 2), isBinary: false }; - files['.codesandbox/task.json'] = { content: sandboxTask, isBinary: false }; - files['tsconfig.json'] = { content: tsConfigJson, isBinary: false }; - files['vite.config.ts'] = { content: viteConfigTs, isBinary: false }; - - return { files }; -} - - -export function openCodeSandbox(opts: IPreviewerProps) { - const isTSX = Boolean(opts.asset.dependencies?.['index.tsx']); - const ext = isTSX ? '.tsx' : '.jsx'; - return fetch("https://codesandbox.io/api/v1/sandboxes/define?json=1", { - method: "POST", - headers: { - "Content-Type": "application/json", - Accept: "application/json" - }, - body: JSON.stringify(getCSBData(opts, ext)) - }) - .then(x => x.json()) - .then(data => { - window.open(`https://codesandbox.io/p/sandbox/${data.sandbox_id}?file=/src/App${ext}`); - }); -} - - -const PreviewerActions: typeof DumiPreviewerActions = (props) => { - const div = useRef(null); - const [loading, setLoading] = useState(false); - - useEffect(() => { - if (div.current) { - const element = div.current.querySelector('.dumi-default-previewer-action-btn'); - element?.addEventListener('click', (e) => { - e.stopImmediatePropagation(); - setLoading(true); - openCodeSandbox(props).finally(() => { - setLoading(false); - }); - }) - } - }, [div]) - - return
-}; - -export default PreviewerActions; diff --git a/packages/core/client/.dumi/tsconfig.json b/packages/core/client/.dumi/tsconfig.json deleted file mode 100644 index a32dd4f23..000000000 --- a/packages/core/client/.dumi/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": ["**/*"] -} diff --git a/packages/core/client/.dumirc.ts b/packages/core/client/.dumirc.ts deleted file mode 100644 index dd0c2198e..000000000 --- a/packages/core/client/.dumirc.ts +++ /dev/null @@ -1,469 +0,0 @@ -import { getUmiConfig } from '@nocobase/devtools/umiConfig'; -import { defineConfig } from 'dumi'; -import { defineThemeConfig } from 'dumi-theme-nocobase'; - -const umiConfig = getUmiConfig(); -process.env.DOC_LANG = process.env.DOC_LANG || 'zh-CN'; -const lang = process.env.DOC_LANG; - -console.log('process.env.DOC_LANG', lang); - -export default defineConfig({ - hash: true, - alias: { - ...umiConfig.alias, - }, - fastRefresh: false, // 热更新会导致 Context 丢失,不开启 - // ssr: {}, - // exportStatic: { - // ignorePreRenderError: true - // }, - cacheDirectoryPath: `node_modules/.docs-client-${lang}-cache`, - outputPath: `./dist/${lang}`, - resolve: { - docDirs: [`./docs/${lang}`] - }, - locales: [ - { id: 'en-US', name: 'English' }, - { id: 'zh-CN', name: '中文' }, - ], - themeConfig: defineThemeConfig({ - title: 'NocoBase', - logo: 'https://www.nocobase.com/images/logo.png', - github: 'https://github.com/nocobase/nocobase', - footer: 'nocobase | Copyright © 2022', - // sidebarGroupModePath: ['/components'], - nav: [ - { - title: 'API', - link: '/core/application/application', - }, - // { - // title: 'UI Schema', - // link: '/ui-schema', - // }, - ], - sidebarEnhance: { - '/core': [ - { - title: 'Application', - type: 'group', - children: [ - { - title: 'Application', - link: '/core/application/application', - }, - { - title: 'Plugin', - link: '/core/application/plugin', - }, - { - title: 'PluginManager', - link: '/core/application/plugin-manager', - }, - { - title: 'RouterManager', - link: '/core/application/router-manager', - }, - { - title: 'PluginSettingsManager', - link: '/core/application/plugin-settings-manager', - }, - ], - }, - { - title: 'UI Schema', - type: 'group', - children: [ - { - title: 'SchemaComponent', - link: '/core/ui-schema/schema-component', - }, - { - title: 'Designable', - link: '/core/ui-schema/designable', - }, - { - title: 'SchemaInitializer', - link: '/core/ui-schema/schema-initializer', - }, - { - title: 'SchemaInitializerManager', - link: '/core/ui-schema/schema-initializer-manager', - }, - { - title: 'SchemaSettings', - link: '/core/ui-schema/schema-settings', - }, - { - title: 'SchemaSettingsManager', - link: '/core/ui-schema/schema-settings-manager', - }, - { - title: 'SchemaToolbar', - link: '/core/ui-schema/schema-toolbar', - }, - ], - }, - { - title: 'Data Source', - type: 'group', - children: [ - { - title: 'DataSourceManager', - link: '/core/data-source/data-source-manager', - }, - { - title: 'DataSourceManagerProvider', - link: '/core/data-source/data-source-manager-provider', - }, - { - title: 'DataSource', - link: '/core/data-source/data-source', - }, - { - title: 'DataSourceProvider', - link: '/core/data-source/data-source-provider', - }, - { - title: 'CollectionManager', - link: '/core/data-source/collection-manager', - }, - { - title: 'CollectionManagerProvider', - link: '/core/data-source/collection-manager-provider', - }, - { - title: 'CollectionTemplateManager', - link: '/core/data-source/collection-template-manager', - }, - { - title: 'CollectionTemplate', - link: '/core/data-source/collection-template', - }, - { - title: 'Collection', - link: '/core/data-source/collection', - }, - { - title: 'CollectionProvider', - link: '/core/data-source/collection-provider', - }, - { - title: 'CollectionMixins', - link: '/core/data-source/collection-mixins', - }, - { - title: 'CollectionField', - link: '/core/data-source/collection-field', - }, - { - title: 'CollectionFieldInterfaceManager', - link: '/core/data-source/collection-field-interface-manager', - }, - { - title: 'CollectionFieldInterface', - link: '/core/data-source/collection-field-interface', - }, - { - title: 'AssociationProvider', - link: '/core/data-source/association-provider', - }, - { - title: 'ExtendCollectionsProvider', - link: '/core/data-source/extend-collections-provider', - }, - ] - }, - { - title: 'DataBlock', - type: 'group', - children: [ - { - title: 'CollectionRecord', - link: '/core/data-block/collection-record', - }, - { - title: 'CollectionRecordProvider', - link: '/core/data-block/collection-record-provider', - }, - { - title: 'DataBlockProvider', - link: '/core/data-block/data-block-provider', - }, - { - title: 'DataBlockResourceProvider', - link: '/core/data-block/data-block-resource-provider', - }, - { - title: 'DataBlockRequestProvider', - link: '/core/data-block/data-block-request-provider', - }, - ] - } - ], - // '/ui-schema': [ - // { - // title: 'Overview', - // link: '/ui-schema', - // }, - // { - // title: 'Globals', - // type: 'group', - // children: [ - // { - // title: 'Menu', - // link: '/ui-schema/globals/menu', - // }, - // { - // title: 'Page', - // link: '/ui-schema/globals/page', - // }, - // { - // title: 'Tabs', - // link: '/ui-schema/globals/tabs', - // }, - // ], - // }, - // { - // title: 'Blocks', - // type: 'group', - // children: [ - // { - // title: 'Overview', - // link: '/ui-schema/blocks', - // }, - // { - // title: 'Data blocks', - // children: [ - // { - // title: 'Overview', - // link: '/ui-schema/blocks/data', - // }, - // { - // title: 'Table', - // link: '/ui-schema/blocks/data/table', - // }, - // { - // title: 'Form', - // link: '/ui-schema/blocks/data/form', - // }, - // { - // title: 'Form(Read pretty)', - // link: '/ui-schema/blocks/data/form-read-pretty', - // }, - // { - // title: 'Details', - // link: '/ui-schema/blocks/data/details', - // }, - // { - // title: 'List', - // link: '/ui-schema/blocks/data/list', - // }, - // { - // title: 'Grid Card', - // link: '/ui-schema/blocks/data/grid-card', - // }, - // { - // title: 'Calendar', - // link: '/ui-schema/blocks/data/calendar', - // }, - // { - // title: 'Kanban', - // link: '/ui-schema/blocks/data/kanban', - // }, - // { - // title: 'Map', - // link: '/ui-schema/blocks/data/map', - // }, - // { - // title: 'Gantt', - // link: '/ui-schema/blocks/data/gantt', - // }, - // { - // title: 'Charts', - // link: '/ui-schema/blocks/data/charts', - // }, - // ], - // }, - // { - // title: 'Filter blocks', - // children: [ - // { - // title: 'Collapse', - // link: '/ui-schema/blocks/filter/collapse', - // }, - // { - // title: 'Form', - // link: '/ui-schema/blocks/filter/form', - // }, - // ], - // }, - // { - // title: 'Other blocks', - // children: [ - // { - // title: 'iframe', - // link: '/ui-schema/blocks/others/iframe', - // }, - // { - // title: 'Markdown', - // link: '/ui-schema/blocks/others/markdown', - // }, - // { - // title: 'Workflow todos', - // link: '/ui-schema/blocks/others/workflow-todo', - // }, - // ], - // }, - // ], - // }, - // { - // title: 'Fields', - // type: 'group', - // children: [ - // { - // title: 'Overview', - // link: '/ui-schema/fields', - // }, - // { - // title: 'FormItem', - // link: '/ui-schema/fields/form-item', - // }, - // { - // title: 'TableColumn', - // link: '/ui-schema/fields/table-column', - // }, - // { - // title: 'Association', - // children: [ - // { - // title: 'Title', - // link: '/ui-schema/fields/association-components/title', - // }, - // { - // title: 'Tag', - // link: '/ui-schema/fields/association-components/tag', - // }, - // { - // title: 'Select', - // link: '/ui-schema/fields/association-components/select', - // }, - // { - // title: 'RecordPicker', - // link: '/ui-schema/fields/association-components/record-picker', - // }, - // { - // title: 'Cascader', - // link: '/ui-schema/fields/association-components/cascader-select', - // }, - // { - // title: 'Sub-form', - // link: '/ui-schema/fields/association-components/sub-form', - // }, - // { - // title: 'Sub-form(Popover)', - // link: '/ui-schema/fields/association-components/sub-form-popover', - // }, - // { - // title: 'Sub-details', - // link: '/ui-schema/fields/association-components/sub-details', - // }, - // { - // title: 'Sub-table', - // link: '/ui-schema/fields/association-components/cascader-select', - // }, - // { - // title: 'File manager', - // link: '/ui-schema/fields/association-components/file-manager', - // }, - // ], - // }, - // ], - // }, - // { - // title: 'Actions', - // type: 'group', - // children: [ - // { - // title: 'Overview', - // link: '/ui-schema/actions', - // }, - // { - // title: 'Add new', - // link: '/ui-schema/actions/add-new', - // }, - // { - // title: 'View', - // link: '/ui-schema/actions/view', - // }, - // { - // title: 'Edit', - // link: '/ui-schema/actions/edit', - // }, - // { - // title: 'Delete', - // link: '/ui-schema/actions/delete', - // }, - // { - // title: 'Submit', - // link: '/ui-schema/actions/submit', - // }, - // { - // title: 'Filter', - // link: '/ui-schema/actions/filter', - // }, - // { - // title: 'Refresh', - // link: '/ui-schema/actions/refresh', - // }, - // { - // title: 'Print', - // link: '/ui-schema/actions/print', - // }, - // { - // title: 'Duplicate', - // link: '/ui-schema/actions/duplicate', - // }, - // { - // title: 'Export', - // link: '/ui-schema/actions/export', - // }, - // { - // title: 'Import', - // link: '/ui-schema/actions/import', - // }, - // { - // title: 'Bulk update', - // link: '/ui-schema/actions/bulk-update', - // }, - // { - // title: 'Bulk edit', - // link: '/ui-schema/actions/bulk-edit', - // }, - // { - // title: 'Add record(任意表)', - // link: '/ui-schema/actions/add-record', - // }, - // { - // title: 'Update record', - // link: '/ui-schema/actions/update-record', - // }, - // { - // title: 'Save record', - // link: '/ui-schema/actions/save-record', - // }, - // { - // title: 'Custom request', - // link: '/ui-schema/actions/custom-request', - // }, - // { - // title: 'Submit to workflow', - // link: '/ui-schema/actions/submit-to-workflow', - // }, - // ], - // }, - // ], - }, - }), -}); diff --git a/packages/core/client/docs/en-US/core/application/application.md b/packages/core/client/docs/en-US/core/application/application.md deleted file mode 100644 index b33fe9bbf..000000000 --- a/packages/core/client/docs/en-US/core/application/application.md +++ /dev/null @@ -1,374 +0,0 @@ -# Application - -## new Application(options) - -创建一个 NocoBase 应用。 - -- 类型 - -```tsx | pure -export interface ApplicationOptions { - apiClient?: APIClientOptions | APIClient; - ws?: WebSocketClientOptions | boolean; - i18n?: i18next; - providers?: (ComponentType | ComponentAndProps)[]; - plugins?: PluginType[]; - components?: Record; - scopes?: Record; - router?: RouterOptions; - schemaSettings?: SchemaSetting[]; - schemaInitializers?: SchemaInitializer[]; - loadRemotePlugins?: boolean; - dataSourceManager?: DataSourceManagerOptions; -} -``` - -- 详细信息 - - apiClient:API 请求实例,具体说明请参见:[https://docs.nocobase.com/api/sdk](https://docs.nocobase.com/api/sdk) - - i18n:国际化,具体请参考:[https://www.i18next.com/overview/api#createinstance](https://www.i18next.com/overview/api#createinstance) - - providers:上下文 - - components:全局组件 - - scopes:全局 scopes - - router:配置路由,具体请参考:[RouterManager](/core/application/router-manager) - - pluginSettings: [PluginSettingsManager](/core/application/plugin-settings-manager) - - schemaSettings:Schema 设置工具,具体参考:[SchemaSettingsManager](/core/ui-schema/schema-initializer-manager) - - schemaInitializers:Schema 添加工具,具体参考:[SchemaInitializerManager](/core/ui-schema/schema-initializer-manager) - - loadRemotePlugins:用于控制是否加载远程插件,默认为 `false`,即不加载远程插件(方便单测和 DEMO 环境)。 - - dataSourceManager:数据源管理器,具体参考:[DataSourceManager](/core/data-source/data-source-manager) -- 示例 - -```tsx -/** - * defaultShowCode: true - */ -import { Application, Plugin } from '@nocobase/client'; - -const ProviderDemo = ({ children }) => { - return
-
hello world
-
{children}
-
-} - -class MyPlugin extends Plugin { - async load(){ - this.app.router.add('home', { - path: '/', - Component: () =>
home page
- }) - } -} - -const app = new Application({ - providers: [ProviderDemo], - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` - -## 实例属性 - -### app.i18n - -```tsx | pure -class Application { - i18n: i18next; -} -``` - -详细介绍,请参考:[i18next](https://www.i18next.com/overview/api#createinstance) - -### app.apiClient - -```tsx | pure -class Application { - apiClient: APIClient; -} -``` - -详细介绍,请参考:[APIClient](https://docs.nocobase.com/api/sdk) - -### app.router - -详细介绍,请参考:[RouterManager](/core/application/router-manager) - -### app.pluginSettingsManager - -详细介绍,请参考:[PluginSettingsManager](/core/application/plugin-settings-manager) - -### app.schemaSettingsManager - -详细介绍,请参考:[SchemaSettingsManager](/core/ui-schema/schema-initializer-manager) - -### app.schemaInitializerManager - -详细介绍,请参考:[SchemaInitializerManager](/core/ui-schema/schema-initializer-manager) - -### app.dataSourceManager - -详细介绍,请参考:[dataSourceManager](/core/data-source/data-source-manager) - -## 实例方法 - -### app.getRootComponent() - -获取应用的根组件。 - -- 类型 - -```tsx | pure -class Application { - getRootComponent(): React.FC -} -``` - -- 示例 - -```tsx | pure -import { Application } from '@nocobase/client'; - -const app = new Application(); - -const App = app.getRootComponent(); -``` - -### app.mount() - -将应用实例挂载在一个容器元素中。 - -- 类型 - -```tsx | pure -class Application { - mount(containerOrSelector: Element | ShadowRoot | string): ReactDOM.Root -} -``` - -- 示例 - -```tsx | pure -import { Application } from '@nocobase/client'; - -const app = new Application(); - -app.mount('#root'); -``` - -### app.addProvider() - -添加 `Provider` 上下文。 - -- 类型 - -```tsx | pure -class Application { - addProvider(component: ComponentType, props?: T): void; -} -``` - -- 详细信息 - -第一个参数是组件,第二个参数是组件的参数。注意 `Provider` 一定要渲染 `children`。 - -- 示例 - -```tsx | pure -// 场景1:第三方库,或者自己创建的 Context -const MyContext = createContext({}); -app.addProvider(MyContext.provider, { value: { color: 'red' } }); -``` - -```tsx -import { createContext, useContext } from 'react'; -import { Application, Plugin } from '@nocobase/client'; - -const MyContext = createContext(); - -const HomePage = () => { - const { color } = useContext(MyContext) || {}; - return
home page
-} - -class MyPlugin extends Plugin { - async load(){ - this.app.addProvider(MyContext.Provider, { value: { color: 'red' } }); - this.app.router.add('home', { - path: '/', - Component: HomePage - }) - } -} - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` - -```tsx | pure -// 场景2:自定义的组件,注意 children -const GlobalDemo = ({ name, children }) => { - return
-
hello, { name }
-
{ children }
-
-} -app.addProvider(GlobalDemo, { name: 'nocobase' }); -``` - - -```tsx -import { Application, Plugin } from '@nocobase/client'; - -const GlobalDemo = ({ name, children }) => { - return
-
hello, { name }
-
{ children }
-
-} - -class MyPlugin extends Plugin { - async load(){ - this.app.addProvider(GlobalDemo, { name: 'nocobase' }); - this.app.router.add('home', { - path: '/', - Component: () =>
home page
- }) - } -} - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` - - -### app.addProviders() - -添加多个 `Provider` 上下文。 - -- 类型 - -```tsx | pure -class Application { - addProviders(providers: (ComponentType | [ComponentType, any])[]): void; -} -``` - -- 详细信息 - -一次添加多个 `Provider`。 - -- 示例 - -```tsx | pure -app.addProviders([[MyContext.provider, { value: { color: 'red' } }], [GlobalDemo, { name: 'nocobase' }]]) -``` - -### app.addComponents() - -添加全局组件。 - -全局组件可以使用在 [RouterManager](/core/application/router-manager) 和 [UI Schema](/core/ui-schema/schema-component)上。 - -- 类型 - -```tsx | pure -class Application { - addComponents(components: Record): void; -} -``` - -- 示例 - -```tsx | pure -app.addComponents({ Demo, Foo, Bar }) -``` - -### app.addScopes() - -添加全局的 scope。 - -全局组 scope 可以 [UI Schema](/core/ui-schema/schema-component) 上。 - -- 类型 - -```tsx | pure -class Application { - addScopes(scopes: Record): void; -} -``` - -- 示例 - -```tsx | pure -function useSomeThing() {} -const anyVar = ''; - -app.addScopes({ useSomeThing, anyVar }) -``` - -## Hooks - -### useApp() - -获取当前应用的实例。 - -- 类型 - -```tsx | pure -const useApp: () => Application -``` - -- 示例 - -```tsx | pure -const Demo = () => { - const app = useApp(); - return
{ JSON.stringify(app.router.getRouters()) }
-} -``` - -```tsx -import { Application, Plugin, useApp } from '@nocobase/client'; - -const HomePage = () => { - const app = useApp(); - return
{ JSON.stringify(app.router.getRoutes()) }
-} - -class MyPlugin extends Plugin { - async load(){ - this.app.router.add('home', { - path: '/', - Component: HomePage - }) - } -} - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` diff --git a/packages/core/client/docs/en-US/core/application/plugin-manager.md b/packages/core/client/docs/en-US/core/application/plugin-manager.md deleted file mode 100644 index 342420f32..000000000 --- a/packages/core/client/docs/en-US/core/application/plugin-manager.md +++ /dev/null @@ -1,122 +0,0 @@ -# PluginManager - -用于管理插件。 - -```tsx | pure -class PluginManager { - add(plugin: typeof Plugin, opts?: PluginOptions): Promise - - get(PluginClass: T): InstanceType; - get(name: string): T; -} -``` - -## 实例方法 - -### pluginManager.add() - -将插件添加到应用中。 - -- 类型 - -```tsx | pure -class PluginManager { - add(plugin: typeof Plugin, opts?: PluginOptions): Promise -} -``` - -- 详细信息 - -第一个参数是插件类,第二个则是实例化时传递的参数。前面已经讲过会在添加插件后,立即调用 `afterAdd` 钩子函数,所以返回的是 `Promise`。 - -对于远程组件而言,会自动传递一个 `name` 参数。 - -- 示例 - -```tsx | pure -class MyPluginA extends Plugin { - async load() { - console.log('options', this.options) - console.log('app', this.app); - console.log('router', this.app.router, this.router); - } -} - -class MyPluginB extends Plugin { - // 需要在 afterAdd 执行添加的方法 - async afterAdd() { - // 通过 `app.pluginManager.add()` 添加插件时,第一个参数是插件类,第二个参数是实例化时传递的参数 - this.app.pluginManager.add(MyPluginA, { name: 'MyPluginA', hello: 'world' }) - } -} - -const app = new Application({ - plugins: [MyPluginB], -}); -``` - -### pluginManager.get() - -获取插件实例。 - -- 类型 - -```tsx | pure -class PluginManager { - get(PluginClass: T): InstanceType; - get(name: string): T; -} -``` - -- 详细信息 - -可以通过 Class 获取插件示例,如果在插件注册的时候有 name,也可以通过字符串的 name 获取。 - -如果是远程插件,会自动传入 name,值为 package 的 name。 - -- 示例 - -```tsx | pure -import MyPluginA from 'xxx'; - -class MyPluginB extends Plugin { - async load() { - // 方式1:通过 Class 获取 - const myPluginA = this.app.pluginManager.get(MyPluginA); - - // 方式2:通过 name 获取(添加的时候要传递 name 参数) - const myPluginA = this.app.pluginManager.get('MyPluginA'); - } -} -``` - -## Hooks - -获取插件实例,等同于 `pluginManager.get()`。 - -### usePlugin() - -```tsx | pure -function usePlugin(plugin: T): InstanceType; -function usePlugin(name: string): T; -``` - -- 详细信息 - -可以通过 Class 获取插件示例,如果在插件注册的时候有 name,也可以通过字符串的 name 获取。 - -- 示例 - -```tsx | pure -import { usePlugin } from '@nocobase/client'; - -const Demo = () => { - // 通过 Class 获取 - const myPlugin = usePlugin(MyPlugin); - - // 通过 name 获取(添加的时候要传递 name 参数) - const myPlugin = usePlugin('MyPlugin'); - - return
-} -``` diff --git a/packages/core/client/docs/en-US/core/application/plugin-settings-manager.md b/packages/core/client/docs/en-US/core/application/plugin-settings-manager.md deleted file mode 100644 index 34e6f8c67..000000000 --- a/packages/core/client/docs/en-US/core/application/plugin-settings-manager.md +++ /dev/null @@ -1,269 +0,0 @@ -# PluginSettingsManager - -![](../static/plugin-settings.jpg) - -用于管理插件配置页面,其底层对应着 [RouterManager](/core/application/router-manager)。 - -```tsx | pure -interface PluginSettingOptionsType { - title: string; - /** - * @default `Outlet` - */ - Component?: ComponentType | string; - icon?: string; - /** - * sort, the smaller the number, the higher the priority - * @default 0 - */ - sort?: number; - aclSnippet?: string; -} - -interface PluginSettingsPageType { - label?: string; - title: string; - key: string; - icon: any; - path: string; - sort?: number; - name?: string; - isAllow?: boolean; - topLevelName?: string; - aclSnippet: string; - children?: PluginSettingsPageType[]; -} - -class PluginSettingsManager { - add(name: string, options: PluginSettingOptionsType): void - get(name: string, filterAuth?: boolean): PluginSettingsPageType; - getList(filterAuth?: boolean): PluginSettingsPageType[] - has(name: string): boolean; - remove(name: string): void; - getRouteName(name: string): string - getRoutePath(name: string): string; - hasAuth(name: string): boolean; -} -``` - -## 实例方法 - -### pluginSettingsManager.add() - -添加插件配置页。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - add(name: string, options: PluginSettingOptionsType): void -} -``` - -- 详细解释 - -第一个参数 `name`,是路由唯一标识,用于后续的删改查,并且 `name` 支持 `.` 用于分割层级,不过需要注意当使用 `.` 分层的时候,父级要使用 [Outlet](https://reactrouter.com/en/main/components/outlet),让子元素能正常渲染。 - -第二个参数中 `Component` 支持组件形式和字符串形式,如果是字符串组件,要先通过 [app.addComponents](/core/application/application#appaddcomponents) 进行注册,具体参考 [RouterManager](/core/application/router-manager)。 - -- 示例 - -单层级配置。 - -```tsx | pure -const HelloSettingPage = () => { - return
hello setting page
-} - -class MyPlugin extends Plugin { - async load() { - this.app.pluginSettingsManager.add('hello', { - title: 'Hello', // menu title and page title - icon: 'ApiOutlined', // menu icon - Component: HelloSettingPage - }) - } -} -``` - -多层级配置。 - -```tsx | pure -// 多层级配置页 - -class MyPlugin extends Plugin { - async load() { - this.app.pluginSettingsManager.add('hello', { - title: 'HelloWorld', - icon: '', - // Component: Outlet, 默认为 react-router-dom 的 Outlet 组件,可自定义 - }) - - this.app.pluginSettingsManager.add('hello.demo1', { - title: 'Demo1 Page', - Component: () =>
Demo1 Page Content
- }) - - this.app.pluginSettingsManager.add('hello.demo2', { - title: 'Demo2 Page', - Component: () =>
Demo2 Page Content
- }) - } -} -``` - -### pluginSettingsManager.get() - -获取配置信息。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - get(name: string, filterAuth?: boolean): PluginSettingsPageType; -} -``` - -- 详细解释 - -第一个是在添加时的 name 参数,第二个参数是是否在获取的时候进行权限过滤。 - -- 示例 - -在组件中获取。 - -```tsx | pure -const Demo = () => { - const app = useApp(); - const helloSettingPage = this.app.pluginSettingsManager.get('hello'); -} -``` - -在插件中获取。 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const helloSettingPage = this.app.pluginSettingsManager.get('hello') - const helloSettingPage = this.app.pluginSettingsManager.get('hello', false); - - const mobileAppConfigPage = this.app.pluginSettingsManager.get('mobile.app') - } -} -``` - -### pluginSettingsManager.getList() - -获取插件配置页列表。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - getList(filterAuth?: boolean): PluginSettingsPageType[] -} -``` - -- 详细解释 - -`filterAuth` 默认值为 `true`,即进行权限过滤。 - -- 示例 - -```tsx | pure -const Demo = () => { - const app = useApp(); - const settings = app.pluginSettingsManager.getList(); - const settings = app.pluginSettingsManager.getList(false); -} -``` - -### pluginSettingsManager.has() - -判断是否存在,内部已进行权限过滤。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - has(name: string): boolean; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.pluginSettingsManager.has('hello'); - } -} -``` - -### pluginSettingsManager.remove() - -移除配置。 - -```tsx | pure -class PluginSettingsManager { - remove(name: string): void; -} -``` - -### pluginSettingsManager.getRouteName() - -获取对应路由的名称。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - getRouteName(name: string): string -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const helloRouteName = this.pluginSettingsManager.getRouteName('hello'); // admin.settings.hello - } -} -``` - -### pluginSettingsManager.getRoutePath() - -获取插件配置对应的页面路径。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - getRoutePath(name: string): string; -} -``` - -- 示例 - -```tsx | pure -const Demo = () => { - const navigate = useNavigate(); - const app = useApp(); - const helloSettingPath = app.pluginSettingsManager.getRoutePath('hello'); - - return
navigate(helloSettingPath)}> - go to hello setting page -
-} -``` - -### pluginSettingsManager.hasAuth() - -单独判断是否权限。 - -```tsx | pure -class PluginSettingsManager { - hasAuth(name: string): boolean; -} -``` diff --git a/packages/core/client/docs/en-US/core/application/plugin.md b/packages/core/client/docs/en-US/core/application/plugin.md deleted file mode 100644 index 5bfcfe42c..000000000 --- a/packages/core/client/docs/en-US/core/application/plugin.md +++ /dev/null @@ -1,89 +0,0 @@ -# Plugin - -Plugin 基类。 - -- 类型 - -```tsx | pure -class Plugin { - constructor( - protected options: T, - protected app: Application, - ) { - this.options = options; - this.app = app; - } - - get pluginManager() { - return this.app.pluginManager; - } - - get router() { - return this.app.router; - } - - get pluginSettingsManager() { - return this.app.pluginSettingsManager; - } - - get schemaInitializerManager() { - return this.app.schemaInitializerManager; - } - - get schemaSettingsManager() { - return this.app.schemaSettingsManager; - } - - get dataSourceManager() { - return this.app.dataSourceManager; - } - - async afterAdd() {} - - async beforeLoad() {} - - async load() {} -} -``` - -- 详细信息 - - - 构造函数 - - `options`: 插件的添加有两种方式,一种方式从插件列表中远程加载出来,另一种方式是通过 [PluginManager](/core/application/plugin-manager) 添加 - - 远程加载:`options` 会被自动注入 `{ name: 'npm package.name' }` - - PluginManager `options` 由用户自己传递 - - `app`:此参数是自动注入的,是应用实例 - - 快捷访问:基类提供了对 `app` 部分方法和属性的快捷访问 - - `pluginManager` - - `router` - - `pluginSettingsManager` - - `schemaSettingsManager` - - `schemaInitializerManager` - - 声明周期 - - `afterAdd`:插件被添加后立即执行 - - `beforeLoad`:执行渲染时执行,在 `afterAdd` 之后,`load` 之前 - - `load`:最后执行 -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - - async afterAdd() { - console.log('afterAdd') - } - - async beforeLoad() { - console.log('beforeLoad') - } - - async load() { - console.log('load') - - // 可以访问应用实例 - console.log(this.app) - - // 访问应用实例内容 - console.log(this.app.router, this.router); - } -} -``` diff --git a/packages/core/client/docs/en-US/core/application/router-manager.md b/packages/core/client/docs/en-US/core/application/router-manager.md deleted file mode 100644 index ef707219c..000000000 --- a/packages/core/client/docs/en-US/core/application/router-manager.md +++ /dev/null @@ -1,386 +0,0 @@ -# RouterManager - -用于管理路由。 - -```tsx | pure -import { ComponentType } from 'react'; -import { RouteObject } from 'react-router-dom'; - -interface RouteType extends Omit { - Component?: ComponentType | string; -} - -class RouterManager { - add(name: string, route: RouteType): void; - getRoutes(): Record; - getRoutesTree(): RouteObject[]; - get(name: string): RouteType; - has(name: string): boolean; - remove(name: string): void; - setType(type: 'browser' | 'memory' | 'hash'): void; - setBasename(basename: string): void; -} -``` - -## 实例方法 - -### router.add() - -添加一条路由。 - -- 类型 - -```tsx | pure -class RouterManager { - add(name: string, route: RouteType): void -} -``` - -- 详情 - -第一个参数 `name`,是路由唯一标识,用于后续的删改查,并且 `name` 支持 `.` 用于分割层级,不过需要注意当使用 `.` 分层的时候,父级要使用 [Outlet](https://reactrouter.com/en/main/components/outlet),让子元素能正常渲染。 - -第二个参数 `RouteType` 的 `Component` 支持组件形式和字符串形式,如果是字符串组件,要先通过 [app.addComponents](/core/application/application#appaddcomponents) 进行注册。 - -- 示例 - -单层级路由。 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.router.add('home', { - path: '/', - Component: () =>
home page
- }) - this.app.router.add('login', { - path: '/login', - element:
login page
- }) - } -} -``` - -```tsx -import { useNavigate } from 'react-router-dom'; -import { Plugin, Application } from '@nocobase/client'; - -const HomePage = () => { - const navigate = useNavigate(); - return
-
home page
- -
-} - -const LoginPage = () => { - const navigate = useNavigate(); - return
-
login page
- -
-} - -class MyPlugin extends Plugin { - async load() { - this.app.router.add('home', { - path: '/', - Component: HomePage - }) - this.app.router.add('login', { - path: '/login', - Component: LoginPage - }) - } -} - - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` - -多层级路由。 - -```tsx | pure -import { Plugin } from '@nocobase/client'; -import { Outlet } from 'react-router-dom'; - -const AdminLayout = () =>{ - return
-
This is admin layout
- -
-} - -const AdminSettings = () => { - return
This is admin settings page
-} - -class MyPlugin extends Plugin { - async load() { - this.app.router.add('admin', { - path: '/admin', - Component: AdminLayout - }) - this.app.router.add('admin.settings', { - path: '/admin/settings', - Component: AdminSettings , - }) - } -} -``` - - -```tsx -import { useNavigate, Outlet } from 'react-router-dom'; -import { Plugin, Application } from '@nocobase/client'; - -const AdminLayout = () =>{ - return
-
This is admin layout
- -
-} - -const AdminSettings = () => { - return
This is admin settings page
-} - -class MyPlugin extends Plugin { - async load() { - this.app.router.add('admin', { - path: '/admin', - Component: AdminLayout - }) - this.app.router.add('admin.settings', { - path: '/admin/settings', - Component: AdminSettings , - }) - } -} - - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/admin/settings'], - } -}); - -export default app.getRootComponent(); -``` - -`Component` 参数为字符串。 - -```tsx | pure -const LoginPage = () => { - return
login page
-} - -class MyPlugin extends Plugin { - async load() { - // 通过 app.addComponents 进行注册 - this.app.addComponents({ LoginPage }) - - this.app.router.add('login', { - path: '/login', - Component: 'LoginPage', // 这里可以使用字符串了 - }) - } -} -``` - -### router.getRoutes() - -获取路由列表。 - -- 类型 - -```tsx | pure -class RouterManager { - getRoutes(): Record -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - console.log(this.app.router.getRoutes()); - } -} -``` - -![](../static/CxjJbp0pcogYn6xviVyc6QT8nUg.png) - -### router.getRoutesTree() - -获取用于 [useRoutes()](https://reactrouter.com/hooks/use-routes) 的数据。 - -- 类型 - -```tsx | pure -class RouterManager { - getRoutesTree(): RouteObject[] -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const routes = this.app.router.getRoutesTree(); - } -} -``` - -### router.get() - -获取单个路由配置。 - -- 类型 - -```tsx | pure -class RouterManager { - get(name: string): RouteType -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const adminRoute = this.app.router.get('admin') - const adminSettings = this.app.router.get('admin.settings') - } -} -``` - -### router.has() - -判断是否添加过路由。 - -- 类型 - -```tsx | pure -class RouterManager { - has(name: string): boolean; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const hasAdminRoute = this.app.router.has('admin') - const hasAdminSettings = this.app.router.has('admin.settings') - } -} -``` - -### router.remove() - -移除路由配置。 - -- 类型 - -```tsx | pure -class RouterManager { - remove(name: string): void; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.router.remove('admin') - this.app.router.remove('admin.settings') - } -} -``` - -### router.setType() - -设置路由类型,默认为 `browser`。 - - -- 类型 - -```tsx | pure -class RouterManager { - setType(type: 'browser' | 'memory' | 'hash'): void; -} -``` - -- 详细解释 - - browser: [BrowserRouter](https://reactrouter.com/en/main/router-components/browser-router) - - memory: [MemoryRouter](https://reactrouter.com/en/main/router-components/hash-router) - - hash: [HashRouter](https://reactrouter.com/en/main/router-components/memory-router) - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.router.setType('hash') - } -} -``` - -### router.setBasename() - -设置 [basename](https://reactrouter.com/en/main/router-components/browser-router#basename)。 - -- 类型 - -```tsx | pure -class RouterManager { - setBasename(basename: string): void; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.router.setBasename('/') - } -} -``` - -## Hooks - -### useRouter() - -获取当前路由的实例,等同于 `app.router`。 - -- 类型 - -```tsx | pure -const useRouter: () => RouterManager -``` - -- 示例 - -```tsx | pure -import { useRouter } from '@nocobase/client'; - -const Demo = () => { - const router = useRouter(); -} -``` diff --git a/packages/core/client/docs/en-US/core/data-block/collection-record-provider.md b/packages/core/client/docs/en-US/core/data-block/collection-record-provider.md deleted file mode 100644 index 0cfad105f..000000000 --- a/packages/core/client/docs/en-US/core/data-block/collection-record-provider.md +++ /dev/null @@ -1,259 +0,0 @@ -# CollectionRecordProvider - -用于提供 [CollectionRecord](./collection-record) 实例。 - -## 组件 - -- 类型 - -```tsx | pure -interface CollectionRecordProviderProps { - isNew?: boolean; - record?: CollectionRecord | DataType; - parentRecord?: CollectionRecord | DataType; - /** - * 当前记录所属的 collection name - */ - collectionName?: string; -} -``` - -- 详解 - -参数的具体说明参见 [CollectionRecord](./collection-record)。 - -需要说明的是 `record` 和 `parentRecord` 即可以是普通的对象,也可以是 [CollectionRecord](./collection-record) 实例,但最终会转为 `CollectionRecord` 实例,并通过 context 传递给子组件。 - -## 示例 - -- record 参数为 CollectionRecord 实例 - -```tsx | pure -import { CollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); - - -// 最终向子组件传递的数据为: props.record -``` - -```tsx -import { CollectionRecord, useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -- record 参数为普通对象 - -```tsx | pure - -// 最终向子组件传递的数据为: const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); -``` - -```tsx -import { useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -- record 参数为 CollectionRecord 实例且带有父记录 - -```tsx | pure -const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -const record = new CollectionRecord({ data: { id: 1, name: 'foo' }, parentRecord }); - - -// 最终向子组件传递的数据为: props.record -``` - -```tsx -import { CollectionRecord, useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -const record = new CollectionRecord({ data: { id: 1, name: 'foo' }, parentRecord }); - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -- record 参数为 CollectionRecord 实例,父记录通过 `parentRecord` 参数传递 - -```tsx | pure -const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); - - - -// 首先设置父记录:record.setParentRecord(parentRecord); -// 最终向子组件传递的数据为:record(带有父记录) -``` - -```tsx -import { CollectionRecord, useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -- record 参数为普通对象,父记录也是普通对象 - -```tsx | pure - - -// 首先实例化父记录:const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -// 然后实例化记录:const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); -// 最后设置父记录:record.setParentRecord(parentRecord); -// 最终向子组件传递的数据为:record(带有父记录) -``` - - -```tsx -import { useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -## Hooks - -### useCollectionRecord() - -用于获取 `CollectionRecordProvider` 组件传递的数据记录。 - -- 示例 - -```tsx | pure -const record = useCollectionRecord(); - -console.log(record, record.data, record.parentRecord, record.parentRecord.data); -``` - -```tsx -import { useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - return
-
record:
{JSON.stringify(record, null, 2)}
-
record.data:
{JSON.stringify(record.data, null, 2)}
-
record.parentRecord:
{JSON.stringify(record.parentRecord, null, 2)}
-
record.parentRecord.data:
{JSON.stringify(record.parentRecord.data, null, 2)}
-
; -} - -export default () => -``` - -### useCollectionRecordData() - -直接获取 CollectionRecord 的 `data` 属性,等同于 `useCollectionRecord().data`。 - -- 示例 - -```tsx | pure -const data = useCollectionRecordData(); -const record = useCollectionRecord(); -console.log(data === record.data); -``` - -```tsx -import { useCollectionRecord, useCollectionRecordData, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const data = useCollectionRecordData(); - const record = useCollectionRecord(); - return
-
data === record.data: { JSON.stringify(data === record.data) }
-
data:
{JSON.stringify(data, null, 2)}
-
record.data:
{JSON.stringify(record.data, null, 2)}
-
; -} - -export default () => -``` - -### useCollectionParentRecord() - -直接获取 CollectionRecord 的数据 `parentRecord`,等同于 `useCollectionRecord().parentRecord`。 - -- 示例 - -```tsx | pure -const parentRecord = useCollectionParentRecord(); -const record = useCollectionRecord(); -console.log(parentRecord === record.parentRecord); -``` - -```tsx -import { useCollectionRecord, useCollectionParentRecord, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - const parentRecord = useCollectionParentRecord(); - return
-
parentRecord === record.parentRecord: { JSON.stringify(parentRecord === record.parentRecord) }
-
parentRecord:
{JSON.stringify(parentRecord, null, 2)}
-
record.parentRecord:
{JSON.stringify(record.parentRecord, null, 2)}
-
; -} - -export default () => -``` - - -### useCollectionParentRecordData() - -直接获取 CollectionRecord 的数据 `parentRecord.data`,等同于 `useCollectionRecord().parentRecord.data`。 - -- 示例 - -```tsx | pure -const record = useCollectionRecord(); -const parentData = useCollectionParentRecordData(); -const parentRecord = useCollectionParentRecord(); -console.log(parentData === parentRecord.data === record.parentRecord.data); -``` - -```tsx -import { useCollectionRecord, CollectionRecordProvider, useCollectionParentRecordData, useCollectionParentRecord } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - const parentData = useCollectionParentRecordData(); - const parentRecord = useCollectionParentRecord(); - return
-
parentData:
{JSON.stringify(parentData, null, 2)}
-
parentRecord.data:
{JSON.stringify(parentRecord.data, null, 2)}
-
record.parentRecord.data:
{JSON.stringify(record.parentRecord.data, null, 2)}
-
; -} - -export default () => -``` diff --git a/packages/core/client/docs/en-US/core/data-block/collection-record.md b/packages/core/client/docs/en-US/core/data-block/collection-record.md deleted file mode 100644 index d2bc6ffa4..000000000 --- a/packages/core/client/docs/en-US/core/data-block/collection-record.md +++ /dev/null @@ -1,194 +0,0 @@ -# CollectionRecord - -数据表中的一条记录。 - -## 类型 - -```tsx | pure -interface CollectionRecordOptions { - isNew?: boolean; - data?: DataType; - parentRecord?: CollectionRecord; - /** - * 当前记录所属的 collection name - */ - collectionName?: string; -} - -class CollectionRecord { - public isNew?: boolean; - public data?: DataType; - public parentRecord?: CollectionRecord; - public collectionName?: string; - constructor(options: CollectionRecordOptions) {} - - setData(data: DataType) { - this.data = data; - } - - setParentRecord(parentRecord: CollectionRecord) { - this.parentRecord = parentRecord; - } -} -``` - -## 详解 - -### CollectionRecord 基本概念 - -CollectionRecord 类用于提供数据记录,通常情况下对应着后端数据表中的一条记录。以用户表为例,其一条数据对应的 CollectionRecord 类如下: - -```tsx | pure -const useCollectionRecord = new CollectionRecord({ - data: { - "id": 1, - "roleId": 10, - "appLang": null, - "createdById": null, - "email": "test@nocobase.com", - "nickname": "Admin", - "phone": null, - "systemSettings": {}, - "updatedById": null, - "username": "nocobase", - "createdAt": "2023-12-04T09:42:52.953Z", - "updatedAt": "2023-12-04T09:42:52.953Z", - } -}); -``` - -### CollectionRecord 和 Collection 的关系 - -CollectionRecord 是指的数据,而 Collection 则是表结构。对于上面的用户表,其对应的 Collection 如下: - -```tsx | pure -const usersCollection = new Collection({ - name: 'users', - fields: [ - { - type: 'bigInt', - name: 'id', - }, - { - type: 'string', - name: 'username', - }, - { - type: 'integer', - name: 'age', - }, - { - "name": "email", - "type": "string", - }, - // .... - ], -}); -``` - -### 父子关系和关系字段 - -对于[关系字段](https://docs.nocobase.com/development/server/collections/association-fields),例如用户和角色的关系,在用户表中会有一个 `roleId` 字段,其值为角色表中的 `id`,当我们通过 `users.roleId` 字段查询用户的角色时: - -```bash | pure -GET /api/users/1/roles:get/10 -``` - -其中 `1` 为用户的 `id`,`10` 为角色的 `id`,我们可以得到用户的角色数据: - -```tsx | pure -const roleRecord = new CollectionRecord({ - data: { - "id": 10, - "name": "member", - "title": "test role", - "strategy": { - "actions": [ - "view", - "update:own", - "destroy:own", - "create" - ] - }, - "createdAt": "2023-03-30T07:53:10.924Z", - "updatedAt": "2023-12-15T02:51:43.577Z", - } -}) -``` - -其中 `users` id 为 1 的记录我们称之为父记录: - -```tsx | pure -roleRecord.setParentRecord(userRecord); -``` - -### 新记录 - -对于新表单,我们可以通过 `isNew` 属性来标识: - -```tsx | pure -const record = new CollectionRecord({ - isNew: true, -}); -``` - -## 示例 - -### 基本使用 - -```tsx | pure -import { CollectionRecord } from '@nocobase/client'; - -const record = new CollectionRecord({ - data: { - name: 'foo', - } -}); -``` - -### 创建空记录 - -```tsx | pure -import { CollectionRecord } from '@nocobase/client'; - -const record = new CollectionRecord({ - isNew: true, -}); -``` - -### 设置 parentRecord - -方式1: 通过构造函数设置 - -```tsx | pure -const parentRecord = new CollectionRecord({ - data: { - foo: 'foo', - } -}); - -const record = new CollectionRecord({ - data: { - name: 'bar', - }, - parentRecord, -}); -``` - -方式2: 通过 `setParentRecord` 方法设置 - -```tsx | pure -const parentRecord = new CollectionRecord({ - data: { - foo: 'foo', - } -}); - -const record = new CollectionRecord({ - data: { - name: 'bar', - } -}); - -record.setParentRecord(parentRecord); -``` diff --git a/packages/core/client/docs/en-US/core/data-block/data-block-provider.md b/packages/core/client/docs/en-US/core/data-block/data-block-provider.md deleted file mode 100644 index 6aeaec049..000000000 --- a/packages/core/client/docs/en-US/core/data-block/data-block-provider.md +++ /dev/null @@ -1,246 +0,0 @@ -# DataBlockProvider - -## 区块类型 - -区块分为简单区块和包含各种数据的区块。 - -### 简单区块 - -简单区块例如 Markdown 区块。 - -![](./images/markdown-block.png) - -它只有文本内容,没有其他更多复杂数据,且文本内容是存储在 `schema` 中的,没有存储在数据库中。 - -```json {5}| pure -{ - "type": "void", - "x-component": "Markdown.Void", - "x-component-props": { - "content": "markdown content" - }, -} -``` - -### 数据区块 - -数据区块是指区块的数据存储在服务端的数据表中,例如 Table 组件。 - -![](./images/data-block.png) - -Table 中的字段信息及列表数据,都是存储在数据库中的。 - - -## DataBlockProvider 介绍 - -为了方便对数据区块的数据进行管理,我们提供了 `DataBlockProvider` 组件,其内部封装了: - -- `DataBlockProvider`:封装了下面的所有组件,并提供了区块属性 - - [CollectionProvider](/core/data-source/collection-provider) / [AssociationProvider](/core/data-source/association-provider): 根据 `DataBlockProvider` 提供的上下文信息,查询对应数据表数据及关系字段信息并传递 - - [BlockResourceProvider](/core/data-block/data-block-resource-provider): 根据 `DataBlockProvider` 提供的上下文信息,构建区块 [Resource](https://docs.nocobase.com/api/sdk#resource-action) API,用于区块数据的增删改查 - - [BlockRequestProvider](/core/data-block/data-block-request-provider): 根据 `DataBlockProvider` 提供的上下文信息,自动调用 `BlockResourceProvider` 提供的 `resource.get()` 或 `resource.list()` 发起请求,得到区块数据,并传递 - - [CollectionRecordProvider](/core/data-source/record-provider): 对于 `resource.get()` 场景,会自动嵌套 `CollectionRecordProvider` 并将 `resource.get()` 请求结果传递下去,`resource.list()` 场景则需要自行使用 `CollectionRecordProvider` 提供数据记录 - -```tsx | pure -const DataBlockProvider = (props) => { - return - - / - - - {action !== 'list' && - {props.children} - } - - / - - - -} -``` - -上述组件封装到 `DataBlockProvider` 的内部,只需要使用 `DataBlockProvider` 即可自行得到上述数据。 - -### 使用方式 - -其主要使用在区块的 schema [x-decorator](https://docs.nocobase.com/development/client/ui-schema/what-is-ui-schema#x-decorator) 中,例如: - -```js {5}| pure -{ - type: 'void', - name: 'hello-block', - 'x-component': 'CardItem', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: 'users', - dataSource: 'main', - action: 'list', - tableProps: { - bordered: true, - } - }, - 'x-use-decorator-props': 'useDynamicDataBlockProps', -} -``` - -### 完整示例 - - - -## 属性 - -### 静态属性和动态属性 - -- schema 中的 `x-decorator-props` 称为静态属性,它是一个普通对象,记录区块的配置信息 -- schema 中的 `x-use-decorator-props` 中的属性称为动态属性,它是一个 React hook,可用于获取例如 URL 上的 ID,或者父级的 context 数据 - -当两者都存在时,会进行深度合并,作为 `DataBlockProvider` 的属性。 - -### 属性详解 - -```ts | pure -interface AllDataBlockProps { - collection?: string; - association?: string; - sourceId?: string | number; - record?: Record; - action?: 'list' | 'get'; - filterByTk?: string; - params?: Record; - parentRecord?: Record; - [index: string]: any; -} -``` - -- collection(`x-decorator-props`):区块的 collection 表名,用于获取区块的字段信息和区块数据 -- association(`x-decorator-props`):区块的关系字段名,用于获取区块的关系字段信息和关系字段数据 -- dataSource(`x-decorator-props`): 数据源,具体可参考 [Data Modeling](https://docs.nocobase.com/manual/data-modeling) -- action(`x-decorator-props`):区块的请求类型,`list` 或 `get` -- params(`x-decorator-props` 和 `x-use-decorator-props`):区块的请求参数,同时存在于 -- filterByTk(`x-use-decorator-props`):相当于 `params.filterByTk`,可理解为 `id`,用于获取单条数据 -- sourceId(`x-use-decorator-props`):区块的 sourceId,配合 `association` 使用,用于获取区块的关系字段数据 -- record(`x-use-decorator-props`):当提供 `record` 时,会使用 `record` 作为区块的数据,不发起请求 -- parentRecord(`x-use-decorator-props`):当提供 `parentRecord` 时,会使用 `parentRecord` 作为关系字段的表数据,不发起请求 - -```tsx | pure -const DataBlockProvider = (props) => { - return - - / - - - {action !== 'list' && - {props.children} - } - - - - - -} -``` - -### 属性组合和场景 - -这些属性根据不同的场景,共有 8 中情况: - -- collection - - 创建:`collection` - - 获取单条数据:`collection` + `action: get` + `params` - - 获取列表数据:`collection` + `action: list` + `params` - - 使用 `record` 作为数据:`collection` + `record` - -对于 *获取单条数据* 和 *获取列表数据* `params` 非必须。 - -- association - - 创建:`association` + `sourceId` - - 获取单条数据:`association` + `sourceId` + `action: get` + `params` + `parentRecord` - - 获取列表数据:`association` + `sourceId` + `action: list` + `params` + `parentRecord` - - 使用 `record` 作为数据:`association` + `sourceId` + `record` + `parentRecord` - - -对于 *获取单条数据* 和 *获取列表数据* `params` 和 `parentRecord` 非必须,当没有 `parentRecord` 会根据 `association` 查询到对应的 `collection`,然后再根据 `collection` 查询到对应的 `parentRecord`。 - -### 属性获取和修改 - -#### useDataBlock() - -可用于获取和修改 `DataBlockProvider` 的属性。 - -- 类型 - -```tsx | pure -interface Result { - props: AllDataBlockProps & T; - dn: Designable; -} -const useDataBlock: () => Result -``` - -- 详解 - -`props` 就对应着上面的 `AllDataBlockProps`。 -`dn` 是 `Designable` 对象,可用于修改 `DataBlockProvider` 的 UI schema,详细见 [Designable](/core/ui-schema/designable)。 - -- 示例 - -```tsx | pure -const { props, dn } = useDataBlock<{ tableProps: { bordered?: boolean } }>(); - -// 获取 -const checked = props.tableProps.bordered; - -// 修改 -dn.deepMerge({ - 'x-decorator-props': { - tableProps: { - bordered: !checked, - }, - }, -}); -``` - -#### useDataBlockProps() - -相当于 `useDataBlock().props`。 - -```tsx | pure -const props = useDataBlockProps<{ tableProps: { bordered?: boolean } }>(); - -const checked = props.tableProps.bordered; -``` - -## 示例 - -### collection - -#### Table list - - - -#### Form get & update - - - -#### Form create - - - -#### Form record & update - - - -### association - -association 与 collection 类似,只是需要提供 `sourceId`,我们以 `Table list` 为例。 - -#### Table list & sourceId - - - -#### Table list & parentRecord - -如果不提供 `sourceId`,则需要提供 `parentRecord`,我们以 `Table list` 为例。 - - - diff --git a/packages/core/client/docs/en-US/core/data-block/data-block-request-provider.md b/packages/core/client/docs/en-US/core/data-block/data-block-request-provider.md deleted file mode 100644 index 48b5801b3..000000000 --- a/packages/core/client/docs/en-US/core/data-block/data-block-request-provider.md +++ /dev/null @@ -1,139 +0,0 @@ -# DataBlockRequestProvider - -其内部获取到 [BlockResourceProvider](/core/data-block/data-block-resource-provider) 提供的 `resource`,根据 [BlockProvider](/core/data-block/data-block-provider) 提供的参数,自动调用 `resource.get()` 或者 `resource.list()` 获取的区块的数据,并通过 context 传递下去。 - -## 请求参数 - -请求参数是获取 `DataBlockProvider` 提供中的 `params` 和 `filterByTk`。 - -```ts | pure -const schema = { - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - 'collection': 'users', - 'action': 'list', - // 静态参数 - params: { - pageSize: 10, - } - }, - // 动态参数 - 'x-use-decorator-props': 'useDynamicDataBlockProps', -} - -const useDynamicDataBlockProps: UseDataBlockProps<'CollectionList'> = () => { - return { - params: { - size: 15, - } - } -} -``` - -会自动调用 `resource.list()` 获取数据,发起 `GET /api/users:list?pageSize=10&size=15` 的请求。 - -## Hooks - -### useDataBlockRequest() - -用于获取请求对象,一般用区块组件中。 - -```tsx | pure -const MyTable = () => { - const { data, loading } = useDataBlockRequest(); - - return ( - - ) -} -``` - -## Record - -### Get 请求 - -对于 `get` 请求,当获取到 `data` 数据后,会通过 `CollectionRecordProvider` 提供 `record` 对象,用于获取当前区块的数据。 - -```ts | pure -const schema = { - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - 'collection': 'users', - 'action': 'get', // get 请求 - }, - // 动态参数 - 'x-use-decorator-props': 'useDynamicFormProps', -} - -const useDynamicDataBlockProps: UseDataBlockProps<'CollectionGet'> = () => { - return { - params: { - filterByTk: 1, - } - } -} -``` - -会自动调用 `resource.get()` 获取数据,发起 `GET /api/users:get/1` 的请求,并通过 `CollectionRecordProvider` 提供上下文。 - -```tsx | pure -const { data } = useDataBlockRequest(); -const record = useCollectionRecord(); // record 上下文数据 - -// 相等 -record.data === data; -``` - -### List 请求 - -对于 `list` 请求则不会提供 `record` 对象,需要自己通过 `` 设置上下文。 - -```tsx | pure -const MyTable = () => { - const { data } = useDataBlockRequest(); - - return ( -
{ - return ( - - - - ) - }, - }, - ]} - pagination={{ - total: data?.meta.total, - pageSize: data?.meta.pageSize, - page: data?.meta.page, - }} - /> - ) -} - -const MyAction = () => { - const record = useCollectionRecord(); - return ( - - ) -} -``` diff --git a/packages/core/client/docs/en-US/core/data-block/data-block-resource-provider.md b/packages/core/client/docs/en-US/core/data-block/data-block-resource-provider.md deleted file mode 100644 index e94246b6c..000000000 --- a/packages/core/client/docs/en-US/core/data-block/data-block-resource-provider.md +++ /dev/null @@ -1,36 +0,0 @@ -# DataBlockResourceProvider - -根据 `DataBlockProvider` 中的 `collection`、`association`、`sourceId` 等属性,构建好 [resource](https://docs.nocobase.com/api/sdk#resource-action) 对象,方便子组件对区块数据的增删改查操作,其内置在 [DataBlockProvider](/core/data-block/data-block-provider) 中 - - -## useDataBlockResource - -用于获取当前数据块的 resource 对象。 - -- 类型 - -```ts | pure -function useDataBlockResource(): IResource -``` - -- 示例 - -```ts | pure -const resource = useDataBlockResource(); - -const onSubmit = async (values) => { - // 创建 - await resource.create({ values }); -} -``` - -```ts | pure -const resource = useDataBlockResource(); - -const onDelete = async () => { - // 删除 - await resource.destroy(); -} -``` - -可运行示例 diff --git a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/association-table-list-and-parent-record.tsx b/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/association-table-list-and-parent-record.tsx deleted file mode 100644 index 13964b35b..000000000 --- a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/association-table-list-and-parent-record.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React from 'react'; -import { Table, TableProps } from 'antd'; -import { SchemaComponent, UseDataBlockProps, useDataBlockRequest, withDynamicSchemaProps } from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; - -const collection = 'users'; -const associationField = 'roles'; - -const association = `${collection}.${associationField}`; -const action = 'list'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-use-decorator-props': 'useBlockDecoratorProps', - 'x-decorator-props': { - association, - action, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', - }, - }, -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - const { data, loading } = useDataBlockRequest(); - return { - loading, - dataSource: data?.data || [], - columns: [ - { - title: 'Name', - dataIndex: 'name', - }, - { - title: 'Title', - dataIndex: 'title', - }, - { - title: 'Description', - dataIndex: 'description', - }, - ], - }; -} - -const useBlockDecoratorProps: UseDataBlockProps<'CollectionList'> = () => { - const parentRecord = { - id: 1, - username: 'Tom', - }; - return { - parentRecord, - }; -}; - -const Demo = () => { - return ; -}; - -const mocks = { - [`${collection}/1/${associationField}:${action}`]: { - data: [ - { - name: 'admin', - title: 'Admin', - description: 'Admin description', - }, - { - name: 'developer', - title: 'Developer', - description: 'Developer description', - }, - ], - }, -}; - -const Root = createApp( - Demo, - { - components: { MyTable }, - scopes: { useTableProps, useBlockDecoratorProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/association-table-list-and-source-id.tsx b/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/association-table-list-and-source-id.tsx deleted file mode 100644 index e82fde3db..000000000 --- a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/association-table-list-and-source-id.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import React from 'react'; -import { Select, Table, TableProps } from 'antd'; -import { SchemaComponent, UseDataBlockProps, useDataBlockRequest, withDynamicSchemaProps } from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; -import useUrlState from '@ahooksjs/use-url-state'; - -const collection = 'users'; -const associationField = 'roles'; - -const association = `${collection}.${associationField}`; -const action = 'list'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-use-decorator-props': 'useBlockDecoratorProps', - 'x-decorator-props': { - association, - action, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', - }, - }, -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - const { data, loading } = useDataBlockRequest(); - return { - loading, - dataSource: data?.data || [], - columns: [ - { - title: 'Name', - dataIndex: 'name', - }, - { - title: 'Title', - dataIndex: 'title', - }, - { - title: 'Description', - dataIndex: 'description', - }, - ], - }; -} - -const useBlockDecoratorProps: UseDataBlockProps<'CollectionList'> = () => { - const [state] = useUrlState({ userId: '1' }); - return { - sourceId: state.userId, - }; -}; - -const Demo = () => { - const [state, setState] = useUrlState({ userId: '1' }); - return ( - <> - - - - ); -}; - -const mocks = { - [`${collection}/1/${associationField}:${action}`]: { - data: [ - { - name: 'admin', - title: 'Admin', - description: 'Admin description', - }, - { - name: 'developer', - title: 'Developer', - description: 'Developer description', - }, - ], - }, - [`${collection}/2/${associationField}:${action}`]: { - data: [ - { - name: 'developer', - title: 'Developer', - description: 'Developer description', - }, - { - name: 'tester', - title: 'Tester', - description: 'Tester description', - }, - ], - }, - [`${collection}:get/1`]: { - id: 1, - username: 'Tom', - }, - [`${collection}:get/2`]: { - id: 1, - username: 'Jack', - }, -}; - -const Root = createApp( - Demo, - { - components: { MyTable }, - scopes: { useTableProps, useBlockDecoratorProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-create.tsx b/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-create.tsx deleted file mode 100644 index cddd88c89..000000000 --- a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-create.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import React, { FC } from 'react'; -import { Button, Form, FormProps, Input, InputNumber, notification } from 'antd'; -import { SchemaComponent, useDataBlockResource, withDynamicSchemaProps } from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; - -interface DemoFormFieldType { - id: number; - username: string; - age: number; -} -type DemoFormProps = FormProps; -const DemoForm: FC = withDynamicSchemaProps((props) => { - return ( -
- - label="Username" - name="username" - rules={[{ required: true, message: 'Please input your username!' }]} - > - - - - label="Age" - name="age" - rules={[{ required: true, message: 'Please input your age!' }]} - > - - - - - - - ); -}); - -function useDemoFormProps(): DemoFormProps { - const resource = useDataBlockResource(); - const onFinish = async (values: DemoFormFieldType) => { - console.log('values', values); - await resource.create({ - values, - }); - notification.success({ - message: 'Save successfully!', - }); - }; - - return { - onFinish, - }; -} - -const collection = 'users'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: collection, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'object', - 'x-component': 'DemoForm', - 'x-use-component-props': 'useDemoFormProps', - }, - }, -}; - -const Demo = () => { - return ; -}; - -const mocks = { - [`${collection}:create`]: (config) => { - console.log('config.data', config.data); - return [200, { msg: 'ok' }]; - }, -}; -const Root = createApp( - Demo, - { - components: { DemoForm }, - scopes: { useDemoFormProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-get-and-update.tsx b/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-get-and-update.tsx deleted file mode 100644 index ac5ecc5e5..000000000 --- a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-get-and-update.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import React, { FC, useEffect } from 'react'; -import { Button, Form, FormProps, Input, InputNumber, Select, notification } from 'antd'; -import { - SchemaComponent, - UseDataBlockProps, - useDataBlockResource, - useCollectionRecordData, - withDynamicSchemaProps, -} from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; -import useUrlState from '@ahooksjs/use-url-state'; - -import { createApp } from '../../../data-source/demos/createApp'; - -interface DemoFormFieldType { - id: number; - username: string; - age: number; -} -type DemoFormProps = FormProps; -const DemoForm: FC = withDynamicSchemaProps((props) => { - return ( -
- - label="Username" - name="username" - rules={[{ required: true, message: 'Please input your username!' }]} - > - - - - label="Age" - name="age" - rules={[{ required: true, message: 'Please input your age!' }]} - > - - - - - - - ); -}); - -function useDemoFormProps(): DemoFormProps { - const data = useCollectionRecordData(); - const resource = useDataBlockResource(); - - const [form] = Form.useForm(); - - useEffect(() => { - form.setFieldsValue(data); - }, [data, form]); - - const onFinish = async (values: DemoFormFieldType) => { - console.log('values', values); - await resource.update({ - filterByTk: data.id, - values, - }); - notification.success({ - message: 'Save successfully!', - }); - }; - - return { - initialValues: data, - preserve: true, - onFinish, - form, - }; -} -const useBlockDecoratorProps: UseDataBlockProps<'CollectionGet'> = () => { - const [state] = useUrlState({ id: '1' }); - return { - filterByTk: state.id, - }; -}; - -const collection = 'users'; -const action = 'get'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-use-decorator-props': 'useBlockDecoratorProps', - 'x-decorator-props': { - collection: collection, - action: action, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'object', - 'x-component': 'DemoForm', - 'x-use-component-props': 'useDemoFormProps', - }, - }, -}; - -const Demo = () => { - const [state, setState] = useUrlState({ id: '1' }); - - return ( - <> - - - - ); -}; - -const mocks = { - [`${collection}:${action}`]: function (config) { - const { filterByTk } = config.params; - return { - data: - Number(filterByTk) === 1 - ? { - id: 1, - username: 'Bamboo', - age: 18, - } - : { - id: 2, - username: 'Mary', - age: 25, - }, - }; - }, - [`${collection}:update`]: function (config) { - console.log('config.data', config.data); - return { - data: 'ok', - }; - }, -}; -const Root = createApp( - Demo, - { - components: { DemoForm }, - scopes: { useDemoFormProps, useBlockDecoratorProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-record-and-update.tsx b/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-record-and-update.tsx deleted file mode 100644 index 98cb58170..000000000 --- a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-form-record-and-update.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, { FC, useEffect } from 'react'; -import { Button, Form, FormProps, Input, InputNumber, notification } from 'antd'; -import { - CollectionRecordProvider, - SchemaComponent, - UseDataBlockProps, - useDataBlockResource, - useCollectionRecordData, - withDynamicSchemaProps, -} from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; - -interface DemoFormFieldType { - id: number; - username: string; - age: number; -} -type DemoFormProps = FormProps; -const DemoForm: FC = withDynamicSchemaProps((props) => { - return ( -
- - label="Username" - name="username" - rules={[{ required: true, message: 'Please input your username!' }]} - > - - - - label="Age" - name="age" - rules={[{ required: true, message: 'Please input your age!' }]} - > - - - - - - - ); -}); - -function useDemoFormProps(): DemoFormProps { - const data = useCollectionRecordData(); - const resource = useDataBlockResource(); - - const [form] = Form.useForm(); - - useEffect(() => { - form.setFieldsValue(data); - }, [data, form]); - - const onFinish = async (values: DemoFormFieldType) => { - console.log('values', values); - await resource.update({ - filterByTk: data.id, - values, - }); - notification.success({ - message: 'Save successfully!', - }); - }; - - return { - initialValues: data, - preserve: true, - onFinish, - form, - }; -} -const useFormBlockDecoratorProps: UseDataBlockProps<'CollectionRecord'> = () => { - const record = useCollectionRecordData(); - return { - record, - }; -}; - -const collection = 'users'; -const action = 'get'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-use-decorator-props': 'useFormBlockDecoratorProps', - 'x-decorator-props': { - collection: collection, - action: action, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'object', - 'x-component': 'DemoForm', - 'x-use-component-props': 'useDemoFormProps', - }, - }, -}; - -const recordData = { - id: 1, - username: 'Bamboo', - age: 18, -}; - -const Demo = () => { - return ( - <> - - - - - ); -}; - -const mocks = { - [`${collection}:update`]: function (config) { - console.log('config.data', config.data); - return { - data: 'ok', - }; - }, -}; -const Root = createApp( - Demo, - { - components: { DemoForm }, - scopes: { useDemoFormProps, useFormBlockDecoratorProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-table-list.tsx b/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-table-list.tsx deleted file mode 100644 index 6da749168..000000000 --- a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/collection-table-list.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import { Table, TableProps } from 'antd'; -import { SchemaComponent, useDataBlockRequest, withDynamicSchemaProps } from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: 'users', - action: 'list', - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', // 动态 table 属性 - }, - }, -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - const { data, loading } = useDataBlockRequest(); - return { - loading, - dataSource: data?.data || [], - columns: [ - { - title: 'UserName', - dataIndex: 'username', - }, - { - title: 'NickName', - dataIndex: 'nickname', - }, - { - title: 'Email', - dataIndex: 'email', - }, - ], - }; -} - -const Demo = () => { - return ; -}; - -const Root = createApp(Demo, { - components: { MyTable }, - scopes: { useTableProps }, -}); - -export default Root; diff --git a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/complete-demo.tsx b/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/complete-demo.tsx deleted file mode 100644 index 8135d9310..000000000 --- a/packages/core/client/docs/en-US/core/data-block/demos/data-block-provider/complete-demo.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import React, { useMemo } from 'react'; -import { - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - SchemaSettings, - useDataBlockRequest, - useCollectionManager, - useCollection, - useCompile, - useDataBlockProps, - useDataBlock, - useSchemaInitializer, - useSchemaInitializerRender, - withDynamicSchemaProps, -} from '@nocobase/client'; - -import { createApp } from '../../../data-source/demos/createApp'; -import { Table, TableProps } from 'antd'; -import { ISchema } from '@nocobase/schema'; -import { observer, useFieldSchema } from '@nocobase/schema'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-component': 'Page', - 'x-initializer': 'MyInitializer', -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - const { tableProps } = useDataBlockProps(); - const { data, loading } = useDataBlockRequest(); - const compile = useCompile(); - const collection = useCollection(); - const columns = useMemo(() => { - return collection.getFields().map((field) => { - return { - title: compile(field.uiSchema?.title || field.name), - dataIndex: field.name, - }; - }); - }, [collection, compile]); - return { - ...tableProps, - loading, - dataSource: data?.data || [], - columns, - }; -} - -const MyTableSettings = new SchemaSettings({ - name: 'MyTableSettings', - items: [ - { - name: 'bordered', - type: 'switch', - useComponentProps() { - const { props: blockSettingsProps, dn } = useDataBlock(); - - return { - title: 'Bordered', - checked: !!blockSettingsProps.tableProps?.bordered, - onChange: (checked) => { - // 修改 schema - dn.deepMerge({ 'x-decorator-props': { tableProps: { bordered: checked } } }); - }, - }; - }, - }, - ], -}); - -const TableDataBlockInitializer = () => { - const { insert } = useSchemaInitializer(); - const handleClick = ({ item }) => { - insert({ - type: 'void', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: item.value, - action: 'list', - tableProps: { - bordered: true, // 用于设置是否显示边框 - }, - }, - 'x-settings': 'MyTableSettings', - 'x-component': 'CardItem', - 'x-toolbar-props': { - draggable: false, - }, - properties: { - table: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', // 动态 table 属性 - }, - }, - }); - }; - const compile = useCompile(); - const collectionManager = useCollectionManager(); - const collectionMenuItems = useMemo( - () => - collectionManager.getCollections().map((collection) => { - return { - label: compile(collection.getOption('title')), - value: collection.getOption('name'), - }; - }), - [collectionManager, compile], - ); - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - items: [ - { - name: 'table', - Component: TableDataBlockInitializer, - }, - ], -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ; -}; - -const App = createApp(Root, { - components: { MyTable, Page }, - scopes: { useTableProps }, - schemaSettings: [MyTableSettings], - schemaInitializers: [myInitializer], -}); - -export default App; diff --git a/packages/core/client/docs/en-US/core/data-block/demos/settings/demo1.tsx b/packages/core/client/docs/en-US/core/data-block/demos/settings/demo1.tsx deleted file mode 100644 index 2bfc15af2..000000000 --- a/packages/core/client/docs/en-US/core/data-block/demos/settings/demo1.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import React from 'react'; -import { - SchemaComponent, - SchemaSettings, - useDataBlockRequest, - useDataBlock, - withDynamicSchemaProps, -} from '@nocobase/client'; - -import { createApp } from '../../../data-source/demos/createApp'; -import { Table, TableProps } from 'antd'; -import { ISchema } from '@nocobase/schema'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: 'users', - action: 'list', - bordered: true, // 用于设置是否显示边框 - }, - 'x-settings': 'MyTableSettings', - 'x-component': 'CardItem', - 'x-toolbar-props': { - draggable: false, - }, - properties: { - demo: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', // 动态 table 属性 - }, - }, -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - // 获取 - const { props } = useDataBlock(); - const { bordered } = props; - const { data, loading } = useDataBlockRequest(); - return { - bordered, - loading, - dataSource: data?.data || [], - columns: [ - { - title: 'Name', - dataIndex: 'name', - }, - { - title: 'Age', - dataIndex: 'age', - }, - { - title: 'Address', - dataIndex: 'address', - }, - ], - }; -} - -const MyTableSettings = new SchemaSettings({ - name: 'MyTableSettings', - items: [ - { - name: 'bordered', - type: 'switch', - useComponentProps() { - // 获取 - const { props: blockSettingsProps, dn } = useDataBlock(); - const { bordered } = blockSettingsProps; - - return { - title: 'Bordered', - checked: bordered, - onChange: (checked) => { - // 修改 - dn.deepMerge({ 'x-decorator-props': { bordered: checked } }); - }, - }; - }, - }, - ], -}); - -const Demo = () => { - return ; -}; - -const Root = createApp(Demo, { - components: { MyTable }, - scopes: { useTableProps }, - schemaSettings: [MyTableSettings], -}); - -export default Root; diff --git a/packages/core/client/docs/en-US/core/data-block/images/data-block.png b/packages/core/client/docs/en-US/core/data-block/images/data-block.png deleted file mode 100644 index 0ac7ee8e8384fc3e3d06e5524057ff2733782a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29926 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 VA+8S%cL=_is*)z8=%K}%{{aoWtTzAv diff --git a/packages/core/client/docs/en-US/core/data-block/images/markdown-block.png b/packages/core/client/docs/en-US/core/data-block/images/markdown-block.png deleted file mode 100644 index 9c9c351bea39a9c7da0560e32549ee345a70665e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4962 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 CR~zX7 diff --git a/packages/core/client/docs/en-US/core/data-source/association-provider.md b/packages/core/client/docs/en-US/core/data-source/association-provider.md deleted file mode 100644 index 97da3d3ab..000000000 --- a/packages/core/client/docs/en-US/core/data-source/association-provider.md +++ /dev/null @@ -1,13 +0,0 @@ -# AssociationProvider - -用于传递关联数据字段以及对应的数据表信息,等同于 `CollectionFieldProvider` + `CollectionProvider`。 - -```tsx | pure -const AssociationProvider = - - {children} - - -``` - -关于关系字段的更多信息,请参考 [关系字段](https://docs.nocobase.com/development/server/collections/association-fields) 以及 [CollectionField](/core/data-source/collection-field)。 diff --git a/packages/core/client/docs/en-US/core/data-source/collection-field-interface-manager.md b/packages/core/client/docs/en-US/core/data-source/collection-field-interface-manager.md deleted file mode 100644 index b589784e5..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-field-interface-manager.md +++ /dev/null @@ -1,171 +0,0 @@ -# CollectionFieldInterfaceManager - -主要是用来管理 [CollectionFieldInterface](./collection-field-interface.md) 和 [CollectionFieldInterfaceGroups](#collectionfieldinterfacegroups),其被 [DataSourceManager](./data-source-manager) 管理。 - - -## CollectionFieldInterfaceGroups - -CollectionFieldInterfaceGroups 是用来对数据表字段进行分组的。 - -![Field Groups](./images/field-groups.png) - -## 实例方法 - -### field interface - -#### addFieldInterfaces() - -添加 field interface。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - addFieldInterfaces(fieldInterfaces: CollectionFieldInterface[]): void -} -``` - -- 示例 - -```tsx | pure -class CheckboxFieldInterface extends CollectionFieldInterface { - name = 'checkbox'; - type = 'object'; - group = 'choices'; - title = '{{t("Checkbox")}}'; - // ... -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaces([CheckboxFieldInterface]); - // or - this.app.dataSourceManager.addFieldInterfaces([CheckboxFieldInterface]); - } -} -``` - -#### getFieldInterface() - -获取 field interface。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - getFieldInterface(name: string): T; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const fieldInterface = this.app.dataSourceManager.collectionFieldInterfaceManager.getFieldInterface('checkbox'); // checkboxFieldInterface - } -} -``` - -#### getFieldInterfaces() - -获取所有的 field interface。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - getFieldInterfaces(): CollectionFieldInterface[]; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const fieldInterfaces = this.app.dataSourceManager.collectionFieldInterfaceManager.getFieldInterfaces(); - } -} -``` - -### field interface group - -#### addFieldInterfaceGroups() - -添加 field interface group。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - addFieldInterfaceGroups(fieldGroups: Record): void; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaceGroups({ - 'test': { - label: 'Test', - order: 1, - } - }); - - // or - this.app.dataSourceManager.addFieldInterfaceGroups({ - 'test': { - label: 'Test', - order: 1, - } - }); - } -} -``` - -#### getFieldInterfaceGroups() - -获取所有的 field interface group。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - getFieldInterfaceGroups(): Record; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const fieldInterfaceGroups = this.app.dataSourceManager.collectionFieldInterfaceManager.getFieldInterfaceGroups(); // { 'test': { label: 'Test', order: 1 } } - } -} -``` - -#### getFieldInterfaceGroup() - -获取 field interface group。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - getFieldInterfaceGroup(name: string): { label: string; order?: number }; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const fieldInterfaceGroup = this.app.dataSourceManager.collectionFieldInterfaceManager.getFieldInterfaceGroup('test'); // { label: 'Test', order: 1 } - } -} -``` diff --git a/packages/core/client/docs/en-US/core/data-source/collection-field-interface.md b/packages/core/client/docs/en-US/core/data-source/collection-field-interface.md deleted file mode 100644 index bb2c1aebf..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-field-interface.md +++ /dev/null @@ -1,94 +0,0 @@ -# CollectionFieldInterface - -用于创建数据字段。 - -![](./images/collection-field-interface.png) - -```ts -class CollectionFieldInterface { - app: Application; - collectionManager: CollectionManager; - - name: string; - group: string; - title?: string; - description?: string; - order?: number; - default?: { - type: string; - uiSchema?: ISchema; - [key: string]: any; - }; - sortable?: boolean; - availableTypes?: string[]; - hasDefaultValue?: boolean; - isAssociation?: boolean; - operators?: any[]; - filterable?: { - operators?: any[]; - children?: any[]; - [key: string]: any; - }; - titleUsable?: boolean; - - validateSchema(fieldSchema: ISchema): Record - usePathOptions(field: CollectionFieldOptions): any - schemaInitialize(schema: ISchema, data: any): void - - getOption(key: K): CollectionFieldInterfaceOptions[K] - getOptions(): CollectionFieldInterfaceOptions; - setOptions(options: CollectionFieldInterfaceOptions): void; -} -``` - -其需要结合 [CollectionManager](./collection-field-interface-manager.md) 使用。 - -```ts -class EmailFieldInterface extends CollectionFieldInterface { - name = 'email'; - type = 'object'; - group = 'basic'; - order = 4; - title = '{{t("Email")}}'; - sortable = true; - // ... -} - -class MyPlugin extends Plugin { - load() { - this.app.dataSourceManager.addFieldInterfaces([ EmailFieldInterface ]); - } -} -``` - -## 实例属性 - -### name - -唯一标识符。 - -### group - -分组。 - -### title - -标题。 - -### default - -配置表单默认值字段 schema。 - -![](./images/collection-field-interface-form.png) - - -## 实例方法 - -### collectionFieldInterface.validateSchema(fieldSchema) - - -### collectionFieldInterface.usePathOptions(field: CollectionFieldOptions) - - -### collectionFieldInterface.schemaInitialize(schema: ISchema, data: any) - diff --git a/packages/core/client/docs/en-US/core/data-source/collection-field.md b/packages/core/client/docs/en-US/core/data-source/collection-field.md deleted file mode 100644 index 3f64b94a6..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-field.md +++ /dev/null @@ -1,164 +0,0 @@ -# CollectionField - -NocoBase 将字段的 schema 分为 2 部分,一部分在 schema 中,一部分在 collection 中。例如: - -```tsx | pure -const schema = { - properties: { - username: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - }, - } -} - -const collection = { - fields: [ - { - type: 'string', - name: 'username', - interface: 'input', - uiSchema: { - title: 'UserName', - type: 'string', - 'x-component': 'Input', - required: true, - description: 'description1', - } as ISchema, - } - ], -} -``` - -两者通过 `name: username` 联系起来,`CollectionField` 会自动读取 schema `name` 属性,并根据 `name` 属性查找 collection 中对应的 `uiSchema` 属性,然后拼接到 schema 中,进行渲染。 - -这样做的好处是,对于同一个字段创建的内容,可以在不同的地方共享同一个 schema,当 schema 变化时,只需要修改一处即可。比如通过上面的 `title: "UserName"` 假设变化 `title: "Name"` 则所有使用到此字段的地方都会变化。 - - - -## CollectionFieldOptions - -字段的配置项。 - -```ts -interface CollectionFieldOptions { - name?: any; - collectionName?: string; - sourceKey?: string; - uiSchema?: ISchema; - target?: string; - - [key: string]: any; -} -``` - -### 普通字段和关系字段 - -字段有 2 种情况,一种是普通字段,一种是 [关系字段](https://docs-cn.nocobase.com/development/server/collections/association-fields)。 - -关系字段是指,字段的值是另一个 collection 的数据,例如 `users` 和 `roles` 两个 collection,`users` 中有一个字段 `roles`,其值是 `roles` collection 的数据,那么 `roles` 就是一个关系字段。 - -普通字段的示例如下: - -```json -{ - "key": "ootprgkoawo", - "name": "email", - "type": "string", - "interface": "email", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "unique": true, - "uiSchema": { - "type": "string", - "title": "{{t(\"Email\")}}", - "x-component": "Input", - "x-validator": "email", - "required": true - } -} -``` - -关系字段的示例如下: - -```json -{ - "key": "t09bauwm0wb", - "name": "roles", - "type": "belongsToMany", - "interface": "m2m", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "target": "roles", - "foreignKey": "userId", - "otherKey": "roleName", - "onDelete": "CASCADE", - "sourceKey": "id", - "targetKey": "name", - "through": "rolesUsers", - "uiSchema": { - "type": "array", - "title": "{{t(\"Roles\")}}", - "x-component": "AssociationField", - "x-component-props": { - "multiple": true, - "fieldNames": { - "label": "title", - "value": "name" - } - } - } -} -``` - -相对于普通字段,关系字段多了以下属性: - -- xx -- xx - -### 全部字段说明 - -- `name`:字段名称 -- `collectionName`:数据表名称 -- `sourceKey`:当字段为关系字段时,对应的关系字段名称。 - -TODO:补全 - -## Hooks - -### useCollectionField() - -用于获取字段信息。 - -```tsx | pure -const collection = { - fields: [ - { - type: 'string', - name: 'username', - interface: 'input', - uiSchema: { - title: 'UserName', - type: 'string', - 'x-component': 'Input', - required: true, - description: 'description1', - } as ISchema, - } - ], -} - -const { uiSchema } = useCollectionField() -const required = uiSchema?.required -``` - -其通常在 [SchemaSettings](/core/ui-schema/schema-settings) 中使用,用来获取和修改字段的属性。 - - - - - diff --git a/packages/core/client/docs/en-US/core/data-source/collection-manager-provider.md b/packages/core/client/docs/en-US/core/data-source/collection-manager-provider.md deleted file mode 100644 index b37a6a27f..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-manager-provider.md +++ /dev/null @@ -1,52 +0,0 @@ -# CollectionManagerProvider - -用于提供 [CollectionManager](/core/data-source/collection-manager) 实例。 - -## 组件 - -- 类型 - -```tsx | pure -interface CollectionManagerProviderProps { - instance?: CollectionManager; - dataSource?: string; - children?: ReactNode; -} -``` - -- 参数详解 - - `dataSource` - 数据源名称,如果为空,则会取默认数据源。 - - `instance` - CollectionManager 实例,如果没有,则会取 `dataSource` 对应的 collectionManager。 - -- 示例 - -```tsx | pure -const collectionManager = new CollectionManager(); - -const Demo = () => { - return ( - -
...
-
- ); -}; -``` - -## Hooks - -### useCollectionManager() - -用于获取 `CollectionManagerProvider` 传递的实例。 - -- 示例 - -```tsx | pure -const Demo = () => { - const collectionManager = useCollectionManager(); - const collections = collectionManager.getCollections() - - return
-
{JSON.stringify(collections, null, 2)}
-
; -}; -``` diff --git a/packages/core/client/docs/en-US/core/data-source/collection-manager.md b/packages/core/client/docs/en-US/core/data-source/collection-manager.md deleted file mode 100644 index 5df92575d..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-manager.md +++ /dev/null @@ -1,175 +0,0 @@ -# CollectionManager - -用于管理 [Collection](./collection.md),其被 [DataSource](./data-source.md) 管理。 - -## 实例方法 - -### addCollections(collections) - -添加数据表。 - -- 类型 - -```tsx | pure -class CollectionManager { - addCollections(collections: CollectionOptions[]): void -} -``` - -- 示例 - -```tsx | pure -const userCollectionOptions = { - "name": "users", - "title": "Users", - fields: [ - // ... - ], -}; - -collectionManager.addCollections([userCollectionOptions]); -``` - -### setCollections(collections) - -重置数据表,会先移除所有数据表,然后再调用 `addCollections()` 添加数据表。 - -- 类型 - -```tsx | pure -class CollectionManager { - setCollections(collections: CollectionOptions[]): void -} -``` - -### reAddCollections(collections) - -由于 [CollectionTemplate](./collection-template.md) 或者 [CollectionMixins](./collection-mixins.md) 的添加会影响 Collection 的实例化,所以提供了重新添加数据表的方法。 - -- 类型 - -```tsx | pure -class CollectionManager { - reAddCollections(collectionInstances: Collection[]): void -} -``` - -- 示例 - -```tsx | pure -const userCollectionInstance = collectionManager.getCollection('users'); -collectionManager.reAddCollections([userCollectionInstance]); -``` - -### getCollections(predicate?) - -获取数据表。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollections(predicate?: (collection: Collection) => boolean) -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollections(); // [ userCollection ] - -collectionManager.getCollections(collection => collection.name === 'posts'); // [ postCollection ] -``` - - -### getCollection(path) - -获取数据表。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollection(path: string): (Mixins & Collection) | undefined -} -``` - -- 详细解释 - - `path` 参数可以是数据表名称,也可以是[关系字段](https://docs.nocobase.com/development/server/collections/association-fields)路径。 - - `path: 'users'`: 获取 `users` 数据表 - - `path: 'users.posts'`: 获取 `users` 数据表的 `posts` 关联字段对应的数据表,即 `postCollection` - -- 示例 - -```tsx | pure -collectionManager.getCollection('users'); // userCollection - -collectionManager.getCollection('users.posts'); // postCollection -collectionManager.getCollection('users.profileId'); // profileCollection -``` - -结合 Mixin 使用: - -```tsx | pure -const collection = collectionManager.getCollection('users'); -const collection = collectionManager.getCollection('users'); -``` - -### getCollectionFields(collectionName) - -获取数据表字段列表。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollectionFields(collectionName: string): CollectionFieldOptions[]; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionFields('users'); // [ { name: 'username', type: 'string', title: 'Username', .. }, { name: 'password', type: 'password', title: 'Password', .. } ] -``` - -### getCollectionName(path) - -获取数据表名称。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollectionName(path: string: GetCollectionOptions): string | undefined; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionName('users'); // 'users' - -collectionManager.getCollectionName('users.profiles'); // 'profiles' -``` - - -### getCollectionField(path) - -获取数据表字段。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollectionField(path: string: GetCollectionOptions): CollectionFieldOptions | undefined; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionField('users.username'); // { name: 'username', type: 'string', title: 'Username', .. } - -collectionManager.getCollectionField('users.roles.name'); // 获取 roles 关联字段对应的 roles 表中的 name 字段 -``` diff --git a/packages/core/client/docs/en-US/core/data-source/collection-mixins.md b/packages/core/client/docs/en-US/core/data-source/collection-mixins.md deleted file mode 100644 index 6512fccc3..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-mixins.md +++ /dev/null @@ -1,57 +0,0 @@ - -## Collection Mixins - -Collection Mixins 是为扩展 Collection 类提供的一种机制,可以通过 `dataSourceManager.addCollectionMixins()` 添加 Collection Mixins。 - -### 定义和注册 - -```tsx | pure -import { Collection, Plugin } from '@nocobase/client'; - -class TestMixin extends Collection { - test() { - const { name } = this.options; - return 'test '+ name; - } -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addCollectionMixins([TestMixin]); - } -} -``` - -### 使用 - -- 使用方式1:在 `CollectionManager` 实例上调用 `getCollection()` 获取指定 `Collection` 实例。 - -```tsx | pure -const Demo = () => { - const cm = useCollectionManager(); - const userCollection = cm.getCollection('users'); - - userCollection.test(); // 'test users' -} -``` - -- 使用方式2:调用 `useCollection()` 获取当前上下文的数据表信息。 - -```tsx | pure -const Demo = () => { - const collection = useCollection(); - collection.test(); // 'test users' -} -``` - -### 多个 Mixins 的使用 - -如果添加了 Mixins,可通过如下方式获得类型提示: - -```tsx | pure -const Demo = () => { - const collection = useCollection(); -} -``` - - diff --git a/packages/core/client/docs/en-US/core/data-source/collection-provider.md b/packages/core/client/docs/en-US/core/data-source/collection-provider.md deleted file mode 100644 index 141187df8..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-provider.md +++ /dev/null @@ -1,63 +0,0 @@ -# CollectionProvider - -用于提供 [Collection](/core/data-source/collction) 实例。 - -## 组件 - -### CollectionProvider - -- 类型 - -```tsx | pure -interface CollectionProviderProps { - name: string; - dataSource?: string; - children?: ReactNode; -} -``` - -- 详解 - -组件会根据 `name` 去 [CollectionManager](/core/data-source/collection-manager) 中查询数据表信息,如果查询不到,则会不进行渲染。 - -`dataSource` 用于指定数据表所在的[命名空间](/core/data-source/collection-manager#datasource),如果不指定,则默认命名空间。 - -- 示例 - -```tsx | pure -import { CollectionProvider } from '@nocobase/client'; - -const MyComponent = () => { - return ( - -
...
-
- ) -} -``` - - -## Hooks - -### useCollection() - -用于获取 `CollectionProvider` 传递的 `Collection` 实例。 - -```tsx | pure -const collection = useCollection() - -console.log(collection instanceof Collection) // true -console.log(collection); -``` - -结合 Mixin 使用: - -```tsx | pure -const collection = useCollection() -const collection = useCollection() -``` - -## 示例 - - - diff --git a/packages/core/client/docs/en-US/core/data-source/collection-template-manager.md b/packages/core/client/docs/en-US/core/data-source/collection-template-manager.md deleted file mode 100644 index 1ff0bffea..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-template-manager.md +++ /dev/null @@ -1,86 +0,0 @@ -# CollectionTemplateManager - -用于管理 [CollectionTemplate](./collection-template),其被 [DataSourceManager](./data-source-manager) 管理。 - -## 实例方法 - -### addCollectionTemplates() - -用于添加 collection template。 - -- 类型 - -```tsx | pure -class CollectionTemplateManager { - addCollectionTemplates(templates: CollectionTemplate[]): void; -} -``` - -- 示例 - -```tsx | pure -class SqlCollectionTemplate extends CollectionTemplate { - name = 'sql'; - type = 'object'; - title = '{{t("SQL collection")}}'; - configurableProperties = { - // ... - } -} - -class TreeCollectionTemplate extends CollectionTemplate { - name = 'tree'; - type = 'object'; - title = '{{t("Tree collection")}}'; - configurableProperties = { - // ... - } -} - -class MyPlugin extends Plugin { - async load() { - this.dataSourceManager.collectionTemplateManager.addCollectionTemplates([ SqlCollectionTemplate, TreeCollectionTemplate ]); - - // or - this.dataSourceManager.addCollectionTemplates([ SqlCollectionTemplate, TreeCollectionTemplate ]); - } -} -``` - -### getCollectionTemplate() - -用于获取 collection template。 - -- 类型 - -```tsx | pure -class CollectionTemplateManager { - getCollectionTemplate(name: string): CollectionTemplate; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionTemplate(); // generalCollectionTemplate - -collectionManager.getCollectionTemplate('tree'); // treeCollectionTemplate -``` - -### getCollectionTemplates() - -用于获取所有 collection templates。 - -- 类型 - -```tsx | pure -class CollectionTemplateManager { - getCollectionTemplates(): CollectionTemplate[]; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionTemplates(); // [ generalCollectionTemplate, treeCollectionTemplate, sqlCollectionTemplate ] -``` diff --git a/packages/core/client/docs/en-US/core/data-source/collection-template.md b/packages/core/client/docs/en-US/core/data-source/collection-template.md deleted file mode 100644 index eb248e519..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection-template.md +++ /dev/null @@ -1,249 +0,0 @@ -# CollectionTemplate - -用于创建数据表的模板。 - -![](./images/collection-template.png) - -```ts -interface AvailableFieldInterfacesInclude { - include?: any[]; -} - -interface AvailableFieldInterfacesExclude { - exclude?: any[]; -} - -interface CollectionTemplateDefaultOptions { - /** - * 自动生成 id - * @default true - * */ - autoGenId?: boolean; - /** 创建人 */ - createdBy?: boolean; - /** 最后更新人 */ - updatedBy?: boolean; - /** 创建日期 */ - createdAt?: boolean; - /** 更新日期 */ - updatedAt?: boolean; - /** 可排序 */ - sortable?: boolean; - /* 树结构 */ - tree?: string; - /* 日志 */ - logging?: boolean; - /** 继承 */ - inherits?: string | string[]; - /* 字段列表 */ - fields?: CollectionOptions['fields']; -} - -class CollectionTemplate { - app: Application; - collectionManager: CollectionManager; - - name: string; - Collection?: typeof Collection; - transform?: (collection: CollectionOptions, app: Application) => CollectionOptions; - title?: string; - color?: string; - /** 排序 */ - order?: number; - /** 默认配置 */ - default?: CollectionTemplateDefaultOptions; - events?: any; - /** UI 可配置的 CollectionOptions 参数(添加或编辑的 Collection 表单的字段) */ - configurableProperties?: Record; - /** 当前模板可用的字段类型 */ - availableFieldInterfaces?: AvailableFieldInterfacesInclude | AvailableFieldInterfacesExclude; - /** 是否分割线 */ - divider?: boolean; - /** 模板描述 */ - description?: string; - /**配置字段中的操作按钮 */ - configureActions?: Record; - //是否禁止删除字段 - forbidDeletion?: boolean; -} -``` - -其需要结合 [CollectionManager](./collection-template-manager.md) 使用。 - -```ts -import { Plugin, Collection, CollectionTemplate } from '@nocobase/client'; - -class SqlCollection extends Collection { - otherMethods() { - // ... - } -} - -class SqlCollectionTemplate extends CollectionTemplate { - name = 'sql'; - Collection = SqlCollection; // 自定义的数据表类 - title = '{{t("SQL collection")}}'; - order = 4; - color = 'yellow'; - default = { - fields: [], - }; - configurableProperties = { - // ... - } -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionTemplateManager.addCollectionTemplates([ SqlCollectionTemplate ]); - - // or - this.app.dataSourceManager.addCollectionTemplates([ SqlCollectionTemplate ]); - } -} -``` - -## 实例属性 - -### name - -模板的唯一标识符。 - - -### Collection - -模板对应的数据表类。 - -在创建数据表后,Collection 会有 [template 字段](/core/data-source/collection#collectionoptions),用于标识该数据表是由哪个模板创建的。 - -当通过 `collectionManager.addCollections()` 添加数据表对象时,会先读取 `collection.template` 字段,然后通过 `collectionManager.getCollectionTemplate(collection.template)` 获取到 `collectionTemplate`。 - -读取 `collectionTemplate.Collection` 字段,并通过 `new collectionTemplate.Collection(collection)` 创建对应的实例。 - -如果不传递 `Collection`,则会通过 `new Collection(collection)` 创建对应的实例。 - -```ts -class SqlCollection extends Collection { - otherMethods() { - // ... - } -} - -class SqlCollectionTemplate extends CollectionTemplate { - name = 'sql'; - Collection = SqlCollection; // 自定义的数据表类 - // ... -} - -const userCollection = { - name: 'users', - template: 'sql', - // ... -} - -// 内部会调用 new SqlCollection(userCollection) -``` - -### title - -模板的标题。 - -### color - -模板的颜色。 - -### order - -模板的排序。 - -### events - -- `beforeSubmit`:提交前触发 - - -### configurableProperties - -表单配置项。 - -![](./images//collection-template-form.png) - -```ts -class SqlCollectionTemplate extends CollectionTemplate { - name = 'sql', - // ... - configurableProperties = { - title: { - type: 'string', - title: '{{ t("Collection display name") }}', - required: true, - 'x-decorator': 'FormItem', - 'x-component': 'Input', - }, - name: { - type: 'string', - title: '{{t("Collection name")}}', - required: true, - 'x-disabled': '{{ !createOnly }}', - 'x-decorator': 'FormItem', - 'x-component': 'Input', - 'x-validator': 'uid', - description: - "{{t('Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.')}}", - }, - // ... - }, -} -``` - -### default - -表单默认值。 - - - -## 实例方法 - -### collectionTemplate.transform(collection) - -collection 创建后,会调用该方法,用于对 collection 进行转换。 - -## Utils - -### getConfigurableProperties() - -用于获取内置的配置项字段。 - -- 类型 - -```tsx | pure -export type DefaultConfigurableKeys = - | 'name' - | 'title' - | 'inherits' - | 'category' - | 'autoGenId' - | 'createdBy' - | 'updatedBy' - | 'createdAt' - | 'updatedAt' - | 'sortable' - | 'description' - | 'moreOptions'; - -const getConfigurableProperties: (...keys: DefaultConfigurableKeys[]) => Record -``` - -- 示例 - -```tsx | pure -import { getConfigurableProperties } from '@nocobase/client'; - -const sqlCollectionTemplate = new CollectionTemplate({ - name: 'sql', - // ... - configurableProperties: { - ...getConfigurableProperties('name', 'title', 'description'), - // ... - }, -}); -``` diff --git a/packages/core/client/docs/en-US/core/data-source/collection.md b/packages/core/client/docs/en-US/core/data-source/collection.md deleted file mode 100644 index 5cce1e551..000000000 --- a/packages/core/client/docs/en-US/core/data-source/collection.md +++ /dev/null @@ -1,293 +0,0 @@ -# Collection - -Collection 数据表类,其被 [CollectionManager](/core/data-source/collection-manager) 管理。 - -## 类型 - -```tsx | pure -interface CollectionOptions { - name: string; - title?: string; - fields?: FieldOptions[]; - // .... -} - -class Collection { - app: Application; - collectionManager: CollectionManager; - - constructor(options: CollectionOptions) {} - - name: string; - primaryKey: string; - titleField: string; - - getOptions(): CollectionOptions; - setOptions(options: CollectionOptions): void; - getOption(key: K): CollectionOptions[K]; - - getFields(predicate?: CollectionFieldOptions | ((collection: CollectionFieldOptions) => boolean) | keyof CollectionFieldOptions): any[] - getField(name: SchemaKey): CollectionFieldOptions - hasField(name: SchemaKey): boolean; -} -``` - -```tsx | pure -const usersCollection = new Collection({ - name: 'users', - title: 'Users', - fields: [ - { - type: 'string', - name: 'username', - }, - { - type: 'integer', - name: 'age', - }, - ], -}); -``` - -## CollectionOptions - -```tsx | pure -export interface CollectionOptions { - name: string; - title?: string; - dataSource?: string; - /** - * Used for @nocobase/plugin-duplicator - * @see packages/core/database/src/collection-group-manager.tss - * - * @prop {'required' | 'optional' | 'skip'} dumpable - Determine whether the collection is dumped - * @prop {string[] | string} [with] - Collections dumped with this collection - * @prop {any} [delayRestore] - A function to execute after all collections are restored - */ - duplicator?: - | dumpable - | { - dumpable: dumpable; - with?: string[] | string; - delayRestore?: any; - }; - - tableName?: string; - inherits?: string[] | string; - inherit?: string; - key?: string; - viewName?: string; - writableView?: boolean; - - filterTargetKey?: string; - fields?: CollectionFieldOptions[]; - model?: any; - repository?: any; - sortable?: CollectionSortable; - /** - * @default true - */ - autoGenId?: boolean; - /** - * @default 'options' - */ - magicAttribute?: string; - - tree?: string; - - template?: string; - - isThrough?: boolean; - autoCreate?: boolean; - resource?: string; - collectionName?: string; - sourceKey?: string; - uiSchema?: any; - [key: string]: any; -} -``` - -- name: Collection 的标识,必须唯一。 - -- title: Collection 的标题,用于显示。 - -- fields: 字段列表,详细说明请查看 [CollectionField](/core/data-source/collection-field) - -- template: 模板标识,用于标识该 Collection 是由哪个模板创建的,详细说明请查看 [CollectionTemplate](/core/data-source/collection-template) - -- dataSource: 数据源标识,用于标识该 Collection 是由哪个数据源创建的,详细说明请查看 [CollectionDataSource](/core/data-source/collection-manager#datasource) - -- duplicator - -- tableName - -- inherits - -- viewName - -- writableView - -- filterTargetKey - -- model - -- repository - - -## 实例属性 - -### collection.collectionManager - -[CollectionManager](/core/data-source/collection-manager) 的实例。 - -### collection.titleFieldName - -标题字段的 name 属性。 - -### 其他属性 - -其他属性同 [CollectionOptions](/core/data-source/collection#collectionoptions)。 - -## 实例方法 - -### collection.getOptions() - -获取 collection 的所有配置项。 - -- 类型 - -```tsx | pure -class Collection { - getOptions(): CollectionOptions; -} -``` - -- 示例 - -```tsx | pure -const usersCollection = new Collection({ - name: 'users', - title: 'Users', - fields: [ - // ... - ], -}); - -console.log(usersCollection.getOptions()); // { name: 'users', title: 'Users', fields: [ ] } -``` - -### collection.setOptions(options) - -设置 collection 的配置项,最终会和默认配置项进行合并。 - -- 类型 - -```tsx | pure -class Collection { - setOptions(options: CollectionOptions): void; -} -``` - -- 示例 - -```tsx | pure -collection.setOptions({ - name: 'users', - title: 'Users', - fields: [ - // ... - ], -}); -``` - -### collection.getOption(key) - -获取 collection 的单个配置项。 - -- 类型 - -```tsx | pure -class Collection { - getOption(key: K): CollectionOptions[K]; -} -``` - -- 示例 - -```tsx | pure -collection.getOption('name'); // 'users' -collection.getOption('title'); // 'Users' -``` - -### collection.getFields(predicate?) - -获取 collection 的字段列表。 - -- 类型 - -```tsx | pure -class Collection { - getFields(predicate?: CollectionFieldOptions | ((collection: CollectionFieldOptions) => boolean) | keyof CollectionFieldOptions): any[] -} -``` - -- 详解 - - predicate - - 类型 - - `CollectionFieldOptions` - - `(collection: CollectionFieldOptions) => boolean` - - `keyof CollectionFieldOptions` - - 说明 - - 如果传递了 `predicate`,则返回符合条件的字段列表 - - 如果没有传递 `predicate`,则返回所有字段列表 - -`predicate` 的使用可看参考 [lodash.filter](https://www.lodashjs.com/docs/lodash.filter)。 - -- 示例 - -```tsx | pure -collection.getFields(); // [{ name: 'username', type: 'string', primaryKey: true }, { name: 'age', type: 'integer' }] - -collection.getFields({ name: 'age' }); // [{ name: 'age', type: 'integer' }] - -collection.getFields('primaryKey'); // [{ name: 'username', type: 'string', primaryKey: true }] - -collection.getFields(field => field.type === 'string'); // [{ name: 'name', type: 'string' }] -``` - -### collection.getField(name) - -获取 collection 的单个字段。 - -- 类型 - -```tsx | pure -class Collection { - getField(name: SchemaKey): CollectionFieldOptions -} -``` - -- 示例 - -```tsx | pure -collection.getField('username'); // { name: 'username', type: 'string', primaryKey: true } -``` - -### collection.hasField(name) - -判断 collection 是否存在某个字段。 - -- 类型 - -```tsx | pure -class Collection { - hasField(name: SchemaKey): boolean; -} -``` - -- 示例 - -```tsx | pure -collection.hasField('username'); // true -collection.hasField('name'); // false -``` diff --git a/packages/core/client/docs/en-US/core/data-source/data-source-manager-provider.md b/packages/core/client/docs/en-US/core/data-source/data-source-manager-provider.md deleted file mode 100644 index 4b39e452c..000000000 --- a/packages/core/client/docs/en-US/core/data-source/data-source-manager-provider.md +++ /dev/null @@ -1,25 +0,0 @@ -# DataSourceManagerProvider - -用于提供 `DataSourceManager` 实例。 - - -## Hooks - -### useDataSourceManager() - -获取 `DataSourceManager` 实例。 - -- 类型 - -```tsx | pure -function useDataSourceManager(): DataSourceManager; -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - dataSourceManager.removeDataSources(['my-data-source']); -} -``` diff --git a/packages/core/client/docs/en-US/core/data-source/data-source-manager.md b/packages/core/client/docs/en-US/core/data-source/data-source-manager.md deleted file mode 100644 index 198021e29..000000000 --- a/packages/core/client/docs/en-US/core/data-source/data-source-manager.md +++ /dev/null @@ -1,334 +0,0 @@ -# DataSourceManager - -Nocobase 数据源前端体系包含如下内容: - -- [DataSourceManager](./data-source-manager.md) - - [DataSource](./data-source) - - [CollectionManager](./collection-manager) - - [Collection](./collection) - - [Field](./collection-field) - - [CollectionTemplateManager](./collection-template-manager) - - [CollectionTemplate](./collection-template) - - [CollectionFieldInterfaceManager](./collection-field-interface-manager) - - [CollectionFieldInterface](./collection-field-interface) - - [CollectionMixins](./collection-mixins) - - -## 实例属性 - -- collectionTemplateManager - -用于管理 `CollectionTemplate` 实例。 - -```tsx | pure -import { Plugin, CollectionTemplate } from '@nocobase/client'; - -class MyCollectionTemplate extends CollectionTemplate { - name = 'my-collection-template'; -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionTemplateManager.addCollectionTemplates([MyCollectionTemplate]) - } -} -``` - -详细请参考:[CollectionTemplateManager](./collection-template-manager) - -- collectionFieldInterfaceManager - -用于管理 `CollectionFieldInterface` 实例。 - -```tsx | pure -import { Plugin, CollectionFieldInterface } from '@nocobase/client'; - -class MyCollectionFieldInterface extends CollectionFieldInterface { - name = 'my-collection-field-interface'; -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaces([MyCollectionFieldInterface]) - } -} -``` - -详细请参考:[CollectionTemplateManager](./collection-template-manager) - -## 实例方法 - -### addCollectionTemplates() - -是 `CollectionTemplateManager` 的快捷方法,用于添加 `CollectionTemplate`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - addCollectionTemplates(templates: CollectionTemplate[]): void; -} -``` - -- 示例 - -```tsx | pure -import { Plugin, CollectionTemplate } from '@nocobase/client'; - -class MyCollectionTemplate extends CollectionTemplate { - name = 'my-collection-template'; -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionTemplateManager.addCollectionTemplates([MyCollectionTemplate]) - } -} -``` - -更多详细请参考:[CollectionTemplateManager](./collection-template-manager) - -### addFieldInterfaces() - -是 `CollectionFieldInterfaceManager` 的快捷方法,用于添加 `CollectionFieldInterface`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - addFieldInterfaces(fieldInterfaces: CollectionFieldInterface[]): void; -} -``` - -- 示例 - -```tsx | pure -import { Plugin, CollectionFieldInterface } from '@nocobase/client'; - -class MyCollectionFieldInterface extends CollectionFieldInterface { - name = 'my-collection-field-interface'; -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaces([MyCollectionFieldInterface]) - } -} -``` - -更多详细请参考:[CollectionFieldInterfaceManager](./collection-field-interface-manager) - -### addCollectionMixins() - -用于添加 `Collection` 的 Mixins。 - -- 类型 - -```tsx | pure -class DataSourceManager { - addCollectionMixins(mixins: (typeof Collection)[]): void; -} -``` - -- 示例 - -```tsx | pure -import { Plugin, Collection } from '@nocobase/client'; - -class MyCollectionMixin extends Collection { - otherMethod() { - console.log('otherMethod'); - } -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addCollectionMixins([MyCollectionMixin]) - } -} - -const MyComponent = () => { - const collection = useCollection(); - collection.otherMethod(); -} -``` - -更多详细请参考:[CollectionMixins](./collection-mixins) - -### addDataSource() - -用于添加 `DataSource`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - addDataSource(DataSource: DataSource, options: DataSourceOptions): void; -} -``` - -- 示例 - -```tsx | pure -import { Plugin, DataSource, DataSourceOptions } from '@nocobase/client'; - -class MyDataSource extends DataSource { - async getDataSource() { - return { - status: 'loaded', - collections: [{ name: 'users' }] - } - } -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addDataSource(MyDataSource, { - key: 'my-data-source', - displayName: 'My Data Source', - }) - } -} -``` - -更多详细请参考:[DataSource](./data-source) - -### removeDataSources() - -移除 `DataSource`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - removeDataSources(keys: string[]): void; -} -``` - -- 示例 - -```tsx | pure - -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - dataSourceManager.removeDataSources(['my-data-source']); -} -``` - -### getDataSources() - -获取全部 `DataSource` 实例列表。 - -- 类型 - -```tsx | pure -class DataSourceManager { - getDataSources(): DataSource[]; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - const dataSources = dataSourceManager.getDataSources(); - - return ( -
- {dataSources.map(dataSource => ( -
{dataSource.displayName}
- ))} -
- ) -} -``` - -### getDataSource() - -获取 `DataSource` 实例。 - -- 类型 - -```tsx | pure -class DataSourceManager { - getDataSource(key: string): DataSource; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - const dataSource = dataSourceManager.getDataSource('my-data-source'); - - return ( -
- {dataSource.displayName} -
- ) -} -``` - -### getAllCollections() - -获取所有 DataSource 的所有 Collection 实例。 - -- 类型 - -```tsx | pure - -class DataSourceManager { - getAllCollections(options?: { - filterCollection?: (collection: Collection) => boolean; - filterDataSource?: (dataSource: DataSource) => boolean; - }): (DataSourceOptions & { collections: Collection[] })[]; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - const collections = dataSourceManager.getAllCollections(); - - return ( -
- {collections.map(({ key, displayName, collections }) => ( -
-

{displayName}

-
    - {collections.map(collection => ( -
  • {collection.name}
  • - ))} -
-
- ))} -
- ) -} -``` - -### reload() - -重载所有 `DataSource`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - reload(): Promise; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - dataSourceManager.reload(); -} -``` - diff --git a/packages/core/client/docs/en-US/core/data-source/data-source-provider.md b/packages/core/client/docs/en-US/core/data-source/data-source-provider.md deleted file mode 100644 index 909a4d894..000000000 --- a/packages/core/client/docs/en-US/core/data-source/data-source-provider.md +++ /dev/null @@ -1,66 +0,0 @@ -# DataSourceProvider - -用于提供 `DataSource` 的实例。 - -## 组件 - -- 类型 - -```tsx | pure -interface DataSourceProviderProps { - dataSource?: string; - children?: ReactNode; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - return ( - - - - ); -} -``` - -## Hooks - -### useDataSource() - -获取 `DataSource` 实例。 - -- 类型 - -```tsx | pure -function useDataSource(): DataSource; -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSource = useDataSource(); - return
{dataSource.displayName}
-} -``` - -### useDataSourceKey() - -获取 `DataSource` 的 key。 - -- 类型 - -```tsx | pure -function useDataSourceKey(): string; -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceKey = useDataSourceKey(); - return
{dataSourceKey}
-} -``` diff --git a/packages/core/client/docs/en-US/core/data-source/data-source.md b/packages/core/client/docs/en-US/core/data-source/data-source.md deleted file mode 100644 index 558a37089..000000000 --- a/packages/core/client/docs/en-US/core/data-source/data-source.md +++ /dev/null @@ -1,176 +0,0 @@ -# DataSource - -主要是用于获取数据源和数据源的数据表结构列表,并在获取后交给 [CollectionManager](./collection-manager.md) 进行管理,其被 [DataSourceManager](./data-source-manager.md) 管理。 - -## 数据源定义 - -数据源的定义需要继承 `DataSource` 类,并实现 `getDataSource` 方法,当调用 `reload` 方法时,会调用 `getDataSource` 方法获取数据表结构。 - -```tsx | pure -import { DataSource } from '@nocobase/client'; - -class MyDataSource extends DataSource { - async getDataSource() { - return this.app.request({ - url: 'xxx', - method: 'GET', - }); - } -} -``` - -### 数据源注册 - -数据源需要在插件中注册,通过 `DataSourceManager` 的 `addDataSource` 方法进行注册。 - -初始化添加的时候 `collections` 可以为空,当调用 `reload` 方法时,会调用 `getDataSource` 方法获取数据表结构。 - -```tsx | pure -import { Plugin, DataSource, DataSourceOptions } from '@nocobase/client'; - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addDataSource(MyDataSource, { - key: 'my-data-source', - displayName: 'My Data Source', - status: 'loaded', - collections: [ - { - name: 'users', - fields: [ - { - name: 'name', - type: 'string', - }, - ], - }, - ], - }); - } -} -``` - -- `key`:数据源的唯一标识 -- `displayName`:数据源的显示名称 -- `status`:数据源的状态,`loaded` 表示已加载,`loading` 表示正在加载,`loading-failed` 表示加载失败 -- `collections`:数据表结构 -- `errorMessage`:错误信息 - -## 实例方法 - -### getDataSource() - -用于获取数据源信息,其会被 `reload` 方法内部调用,外部不需要调用。 - -### addReloadCallback() - -用于添加数据源加载完成后的回调函数。 - -- 类型 - -```tsx | pure -type LoadCallback = (collections: CollectionOptions[]) => void; - -class DataSource { - addReloadCallback(callback: LoadCallback): void; -} -``` - -### removeReloadCallback() - -用于移除数据源加载完成后的回调函数。 - -- 类型 - -```tsx | pure -type LoadCallback = (collections: CollectionOptions[]) => void; -class DataSource { - removeReloadCallback(callback: LoadCallback): void; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSource = useDataSource(); - - useEffect(() => { - const callback = (collections) => { - console.log(collections); - }; - dataSource.addReloadCallback(callback); - return () => { - dataSource.removeReloadCallback(callback); - }; - }, []); -}; -``` - -### reload() - -用于重新加载数据源,会调用 `getDataSource` 方法获取数据表结构,并内部调用 `addReloadCallback` 添加的回调函数。 - -- 类型 - -```tsx | pure -class DataSource { - reload(): Promise; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSource = useDataSource(); - - const handleClick = async () => { - await dataSource.reload(); - }; -}; -``` - -### getOptions() - -获取数据源的配置信息。 - -- 类型 - -```tsx | pure -interface DataSourceOptions { - key: string; - displayName: string; - collections?: CollectionOptions[]; - errorMessage?: string; - status?: 'loaded' | 'loading-failed' | 'loading'; -} - -class DataSource { - getOptions(): DataSourceOptions; -} -``` - -### getOption() - -获取数据源的配置信息。 - -- 类型 - -```tsx | pure -class DataSource { - getOption(key: string): any; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSource = useDataSource(); - - const handleClick = async () => { - console.log(dataSource.getOption('key')); - }; -}; -``` diff --git a/packages/core/client/docs/en-US/core/data-source/demos/collection-field/demo1.tsx b/packages/core/client/docs/en-US/core/data-source/demos/collection-field/demo1.tsx deleted file mode 100644 index 0ec4ddb40..000000000 --- a/packages/core/client/docs/en-US/core/data-source/demos/collection-field/demo1.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { ISchema, observer, useForm } from '@nocobase/schema'; -import { - Action, - Application, - CollectionProvider, - Form, - SchemaComponent, - FormItem, - InheritanceCollectionMixin, - Input, - SchemaComponentOptions, -} from '@nocobase/client'; -import React from 'react'; - -const collection = { - name: 'tests', - fields: [ - { - type: 'string', - name: 'title1', - interface: 'input', - uiSchema: { - title: 'Title1', - type: 'string', - 'x-component': 'Input', - required: true, - description: 'description1', - } as ISchema, - }, - { - type: 'string', - name: 'title2', - interface: 'input', - uiSchema: { - title: 'Title2', - type: 'string', - 'x-component': 'Input', - description: 'description', - default: 'ttt', - }, - }, - { - type: 'string', - name: 'title3', - }, - ], -}; - -const Root = observer(() => { - const schema: ISchema = { - type: 'object', - properties: { - form1: { - type: 'void', - 'x-component': 'Form', - properties: { - // 字段 title1 直接使用全局提供的 uiSchema - title1: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - default: '111', - }, - // 等同于 - // title1: { - // type: 'string', - // title: 'Title', - // required: true, - // 'x-component': 'Input', - // 'x-decorator': 'FormItem', - // }, - title2: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - title: 'Title4', // 覆盖全局已定义的 Title2 - required: true, // 扩展的配置参数 - description: 'description4', - }, - // 等同于 - // title2: { - // type: 'string', - // title: 'Title22', - // required: true, - // 'x-component': 'Input', - // 'x-decorator': 'FormItem', - // }, - // 字段 title3 没有提供 uiSchema,自行处理 - title3: { - 'x-component': 'Input', - 'x-decorator': 'FormItem', - title: 'Title3', - required: true, - }, - action1: { - // type: 'void', - 'x-component': 'Action', - title: 'Submit', - 'x-component-props': { - type: 'primary', - useAction: '{{ useSubmit }}', - }, - }, - }, - }, - }, - }; - - const useSubmit = () => { - const form = useForm(); - return { - async run() { - form.submit(() => { - console.log(form.values); - }); - }, - }; - }; - - return ( - - - - - - ); -}); - -const app = new Application({ - providers: [Root], - components: { Action, Form, Input, FormItem }, - dataSourceManager: { - collections: [collection], - collectionMixins: [InheritanceCollectionMixin], - }, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/data-source/demos/collection-field/demo2.tsx b/packages/core/client/docs/en-US/core/data-source/demos/collection-field/demo2.tsx deleted file mode 100644 index 6ead1b09a..000000000 --- a/packages/core/client/docs/en-US/core/data-source/demos/collection-field/demo2.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { ISchema, observer } from '@nocobase/schema'; -import { - Application, - CollectionProvider, - Form, - FormItem, - InheritanceCollectionMixin, - Input, - SchemaComponent, - SchemaSettings, -} from '@nocobase/client'; -import React from 'react'; - -const collection = { - name: 'tests', - fields: [ - { - type: 'string', - name: 'title1', - interface: 'input', - uiSchema: { - title: 'Title1', - type: 'string', - 'x-component': 'Input', - required: true, - description: 'description1', - } as ISchema, - }, - ], -}; - -const Root = observer(() => { - const schema: ISchema = { - type: 'object', - properties: { - form1: { - type: 'void', - 'x-component': 'Form', - properties: { - title1: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - 'x-settings': 'FormItemSettings', - }, - }, - }, - }, - }; - - return ( - - - - ); -}); - -const formSettings = new SchemaSettings({ - name: 'FormItemSettings', - items: [ - { - name: 'required', - type: 'switch', - useComponentProps() { - // const collectionField = useCollectionField(); // 报错 - return { - checked: true, - // checked: !!collectionField?.uiSchema?.required, - title: 'Required', - onChange(v) { - // ? - }, - }; - }, - }, - ], -}); - -const app = new Application({ - providers: [Root], - components: { Form, Input, FormItem }, - dataSourceManager: { - collections: [collection], - collectionMixins: [InheritanceCollectionMixin], - }, - schemaSettings: [formSettings], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/data-source/demos/collection/demo1.tsx b/packages/core/client/docs/en-US/core/data-source/demos/collection/demo1.tsx deleted file mode 100644 index a01748165..000000000 --- a/packages/core/client/docs/en-US/core/data-source/demos/collection/demo1.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; -import { CollectionProvider, useCollection } from '@nocobase/client'; -import { createApp } from '../createApp'; - -const Demo = () => { - const collection = useCollection(); - return
{JSON.stringify(collection.getField('username'), null, 2)}
; -}; - -const Root = () => { - return ( - - - - ); -}; - -export default createApp(Root); diff --git a/packages/core/client/docs/en-US/core/data-source/demos/collections.json b/packages/core/client/docs/en-US/core/data-source/demos/collections.json deleted file mode 100644 index 4d3aa45f8..000000000 --- a/packages/core/client/docs/en-US/core/data-source/demos/collections.json +++ /dev/null @@ -1,198 +0,0 @@ -[ - { - "key": "h7b9i8khc3q", - "name": "users", - "inherit": false, - "hidden": false, - "description": null, - "category": [], - "namespace": "users.users", - "duplicator": { - "dumpable": "optional", - "with": "rolesUsers" - }, - "sortable": "sort", - "model": "UserModel", - "createdBy": true, - "updatedBy": true, - "logging": true, - "from": "db2cm", - "title": "{{t(\"Users\")}}", - "rawTitle": "{{t(\"Users\")}}", - "fields": [ - { - "uiSchema": { - "type": "number", - "title": "{{t(\"ID\")}}", - "x-component": "InputNumber", - "x-read-pretty": true, - "rawTitle": "{{t(\"ID\")}}" - }, - "key": "ffp1f2sula0", - "name": "id", - "type": "bigInt", - "interface": "id", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "autoIncrement": true, - "primaryKey": true, - "allowNull": false - }, - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Nickname\")}}", - "x-component": "Input", - "rawTitle": "{{t(\"Nickname\")}}" - }, - "key": "vrv7yjue90g", - "name": "nickname", - "type": "string", - "interface": "input", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null - }, - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Username\")}}", - "x-component": "Input", - "x-validator": { - "username": true - }, - "required": true, - "rawTitle": "{{t(\"Username\")}}" - }, - "key": "2ccs6evyrub", - "name": "username", - "type": "string", - "interface": "input", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "unique": true - }, - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Email\")}}", - "x-component": "Input", - "x-validator": "email", - "required": true, - "rawTitle": "{{t(\"Email\")}}" - }, - "key": "rrskwjl5wt1", - "name": "email", - "type": "string", - "interface": "email", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "unique": true - }, - { - "key": "t09bauwm0wb", - "name": "roles", - "type": "belongsToMany", - "interface": "m2m", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "target": "roles", - "foreignKey": "userId", - "otherKey": "roleName", - "onDelete": "CASCADE", - "sourceKey": "id", - "targetKey": "name", - "through": "rolesUsers", - "uiSchema": { - "type": "array", - "title": "{{t(\"Roles\")}}", - "x-component": "AssociationField", - "x-component-props": { - "multiple": true, - "fieldNames": { - "label": "title", - "value": "name" - } - } - } - } - ] - }, - { - "key": "pqnenvqrzxr", - "name": "roles", - "inherit": false, - "hidden": false, - "description": null, - "category": [], - "namespace": "acl.acl", - "duplicator": { - "dumpable": "required", - "with": "uiSchemas" - }, - "autoGenId": false, - "model": "RoleModel", - "filterTargetKey": "name", - "sortable": true, - "from": "db2cm", - "title": "{{t(\"Roles\")}}", - "rawTitle": "{{t(\"Roles\")}}", - "fields": [ - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Role UID\")}}", - "x-component": "Input", - "rawTitle": "{{t(\"Role UID\")}}" - }, - "key": "jbz9m80bxmp", - "name": "name", - "type": "uid", - "interface": "input", - "description": null, - "collectionName": "roles", - "parentKey": null, - "reverseKey": null, - "prefix": "r_", - "primaryKey": true - }, - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Role name\")}}", - "x-component": "Input", - "rawTitle": "{{t(\"Role name\")}}" - }, - "key": "faywtz4sf3u", - "name": "title", - "type": "string", - "interface": "input", - "description": null, - "collectionName": "roles", - "parentKey": null, - "reverseKey": null, - "unique": true, - "translation": true - }, - { - "key": "1enkovm9sye", - "name": "description", - "type": "string", - "interface": null, - "description": null, - "collectionName": "roles", - "parentKey": null, - "reverseKey": null - } - ] - } -] diff --git a/packages/core/client/docs/en-US/core/data-source/demos/createApp.tsx b/packages/core/client/docs/en-US/core/data-source/demos/createApp.tsx deleted file mode 100644 index 127f2e7c8..000000000 --- a/packages/core/client/docs/en-US/core/data-source/demos/createApp.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { - Application, - ApplicationOptions, - CardItem, - Plugin, - CollectionPlugin, - DataBlockProvider, - DEFAULT_DATA_SOURCE_KEY, - DEFAULT_DATA_SOURCE_TITLE, - LocalDataSource, -} from '@nocobase/client'; -import MockAdapter from 'axios-mock-adapter'; -import { ComponentType } from 'react'; -import collections from './collections.json'; - -const defaultMocks = { - 'users:list': { - data: [ - { - id: '1', - username: 'jack', - nickname: 'Jack Ma', - email: 'test@gmail.com', - }, - { - id: '2', - username: 'jim', - nickname: 'Jim Green', - }, - { - id: '3', - username: 'tom', - nickname: 'Tom Cat', - email: 'tom@gmail.com', - }, - ], - }, - 'roles:list': { - data: [ - { - name: 'root', - title: 'Root', - description: 'Root', - }, - { - name: 'admin', - title: 'Admin', - description: 'Admin description', - }, - ], - }, -}; - -export function createApp( - Demo: ComponentType, - options: ApplicationOptions = {}, - mocks: Record = defaultMocks, -) { - class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addDataSource(LocalDataSource, { - key: DEFAULT_DATA_SOURCE_KEY, - displayName: DEFAULT_DATA_SOURCE_TITLE, - collections: collections as any, - }); - } - } - const app = new Application({ - apiClient: { - baseURL: 'http://localhost:8000', - }, - providers: [Demo], - ...options, - components: { - ...options.components, - DataBlockProvider, - CardItem, - }, - plugins: [CollectionPlugin, MyPlugin, ...(options.plugins || [])], - designable: true, - }); - - const mock = new MockAdapter(app.apiClient.axios); - - Object.entries(mocks).forEach(([url, data]) => { - mock.onGet(url).reply(async (config) => { - const res = typeof data === 'function' ? data(config) : data; - return [200, res]; - }); - mock.onPost(url).reply(async (config) => { - const res = typeof data === 'function' ? data(config) : data; - return [200, res]; - }); - }); - - const Root = app.getRootComponent(); - return Root; -} diff --git a/packages/core/client/docs/en-US/core/data-source/demos/data-source-manager/mixins.tsx b/packages/core/client/docs/en-US/core/data-source/demos/data-source-manager/mixins.tsx deleted file mode 100644 index f2f26151f..000000000 --- a/packages/core/client/docs/en-US/core/data-source/demos/data-source-manager/mixins.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import { CollectionProvider, Collection, useCollection, Plugin } from '@nocobase/client'; -import { createApp } from '../createApp'; - -class TestMixin extends Collection { - test() { - const { name } = this.options; - return 'test ' + name; - } -} - -class Test2Mixin extends Collection { - test2() { - const { name } = this.options; - return 'test2 ' + name; - } -} - -const Demo = () => { - const collection = useCollection(); - return ( -
-
test: {collection.test()}
-
test2: {collection.test2()}
-
fields.length: {collection.getFields().length}
-
- ); -}; - -const Root = () => { - return ( - - - - ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addCollectionMixins([TestMixin, Test2Mixin]); - } -} - -export default createApp(Root, { - plugins: [MyPlugin], -}); diff --git a/packages/core/client/docs/en-US/core/data-source/extend-collections-provider.md b/packages/core/client/docs/en-US/core/data-source/extend-collections-provider.md deleted file mode 100644 index 8b033ff0f..000000000 --- a/packages/core/client/docs/en-US/core/data-source/extend-collections-provider.md +++ /dev/null @@ -1,79 +0,0 @@ -# ExtendCollectionsProvider - -用于扩展 [Collection](./collection.md) 。 - -## 组件 - -- 类型 - -```tsx | pure -interface ExtendCollectionsProviderProps { - collections: CollectionOptions[]; - children?: ReactNode; -} -``` - -- 示例 - -```tsx | pure -import { ExtendCollectionsProvider, CollectionOptions } from '@nocobase/client'; - -const userCollection: CollectionOptions = { - name: 'users', - title: '{{t("Users")}}', - fields: [ - { - type: 'string', - name: 'name', - title: '{{t("Name")}}', - }, - { - type: 'string', - name: 'email', - title: '{{t("Email")}}', - }, - ], -} - -const MyPlugin = () => { - return ( - - - - - - ); -} - -const ChildComponent = () => { - const collection = useCollection(); - - return ( -
-

{collection.name}

-
- ); -} -``` - -## Hooks - -### useExtendCollections() - -获取扩展的数据表。 - -```tsx | pure -import { useExtendCollections } from '@nocobase/client'; - -const MyComponent = () => { - const collections = useExtendCollections(); - - return ( -
- {collections.map((collection) => ( -
{collection.title}
- ))} -
- ); -} -``` diff --git a/packages/core/client/docs/en-US/core/data-source/images/collection-field-interface-form.png b/packages/core/client/docs/en-US/core/data-source/images/collection-field-interface-form.png deleted file mode 100644 index 9a6029e8a85c87437182d3b99ac9f920f8250203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26025 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 diff --git a/packages/core/client/docs/en-US/core/data-source/images/collection-field-interface.png b/packages/core/client/docs/en-US/core/data-source/images/collection-field-interface.png deleted file mode 100644 index 6d04d0e2bff8b10a3d7c4bbf20d177989e051bcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18213 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 YQNun$=1Ly;nH@+~QB&cYoLShv0a$h3dH?_b diff --git a/packages/core/client/docs/en-US/core/data-source/images/field-groups.png b/packages/core/client/docs/en-US/core/data-source/images/field-groups.png deleted file mode 100644 index 3f9381a70fc174ec2e9625a654b8ad60fa8b0c12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51287 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

YoCL@+#aV7qG@)ew=HF<*B`vU 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 diff --git a/packages/core/client/docs/en-US/core/static/CxjJbp0pcogYn6xviVyc6QT8nUg.png b/packages/core/client/docs/en-US/core/static/CxjJbp0pcogYn6xviVyc6QT8nUg.png deleted file mode 100644 index 0fa567bf5f7a151d854e45addd119951ba56c770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97084 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%0DvAhtmQ0)`+?`P!`1>o2Rc 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 R3iP7=M_(JJRiXJP;(z=C^^X7m diff --git a/packages/core/client/docs/en-US/core/static/VfPGbhWo9os0qTxcITkcHNfin4g.png b/packages/core/client/docs/en-US/core/static/VfPGbhWo9os0qTxcITkcHNfin4g.png deleted file mode 100644 index 9d65a782cbfe0b4117c5da020b84cb6492556259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14642 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 Ks^YzA$o~V`bbh4( diff --git a/packages/core/client/docs/en-US/core/static/designer.png b/packages/core/client/docs/en-US/core/static/designer.png deleted file mode 100644 index 466fa4cfd8f2455974a8b3d689e086e47c118270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24769 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 diff --git a/packages/core/client/docs/en-US/core/static/plugin-settings.jpg b/packages/core/client/docs/en-US/core/static/plugin-settings.jpg deleted file mode 100644 index 34a8da11627d7c726cfa8ec9c6c55ed2bf26c4b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134578 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

sy@SUNY)7d440qXMCUp?=kQ} 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 diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-basic.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-basic.tsx deleted file mode 100644 index 7c67b3b24..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-basic.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import React from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; - -const Hello = observer(() => { - const field = useField(); - return ( -

- ); -}); - -function Demo() { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - title: itemConfig.title, - 'x-component': 'Hello', - }); - }; - return ; -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - { - name: 'b', - title: 'Item B', - Component: Demo, - }, - ], -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-common.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-common.tsx deleted file mode 100644 index 79962078e..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-common.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { ApplicationOptions, Grid, Plugin, SchemaComponent } from '@nocobase/client'; -import React from 'react'; - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.app.addComponents({ Grid }); - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const appOptions: ApplicationOptions = { - router: { - type: 'memory', - }, - designable: true, - plugins: [PluginHello], -}; - -export { appOptions }; diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-component.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-component.tsx deleted file mode 100644 index 06796b827..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-component.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import React from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; -import { Avatar } from 'antd'; - -const Hello = observer(() => { - const field = useField(); - return ( -
- {field.title} -
- ); -}); - -function Demo() { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - title: itemConfig.title, - 'x-component': 'Hello', - }); - }; - return ; -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - insertPosition: 'beforeEnd', - Component: (props: any) => ( - - C - - ), - componentProps: { - size: 'large', - }, - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - { - name: 'b', - title: 'Item B', - Component: Demo, - }, - ], -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-divider.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-divider.tsx deleted file mode 100644 index 39a23be52..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-divider.tsx +++ /dev/null @@ -1,57 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaInitializer } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'A Group Title', - type: 'itemGroup', - children: [ - { - name: 'a1', - type: 'item', - title: 'A1', - }, - { - name: 'a2', - type: 'item', - title: 'A2', - }, - ], - }, - { - name: 'd', - type: 'divider', - }, - { - name: 'b', - title: 'B Group Title', - type: 'itemGroup', - children: [ - { - name: 'a1', - type: 'item', - title: 'B1', - }, - { - name: 'a2', - type: 'item', - title: 'B2', - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-group.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-group.tsx deleted file mode 100644 index d691ff925..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-group.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { Application, SchemaInitializer, SchemaInitializerItemGroup } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; -import React from 'react'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'A Group Title', - type: 'itemGroup', - children: [ - { - name: 'a1', - type: 'item', - title: 'A1', - }, - { - name: 'a2', - type: 'item', - title: 'A2', - }, - ], - }, - { - name: 'b', - title: 'B Group Title', - type: 'itemGroup', - divider: true, // 渲染分割线 - useChildren() { - // 动态子元素 - return [ - { - name: 'b1', - type: 'item', - title: 'B1', - }, - { - name: 'b2', - type: 'item', - title: 'B2', - }, - ]; - }, - }, - { - name: 'c', - Component: () => { - return ( - - {[ - { - name: 'c1', - type: 'item', - title: 'C1', - }, - ]} - - ); - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-item.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-item.tsx deleted file mode 100644 index 05e6f983a..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-item.tsx +++ /dev/null @@ -1,88 +0,0 @@ -/** - * defaultShowCode: true - */ -import { - Grid, - SchemaInitializer, - useSchemaInitializer, - SchemaInitializerItem, - CardItem, - Application, -} from '@nocobase/client'; -import React from 'react'; -import { appOptions } from './schema-initializer-common'; -import { useFieldSchema } from '@nocobase/schema'; - -const Demo = () => { - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', - }); - }; - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'demo1', - Component: Demo, - }, - { - name: 'demo2', - type: 'item', - useComponentProps() { - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', - }); - }; - - return { - title: 'type 方式定义', - onClick: handleClick, - }; - }, - }, - { - name: 'demo3', - title: 'with items', - type: 'item', - onClick(args) { - console.log(args); - }, - items: [ - { - label: 'aaa', - value: 'aaa', - }, - { - label: 'bbb', - value: 'bbb', - }, - ], - }, - ], -}); - -const Hello = () => { - const schema = useFieldSchema(); - return

Hello, world! {schema.name}

; -}; - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], - components: { CardItem, Hello }, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-menu.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-menu.tsx deleted file mode 100644 index f795b0271..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-menu.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaInitializer } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'A subMenu', - type: 'subMenu', - children: [ - { - name: 'a1', - type: 'item', - title: 'A1', - }, - { - name: 'a2', - type: 'item', - title: 'A2', - }, - ], - }, - { - name: 'b', - title: 'B subMenu', - type: 'subMenu', - children: [ - { - name: 'a1', - type: 'item', - title: 'B1', - }, - { - name: 'a2', - type: 'item', - title: 'B2', - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-select.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-select.tsx deleted file mode 100644 index 620dc40c5..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-select.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Grid, SchemaInitializer, Application, SchemaInitializerSelect, useDesignable } from '@nocobase/client'; -import React from 'react'; -import { appOptions } from './schema-initializer-common'; -import { useFieldSchema } from '@nocobase/schema'; - -const OpenModeSelect = () => { - const fieldSchema = useFieldSchema(); - const openModeValue = fieldSchema?.['x-component-props']?.['openMode'] || 'drawer'; - - const { patch } = useDesignable(); - const handleChange = (value) => { - // 修改当前节点的 Schema 的属性 - patch({ - 'x-component-props': { - openMode: value, - }, - }); - }; - - return ( - - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'openMode', - Component: OpenModeSelect, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-switch.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-switch.tsx deleted file mode 100644 index c8eb33888..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-components-switch.tsx +++ /dev/null @@ -1,88 +0,0 @@ -/** - * defaultShowCode: true - */ -import { - Grid, - SchemaInitializer, - Application, - SchemaInitializerSwitch, - useCurrentSchema, - useSchemaInitializer, - Action, -} from '@nocobase/client'; -import React from 'react'; -import { appOptions } from './schema-initializer-common'; - -const actionKey = 'x-action'; - -const schema = { - type: 'void', - [actionKey]: 'create', - title: "{{t('Add new')}}", - 'x-component': 'Action', - 'x-component-props': { - type: 'primary', - }, -}; - -const AddNewButton = () => { - // 判断是否已插入 - const { exists, remove } = useCurrentSchema(schema[actionKey], actionKey); - - const { insert } = useSchemaInitializer(); - return ( - { - // 如果已插入,则移除 - if (exists) { - return remove(); - } - // 新插入子节点 - insert(schema); - }} - /> - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Configure actions', - wrap: Grid.wrap, - items: [ - { - name: 'Add New', - Component: AddNewButton, - }, - { - name: 'Add New2', - type: 'switch', - useComponentProps() { - const { exists, remove } = useCurrentSchema(schema[actionKey], actionKey); - - const { insert } = useSchemaInitializer(); - return { - checked: exists, - title: 'Add new - type 方式', - onClick() { - // 如果已插入,则移除 - if (exists) { - return remove(); - } - // 新插入子节点 - insert(schema); - }, - }; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], - components: { Action }, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-hooks-item.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-hooks-item.tsx deleted file mode 100644 index ddf54ed2d..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-hooks-item.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/** - * defaultShowCode: true - */ -import React, { ReactNode } from 'react'; -import { Application, SchemaInitializer, SchemaInitializerItem, useSchemaInitializerItem } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; -import { TableOutlined } from '@ant-design/icons'; - -const Demo = () => { - const { name, foo, icon } = useSchemaInitializerItem<{ name: string; foo: string; icon: ReactNode }>(); - - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - foo: 'bar', - icon: , - Component: Demo, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-items.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-items.tsx deleted file mode 100644 index 78657d332..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-items.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import React, { FC } from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerChild, - SchemaInitializerItem, - SchemaInitializerItemsProps, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; -import { ButtonProps, ListProps, List, Card } from 'antd'; - -const Hello = observer(() => { - const field = useField(); - return ( -
- {field.title} -
- ); -}); - -function Demo() { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - title: itemConfig.title, - 'x-component': 'Hello', - }); - }; - return ; -} - -const CustomListGridMenu: FC>> = (props) => { - const { items, options, ...others } = props; - return ( - ( - - - - )} - > - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - ItemsComponent: CustomListGridMenu, - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - { - name: 'b', - title: 'Item B', - Component: Demo, - }, - ], -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-children.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-children.tsx deleted file mode 100644 index 1e7fe3e23..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-children.tsx +++ /dev/null @@ -1,61 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaInitializer, SchemaInitializerItem } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - type: 'itemGroup', - title: '静态 children', - children: [ - { - name: 'a1', - type: 'item', - title: 'A 1', - onClick: () => { - alert('a-1'); - }, - }, - { - name: 'a2', - type: 'item', - title: 'A 2', - }, - ], - }, - { - name: 'a', - type: 'itemGroup', - title: '动态 children', - useChildren() { - return [ - { - name: 'a1', - type: 'item', - title: 'A 1', - onClick: () => { - alert('a-1'); - }, - }, - { - name: 'a2', - type: 'item', - title: 'A 2', - }, - ]; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-define.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-define.tsx deleted file mode 100644 index 534ec581b..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-define.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { Application, SchemaInitializer, SchemaInitializerItem } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const Demo = () => { - // 最终渲染 `SchemaInitializerItem` - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - Component: Demo, // 通过 Component 定义 - }, - { - name: 'b', - type: 'item', // 通过 `type` 定义,底层对应着 `SchemaInitializerItem` 组件 - title: 'type Demo', - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-props.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-props.tsx deleted file mode 100644 index 37d46fa4e..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-props.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { Application, SchemaInitializer, SchemaInitializerItem } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const CommonDemo = (props) => { - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - Component: CommonDemo, - componentProps: { - title: 'componentProps', - }, - }, - { - name: 'b', - Component: CommonDemo, - useComponentProps() { - return { - title: 'useComponentProps', - }; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-visible.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-visible.tsx deleted file mode 100644 index ead52953d..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-options-item-visible.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaInitializer } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - type: 'item', - title: 'Demo A', - }, - { - name: 'b', - type: 'item', - title: 'Demo B', - useVisible() { - return false; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-popover.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-popover.tsx deleted file mode 100644 index 87fec2666..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-popover.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import React from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - useDesignable, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; -import { Button } from 'antd'; - -const Hello = observer(() => { - const field = useField(); - return ( -
- {field.title} -
- ); -}); - -const MyInitializerComponent = () => { - const { insertBeforeEnd } = useDesignable(); - return ( - - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - popover: false, - Component: MyInitializerComponent, -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-render.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-render.tsx deleted file mode 100644 index eea87b77d..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-initializer-render.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import React from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; - -const Hello = observer(() => { - const field = useField(); - return ( -
- {field.title} -
- ); -}); - -function Demo() { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - title: itemConfig.title, - 'x-component': 'Hello', - }); - }; - return ; -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - { - name: 'b', - title: 'Item B', - Component: Demo, - }, - ], -}); - -const AddBlockButton = observer(() => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return ( -
-
{render()}
-
可以进行参数的二次覆盖:{render({ style: { color: 'red' } })}
-
- ); -}); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-common.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-common.tsx deleted file mode 100644 index 01b99b9aa..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-common.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { ApplicationOptions, CardItem, Grid, Plugin, SchemaComponent } from '@nocobase/client'; -import React from 'react'; - -const Hello = () => { - return

Hello, world!

; -}; - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const appOptions: ApplicationOptions = { - router: { - type: 'memory', - }, - designable: true, - components: { Grid, CardItem, Hello }, - plugins: [PluginHello], -}; - -export { appOptions }; diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-action-modal.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-action-modal.tsx deleted file mode 100644 index 25b94e5c3..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-action-modal.tsx +++ /dev/null @@ -1,66 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { - Application, - FormItem, - Input, - SchemaSettings, - SchemaSettingsActionModalItem, - useDesignable, -} from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; -import { ISchema, useField } from '@nocobase/schema'; - -export const SchemaSettingsBlockTitleItem = function BlockTitleItem() { - const filed = useField(); - const { patch } = useDesignable(); - - return ( - { - patch({ - 'x-decorator-props': { - title, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'blockTitle', - Component: SchemaSettingsBlockTitleItem, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ FormItem, Input }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-divider.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-divider.tsx deleted file mode 100644 index f2b3d98b6..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-divider.tsx +++ /dev/null @@ -1,68 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'itemGroup', - componentProps: { - title: 'group A', - }, - children: [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A1', - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A2', - }, - }, - ], - }, - { - name: 'divider', - type: 'divider', - }, - { - name: 'b', - type: 'itemGroup', - componentProps: { - title: 'group B', - }, - children: [ - { - name: 'b1', - type: 'item', - componentProps: { - title: 'B1', - }, - }, - { - name: 'b2', - type: 'item', - componentProps: { - title: 'B2', - }, - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-group.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-group.tsx deleted file mode 100644 index e47b99a13..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-group.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'itemGroup', - componentProps: { - title: 'group A', - }, - children: [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A1', - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A2', - }, - }, - ], - }, - { - name: 'b', - type: 'itemGroup', - componentProps: { - title: 'group B', - }, - children: [ - { - name: 'b1', - type: 'item', - componentProps: { - title: 'B1', - }, - }, - { - name: 'b2', - type: 'item', - componentProps: { - title: 'B2', - }, - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-item.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-item.tsx deleted file mode 100644 index 3aae57b2f..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-item.tsx +++ /dev/null @@ -1,76 +0,0 @@ -/** - * defaultShowCode: true - */ -import React, { FC, useState } from 'react'; -import { Application, SchemaSettings, SchemaSettingsItem, useDesignable } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; -import { observer, useField } from '@nocobase/schema'; -import { Button, Input, Space } from 'antd'; - -const MarkdownEdit = () => { - const field = useField(); - return ( - { - field.editable = true; - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'markdown', - Component: MarkdownEdit, - }, - ], -}); - -const Hello: FC<{ content?: string }> = observer((props) => { - const field = useField(); - const { content } = props; - const [inputVal, setInputVal] = useState(content); - const { patch } = useDesignable(); - return field.editable ? ( - - setInputVal(e.target.value)} /> - - - - - - ) : ( -

{content}

- ); -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ Hello }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-modal.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-modal.tsx deleted file mode 100644 index 6dac4f24d..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-modal.tsx +++ /dev/null @@ -1,66 +0,0 @@ -/** - * defaultShowCode: true - */ -import { ISchema } from '@nocobase/schema'; -import { - Application, - FormItem, - Input, - SchemaSettings, - SchemaSettingsModalItem, - useSchemaSettings, -} from '@nocobase/client'; -import React from 'react'; -import { appOptions } from './schema-settings-common'; - -export const SchemaSettingsBlockTitleItem = function BlockTitleItem() { - const { dn } = useSchemaSettings(); - - return ( - { - dn.deepMerge({ - 'x-decorator-props': { - title, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'blockTitle', - Component: SchemaSettingsBlockTitleItem, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ FormItem, Input }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-remove.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-remove.tsx deleted file mode 100644 index c1b101cc3..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-remove.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'remove', - type: 'remove', - componentProps: { - removeParentsIfNoChildren: true, - breakRemoveOn(s) { - return s['x-component'] === 'Grid'; // 其顶级是 Grid,这一层级不能删 - }, - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-select.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-select.tsx deleted file mode 100644 index e9f80c243..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-select.tsx +++ /dev/null @@ -1,82 +0,0 @@ -/** - * defaultShowCode: true - */ -import React, { FC } from 'react'; -import { Application, SchemaSettings, SchemaSettingsSelectItem, useDesignable } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; -import { observer, useField } from '@nocobase/schema'; -import { Table } from 'antd'; - -const PageSize = () => { - const { patch } = useDesignable(); - const filed = useField(); - return ( - { - patch({ - 'x-component-props': { - pageSize: v, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'pageSize', - Component: PageSize, - }, - ], -}); - -const data = []; -for (let i = 0; i < 46; i++) { - data.push({ - key: i, - name: `Edward King ${i}`, - age: 32, - address: `London, Park Lane no. ${i}`, - }); -} -const Hello: FC<{ pageSize: number }> = observer((props) => { - return ( -
- ); -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ Hello }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-sub-menu.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-sub-menu.tsx deleted file mode 100644 index 4e9be9478..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-sub-menu.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'subMenu', - componentProps: { - title: 'Sub Menu A', - }, - children: [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A1', - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A2', - }, - }, - ], - }, - { - name: 'b', - type: 'subMenu', - componentProps: { - title: 'Sub Menu B', - }, - children: [ - { - name: 'b1', - type: 'item', - componentProps: { - title: 'B1', - }, - }, - { - name: 'b2', - type: 'item', - componentProps: { - title: 'B2', - }, - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-switch.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-switch.tsx deleted file mode 100644 index ef8a22619..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-components-switch.tsx +++ /dev/null @@ -1,74 +0,0 @@ -/** - * defaultShowCode: true - */ -import React, { FC } from 'react'; -import { Application, SchemaSettings, SchemaSettingsSwitchItem, useDesignable } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; -import { observer, useField } from '@nocobase/schema'; -import { Form, Input } from 'antd'; - -const FormItemRequired = () => { - const { patch } = useDesignable(); - const filed = useField(); - return ( - { - patch({ - 'x-component-props': { - required: v, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'required', - Component: FormItemRequired, - }, - { - name: 'required2', - type: 'switch', - useComponentProps() { - const { patch } = useDesignable(); - const filed = useField(); - return { - title: 'Required - type 方式', - checked: !!filed.componentProps?.required, - onChange(v) { - patch({ - 'x-component-props': { - required: v, - }, - }); - }, - }; - }, - }, - ], -}); - -const Hello: FC<{ required: boolean }> = observer((props) => { - return ( -
- - - - - ); -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ Hello }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-children.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-children.tsx deleted file mode 100644 index 102c312b2..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-children.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'itemGroup', - componentProps: { - title: '静态 children', - }, - children: [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A 1', - onClick: () => { - alert('a-1'); - }, - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A 2', - }, - }, - ], - }, - { - name: 'b', - type: 'itemGroup', - componentProps: { - title: '动态 children', - }, - useChildren() { - return [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A 1', - }, - onClick: () => { - alert('a-1'); - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A 2', - }, - }, - ]; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-define.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-define.tsx deleted file mode 100644 index f370a23ee..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-define.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { Application, SchemaSettings, SchemaSettingsItem } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const Demo = () => { - // 最终渲染 `SchemaInitializerItem` - return ; -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - Component: Demo, // 通过 Component 定义 - }, - { - name: 'b', - type: 'item', // 通过 `type` 定义,底层对应着 `SchemaInitializerItem` 组件 - componentProps: { - title: 'type Demo', - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-props.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-props.tsx deleted file mode 100644 index 7b3737611..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-props.tsx +++ /dev/null @@ -1,39 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { Application, SchemaSettings, SchemaSettingsItem } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const CommonDemo = (props) => { - return ; -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - Component: CommonDemo, - componentProps: { - title: 'componentProps', - }, - }, - { - name: 'b', - Component: CommonDemo, - useComponentProps() { - return { - title: 'useComponentProps', - }; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-visible.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-visible.tsx deleted file mode 100644 index 6cfc7f725..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-options-item-visible.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'item', - componentProps: { - title: 'Demo A', - }, - }, - { - name: 'b', - type: 'item', - componentProps: { - title: 'Demo B', - }, - useVisible() { - return false; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-render.tsx b/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-render.tsx deleted file mode 100644 index 5993b128b..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/demos/schema-settings-render.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import { ISchema, useField, useFieldSchema } from '@nocobase/schema'; -import { - Application, - CardItem, - FormItem, - Grid, - Input, - Plugin, - SchemaComponent, - SchemaSettings, - SchemaSettingsModalItem, - createDesignable, - useAPIClient, - useSchemaComponentContext, - useSchemaSettings, - useSchemaSettingsRender, -} from '@nocobase/client'; -import React, { useMemo } from 'react'; - -class PluginHello extends Plugin { - async load() { - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -export const SchemaSettingsBlockTitleItem = function BlockTitleItem() { - const { dn } = useSchemaSettings(); - - return ( - { - dn.shallowMerge({ - 'x-decorator-props': { - title, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'blockTitle', - Component: SchemaSettingsBlockTitleItem, - }, - ], -}); - -const Hello = (props) => { - return ( -

- Hello, world! - {props.children} -

- ); -}; - -const Demo = () => { - const fieldSchema = useFieldSchema(); - const field = useField(); - const api = useAPIClient(); - const { refresh } = useSchemaComponentContext(); - const dn = useMemo( - () => - createDesignable({ - current: fieldSchema.parent, - model: field.parent, - api, - refresh, - }), - [], - ); - const { render, exists } = useSchemaSettingsRender(fieldSchema['x-settings'], { - fieldSchema: dn.current, - field: dn.model, - dn, - }); - return ( -
-
{render()}
-
可以进行参数的二次覆盖:{render({ style: { color: 'red' } })}
-
- ); -}; - -const HelloPage = () => { - return ( -
- -
- ); -}; - -const app = new Application({ - schemaSettings: [mySettings], - router: { - type: 'memory', - }, - designable: true, - components: { FormItem, Input, Grid, CardItem, Hello }, - plugins: [PluginHello], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/en-US/core/ui-schema/designable.md b/packages/core/client/docs/en-US/core/ui-schema/designable.md deleted file mode 100644 index 75b151b26..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/designable.md +++ /dev/null @@ -1,791 +0,0 @@ -# Designable - -## Designable - -对 Schema 节点进行增、删、改操作,并且提供了事件触发机制,用于将数据同步到服务端。 - -```tsx | pure -interface Options { - current: Schema; - api?: APIClient; - onSuccess?: any; - refresh?: () => void; - t?: any; -} - -interface InsertAdjacentOptions { - wrap?: (s: ISchema) => ISchema; - removeParentsIfNoChildren?: boolean; - breakRemoveOn?: ISchema | BreakFn; - onSuccess?: any; -} - -class Designable { - constructor(options: Options ) { } - loadAPIClientEvents(): void; - on(name: 'insertAdjacent' | 'remove' | 'error' | 'patch' | 'batchPatch', listener: any): void - emit(name: 'insertAdjacent' | 'remove' | 'error' | 'patch' | 'batchPatch', ...args: any[]): Promise - refresh(): void - recursiveRemoveIfNoChildren(schema?: Schema, options?: RecursiveRemoveOptions): Schema; - remove(schema?: Schema, options?: RemoveOptions): Promise - removeWithoutEmit(schema?: Schema, options?: RemoveOptions): Schema - insertAdjacent(position: Position, schema: ISchema, options?: InsertAdjacentOptions): void | Promise - insertBeforeBeginOrAfterEnd(schema: ISchema, options?: InsertAdjacentOptions): void - insertBeforeBegin(schema: ISchema, options?: InsertAdjacentOptions): void - insertAfterBegin(schema: ISchema, options?: InsertAdjacentOptions): void - insertBeforeEnd(schema: ISchema, options?: InsertAdjacentOptions): Promise - insertAfterEnd(schema: ISchema, options?: InsertAdjacentOptions): void -} -``` - -### 构造函数 - -- 参数讲解 - - - `current`:需要操作的 Schema 节点 - - `api`:用于发起后端请求的 [APIClient](https://docs.nocobase.com/api/sdk) 实例 - - `onSuccess`:后端接口请求成功后的回调 - - `refresh`:用于更新节点后,刷新页面 - - `t`:`useTranslation()` 的返回值 -- 示例 - -```tsx | pure -const schema = new Schema({ - type: 'void', - name: 'hello', - 'x-component': 'div', -}) - -const dn = new Designable({ current: schema }); -``` - -### Schema 操作方法 - -```tsx | pure -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - } - } - } - } -}); - -const b = schema.b; - -const dn = createDesignable({ - current: b, -}) - -console.log(schema.toJSON()); -``` - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -#### remove - -移除当前节点 - -```tsx | pure -dn.remove(); -console.log(schema.toJSON()); -``` - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.remove(); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { -- b: { -- type: 'void', -- properties: { -- c: { -- type: 'void', -- } -- } -- } - } -} -``` - -#### insertBeforeBegin - -在当前节点的前面插入,并会触发 `insertAdjacent` 事件。 - -```tsx | pure -dn.insertBeforeBegin({ - type: 'void', - name: 'd', -}); -console.log(schema.toJSON()); -``` - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.insertBeforeBegin({ - type: 'void', - name: 'd', -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { -+ d: { -+ type: 'void', -+ }, - b: { - type: 'void', - properties: { - c: { - type: 'void', - } - } - } - } -} -``` - -#### insertAfterBegin - -在当前节点的前面插入,并会触发 `insertAdjacent` 事件。 - -```tsx | pure -dn.insertAfterBegin({ - type: 'void', - name: 'd', -}); -console.log(schema.toJSON()); -``` - - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.insertAfterBegin({ - type: 'void', - name: 'd', -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { -+ d: { -+ type: 'void', -+ }, - c: { - type: 'void', - } - } - } - } -} -``` - -#### insertBeforeEnd - -在当前节点的前面插入,并会触发 `insertAdjacent` 事件。 - -```tsx | pure -dn.insertBeforeEnd({ - type: 'void', - name: 'd', -}); -console.log(schema.toJSON()); -``` - - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.insertBeforeEnd({ - type: 'void', - name: 'd', -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, -+ d: { -+ type: 'void', -+ }, - } - } - } -} -``` - -#### insertAfterEnd - -在当前节点的前面插入,并会触发 `insertAdjacent` 事件。 - -```tsx | pure -dn.insertAfterEnd({ - type: 'void', - name: 'd', -}); -console.log(schema.toJSON()); -``` - - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.insertAfterEnd({ - type: 'void', - name: 'd', -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - } - } - }, -+ d: { -+ type: 'void', -+ }, - } -} -``` - -#### insertAdjacent - -根据第一个参数决定插入的位置,是前面四个方法的封装。 - -```tsx | pure -class Designable { - insertAdjacent(position: Position, schema: ISchema, options?: InsertAdjacentOptions): void | Promise -} -``` - -### 事件监听和 API 请求 - -- `on` :添加事件监听的基础方法 -- `loadAPIClientEvents`:调用 `on` 方法添加对 `insertAdjacent`、`patch`、`batchPatch`、`remove` 的事件的监听,主要功能是将变更的 Schema 更新到服务端 -- `emit`:是根据事件名称,调用之前注册过的方法,具体是由前面讲过的 *插入操作和删除操作* 触发 - -而 `loadAPIClientEvents()` 并非在初始化时调用,需要手动调用,换而言之,如果不调用 `dn.loadAPIClientEvents()`,则不会将更新发送到服务端,主要是简化在单测或者 DEMO 环境对服务端的 Mock。 - -## 工具函数 - -### createDesignable() - -对 `new Designable()` 的简单封装。 - -```tsx | pure -function createDesignable(options: CreateDesignableProps) { - return new Designable(options); -} -``` - -```tsx | pure -const dn = createDesignable({ current: schema }); -``` - -## Hooks - -### useFieldSchema() - -用户获取当前节点 Schema JSON 对象,更多信息请参考 [formily useFieldSchema()](https://react.formilyjs.org/api/hooks/use-field-schema)。 - -- 类型 - -```tsx | pure -import { Schema } from '@formily/json-schema'; -const useFieldSchema: () => Schema; -``` - -- 示例 - -```tsx -/** - * defaultShowCode: true - */ -import React from 'react'; -import { useFieldSchema } from '@formily/react'; -import { Application, Plugin, SchemaComponent } from '@nocobase/client'; -const Demo = ({ children }) => { - const fieldSchema = useFieldSchema(); - return
-
{ JSON.stringify(fieldSchema, null, 2)}
-
{children}
-
-} -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Demo', // 这里是 Demo 组件 - 'properties': { - 'world': { - 'type': 'void', - 'x-component': 'Demo', // 这里也是 Demo 组件 - }, - } -} - -const Root = () => { - return -} - -const app = new Application({ - providers: [Root] -}) - -export default app.getRootComponent(); -``` - -### useField() - -获取当前节点 Schema 实例,更多信息请参考 [formily useField()](https://react.formilyjs.org/api/hooks/use-field) - -- 类型 - -```tsx | pure -import { GeneralField } from '@formily/core'; -const useField: () => T; -``` - -- 示例 - -```tsx | pure -const Demo = () => { - const field = useField(); - console.log('field', field); - return
-} - -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Demo', // 这里是 Demo 组件 - 'properties': { - 'world': { - 'type': 'void', - 'x-component': 'Demo', // 这里也是 Demo 组件 - }, - } -} - -const Root = () => { - return -} -``` - -### useDesignable() - -对当前 Schema 节点的修改操作。 - -- 类型 - -```tsx | pure -interface InsertAdjacentOptions { - wrap?: (s: ISchema) => ISchema; - removeParentsIfNoChildren?: boolean; - breakRemoveOn?: ISchema | BreakFn; - onSuccess?: any; -} - -type Position = 'beforeBegin' | 'afterBegin' | 'beforeEnd' | 'afterEnd'; - -function useDesignable(): { - dn: Designable; - designable: boolean; - reset: () => void; - refresh: () => void; - setDesignable: (value: boolean) => void; - findComponent(component: any): any; - patch: (key: ISchema | string, value?: any) => void - on(name: "error" | "insertAdjacent" | "remove" | "patch" | "batchPatch", listener: any): void - remove(schema?: any, options?: RemoveOptions): void - insertAdjacent(position: Position, schema: ISchema, options?: InsertAdjacentOptions): void - insertBeforeBegin(schema: ISchema): void; - insertAfterBegin(schema: ISchema): void; - insertBeforeEnd(schema: ISchema): void; - insertAfterEnd(schema: ISchema): void; -} -``` - -- 详细解释 - - - designable、reset、refresh、setDesignable:这些值继承自 [SchemaComponentContext](https://www.baidu.com) - - dn:是 `Designable` 的实例 - - findComponent:用于查找 Schema 中字符串对应真正的组件,如果组件未注册则返回 `null` - - remove:内部调用的是 `dn.remove` 方法 - - on:内部调用的是 `dn.on` 方法 - - insertAdjacent:插入新的 Schema 节点,内部调用的是 `dn.insertAdjacent` 方法 - - position:插入位置 - - schema:新的 Schema 节点 - - Options - - wrap:对 Schema 的二次处理的回调函数 - - removeParentsIfNoChildren:当没有子元素时,删除父元素 - - breakRemoveOn:停止删除的判断回调 - - onSuccess:插入成功的回调 - - insertBeforeBegin:内部调用的是 `dn.insertBeforeBegin` 方法 - - insertAfterBegin:内部调用的是 `dn.insertAfterBegin` 方法 - - insertBeforeEnd:内部调用的是 `dn.insertBeforeEnd` 方法 - - insertAfterEnd:内部调用的是 `dn.insertAfterEnd` 方法 -- 示例 - -插入节点。 - -```tsx -import React from 'react'; -import { - SchemaComponentProvider, - SchemaComponent, - useDesignable, -} from '@nocobase/client'; -import { observer, Schema, useFieldSchema } from '@formily/react'; -import { Button, Space } from 'antd'; -import { uid } from '@formily/shared'; - -const Hello = observer( - (props) => { - const { insertAdjacent } = useDesignable(); - const fieldSchema = useFieldSchema(); - return ( -
-

{fieldSchema.name}

- - - - - - -
{props.children}
-
- ); - }, - { displayName: 'Hello' }, -); - -const Page = observer( - (props) => { - return
{props.children}
; - }, - { displayName: 'Page' }, -); - -export default () => { - return ( - - - - ); -}; -``` - -部分更新。 - -```tsx -import React from 'react'; -import { - SchemaComponentProvider, - SchemaComponent, - useDesignable, -} from '@nocobase/client'; -import { observer, Schema, useField, useFieldSchema } from '@formily/react'; -import { FormItem } from '@formily/antd-v5'; -import { Button } from 'antd'; -import { uid } from '@formily/shared'; - -const Hello = observer( - (props) => { - const fieldSchema = useFieldSchema(); - const field = useField(); - const { dn } = useDesignable(); - return ( -
-

{field.title}

- { JSON.stringify(props) } -
- { JSON.stringify(field.componentProps) } -
- { JSON.stringify(field.decoratorProps) } -
- { JSON.stringify(fieldSchema.toJSON()) } -
- - -
- ); - }, - { displayName: 'Hello' }, -); - -const Page = observer( - (props) => { - return
{props.children}
; - }, - { displayName: 'Page' }, -); - -export default () => { - return ( - - - - ); -}; -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/core/ui-schema/schema-component.md b/packages/core/client/docs/en-US/core/ui-schema/schema-component.md deleted file mode 100644 index 9a6aa8310..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/schema-component.md +++ /dev/null @@ -1,212 +0,0 @@ -# SchemaComponent - -## Context - -### SchemaComponentContext - -```tsx | pure -interface SchemaComponentContext { - scope?: any; - components?: SchemaReactComponents; - refresh?: () => void; - reset?: () => void; - designable?: boolean; - setDesignable?: (value: boolean) => void; -} -``` - -Schema 渲染的上下文。 - -- `scope`:Schema 中变量的映射 -- `components`: Schema 中组件的映射 -- `refresh`:触发 React 重新渲染的工具函数 -- `reset`:重置整个 Schema 节点 -- `designable`:是否显示设计器,默认 `false` -- `setDesignable`:用于切换 `designable` 的值 - -## Hooks - -### useSchemaOptionsContext() - -用于获取注册的 `scope` 和 `components`。 - -```tsx | pure -const { scope, components } = useSchemaOptionsContext(); -``` - -## 组件 - -### SchemaComponentProvider - -其是对 `SchemaComponentContext.Provider` 和 [FormProvider ](https://react.formilyjs.org/api/components/form-provider)的封装,并内置在 `Application` 中,并且会将 `app.components` 和 `app.scopes` 传递过去,所以一般情况下 *不需要关注* 此组件。 - -- props - -```tsx | pure -interface SchemaComponentProviderProps { - designable?: boolean; - form?: Form; - scope?: any; - components?: SchemaReactComponents; -} -``` - -- 详细解释 - - `designable`:`SchemaComponentContext` 中 `designable` 的默认值 - - `form`:NocoBase 的 Schema 能力是基于 formily 的 `FormProvider` 提供的,form 是其参数,默认为 `createForm()` - - `scope`:Schema 中所用到的变量,会通过 `SchemaComponentContext` 进行传递 - - `components`:Schema 中所用到的组件,会通过 `SchemaComponentContext` 进行传递 - -### SchemaComponent - -用于渲染 Schema,此组件必须和 `SchemaComponentProvider` 一起使用,因为 `SchemaComponentProvider` 提供了 [FormProvider](https://react.formilyjs.org/api/components/form-provider) 作为渲染 Schema 的根节点。 - -- Props - -```tsx | pure -type SchemaComponentProps = (ISchemaFieldProps | IRecursionFieldProps) & { - memoized?: boolean; - components?: SchemaReactComponents; - scope?: any; -} -``` - -- 详细解释 - - - `memoized`:当为 `true` 时,会对每层的 Schema 使用 `useMemo()` 进行处理 - - `components`:同 `SchemaComponentProvider` 的 `components` - - `scope`: 同 `SchemaComponentProvider` 的 `components` - -## 综合示例 - -结合 `SchemaComponentProvider`、 `useSchemaComponentContext()` 和 `SchemaComponent`。 - -```tsx -/** - * defaultShowCode: true - */ -import { SchemaComponentProvider, useSchemaComponentContext, SchemaComponent, } from '@nocobase/client'; -const Hello = () => { - const { designable, setDesignable } = useSchemaComponentContext(); - return
-
hello world
- -
; -} - -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Hello', -} - -const Demo = () => { - return -} - -const Root = () => { - return - - -} - -export default Root; -``` - -使用 `new Application()` 的方式,其内置了 `SchemaComponentProvider` ,我们可以如下操作: - -```tsx -/** - * defaultShowCode: true - */ -import { Application, Plugin, useSchemaComponentContext, SchemaComponent } from '@nocobase/client'; -const Hello = () => { - const { designable, setDesignable } = useSchemaComponentContext(); - return
-
hello world
- -
; -} - -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Hello', -} - -const HomePage = () => { - return -} - -class MyPlugin extends Plugin { - async load() { - this.app.addComponents({ Hello }); - this.app.router.add('home', { - path: '/', - Component: HomePage, - }) - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], -}) - -export default app.getRootComponent(); -``` - -### SchemaComponentOptions - -在应用中,会有很多层级的嵌套,每一层都可能提供自己的组件和 scope,此组件就是为了层层传递 Schema 所需的 `components` 和 `scope` 的。 - -- props - -```tsx | pure -interface SchemaComponentOptionsProps { - scope?: any; - components?: SchemaReactComponents; -} -``` - -- 示例 - -```tsx -/** - * defaultShowCode: true - */ -import { SchemaComponentProvider, useSchemaComponentContext, SchemaComponent, SchemaComponentOptions } from '@nocobase/client'; -const World = () => { - return
world
-} - -const Hello = ({ children }) => { - return
-
hello
- { children } -
; -} - -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Hello', - properties: { - world: { - type: 'void', - 'x-component': 'World', - }, - }, -} - -const Root = () => { - return - - -} - -export default Root; -``` diff --git a/packages/core/client/docs/en-US/core/ui-schema/schema-initializer-manager.md b/packages/core/client/docs/en-US/core/ui-schema/schema-initializer-manager.md deleted file mode 100644 index 483f9d2b6..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/schema-initializer-manager.md +++ /dev/null @@ -1,186 +0,0 @@ -# SchemaInitializerManager - -## 实例方法 - -### schemaInitializerManager.add() - -添加 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - add(...schemaInitializerList: SchemaInitializer[]): void -} -``` - -- 示例 - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add block', - items: [ - { - name: 'demo', - type: 'item', - title: 'Demo' - } - ], -}); - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - } -} -``` - -### schemaInitializerManager.get() - -获取一个 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - get(name: string): SchemaInitializer | undefined -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const myInitializer = this.app.schemaInitializerManager.get('MyInitializer'); - } -} -``` - -### schemaInitializerManager.getAll() - -获取所有的 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - getAll(): Record> -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const list = this.app.schemaInitializerManager.getAll(); - } -} -``` - -### app.schemaInitializerManager.has() - -判断是否有存在某个 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - has(name: string): boolean -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const hasMyInitializer = this.app.schemaInitializerManager.has('MyInitializer'); - } -} -``` - -### schemaInitializerManager.remove() - -移除 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - remove(name: string): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.remove('MyInitializer'); - } -} -``` - -### schemaInitializerManager.addItem() - -添加 SchemaInitializer 实例的 Item 项,其和直接 schemaInitializer.add() 方法的区别是,可以确保在实例存在时才会添加。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - addItem(schemaInitializerName: string, itemName: string, data: Omit): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - // 方式1:先获取,再添加子项,需要确保已注册 - const myInitializer = this.app.schemaInitializerManager.get('MyInitializer'); - if (myInitializer) { - myInitializer.add('b', { type: 'item', title: 'B' }) - } - - // 方式2:通过 addItem,内部确保在 MyInitializer 注册时才会添加 - this.app.schemaInitializerManager.addItem('MyInitializer', 'b', { - type: 'item', - title: 'B' - }) - } -} -``` - -### schemaInitializerManager.removeItem() - -移除 实例的 Item 项,其和直接 schemaInitializer.remove() 方法的区别是,可以确保在实例存在时才会移除。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - removeItem(schemaInitializerName: string, itemName: string): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - // 方式1:先获取,再删除子项,需要确保已注册 - const myInitializer = this.app.schemaInitializerManager.get('MyInitializer'); - if (myInitializer) { - myInitializer.remove('a') - } - - // 方式2:通过 addItem,内部确保在 MyInitializer 注册时才会移除 - this.app.schemaInitializerManager.remove('MyInitializer', 'a') - } -} -``` diff --git a/packages/core/client/docs/en-US/core/ui-schema/schema-initializer.md b/packages/core/client/docs/en-US/core/ui-schema/schema-initializer.md deleted file mode 100644 index 2637b0a80..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/schema-initializer.md +++ /dev/null @@ -1,704 +0,0 @@ -# SchemaInitializer - -## new SchemaInitializer(options) - -```tsx | pure -interface SchemaInitializerOptions { - Component?: ComponentType; - componentProps?: P1; - style?: React.CSSProperties; - title?: string; - icon?: ReactNode; - - items?: SchemaInitializerItemType[]; - ItemsComponent?: ComponentType; - itemsComponentProps?: P2; - itemsComponentStyle?: React.CSSProperties; - - insertPosition?: 'beforeBegin' | 'afterBegin' | 'beforeEnd' | 'afterEnd'; - designable?: boolean; - wrap?: (s: ISchema) => ISchema; - onSuccess?: (data: any) => void; - insert?: InsertType; - useInsert?: () => InsertType; - - popover?: boolean; - popoverProps?: PopoverProps; -} - -class SchemaInitializer { - constructor(options: SchemaInitializerOptions & { name: string }): SchemaInitializer; - add(name: string, item: Omit): void - get(nestedName: string): SchemaInitializerItemType | undefined - remove(nestedName: string): void -} -``` - -### 详细解释 - -![](../static/KTUWb69kioUg8bxYTAMc2ReDnRg.png) - -- name:唯一标识,必填 -- Component 相关 - - - Component:触发组件,默认是 `Button` 组件 - - componentProps: 组件属性,默认是 `ButtonProps` - - title: 按钮的文本 - - icon:按钮的 icon 属性 - - style:组件的样式 -- Items 相关 - - - items:列表项配置 - - ItemsComponent:默认是渲染成一个列表的形式,可通过此参数自定义 items - - itemsComponentProps:`ItemsComponent` 的属性 - - itemsComponentStyle:`ItemsComponent` 的样式 -- popover 组件相关 - - - popover:是否使用 popover,默认为 `true` - - popoverProps:popover 的属性 -- Schema 操作相关 - - - insertPosition:插入位置,参考:[useDesignable()](/core/ui-schema/designable#usedesignable) - - designable:是否显示设计模式,参考:[useDesignable()](/core/ui-schema/designable#usedesignable) - - wrap:对 Schema 的二次处理,参考:[useDesignable()](/core/ui-schema/designable#usedesignable) - - onSuccess:Schema 更新到服务端后的回调,参考:[useDesignable()](/core/ui-schema/designable#usedesignable) - - insert:自定义 Schema 插入逻辑,默认为 [useDesignable()](/core/ui-schema/designable#usedesignable) 的 `insertAdjacent` - - useInsert:当自定义插入 Schema 的逻辑需要用到 Hooks 时,可以使用此参数 - -### 示例 - -#### 基础用法 - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - ], -}); -``` - - - - -#### 定制化 `Component` - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - Component: (props) => ( - - C - - ), - componentProps: { - size: 'large', - }, - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - } - ], -}); -``` - - - -#### 不使用 Popover - -关于 `useDesignable()` 的说明请参考 [useDesignable](/core/ui-schema/designable#usedesignable)。 - -```tsx | pure -const schema = { - type: 'void', - title: Math.random(), - 'x-component': 'Hello', -}; -const MyInitializerComponent = () => { - const { insertBeforeEnd } = useDesignable(); - return -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add block', - popover: false, - Component: MyInitializerComponent, -}); -``` - - - - -#### 定制化 Items - -```tsx | pure -const CustomListGridMenu: FC>> = (props) => { - const { items, options, ...others } = props; - return ( - ( - - - - )} - > - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - ItemsComponent: CustomListGridMenu, - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - } - ], -}); -``` - - - -## options.items 配置详解 - -### 类型 - -```tsx | pure -interface SchemaInitializerComponentCommonProps { - title?: string; - schema?: ISchema; - style?: React.CSSProperties; - className?: string; -} - -interface SchemaInitializerItemBaseType extends SchemaInitializerComponentCommonProps { - name: string; - sort?: number; - type?: string; - Component?: string | ComponentType; - componentProps?: Omit; - useComponentProps?: () => Omit; - useVisible?: () => boolean; - children?: SchemaInitializerItemType[]; - useChildren?: () => SchemaInitializerItemType[]; - [index: string]: any; -} -``` - -### 两种定义方式:`Component` 和 `type` - - -- 通过 `Component` 定义 - -```tsx | pure - -const Demo = () => { - // 最终渲染 `SchemaInitializerItem` - return -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - items: [ - { - name: 'a', - Component: Demo, // 通过 Component 定义 - } - ], -}); -``` - -- 通过 `type` 定义 - -NocoBase 内置了一些常用的 `type`,例如 `type: 'item'`,相当于 `Component: SchemaInitializerItem`。 - -更多内置类型,请参考:[内置组件和类型](/core/ui-schema/schema-initializer#%E5%86%85%E7%BD%AE%E7%BB%84%E4%BB%B6%E5%92%8C%E7%B1%BB%E5%9E%8B) - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - items: [ - { - name: 'a', - type: 'item', - title: 'Demo' - } - ], -}); -``` - - - -### `children` 和动态方式 `useChildren` - -对于某些组件而言是有子列表项的,例如 `type: 'itemGroup'`,那么我们使用 children 属性,同时考虑到某些场景下 children 是动态的,需要从 Hooks 里面获取,那么就可以通过 `useChildren` 来定义。 - - - -### 动态显示隐藏 `useVisible` - - - -### 组件属性 `componentProps` 和动态属性 `useComponentProps` - -对于一些通用组件,我们可以通过 `componentProps` 来定义组件属性,同时考虑到某些场景下组件属性是动态的,需要从 Hooks 里面获取,那么就可以通过 `useComponentProps` 来定义。 - -当然也可以不使用这两个属性,直接封装成一个组件,然后通过 `Component` 来定义。 - - - -### 公共属性和组件属性 - -```tsx | pure -{ - name: 'demo', - title: 'Demo', - foo: 'bar', - Component: Demo, - componentProps: { - zzz: 'xxx', - }, -} -``` - -从上面的示例中我么看到,从配置项中获取组件组件所需的数据有两个方式: - -- 组件属性:通过 `componentProps` 来定义,例如 `zzz: 'xxx'` -- 公共属性:将属性直接定义在配置项上,例如 `foo: 'bar'`、`name`、`title` - -在获取上 - -- `componentProps` 定义的数据会被传递给组件的 `props` -- 直接定义在配置项上的数据会则需要通过 [useSchemaInitializerItem()](/core/ui-schema/schema-initializer#useschemainitializeritem) 获取 - -```tsx | pure -const Demo = (props) => { - console.log(props); // { zzz: 'xxx' } - const { foo } = useSchemaInitializerItem(); // { foo: 'bar' } -} -``` - -## 实例方法 - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'item a', - type: 'itemGroup', - children: [ - { - name: 'a1', - title: 'item a1', - } - ], - }, - ], -}); -``` - -```tsx -import { SchemaInitializer, Application, useSchemaInitializerRender } from '@nocobase/client'; -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'item a', - type: 'itemGroup', - children: [ - { - name: 'a1', - title: 'item a1', - type: 'item', - } - ], - }, - ], -}); - -const Root = () => { - const { render } = useSchemaInitializerRender('MyInitializer'); - return render(); -} -const app = new Application({ - schemaInitializers: [myInitializer], - providers: [Root], - designable: true, -}); - -export default app.getRootComponent(); -``` - -### schemaInitializer.add() - -用于新增 Item,另一种添加方式参考 [schemaInitializerManager.addItem()](/core/ui-schema/schema-initializer-manager#schemainitializermanageradditem); - -- 类型 - -```tsx | pure -class SchemaInitializer { - add(name: string, item: Omit): void -} -``` - -- 参数说明 - -第一个参数是 name,作为唯一标识,用于增删改查,并且 `name` 支持 `.` 用于分割层级。 - -- 示例 - -```tsx | pure -myInitializer.add('b', { - type: 'item', - title: 'item b', -}) - -myInitializer.add('a.a2', { - type: 'item', - title: 'item a2', -}) -``` - -```tsx -import { SchemaInitializer, Application, useSchemaInitializerRender } from '@nocobase/client'; -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'item a', - type: 'itemGroup', - children: [ - { - name: 'a1', - title: 'item a1', - type: 'item', - } - ], - }, - ], -}); - -myInitializer.add('b', { - type: 'item', - title: 'item b', -}) - -myInitializer.add('a.a2', { - type: 'item', - title: 'item a2', -}) - -const Root = () => { - const { render } = useSchemaInitializerRender('MyInitializer'); - return render(); -} -const app = new Application({ - schemaInitializers: [myInitializer], - providers: [Root], - designable: true, -}); - - -export default app.getRootComponent(); -``` - - -### schemaInitializer.get() - -- 类型 - -```tsx | pure -class SchemaInitializer { - get(nestedName: string): SchemaInitializerItemType | undefined -} -``` - -- 示例 - -```tsx | pure -const itemA = myInitializer.get('a') - -const itemA1 = myInitializer.add('a.a1') -``` - -### schemaInitializer.remove() - -另一种移除方式参考 [schemaInitializerManager.addItem()](/core/ui-schema/schema-initializer-manager#schemainitializermanagerremoveitem); - -- 类型 - -```tsx | pure -class SchemaInitializer { - remove(nestedName: string): void -} -``` - -- 示例 - -```tsx | pure -myInitializer.remove('a.a1') - -myInitializer.remove('a') -``` - -## Hooks - -### useSchemaInitializer() - -用于获取 `SchemaInitializer` 上下文内容。 - -- 类型 - -```tsx | pure -export type InsertType = (s: ISchema) => void; - -const useSchemaInitializer: () => { - insert: InsertType; - options: SchemaInitializerOptions; - visible?: boolean; - setVisible?: (v: boolean) => void; -} -``` - -- 参数详解 - - `insert`:参数是 Schema 对象,用于插入 Schema - - `options`:获取 `new SchemaInitializer(options)` 时 options 配置 - - `visible`:popover 是否显示 - - `setVisible`:设置 popover 显示状态 - -- 示例 - -```tsx | pure -const schema = { - type: 'void', - 'x-component': 'Hello', -} -const Demo = () => { - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert(schema); - }; - return ; -} -``` - -### useSchemaInitializerRender() - -用于渲染 `SchemaInitializer`。 - -- 类型 - -```tsx | pure -function useSchemaInitializerRender(name: string, options?: SchemaInitializerOptions): { - exists: boolean; - render: (props?: SchemaInitializerOptions) => React.FunctionComponentElement; -} -``` - -- 参数详解 - -返回的 `render` 方法可以接收一个参数,用于覆盖 `new SchemaInitializer(options)` 的 `options` 配置。 - -- 示例 - -```tsx | pure -const Demo = () => { - const filedSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer'], fieldSchema['x-initializer-props']); - return
-
{ render() }
-
可以进行参数的二次覆盖:{ render({ style: { color: 'red' } }) }
-
-} -``` - - - -### useSchemaInitializerItem() - -用于获取配置项内容的,配置项是指的 `SchemaInitializer` 中的 `items` 中的一项。 - -- 类型 - -```tsx | pure -const useSchemaInitializerItem: () => T -``` - -- 示例 - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'Item A', - foo: 'bar', - Component: Demo, - }, - ], -}); - -/** - * 通过 useSchemaInitializerItem() 获取到的是 - * { - * name: 'a', - * title: 'Item A', - * foo: 'bar', - * Component: Demo, - * } - */ -const Demo = () => { - const { title, foo } = useSchemaInitializerItem(); - return
{ title } - { foo }
-} -``` - - - -## 内置组件和类型 - -| type | Component | 效果 | -| ----------- | ------------------------------ | ----------------------------------------- | -| item | SchemaInitializerItem | 文本| -| itemGroup | SchemaInitializerItemGroup | 分组,同 antd `Menu` 组件的 `type: 'group'` | -| subMenu | SchemaInitializerSubMenu | 子菜单,同 antd `Menu` 组件的子菜单 | -| divider | SchemaInitializerDivider | 分割线,同 antd `Menu` 组件的 `type: 'divider'` | -| switch | SchemaInitializerSwitch | 开关 | -| actionModal | SchemaInitializerActionModal | 弹窗| - -以下每个示例都提供了 2 种[定义方式](/core/ui-schema/schema-initializer#两种定义方式component-和-type),一种是通过 `Component` 定义,另一种是通过 `type` 定义。 - -### `type: 'item'` & `SchemaInitializerItem` - -文本项。 - -```tsx | pure -interface SchemaInitializerItemProps { - style?: React.CSSProperties; - className?: string; - name?: string; - icon?: React.ReactNode; - title?: React.ReactNode; - items?: SchemaInitializerItemType[]; - onClick?: (args?: any) => any; -} -``` - -核心参数是 `title`、`icon`、`onClick`、`items`,其中 `onClick` 用于插入 Schema,`items` 用于渲染子列表项。 - - - -### `type: 'itemGroup'` & SchemaInitializerItemGroup - -分组。 - -```tsx | pure -interface SchemaInitializerItemGroupProps { - name: string; - title: string; - children?: SchemaInitializerOptions['items']; - divider?: boolean; -} -``` - -核心参数是 `title`、`children`,其中 `children` 用于渲染子列表项,`divider` 用于渲染分割线。 - - - -### `type: 'switch'` & SchemaInitializerSwitch - -Switch 切换按钮。 - -```tsx | pure -interface SchemaInitializerSwitchItemProps extends SchemaInitializerItemProps { - checked?: boolean; - disabled?: boolean; -} -``` - -核心参数是 `checked`、`onClick`,其中 `onClick` 用于插入或者移除 Schema。 - - - -### `type: 'subMenu'` & SchemaInitializerSubMenu - -子菜单。 - - - -### `type: 'divider'` & SchemaInitializerDivider - -分割线。 - - - -## 渲染组件 - -### SchemaInitializerChildren - -用于自定义渲染多个列表项。 - -```tsx | pure - -const Demo = ({ children }) => { - // children: [{ name: 'a1', Component: ItemA1 }, { name: 'a2', type: 'item', title: 'ItemA2' }] - return { children } -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'test', - Component: Demo, - children: [ - { - name: 'a1', - Component: ItemA1, - }, - { - name: 'a2', - type: 'item', - title: 'ItemA2', - } - ] - } - ], -}); -``` - -### SchemaInitializerChild - -用于自定义渲染单个列表项。 - -```tsx | pure -const Demo = (props) => { - return -} -``` diff --git a/packages/core/client/docs/en-US/core/ui-schema/schema-settings-manager.md b/packages/core/client/docs/en-US/core/ui-schema/schema-settings-manager.md deleted file mode 100644 index e4f43a33d..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/schema-settings-manager.md +++ /dev/null @@ -1,188 +0,0 @@ -# SchemaSettingsManager - -## 实例方法 - -### schemaSettingsManager.add() - -添加 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - add(...schemaSettingList: SchemaSetting[]): void -} -``` - -- 示例 - -```tsx | pure -const mySchemaSettings = new SchemaSetting({ - name: 'MySchemaSettings', - title: 'Add block', - items: [ - { - name: 'demo', - type: 'item', - componentProps:{ - title: 'Demo' - } - } - ], -}); - -class MyPlugin extends Plugin { - async load() { - this.app.schemaSettingsManager.add(mySchemaSettings); - } -} -``` - -### schemaSettingsManager.get() - -获取一个 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - get(name: string): SchemaSetting | undefined -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const mySchemaSettings = this.app.schemaSettingsManager.get('MySchemaSettings'); - } -} -``` - -### schemaSettingsManager.getAll() - -获取所有的 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - getAll(): Record> -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const list = this.app.schemaSettingsManager.getAll(); - } -} -``` - -### app.schemaSettingsManager.has() - -判断是否有存在某个 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - has(name: string): boolean -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const hasMySchemaSettings = this.app.schemaSettingsManager.has('MySchemaSettings'); - } -} -``` - -### schemaSettingsManager.remove() - -移除 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - remove(name: string): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.schemaSettingsManager.remove('MySchemaSettings'); - } -} -``` - -### schemaSettingsManager.addItem() - -添加 SchemaSettings 实例的 Item 项,其和直接 schemaInitializer.add() 方法的区别是,可以确保在实例存在时才会添加。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - addItem(schemaInitializerName: string, itemName: string, data: Omit): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - // 方式1:先获取,再添加子项,需要确保已注册 - const mySchemaSettings = this.app.schemaSettingsManager.get('MySchemaSettings'); - if (mySchemaSettings) { - mySchemaSettings.add('b', { type: 'item', componentProps:{ title: 'B' } }) - } - - // 方式2:通过 addItem,内部确保在 mySchemaSettings 注册时才会添加 - this.app.schemaSettingsManager.addItem('MySchemaSettings', 'b', { - type: 'item', - componentProps:{ title: 'B' } - }) - } -} -``` - -### schemaSettingsManager.removeItem() - -移除 实例的 Item 项,其和直接 schemaInitializer.remove() 方法的区别是,可以确保在实例存在时才会移除。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - removeItem(schemaInitializerName: string, itemName: string): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - // 方式1:先获取,再删除子项,需要确保已注册 - const mySchemaSettings = this.app.schemaSettingsManager.get('MySchemaSettings'); - if (mySchemaSettings) { - mySchemaSettings.remove('a') - } - - // 方式2:通过 addItem,内部确保在 mySchemaSettings 注册时才会移除 - this.app.schemaSettingsManager.remove('MySchemaSettings', 'a') - } -} -``` diff --git a/packages/core/client/docs/en-US/core/ui-schema/schema-settings.md b/packages/core/client/docs/en-US/core/ui-schema/schema-settings.md deleted file mode 100644 index b374cbdfa..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/schema-settings.md +++ /dev/null @@ -1,467 +0,0 @@ -# SchemaSettings - -## new SchemaSettings(options) - -创建一个 SchemaSettings 实例。 - -```tsx | pure -interface SchemaSettingsOptions { - name: string; - Component?: ComponentType; - componentProps?: T; - style?: React.CSSProperties; - - items: SchemaSettingsItemType[]; -} - -class SchemaSettings{ - constructor(options: SchemaSettingsOptions): SchemaSettings; - add(name: string, item: Omit): void - get(nestedName: string): SchemaSettingsItemType | undefined - remove(nestedName: string): void -} -``` - -### 详细解释 - -![](../static/VfPGbhWo9os0qTxcITkcHNfin4g.png) - -- name:唯一标识,必填 -- Component 相关 - - - Component:触发组件,默认是 `` 组件 - - componentProps: 组件属性 - - style:组件的样式 -- items:列表项配置 - -### 示例 - -#### 基础用法 - -```tsx | pure -const mySchemaSettings = new SchemaSettings({ - name: 'MySchemaSettings', - items: [ - { - name: 'demo1', // 唯一标识 - type: 'item', // 内置类型 - componentProps: { - title: 'DEMO1', - onClick() { - alert('DEMO1'); - }, - }, - }, - { - name: 'demo2', - Component: () => alert('DEMO2')} />, // 直接使用 Component 组件 - }, - ], -}); -``` - -#### 定制化 `Component` - -```tsx | pure -const mySchemaSettings = new SchemaSettings({ - name: 'MySchemaSettings', - Component: Button, // 自定义组件 - componentProps: { - type: 'primary', - children: '自定义按钮', - }, - // Component: (props) => , // 等同于上面效果 - items: [ - { - name: 'demo1', - type: 'item', - componentProps: { - title: 'DEMO', - }, - }, - ], -}); -``` - -## options.items 配置详解 - -```tsx | pure -interface SchemaSettingsItemCommon { - name: string; - sort?: number; - type?: string; - Component: string | ComponentType; - useVisible?: () => boolean; - children?: SchemaSettingsItemType[]; - useChildren?: () => SchemaSettingsItemType[]; - checkChildrenLength?: boolean; - componentProps?: Omit; - useComponentProps?: () => Omit; -} -``` - -### 两种定义方式:`Component` 和 `type` - - -- 通过 `Component` 定义 - -```tsx | pure - -const Demo = () => { - // 最终渲染 `SchemaSettingsItem` - return -} - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - Component: Demo, // 通过 Component 定义 - } - ], -}); -``` - -- 通过 `type` 定义 - -NocoBase 内置了一些常用的 `type`,例如 `type: 'item'`,相当于 `Component: SchemaSettingsItem`。 - -更多内置类型,请参考:[内置组件和类型](/core/ui-schema/schema-settings#%E5%86%85%E7%BD%AE%E7%BB%84%E4%BB%B6%E5%92%8C%E7%B1%BB%E5%9E%8B) - -```tsx | pure -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'item', - componentProps: { - title: 'Demo', - }, - } - ], -}); -``` - - - -### `children` 和动态方式 `useChildren` - -对于某些组件而言是有子列表项的,例如 `type: 'itemGroup'`,那么我们使用 children 属性,同时考虑到某些场景下 children 是动态的,需要从 Hooks 里面获取,那么就可以通过 `useChildren` 来定义。 - - - -### 动态显示隐藏 `useVisible` - - - -### 组件属性 `componentProps` 和动态属性 `useComponentProps` - -对于一些通用组件,我们可以通过 `componentProps` 来定义组件属性,同时考虑到某些场景下组件属性是动态的,需要从 Hooks 里面获取,那么就可以通过 `useComponentProps` 来定义。 - -当然也可以不使用这两个属性,直接封装成一个组件,然后通过 `Component` 来定义。 - - - -## 实例方法 - -```tsx | pure -const mySchemaSettings = new SchemaSettings({ - name: 'MySchemaSettings', - items: [ - { - name: 'a', - type: 'itemGroup', - componentProps: { - title: 'item a' - }, - children: [ - { - name: 'a1', - title: 'item a1', - } - ], - }, - ], -}); -``` - -### schemaSettings.add() - -用于新增 Item。 - -- 类型 - -```tsx | pure -class SchemaSettings { - add(name: string, item: Omit): void -} -``` - -- 参数说明 - -第一个参数是 name,作为唯一标识,用于增删改查,并且 `name` 支持 `.` 用于分割层级。 - -- 示例 - -```tsx | pure -mySchemaSetting.add('b', { - type: 'item', - title: 'item b', -}) - -mySchemaSetting.add('a.a2', { - type: 'item', - title: 'item a2', -}) -``` - -### schemaSettings.get() - -- 类型 - -```tsx | pure -class SchemaSettings { - get(nestedName: string): SchemaSettingsItemType| undefined -} -``` - -- 示例 - -```tsx | pure -const itemA = mySchemaSetting.get('a') - -const itemA1 = mySchemaSetting.add('a.a1') -``` - -### schemaSettings.remove() - -- 类型 - -```tsx | pure -class SchemaSettings { - remove(nestedName: string): void -} -``` - -- 示例 - -```tsx | pure -mySchemaSetting.remove('a.a1') - -mySchemaSetting.remove('a') -``` - -## Hooks - -### useSchemaSettingsRender() - -用于渲染 SchemaSettings。 - -- 类型 - -```tsx | pure -function useSchemaSettingsRender(name: string, options?: SchemaSettingsOptions): { - exists: boolean; - render: (options?: SchemaSettingsRenderOptions) => React.ReactElement; -} -``` - -- 示例 - -```tsx | pure -const Demo = () => { - const filedSchema = useFieldSchema(); - const { render, exists } = useSchemaSettingsRender(fieldSchema['x-settings'], fieldSchema['x-settings-props']) - return
-
{ render() }
-
可以进行参数的二次覆盖:{ render({ style: { color: 'red' } }) }
-
-} -``` - - - -### useSchemaSettings() - -获取 schemaSetting 上下文数据。 - -上下文数据包含了 `schemaSetting` 实例化时的 `options` 以及调用 `useSchemaSettingsRender()` 时传入的 `options`。 - -- 类型 - -```tsx | pure -interface UseSchemaSettingsResult extends SchemaSettingsOptions { - dn?: Designable; - field?: GeneralField; - fieldSchema?: Schema; -} - -function useSchemaSettings(): UseSchemaSettingsResult; -``` - -- 示例 - -```tsx | pure -const { dn } = useSchemaSettings(); -``` - -### useSchemaSettingsItem() - -用于获取一个 item 的数据。 - -- 类型 - -```tsx | pure -export type SchemaSettingsItemType = { - name: string; - type?: string; - sort?: number; - Component?: string | ComponentType; - componentProps?: T; - useComponentProps?: () => T; - useVisible?: () => boolean; - children?: SchemaSettingsItemType[]; - [index]: any; -}; - -function useSchemaSettingsItem(): SchemaSettingsItemType; -``` - -- 示例 - -```tsx | pure -const { name } = useSchemaSettingsItem(); -``` - -## 内置组件和类型 - -| type | Component | 效果 | -| ----------- | ------------------------------ | ----------------------------------------- | -| item | SchemaSettingsItem | 文本 | -| itemGroup | SchemaSettingsItemGroup | 分组,同 Menu 组件的 `type: 'itemGroup'` | -| subMenu | SchemaSettingsSubMenu | 子菜单,同 Menu 组件的子菜单 | -| divider | SchemaSettingsDivider | 分割线,同 Menu 组件的 `type: 'divider'` | -| remove | SchemaSettingsRemove | 删除,用于删除一个区块 | -| select | SchemaSettingsSelectItem | 下拉选择 | -| cascader | SchemaSettingsCascaderItem | 级联选择 | -| switch | SchemaSettingsSwitchItem | 开关 | -| popup | SchemaSettingsPopupItem | 弹出层 | -| actionModal | SchemaSettingsActionModalItem | 操作弹窗 | -| modal | SchemaSettingsModalItem | 弹窗 | - -### SchemaSettingsItem - -文本,对应的 `type` 为 `item`。 - -```tsx | pure -interface SchemaSettingsItemProps extends Omit { - title: string; -} -``` - -核心参数为 `title` 和 `onClick`,可以在 `onClick` 中修改 schema。 - - - -### SchemaSettingsItemGroup - -分组,对应的 `type` 为 `itemGroup`。 - -核心参数是 `title`。 - - - -### SchemaSettingsSubMenu - -子菜单,对应的 `type` 为 `subMenu`。 - -核心参数是 `title`。 - - - -### SchemaSettingsDivider - -分割线,对应的 `type` 为 `divider`。 - - - -### SchemaSettingsRemove - -删除,对应的 `type` 为 `remove`。 - -```tsx | pure -interface SchemaSettingsRemoveProps { - confirm?: ModalFuncProps; - removeParentsIfNoChildren?: boolean; - breakRemoveOn?: ISchema | ((s: ISchema) => boolean); -} -``` - -- `confirm`:删除前的确认弹窗 -- `removeParentsIfNoChildren`:如果删除后没有子节点了,是否删除父节点 -- `breakRemoveOn`:如果删除的节点满足条件,是否中断删除 - - - -### SchemaSettingsSelectItem - -选择器,对应的 `type` 为 `select`。 - - - -### SchemaSettingsCascaderItem - -级联选择,对应的 `type` 为 `cascader`。 - -### SchemaSettingsSwitchItem - -开关,对应的 `type` 为 `switch`。 - - - -### SchemaSettingsModalItem - -弹窗,对应的 `type` 为 `modal`。 - -```tsx | pure -export interface SchemaSettingsModalItemProps { - title: string; - onSubmit: (values: any) => void; - initialValues?: any; - schema?: ISchema | (() => ISchema); - modalTip?: string; - components?: any; - hidden?: boolean; - scope?: any; - effects?: any; - width?: string | number; - children?: ReactNode; - asyncGetInitialValues?: () => Promise; - eventKey?: string; - hide?: boolean; -} -``` - -我们可以通过 `schema` 参数来定义弹窗的表单,然后在 `onSubmit` 中获取表单的值,然后修改当前 schema 节点。 - - - -### SchemaSettingsActionModalItem - -操作弹窗,对应的 `type` 为 `actionModal`。 - -其和 `modal` 的区别是,`SchemaSettingsModalItem` 弹窗会丢失上下文,而 `SchemaSettingsActionModalItem` 会保留上下文,简单场景下可以使用 `SchemaSettingsModalItem`,复杂场景下可以使用 `SchemaSettingsActionModalItem`。 - -```tsx | pure -export interface SchemaSettingsActionModalItemProps extends SchemaSettingsModalItemProps, Omit { - uid?: string; - initialSchema?: ISchema; - schema?: ISchema; - beforeOpen?: () => void; - maskClosable?: boolean; -} -``` - - diff --git a/packages/core/client/docs/en-US/core/ui-schema/schema-toolbar.md b/packages/core/client/docs/en-US/core/ui-schema/schema-toolbar.md deleted file mode 100644 index dfd809bba..000000000 --- a/packages/core/client/docs/en-US/core/ui-schema/schema-toolbar.md +++ /dev/null @@ -1,427 +0,0 @@ -# SchemaToolbar - -![SchemaToolbar](../static/designer.png) - -## 组件 - -### SchemaToolbar 组件 - -此为默认的 Toolbar 组件,其内部会自动根据 Schema 的 `x-settings`、`x-initializer` 渲染 `SchemaSettings`、`SchemaInitializer` 和 `Drag` 组件。 - -Toolbar 具体的渲染规则为:当有 `x-toolbar` 会渲染对应的组件;当无 `x-toolbar` 但是有 `x-settings`、`x-initializer` 会渲染默认的 `SchemaToolbar` 组件。 - -- 类型 - -```tsx | pure -interface SchemaToolbarProps { - title?: string; - draggable?: boolean; - initializer?: string | false; - settings?: string | false; - /** - * @default true - */ - showBorder?: boolean; - showBackground?: boolean; -} -``` - -- 详细解释 - - `title`:左上角的标题 - - `draggable`:是否可以拖拽,默认为 `true` - - `initializer`:`SchemaInitializer` 的默认值,当 schema 里没有 `x-initializer` 时,会使用此值;当为 `false` 时,不会渲染 `SchemaInitializer` - - `settings`:`SchemaSettings` 的默认值,当 schema 里没有 `x-settings` 时,会使用此值;当为 `false` 时,不会渲染 `SchemaSettings` - - `showBorder`:边框是否变为橘色 - - `showBackground`:背景是否变为橘色 - -- 示例 - -未指定 `x-toolbar` 时会渲染默认的 `SchemaToolbar` 这个组件。 - -```tsx -import { useFieldSchema } from '@formily/react'; -import { - Application, - CardItem, - Grid, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - SchemaSettings, - useSchemaInitializer, - useSchemaInitializerItem, -} from '@nocobase/client'; -import React from 'react'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'remove', - type: 'remove', - componentProps: { - removeParentsIfNoChildren: true, - }, - }, - ], -}); - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'demo1', - title: 'Demo1', - Component: () => { - const itemConfig = useSchemaInitializerItem(); - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - 'x-settings': 'mySettings', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', - }); - }; - return ; - }, - }, - ], -}); - -const Hello = () => { - const schema = useFieldSchema(); - return

Hello, world! {schema.name}

; -}; - -const hello1 = Grid.wrap({ - type: 'void', - // 仅指定了 `x-settings` 但是没有 `x-toolbar`,会使用默认的 `SchemaToolbar` 组件 - 'x-settings': 'mySettings', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', -}); - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.app.addComponents({ Grid, CardItem, Hello }); - this.app.schemaSettingsManager.add(mySettings); - this.app.schemaInitializerManager.add(myInitializer); - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - }, - designable: true, - plugins: [PluginHello], -}); - -export default app.getRootComponent(); -``` - -自定义 Toolbar 组件。 - - -```tsx -import { useFieldSchema } from '@formily/react'; -import { - Application, - CardItem, - Grid, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - SchemaSettings, - SchemaToolbar, - useSchemaInitializer, - useSchemaInitializerItem, -} from '@nocobase/client'; -import React from 'react'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'remove', - type: 'remove', - componentProps: { - removeParentsIfNoChildren: true, - }, - }, - ], -}); - -const MyToolbar = () => { - return -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'demo1', - title: 'Demo1', - Component: () => { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - // 使用自定义的 Toolbar 组件 - 'x-toolbar': 'MyToolbar', - 'x-settings': 'mySettings', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', - }); - }; - return ; - }, - }, - ], -}); - -const Hello = () => { - const schema = useFieldSchema(); - return

Hello, world! {schema.name}

; -}; - -const hello1 = Grid.wrap({ - type: 'void', - // 使用自定义的 Toolbar 组件 - 'x-toolbar': 'MyToolbar', - 'x-settings': 'mySettings', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', -}); - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.app.addComponents({ Grid, CardItem, Hello, MyToolbar }); - this.app.schemaSettingsManager.add(mySettings); - this.app.schemaInitializerManager.add(myInitializer); - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - }, - designable: true, - plugins: [PluginHello], -}); - -export default app.getRootComponent(); -``` - -## Hooks - -### useSchemaToolbarRender() - -用于渲染 `SchemaToolbar`。 - -- 类型 - -```tsx | pure -const useSchemaToolbarRender: (fieldSchema: ISchema) => { - render(props?: SchemaToolbarProps): React.JSX.Element; - exists: boolean; -} -``` - -- 详细解释 - -前面示例中 `'x-decorator': 'CardItem'` 中组件 `CardItem` 里面就调用了 `useSchemaToolbarRender()` 进行渲染。内置的组件还有:`BlockItem`、`CardItem`、`Action`、`FormItem`。 - -`render()` 支持二次覆盖组件属性。 - -- 示例 - -```tsx | pure -const MyDecorator = () => { - const filedSchema = useFieldSchema(); - const { render } = useSchemaToolbarRender(filedSchema); // 从 Schema 中读取 Toolbar 组件 - - return { render() } -} -``` - - -```tsx -import { Card } from 'antd'; -import { useFieldSchema } from '@formily/react'; -import { - Application, - CardItem, - Grid, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - SchemaSettings, - SchemaToolbar, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaToolbarRender -} from '@nocobase/client'; -import React from 'react'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'remove', - type: 'remove', - componentProps: { - removeParentsIfNoChildren: true, - }, - }, - ], -}); - -const MyToolbar = (props) => { - return -} - -// 自定义包装器 -const MyDecorator = ({children}) => { - const filedSchema = useFieldSchema(); - // 使用 `useSchemaToolbarRender()` 获取并渲染内容 - const { render } = useSchemaToolbarRender(filedSchema); - return { render({ draggable: false }) }{children} -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'demo1', - title: 'Demo1', - Component: () => { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - // 使用自定义的 Toolbar 组件 - 'x-toolbar': 'MyToolbar', - 'x-settings': 'mySettings', - 'x-decorator': 'MyDecorator', - 'x-component': 'Hello', - }); - }; - return ; - }, - }, - ], -}); - -const Hello = () => { - const schema = useFieldSchema(); - return

Hello, world! {schema.name}

; -}; - -const hello1 = Grid.wrap({ - type: 'void', - // 使用自定义的 Toolbar 组件 - 'x-toolbar': 'MyToolbar', - 'x-settings': 'mySettings', - 'x-decorator': 'MyDecorator', - 'x-component': 'Hello', -}); - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.app.addComponents({ Grid, CardItem, Hello, MyToolbar, MyDecorator }); - this.app.schemaSettingsManager.add(mySettings); - this.app.schemaInitializerManager.add(myInitializer); - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - }, - designable: true, - plugins: [PluginHello], -}); - -export default app.getRootComponent(); -``` diff --git a/packages/core/client/docs/en-US/core/utils.md b/packages/core/client/docs/en-US/core/utils.md deleted file mode 100644 index 9fb88088e..000000000 --- a/packages/core/client/docs/en-US/core/utils.md +++ /dev/null @@ -1,13 +0,0 @@ -# Utils - -## Function - -### tval - -用于输出多语言的字符串。 - -- 类型 - - - -- 示例 diff --git a/packages/core/client/docs/en-US/index.md b/packages/core/client/docs/en-US/index.md deleted file mode 100644 index fe2d08520..000000000 --- a/packages/core/client/docs/en-US/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Index - - diff --git a/packages/core/client/docs/en-US/ui-schema/actions/add-new.md b/packages/core/client/docs/en-US/ui-schema/actions/add-new.md deleted file mode 100644 index 308dab604..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/add-new.md +++ /dev/null @@ -1,82 +0,0 @@ -# Add new - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-action": "create", - "x-acl-action": "create", - "title": "{{t('Add new')}}", - "x-designer": "Action.Designer", - "x-component": "Action", - "x-decorator": "ACLActionProvider", - "x-component-props": { - "openMode": "drawer", - "type": "primary", - "component": "CreateRecordAction", - "icon": "PlusOutlined" - }, - "x-align": "right", - "x-acl-action-props": { - "skipScopeCheck": true - }, - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"Add record\") }}", - "x-component": "Action.Container", - "x-component-props": { - "className": "nb-action-popup" - }, - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializersForCreateFormBlock", - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Add new\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "CreateFormBlockInitializers", - "x-uid": "psh2rj6pkab", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "3i7grk0aytf", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "75s24n1nlkh", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "wg1f4xyx7vp", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "2hwye7mt2th", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/add-record.md b/packages/core/client/docs/en-US/ui-schema/actions/add-record.md deleted file mode 100644 index 7dbce5eda..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/add-record.md +++ /dev/null @@ -1 +0,0 @@ -# Add record(任意表) \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/bulk-edit.md b/packages/core/client/docs/en-US/ui-schema/actions/bulk-edit.md deleted file mode 100644 index b602f30ff..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/bulk-edit.md +++ /dev/null @@ -1 +0,0 @@ -# 批量编辑 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/bulk-update.md b/packages/core/client/docs/en-US/ui-schema/actions/bulk-update.md deleted file mode 100644 index 9ac6d1890..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/bulk-update.md +++ /dev/null @@ -1 +0,0 @@ -# 批量更新 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/custom-request.md b/packages/core/client/docs/en-US/ui-schema/actions/custom-request.md deleted file mode 100644 index b69407f62..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/custom-request.md +++ /dev/null @@ -1,88 +0,0 @@ -# 自定义请求 - - -x-component 不统一,x-action 也不统一,有三种风格的 schema - - -## UI Schema - -### 表单的自定义请求 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Custom request\") }}", - "x-component": "CustomRequestAction", - "x-action": "customize:form:request", - "x-designer": "CustomRequestAction.Designer", - "x-decorator": "CustomRequestAction.Decorator", - "x-action-settings": { - "onSuccess": { - "manualClose": false, - "redirecting": false, - "successMessage": "{{t(\"Request success\")}}" - } - }, - "type": "void", - "x-uid": "d1rfalvivfo", - "x-async": false, - "x-index": 2 -} -``` - -### 表格列操作的自定义请求 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Custom request\") }}", - "x-component": "Action.Link", - "x-action": "customize:table:request", - "x-designer": "Action.Designer", - "x-action-settings": { - "requestSettings": {}, - "onSuccess": { - "manualClose": false, - "redirecting": false, - "successMessage": "{{t(\"Request success\")}}" - } - }, - "x-component-props": { - "useProps": "{{ useCustomizeRequestActionProps }}" - }, - "x-designer-props": { - "linkageAction": true - }, - "type": "void", - "x-uid": "edn0y4fq7xb", - "x-async": false, - "x-index": 1 -} -``` - -### 详情的自定义请求 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Custom request\") }}", - "x-component": "CustomRequestAction", - "x-action": "customize:form:request", - "x-designer": "CustomRequestAction.Designer", - "x-decorator": "CustomRequestAction.Decorator", - "x-action-settings": { - "onSuccess": { - "manualClose": false, - "redirecting": false, - "successMessage": "{{t(\"Request success\")}}" - } - }, - "type": "void", - "x-uid": "glc5zkr0ke3", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/delete.md b/packages/core/client/docs/en-US/ui-schema/actions/delete.md deleted file mode 100644 index d4f3659f0..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/delete.md +++ /dev/null @@ -1 +0,0 @@ -# 删除 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/duplicate.md b/packages/core/client/docs/en-US/ui-schema/actions/duplicate.md deleted file mode 100644 index 5fc15c69d..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/duplicate.md +++ /dev/null @@ -1 +0,0 @@ -# 复制 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/edit.md b/packages/core/client/docs/en-US/ui-schema/actions/edit.md deleted file mode 100644 index 3092287aa..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/edit.md +++ /dev/null @@ -1 +0,0 @@ -# 编辑 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/export.md b/packages/core/client/docs/en-US/ui-schema/actions/export.md deleted file mode 100644 index 9e6bd4bd6..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/export.md +++ /dev/null @@ -1 +0,0 @@ -# 导出 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/filter.md b/packages/core/client/docs/en-US/ui-schema/actions/filter.md deleted file mode 100644 index 653fc6d26..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/filter.md +++ /dev/null @@ -1 +0,0 @@ -# 筛选 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/import.md b/packages/core/client/docs/en-US/ui-schema/actions/import.md deleted file mode 100644 index a371bffd3..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/import.md +++ /dev/null @@ -1 +0,0 @@ -# 导入 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/index.md b/packages/core/client/docs/en-US/ui-schema/actions/index.md deleted file mode 100644 index e177708c4..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/index.md +++ /dev/null @@ -1,51 +0,0 @@ -# 概览 - -## UI Schema 协议 - -- `x-action` -- `x-align` -- `x-acl-action` -- `x-acl-action-props` -- `x-action-settings` - -## 常规操作 - -```json -{ - "type": "void", - "title": "{{ t(\"Submit\") }}", - "x-component": "Action", - "x-component-props": { - "type": "primary", - "htmlType": "submit", - "useProps": "{{ useCreateActionProps }}" - }, -} -``` - -## 弹窗操作 - -```json -{ - "type": "void", - "title": "{{t('Open drawer')}}", - "x-component": "Action", - "x-component-props": { - "openMode": "drawer", - "type": "primary", - "icon": "PlusOutlined" - }, - "x-align": "right", - "properties": { - "drawer": { - "type": "void", - "x-component": "Action.Container", - "x-component-props": {}, - "properties": { - }, - } - } -} -``` - -更多示例查看 [Action](/apis/action) \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/print.md b/packages/core/client/docs/en-US/ui-schema/actions/print.md deleted file mode 100644 index 2823a7a18..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/print.md +++ /dev/null @@ -1 +0,0 @@ -# 打印 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/refresh.md b/packages/core/client/docs/en-US/ui-schema/actions/refresh.md deleted file mode 100644 index 654d97cca..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/refresh.md +++ /dev/null @@ -1 +0,0 @@ -# 刷新 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/save-record.md b/packages/core/client/docs/en-US/ui-schema/actions/save-record.md deleted file mode 100644 index 83d1a5a37..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/save-record.md +++ /dev/null @@ -1 +0,0 @@ -# 保存数据 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/submit-to-workflow.md b/packages/core/client/docs/en-US/ui-schema/actions/submit-to-workflow.md deleted file mode 100644 index 97bfe3b19..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/submit-to-workflow.md +++ /dev/null @@ -1 +0,0 @@ -# 提交至工作流 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/submit.md b/packages/core/client/docs/en-US/ui-schema/actions/submit.md deleted file mode 100644 index 0634eb49d..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/submit.md +++ /dev/null @@ -1,28 +0,0 @@ -# 提交 - -## UI Schema - -### 新建数据的提交 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Submit\") }}", - "x-action": "submit", - "x-component": "Action", - "x-designer": "Action.Designer", - "x-component-props": { - "type": "primary", - "htmlType": "submit", - "useProps": "{{ useCreateActionProps }}" - }, - "x-action-settings": { - "triggerWorkflows": [] - }, - "type": "void", - "x-uid": "aaxbm1i5xxd", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/update-record.md b/packages/core/client/docs/en-US/ui-schema/actions/update-record.md deleted file mode 100644 index aa3ff7ffb..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/update-record.md +++ /dev/null @@ -1 +0,0 @@ -# 更新数据 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/actions/view.md b/packages/core/client/docs/en-US/ui-schema/actions/view.md deleted file mode 100644 index f5fd55d6b..000000000 --- a/packages/core/client/docs/en-US/ui-schema/actions/view.md +++ /dev/null @@ -1 +0,0 @@ -# 查看 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/calendar.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/calendar.md deleted file mode 100644 index 13e6c108e..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/calendar.md +++ /dev/null @@ -1,282 +0,0 @@ -# Calendar - -## x-initializer - -- CalendarActionInitializers -- TabPaneInitializers -- RecordBlockInitializers - -## x-designer - -- CalendarV2.Designer - -## x-settings - -- CalendarSettings - -## UI Schema - -### 日历区块 - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "CalendarV2.Designer", - "x-component": "CardItem", - "x-decorator": "CalendarBlockProvider", - "x-acl-action": "users:list", - "x-decorator-props": { - "action": "list", - "params": { - "paginate": false - }, - "resource": "users", - "collection": "users", - "fieldNames": { - "id": "id", - "end": ["f_nxqfedh5fd5"], - "start": ["f_nxqfedh5fd5"], - "title": "nickname" - } - }, - "_isJSONSchemaObject": true, - "properties": { - "puytl7p5x8o": { - "type": "void", - "version": "2.0", - "x-component": "CalendarV2", - "x-component-props": { - "useProps": "{{ useCalendarBlockProps }}" - }, - "_isJSONSchemaObject": true, - "properties": { - "toolBar": { - "type": "void", - "version": "2.0", - "x-component": "CalendarV2.ActionBar", - "x-initializer": "CalendarActionInitializers", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "_isJSONSchemaObject": true, - "x-uid": "494h1j6bxyg", - "x-async": false, - "x-index": 1 - }, - "event": { - "type": "void", - "version": "2.0", - "x-component": "CalendarV2.Event", - "_isJSONSchemaObject": true, - "properties": { - "drawer": { - "type": "void", - "title": "{{ t(\"View record\") }}", - "version": "2.0", - "x-component": "Action.Drawer", - "x-component-props": { - "className": "nb-action-popup" - }, - "_isJSONSchemaObject": true, - "properties": { - "tabs": { - "type": "void", - "version": "2.0", - "x-component": "Tabs", - "x-initializer": "TabPaneInitializers", - "x-component-props": {}, - "_isJSONSchemaObject": true, - "x-initializer-props": { - "gridInitializer": "RecordBlockInitializers" - }, - "properties": { - "tab1": { - "type": "void", - "title": "{{t(\"Details\")}}", - "version": "2.0", - "x-designer": "Tabs.Designer", - "x-component": "Tabs.TabPane", - "x-component-props": {}, - "_isJSONSchemaObject": true, - "properties": { - "grid": { - "type": "void", - "version": "2.0", - "x-component": "Grid", - "x-initializer": "RecordBlockInitializers", - "_isJSONSchemaObject": true, - "x-initializer-props": { - "actionInitializers": "CalendarFormActionInitializers" - }, - "x-uid": "yty9wg20qq0", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "hcsgenoc3hb", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "c5cpptwxw7s", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "c5iarcnpefc", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "080x8qlpn6s", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "pcche4s596p", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "gk2jk3gpo9f", - "x-async": false, - "x-index": 1 -} -``` - -### 关系的日历区块 - -```json -{ - "x-uid": "8q0hsbdr9fc", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:list", - "x-decorator": "CalendarBlockProvider", - "x-decorator-props": { - "collection": "b", - "resource": "a.o2m", - "action": "list", - "fieldNames": { - "id": "id", - "start": "createdAt", - "title": "f_ex4581dfc0t" - }, - "params": { - "paginate": false - }, - "association": "a.o2m" - }, - "x-designer": "CalendarV2.Designer", - "x-component": "CardItem", - "x-component-props": { - "title": "关系的日历区块" - }, - "properties": { - "v3za6qejuz7": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CalendarV2", - "x-component-props": { - "useProps": "{{ useCalendarBlockProps }}" - }, - "properties": { - "toolBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CalendarV2.ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-initializer": "CalendarActionInitializers", - "x-uid": "u9ntffsdsrh", - "x-async": false, - "x-index": 1 - }, - "event": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CalendarV2.Event", - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Action.Drawer", - "x-component-props": { - "className": "nb-action-popup" - }, - "title": "{{ t(\"View record\") }}", - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializers", - "x-initializer-props": { - "gridInitializer": "RecordBlockInitializers" - }, - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Details\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer-props": { - "actionInitializers": "CalendarFormActionInitializers" - }, - "x-initializer": "RecordBlockInitializers", - "x-uid": "2swhiw4lee5", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "z6odjfbwnht", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "mxr7ikhfc9y", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "mfgucnj7ev8", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "05l5a2h42pn", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "v2jazzvqa85", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/charts.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/charts.md deleted file mode 100644 index 77dbdbdbb..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/charts.md +++ /dev/null @@ -1,143 +0,0 @@ -# Charts - -## UI Schema - -### 图表区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CardItem", - "x-component-props": { - "name": "charts" - }, - "x-designer": "ChartV2BlockDesigner", - "properties": { - "u8841bjm65y": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-decorator": "ChartV2Block", - "x-initializer": "ChartInitializers", - "x-uid": "j4hzcpzcc3g", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "ldc2aokaop2", - "x-async": false, - "x-index": 1 -} -``` - -### 内嵌区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CardItem", - "x-component-props": { - "name": "charts" - }, - "x-designer": "ChartV2BlockDesigner", - "properties": { - "g3jq3vkx9fv": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-decorator": "ChartV2Block", - "x-initializer": "ChartInitializers", - "properties": { - "ue7lfigjgm1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid.Row", - "properties": { - "43ztg8gu03v": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid.Col", - "properties": { - "n47fsb4i2lm": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "ChartRendererProvider", - "x-decorator-props": { - "query": { - "measures": [ - { - "field": ["id"] - } - ], - "dimensions": [], - "filter": { - "$and": [] - }, - "orders": [], - "cache": {} - }, - "config": { - "chartType": "Built-in.line", - "general": { - "xField": "id", - "yField": "id", - "smooth": false, - "isStack": false - } - }, - "collection": "a", - "mode": "builder" - }, - "x-acl-action": "a:list", - "x-designer": "ChartRenderer.Designer", - "x-component": "CardItem", - "x-component-props": { - "size": "small" - }, - "x-initializer": "ChartInitializers", - "properties": { - "y25sgh5pukl": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "ChartRenderer", - "x-component-props": {}, - "x-uid": "ma0s07k753t", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "k6naqcx59ow", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "o8ktlccovml", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "mvn9ai9rhx8", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "mcbyby93j6n", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "sn0lczwtkgm", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/details.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/details.md deleted file mode 100644 index 31f765bac..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/details.md +++ /dev/null @@ -1,169 +0,0 @@ -# Details - -## UI Schema - -### 详情区块(带分页) - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "DetailsDesigner", - "x-component": "CardItem", - "x-decorator": "DetailsBlockProvider", - "x-acl-action": "users:view", - "x-decorator-props": { - "action": "list", - "params": { - "pageSize": 1 - }, - "rowKey": "id", - "resource": "users", - "collection": "users", - "readPretty": true - }, - "_isJSONSchemaObject": true, - "properties": { - "mjad1dcywip": { - "type": "void", - "version": "2.0", - "x-component": "Details", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useDetailsBlockProps }}" - }, - "_isJSONSchemaObject": true, - "properties": { - "8avswx6qgyp": { - "type": "void", - "version": "2.0", - "x-component": "ActionBar", - "x-initializer": "DetailsActionInitializers", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "_isJSONSchemaObject": true, - "x-uid": "01w17yleng8", - "x-async": false, - "x-index": 1 - }, - "grid": { - "type": "void", - "version": "2.0", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "_isJSONSchemaObject": true, - "x-uid": "bgu0ix4lfmc", - "x-async": false, - "x-index": 2 - }, - "pagination": { - "type": "void", - "version": "2.0", - "x-component": "Pagination", - "x-component-props": { - "useProps": "{{ useDetailsPaginationProps }}" - }, - "_isJSONSchemaObject": true, - "x-uid": "6riuxghrz30", - "x-async": false, - "x-index": 3 - } - }, - "x-uid": "3apkfu8ngrp", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "yeodhismy2w", - "x-async": false, - "x-index": 1 -} -``` - -### 对多关系区块 - -```json -{ - "x-uid": "2gm2iw937q5", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:view", - "x-decorator": "DetailsBlockProvider", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "list", - "params": { - "pageSize": 1 - }, - "rowKey": "id" - }, - "x-designer": "DetailsDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "关系区块" - }, - "properties": { - "paj8b2noc1g": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Details", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useDetailsBlockProps }}" - }, - "properties": { - "3jisjip7503": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "DetailsActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "cbkfxafywtx", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "d1ls1w6gpzm", - "x-async": false, - "x-index": 2 - }, - "pagination": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Pagination", - "x-component-props": { - "useProps": "{{ useDetailsPaginationProps }}" - }, - "x-uid": "u0rzv8370za", - "x-async": false, - "x-index": 3 - } - }, - "x-uid": "1hfu8jbzzqw", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/form-read-pretty.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/form-read-pretty.md deleted file mode 100644 index 676df3034..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/form-read-pretty.md +++ /dev/null @@ -1,286 +0,0 @@ -# Form (Read pretty) - -## UI Schema - -### 单数据详情 - -```json -{ - "x-uid": "dt4q817fw81", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a:get", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a", - "collection": "a", - "readPretty": true, - "action": "get", - "useParams": "{{ useParamsFromRecord }}", - "useSourceId": "{{ useSourceIdFromParentRecord }}" - }, - "x-designer": "FormV2.ReadPrettyDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "Form read pretty" - }, - "properties": { - "30qrxij609o": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ReadPrettyFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "fznn1ygt50o", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "t3o4t8fi7l7", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "6dp2qqoc4s0", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 关系数据详情 - -```json -{ - "x-uid": "jf470wrzdaf", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2oBelongsTo:get", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a.o2oBelongsTo", - "collection": "b", - "association": "a.o2oBelongsTo", - "readPretty": true, - "action": "get", - "useParams": "{{ useParamsFromRecord }}", - "useSourceId": "{{ useSourceIdFromParentRecord }}" - }, - "x-designer": "FormV2.ReadPrettyDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "对一关系详情" - }, - "properties": { - "uauk2wbj3iq": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ReadPrettyFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "r3pcykksp8l", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "vs000etludp", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "rt228uhudcf", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 表格详情 - -```json -{ - "x-uid": "lxcjjkkor1m", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:get", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "get", - "useParams": "{{ useParamsFromRecord }}", - "useSourceId": "{{ useSourceIdFromParentRecord }}" - }, - "x-designer": "FormV2.ReadPrettyDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "表格详情" - }, - "properties": { - "7pe17tcgtye": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ReadPrettyFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "wek8nc795ja", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "5y5u8qm6yvz", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "5bpcm982n51", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 查看关系数据 - -```json -{ - "x-uid": "5ymsrq1fv37", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:get", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "get", - "useParams": "{{ useParamsFromRecord }}", - "useSourceId": "{{ useSourceIdFromParentRecord }}" - }, - "x-designer": "FormV2.ReadPrettyDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "查看关系数据" - }, - "properties": { - "vehcfr0fsh2": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ReadPrettyFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "zpuz629u2dg", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "b8u8e2k5inf", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "2rz0u3j14px", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/form.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/form.md deleted file mode 100644 index 442457ba0..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/form.md +++ /dev/null @@ -1,418 +0,0 @@ -# Form - -## UI Schema - -### 添加表单 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": true - }, - "x-acl-action": "a:create", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a", - "collection": "a" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": {}, - "properties": { - "23pj9m7ot5a": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "x-uid": "0ctuwnatyzd", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "CreateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "properties": { - "j7ta88et3mv": { - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Submit\") }}", - "x-action": "submit", - "x-component": "Action", - "x-designer": "Action.Designer", - "x-component-props": { - "type": "primary", - "htmlType": "submit", - "useProps": "{{ useCreateActionProps }}" - }, - "x-action-settings": { - "triggerWorkflows": [] - }, - "type": "void", - "x-uid": "ua858zswy37", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "o0riryr0ob0", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "1ng4hies4yu", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "ebiyvziafda", - "x-async": false, - "x-index": 1 -} -``` - -### 编辑表单 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": false - }, - "x-acl-action": "a:update", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "useSourceId": "{{ useSourceIdFromParentRecord }}", - "useParams": "{{ useParamsFromRecord }}", - "action": "get", - "resource": "a", - "collection": "a" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": {}, - "properties": { - "w533dipin7p": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "x-uid": "otncpmalhjr", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "UpdateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "x-uid": "qjjmm1qkapx", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "n12zo6qd72g", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "zafyvmng9m5", - "x-async": false, - "x-index": 1 -} -``` - -### 关系新增表单 - -```json -{ - "x-uid": "il5q341k4vg", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": true - }, - "x-acl-action": "a.o2m:create", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "useSourceId": "{{ useSourceIdFromParentRecord }}", - "useParams": "{{ useParamsFromRecord }}", - "action": null, - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": { - "title": "关系新增表单" - }, - "properties": { - "3357yvwe4je": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "x-uid": "88xhnoml321", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "CreateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "x-uid": "dhs8o8vpl1h", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "h6fhh9ox9ay", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 关系新增(关系表格里的 Add new) - -useSourceIdFromParentRecord 和 useParamsFromRecord 参数缺失 - -```json -{ - "x-uid": "6tknohm4ubr", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": true - }, - "x-acl-action": "a.o2m:create", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": { - "title": "关系新增表单-Table" - }, - "properties": { - "o96izt6ez7m": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "properties": { - "pk9l1i26yq6": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid.Row", - "properties": { - "32wz2lr9cry": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid.Col", - "properties": { - "id": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "string", - "x-designer": "FormItem.Designer", - "x-component": "CollectionField", - "x-decorator": "FormItem", - "x-collection-field": "b.id", - "x-component-props": {}, - "x-read-pretty": true, - "x-uid": "jb09nj4kbfm", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "rtx3b0uom75", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "5gvd7ks6m0z", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "fcw1y2xk6km", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "CreateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "x-uid": "msgopb1meoq", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "g0mg6fhho4x", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 关系编辑 - -```json -{ - "x-uid": "kzg1tz339ro", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": false - }, - "x-acl-action": "a.o2m:update", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "useSourceId": "{{ useSourceIdFromParentRecord }}", - "useParams": "{{ useParamsFromRecord }}", - "action": "get", - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": { - "title": "关系编辑表单" - }, - "properties": { - "3jqysycq8m0": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "x-uid": "sy3sjswogh4", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "UpdateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "x-uid": "xarcyjpypsy", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "lepez9684rm", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/gantt.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/gantt.md deleted file mode 100644 index 4b7ad1269..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/gantt.md +++ /dev/null @@ -1,185 +0,0 @@ -# Gantt - -## UI Schema - -### 甘特图区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "users:list", - "x-decorator": "GanttBlockProvider", - "x-decorator-props": { - "collection": "users", - "resource": "users", - "action": "list", - "fieldNames": { - "id": "id", - "start": "createdAt", - "range": "day", - "title": "nickname", - "end": "f_46b1u4dp820" - }, - "params": { - "paginate": false - } - }, - "x-designer": "Gantt.Designer", - "x-component": "CardItem", - "properties": { - "rx21gtpcj3w": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Gantt", - "x-component-props": { - "useProps": "{{ useGanttBlockProps }}" - }, - "properties": { - "toolBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-initializer": "GanttActionInitializers", - "x-uid": "m0uru68ugw9", - "x-async": false, - "x-index": 1 - }, - "table": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-decorator": "div", - "x-decorator-props": { - "style": { - "float": "left", - "maxWidth": "35%" - } - }, - "x-initializer": "TableColumnInitializers", - "x-component": "TableV2", - "x-component-props": { - "rowKey": "id", - "rowSelection": { - "type": "checkbox" - }, - "useProps": "{{ useTableBlockProps }}", - "pagination": false - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"Actions\") }}", - "x-action-column": "actions", - "x-decorator": "TableV2.Column.ActionBar", - "x-component": "TableV2.Column", - "x-designer": "TableV2.ActionColumnDesigner", - "x-initializer": "TableActionColumnInitializers", - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "DndContext", - "x-component": "Space", - "x-component-props": { - "split": "|" - }, - "x-uid": "z2vnizu7bds", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "8gbabo6kdr6", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "5c8g2x6rvro", - "x-async": false, - "x-index": 2 - }, - "detail": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Gantt.Event", - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Action.Drawer", - "x-component-props": { - "className": "nb-action-popup" - }, - "title": "{{ t(\"View record\") }}", - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializers", - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Details\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "RecordBlockInitializers", - "x-uid": "jr5h3asz6gp", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "8uwfpgyok9x", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "bjm4sfwxmrx", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "7cmwpc0rrwj", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "nffb7qbs96o", - "x-async": false, - "x-index": 3 - } - }, - "x-uid": "hoi2j5lhlho", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "e0rdive4xpa", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/grid-card.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/grid-card.md deleted file mode 100644 index 6620d607b..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/grid-card.md +++ /dev/null @@ -1,219 +0,0 @@ -# GridCard - -## UI Schema - -### 栅格卡片 - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "GridCard.Designer", - "x-component": "BlockItem", - "x-decorator": "GridCard.Decorator", - "x-acl-action": "users:view", - "x-component-props": { - "useProps": "{{ useGridCardBlockItemProps }}" - }, - "x-decorator-props": { - "action": "list", - "params": { - "pageSize": 12 - }, - "rowKey": "id", - "resource": "users", - "collection": "users", - "readPretty": true, - "runWhenParamsChanged": true - }, - "_isJSONSchemaObject": true, - "properties": { - "actionBar": { - "type": "void", - "version": "2.0", - "x-component": "ActionBar", - "x-initializer": "GridCardActionInitializers", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "_isJSONSchemaObject": true, - "x-uid": "prx9wnlzqb1", - "x-async": false, - "x-index": 1 - }, - "list": { - "type": "array", - "version": "2.0", - "x-component": "GridCard", - "x-component-props": { - "useProps": "{{ useGridCardBlockProps }}" - }, - "_isJSONSchemaObject": true, - "properties": { - "item": { - "type": "object", - "version": "2.0", - "x-component": "GridCard.Item", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useGridCardItemProps }}" - }, - "_isJSONSchemaObject": true, - "properties": { - "grid": { - "type": "void", - "version": "2.0", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "_isJSONSchemaObject": true, - "x-initializer-props": { - "useProps": "{{ useGridCardItemInitializerProps }}" - }, - "x-uid": "pq895sv6136", - "x-async": false, - "x-index": 1 - }, - "actionBar": { - "type": "void", - "version": "2.0", - "x-align": "left", - "x-component": "ActionBar", - "x-initializer": "GridCardItemActionInitializers", - "x-component-props": { - "layout": "one-column", - "useProps": "{{ useGridCardActionBarProps }}" - }, - "_isJSONSchemaObject": true, - "x-uid": "w2c3qcp4nme", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "1ct8yn1jnzn", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "pvnkvtc6tte", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "phodsqwsifq", - "x-async": false, - "x-index": 1 -} -``` - -### 关系数据的栅格卡片 - -```json -{ - "x-uid": "yr79zvl98lc", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:view", - "x-decorator": "GridCard.Decorator", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "list", - "params": { - "pageSize": 12 - }, - "runWhenParamsChanged": true, - "columnCount": { - "xs": 1, - "md": 12, - "lg": 12, - "xxl": 12 - } - }, - "x-component": "BlockItem", - "x-component-props": { - "useProps": "{{ useGridCardBlockItemProps }}" - }, - "x-designer": "GridCard.Designer", - "properties": { - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "GridCardActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "u36l44beq6a", - "x-async": false, - "x-index": 1 - }, - "list": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-component": "GridCard", - "x-component-props": { - "useProps": "{{ useGridCardBlockProps }}" - }, - "properties": { - "item": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "object", - "x-component": "GridCard.Item", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useGridCardItemProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-initializer-props": { - "useProps": "{{ useGridCardItemInitializerProps }}" - }, - "x-uid": "aqxlonv3bpk", - "x-async": false, - "x-index": 1 - }, - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-align": "left", - "x-initializer": "GridCardItemActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "useProps": "{{ useGridCardActionBarProps }}", - "layout": "one-column" - }, - "x-uid": "zxhqo81kdf5", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "ed56owlyz1p", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "nfpuvrkwkk7", - "x-async": false, - "x-index": 2 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/index.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/index.md deleted file mode 100644 index d47422275..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/index.md +++ /dev/null @@ -1,255 +0,0 @@ -# 数据区块概述 - -数据可能是某个表(collection)的数据,也可能是某个关系(association)的数据 - -- collection,如 a 表 -- association,如 a.b 关系,关系表为 b - -collection 示例 - -```js -{ - "collection": "a" -} -``` - -association 示例 - -```js -{ - "collection": "b", - "association": "a.b" -} -``` - -数据的操作 - -```bash -: -.: -``` - -实际的请求参数 - -``` - /api/: - /api/:/ - /api///: - /api///:/ -``` - -- collection、association、action 是配置里存好的 -- sourceId、filterByTk 由上下文提供 - -## CollectionRecordProvider - -Record - -```ts -class CollectionRecord { - protected current = {}; - protected parent?: Record; - public isNew = false; - constructor(options = {}) { - const { current, parent, isNew } = options; - this.current = current || {}; - this.parent = parent; - this.isNew = isNew; - } -} -``` - -a:list(**list 外层不套空 RecordPicker**) - -```jsx | pure -{list.map((item) => { - const record = new CollectionRecord({ current: item }); - return -})} -``` - -a:get(view、edit) - -```jsx | pure -const record = new CollectionRecord({ current: item }); - -``` - -a:create - -```jsx | pure -const record = new CollectionRecord({ current, isNew: true }); - -``` - -a.b:list - -```jsx | pure - - {list.map((item) => { - const recordB = new CollectionRecord({ - current: item, - }); - return - })} - -``` - -a.b:get - -```jsx | pure -const recordA = new CollectionRecord({ - current: itemA, -}); -const recordB = new CollectionRecord({ - current: itemB, - parent: recordA, -}); -// 或者 -recordB.setParent(recordA); - - - - -``` - -a.b:create - -```jsx | pure -const recordA = new CollectionRecord({ - current: itemA, -}); -const recordB = new CollectionRecord({ - isNew: true, - parent: recordA, -}); - - - -``` - -## 区块 - -以下重要组件说明 - -- `DataBlockProvider` 数据区块的总称 -- `BlockProvider` 区块的各种参数设置 -- `CollectionProvider` collection 信息 -- `AssociationProvider` association 信息 -- `UseRequestProvider` useRequest 的 result - -没有当前记录的区块,如表格 - -```tsx | pure - - - - - - -
- - -``` - -DataBlockProvider 内容 - -```tsx | pure - - - - {props.children} - - - -``` - -有当前记录的区块,如表单 - -```tsx | pure - -
- -``` - -DataBlockProvider 内容 - -```tsx | pure - - - - - {props.children} - - - - -``` - -有当前父级记录的区块,如对多关系的表格区块,区块本身不套 RecordPicker - -```tsx | pure - - - - - - - -
- - - - - - - - -
- - - -``` - -DataBlockProvider 内容 - -```tsx | pure - - - - - {props.children} - - - - -``` - -有父级记录也有当前记录的区块,如关系的表单 - -```tsx | pure - - - - - - - - -``` - -DataBlockProvider 内容 - -```tsx | pure - - - - - - {props.children} - - - - - -``` diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/kanban.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/kanban.md deleted file mode 100644 index b84b1b62a..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/kanban.md +++ /dev/null @@ -1,160 +0,0 @@ -# Kanban - -## UI Schema - -### 看板区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "t_ehwqkw0ljw2:list", - "x-decorator": "KanbanBlockProvider", - "x-decorator-props": { - "collection": "t_ehwqkw0ljw2", - "resource": "t_ehwqkw0ljw2", - "action": "list", - "groupField": "f_5h4umwf59lc", - "params": { - "sort": ["f_5h4umwf59lc_sort"], - "paginate": false - } - }, - "x-designer": "Kanban.Designer", - "x-component": "CardItem", - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "KanbanActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "4vh5t2iohwp", - "x-async": false, - "x-index": 1 - }, - "iwnc45ou960": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-component": "Kanban", - "x-component-props": { - "useProps": "{{ useKanbanBlockProps }}" - }, - "properties": { - "card": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-read-pretty": true, - "x-label-disabled": true, - "x-decorator": "BlockItem", - "x-component": "Kanban.Card", - "x-component-props": { - "openMode": "drawer" - }, - "x-designer": "Kanban.Card.Designer", - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-component-props": { - "dndContext": false - }, - "x-uid": "3v010y09684", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "dk9a5cb9d95", - "x-async": false, - "x-index": 1 - }, - "cardViewer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"View\") }}", - "x-designer": "Action.Designer", - "x-component": "Kanban.CardViewer", - "x-action": "view", - "x-component-props": { - "openMode": "drawer" - }, - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"View record\") }}", - "x-component": "Action.Container", - "x-component-props": { - "className": "nb-action-popup" - }, - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializers", - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Details\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "RecordBlockInitializers", - "x-uid": "1lhiyyydpye", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "gisuj0zldz1", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "ohly2w4gnwp", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "29hjrxcfczh", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "0k56h1q80xo", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "uny2d4n5ry4", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "3gga5lop4t6", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/list.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/list.md deleted file mode 100644 index 4e690cb7d..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/list.md +++ /dev/null @@ -1,213 +0,0 @@ -# List - -## UI Schema - -### 列表区块 - -```json -{ - "x-uid": "h9mzrnxokk3", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a:view", - "x-decorator": "List.Decorator", - "x-decorator-props": { - "resource": "a", - "collection": "a", - "readPretty": true, - "action": "list", - "params": { - "pageSize": 10 - }, - "runWhenParamsChanged": true, - "rowKey": "id" - }, - "x-component": "CardItem", - "x-designer": "List.Designer", - "x-component-props": { - "title": "List 区块" - }, - "properties": { - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ListActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "chjgpgd45qz", - "x-async": false, - "x-index": 1 - }, - "list": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-component": "List", - "x-component-props": { - "props": "{{ useListBlockProps }}" - }, - "properties": { - "item": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "object", - "x-component": "List.Item", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useListItemProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-initializer-props": { - "useProps": "{{ useListItemInitializerProps }}" - }, - "x-uid": "u45nwmwlone", - "x-async": false, - "x-index": 1 - }, - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-align": "left", - "x-initializer": "ListItemActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "useProps": "{{ useListActionBarProps }}", - "layout": "one-column" - }, - "x-uid": "9erso7nhotq", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "qkuzlun8frh", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "1mfaa48qy5j", - "x-async": false, - "x-index": 2 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 对多关系的列表区块 - -```json -{ - "x-uid": "6tzpnkz60rx", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:view", - "x-decorator": "List.Decorator", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "list", - "params": { - "pageSize": 10 - }, - "runWhenParamsChanged": true - }, - "x-component": "CardItem", - "x-designer": "List.Designer", - "x-component-props": { - "title": "对多关系的列表区块" - }, - "properties": { - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ListActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "i05xr7nfs26", - "x-async": false, - "x-index": 1 - }, - "list": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-component": "List", - "x-component-props": { - "props": "{{ useListBlockProps }}" - }, - "properties": { - "item": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "object", - "x-component": "List.Item", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useListItemProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-initializer-props": { - "useProps": "{{ useListItemInitializerProps }}" - }, - "x-uid": "krerg70a28e", - "x-async": false, - "x-index": 1 - }, - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-align": "left", - "x-initializer": "ListItemActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "useProps": "{{ useListActionBarProps }}", - "layout": "one-column" - }, - "x-uid": "9745q36ltfv", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "yxc0lnax9gk", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "6mlzb7p6dvn", - "x-async": false, - "x-index": 2 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/map.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/map.md deleted file mode 100644 index 0413da64b..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/map.md +++ /dev/null @@ -1,115 +0,0 @@ -# Map - -## UI Schema - -### 地图区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "t_ddo5bd0swdg:list", - "x-decorator": "MapBlockProvider", - "x-decorator-props": { - "collection": "t_ddo5bd0swdg", - "resource": "t_ddo5bd0swdg", - "action": "list", - "fieldNames": { - "field": ["f_tmhy5bbusr8"] - }, - "params": { - "paginate": false - } - }, - "x-designer": "MapBlockDesigner", - "x-component": "CardItem", - "x-filter-targets": [], - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "MapActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 16 - } - }, - "x-uid": "ap0xzy32bms", - "x-async": false, - "x-index": 1 - }, - "1672zefmplu": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "MapBlock", - "x-component-props": { - "useProps": "{{ useMapBlockProps }}" - }, - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Action.Drawer", - "x-component-props": { - "className": "nb-action-popup" - }, - "title": "{{ t(\"View record\") }}", - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializers", - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Details\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "RecordBlockInitializers", - "x-uid": "vce3u8hfdrf", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "waw7z3qw7nn", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "szyybarlapl", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "83m07ksqbal", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "5cquhqq2161", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "p42awfpfnbf", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/data/table.md b/packages/core/client/docs/en-US/ui-schema/blocks/data/table.md deleted file mode 100644 index 4c99e2554..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/data/table.md +++ /dev/null @@ -1,193 +0,0 @@ -# Table - -## UI Schema - -### 表格区块 - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "TableBlockDesigner", - "x-component": "CardItem", - "x-decorator": "TableBlockProvider", - "x-acl-action": "users:list", - "x-filter-targets": [], - "x-decorator-props": { - "action": "list", - "params": { - "pageSize": 20 - }, - "rowKey": "id", - "dragSort": false, - "resource": "users", - "showIndex": true, - "collection": "users", - "disableTemplate": false - }, - "_isJSONSchemaObject": true, - "properties": { - "actions": { - "type": "void", - "version": "2.0", - "x-component": "ActionBar", - "x-initializer": "TableActionInitializers", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "_isJSONSchemaObject": true, - "x-uid": "55tgsn1puqk", - "x-async": false, - "x-index": 1 - }, - "g22il5nkv67": { - "type": "array", - "version": "2.0", - "x-component": "TableV2", - "x-initializer": "TableColumnInitializers", - "x-component-props": { - "rowKey": "id", - "useProps": "{{ useTableBlockProps }}", - "rowSelection": { - "type": "checkbox" - } - }, - "_isJSONSchemaObject": true, - "properties": { - "actions": { - "type": "void", - "title": "{{ t(\"Actions\") }}", - "version": "2.0", - "x-designer": "TableV2.ActionColumnDesigner", - "x-component": "TableV2.Column", - "x-decorator": "TableV2.Column.ActionBar", - "x-initializer": "TableActionColumnInitializers", - "x-action-column": "actions", - "_isJSONSchemaObject": true, - "properties": { - "actions": { - "type": "void", - "version": "2.0", - "x-component": "Space", - "x-decorator": "DndContext", - "x-component-props": { - "split": "|" - }, - "_isJSONSchemaObject": true, - "x-uid": "qkcugf5l0h6", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "kbgbskxsj3j", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "6r8e3mhnuxg", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "b87bbc5x0cp", - "x-async": false, - "x-index": 1 -} -``` - -### 对多关系区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "TableBlockProvider", - "x-acl-action": "a.o2m:list", - "x-decorator-props": { - "collection": "b", - "resource": "a.o2m", - "action": "list", - "params": { - "pageSize": 20 - }, - "showIndex": true, - "dragSort": false, - "disableTemplate": false, - "association": "a.o2m" - }, - "x-designer": "TableBlockDesigner", - "x-component": "CardItem", - "x-filter-targets": [], - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "TableActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "0gwze38mzps", - "x-async": false, - "x-index": 1 - }, - "0wuk1cpy5zp": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-initializer": "TableColumnInitializers", - "x-component": "TableV2", - "x-component-props": { - "rowKey": "id", - "rowSelection": { - "type": "checkbox" - }, - "useProps": "{{ useTableBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"Actions\") }}", - "x-action-column": "actions", - "x-decorator": "TableV2.Column.ActionBar", - "x-component": "TableV2.Column", - "x-designer": "TableV2.ActionColumnDesigner", - "x-initializer": "TableActionColumnInitializers", - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "DndContext", - "x-component": "Space", - "x-component-props": { - "split": "|" - }, - "x-uid": "gq0nkc7rf0q", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "zx97354nzfq", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "nss8uocacdq", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "0j5kcrius5z", - "x-async": false, - "x-index": 1 -} -``` diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/filter/collapse.md b/packages/core/client/docs/en-US/ui-schema/blocks/filter/collapse.md deleted file mode 100644 index 0bb30600a..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/filter/collapse.md +++ /dev/null @@ -1,41 +0,0 @@ -# Collapse - -## UI Schema - -### 折叠面板 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "AssociationFilter.Provider", - "x-decorator-props": { - "collection": "users", - "blockType": "filter", - "associationFilterStyle": { - "width": "100%" - }, - "name": "filter-collapse" - }, - "x-designer": "AssociationFilter.BlockDesigner", - "x-component": "CardItem", - "x-filter-targets": [], - "properties": { - "x8q0r7wp73e": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-action": "associateFilter", - "x-initializer": "AssociationFilter.FilterBlockInitializer", - "x-component": "AssociationFilter", - "x-uid": "j11suxuizte", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "0g6pyonrj83", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/filter/form.md b/packages/core/client/docs/en-US/ui-schema/blocks/filter/form.md deleted file mode 100644 index f0145c51b..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/filter/form.md +++ /dev/null @@ -1,63 +0,0 @@ -# Form - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "FilterFormBlockProvider", - "x-decorator-props": { - "resource": "users", - "collection": "users" - }, - "x-designer": "FormV2.FilterDesigner", - "x-component": "CardItem", - "x-filter-targets": [], - "x-filter-operators": {}, - "properties": { - "dwltvxybiir": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FilterFormItemInitializers", - "x-uid": "aggw48stzwc", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "FilterFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "float": "right" - } - }, - "x-uid": "7aogdo89a7s", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "wreuz6dr1pc", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "7d1o5bruekl", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/index.md b/packages/core/client/docs/en-US/ui-schema/blocks/index.md deleted file mode 100644 index 07dd0c5c7..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/index.md +++ /dev/null @@ -1 +0,0 @@ -# Overview diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/others/iframe.md b/packages/core/client/docs/en-US/ui-schema/blocks/others/iframe.md deleted file mode 100644 index 58a2bf038..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/others/iframe.md +++ /dev/null @@ -1,22 +0,0 @@ - -# iframe - -## UI Schema - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "Iframe.Designer", - "x-component": "Iframe", - "x-decorator": "BlockItem", - "x-component-props": {}, - "x-decorator-props": { - "name": "iframe" - }, - "_isJSONSchemaObject": true, - "x-uid": "fmmlqe8rrei", - "x-async": false, - "x-index": 1 -} -``` diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/others/markdown.md b/packages/core/client/docs/en-US/ui-schema/blocks/others/markdown.md deleted file mode 100644 index 478fafd2c..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/others/markdown.md +++ /dev/null @@ -1,24 +0,0 @@ -# Markdown - -## UI Schema - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "Markdown.Void.Designer", - "x-editable": false, - "x-component": "Markdown.Void", - "x-decorator": "CardItem", - "x-component-props": { - "content": "This is a demo text, **supports Markdown syntax**." - }, - "x-decorator-props": { - "name": "markdown" - }, - "_isJSONSchemaObject": true, - "x-uid": "w75e9d5vs1e", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/blocks/others/workflow-todo.md b/packages/core/client/docs/en-US/ui-schema/blocks/others/workflow-todo.md deleted file mode 100644 index 9f477e5d7..000000000 --- a/packages/core/client/docs/en-US/ui-schema/blocks/others/workflow-todo.md +++ /dev/null @@ -1,33 +0,0 @@ -# Workflow todos - -## x-designer - -- TableBlockDesigner(不适合直接用表格区块的) - -## UI Schema - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "TableBlockDesigner", - "x-component": "CardItem", - "x-decorator": "WorkflowTodo.Decorator", - "x-decorator-props": {}, - "_isJSONSchemaObject": true, - "properties": { - "todos": { - "type": "void", - "version": "2.0", - "x-component": "WorkflowTodo", - "_isJSONSchemaObject": true, - "x-uid": "xq1qcdpq7rq", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "3z3ey8r6ik9", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/cascader-select.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/cascader-select.md deleted file mode 100644 index 94547e50c..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/cascader-select.md +++ /dev/null @@ -1 +0,0 @@ -# 级联选择器 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/file-manager.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/file-manager.md deleted file mode 100644 index 5b02970f7..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/file-manager.md +++ /dev/null @@ -1 +0,0 @@ -# 文件管理器 diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/index.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/index.md deleted file mode 100644 index e9f57784b..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/index.md +++ /dev/null @@ -1,21 +0,0 @@ -# 关系字段组件 - -### 标题 Read pretty - -### 标签 Read pretty - -### 子详情 Read pretty - -### 子表单 Editable - -### 子表单(弹窗) Editable - -### 下拉选择器 Editable - -### 数据选择器 Editable - -### 级联选择器 Editable - -### 文件管理器 Editable - -### 子表格 Editable Read pretty diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/record-picker.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/record-picker.md deleted file mode 100644 index ae439f012..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/record-picker.md +++ /dev/null @@ -1 +0,0 @@ -# 数据选择器 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/select.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/select.md deleted file mode 100644 index 9df4627f7..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/select.md +++ /dev/null @@ -1 +0,0 @@ -# 下拉选择器 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-details.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-details.md deleted file mode 100644 index a509906e4..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-details.md +++ /dev/null @@ -1 +0,0 @@ -# 子详情 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-form-popover.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-form-popover.md deleted file mode 100644 index acc10f4a7..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-form-popover.md +++ /dev/null @@ -1 +0,0 @@ -# 子表单 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-form.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-form.md deleted file mode 100644 index acc10f4a7..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-form.md +++ /dev/null @@ -1 +0,0 @@ -# 子表单 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-table.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-table.md deleted file mode 100644 index 9556a6c5c..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/sub-table.md +++ /dev/null @@ -1 +0,0 @@ -# 子表格 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/tag.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/tag.md deleted file mode 100644 index f927916b3..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/tag.md +++ /dev/null @@ -1 +0,0 @@ -# 标签 diff --git a/packages/core/client/docs/en-US/ui-schema/fields/association-components/title.md b/packages/core/client/docs/en-US/ui-schema/fields/association-components/title.md deleted file mode 100644 index e8a280714..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/association-components/title.md +++ /dev/null @@ -1 +0,0 @@ -# 标题 \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/form-item.md b/packages/core/client/docs/en-US/ui-schema/fields/form-item.md deleted file mode 100644 index 74112ffb2..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/form-item.md +++ /dev/null @@ -1,22 +0,0 @@ -# FormItem - 表单项 - -## UI Schema - -### 表单字段 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "string", - "x-designer": "FormItem.Designer", - "x-component": "CollectionField", - "x-decorator": "FormItem", - "x-collection-field": "a.id", - "x-component-props": {}, - "x-read-pretty": true, - "x-uid": "u2nk80cguoa", - "x-async": false, - "x-index": 1 -} -``` diff --git a/packages/core/client/docs/en-US/ui-schema/fields/index.md b/packages/core/client/docs/en-US/ui-schema/fields/index.md deleted file mode 100644 index e734184db..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# Overview - -## UI Schema 协议 - -- `x-collection-field` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/fields/table-column.md b/packages/core/client/docs/en-US/ui-schema/fields/table-column.md deleted file mode 100644 index 61598b8f6..000000000 --- a/packages/core/client/docs/en-US/ui-schema/fields/table-column.md +++ /dev/null @@ -1,40 +0,0 @@ -# 表格列 - -## UI Schema - -### 表格列 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "TableV2.Column.Decorator", - "x-designer": "TableV2.Column.Designer", - "x-component": "TableV2.Column", - "properties": { - "f_beilggsbj0r": { - "_isJSONSchemaObject": true, - "version": "2.0", - "x-collection-field": "a.f_beilggsbj0r", - "x-component": "CollectionField", - "x-component-props": { - "ellipsis": true - }, - "x-read-pretty": true, - "x-decorator": null, - "x-decorator-props": { - "labelStyle": { - "display": "none" - } - }, - "x-uid": "h5u4xi7uvji", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "z8p8ezctwsh", - "x-async": false, - "x-index": 2 -} -``` diff --git a/packages/core/client/docs/en-US/ui-schema/globals/menu.md b/packages/core/client/docs/en-US/ui-schema/globals/menu.md deleted file mode 100644 index 69a4e6a80..000000000 --- a/packages/core/client/docs/en-US/ui-schema/globals/menu.md +++ /dev/null @@ -1,127 +0,0 @@ -# Menu - - -菜单模块以后会重构,Item 直接用 items 对接,不用 schema 嵌套,Menu 也会开放到更多场景里使用。 - - -## `x-initializer` - -- MenuItemInitializers - -## `x-designer` - -- Menu.Designer - -## `x-settings` - -- MenuSettings - -## UI Schema - -### 菜单 - -```json -{ - "type": "void", - "x-component": "Menu", - "x-designer": "Menu.Designer", - "x-initializer": "MenuItemInitializers", - "x-component-props": { - "mode": "mix", - "theme": "dark", - "onSelect": "{{ onSelect }}", - "sideMenuRefScopeKey": "sideMenuRef" - }, - "name": "lap9zil5z4u", - "x-uid": "x77wpukk3qz", - "x-async": false -} -``` - -### 菜单分组 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "Group", - "x-component": "Menu.SubMenu", - "x-decorator": "ACLMenuItemProvider", - "x-component-props": { - "icon": "alipaycircleoutlined", - }, - "x-server-hooks": [ - { - "type": "onSelfCreate", - "method": "bindMenuToRole" - }, - { - "type": "onSelfSave", - "method": "extractTextToLocale" - } - ], - "x-uid": "zjxw5sph3do", - "x-async": false, - "x-index": 1 -} -``` - -### 菜单页面 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "Page1", - "x-component": "Menu.Item", - "x-decorator": "ACLMenuItemProvider", - "x-component-props": { - "icon": "alipaycircleoutlined", - }, - "x-server-hooks": [ - { - "type": "onSelfCreate", - "method": "bindMenuToRole" - }, - { - "type": "onSelfSave", - "method": "extractTextToLocale" - } - ], - "x-uid": "y0jp661nb8i", - "x-async": false, - "x-index": 2 -} -``` - -### 链接 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "Link", - "x-component": "Menu.URL", - "x-decorator": "ACLMenuItemProvider", - "x-component-props": { - "href": "#", - "icon": "alipaycircleoutlined" - }, - "x-server-hooks": [ - { - "type": "onSelfCreate", - "method": "bindMenuToRole" - }, - { - "type": "onSelfSave", - "method": "extractTextToLocale" - } - ], - "x-uid": "ynembhzwcj1", - "x-async": false, - "x-index": 3 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/globals/page.md b/packages/core/client/docs/en-US/ui-schema/globals/page.md deleted file mode 100644 index 2f93084f7..000000000 --- a/packages/core/client/docs/en-US/ui-schema/globals/page.md +++ /dev/null @@ -1,94 +0,0 @@ -# Page - - -现在页面依赖菜单,以后会独立出来,也可以创建无菜单的页面。另外,页面的标签页的设计还有问题。 - - -## `x-initializer` - -- PageTabsInitializers(暂无) -- BlockInitializers - -## `x-designer` - -- PageDesigner(暂无) -- PageTabsDesigner(暂无) - -## `x-settings` - -- PageSettings - -## UI Schema - -### 页面区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Page", - "title": "AA333", - "x-component-props": { - "enablePageTabs": true, - "hidePageTitle": true, - "disablePageHeader": true - }, - "properties": { - "nzxygx0iady": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "BlockInitializers", - "x-uid": "z8hxh8fxksb", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "9stdz1ld2p5", - "x-async": true, - "x-index": 1 -} -``` - -### 页面标签页 - -```json -{ - "x-uid": "cqq0ythy0yj", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Page", - "x-component-props": { - "enablePageTabs": true - }, - "properties": { - "o8gqaximg8c": { - "x-uid": "lzz2tqi8sxp", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "BlockInitializers", - "title": "Tab1", - "x-async": false, - "x-index": 1 - }, - "zjl1itzi6t8": { - "x-uid": "x10ru2grypq", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "Tab2", - "x-component": "Grid", - "x-initializer": "BlockInitializers", - "x-async": false, - "x-index": 2 - } - }, - "x-async": true, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/en-US/ui-schema/globals/tabs.md b/packages/core/client/docs/en-US/ui-schema/globals/tabs.md deleted file mode 100644 index c3ccea468..000000000 --- a/packages/core/client/docs/en-US/ui-schema/globals/tabs.md +++ /dev/null @@ -1,5 +0,0 @@ -# Tabs - - -标签页以后会重构,相关场景有页面的标签页和弹窗里的标签页 - diff --git a/packages/core/client/docs/en-US/ui-schema/index.md b/packages/core/client/docs/en-US/ui-schema/index.md deleted file mode 100644 index d908d9ed2..000000000 --- a/packages/core/client/docs/en-US/ui-schema/index.md +++ /dev/null @@ -1,25 +0,0 @@ -# 概述 - -## `x-initializer` - -不是所有节点都能使用 `x-initializer`,内置的 Schema 组件里,只有 Grid、ActionBar、Tabs、Table 组件有 `x-initializer` 参数 - -- Grid(通用) -- ActionBar(通用) -- Tabs(通用) -- Table -- Menu - -## `x-designer` - -`x-designer` 通常需要和 `BlockItem`、`FormItem`、`CardItem` 这类组件结合使用 - -完整的 Designer 组件有 - -- DragHandler -- Initializer -- Settings - -```tsx | pure - -``` diff --git a/packages/core/client/docs/zh-CN/core/application/application.md b/packages/core/client/docs/zh-CN/core/application/application.md deleted file mode 100644 index b33fe9bbf..000000000 --- a/packages/core/client/docs/zh-CN/core/application/application.md +++ /dev/null @@ -1,374 +0,0 @@ -# Application - -## new Application(options) - -创建一个 NocoBase 应用。 - -- 类型 - -```tsx | pure -export interface ApplicationOptions { - apiClient?: APIClientOptions | APIClient; - ws?: WebSocketClientOptions | boolean; - i18n?: i18next; - providers?: (ComponentType | ComponentAndProps)[]; - plugins?: PluginType[]; - components?: Record; - scopes?: Record; - router?: RouterOptions; - schemaSettings?: SchemaSetting[]; - schemaInitializers?: SchemaInitializer[]; - loadRemotePlugins?: boolean; - dataSourceManager?: DataSourceManagerOptions; -} -``` - -- 详细信息 - - apiClient:API 请求实例,具体说明请参见:[https://docs.nocobase.com/api/sdk](https://docs.nocobase.com/api/sdk) - - i18n:国际化,具体请参考:[https://www.i18next.com/overview/api#createinstance](https://www.i18next.com/overview/api#createinstance) - - providers:上下文 - - components:全局组件 - - scopes:全局 scopes - - router:配置路由,具体请参考:[RouterManager](/core/application/router-manager) - - pluginSettings: [PluginSettingsManager](/core/application/plugin-settings-manager) - - schemaSettings:Schema 设置工具,具体参考:[SchemaSettingsManager](/core/ui-schema/schema-initializer-manager) - - schemaInitializers:Schema 添加工具,具体参考:[SchemaInitializerManager](/core/ui-schema/schema-initializer-manager) - - loadRemotePlugins:用于控制是否加载远程插件,默认为 `false`,即不加载远程插件(方便单测和 DEMO 环境)。 - - dataSourceManager:数据源管理器,具体参考:[DataSourceManager](/core/data-source/data-source-manager) -- 示例 - -```tsx -/** - * defaultShowCode: true - */ -import { Application, Plugin } from '@nocobase/client'; - -const ProviderDemo = ({ children }) => { - return
-
hello world
-
{children}
-
-} - -class MyPlugin extends Plugin { - async load(){ - this.app.router.add('home', { - path: '/', - Component: () =>
home page
- }) - } -} - -const app = new Application({ - providers: [ProviderDemo], - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` - -## 实例属性 - -### app.i18n - -```tsx | pure -class Application { - i18n: i18next; -} -``` - -详细介绍,请参考:[i18next](https://www.i18next.com/overview/api#createinstance) - -### app.apiClient - -```tsx | pure -class Application { - apiClient: APIClient; -} -``` - -详细介绍,请参考:[APIClient](https://docs.nocobase.com/api/sdk) - -### app.router - -详细介绍,请参考:[RouterManager](/core/application/router-manager) - -### app.pluginSettingsManager - -详细介绍,请参考:[PluginSettingsManager](/core/application/plugin-settings-manager) - -### app.schemaSettingsManager - -详细介绍,请参考:[SchemaSettingsManager](/core/ui-schema/schema-initializer-manager) - -### app.schemaInitializerManager - -详细介绍,请参考:[SchemaInitializerManager](/core/ui-schema/schema-initializer-manager) - -### app.dataSourceManager - -详细介绍,请参考:[dataSourceManager](/core/data-source/data-source-manager) - -## 实例方法 - -### app.getRootComponent() - -获取应用的根组件。 - -- 类型 - -```tsx | pure -class Application { - getRootComponent(): React.FC -} -``` - -- 示例 - -```tsx | pure -import { Application } from '@nocobase/client'; - -const app = new Application(); - -const App = app.getRootComponent(); -``` - -### app.mount() - -将应用实例挂载在一个容器元素中。 - -- 类型 - -```tsx | pure -class Application { - mount(containerOrSelector: Element | ShadowRoot | string): ReactDOM.Root -} -``` - -- 示例 - -```tsx | pure -import { Application } from '@nocobase/client'; - -const app = new Application(); - -app.mount('#root'); -``` - -### app.addProvider() - -添加 `Provider` 上下文。 - -- 类型 - -```tsx | pure -class Application { - addProvider(component: ComponentType, props?: T): void; -} -``` - -- 详细信息 - -第一个参数是组件,第二个参数是组件的参数。注意 `Provider` 一定要渲染 `children`。 - -- 示例 - -```tsx | pure -// 场景1:第三方库,或者自己创建的 Context -const MyContext = createContext({}); -app.addProvider(MyContext.provider, { value: { color: 'red' } }); -``` - -```tsx -import { createContext, useContext } from 'react'; -import { Application, Plugin } from '@nocobase/client'; - -const MyContext = createContext(); - -const HomePage = () => { - const { color } = useContext(MyContext) || {}; - return
home page
-} - -class MyPlugin extends Plugin { - async load(){ - this.app.addProvider(MyContext.Provider, { value: { color: 'red' } }); - this.app.router.add('home', { - path: '/', - Component: HomePage - }) - } -} - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` - -```tsx | pure -// 场景2:自定义的组件,注意 children -const GlobalDemo = ({ name, children }) => { - return
-
hello, { name }
-
{ children }
-
-} -app.addProvider(GlobalDemo, { name: 'nocobase' }); -``` - - -```tsx -import { Application, Plugin } from '@nocobase/client'; - -const GlobalDemo = ({ name, children }) => { - return
-
hello, { name }
-
{ children }
-
-} - -class MyPlugin extends Plugin { - async load(){ - this.app.addProvider(GlobalDemo, { name: 'nocobase' }); - this.app.router.add('home', { - path: '/', - Component: () =>
home page
- }) - } -} - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` - - -### app.addProviders() - -添加多个 `Provider` 上下文。 - -- 类型 - -```tsx | pure -class Application { - addProviders(providers: (ComponentType | [ComponentType, any])[]): void; -} -``` - -- 详细信息 - -一次添加多个 `Provider`。 - -- 示例 - -```tsx | pure -app.addProviders([[MyContext.provider, { value: { color: 'red' } }], [GlobalDemo, { name: 'nocobase' }]]) -``` - -### app.addComponents() - -添加全局组件。 - -全局组件可以使用在 [RouterManager](/core/application/router-manager) 和 [UI Schema](/core/ui-schema/schema-component)上。 - -- 类型 - -```tsx | pure -class Application { - addComponents(components: Record): void; -} -``` - -- 示例 - -```tsx | pure -app.addComponents({ Demo, Foo, Bar }) -``` - -### app.addScopes() - -添加全局的 scope。 - -全局组 scope 可以 [UI Schema](/core/ui-schema/schema-component) 上。 - -- 类型 - -```tsx | pure -class Application { - addScopes(scopes: Record): void; -} -``` - -- 示例 - -```tsx | pure -function useSomeThing() {} -const anyVar = ''; - -app.addScopes({ useSomeThing, anyVar }) -``` - -## Hooks - -### useApp() - -获取当前应用的实例。 - -- 类型 - -```tsx | pure -const useApp: () => Application -``` - -- 示例 - -```tsx | pure -const Demo = () => { - const app = useApp(); - return
{ JSON.stringify(app.router.getRouters()) }
-} -``` - -```tsx -import { Application, Plugin, useApp } from '@nocobase/client'; - -const HomePage = () => { - const app = useApp(); - return
{ JSON.stringify(app.router.getRoutes()) }
-} - -class MyPlugin extends Plugin { - async load(){ - this.app.router.add('home', { - path: '/', - Component: HomePage - }) - } -} - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` diff --git a/packages/core/client/docs/zh-CN/core/application/plugin-manager.md b/packages/core/client/docs/zh-CN/core/application/plugin-manager.md deleted file mode 100644 index 342420f32..000000000 --- a/packages/core/client/docs/zh-CN/core/application/plugin-manager.md +++ /dev/null @@ -1,122 +0,0 @@ -# PluginManager - -用于管理插件。 - -```tsx | pure -class PluginManager { - add(plugin: typeof Plugin, opts?: PluginOptions): Promise - - get(PluginClass: T): InstanceType; - get(name: string): T; -} -``` - -## 实例方法 - -### pluginManager.add() - -将插件添加到应用中。 - -- 类型 - -```tsx | pure -class PluginManager { - add(plugin: typeof Plugin, opts?: PluginOptions): Promise -} -``` - -- 详细信息 - -第一个参数是插件类,第二个则是实例化时传递的参数。前面已经讲过会在添加插件后,立即调用 `afterAdd` 钩子函数,所以返回的是 `Promise`。 - -对于远程组件而言,会自动传递一个 `name` 参数。 - -- 示例 - -```tsx | pure -class MyPluginA extends Plugin { - async load() { - console.log('options', this.options) - console.log('app', this.app); - console.log('router', this.app.router, this.router); - } -} - -class MyPluginB extends Plugin { - // 需要在 afterAdd 执行添加的方法 - async afterAdd() { - // 通过 `app.pluginManager.add()` 添加插件时,第一个参数是插件类,第二个参数是实例化时传递的参数 - this.app.pluginManager.add(MyPluginA, { name: 'MyPluginA', hello: 'world' }) - } -} - -const app = new Application({ - plugins: [MyPluginB], -}); -``` - -### pluginManager.get() - -获取插件实例。 - -- 类型 - -```tsx | pure -class PluginManager { - get(PluginClass: T): InstanceType; - get(name: string): T; -} -``` - -- 详细信息 - -可以通过 Class 获取插件示例,如果在插件注册的时候有 name,也可以通过字符串的 name 获取。 - -如果是远程插件,会自动传入 name,值为 package 的 name。 - -- 示例 - -```tsx | pure -import MyPluginA from 'xxx'; - -class MyPluginB extends Plugin { - async load() { - // 方式1:通过 Class 获取 - const myPluginA = this.app.pluginManager.get(MyPluginA); - - // 方式2:通过 name 获取(添加的时候要传递 name 参数) - const myPluginA = this.app.pluginManager.get('MyPluginA'); - } -} -``` - -## Hooks - -获取插件实例,等同于 `pluginManager.get()`。 - -### usePlugin() - -```tsx | pure -function usePlugin(plugin: T): InstanceType; -function usePlugin(name: string): T; -``` - -- 详细信息 - -可以通过 Class 获取插件示例,如果在插件注册的时候有 name,也可以通过字符串的 name 获取。 - -- 示例 - -```tsx | pure -import { usePlugin } from '@nocobase/client'; - -const Demo = () => { - // 通过 Class 获取 - const myPlugin = usePlugin(MyPlugin); - - // 通过 name 获取(添加的时候要传递 name 参数) - const myPlugin = usePlugin('MyPlugin'); - - return
-} -``` diff --git a/packages/core/client/docs/zh-CN/core/application/plugin-settings-manager.md b/packages/core/client/docs/zh-CN/core/application/plugin-settings-manager.md deleted file mode 100644 index 34e6f8c67..000000000 --- a/packages/core/client/docs/zh-CN/core/application/plugin-settings-manager.md +++ /dev/null @@ -1,269 +0,0 @@ -# PluginSettingsManager - -![](../static/plugin-settings.jpg) - -用于管理插件配置页面,其底层对应着 [RouterManager](/core/application/router-manager)。 - -```tsx | pure -interface PluginSettingOptionsType { - title: string; - /** - * @default `Outlet` - */ - Component?: ComponentType | string; - icon?: string; - /** - * sort, the smaller the number, the higher the priority - * @default 0 - */ - sort?: number; - aclSnippet?: string; -} - -interface PluginSettingsPageType { - label?: string; - title: string; - key: string; - icon: any; - path: string; - sort?: number; - name?: string; - isAllow?: boolean; - topLevelName?: string; - aclSnippet: string; - children?: PluginSettingsPageType[]; -} - -class PluginSettingsManager { - add(name: string, options: PluginSettingOptionsType): void - get(name: string, filterAuth?: boolean): PluginSettingsPageType; - getList(filterAuth?: boolean): PluginSettingsPageType[] - has(name: string): boolean; - remove(name: string): void; - getRouteName(name: string): string - getRoutePath(name: string): string; - hasAuth(name: string): boolean; -} -``` - -## 实例方法 - -### pluginSettingsManager.add() - -添加插件配置页。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - add(name: string, options: PluginSettingOptionsType): void -} -``` - -- 详细解释 - -第一个参数 `name`,是路由唯一标识,用于后续的删改查,并且 `name` 支持 `.` 用于分割层级,不过需要注意当使用 `.` 分层的时候,父级要使用 [Outlet](https://reactrouter.com/en/main/components/outlet),让子元素能正常渲染。 - -第二个参数中 `Component` 支持组件形式和字符串形式,如果是字符串组件,要先通过 [app.addComponents](/core/application/application#appaddcomponents) 进行注册,具体参考 [RouterManager](/core/application/router-manager)。 - -- 示例 - -单层级配置。 - -```tsx | pure -const HelloSettingPage = () => { - return
hello setting page
-} - -class MyPlugin extends Plugin { - async load() { - this.app.pluginSettingsManager.add('hello', { - title: 'Hello', // menu title and page title - icon: 'ApiOutlined', // menu icon - Component: HelloSettingPage - }) - } -} -``` - -多层级配置。 - -```tsx | pure -// 多层级配置页 - -class MyPlugin extends Plugin { - async load() { - this.app.pluginSettingsManager.add('hello', { - title: 'HelloWorld', - icon: '', - // Component: Outlet, 默认为 react-router-dom 的 Outlet 组件,可自定义 - }) - - this.app.pluginSettingsManager.add('hello.demo1', { - title: 'Demo1 Page', - Component: () =>
Demo1 Page Content
- }) - - this.app.pluginSettingsManager.add('hello.demo2', { - title: 'Demo2 Page', - Component: () =>
Demo2 Page Content
- }) - } -} -``` - -### pluginSettingsManager.get() - -获取配置信息。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - get(name: string, filterAuth?: boolean): PluginSettingsPageType; -} -``` - -- 详细解释 - -第一个是在添加时的 name 参数,第二个参数是是否在获取的时候进行权限过滤。 - -- 示例 - -在组件中获取。 - -```tsx | pure -const Demo = () => { - const app = useApp(); - const helloSettingPage = this.app.pluginSettingsManager.get('hello'); -} -``` - -在插件中获取。 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const helloSettingPage = this.app.pluginSettingsManager.get('hello') - const helloSettingPage = this.app.pluginSettingsManager.get('hello', false); - - const mobileAppConfigPage = this.app.pluginSettingsManager.get('mobile.app') - } -} -``` - -### pluginSettingsManager.getList() - -获取插件配置页列表。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - getList(filterAuth?: boolean): PluginSettingsPageType[] -} -``` - -- 详细解释 - -`filterAuth` 默认值为 `true`,即进行权限过滤。 - -- 示例 - -```tsx | pure -const Demo = () => { - const app = useApp(); - const settings = app.pluginSettingsManager.getList(); - const settings = app.pluginSettingsManager.getList(false); -} -``` - -### pluginSettingsManager.has() - -判断是否存在,内部已进行权限过滤。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - has(name: string): boolean; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.pluginSettingsManager.has('hello'); - } -} -``` - -### pluginSettingsManager.remove() - -移除配置。 - -```tsx | pure -class PluginSettingsManager { - remove(name: string): void; -} -``` - -### pluginSettingsManager.getRouteName() - -获取对应路由的名称。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - getRouteName(name: string): string -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const helloRouteName = this.pluginSettingsManager.getRouteName('hello'); // admin.settings.hello - } -} -``` - -### pluginSettingsManager.getRoutePath() - -获取插件配置对应的页面路径。 - -- 类型 - -```tsx | pure -class PluginSettingsManager { - getRoutePath(name: string): string; -} -``` - -- 示例 - -```tsx | pure -const Demo = () => { - const navigate = useNavigate(); - const app = useApp(); - const helloSettingPath = app.pluginSettingsManager.getRoutePath('hello'); - - return
navigate(helloSettingPath)}> - go to hello setting page -
-} -``` - -### pluginSettingsManager.hasAuth() - -单独判断是否权限。 - -```tsx | pure -class PluginSettingsManager { - hasAuth(name: string): boolean; -} -``` diff --git a/packages/core/client/docs/zh-CN/core/application/plugin.md b/packages/core/client/docs/zh-CN/core/application/plugin.md deleted file mode 100644 index 5bfcfe42c..000000000 --- a/packages/core/client/docs/zh-CN/core/application/plugin.md +++ /dev/null @@ -1,89 +0,0 @@ -# Plugin - -Plugin 基类。 - -- 类型 - -```tsx | pure -class Plugin { - constructor( - protected options: T, - protected app: Application, - ) { - this.options = options; - this.app = app; - } - - get pluginManager() { - return this.app.pluginManager; - } - - get router() { - return this.app.router; - } - - get pluginSettingsManager() { - return this.app.pluginSettingsManager; - } - - get schemaInitializerManager() { - return this.app.schemaInitializerManager; - } - - get schemaSettingsManager() { - return this.app.schemaSettingsManager; - } - - get dataSourceManager() { - return this.app.dataSourceManager; - } - - async afterAdd() {} - - async beforeLoad() {} - - async load() {} -} -``` - -- 详细信息 - - - 构造函数 - - `options`: 插件的添加有两种方式,一种方式从插件列表中远程加载出来,另一种方式是通过 [PluginManager](/core/application/plugin-manager) 添加 - - 远程加载:`options` 会被自动注入 `{ name: 'npm package.name' }` - - PluginManager `options` 由用户自己传递 - - `app`:此参数是自动注入的,是应用实例 - - 快捷访问:基类提供了对 `app` 部分方法和属性的快捷访问 - - `pluginManager` - - `router` - - `pluginSettingsManager` - - `schemaSettingsManager` - - `schemaInitializerManager` - - 声明周期 - - `afterAdd`:插件被添加后立即执行 - - `beforeLoad`:执行渲染时执行,在 `afterAdd` 之后,`load` 之前 - - `load`:最后执行 -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - - async afterAdd() { - console.log('afterAdd') - } - - async beforeLoad() { - console.log('beforeLoad') - } - - async load() { - console.log('load') - - // 可以访问应用实例 - console.log(this.app) - - // 访问应用实例内容 - console.log(this.app.router, this.router); - } -} -``` diff --git a/packages/core/client/docs/zh-CN/core/application/router-manager.md b/packages/core/client/docs/zh-CN/core/application/router-manager.md deleted file mode 100644 index ef707219c..000000000 --- a/packages/core/client/docs/zh-CN/core/application/router-manager.md +++ /dev/null @@ -1,386 +0,0 @@ -# RouterManager - -用于管理路由。 - -```tsx | pure -import { ComponentType } from 'react'; -import { RouteObject } from 'react-router-dom'; - -interface RouteType extends Omit { - Component?: ComponentType | string; -} - -class RouterManager { - add(name: string, route: RouteType): void; - getRoutes(): Record; - getRoutesTree(): RouteObject[]; - get(name: string): RouteType; - has(name: string): boolean; - remove(name: string): void; - setType(type: 'browser' | 'memory' | 'hash'): void; - setBasename(basename: string): void; -} -``` - -## 实例方法 - -### router.add() - -添加一条路由。 - -- 类型 - -```tsx | pure -class RouterManager { - add(name: string, route: RouteType): void -} -``` - -- 详情 - -第一个参数 `name`,是路由唯一标识,用于后续的删改查,并且 `name` 支持 `.` 用于分割层级,不过需要注意当使用 `.` 分层的时候,父级要使用 [Outlet](https://reactrouter.com/en/main/components/outlet),让子元素能正常渲染。 - -第二个参数 `RouteType` 的 `Component` 支持组件形式和字符串形式,如果是字符串组件,要先通过 [app.addComponents](/core/application/application#appaddcomponents) 进行注册。 - -- 示例 - -单层级路由。 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.router.add('home', { - path: '/', - Component: () =>
home page
- }) - this.app.router.add('login', { - path: '/login', - element:
login page
- }) - } -} -``` - -```tsx -import { useNavigate } from 'react-router-dom'; -import { Plugin, Application } from '@nocobase/client'; - -const HomePage = () => { - const navigate = useNavigate(); - return
-
home page
- -
-} - -const LoginPage = () => { - const navigate = useNavigate(); - return
-
login page
- -
-} - -class MyPlugin extends Plugin { - async load() { - this.app.router.add('home', { - path: '/', - Component: HomePage - }) - this.app.router.add('login', { - path: '/login', - Component: LoginPage - }) - } -} - - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/'], - } -}); - -export default app.getRootComponent(); -``` - -多层级路由。 - -```tsx | pure -import { Plugin } from '@nocobase/client'; -import { Outlet } from 'react-router-dom'; - -const AdminLayout = () =>{ - return
-
This is admin layout
- -
-} - -const AdminSettings = () => { - return
This is admin settings page
-} - -class MyPlugin extends Plugin { - async load() { - this.app.router.add('admin', { - path: '/admin', - Component: AdminLayout - }) - this.app.router.add('admin.settings', { - path: '/admin/settings', - Component: AdminSettings , - }) - } -} -``` - - -```tsx -import { useNavigate, Outlet } from 'react-router-dom'; -import { Plugin, Application } from '@nocobase/client'; - -const AdminLayout = () =>{ - return
-
This is admin layout
- -
-} - -const AdminSettings = () => { - return
This is admin settings page
-} - -class MyPlugin extends Plugin { - async load() { - this.app.router.add('admin', { - path: '/admin', - Component: AdminLayout - }) - this.app.router.add('admin.settings', { - path: '/admin/settings', - Component: AdminSettings , - }) - } -} - - -const app = new Application({ - plugins: [MyPlugin], - router: { - type: 'memory', - initialEntries: ['/admin/settings'], - } -}); - -export default app.getRootComponent(); -``` - -`Component` 参数为字符串。 - -```tsx | pure -const LoginPage = () => { - return
login page
-} - -class MyPlugin extends Plugin { - async load() { - // 通过 app.addComponents 进行注册 - this.app.addComponents({ LoginPage }) - - this.app.router.add('login', { - path: '/login', - Component: 'LoginPage', // 这里可以使用字符串了 - }) - } -} -``` - -### router.getRoutes() - -获取路由列表。 - -- 类型 - -```tsx | pure -class RouterManager { - getRoutes(): Record -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - console.log(this.app.router.getRoutes()); - } -} -``` - -![](../static/CxjJbp0pcogYn6xviVyc6QT8nUg.png) - -### router.getRoutesTree() - -获取用于 [useRoutes()](https://reactrouter.com/hooks/use-routes) 的数据。 - -- 类型 - -```tsx | pure -class RouterManager { - getRoutesTree(): RouteObject[] -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const routes = this.app.router.getRoutesTree(); - } -} -``` - -### router.get() - -获取单个路由配置。 - -- 类型 - -```tsx | pure -class RouterManager { - get(name: string): RouteType -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const adminRoute = this.app.router.get('admin') - const adminSettings = this.app.router.get('admin.settings') - } -} -``` - -### router.has() - -判断是否添加过路由。 - -- 类型 - -```tsx | pure -class RouterManager { - has(name: string): boolean; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const hasAdminRoute = this.app.router.has('admin') - const hasAdminSettings = this.app.router.has('admin.settings') - } -} -``` - -### router.remove() - -移除路由配置。 - -- 类型 - -```tsx | pure -class RouterManager { - remove(name: string): void; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.router.remove('admin') - this.app.router.remove('admin.settings') - } -} -``` - -### router.setType() - -设置路由类型,默认为 `browser`。 - - -- 类型 - -```tsx | pure -class RouterManager { - setType(type: 'browser' | 'memory' | 'hash'): void; -} -``` - -- 详细解释 - - browser: [BrowserRouter](https://reactrouter.com/en/main/router-components/browser-router) - - memory: [MemoryRouter](https://reactrouter.com/en/main/router-components/hash-router) - - hash: [HashRouter](https://reactrouter.com/en/main/router-components/memory-router) - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.router.setType('hash') - } -} -``` - -### router.setBasename() - -设置 [basename](https://reactrouter.com/en/main/router-components/browser-router#basename)。 - -- 类型 - -```tsx | pure -class RouterManager { - setBasename(basename: string): void; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.router.setBasename('/') - } -} -``` - -## Hooks - -### useRouter() - -获取当前路由的实例,等同于 `app.router`。 - -- 类型 - -```tsx | pure -const useRouter: () => RouterManager -``` - -- 示例 - -```tsx | pure -import { useRouter } from '@nocobase/client'; - -const Demo = () => { - const router = useRouter(); -} -``` diff --git a/packages/core/client/docs/zh-CN/core/data-block/collection-record-provider.md b/packages/core/client/docs/zh-CN/core/data-block/collection-record-provider.md deleted file mode 100644 index 0cfad105f..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/collection-record-provider.md +++ /dev/null @@ -1,259 +0,0 @@ -# CollectionRecordProvider - -用于提供 [CollectionRecord](./collection-record) 实例。 - -## 组件 - -- 类型 - -```tsx | pure -interface CollectionRecordProviderProps { - isNew?: boolean; - record?: CollectionRecord | DataType; - parentRecord?: CollectionRecord | DataType; - /** - * 当前记录所属的 collection name - */ - collectionName?: string; -} -``` - -- 详解 - -参数的具体说明参见 [CollectionRecord](./collection-record)。 - -需要说明的是 `record` 和 `parentRecord` 即可以是普通的对象,也可以是 [CollectionRecord](./collection-record) 实例,但最终会转为 `CollectionRecord` 实例,并通过 context 传递给子组件。 - -## 示例 - -- record 参数为 CollectionRecord 实例 - -```tsx | pure -import { CollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); - - -// 最终向子组件传递的数据为: props.record -``` - -```tsx -import { CollectionRecord, useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -- record 参数为普通对象 - -```tsx | pure - -// 最终向子组件传递的数据为: const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); -``` - -```tsx -import { useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -- record 参数为 CollectionRecord 实例且带有父记录 - -```tsx | pure -const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -const record = new CollectionRecord({ data: { id: 1, name: 'foo' }, parentRecord }); - - -// 最终向子组件传递的数据为: props.record -``` - -```tsx -import { CollectionRecord, useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -const record = new CollectionRecord({ data: { id: 1, name: 'foo' }, parentRecord }); - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -- record 参数为 CollectionRecord 实例,父记录通过 `parentRecord` 参数传递 - -```tsx | pure -const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); - - - -// 首先设置父记录:record.setParentRecord(parentRecord); -// 最终向子组件传递的数据为:record(带有父记录) -``` - -```tsx -import { CollectionRecord, useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -- record 参数为普通对象,父记录也是普通对象 - -```tsx | pure - - -// 首先实例化父记录:const parentRecord = new CollectionRecord({ data: { id: 1, role: 'admin' } }); -// 然后实例化记录:const record = new CollectionRecord({ data: { id: 1, name: 'foo' } }); -// 最后设置父记录:record.setParentRecord(parentRecord); -// 最终向子组件传递的数据为:record(带有父记录) -``` - - -```tsx -import { useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - return
{JSON.stringify(record, null, 2)}
; -} - -export default () => -``` - -## Hooks - -### useCollectionRecord() - -用于获取 `CollectionRecordProvider` 组件传递的数据记录。 - -- 示例 - -```tsx | pure -const record = useCollectionRecord(); - -console.log(record, record.data, record.parentRecord, record.parentRecord.data); -``` - -```tsx -import { useCollectionRecord, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - return
-
record:
{JSON.stringify(record, null, 2)}
-
record.data:
{JSON.stringify(record.data, null, 2)}
-
record.parentRecord:
{JSON.stringify(record.parentRecord, null, 2)}
-
record.parentRecord.data:
{JSON.stringify(record.parentRecord.data, null, 2)}
-
; -} - -export default () => -``` - -### useCollectionRecordData() - -直接获取 CollectionRecord 的 `data` 属性,等同于 `useCollectionRecord().data`。 - -- 示例 - -```tsx | pure -const data = useCollectionRecordData(); -const record = useCollectionRecord(); -console.log(data === record.data); -``` - -```tsx -import { useCollectionRecord, useCollectionRecordData, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const data = useCollectionRecordData(); - const record = useCollectionRecord(); - return
-
data === record.data: { JSON.stringify(data === record.data) }
-
data:
{JSON.stringify(data, null, 2)}
-
record.data:
{JSON.stringify(record.data, null, 2)}
-
; -} - -export default () => -``` - -### useCollectionParentRecord() - -直接获取 CollectionRecord 的数据 `parentRecord`,等同于 `useCollectionRecord().parentRecord`。 - -- 示例 - -```tsx | pure -const parentRecord = useCollectionParentRecord(); -const record = useCollectionRecord(); -console.log(parentRecord === record.parentRecord); -``` - -```tsx -import { useCollectionRecord, useCollectionParentRecord, CollectionRecordProvider } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - const parentRecord = useCollectionParentRecord(); - return
-
parentRecord === record.parentRecord: { JSON.stringify(parentRecord === record.parentRecord) }
-
parentRecord:
{JSON.stringify(parentRecord, null, 2)}
-
record.parentRecord:
{JSON.stringify(record.parentRecord, null, 2)}
-
; -} - -export default () => -``` - - -### useCollectionParentRecordData() - -直接获取 CollectionRecord 的数据 `parentRecord.data`,等同于 `useCollectionRecord().parentRecord.data`。 - -- 示例 - -```tsx | pure -const record = useCollectionRecord(); -const parentData = useCollectionParentRecordData(); -const parentRecord = useCollectionParentRecord(); -console.log(parentData === parentRecord.data === record.parentRecord.data); -``` - -```tsx -import { useCollectionRecord, CollectionRecordProvider, useCollectionParentRecordData, useCollectionParentRecord } from '@nocobase/client'; - -const Demo = () => { - const record = useCollectionRecord(); - const parentData = useCollectionParentRecordData(); - const parentRecord = useCollectionParentRecord(); - return
-
parentData:
{JSON.stringify(parentData, null, 2)}
-
parentRecord.data:
{JSON.stringify(parentRecord.data, null, 2)}
-
record.parentRecord.data:
{JSON.stringify(record.parentRecord.data, null, 2)}
-
; -} - -export default () => -``` diff --git a/packages/core/client/docs/zh-CN/core/data-block/collection-record.md b/packages/core/client/docs/zh-CN/core/data-block/collection-record.md deleted file mode 100644 index d2bc6ffa4..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/collection-record.md +++ /dev/null @@ -1,194 +0,0 @@ -# CollectionRecord - -数据表中的一条记录。 - -## 类型 - -```tsx | pure -interface CollectionRecordOptions { - isNew?: boolean; - data?: DataType; - parentRecord?: CollectionRecord; - /** - * 当前记录所属的 collection name - */ - collectionName?: string; -} - -class CollectionRecord { - public isNew?: boolean; - public data?: DataType; - public parentRecord?: CollectionRecord; - public collectionName?: string; - constructor(options: CollectionRecordOptions) {} - - setData(data: DataType) { - this.data = data; - } - - setParentRecord(parentRecord: CollectionRecord) { - this.parentRecord = parentRecord; - } -} -``` - -## 详解 - -### CollectionRecord 基本概念 - -CollectionRecord 类用于提供数据记录,通常情况下对应着后端数据表中的一条记录。以用户表为例,其一条数据对应的 CollectionRecord 类如下: - -```tsx | pure -const useCollectionRecord = new CollectionRecord({ - data: { - "id": 1, - "roleId": 10, - "appLang": null, - "createdById": null, - "email": "test@nocobase.com", - "nickname": "Admin", - "phone": null, - "systemSettings": {}, - "updatedById": null, - "username": "nocobase", - "createdAt": "2023-12-04T09:42:52.953Z", - "updatedAt": "2023-12-04T09:42:52.953Z", - } -}); -``` - -### CollectionRecord 和 Collection 的关系 - -CollectionRecord 是指的数据,而 Collection 则是表结构。对于上面的用户表,其对应的 Collection 如下: - -```tsx | pure -const usersCollection = new Collection({ - name: 'users', - fields: [ - { - type: 'bigInt', - name: 'id', - }, - { - type: 'string', - name: 'username', - }, - { - type: 'integer', - name: 'age', - }, - { - "name": "email", - "type": "string", - }, - // .... - ], -}); -``` - -### 父子关系和关系字段 - -对于[关系字段](https://docs.nocobase.com/development/server/collections/association-fields),例如用户和角色的关系,在用户表中会有一个 `roleId` 字段,其值为角色表中的 `id`,当我们通过 `users.roleId` 字段查询用户的角色时: - -```bash | pure -GET /api/users/1/roles:get/10 -``` - -其中 `1` 为用户的 `id`,`10` 为角色的 `id`,我们可以得到用户的角色数据: - -```tsx | pure -const roleRecord = new CollectionRecord({ - data: { - "id": 10, - "name": "member", - "title": "test role", - "strategy": { - "actions": [ - "view", - "update:own", - "destroy:own", - "create" - ] - }, - "createdAt": "2023-03-30T07:53:10.924Z", - "updatedAt": "2023-12-15T02:51:43.577Z", - } -}) -``` - -其中 `users` id 为 1 的记录我们称之为父记录: - -```tsx | pure -roleRecord.setParentRecord(userRecord); -``` - -### 新记录 - -对于新表单,我们可以通过 `isNew` 属性来标识: - -```tsx | pure -const record = new CollectionRecord({ - isNew: true, -}); -``` - -## 示例 - -### 基本使用 - -```tsx | pure -import { CollectionRecord } from '@nocobase/client'; - -const record = new CollectionRecord({ - data: { - name: 'foo', - } -}); -``` - -### 创建空记录 - -```tsx | pure -import { CollectionRecord } from '@nocobase/client'; - -const record = new CollectionRecord({ - isNew: true, -}); -``` - -### 设置 parentRecord - -方式1: 通过构造函数设置 - -```tsx | pure -const parentRecord = new CollectionRecord({ - data: { - foo: 'foo', - } -}); - -const record = new CollectionRecord({ - data: { - name: 'bar', - }, - parentRecord, -}); -``` - -方式2: 通过 `setParentRecord` 方法设置 - -```tsx | pure -const parentRecord = new CollectionRecord({ - data: { - foo: 'foo', - } -}); - -const record = new CollectionRecord({ - data: { - name: 'bar', - } -}); - -record.setParentRecord(parentRecord); -``` diff --git a/packages/core/client/docs/zh-CN/core/data-block/data-block-provider.md b/packages/core/client/docs/zh-CN/core/data-block/data-block-provider.md deleted file mode 100644 index 6aeaec049..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/data-block-provider.md +++ /dev/null @@ -1,246 +0,0 @@ -# DataBlockProvider - -## 区块类型 - -区块分为简单区块和包含各种数据的区块。 - -### 简单区块 - -简单区块例如 Markdown 区块。 - -![](./images/markdown-block.png) - -它只有文本内容,没有其他更多复杂数据,且文本内容是存储在 `schema` 中的,没有存储在数据库中。 - -```json {5}| pure -{ - "type": "void", - "x-component": "Markdown.Void", - "x-component-props": { - "content": "markdown content" - }, -} -``` - -### 数据区块 - -数据区块是指区块的数据存储在服务端的数据表中,例如 Table 组件。 - -![](./images/data-block.png) - -Table 中的字段信息及列表数据,都是存储在数据库中的。 - - -## DataBlockProvider 介绍 - -为了方便对数据区块的数据进行管理,我们提供了 `DataBlockProvider` 组件,其内部封装了: - -- `DataBlockProvider`:封装了下面的所有组件,并提供了区块属性 - - [CollectionProvider](/core/data-source/collection-provider) / [AssociationProvider](/core/data-source/association-provider): 根据 `DataBlockProvider` 提供的上下文信息,查询对应数据表数据及关系字段信息并传递 - - [BlockResourceProvider](/core/data-block/data-block-resource-provider): 根据 `DataBlockProvider` 提供的上下文信息,构建区块 [Resource](https://docs.nocobase.com/api/sdk#resource-action) API,用于区块数据的增删改查 - - [BlockRequestProvider](/core/data-block/data-block-request-provider): 根据 `DataBlockProvider` 提供的上下文信息,自动调用 `BlockResourceProvider` 提供的 `resource.get()` 或 `resource.list()` 发起请求,得到区块数据,并传递 - - [CollectionRecordProvider](/core/data-source/record-provider): 对于 `resource.get()` 场景,会自动嵌套 `CollectionRecordProvider` 并将 `resource.get()` 请求结果传递下去,`resource.list()` 场景则需要自行使用 `CollectionRecordProvider` 提供数据记录 - -```tsx | pure -const DataBlockProvider = (props) => { - return - - / - - - {action !== 'list' && - {props.children} - } - - / - - - -} -``` - -上述组件封装到 `DataBlockProvider` 的内部,只需要使用 `DataBlockProvider` 即可自行得到上述数据。 - -### 使用方式 - -其主要使用在区块的 schema [x-decorator](https://docs.nocobase.com/development/client/ui-schema/what-is-ui-schema#x-decorator) 中,例如: - -```js {5}| pure -{ - type: 'void', - name: 'hello-block', - 'x-component': 'CardItem', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: 'users', - dataSource: 'main', - action: 'list', - tableProps: { - bordered: true, - } - }, - 'x-use-decorator-props': 'useDynamicDataBlockProps', -} -``` - -### 完整示例 - - - -## 属性 - -### 静态属性和动态属性 - -- schema 中的 `x-decorator-props` 称为静态属性,它是一个普通对象,记录区块的配置信息 -- schema 中的 `x-use-decorator-props` 中的属性称为动态属性,它是一个 React hook,可用于获取例如 URL 上的 ID,或者父级的 context 数据 - -当两者都存在时,会进行深度合并,作为 `DataBlockProvider` 的属性。 - -### 属性详解 - -```ts | pure -interface AllDataBlockProps { - collection?: string; - association?: string; - sourceId?: string | number; - record?: Record; - action?: 'list' | 'get'; - filterByTk?: string; - params?: Record; - parentRecord?: Record; - [index: string]: any; -} -``` - -- collection(`x-decorator-props`):区块的 collection 表名,用于获取区块的字段信息和区块数据 -- association(`x-decorator-props`):区块的关系字段名,用于获取区块的关系字段信息和关系字段数据 -- dataSource(`x-decorator-props`): 数据源,具体可参考 [Data Modeling](https://docs.nocobase.com/manual/data-modeling) -- action(`x-decorator-props`):区块的请求类型,`list` 或 `get` -- params(`x-decorator-props` 和 `x-use-decorator-props`):区块的请求参数,同时存在于 -- filterByTk(`x-use-decorator-props`):相当于 `params.filterByTk`,可理解为 `id`,用于获取单条数据 -- sourceId(`x-use-decorator-props`):区块的 sourceId,配合 `association` 使用,用于获取区块的关系字段数据 -- record(`x-use-decorator-props`):当提供 `record` 时,会使用 `record` 作为区块的数据,不发起请求 -- parentRecord(`x-use-decorator-props`):当提供 `parentRecord` 时,会使用 `parentRecord` 作为关系字段的表数据,不发起请求 - -```tsx | pure -const DataBlockProvider = (props) => { - return - - / - - - {action !== 'list' && - {props.children} - } - - - - - -} -``` - -### 属性组合和场景 - -这些属性根据不同的场景,共有 8 中情况: - -- collection - - 创建:`collection` - - 获取单条数据:`collection` + `action: get` + `params` - - 获取列表数据:`collection` + `action: list` + `params` - - 使用 `record` 作为数据:`collection` + `record` - -对于 *获取单条数据* 和 *获取列表数据* `params` 非必须。 - -- association - - 创建:`association` + `sourceId` - - 获取单条数据:`association` + `sourceId` + `action: get` + `params` + `parentRecord` - - 获取列表数据:`association` + `sourceId` + `action: list` + `params` + `parentRecord` - - 使用 `record` 作为数据:`association` + `sourceId` + `record` + `parentRecord` - - -对于 *获取单条数据* 和 *获取列表数据* `params` 和 `parentRecord` 非必须,当没有 `parentRecord` 会根据 `association` 查询到对应的 `collection`,然后再根据 `collection` 查询到对应的 `parentRecord`。 - -### 属性获取和修改 - -#### useDataBlock() - -可用于获取和修改 `DataBlockProvider` 的属性。 - -- 类型 - -```tsx | pure -interface Result { - props: AllDataBlockProps & T; - dn: Designable; -} -const useDataBlock: () => Result -``` - -- 详解 - -`props` 就对应着上面的 `AllDataBlockProps`。 -`dn` 是 `Designable` 对象,可用于修改 `DataBlockProvider` 的 UI schema,详细见 [Designable](/core/ui-schema/designable)。 - -- 示例 - -```tsx | pure -const { props, dn } = useDataBlock<{ tableProps: { bordered?: boolean } }>(); - -// 获取 -const checked = props.tableProps.bordered; - -// 修改 -dn.deepMerge({ - 'x-decorator-props': { - tableProps: { - bordered: !checked, - }, - }, -}); -``` - -#### useDataBlockProps() - -相当于 `useDataBlock().props`。 - -```tsx | pure -const props = useDataBlockProps<{ tableProps: { bordered?: boolean } }>(); - -const checked = props.tableProps.bordered; -``` - -## 示例 - -### collection - -#### Table list - - - -#### Form get & update - - - -#### Form create - - - -#### Form record & update - - - -### association - -association 与 collection 类似,只是需要提供 `sourceId`,我们以 `Table list` 为例。 - -#### Table list & sourceId - - - -#### Table list & parentRecord - -如果不提供 `sourceId`,则需要提供 `parentRecord`,我们以 `Table list` 为例。 - - - diff --git a/packages/core/client/docs/zh-CN/core/data-block/data-block-request-provider.md b/packages/core/client/docs/zh-CN/core/data-block/data-block-request-provider.md deleted file mode 100644 index 48b5801b3..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/data-block-request-provider.md +++ /dev/null @@ -1,139 +0,0 @@ -# DataBlockRequestProvider - -其内部获取到 [BlockResourceProvider](/core/data-block/data-block-resource-provider) 提供的 `resource`,根据 [BlockProvider](/core/data-block/data-block-provider) 提供的参数,自动调用 `resource.get()` 或者 `resource.list()` 获取的区块的数据,并通过 context 传递下去。 - -## 请求参数 - -请求参数是获取 `DataBlockProvider` 提供中的 `params` 和 `filterByTk`。 - -```ts | pure -const schema = { - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - 'collection': 'users', - 'action': 'list', - // 静态参数 - params: { - pageSize: 10, - } - }, - // 动态参数 - 'x-use-decorator-props': 'useDynamicDataBlockProps', -} - -const useDynamicDataBlockProps: UseDataBlockProps<'CollectionList'> = () => { - return { - params: { - size: 15, - } - } -} -``` - -会自动调用 `resource.list()` 获取数据,发起 `GET /api/users:list?pageSize=10&size=15` 的请求。 - -## Hooks - -### useDataBlockRequest() - -用于获取请求对象,一般用区块组件中。 - -```tsx | pure -const MyTable = () => { - const { data, loading } = useDataBlockRequest(); - - return ( -
- ) -} -``` - -## Record - -### Get 请求 - -对于 `get` 请求,当获取到 `data` 数据后,会通过 `CollectionRecordProvider` 提供 `record` 对象,用于获取当前区块的数据。 - -```ts | pure -const schema = { - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - 'collection': 'users', - 'action': 'get', // get 请求 - }, - // 动态参数 - 'x-use-decorator-props': 'useDynamicFormProps', -} - -const useDynamicDataBlockProps: UseDataBlockProps<'CollectionGet'> = () => { - return { - params: { - filterByTk: 1, - } - } -} -``` - -会自动调用 `resource.get()` 获取数据,发起 `GET /api/users:get/1` 的请求,并通过 `CollectionRecordProvider` 提供上下文。 - -```tsx | pure -const { data } = useDataBlockRequest(); -const record = useCollectionRecord(); // record 上下文数据 - -// 相等 -record.data === data; -``` - -### List 请求 - -对于 `list` 请求则不会提供 `record` 对象,需要自己通过 `` 设置上下文。 - -```tsx | pure -const MyTable = () => { - const { data } = useDataBlockRequest(); - - return ( -
{ - return ( - - - - ) - }, - }, - ]} - pagination={{ - total: data?.meta.total, - pageSize: data?.meta.pageSize, - page: data?.meta.page, - }} - /> - ) -} - -const MyAction = () => { - const record = useCollectionRecord(); - return ( - - ) -} -``` diff --git a/packages/core/client/docs/zh-CN/core/data-block/data-block-resource-provider.md b/packages/core/client/docs/zh-CN/core/data-block/data-block-resource-provider.md deleted file mode 100644 index e94246b6c..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/data-block-resource-provider.md +++ /dev/null @@ -1,36 +0,0 @@ -# DataBlockResourceProvider - -根据 `DataBlockProvider` 中的 `collection`、`association`、`sourceId` 等属性,构建好 [resource](https://docs.nocobase.com/api/sdk#resource-action) 对象,方便子组件对区块数据的增删改查操作,其内置在 [DataBlockProvider](/core/data-block/data-block-provider) 中 - - -## useDataBlockResource - -用于获取当前数据块的 resource 对象。 - -- 类型 - -```ts | pure -function useDataBlockResource(): IResource -``` - -- 示例 - -```ts | pure -const resource = useDataBlockResource(); - -const onSubmit = async (values) => { - // 创建 - await resource.create({ values }); -} -``` - -```ts | pure -const resource = useDataBlockResource(); - -const onDelete = async () => { - // 删除 - await resource.destroy(); -} -``` - -可运行示例 diff --git a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/association-table-list-and-parent-record.tsx b/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/association-table-list-and-parent-record.tsx deleted file mode 100644 index 13964b35b..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/association-table-list-and-parent-record.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React from 'react'; -import { Table, TableProps } from 'antd'; -import { SchemaComponent, UseDataBlockProps, useDataBlockRequest, withDynamicSchemaProps } from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; - -const collection = 'users'; -const associationField = 'roles'; - -const association = `${collection}.${associationField}`; -const action = 'list'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-use-decorator-props': 'useBlockDecoratorProps', - 'x-decorator-props': { - association, - action, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', - }, - }, -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - const { data, loading } = useDataBlockRequest(); - return { - loading, - dataSource: data?.data || [], - columns: [ - { - title: 'Name', - dataIndex: 'name', - }, - { - title: 'Title', - dataIndex: 'title', - }, - { - title: 'Description', - dataIndex: 'description', - }, - ], - }; -} - -const useBlockDecoratorProps: UseDataBlockProps<'CollectionList'> = () => { - const parentRecord = { - id: 1, - username: 'Tom', - }; - return { - parentRecord, - }; -}; - -const Demo = () => { - return ; -}; - -const mocks = { - [`${collection}/1/${associationField}:${action}`]: { - data: [ - { - name: 'admin', - title: 'Admin', - description: 'Admin description', - }, - { - name: 'developer', - title: 'Developer', - description: 'Developer description', - }, - ], - }, -}; - -const Root = createApp( - Demo, - { - components: { MyTable }, - scopes: { useTableProps, useBlockDecoratorProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/association-table-list-and-source-id.tsx b/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/association-table-list-and-source-id.tsx deleted file mode 100644 index e82fde3db..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/association-table-list-and-source-id.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import React from 'react'; -import { Select, Table, TableProps } from 'antd'; -import { SchemaComponent, UseDataBlockProps, useDataBlockRequest, withDynamicSchemaProps } from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; -import useUrlState from '@ahooksjs/use-url-state'; - -const collection = 'users'; -const associationField = 'roles'; - -const association = `${collection}.${associationField}`; -const action = 'list'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-use-decorator-props': 'useBlockDecoratorProps', - 'x-decorator-props': { - association, - action, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', - }, - }, -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - const { data, loading } = useDataBlockRequest(); - return { - loading, - dataSource: data?.data || [], - columns: [ - { - title: 'Name', - dataIndex: 'name', - }, - { - title: 'Title', - dataIndex: 'title', - }, - { - title: 'Description', - dataIndex: 'description', - }, - ], - }; -} - -const useBlockDecoratorProps: UseDataBlockProps<'CollectionList'> = () => { - const [state] = useUrlState({ userId: '1' }); - return { - sourceId: state.userId, - }; -}; - -const Demo = () => { - const [state, setState] = useUrlState({ userId: '1' }); - return ( - <> - - - - ); -}; - -const mocks = { - [`${collection}/1/${associationField}:${action}`]: { - data: [ - { - name: 'admin', - title: 'Admin', - description: 'Admin description', - }, - { - name: 'developer', - title: 'Developer', - description: 'Developer description', - }, - ], - }, - [`${collection}/2/${associationField}:${action}`]: { - data: [ - { - name: 'developer', - title: 'Developer', - description: 'Developer description', - }, - { - name: 'tester', - title: 'Tester', - description: 'Tester description', - }, - ], - }, - [`${collection}:get/1`]: { - id: 1, - username: 'Tom', - }, - [`${collection}:get/2`]: { - id: 1, - username: 'Jack', - }, -}; - -const Root = createApp( - Demo, - { - components: { MyTable }, - scopes: { useTableProps, useBlockDecoratorProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-create.tsx b/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-create.tsx deleted file mode 100644 index cddd88c89..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-create.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import React, { FC } from 'react'; -import { Button, Form, FormProps, Input, InputNumber, notification } from 'antd'; -import { SchemaComponent, useDataBlockResource, withDynamicSchemaProps } from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; - -interface DemoFormFieldType { - id: number; - username: string; - age: number; -} -type DemoFormProps = FormProps; -const DemoForm: FC = withDynamicSchemaProps((props) => { - return ( - - - label="Username" - name="username" - rules={[{ required: true, message: 'Please input your username!' }]} - > - - - - label="Age" - name="age" - rules={[{ required: true, message: 'Please input your age!' }]} - > - - - - - - - ); -}); - -function useDemoFormProps(): DemoFormProps { - const resource = useDataBlockResource(); - const onFinish = async (values: DemoFormFieldType) => { - console.log('values', values); - await resource.create({ - values, - }); - notification.success({ - message: 'Save successfully!', - }); - }; - - return { - onFinish, - }; -} - -const collection = 'users'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: collection, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'object', - 'x-component': 'DemoForm', - 'x-use-component-props': 'useDemoFormProps', - }, - }, -}; - -const Demo = () => { - return ; -}; - -const mocks = { - [`${collection}:create`]: (config) => { - console.log('config.data', config.data); - return [200, { msg: 'ok' }]; - }, -}; -const Root = createApp( - Demo, - { - components: { DemoForm }, - scopes: { useDemoFormProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-get-and-update.tsx b/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-get-and-update.tsx deleted file mode 100644 index ac5ecc5e5..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-get-and-update.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import React, { FC, useEffect } from 'react'; -import { Button, Form, FormProps, Input, InputNumber, Select, notification } from 'antd'; -import { - SchemaComponent, - UseDataBlockProps, - useDataBlockResource, - useCollectionRecordData, - withDynamicSchemaProps, -} from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; -import useUrlState from '@ahooksjs/use-url-state'; - -import { createApp } from '../../../data-source/demos/createApp'; - -interface DemoFormFieldType { - id: number; - username: string; - age: number; -} -type DemoFormProps = FormProps; -const DemoForm: FC = withDynamicSchemaProps((props) => { - return ( -
- - label="Username" - name="username" - rules={[{ required: true, message: 'Please input your username!' }]} - > - - - - label="Age" - name="age" - rules={[{ required: true, message: 'Please input your age!' }]} - > - - - - - - - ); -}); - -function useDemoFormProps(): DemoFormProps { - const data = useCollectionRecordData(); - const resource = useDataBlockResource(); - - const [form] = Form.useForm(); - - useEffect(() => { - form.setFieldsValue(data); - }, [data, form]); - - const onFinish = async (values: DemoFormFieldType) => { - console.log('values', values); - await resource.update({ - filterByTk: data.id, - values, - }); - notification.success({ - message: 'Save successfully!', - }); - }; - - return { - initialValues: data, - preserve: true, - onFinish, - form, - }; -} -const useBlockDecoratorProps: UseDataBlockProps<'CollectionGet'> = () => { - const [state] = useUrlState({ id: '1' }); - return { - filterByTk: state.id, - }; -}; - -const collection = 'users'; -const action = 'get'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-use-decorator-props': 'useBlockDecoratorProps', - 'x-decorator-props': { - collection: collection, - action: action, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'object', - 'x-component': 'DemoForm', - 'x-use-component-props': 'useDemoFormProps', - }, - }, -}; - -const Demo = () => { - const [state, setState] = useUrlState({ id: '1' }); - - return ( - <> - - - - ); -}; - -const mocks = { - [`${collection}:${action}`]: function (config) { - const { filterByTk } = config.params; - return { - data: - Number(filterByTk) === 1 - ? { - id: 1, - username: 'Bamboo', - age: 18, - } - : { - id: 2, - username: 'Mary', - age: 25, - }, - }; - }, - [`${collection}:update`]: function (config) { - console.log('config.data', config.data); - return { - data: 'ok', - }; - }, -}; -const Root = createApp( - Demo, - { - components: { DemoForm }, - scopes: { useDemoFormProps, useBlockDecoratorProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-record-and-update.tsx b/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-record-and-update.tsx deleted file mode 100644 index 98cb58170..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-form-record-and-update.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, { FC, useEffect } from 'react'; -import { Button, Form, FormProps, Input, InputNumber, notification } from 'antd'; -import { - CollectionRecordProvider, - SchemaComponent, - UseDataBlockProps, - useDataBlockResource, - useCollectionRecordData, - withDynamicSchemaProps, -} from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; - -interface DemoFormFieldType { - id: number; - username: string; - age: number; -} -type DemoFormProps = FormProps; -const DemoForm: FC = withDynamicSchemaProps((props) => { - return ( -
- - label="Username" - name="username" - rules={[{ required: true, message: 'Please input your username!' }]} - > - - - - label="Age" - name="age" - rules={[{ required: true, message: 'Please input your age!' }]} - > - - - - - - - ); -}); - -function useDemoFormProps(): DemoFormProps { - const data = useCollectionRecordData(); - const resource = useDataBlockResource(); - - const [form] = Form.useForm(); - - useEffect(() => { - form.setFieldsValue(data); - }, [data, form]); - - const onFinish = async (values: DemoFormFieldType) => { - console.log('values', values); - await resource.update({ - filterByTk: data.id, - values, - }); - notification.success({ - message: 'Save successfully!', - }); - }; - - return { - initialValues: data, - preserve: true, - onFinish, - form, - }; -} -const useFormBlockDecoratorProps: UseDataBlockProps<'CollectionRecord'> = () => { - const record = useCollectionRecordData(); - return { - record, - }; -}; - -const collection = 'users'; -const action = 'get'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-use-decorator-props': 'useFormBlockDecoratorProps', - 'x-decorator-props': { - collection: collection, - action: action, - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'object', - 'x-component': 'DemoForm', - 'x-use-component-props': 'useDemoFormProps', - }, - }, -}; - -const recordData = { - id: 1, - username: 'Bamboo', - age: 18, -}; - -const Demo = () => { - return ( - <> - - - - - ); -}; - -const mocks = { - [`${collection}:update`]: function (config) { - console.log('config.data', config.data); - return { - data: 'ok', - }; - }, -}; -const Root = createApp( - Demo, - { - components: { DemoForm }, - scopes: { useDemoFormProps, useFormBlockDecoratorProps }, - }, - mocks, -); - -export default Root; diff --git a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-table-list.tsx b/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-table-list.tsx deleted file mode 100644 index 6da749168..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/collection-table-list.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import { Table, TableProps } from 'antd'; -import { SchemaComponent, useDataBlockRequest, withDynamicSchemaProps } from '@nocobase/client'; -import { ISchema } from '@nocobase/schema'; - -import { createApp } from '../../../data-source/demos/createApp'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: 'users', - action: 'list', - }, - 'x-component': 'CardItem', - properties: { - demo: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', // 动态 table 属性 - }, - }, -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - const { data, loading } = useDataBlockRequest(); - return { - loading, - dataSource: data?.data || [], - columns: [ - { - title: 'UserName', - dataIndex: 'username', - }, - { - title: 'NickName', - dataIndex: 'nickname', - }, - { - title: 'Email', - dataIndex: 'email', - }, - ], - }; -} - -const Demo = () => { - return ; -}; - -const Root = createApp(Demo, { - components: { MyTable }, - scopes: { useTableProps }, -}); - -export default Root; diff --git a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/complete-demo.tsx b/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/complete-demo.tsx deleted file mode 100644 index 8135d9310..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/demos/data-block-provider/complete-demo.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import React, { useMemo } from 'react'; -import { - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - SchemaSettings, - useDataBlockRequest, - useCollectionManager, - useCollection, - useCompile, - useDataBlockProps, - useDataBlock, - useSchemaInitializer, - useSchemaInitializerRender, - withDynamicSchemaProps, -} from '@nocobase/client'; - -import { createApp } from '../../../data-source/demos/createApp'; -import { Table, TableProps } from 'antd'; -import { ISchema } from '@nocobase/schema'; -import { observer, useFieldSchema } from '@nocobase/schema'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-component': 'Page', - 'x-initializer': 'MyInitializer', -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - const { tableProps } = useDataBlockProps(); - const { data, loading } = useDataBlockRequest(); - const compile = useCompile(); - const collection = useCollection(); - const columns = useMemo(() => { - return collection.getFields().map((field) => { - return { - title: compile(field.uiSchema?.title || field.name), - dataIndex: field.name, - }; - }); - }, [collection, compile]); - return { - ...tableProps, - loading, - dataSource: data?.data || [], - columns, - }; -} - -const MyTableSettings = new SchemaSettings({ - name: 'MyTableSettings', - items: [ - { - name: 'bordered', - type: 'switch', - useComponentProps() { - const { props: blockSettingsProps, dn } = useDataBlock(); - - return { - title: 'Bordered', - checked: !!blockSettingsProps.tableProps?.bordered, - onChange: (checked) => { - // 修改 schema - dn.deepMerge({ 'x-decorator-props': { tableProps: { bordered: checked } } }); - }, - }; - }, - }, - ], -}); - -const TableDataBlockInitializer = () => { - const { insert } = useSchemaInitializer(); - const handleClick = ({ item }) => { - insert({ - type: 'void', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: item.value, - action: 'list', - tableProps: { - bordered: true, // 用于设置是否显示边框 - }, - }, - 'x-settings': 'MyTableSettings', - 'x-component': 'CardItem', - 'x-toolbar-props': { - draggable: false, - }, - properties: { - table: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', // 动态 table 属性 - }, - }, - }); - }; - const compile = useCompile(); - const collectionManager = useCollectionManager(); - const collectionMenuItems = useMemo( - () => - collectionManager.getCollections().map((collection) => { - return { - label: compile(collection.getOption('title')), - value: collection.getOption('name'), - }; - }), - [collectionManager, compile], - ); - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - items: [ - { - name: 'table', - Component: TableDataBlockInitializer, - }, - ], -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ; -}; - -const App = createApp(Root, { - components: { MyTable, Page }, - scopes: { useTableProps }, - schemaSettings: [MyTableSettings], - schemaInitializers: [myInitializer], -}); - -export default App; diff --git a/packages/core/client/docs/zh-CN/core/data-block/demos/settings/demo1.tsx b/packages/core/client/docs/zh-CN/core/data-block/demos/settings/demo1.tsx deleted file mode 100644 index 2bfc15af2..000000000 --- a/packages/core/client/docs/zh-CN/core/data-block/demos/settings/demo1.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import React from 'react'; -import { - SchemaComponent, - SchemaSettings, - useDataBlockRequest, - useDataBlock, - withDynamicSchemaProps, -} from '@nocobase/client'; - -import { createApp } from '../../../data-source/demos/createApp'; -import { Table, TableProps } from 'antd'; -import { ISchema } from '@nocobase/schema'; - -const schema: ISchema = { - type: 'void', - name: 'root', - 'x-decorator': 'DataBlockProvider', - 'x-decorator-props': { - collection: 'users', - action: 'list', - bordered: true, // 用于设置是否显示边框 - }, - 'x-settings': 'MyTableSettings', - 'x-component': 'CardItem', - 'x-toolbar-props': { - draggable: false, - }, - properties: { - demo: { - type: 'array', - 'x-component': 'MyTable', - 'x-use-component-props': 'useTableProps', // 动态 table 属性 - }, - }, -}; - -const MyTable = withDynamicSchemaProps(Table); - -function useTableProps(): TableProps { - // 获取 - const { props } = useDataBlock(); - const { bordered } = props; - const { data, loading } = useDataBlockRequest(); - return { - bordered, - loading, - dataSource: data?.data || [], - columns: [ - { - title: 'Name', - dataIndex: 'name', - }, - { - title: 'Age', - dataIndex: 'age', - }, - { - title: 'Address', - dataIndex: 'address', - }, - ], - }; -} - -const MyTableSettings = new SchemaSettings({ - name: 'MyTableSettings', - items: [ - { - name: 'bordered', - type: 'switch', - useComponentProps() { - // 获取 - const { props: blockSettingsProps, dn } = useDataBlock(); - const { bordered } = blockSettingsProps; - - return { - title: 'Bordered', - checked: bordered, - onChange: (checked) => { - // 修改 - dn.deepMerge({ 'x-decorator-props': { bordered: checked } }); - }, - }; - }, - }, - ], -}); - -const Demo = () => { - return ; -}; - -const Root = createApp(Demo, { - components: { MyTable }, - scopes: { useTableProps }, - schemaSettings: [MyTableSettings], -}); - -export default Root; diff --git a/packages/core/client/docs/zh-CN/core/data-block/images/data-block.png b/packages/core/client/docs/zh-CN/core/data-block/images/data-block.png deleted file mode 100644 index 0ac7ee8e8384fc3e3d06e5524057ff2733782a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29926 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 VA+8S%cL=_is*)z8=%K}%{{aoWtTzAv diff --git a/packages/core/client/docs/zh-CN/core/data-block/images/markdown-block.png b/packages/core/client/docs/zh-CN/core/data-block/images/markdown-block.png deleted file mode 100644 index 9c9c351bea39a9c7da0560e32549ee345a70665e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4962 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 CR~zX7 diff --git a/packages/core/client/docs/zh-CN/core/data-source/association-provider.md b/packages/core/client/docs/zh-CN/core/data-source/association-provider.md deleted file mode 100644 index 97da3d3ab..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/association-provider.md +++ /dev/null @@ -1,13 +0,0 @@ -# AssociationProvider - -用于传递关联数据字段以及对应的数据表信息,等同于 `CollectionFieldProvider` + `CollectionProvider`。 - -```tsx | pure -const AssociationProvider = - - {children} - - -``` - -关于关系字段的更多信息,请参考 [关系字段](https://docs.nocobase.com/development/server/collections/association-fields) 以及 [CollectionField](/core/data-source/collection-field)。 diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-field-interface-manager.md b/packages/core/client/docs/zh-CN/core/data-source/collection-field-interface-manager.md deleted file mode 100644 index b589784e5..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-field-interface-manager.md +++ /dev/null @@ -1,171 +0,0 @@ -# CollectionFieldInterfaceManager - -主要是用来管理 [CollectionFieldInterface](./collection-field-interface.md) 和 [CollectionFieldInterfaceGroups](#collectionfieldinterfacegroups),其被 [DataSourceManager](./data-source-manager) 管理。 - - -## CollectionFieldInterfaceGroups - -CollectionFieldInterfaceGroups 是用来对数据表字段进行分组的。 - -![Field Groups](./images/field-groups.png) - -## 实例方法 - -### field interface - -#### addFieldInterfaces() - -添加 field interface。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - addFieldInterfaces(fieldInterfaces: CollectionFieldInterface[]): void -} -``` - -- 示例 - -```tsx | pure -class CheckboxFieldInterface extends CollectionFieldInterface { - name = 'checkbox'; - type = 'object'; - group = 'choices'; - title = '{{t("Checkbox")}}'; - // ... -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaces([CheckboxFieldInterface]); - // or - this.app.dataSourceManager.addFieldInterfaces([CheckboxFieldInterface]); - } -} -``` - -#### getFieldInterface() - -获取 field interface。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - getFieldInterface(name: string): T; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const fieldInterface = this.app.dataSourceManager.collectionFieldInterfaceManager.getFieldInterface('checkbox'); // checkboxFieldInterface - } -} -``` - -#### getFieldInterfaces() - -获取所有的 field interface。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - getFieldInterfaces(): CollectionFieldInterface[]; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const fieldInterfaces = this.app.dataSourceManager.collectionFieldInterfaceManager.getFieldInterfaces(); - } -} -``` - -### field interface group - -#### addFieldInterfaceGroups() - -添加 field interface group。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - addFieldInterfaceGroups(fieldGroups: Record): void; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaceGroups({ - 'test': { - label: 'Test', - order: 1, - } - }); - - // or - this.app.dataSourceManager.addFieldInterfaceGroups({ - 'test': { - label: 'Test', - order: 1, - } - }); - } -} -``` - -#### getFieldInterfaceGroups() - -获取所有的 field interface group。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - getFieldInterfaceGroups(): Record; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const fieldInterfaceGroups = this.app.dataSourceManager.collectionFieldInterfaceManager.getFieldInterfaceGroups(); // { 'test': { label: 'Test', order: 1 } } - } -} -``` - -#### getFieldInterfaceGroup() - -获取 field interface group。 - -- 类型 - -```tsx | pure -class CollectionFieldInterfaceManager { - getFieldInterfaceGroup(name: string): { label: string; order?: number }; -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const fieldInterfaceGroup = this.app.dataSourceManager.collectionFieldInterfaceManager.getFieldInterfaceGroup('test'); // { label: 'Test', order: 1 } - } -} -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-field-interface.md b/packages/core/client/docs/zh-CN/core/data-source/collection-field-interface.md deleted file mode 100644 index bb2c1aebf..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-field-interface.md +++ /dev/null @@ -1,94 +0,0 @@ -# CollectionFieldInterface - -用于创建数据字段。 - -![](./images/collection-field-interface.png) - -```ts -class CollectionFieldInterface { - app: Application; - collectionManager: CollectionManager; - - name: string; - group: string; - title?: string; - description?: string; - order?: number; - default?: { - type: string; - uiSchema?: ISchema; - [key: string]: any; - }; - sortable?: boolean; - availableTypes?: string[]; - hasDefaultValue?: boolean; - isAssociation?: boolean; - operators?: any[]; - filterable?: { - operators?: any[]; - children?: any[]; - [key: string]: any; - }; - titleUsable?: boolean; - - validateSchema(fieldSchema: ISchema): Record - usePathOptions(field: CollectionFieldOptions): any - schemaInitialize(schema: ISchema, data: any): void - - getOption(key: K): CollectionFieldInterfaceOptions[K] - getOptions(): CollectionFieldInterfaceOptions; - setOptions(options: CollectionFieldInterfaceOptions): void; -} -``` - -其需要结合 [CollectionManager](./collection-field-interface-manager.md) 使用。 - -```ts -class EmailFieldInterface extends CollectionFieldInterface { - name = 'email'; - type = 'object'; - group = 'basic'; - order = 4; - title = '{{t("Email")}}'; - sortable = true; - // ... -} - -class MyPlugin extends Plugin { - load() { - this.app.dataSourceManager.addFieldInterfaces([ EmailFieldInterface ]); - } -} -``` - -## 实例属性 - -### name - -唯一标识符。 - -### group - -分组。 - -### title - -标题。 - -### default - -配置表单默认值字段 schema。 - -![](./images/collection-field-interface-form.png) - - -## 实例方法 - -### collectionFieldInterface.validateSchema(fieldSchema) - - -### collectionFieldInterface.usePathOptions(field: CollectionFieldOptions) - - -### collectionFieldInterface.schemaInitialize(schema: ISchema, data: any) - diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-field.md b/packages/core/client/docs/zh-CN/core/data-source/collection-field.md deleted file mode 100644 index 3f64b94a6..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-field.md +++ /dev/null @@ -1,164 +0,0 @@ -# CollectionField - -NocoBase 将字段的 schema 分为 2 部分,一部分在 schema 中,一部分在 collection 中。例如: - -```tsx | pure -const schema = { - properties: { - username: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - }, - } -} - -const collection = { - fields: [ - { - type: 'string', - name: 'username', - interface: 'input', - uiSchema: { - title: 'UserName', - type: 'string', - 'x-component': 'Input', - required: true, - description: 'description1', - } as ISchema, - } - ], -} -``` - -两者通过 `name: username` 联系起来,`CollectionField` 会自动读取 schema `name` 属性,并根据 `name` 属性查找 collection 中对应的 `uiSchema` 属性,然后拼接到 schema 中,进行渲染。 - -这样做的好处是,对于同一个字段创建的内容,可以在不同的地方共享同一个 schema,当 schema 变化时,只需要修改一处即可。比如通过上面的 `title: "UserName"` 假设变化 `title: "Name"` 则所有使用到此字段的地方都会变化。 - - - -## CollectionFieldOptions - -字段的配置项。 - -```ts -interface CollectionFieldOptions { - name?: any; - collectionName?: string; - sourceKey?: string; - uiSchema?: ISchema; - target?: string; - - [key: string]: any; -} -``` - -### 普通字段和关系字段 - -字段有 2 种情况,一种是普通字段,一种是 [关系字段](https://docs-cn.nocobase.com/development/server/collections/association-fields)。 - -关系字段是指,字段的值是另一个 collection 的数据,例如 `users` 和 `roles` 两个 collection,`users` 中有一个字段 `roles`,其值是 `roles` collection 的数据,那么 `roles` 就是一个关系字段。 - -普通字段的示例如下: - -```json -{ - "key": "ootprgkoawo", - "name": "email", - "type": "string", - "interface": "email", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "unique": true, - "uiSchema": { - "type": "string", - "title": "{{t(\"Email\")}}", - "x-component": "Input", - "x-validator": "email", - "required": true - } -} -``` - -关系字段的示例如下: - -```json -{ - "key": "t09bauwm0wb", - "name": "roles", - "type": "belongsToMany", - "interface": "m2m", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "target": "roles", - "foreignKey": "userId", - "otherKey": "roleName", - "onDelete": "CASCADE", - "sourceKey": "id", - "targetKey": "name", - "through": "rolesUsers", - "uiSchema": { - "type": "array", - "title": "{{t(\"Roles\")}}", - "x-component": "AssociationField", - "x-component-props": { - "multiple": true, - "fieldNames": { - "label": "title", - "value": "name" - } - } - } -} -``` - -相对于普通字段,关系字段多了以下属性: - -- xx -- xx - -### 全部字段说明 - -- `name`:字段名称 -- `collectionName`:数据表名称 -- `sourceKey`:当字段为关系字段时,对应的关系字段名称。 - -TODO:补全 - -## Hooks - -### useCollectionField() - -用于获取字段信息。 - -```tsx | pure -const collection = { - fields: [ - { - type: 'string', - name: 'username', - interface: 'input', - uiSchema: { - title: 'UserName', - type: 'string', - 'x-component': 'Input', - required: true, - description: 'description1', - } as ISchema, - } - ], -} - -const { uiSchema } = useCollectionField() -const required = uiSchema?.required -``` - -其通常在 [SchemaSettings](/core/ui-schema/schema-settings) 中使用,用来获取和修改字段的属性。 - - - - - diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-manager-provider.md b/packages/core/client/docs/zh-CN/core/data-source/collection-manager-provider.md deleted file mode 100644 index b37a6a27f..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-manager-provider.md +++ /dev/null @@ -1,52 +0,0 @@ -# CollectionManagerProvider - -用于提供 [CollectionManager](/core/data-source/collection-manager) 实例。 - -## 组件 - -- 类型 - -```tsx | pure -interface CollectionManagerProviderProps { - instance?: CollectionManager; - dataSource?: string; - children?: ReactNode; -} -``` - -- 参数详解 - - `dataSource` - 数据源名称,如果为空,则会取默认数据源。 - - `instance` - CollectionManager 实例,如果没有,则会取 `dataSource` 对应的 collectionManager。 - -- 示例 - -```tsx | pure -const collectionManager = new CollectionManager(); - -const Demo = () => { - return ( - -
...
-
- ); -}; -``` - -## Hooks - -### useCollectionManager() - -用于获取 `CollectionManagerProvider` 传递的实例。 - -- 示例 - -```tsx | pure -const Demo = () => { - const collectionManager = useCollectionManager(); - const collections = collectionManager.getCollections() - - return
-
{JSON.stringify(collections, null, 2)}
-
; -}; -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-manager.md b/packages/core/client/docs/zh-CN/core/data-source/collection-manager.md deleted file mode 100644 index 5df92575d..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-manager.md +++ /dev/null @@ -1,175 +0,0 @@ -# CollectionManager - -用于管理 [Collection](./collection.md),其被 [DataSource](./data-source.md) 管理。 - -## 实例方法 - -### addCollections(collections) - -添加数据表。 - -- 类型 - -```tsx | pure -class CollectionManager { - addCollections(collections: CollectionOptions[]): void -} -``` - -- 示例 - -```tsx | pure -const userCollectionOptions = { - "name": "users", - "title": "Users", - fields: [ - // ... - ], -}; - -collectionManager.addCollections([userCollectionOptions]); -``` - -### setCollections(collections) - -重置数据表,会先移除所有数据表,然后再调用 `addCollections()` 添加数据表。 - -- 类型 - -```tsx | pure -class CollectionManager { - setCollections(collections: CollectionOptions[]): void -} -``` - -### reAddCollections(collections) - -由于 [CollectionTemplate](./collection-template.md) 或者 [CollectionMixins](./collection-mixins.md) 的添加会影响 Collection 的实例化,所以提供了重新添加数据表的方法。 - -- 类型 - -```tsx | pure -class CollectionManager { - reAddCollections(collectionInstances: Collection[]): void -} -``` - -- 示例 - -```tsx | pure -const userCollectionInstance = collectionManager.getCollection('users'); -collectionManager.reAddCollections([userCollectionInstance]); -``` - -### getCollections(predicate?) - -获取数据表。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollections(predicate?: (collection: Collection) => boolean) -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollections(); // [ userCollection ] - -collectionManager.getCollections(collection => collection.name === 'posts'); // [ postCollection ] -``` - - -### getCollection(path) - -获取数据表。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollection(path: string): (Mixins & Collection) | undefined -} -``` - -- 详细解释 - - `path` 参数可以是数据表名称,也可以是[关系字段](https://docs.nocobase.com/development/server/collections/association-fields)路径。 - - `path: 'users'`: 获取 `users` 数据表 - - `path: 'users.posts'`: 获取 `users` 数据表的 `posts` 关联字段对应的数据表,即 `postCollection` - -- 示例 - -```tsx | pure -collectionManager.getCollection('users'); // userCollection - -collectionManager.getCollection('users.posts'); // postCollection -collectionManager.getCollection('users.profileId'); // profileCollection -``` - -结合 Mixin 使用: - -```tsx | pure -const collection = collectionManager.getCollection('users'); -const collection = collectionManager.getCollection('users'); -``` - -### getCollectionFields(collectionName) - -获取数据表字段列表。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollectionFields(collectionName: string): CollectionFieldOptions[]; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionFields('users'); // [ { name: 'username', type: 'string', title: 'Username', .. }, { name: 'password', type: 'password', title: 'Password', .. } ] -``` - -### getCollectionName(path) - -获取数据表名称。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollectionName(path: string: GetCollectionOptions): string | undefined; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionName('users'); // 'users' - -collectionManager.getCollectionName('users.profiles'); // 'profiles' -``` - - -### getCollectionField(path) - -获取数据表字段。 - -- 类型 - -```tsx | pure -class CollectionManager { - getCollectionField(path: string: GetCollectionOptions): CollectionFieldOptions | undefined; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionField('users.username'); // { name: 'username', type: 'string', title: 'Username', .. } - -collectionManager.getCollectionField('users.roles.name'); // 获取 roles 关联字段对应的 roles 表中的 name 字段 -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-mixins.md b/packages/core/client/docs/zh-CN/core/data-source/collection-mixins.md deleted file mode 100644 index 6512fccc3..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-mixins.md +++ /dev/null @@ -1,57 +0,0 @@ - -## Collection Mixins - -Collection Mixins 是为扩展 Collection 类提供的一种机制,可以通过 `dataSourceManager.addCollectionMixins()` 添加 Collection Mixins。 - -### 定义和注册 - -```tsx | pure -import { Collection, Plugin } from '@nocobase/client'; - -class TestMixin extends Collection { - test() { - const { name } = this.options; - return 'test '+ name; - } -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addCollectionMixins([TestMixin]); - } -} -``` - -### 使用 - -- 使用方式1:在 `CollectionManager` 实例上调用 `getCollection()` 获取指定 `Collection` 实例。 - -```tsx | pure -const Demo = () => { - const cm = useCollectionManager(); - const userCollection = cm.getCollection('users'); - - userCollection.test(); // 'test users' -} -``` - -- 使用方式2:调用 `useCollection()` 获取当前上下文的数据表信息。 - -```tsx | pure -const Demo = () => { - const collection = useCollection(); - collection.test(); // 'test users' -} -``` - -### 多个 Mixins 的使用 - -如果添加了 Mixins,可通过如下方式获得类型提示: - -```tsx | pure -const Demo = () => { - const collection = useCollection(); -} -``` - - diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-provider.md b/packages/core/client/docs/zh-CN/core/data-source/collection-provider.md deleted file mode 100644 index 141187df8..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-provider.md +++ /dev/null @@ -1,63 +0,0 @@ -# CollectionProvider - -用于提供 [Collection](/core/data-source/collction) 实例。 - -## 组件 - -### CollectionProvider - -- 类型 - -```tsx | pure -interface CollectionProviderProps { - name: string; - dataSource?: string; - children?: ReactNode; -} -``` - -- 详解 - -组件会根据 `name` 去 [CollectionManager](/core/data-source/collection-manager) 中查询数据表信息,如果查询不到,则会不进行渲染。 - -`dataSource` 用于指定数据表所在的[命名空间](/core/data-source/collection-manager#datasource),如果不指定,则默认命名空间。 - -- 示例 - -```tsx | pure -import { CollectionProvider } from '@nocobase/client'; - -const MyComponent = () => { - return ( - -
...
-
- ) -} -``` - - -## Hooks - -### useCollection() - -用于获取 `CollectionProvider` 传递的 `Collection` 实例。 - -```tsx | pure -const collection = useCollection() - -console.log(collection instanceof Collection) // true -console.log(collection); -``` - -结合 Mixin 使用: - -```tsx | pure -const collection = useCollection() -const collection = useCollection() -``` - -## 示例 - - - diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-template-manager.md b/packages/core/client/docs/zh-CN/core/data-source/collection-template-manager.md deleted file mode 100644 index 1ff0bffea..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-template-manager.md +++ /dev/null @@ -1,86 +0,0 @@ -# CollectionTemplateManager - -用于管理 [CollectionTemplate](./collection-template),其被 [DataSourceManager](./data-source-manager) 管理。 - -## 实例方法 - -### addCollectionTemplates() - -用于添加 collection template。 - -- 类型 - -```tsx | pure -class CollectionTemplateManager { - addCollectionTemplates(templates: CollectionTemplate[]): void; -} -``` - -- 示例 - -```tsx | pure -class SqlCollectionTemplate extends CollectionTemplate { - name = 'sql'; - type = 'object'; - title = '{{t("SQL collection")}}'; - configurableProperties = { - // ... - } -} - -class TreeCollectionTemplate extends CollectionTemplate { - name = 'tree'; - type = 'object'; - title = '{{t("Tree collection")}}'; - configurableProperties = { - // ... - } -} - -class MyPlugin extends Plugin { - async load() { - this.dataSourceManager.collectionTemplateManager.addCollectionTemplates([ SqlCollectionTemplate, TreeCollectionTemplate ]); - - // or - this.dataSourceManager.addCollectionTemplates([ SqlCollectionTemplate, TreeCollectionTemplate ]); - } -} -``` - -### getCollectionTemplate() - -用于获取 collection template。 - -- 类型 - -```tsx | pure -class CollectionTemplateManager { - getCollectionTemplate(name: string): CollectionTemplate; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionTemplate(); // generalCollectionTemplate - -collectionManager.getCollectionTemplate('tree'); // treeCollectionTemplate -``` - -### getCollectionTemplates() - -用于获取所有 collection templates。 - -- 类型 - -```tsx | pure -class CollectionTemplateManager { - getCollectionTemplates(): CollectionTemplate[]; -} -``` - -- 示例 - -```tsx | pure -collectionManager.getCollectionTemplates(); // [ generalCollectionTemplate, treeCollectionTemplate, sqlCollectionTemplate ] -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection-template.md b/packages/core/client/docs/zh-CN/core/data-source/collection-template.md deleted file mode 100644 index eb248e519..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection-template.md +++ /dev/null @@ -1,249 +0,0 @@ -# CollectionTemplate - -用于创建数据表的模板。 - -![](./images/collection-template.png) - -```ts -interface AvailableFieldInterfacesInclude { - include?: any[]; -} - -interface AvailableFieldInterfacesExclude { - exclude?: any[]; -} - -interface CollectionTemplateDefaultOptions { - /** - * 自动生成 id - * @default true - * */ - autoGenId?: boolean; - /** 创建人 */ - createdBy?: boolean; - /** 最后更新人 */ - updatedBy?: boolean; - /** 创建日期 */ - createdAt?: boolean; - /** 更新日期 */ - updatedAt?: boolean; - /** 可排序 */ - sortable?: boolean; - /* 树结构 */ - tree?: string; - /* 日志 */ - logging?: boolean; - /** 继承 */ - inherits?: string | string[]; - /* 字段列表 */ - fields?: CollectionOptions['fields']; -} - -class CollectionTemplate { - app: Application; - collectionManager: CollectionManager; - - name: string; - Collection?: typeof Collection; - transform?: (collection: CollectionOptions, app: Application) => CollectionOptions; - title?: string; - color?: string; - /** 排序 */ - order?: number; - /** 默认配置 */ - default?: CollectionTemplateDefaultOptions; - events?: any; - /** UI 可配置的 CollectionOptions 参数(添加或编辑的 Collection 表单的字段) */ - configurableProperties?: Record; - /** 当前模板可用的字段类型 */ - availableFieldInterfaces?: AvailableFieldInterfacesInclude | AvailableFieldInterfacesExclude; - /** 是否分割线 */ - divider?: boolean; - /** 模板描述 */ - description?: string; - /**配置字段中的操作按钮 */ - configureActions?: Record; - //是否禁止删除字段 - forbidDeletion?: boolean; -} -``` - -其需要结合 [CollectionManager](./collection-template-manager.md) 使用。 - -```ts -import { Plugin, Collection, CollectionTemplate } from '@nocobase/client'; - -class SqlCollection extends Collection { - otherMethods() { - // ... - } -} - -class SqlCollectionTemplate extends CollectionTemplate { - name = 'sql'; - Collection = SqlCollection; // 自定义的数据表类 - title = '{{t("SQL collection")}}'; - order = 4; - color = 'yellow'; - default = { - fields: [], - }; - configurableProperties = { - // ... - } -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionTemplateManager.addCollectionTemplates([ SqlCollectionTemplate ]); - - // or - this.app.dataSourceManager.addCollectionTemplates([ SqlCollectionTemplate ]); - } -} -``` - -## 实例属性 - -### name - -模板的唯一标识符。 - - -### Collection - -模板对应的数据表类。 - -在创建数据表后,Collection 会有 [template 字段](/core/data-source/collection#collectionoptions),用于标识该数据表是由哪个模板创建的。 - -当通过 `collectionManager.addCollections()` 添加数据表对象时,会先读取 `collection.template` 字段,然后通过 `collectionManager.getCollectionTemplate(collection.template)` 获取到 `collectionTemplate`。 - -读取 `collectionTemplate.Collection` 字段,并通过 `new collectionTemplate.Collection(collection)` 创建对应的实例。 - -如果不传递 `Collection`,则会通过 `new Collection(collection)` 创建对应的实例。 - -```ts -class SqlCollection extends Collection { - otherMethods() { - // ... - } -} - -class SqlCollectionTemplate extends CollectionTemplate { - name = 'sql'; - Collection = SqlCollection; // 自定义的数据表类 - // ... -} - -const userCollection = { - name: 'users', - template: 'sql', - // ... -} - -// 内部会调用 new SqlCollection(userCollection) -``` - -### title - -模板的标题。 - -### color - -模板的颜色。 - -### order - -模板的排序。 - -### events - -- `beforeSubmit`:提交前触发 - - -### configurableProperties - -表单配置项。 - -![](./images//collection-template-form.png) - -```ts -class SqlCollectionTemplate extends CollectionTemplate { - name = 'sql', - // ... - configurableProperties = { - title: { - type: 'string', - title: '{{ t("Collection display name") }}', - required: true, - 'x-decorator': 'FormItem', - 'x-component': 'Input', - }, - name: { - type: 'string', - title: '{{t("Collection name")}}', - required: true, - 'x-disabled': '{{ !createOnly }}', - 'x-decorator': 'FormItem', - 'x-component': 'Input', - 'x-validator': 'uid', - description: - "{{t('Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.')}}", - }, - // ... - }, -} -``` - -### default - -表单默认值。 - - - -## 实例方法 - -### collectionTemplate.transform(collection) - -collection 创建后,会调用该方法,用于对 collection 进行转换。 - -## Utils - -### getConfigurableProperties() - -用于获取内置的配置项字段。 - -- 类型 - -```tsx | pure -export type DefaultConfigurableKeys = - | 'name' - | 'title' - | 'inherits' - | 'category' - | 'autoGenId' - | 'createdBy' - | 'updatedBy' - | 'createdAt' - | 'updatedAt' - | 'sortable' - | 'description' - | 'moreOptions'; - -const getConfigurableProperties: (...keys: DefaultConfigurableKeys[]) => Record -``` - -- 示例 - -```tsx | pure -import { getConfigurableProperties } from '@nocobase/client'; - -const sqlCollectionTemplate = new CollectionTemplate({ - name: 'sql', - // ... - configurableProperties: { - ...getConfigurableProperties('name', 'title', 'description'), - // ... - }, -}); -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/collection.md b/packages/core/client/docs/zh-CN/core/data-source/collection.md deleted file mode 100644 index 5cce1e551..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/collection.md +++ /dev/null @@ -1,293 +0,0 @@ -# Collection - -Collection 数据表类,其被 [CollectionManager](/core/data-source/collection-manager) 管理。 - -## 类型 - -```tsx | pure -interface CollectionOptions { - name: string; - title?: string; - fields?: FieldOptions[]; - // .... -} - -class Collection { - app: Application; - collectionManager: CollectionManager; - - constructor(options: CollectionOptions) {} - - name: string; - primaryKey: string; - titleField: string; - - getOptions(): CollectionOptions; - setOptions(options: CollectionOptions): void; - getOption(key: K): CollectionOptions[K]; - - getFields(predicate?: CollectionFieldOptions | ((collection: CollectionFieldOptions) => boolean) | keyof CollectionFieldOptions): any[] - getField(name: SchemaKey): CollectionFieldOptions - hasField(name: SchemaKey): boolean; -} -``` - -```tsx | pure -const usersCollection = new Collection({ - name: 'users', - title: 'Users', - fields: [ - { - type: 'string', - name: 'username', - }, - { - type: 'integer', - name: 'age', - }, - ], -}); -``` - -## CollectionOptions - -```tsx | pure -export interface CollectionOptions { - name: string; - title?: string; - dataSource?: string; - /** - * Used for @nocobase/plugin-duplicator - * @see packages/core/database/src/collection-group-manager.tss - * - * @prop {'required' | 'optional' | 'skip'} dumpable - Determine whether the collection is dumped - * @prop {string[] | string} [with] - Collections dumped with this collection - * @prop {any} [delayRestore] - A function to execute after all collections are restored - */ - duplicator?: - | dumpable - | { - dumpable: dumpable; - with?: string[] | string; - delayRestore?: any; - }; - - tableName?: string; - inherits?: string[] | string; - inherit?: string; - key?: string; - viewName?: string; - writableView?: boolean; - - filterTargetKey?: string; - fields?: CollectionFieldOptions[]; - model?: any; - repository?: any; - sortable?: CollectionSortable; - /** - * @default true - */ - autoGenId?: boolean; - /** - * @default 'options' - */ - magicAttribute?: string; - - tree?: string; - - template?: string; - - isThrough?: boolean; - autoCreate?: boolean; - resource?: string; - collectionName?: string; - sourceKey?: string; - uiSchema?: any; - [key: string]: any; -} -``` - -- name: Collection 的标识,必须唯一。 - -- title: Collection 的标题,用于显示。 - -- fields: 字段列表,详细说明请查看 [CollectionField](/core/data-source/collection-field) - -- template: 模板标识,用于标识该 Collection 是由哪个模板创建的,详细说明请查看 [CollectionTemplate](/core/data-source/collection-template) - -- dataSource: 数据源标识,用于标识该 Collection 是由哪个数据源创建的,详细说明请查看 [CollectionDataSource](/core/data-source/collection-manager#datasource) - -- duplicator - -- tableName - -- inherits - -- viewName - -- writableView - -- filterTargetKey - -- model - -- repository - - -## 实例属性 - -### collection.collectionManager - -[CollectionManager](/core/data-source/collection-manager) 的实例。 - -### collection.titleFieldName - -标题字段的 name 属性。 - -### 其他属性 - -其他属性同 [CollectionOptions](/core/data-source/collection#collectionoptions)。 - -## 实例方法 - -### collection.getOptions() - -获取 collection 的所有配置项。 - -- 类型 - -```tsx | pure -class Collection { - getOptions(): CollectionOptions; -} -``` - -- 示例 - -```tsx | pure -const usersCollection = new Collection({ - name: 'users', - title: 'Users', - fields: [ - // ... - ], -}); - -console.log(usersCollection.getOptions()); // { name: 'users', title: 'Users', fields: [ ] } -``` - -### collection.setOptions(options) - -设置 collection 的配置项,最终会和默认配置项进行合并。 - -- 类型 - -```tsx | pure -class Collection { - setOptions(options: CollectionOptions): void; -} -``` - -- 示例 - -```tsx | pure -collection.setOptions({ - name: 'users', - title: 'Users', - fields: [ - // ... - ], -}); -``` - -### collection.getOption(key) - -获取 collection 的单个配置项。 - -- 类型 - -```tsx | pure -class Collection { - getOption(key: K): CollectionOptions[K]; -} -``` - -- 示例 - -```tsx | pure -collection.getOption('name'); // 'users' -collection.getOption('title'); // 'Users' -``` - -### collection.getFields(predicate?) - -获取 collection 的字段列表。 - -- 类型 - -```tsx | pure -class Collection { - getFields(predicate?: CollectionFieldOptions | ((collection: CollectionFieldOptions) => boolean) | keyof CollectionFieldOptions): any[] -} -``` - -- 详解 - - predicate - - 类型 - - `CollectionFieldOptions` - - `(collection: CollectionFieldOptions) => boolean` - - `keyof CollectionFieldOptions` - - 说明 - - 如果传递了 `predicate`,则返回符合条件的字段列表 - - 如果没有传递 `predicate`,则返回所有字段列表 - -`predicate` 的使用可看参考 [lodash.filter](https://www.lodashjs.com/docs/lodash.filter)。 - -- 示例 - -```tsx | pure -collection.getFields(); // [{ name: 'username', type: 'string', primaryKey: true }, { name: 'age', type: 'integer' }] - -collection.getFields({ name: 'age' }); // [{ name: 'age', type: 'integer' }] - -collection.getFields('primaryKey'); // [{ name: 'username', type: 'string', primaryKey: true }] - -collection.getFields(field => field.type === 'string'); // [{ name: 'name', type: 'string' }] -``` - -### collection.getField(name) - -获取 collection 的单个字段。 - -- 类型 - -```tsx | pure -class Collection { - getField(name: SchemaKey): CollectionFieldOptions -} -``` - -- 示例 - -```tsx | pure -collection.getField('username'); // { name: 'username', type: 'string', primaryKey: true } -``` - -### collection.hasField(name) - -判断 collection 是否存在某个字段。 - -- 类型 - -```tsx | pure -class Collection { - hasField(name: SchemaKey): boolean; -} -``` - -- 示例 - -```tsx | pure -collection.hasField('username'); // true -collection.hasField('name'); // false -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/data-source-manager-provider.md b/packages/core/client/docs/zh-CN/core/data-source/data-source-manager-provider.md deleted file mode 100644 index 4b39e452c..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/data-source-manager-provider.md +++ /dev/null @@ -1,25 +0,0 @@ -# DataSourceManagerProvider - -用于提供 `DataSourceManager` 实例。 - - -## Hooks - -### useDataSourceManager() - -获取 `DataSourceManager` 实例。 - -- 类型 - -```tsx | pure -function useDataSourceManager(): DataSourceManager; -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - dataSourceManager.removeDataSources(['my-data-source']); -} -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/data-source-manager.md b/packages/core/client/docs/zh-CN/core/data-source/data-source-manager.md deleted file mode 100644 index 7ef124b94..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/data-source-manager.md +++ /dev/null @@ -1,334 +0,0 @@ -# DataSourceManager - -Nocobase 数据源前端体系包含如下内容: - -- [DataSourceManager](./data-source-manager.md) - - [DataSource](./data-source) - - [CollectionManager](./collection-manager) - - [Collection](./collection) - - [Field](./collection-field) - - [CollectionTemplateManager](./collection-template-manager) - - [CollectionTemplate](./collection-template) - - [CollectionFieldInterfaceManager](./collection-field-interface-manager) - - [CollectionFieldInterface](./collection-field-interface) - - [CollectionMixins](./collection-mixins) - - -## 实例属性 - -- collectionTemplateManager - -用于管理 `CollectionTemplate` 实例。 - -```tsx | pure -import { Plugin, CollectionTemplate } from '@nocobase/client'; - -class MyCollectionTemplate extends CollectionTemplate { - name = 'my-collection-template'; -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionTemplateManager.addCollectionTemplates([MyCollectionTemplate]) - } -} -``` - -详细请参考:[CollectionTemplateManager](./collection-template-manager) - -- collectionFieldInterfaceManager - -用于管理 `CollectionFieldInterface` 实例。 - -```tsx | pure -import { Plugin, CollectionFieldInterface } from '@nocobase/client'; - -class MyCollectionFieldInterface extends CollectionFieldInterface { - name = 'my-collection-field-interface'; -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaces([MyCollectionFieldInterface]) - } -} -``` - -详细请参考:[CollectionTemplateManager](./collection-template-manager) - -## 实例方法 - -### addCollectionTemplates() - -是 `CollectionTemplateManager` 的快捷方法,用于添加 `CollectionTemplate`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - addCollectionTemplates(templates: CollectionTemplate[]): void; -} -``` - -- 示例 - -```tsx | pure -import { Plugin, CollectionTemplate } from '@nocobase/client'; - -class MyCollectionTemplate extends CollectionTemplate { - name = 'my-collection-template'; -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionTemplateManager.addCollectionTemplates([MyCollectionTemplate]) - } -} -``` - -更多详细请参考:[CollectionTemplateManager](./collection-template-manager) - -### addFieldInterfaces() - -是 `CollectionFieldInterfaceManager` 的快捷方法,用于添加 `CollectionFieldInterface`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - addFieldInterfaces(fieldInterfaces: CollectionFieldInterface[]): void; -} -``` - -- 示例 - -```tsx | pure -import { Plugin, CollectionFieldInterface } from '@nocobase/client'; - -class MyCollectionFieldInterface extends CollectionFieldInterface { - name = 'my-collection-field-interface'; -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.collectionFieldInterfaceManager.addFieldInterfaces([MyCollectionFieldInterface]) - } -} -``` - -更多详细请参考:[CollectionFieldInterfaceManager](./collection-field-interface-manager) - -### addCollectionMixins() - -用于添加 `Collection` 的 Mixins。 - -- 类型 - -```tsx | pure -class DataSourceManager { - addCollectionMixins(mixins: (typeof Collection)[]): void; -} -``` - -- 示例 - -```tsx | pure -import { Plugin, Collection } from '@nocobase/client'; - -class MyCollectionMixin extends Collection { - otherMethod() { - console.log('otherMethod'); - } -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addCollectionMixins([MyCollectionMixin]) - } -} - -const MyComponent = () => { - const collection = useCollection(); - collection.otherMethod(); -} -``` - -更多详细请参考:[CollectionMixins](./collection-mixins) - -### addDataSource() - -用于添加 `DataSource`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - addDataSource(DataSource: DataSource, options: DataSourceOptions): void; -} -``` - -- 示例 - -```tsx | pure -import { Plugin, DataSource, DataSourceOptions } from '@nocobase/client'; - -class MyDataSource extends DataSource { - async getDataSource() { - return { - status: 'loaded', - collections: [{ name: 'users' }] - } - } -} - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addDataSource(MyDataSource, { - key: 'my-data-source', - displayName: 'My Data Source', - }) - } -} -``` - -更多详细请参考:[DataSource](./data-source) - -### removeDataSources() - -移除 `DataSource`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - removeDataSources(keys: string[]): void; -} -``` - -- 示例 - -```tsx | pure - -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - dataSourceManager.removeDataSources(['my-data-source']); -} -``` - -### getDataSources() - -获取全部 `DataSource` 实例列表。 - -- 类型 - -```tsx | pure -class DataSourceManager { - getDataSources(): DataSource[]; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - const dataSources = dataSourceManager.getDataSources(); - - return ( -
- {dataSources.map(dataSource => ( -
{dataSource.displayName}
- ))} -
- ) -} -``` - -### getDataSource() - -获取 `DataSource` 实例。 - -- 类型 - -```tsx | pure -class DataSourceManager { - getDataSource(key: string): DataSource; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - const dataSource = dataSourceManager.getDataSource('my-data-source'); - - return ( -
- {dataSource.displayName} -
- ) -} -``` - -### getAllCollections() - -获取所有 DataSource 的所有 Collection 实例。 - -- 类型 - -```tsx | pure - -class DataSourceManager { - getAllCollections(options: { - filterCollection?: (collection: Collection) => boolean; - filterDataSource?: (dataSource: DataSource) => boolean; - }): (DataSourceOptions & { collections: Collection[] })[]; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - const collections = dataSourceManager.getAllCollections(); - - return ( -
- {collections.map(({ key, displayName, collections }) => ( -
-

{displayName}

-
    - {collections.map(collection => ( -
  • {collection.name}
  • - ))} -
-
- ))} -
- ) -} -``` - -### reload() - -重载所有 `DataSource`。 - -- 类型 - -```tsx | pure -class DataSourceManager { - reload(): Promise; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceManager = useDataSourceManager(); - dataSourceManager.reload(); -} -``` - diff --git a/packages/core/client/docs/zh-CN/core/data-source/data-source-provider.md b/packages/core/client/docs/zh-CN/core/data-source/data-source-provider.md deleted file mode 100644 index 909a4d894..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/data-source-provider.md +++ /dev/null @@ -1,66 +0,0 @@ -# DataSourceProvider - -用于提供 `DataSource` 的实例。 - -## 组件 - -- 类型 - -```tsx | pure -interface DataSourceProviderProps { - dataSource?: string; - children?: ReactNode; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - return ( - - - - ); -} -``` - -## Hooks - -### useDataSource() - -获取 `DataSource` 实例。 - -- 类型 - -```tsx | pure -function useDataSource(): DataSource; -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSource = useDataSource(); - return
{dataSource.displayName}
-} -``` - -### useDataSourceKey() - -获取 `DataSource` 的 key。 - -- 类型 - -```tsx | pure -function useDataSourceKey(): string; -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSourceKey = useDataSourceKey(); - return
{dataSourceKey}
-} -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/data-source.md b/packages/core/client/docs/zh-CN/core/data-source/data-source.md deleted file mode 100644 index 558a37089..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/data-source.md +++ /dev/null @@ -1,176 +0,0 @@ -# DataSource - -主要是用于获取数据源和数据源的数据表结构列表,并在获取后交给 [CollectionManager](./collection-manager.md) 进行管理,其被 [DataSourceManager](./data-source-manager.md) 管理。 - -## 数据源定义 - -数据源的定义需要继承 `DataSource` 类,并实现 `getDataSource` 方法,当调用 `reload` 方法时,会调用 `getDataSource` 方法获取数据表结构。 - -```tsx | pure -import { DataSource } from '@nocobase/client'; - -class MyDataSource extends DataSource { - async getDataSource() { - return this.app.request({ - url: 'xxx', - method: 'GET', - }); - } -} -``` - -### 数据源注册 - -数据源需要在插件中注册,通过 `DataSourceManager` 的 `addDataSource` 方法进行注册。 - -初始化添加的时候 `collections` 可以为空,当调用 `reload` 方法时,会调用 `getDataSource` 方法获取数据表结构。 - -```tsx | pure -import { Plugin, DataSource, DataSourceOptions } from '@nocobase/client'; - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addDataSource(MyDataSource, { - key: 'my-data-source', - displayName: 'My Data Source', - status: 'loaded', - collections: [ - { - name: 'users', - fields: [ - { - name: 'name', - type: 'string', - }, - ], - }, - ], - }); - } -} -``` - -- `key`:数据源的唯一标识 -- `displayName`:数据源的显示名称 -- `status`:数据源的状态,`loaded` 表示已加载,`loading` 表示正在加载,`loading-failed` 表示加载失败 -- `collections`:数据表结构 -- `errorMessage`:错误信息 - -## 实例方法 - -### getDataSource() - -用于获取数据源信息,其会被 `reload` 方法内部调用,外部不需要调用。 - -### addReloadCallback() - -用于添加数据源加载完成后的回调函数。 - -- 类型 - -```tsx | pure -type LoadCallback = (collections: CollectionOptions[]) => void; - -class DataSource { - addReloadCallback(callback: LoadCallback): void; -} -``` - -### removeReloadCallback() - -用于移除数据源加载完成后的回调函数。 - -- 类型 - -```tsx | pure -type LoadCallback = (collections: CollectionOptions[]) => void; -class DataSource { - removeReloadCallback(callback: LoadCallback): void; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSource = useDataSource(); - - useEffect(() => { - const callback = (collections) => { - console.log(collections); - }; - dataSource.addReloadCallback(callback); - return () => { - dataSource.removeReloadCallback(callback); - }; - }, []); -}; -``` - -### reload() - -用于重新加载数据源,会调用 `getDataSource` 方法获取数据表结构,并内部调用 `addReloadCallback` 添加的回调函数。 - -- 类型 - -```tsx | pure -class DataSource { - reload(): Promise; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSource = useDataSource(); - - const handleClick = async () => { - await dataSource.reload(); - }; -}; -``` - -### getOptions() - -获取数据源的配置信息。 - -- 类型 - -```tsx | pure -interface DataSourceOptions { - key: string; - displayName: string; - collections?: CollectionOptions[]; - errorMessage?: string; - status?: 'loaded' | 'loading-failed' | 'loading'; -} - -class DataSource { - getOptions(): DataSourceOptions; -} -``` - -### getOption() - -获取数据源的配置信息。 - -- 类型 - -```tsx | pure -class DataSource { - getOption(key: string): any; -} -``` - -- 示例 - -```tsx | pure -const MyComponent = () => { - const dataSource = useDataSource(); - - const handleClick = async () => { - console.log(dataSource.getOption('key')); - }; -}; -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/demos/collection-field/demo1.tsx b/packages/core/client/docs/zh-CN/core/data-source/demos/collection-field/demo1.tsx deleted file mode 100644 index 0ec4ddb40..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/demos/collection-field/demo1.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { ISchema, observer, useForm } from '@nocobase/schema'; -import { - Action, - Application, - CollectionProvider, - Form, - SchemaComponent, - FormItem, - InheritanceCollectionMixin, - Input, - SchemaComponentOptions, -} from '@nocobase/client'; -import React from 'react'; - -const collection = { - name: 'tests', - fields: [ - { - type: 'string', - name: 'title1', - interface: 'input', - uiSchema: { - title: 'Title1', - type: 'string', - 'x-component': 'Input', - required: true, - description: 'description1', - } as ISchema, - }, - { - type: 'string', - name: 'title2', - interface: 'input', - uiSchema: { - title: 'Title2', - type: 'string', - 'x-component': 'Input', - description: 'description', - default: 'ttt', - }, - }, - { - type: 'string', - name: 'title3', - }, - ], -}; - -const Root = observer(() => { - const schema: ISchema = { - type: 'object', - properties: { - form1: { - type: 'void', - 'x-component': 'Form', - properties: { - // 字段 title1 直接使用全局提供的 uiSchema - title1: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - default: '111', - }, - // 等同于 - // title1: { - // type: 'string', - // title: 'Title', - // required: true, - // 'x-component': 'Input', - // 'x-decorator': 'FormItem', - // }, - title2: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - title: 'Title4', // 覆盖全局已定义的 Title2 - required: true, // 扩展的配置参数 - description: 'description4', - }, - // 等同于 - // title2: { - // type: 'string', - // title: 'Title22', - // required: true, - // 'x-component': 'Input', - // 'x-decorator': 'FormItem', - // }, - // 字段 title3 没有提供 uiSchema,自行处理 - title3: { - 'x-component': 'Input', - 'x-decorator': 'FormItem', - title: 'Title3', - required: true, - }, - action1: { - // type: 'void', - 'x-component': 'Action', - title: 'Submit', - 'x-component-props': { - type: 'primary', - useAction: '{{ useSubmit }}', - }, - }, - }, - }, - }, - }; - - const useSubmit = () => { - const form = useForm(); - return { - async run() { - form.submit(() => { - console.log(form.values); - }); - }, - }; - }; - - return ( - - - - - - ); -}); - -const app = new Application({ - providers: [Root], - components: { Action, Form, Input, FormItem }, - dataSourceManager: { - collections: [collection], - collectionMixins: [InheritanceCollectionMixin], - }, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/data-source/demos/collection-field/demo2.tsx b/packages/core/client/docs/zh-CN/core/data-source/demos/collection-field/demo2.tsx deleted file mode 100644 index 6ead1b09a..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/demos/collection-field/demo2.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { ISchema, observer } from '@nocobase/schema'; -import { - Application, - CollectionProvider, - Form, - FormItem, - InheritanceCollectionMixin, - Input, - SchemaComponent, - SchemaSettings, -} from '@nocobase/client'; -import React from 'react'; - -const collection = { - name: 'tests', - fields: [ - { - type: 'string', - name: 'title1', - interface: 'input', - uiSchema: { - title: 'Title1', - type: 'string', - 'x-component': 'Input', - required: true, - description: 'description1', - } as ISchema, - }, - ], -}; - -const Root = observer(() => { - const schema: ISchema = { - type: 'object', - properties: { - form1: { - type: 'void', - 'x-component': 'Form', - properties: { - title1: { - 'x-component': 'CollectionField', - 'x-decorator': 'FormItem', - 'x-settings': 'FormItemSettings', - }, - }, - }, - }, - }; - - return ( - - - - ); -}); - -const formSettings = new SchemaSettings({ - name: 'FormItemSettings', - items: [ - { - name: 'required', - type: 'switch', - useComponentProps() { - // const collectionField = useCollectionField(); // 报错 - return { - checked: true, - // checked: !!collectionField?.uiSchema?.required, - title: 'Required', - onChange(v) { - // ? - }, - }; - }, - }, - ], -}); - -const app = new Application({ - providers: [Root], - components: { Form, Input, FormItem }, - dataSourceManager: { - collections: [collection], - collectionMixins: [InheritanceCollectionMixin], - }, - schemaSettings: [formSettings], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/data-source/demos/collection/demo1.tsx b/packages/core/client/docs/zh-CN/core/data-source/demos/collection/demo1.tsx deleted file mode 100644 index a01748165..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/demos/collection/demo1.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; -import { CollectionProvider, useCollection } from '@nocobase/client'; -import { createApp } from '../createApp'; - -const Demo = () => { - const collection = useCollection(); - return
{JSON.stringify(collection.getField('username'), null, 2)}
; -}; - -const Root = () => { - return ( - - - - ); -}; - -export default createApp(Root); diff --git a/packages/core/client/docs/zh-CN/core/data-source/demos/collections.json b/packages/core/client/docs/zh-CN/core/data-source/demos/collections.json deleted file mode 100644 index 4d3aa45f8..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/demos/collections.json +++ /dev/null @@ -1,198 +0,0 @@ -[ - { - "key": "h7b9i8khc3q", - "name": "users", - "inherit": false, - "hidden": false, - "description": null, - "category": [], - "namespace": "users.users", - "duplicator": { - "dumpable": "optional", - "with": "rolesUsers" - }, - "sortable": "sort", - "model": "UserModel", - "createdBy": true, - "updatedBy": true, - "logging": true, - "from": "db2cm", - "title": "{{t(\"Users\")}}", - "rawTitle": "{{t(\"Users\")}}", - "fields": [ - { - "uiSchema": { - "type": "number", - "title": "{{t(\"ID\")}}", - "x-component": "InputNumber", - "x-read-pretty": true, - "rawTitle": "{{t(\"ID\")}}" - }, - "key": "ffp1f2sula0", - "name": "id", - "type": "bigInt", - "interface": "id", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "autoIncrement": true, - "primaryKey": true, - "allowNull": false - }, - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Nickname\")}}", - "x-component": "Input", - "rawTitle": "{{t(\"Nickname\")}}" - }, - "key": "vrv7yjue90g", - "name": "nickname", - "type": "string", - "interface": "input", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null - }, - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Username\")}}", - "x-component": "Input", - "x-validator": { - "username": true - }, - "required": true, - "rawTitle": "{{t(\"Username\")}}" - }, - "key": "2ccs6evyrub", - "name": "username", - "type": "string", - "interface": "input", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "unique": true - }, - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Email\")}}", - "x-component": "Input", - "x-validator": "email", - "required": true, - "rawTitle": "{{t(\"Email\")}}" - }, - "key": "rrskwjl5wt1", - "name": "email", - "type": "string", - "interface": "email", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "unique": true - }, - { - "key": "t09bauwm0wb", - "name": "roles", - "type": "belongsToMany", - "interface": "m2m", - "description": null, - "collectionName": "users", - "parentKey": null, - "reverseKey": null, - "target": "roles", - "foreignKey": "userId", - "otherKey": "roleName", - "onDelete": "CASCADE", - "sourceKey": "id", - "targetKey": "name", - "through": "rolesUsers", - "uiSchema": { - "type": "array", - "title": "{{t(\"Roles\")}}", - "x-component": "AssociationField", - "x-component-props": { - "multiple": true, - "fieldNames": { - "label": "title", - "value": "name" - } - } - } - } - ] - }, - { - "key": "pqnenvqrzxr", - "name": "roles", - "inherit": false, - "hidden": false, - "description": null, - "category": [], - "namespace": "acl.acl", - "duplicator": { - "dumpable": "required", - "with": "uiSchemas" - }, - "autoGenId": false, - "model": "RoleModel", - "filterTargetKey": "name", - "sortable": true, - "from": "db2cm", - "title": "{{t(\"Roles\")}}", - "rawTitle": "{{t(\"Roles\")}}", - "fields": [ - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Role UID\")}}", - "x-component": "Input", - "rawTitle": "{{t(\"Role UID\")}}" - }, - "key": "jbz9m80bxmp", - "name": "name", - "type": "uid", - "interface": "input", - "description": null, - "collectionName": "roles", - "parentKey": null, - "reverseKey": null, - "prefix": "r_", - "primaryKey": true - }, - { - "uiSchema": { - "type": "string", - "title": "{{t(\"Role name\")}}", - "x-component": "Input", - "rawTitle": "{{t(\"Role name\")}}" - }, - "key": "faywtz4sf3u", - "name": "title", - "type": "string", - "interface": "input", - "description": null, - "collectionName": "roles", - "parentKey": null, - "reverseKey": null, - "unique": true, - "translation": true - }, - { - "key": "1enkovm9sye", - "name": "description", - "type": "string", - "interface": null, - "description": null, - "collectionName": "roles", - "parentKey": null, - "reverseKey": null - } - ] - } -] diff --git a/packages/core/client/docs/zh-CN/core/data-source/demos/createApp.tsx b/packages/core/client/docs/zh-CN/core/data-source/demos/createApp.tsx deleted file mode 100644 index 127f2e7c8..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/demos/createApp.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { - Application, - ApplicationOptions, - CardItem, - Plugin, - CollectionPlugin, - DataBlockProvider, - DEFAULT_DATA_SOURCE_KEY, - DEFAULT_DATA_SOURCE_TITLE, - LocalDataSource, -} from '@nocobase/client'; -import MockAdapter from 'axios-mock-adapter'; -import { ComponentType } from 'react'; -import collections from './collections.json'; - -const defaultMocks = { - 'users:list': { - data: [ - { - id: '1', - username: 'jack', - nickname: 'Jack Ma', - email: 'test@gmail.com', - }, - { - id: '2', - username: 'jim', - nickname: 'Jim Green', - }, - { - id: '3', - username: 'tom', - nickname: 'Tom Cat', - email: 'tom@gmail.com', - }, - ], - }, - 'roles:list': { - data: [ - { - name: 'root', - title: 'Root', - description: 'Root', - }, - { - name: 'admin', - title: 'Admin', - description: 'Admin description', - }, - ], - }, -}; - -export function createApp( - Demo: ComponentType, - options: ApplicationOptions = {}, - mocks: Record = defaultMocks, -) { - class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addDataSource(LocalDataSource, { - key: DEFAULT_DATA_SOURCE_KEY, - displayName: DEFAULT_DATA_SOURCE_TITLE, - collections: collections as any, - }); - } - } - const app = new Application({ - apiClient: { - baseURL: 'http://localhost:8000', - }, - providers: [Demo], - ...options, - components: { - ...options.components, - DataBlockProvider, - CardItem, - }, - plugins: [CollectionPlugin, MyPlugin, ...(options.plugins || [])], - designable: true, - }); - - const mock = new MockAdapter(app.apiClient.axios); - - Object.entries(mocks).forEach(([url, data]) => { - mock.onGet(url).reply(async (config) => { - const res = typeof data === 'function' ? data(config) : data; - return [200, res]; - }); - mock.onPost(url).reply(async (config) => { - const res = typeof data === 'function' ? data(config) : data; - return [200, res]; - }); - }); - - const Root = app.getRootComponent(); - return Root; -} diff --git a/packages/core/client/docs/zh-CN/core/data-source/demos/data-source-manager/mixins.tsx b/packages/core/client/docs/zh-CN/core/data-source/demos/data-source-manager/mixins.tsx deleted file mode 100644 index f2f26151f..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/demos/data-source-manager/mixins.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import { CollectionProvider, Collection, useCollection, Plugin } from '@nocobase/client'; -import { createApp } from '../createApp'; - -class TestMixin extends Collection { - test() { - const { name } = this.options; - return 'test ' + name; - } -} - -class Test2Mixin extends Collection { - test2() { - const { name } = this.options; - return 'test2 ' + name; - } -} - -const Demo = () => { - const collection = useCollection(); - return ( -
-
test: {collection.test()}
-
test2: {collection.test2()}
-
fields.length: {collection.getFields().length}
-
- ); -}; - -const Root = () => { - return ( - - - - ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.dataSourceManager.addCollectionMixins([TestMixin, Test2Mixin]); - } -} - -export default createApp(Root, { - plugins: [MyPlugin], -}); diff --git a/packages/core/client/docs/zh-CN/core/data-source/extend-collections-provider.md b/packages/core/client/docs/zh-CN/core/data-source/extend-collections-provider.md deleted file mode 100644 index 8b033ff0f..000000000 --- a/packages/core/client/docs/zh-CN/core/data-source/extend-collections-provider.md +++ /dev/null @@ -1,79 +0,0 @@ -# ExtendCollectionsProvider - -用于扩展 [Collection](./collection.md) 。 - -## 组件 - -- 类型 - -```tsx | pure -interface ExtendCollectionsProviderProps { - collections: CollectionOptions[]; - children?: ReactNode; -} -``` - -- 示例 - -```tsx | pure -import { ExtendCollectionsProvider, CollectionOptions } from '@nocobase/client'; - -const userCollection: CollectionOptions = { - name: 'users', - title: '{{t("Users")}}', - fields: [ - { - type: 'string', - name: 'name', - title: '{{t("Name")}}', - }, - { - type: 'string', - name: 'email', - title: '{{t("Email")}}', - }, - ], -} - -const MyPlugin = () => { - return ( - - - - - - ); -} - -const ChildComponent = () => { - const collection = useCollection(); - - return ( -
-

{collection.name}

-
- ); -} -``` - -## Hooks - -### useExtendCollections() - -获取扩展的数据表。 - -```tsx | pure -import { useExtendCollections } from '@nocobase/client'; - -const MyComponent = () => { - const collections = useExtendCollections(); - - return ( -
- {collections.map((collection) => ( -
{collection.title}
- ))} -
- ); -} -``` diff --git a/packages/core/client/docs/zh-CN/core/data-source/images/collection-field-interface-form.png b/packages/core/client/docs/zh-CN/core/data-source/images/collection-field-interface-form.png deleted file mode 100644 index 9a6029e8a85c87437182d3b99ac9f920f8250203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26025 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 diff --git a/packages/core/client/docs/zh-CN/core/data-source/images/collection-field-interface.png b/packages/core/client/docs/zh-CN/core/data-source/images/collection-field-interface.png deleted file mode 100644 index 6d04d0e2bff8b10a3d7c4bbf20d177989e051bcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18213 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

YoCL@+#aV7qG@)ew=HF<*B`vU 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 diff --git a/packages/core/client/docs/zh-CN/core/static/CxjJbp0pcogYn6xviVyc6QT8nUg.png b/packages/core/client/docs/zh-CN/core/static/CxjJbp0pcogYn6xviVyc6QT8nUg.png deleted file mode 100644 index 0fa567bf5f7a151d854e45addd119951ba56c770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97084 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%0DvAhtmQ0)`+?`P!`1>o2Rc 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 R3iP7=M_(JJRiXJP;(z=C^^X7m diff --git a/packages/core/client/docs/zh-CN/core/static/VfPGbhWo9os0qTxcITkcHNfin4g.png b/packages/core/client/docs/zh-CN/core/static/VfPGbhWo9os0qTxcITkcHNfin4g.png deleted file mode 100644 index 9d65a782cbfe0b4117c5da020b84cb6492556259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14642 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 Ks^YzA$o~V`bbh4( diff --git a/packages/core/client/docs/zh-CN/core/static/designer.png b/packages/core/client/docs/zh-CN/core/static/designer.png deleted file mode 100644 index 466fa4cfd8f2455974a8b3d689e086e47c118270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24769 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 diff --git a/packages/core/client/docs/zh-CN/core/static/plugin-settings.jpg b/packages/core/client/docs/zh-CN/core/static/plugin-settings.jpg deleted file mode 100644 index 34a8da11627d7c726cfa8ec9c6c55ed2bf26c4b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134578 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

sy@SUNY)7d440qXMCUp?=kQ} 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 diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-basic.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-basic.tsx deleted file mode 100644 index 7c67b3b24..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-basic.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import React from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; - -const Hello = observer(() => { - const field = useField(); - return ( -

- ); -}); - -function Demo() { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - title: itemConfig.title, - 'x-component': 'Hello', - }); - }; - return ; -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - { - name: 'b', - title: 'Item B', - Component: Demo, - }, - ], -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-common.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-common.tsx deleted file mode 100644 index 79962078e..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-common.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { ApplicationOptions, Grid, Plugin, SchemaComponent } from '@nocobase/client'; -import React from 'react'; - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.app.addComponents({ Grid }); - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const appOptions: ApplicationOptions = { - router: { - type: 'memory', - }, - designable: true, - plugins: [PluginHello], -}; - -export { appOptions }; diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-component.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-component.tsx deleted file mode 100644 index 06796b827..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-component.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import React from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; -import { Avatar } from 'antd'; - -const Hello = observer(() => { - const field = useField(); - return ( -
- {field.title} -
- ); -}); - -function Demo() { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - title: itemConfig.title, - 'x-component': 'Hello', - }); - }; - return ; -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - insertPosition: 'beforeEnd', - Component: (props: any) => ( - - C - - ), - componentProps: { - size: 'large', - }, - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - { - name: 'b', - title: 'Item B', - Component: Demo, - }, - ], -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-divider.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-divider.tsx deleted file mode 100644 index 39a23be52..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-divider.tsx +++ /dev/null @@ -1,57 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaInitializer } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'A Group Title', - type: 'itemGroup', - children: [ - { - name: 'a1', - type: 'item', - title: 'A1', - }, - { - name: 'a2', - type: 'item', - title: 'A2', - }, - ], - }, - { - name: 'd', - type: 'divider', - }, - { - name: 'b', - title: 'B Group Title', - type: 'itemGroup', - children: [ - { - name: 'a1', - type: 'item', - title: 'B1', - }, - { - name: 'a2', - type: 'item', - title: 'B2', - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-group.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-group.tsx deleted file mode 100644 index d691ff925..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-group.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { Application, SchemaInitializer, SchemaInitializerItemGroup } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; -import React from 'react'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'A Group Title', - type: 'itemGroup', - children: [ - { - name: 'a1', - type: 'item', - title: 'A1', - }, - { - name: 'a2', - type: 'item', - title: 'A2', - }, - ], - }, - { - name: 'b', - title: 'B Group Title', - type: 'itemGroup', - divider: true, // 渲染分割线 - useChildren() { - // 动态子元素 - return [ - { - name: 'b1', - type: 'item', - title: 'B1', - }, - { - name: 'b2', - type: 'item', - title: 'B2', - }, - ]; - }, - }, - { - name: 'c', - Component: () => { - return ( - - {[ - { - name: 'c1', - type: 'item', - title: 'C1', - }, - ]} - - ); - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-item.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-item.tsx deleted file mode 100644 index 05e6f983a..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-item.tsx +++ /dev/null @@ -1,88 +0,0 @@ -/** - * defaultShowCode: true - */ -import { - Grid, - SchemaInitializer, - useSchemaInitializer, - SchemaInitializerItem, - CardItem, - Application, -} from '@nocobase/client'; -import React from 'react'; -import { appOptions } from './schema-initializer-common'; -import { useFieldSchema } from '@nocobase/schema'; - -const Demo = () => { - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', - }); - }; - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'demo1', - Component: Demo, - }, - { - name: 'demo2', - type: 'item', - useComponentProps() { - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', - }); - }; - - return { - title: 'type 方式定义', - onClick: handleClick, - }; - }, - }, - { - name: 'demo3', - title: 'with items', - type: 'item', - onClick(args) { - console.log(args); - }, - items: [ - { - label: 'aaa', - value: 'aaa', - }, - { - label: 'bbb', - value: 'bbb', - }, - ], - }, - ], -}); - -const Hello = () => { - const schema = useFieldSchema(); - return

Hello, world! {schema.name}

; -}; - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], - components: { CardItem, Hello }, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-menu.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-menu.tsx deleted file mode 100644 index f795b0271..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-menu.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaInitializer } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'A subMenu', - type: 'subMenu', - children: [ - { - name: 'a1', - type: 'item', - title: 'A1', - }, - { - name: 'a2', - type: 'item', - title: 'A2', - }, - ], - }, - { - name: 'b', - title: 'B subMenu', - type: 'subMenu', - children: [ - { - name: 'a1', - type: 'item', - title: 'B1', - }, - { - name: 'a2', - type: 'item', - title: 'B2', - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-select.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-select.tsx deleted file mode 100644 index 620dc40c5..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-select.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Grid, SchemaInitializer, Application, SchemaInitializerSelect, useDesignable } from '@nocobase/client'; -import React from 'react'; -import { appOptions } from './schema-initializer-common'; -import { useFieldSchema } from '@nocobase/schema'; - -const OpenModeSelect = () => { - const fieldSchema = useFieldSchema(); - const openModeValue = fieldSchema?.['x-component-props']?.['openMode'] || 'drawer'; - - const { patch } = useDesignable(); - const handleChange = (value) => { - // 修改当前节点的 Schema 的属性 - patch({ - 'x-component-props': { - openMode: value, - }, - }); - }; - - return ( - - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'openMode', - Component: OpenModeSelect, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-switch.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-switch.tsx deleted file mode 100644 index c8eb33888..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-components-switch.tsx +++ /dev/null @@ -1,88 +0,0 @@ -/** - * defaultShowCode: true - */ -import { - Grid, - SchemaInitializer, - Application, - SchemaInitializerSwitch, - useCurrentSchema, - useSchemaInitializer, - Action, -} from '@nocobase/client'; -import React from 'react'; -import { appOptions } from './schema-initializer-common'; - -const actionKey = 'x-action'; - -const schema = { - type: 'void', - [actionKey]: 'create', - title: "{{t('Add new')}}", - 'x-component': 'Action', - 'x-component-props': { - type: 'primary', - }, -}; - -const AddNewButton = () => { - // 判断是否已插入 - const { exists, remove } = useCurrentSchema(schema[actionKey], actionKey); - - const { insert } = useSchemaInitializer(); - return ( - { - // 如果已插入,则移除 - if (exists) { - return remove(); - } - // 新插入子节点 - insert(schema); - }} - /> - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Configure actions', - wrap: Grid.wrap, - items: [ - { - name: 'Add New', - Component: AddNewButton, - }, - { - name: 'Add New2', - type: 'switch', - useComponentProps() { - const { exists, remove } = useCurrentSchema(schema[actionKey], actionKey); - - const { insert } = useSchemaInitializer(); - return { - checked: exists, - title: 'Add new - type 方式', - onClick() { - // 如果已插入,则移除 - if (exists) { - return remove(); - } - // 新插入子节点 - insert(schema); - }, - }; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], - components: { Action }, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-hooks-item.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-hooks-item.tsx deleted file mode 100644 index ddf54ed2d..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-hooks-item.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/** - * defaultShowCode: true - */ -import React, { ReactNode } from 'react'; -import { Application, SchemaInitializer, SchemaInitializerItem, useSchemaInitializerItem } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; -import { TableOutlined } from '@ant-design/icons'; - -const Demo = () => { - const { name, foo, icon } = useSchemaInitializerItem<{ name: string; foo: string; icon: ReactNode }>(); - - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - foo: 'bar', - icon: , - Component: Demo, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-items.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-items.tsx deleted file mode 100644 index 78657d332..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-items.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import React, { FC } from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerChild, - SchemaInitializerItem, - SchemaInitializerItemsProps, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; -import { ButtonProps, ListProps, List, Card } from 'antd'; - -const Hello = observer(() => { - const field = useField(); - return ( -
- {field.title} -
- ); -}); - -function Demo() { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - title: itemConfig.title, - 'x-component': 'Hello', - }); - }; - return ; -} - -const CustomListGridMenu: FC>> = (props) => { - const { items, options, ...others } = props; - return ( - ( - - - - )} - > - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - ItemsComponent: CustomListGridMenu, - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - { - name: 'b', - title: 'Item B', - Component: Demo, - }, - ], -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-children.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-children.tsx deleted file mode 100644 index 1e7fe3e23..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-children.tsx +++ /dev/null @@ -1,61 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaInitializer, SchemaInitializerItem } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - type: 'itemGroup', - title: '静态 children', - children: [ - { - name: 'a1', - type: 'item', - title: 'A 1', - onClick: () => { - alert('a-1'); - }, - }, - { - name: 'a2', - type: 'item', - title: 'A 2', - }, - ], - }, - { - name: 'a', - type: 'itemGroup', - title: '动态 children', - useChildren() { - return [ - { - name: 'a1', - type: 'item', - title: 'A 1', - onClick: () => { - alert('a-1'); - }, - }, - { - name: 'a2', - type: 'item', - title: 'A 2', - }, - ]; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-define.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-define.tsx deleted file mode 100644 index 534ec581b..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-define.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { Application, SchemaInitializer, SchemaInitializerItem } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const Demo = () => { - // 最终渲染 `SchemaInitializerItem` - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - Component: Demo, // 通过 Component 定义 - }, - { - name: 'b', - type: 'item', // 通过 `type` 定义,底层对应着 `SchemaInitializerItem` 组件 - title: 'type Demo', - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-props.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-props.tsx deleted file mode 100644 index 37d46fa4e..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-props.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { Application, SchemaInitializer, SchemaInitializerItem } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const CommonDemo = (props) => { - return ; -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - Component: CommonDemo, - componentProps: { - title: 'componentProps', - }, - }, - { - name: 'b', - Component: CommonDemo, - useComponentProps() { - return { - title: 'useComponentProps', - }; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-visible.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-visible.tsx deleted file mode 100644 index ead52953d..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-options-item-visible.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaInitializer } from '@nocobase/client'; -import { appOptions } from './schema-initializer-common'; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - type: 'item', - title: 'Demo A', - }, - { - name: 'b', - type: 'item', - title: 'Demo B', - useVisible() { - return false; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaInitializers: [myInitializer], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-popover.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-popover.tsx deleted file mode 100644 index 87fec2666..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-popover.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import React from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - useDesignable, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; -import { Button } from 'antd'; - -const Hello = observer(() => { - const field = useField(); - return ( -
- {field.title} -
- ); -}); - -const MyInitializerComponent = () => { - const { insertBeforeEnd } = useDesignable(); - return ( - - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - popover: false, - Component: MyInitializerComponent, -}); - -const AddBlockButton = observer( - () => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return render(); - }, - { displayName: 'AddBlockButton' }, -); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-render.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-render.tsx deleted file mode 100644 index eea87b77d..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-initializer-render.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import React from 'react'; -import { - Application, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaInitializerRender, -} from '@nocobase/client'; -import { observer, useField, useFieldSchema } from '@nocobase/schema'; -import { Field } from '@nocobase/schema'; - -const Hello = observer(() => { - const field = useField(); - return ( -
- {field.title} -
- ); -}); - -function Demo() { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - title: itemConfig.title, - 'x-component': 'Hello', - }); - }; - return ; -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - { - name: 'b', - title: 'Item B', - Component: Demo, - }, - ], -}); - -const AddBlockButton = observer(() => { - const fieldSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer']); - return ( -
-
{render()}
-
可以进行参数的二次覆盖:{render({ style: { color: 'red' } })}
-
- ); -}); - -const Page = observer( - (props) => { - return ( -
- {props.children} - -
- ); - }, - { displayName: 'Page' }, -); - -const Root = () => { - return ( -
- -
- ); -}; - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - this.app.router.add('root', { - path: '/', - Component: Root, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], - designable: true, -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-common.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-common.tsx deleted file mode 100644 index 01b99b9aa..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-common.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { ApplicationOptions, CardItem, Grid, Plugin, SchemaComponent } from '@nocobase/client'; -import React from 'react'; - -const Hello = () => { - return

Hello, world!

; -}; - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const appOptions: ApplicationOptions = { - router: { - type: 'memory', - }, - designable: true, - components: { Grid, CardItem, Hello }, - plugins: [PluginHello], -}; - -export { appOptions }; diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-action-modal.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-action-modal.tsx deleted file mode 100644 index 25b94e5c3..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-action-modal.tsx +++ /dev/null @@ -1,66 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { - Application, - FormItem, - Input, - SchemaSettings, - SchemaSettingsActionModalItem, - useDesignable, -} from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; -import { ISchema, useField } from '@nocobase/schema'; - -export const SchemaSettingsBlockTitleItem = function BlockTitleItem() { - const filed = useField(); - const { patch } = useDesignable(); - - return ( - { - patch({ - 'x-decorator-props': { - title, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'blockTitle', - Component: SchemaSettingsBlockTitleItem, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ FormItem, Input }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-divider.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-divider.tsx deleted file mode 100644 index f2b3d98b6..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-divider.tsx +++ /dev/null @@ -1,68 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'itemGroup', - componentProps: { - title: 'group A', - }, - children: [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A1', - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A2', - }, - }, - ], - }, - { - name: 'divider', - type: 'divider', - }, - { - name: 'b', - type: 'itemGroup', - componentProps: { - title: 'group B', - }, - children: [ - { - name: 'b1', - type: 'item', - componentProps: { - title: 'B1', - }, - }, - { - name: 'b2', - type: 'item', - componentProps: { - title: 'B2', - }, - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-group.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-group.tsx deleted file mode 100644 index e47b99a13..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-group.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'itemGroup', - componentProps: { - title: 'group A', - }, - children: [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A1', - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A2', - }, - }, - ], - }, - { - name: 'b', - type: 'itemGroup', - componentProps: { - title: 'group B', - }, - children: [ - { - name: 'b1', - type: 'item', - componentProps: { - title: 'B1', - }, - }, - { - name: 'b2', - type: 'item', - componentProps: { - title: 'B2', - }, - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-item.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-item.tsx deleted file mode 100644 index 3aae57b2f..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-item.tsx +++ /dev/null @@ -1,76 +0,0 @@ -/** - * defaultShowCode: true - */ -import React, { FC, useState } from 'react'; -import { Application, SchemaSettings, SchemaSettingsItem, useDesignable } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; -import { observer, useField } from '@nocobase/schema'; -import { Button, Input, Space } from 'antd'; - -const MarkdownEdit = () => { - const field = useField(); - return ( - { - field.editable = true; - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'markdown', - Component: MarkdownEdit, - }, - ], -}); - -const Hello: FC<{ content?: string }> = observer((props) => { - const field = useField(); - const { content } = props; - const [inputVal, setInputVal] = useState(content); - const { patch } = useDesignable(); - return field.editable ? ( - - setInputVal(e.target.value)} /> - - - - - - ) : ( -

{content}

- ); -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ Hello }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-modal.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-modal.tsx deleted file mode 100644 index 6dac4f24d..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-modal.tsx +++ /dev/null @@ -1,66 +0,0 @@ -/** - * defaultShowCode: true - */ -import { ISchema } from '@nocobase/schema'; -import { - Application, - FormItem, - Input, - SchemaSettings, - SchemaSettingsModalItem, - useSchemaSettings, -} from '@nocobase/client'; -import React from 'react'; -import { appOptions } from './schema-settings-common'; - -export const SchemaSettingsBlockTitleItem = function BlockTitleItem() { - const { dn } = useSchemaSettings(); - - return ( - { - dn.deepMerge({ - 'x-decorator-props': { - title, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'blockTitle', - Component: SchemaSettingsBlockTitleItem, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ FormItem, Input }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-remove.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-remove.tsx deleted file mode 100644 index c1b101cc3..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-remove.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'remove', - type: 'remove', - componentProps: { - removeParentsIfNoChildren: true, - breakRemoveOn(s) { - return s['x-component'] === 'Grid'; // 其顶级是 Grid,这一层级不能删 - }, - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-select.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-select.tsx deleted file mode 100644 index e9f80c243..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-select.tsx +++ /dev/null @@ -1,82 +0,0 @@ -/** - * defaultShowCode: true - */ -import React, { FC } from 'react'; -import { Application, SchemaSettings, SchemaSettingsSelectItem, useDesignable } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; -import { observer, useField } from '@nocobase/schema'; -import { Table } from 'antd'; - -const PageSize = () => { - const { patch } = useDesignable(); - const filed = useField(); - return ( - { - patch({ - 'x-component-props': { - pageSize: v, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'pageSize', - Component: PageSize, - }, - ], -}); - -const data = []; -for (let i = 0; i < 46; i++) { - data.push({ - key: i, - name: `Edward King ${i}`, - age: 32, - address: `London, Park Lane no. ${i}`, - }); -} -const Hello: FC<{ pageSize: number }> = observer((props) => { - return ( -

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 YQNun$=1Ly;nH@+~QB&cYoLShv0a$h3dH?_b diff --git a/packages/core/client/docs/zh-CN/core/data-source/images/field-groups.png b/packages/core/client/docs/zh-CN/core/data-source/images/field-groups.png deleted file mode 100644 index 3f9381a70fc174ec2e9625a654b8ad60fa8b0c12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51287 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

- ); -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ Hello }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-sub-menu.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-sub-menu.tsx deleted file mode 100644 index 4e9be9478..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-sub-menu.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'subMenu', - componentProps: { - title: 'Sub Menu A', - }, - children: [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A1', - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A2', - }, - }, - ], - }, - { - name: 'b', - type: 'subMenu', - componentProps: { - title: 'Sub Menu B', - }, - children: [ - { - name: 'b1', - type: 'item', - componentProps: { - title: 'B1', - }, - }, - { - name: 'b2', - type: 'item', - componentProps: { - title: 'B2', - }, - }, - ], - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-switch.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-switch.tsx deleted file mode 100644 index ef8a22619..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-components-switch.tsx +++ /dev/null @@ -1,74 +0,0 @@ -/** - * defaultShowCode: true - */ -import React, { FC } from 'react'; -import { Application, SchemaSettings, SchemaSettingsSwitchItem, useDesignable } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; -import { observer, useField } from '@nocobase/schema'; -import { Form, Input } from 'antd'; - -const FormItemRequired = () => { - const { patch } = useDesignable(); - const filed = useField(); - return ( - { - patch({ - 'x-component-props': { - required: v, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'required', - Component: FormItemRequired, - }, - { - name: 'required2', - type: 'switch', - useComponentProps() { - const { patch } = useDesignable(); - const filed = useField(); - return { - title: 'Required - type 方式', - checked: !!filed.componentProps?.required, - onChange(v) { - patch({ - 'x-component-props': { - required: v, - }, - }); - }, - }; - }, - }, - ], -}); - -const Hello: FC<{ required: boolean }> = observer((props) => { - return ( -
- - - - - ); -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -app.addComponents({ Hello }); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-children.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-children.tsx deleted file mode 100644 index 102c312b2..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-children.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'itemGroup', - componentProps: { - title: '静态 children', - }, - children: [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A 1', - onClick: () => { - alert('a-1'); - }, - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A 2', - }, - }, - ], - }, - { - name: 'b', - type: 'itemGroup', - componentProps: { - title: '动态 children', - }, - useChildren() { - return [ - { - name: 'a1', - type: 'item', - componentProps: { - title: 'A 1', - }, - onClick: () => { - alert('a-1'); - }, - }, - { - name: 'a2', - type: 'item', - componentProps: { - title: 'A 2', - }, - }, - ]; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-define.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-define.tsx deleted file mode 100644 index f370a23ee..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-define.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { Application, SchemaSettings, SchemaSettingsItem } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const Demo = () => { - // 最终渲染 `SchemaInitializerItem` - return ; -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - Component: Demo, // 通过 Component 定义 - }, - { - name: 'b', - type: 'item', // 通过 `type` 定义,底层对应着 `SchemaInitializerItem` 组件 - componentProps: { - title: 'type Demo', - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-props.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-props.tsx deleted file mode 100644 index 7b3737611..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-props.tsx +++ /dev/null @@ -1,39 +0,0 @@ -/** - * defaultShowCode: true - */ -import React from 'react'; -import { Application, SchemaSettings, SchemaSettingsItem } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const CommonDemo = (props) => { - return ; -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - Component: CommonDemo, - componentProps: { - title: 'componentProps', - }, - }, - { - name: 'b', - Component: CommonDemo, - useComponentProps() { - return { - title: 'useComponentProps', - }; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-visible.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-visible.tsx deleted file mode 100644 index 6cfc7f725..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-options-item-visible.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/** - * defaultShowCode: true - */ -import { Application, SchemaSettings } from '@nocobase/client'; -import { appOptions } from './schema-settings-common'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'item', - componentProps: { - title: 'Demo A', - }, - }, - { - name: 'b', - type: 'item', - componentProps: { - title: 'Demo B', - }, - useVisible() { - return false; - }, - }, - ], -}); - -const app = new Application({ - ...appOptions, - schemaSettings: [mySettings], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-render.tsx b/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-render.tsx deleted file mode 100644 index 5993b128b..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/demos/schema-settings-render.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import { ISchema, useField, useFieldSchema } from '@nocobase/schema'; -import { - Application, - CardItem, - FormItem, - Grid, - Input, - Plugin, - SchemaComponent, - SchemaSettings, - SchemaSettingsModalItem, - createDesignable, - useAPIClient, - useSchemaComponentContext, - useSchemaSettings, - useSchemaSettingsRender, -} from '@nocobase/client'; -import React, { useMemo } from 'react'; - -class PluginHello extends Plugin { - async load() { - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -export const SchemaSettingsBlockTitleItem = function BlockTitleItem() { - const { dn } = useSchemaSettings(); - - return ( - { - dn.shallowMerge({ - 'x-decorator-props': { - title, - }, - }); - }} - /> - ); -}; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'blockTitle', - Component: SchemaSettingsBlockTitleItem, - }, - ], -}); - -const Hello = (props) => { - return ( -

- Hello, world! - {props.children} -

- ); -}; - -const Demo = () => { - const fieldSchema = useFieldSchema(); - const field = useField(); - const api = useAPIClient(); - const { refresh } = useSchemaComponentContext(); - const dn = useMemo( - () => - createDesignable({ - current: fieldSchema.parent, - model: field.parent, - api, - refresh, - }), - [], - ); - const { render, exists } = useSchemaSettingsRender(fieldSchema['x-settings'], { - fieldSchema: dn.current, - field: dn.model, - dn, - }); - return ( -
-
{render()}
-
可以进行参数的二次覆盖:{render({ style: { color: 'red' } })}
-
- ); -}; - -const HelloPage = () => { - return ( -
- -
- ); -}; - -const app = new Application({ - schemaSettings: [mySettings], - router: { - type: 'memory', - }, - designable: true, - components: { FormItem, Input, Grid, CardItem, Hello }, - plugins: [PluginHello], -}); - -export default app.getRootComponent(); diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/designable.md b/packages/core/client/docs/zh-CN/core/ui-schema/designable.md deleted file mode 100644 index 75b151b26..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/designable.md +++ /dev/null @@ -1,791 +0,0 @@ -# Designable - -## Designable - -对 Schema 节点进行增、删、改操作,并且提供了事件触发机制,用于将数据同步到服务端。 - -```tsx | pure -interface Options { - current: Schema; - api?: APIClient; - onSuccess?: any; - refresh?: () => void; - t?: any; -} - -interface InsertAdjacentOptions { - wrap?: (s: ISchema) => ISchema; - removeParentsIfNoChildren?: boolean; - breakRemoveOn?: ISchema | BreakFn; - onSuccess?: any; -} - -class Designable { - constructor(options: Options ) { } - loadAPIClientEvents(): void; - on(name: 'insertAdjacent' | 'remove' | 'error' | 'patch' | 'batchPatch', listener: any): void - emit(name: 'insertAdjacent' | 'remove' | 'error' | 'patch' | 'batchPatch', ...args: any[]): Promise - refresh(): void - recursiveRemoveIfNoChildren(schema?: Schema, options?: RecursiveRemoveOptions): Schema; - remove(schema?: Schema, options?: RemoveOptions): Promise - removeWithoutEmit(schema?: Schema, options?: RemoveOptions): Schema - insertAdjacent(position: Position, schema: ISchema, options?: InsertAdjacentOptions): void | Promise - insertBeforeBeginOrAfterEnd(schema: ISchema, options?: InsertAdjacentOptions): void - insertBeforeBegin(schema: ISchema, options?: InsertAdjacentOptions): void - insertAfterBegin(schema: ISchema, options?: InsertAdjacentOptions): void - insertBeforeEnd(schema: ISchema, options?: InsertAdjacentOptions): Promise - insertAfterEnd(schema: ISchema, options?: InsertAdjacentOptions): void -} -``` - -### 构造函数 - -- 参数讲解 - - - `current`:需要操作的 Schema 节点 - - `api`:用于发起后端请求的 [APIClient](https://docs.nocobase.com/api/sdk) 实例 - - `onSuccess`:后端接口请求成功后的回调 - - `refresh`:用于更新节点后,刷新页面 - - `t`:`useTranslation()` 的返回值 -- 示例 - -```tsx | pure -const schema = new Schema({ - type: 'void', - name: 'hello', - 'x-component': 'div', -}) - -const dn = new Designable({ current: schema }); -``` - -### Schema 操作方法 - -```tsx | pure -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - } - } - } - } -}); - -const b = schema.b; - -const dn = createDesignable({ - current: b, -}) - -console.log(schema.toJSON()); -``` - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -#### remove - -移除当前节点 - -```tsx | pure -dn.remove(); -console.log(schema.toJSON()); -``` - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.remove(); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { -- b: { -- type: 'void', -- properties: { -- c: { -- type: 'void', -- } -- } -- } - } -} -``` - -#### insertBeforeBegin - -在当前节点的前面插入,并会触发 `insertAdjacent` 事件。 - -```tsx | pure -dn.insertBeforeBegin({ - type: 'void', - name: 'd', -}); -console.log(schema.toJSON()); -``` - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.insertBeforeBegin({ - type: 'void', - name: 'd', -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { -+ d: { -+ type: 'void', -+ }, - b: { - type: 'void', - properties: { - c: { - type: 'void', - } - } - } - } -} -``` - -#### insertAfterBegin - -在当前节点的前面插入,并会触发 `insertAdjacent` 事件。 - -```tsx | pure -dn.insertAfterBegin({ - type: 'void', - name: 'd', -}); -console.log(schema.toJSON()); -``` - - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.insertAfterBegin({ - type: 'void', - name: 'd', -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { -+ d: { -+ type: 'void', -+ }, - c: { - type: 'void', - } - } - } - } -} -``` - -#### insertBeforeEnd - -在当前节点的前面插入,并会触发 `insertAdjacent` 事件。 - -```tsx | pure -dn.insertBeforeEnd({ - type: 'void', - name: 'd', -}); -console.log(schema.toJSON()); -``` - - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.insertBeforeEnd({ - type: 'void', - name: 'd', -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, -+ d: { -+ type: 'void', -+ }, - } - } - } -} -``` - -#### insertAfterEnd - -在当前节点的前面插入,并会触发 `insertAdjacent` 事件。 - -```tsx | pure -dn.insertAfterEnd({ - type: 'void', - name: 'd', -}); -console.log(schema.toJSON()); -``` - - -```tsx -import React from 'react'; -import { Schema } from '@formily/json-schema'; -import { createDesignable } from '@nocobase/client'; - -const schema = new Schema({ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - }, - }, - }, - }, -}); - -const b = schema.properties['b']; - -const dn = createDesignable({ - current: b, -}); - -dn.insertAfterEnd({ - type: 'void', - name: 'd', -}); - -export default () =>
{JSON.stringify(schema.toJSON(), null, 2)}
; -``` - -```diff -{ - type: 'void', - name: 'a', - properties: { - b: { - type: 'void', - properties: { - c: { - type: 'void', - } - } - }, -+ d: { -+ type: 'void', -+ }, - } -} -``` - -#### insertAdjacent - -根据第一个参数决定插入的位置,是前面四个方法的封装。 - -```tsx | pure -class Designable { - insertAdjacent(position: Position, schema: ISchema, options?: InsertAdjacentOptions): void | Promise -} -``` - -### 事件监听和 API 请求 - -- `on` :添加事件监听的基础方法 -- `loadAPIClientEvents`:调用 `on` 方法添加对 `insertAdjacent`、`patch`、`batchPatch`、`remove` 的事件的监听,主要功能是将变更的 Schema 更新到服务端 -- `emit`:是根据事件名称,调用之前注册过的方法,具体是由前面讲过的 *插入操作和删除操作* 触发 - -而 `loadAPIClientEvents()` 并非在初始化时调用,需要手动调用,换而言之,如果不调用 `dn.loadAPIClientEvents()`,则不会将更新发送到服务端,主要是简化在单测或者 DEMO 环境对服务端的 Mock。 - -## 工具函数 - -### createDesignable() - -对 `new Designable()` 的简单封装。 - -```tsx | pure -function createDesignable(options: CreateDesignableProps) { - return new Designable(options); -} -``` - -```tsx | pure -const dn = createDesignable({ current: schema }); -``` - -## Hooks - -### useFieldSchema() - -用户获取当前节点 Schema JSON 对象,更多信息请参考 [formily useFieldSchema()](https://react.formilyjs.org/api/hooks/use-field-schema)。 - -- 类型 - -```tsx | pure -import { Schema } from '@formily/json-schema'; -const useFieldSchema: () => Schema; -``` - -- 示例 - -```tsx -/** - * defaultShowCode: true - */ -import React from 'react'; -import { useFieldSchema } from '@formily/react'; -import { Application, Plugin, SchemaComponent } from '@nocobase/client'; -const Demo = ({ children }) => { - const fieldSchema = useFieldSchema(); - return
-
{ JSON.stringify(fieldSchema, null, 2)}
-
{children}
-
-} -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Demo', // 这里是 Demo 组件 - 'properties': { - 'world': { - 'type': 'void', - 'x-component': 'Demo', // 这里也是 Demo 组件 - }, - } -} - -const Root = () => { - return -} - -const app = new Application({ - providers: [Root] -}) - -export default app.getRootComponent(); -``` - -### useField() - -获取当前节点 Schema 实例,更多信息请参考 [formily useField()](https://react.formilyjs.org/api/hooks/use-field) - -- 类型 - -```tsx | pure -import { GeneralField } from '@formily/core'; -const useField: () => T; -``` - -- 示例 - -```tsx | pure -const Demo = () => { - const field = useField(); - console.log('field', field); - return
-} - -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Demo', // 这里是 Demo 组件 - 'properties': { - 'world': { - 'type': 'void', - 'x-component': 'Demo', // 这里也是 Demo 组件 - }, - } -} - -const Root = () => { - return -} -``` - -### useDesignable() - -对当前 Schema 节点的修改操作。 - -- 类型 - -```tsx | pure -interface InsertAdjacentOptions { - wrap?: (s: ISchema) => ISchema; - removeParentsIfNoChildren?: boolean; - breakRemoveOn?: ISchema | BreakFn; - onSuccess?: any; -} - -type Position = 'beforeBegin' | 'afterBegin' | 'beforeEnd' | 'afterEnd'; - -function useDesignable(): { - dn: Designable; - designable: boolean; - reset: () => void; - refresh: () => void; - setDesignable: (value: boolean) => void; - findComponent(component: any): any; - patch: (key: ISchema | string, value?: any) => void - on(name: "error" | "insertAdjacent" | "remove" | "patch" | "batchPatch", listener: any): void - remove(schema?: any, options?: RemoveOptions): void - insertAdjacent(position: Position, schema: ISchema, options?: InsertAdjacentOptions): void - insertBeforeBegin(schema: ISchema): void; - insertAfterBegin(schema: ISchema): void; - insertBeforeEnd(schema: ISchema): void; - insertAfterEnd(schema: ISchema): void; -} -``` - -- 详细解释 - - - designable、reset、refresh、setDesignable:这些值继承自 [SchemaComponentContext](https://www.baidu.com) - - dn:是 `Designable` 的实例 - - findComponent:用于查找 Schema 中字符串对应真正的组件,如果组件未注册则返回 `null` - - remove:内部调用的是 `dn.remove` 方法 - - on:内部调用的是 `dn.on` 方法 - - insertAdjacent:插入新的 Schema 节点,内部调用的是 `dn.insertAdjacent` 方法 - - position:插入位置 - - schema:新的 Schema 节点 - - Options - - wrap:对 Schema 的二次处理的回调函数 - - removeParentsIfNoChildren:当没有子元素时,删除父元素 - - breakRemoveOn:停止删除的判断回调 - - onSuccess:插入成功的回调 - - insertBeforeBegin:内部调用的是 `dn.insertBeforeBegin` 方法 - - insertAfterBegin:内部调用的是 `dn.insertAfterBegin` 方法 - - insertBeforeEnd:内部调用的是 `dn.insertBeforeEnd` 方法 - - insertAfterEnd:内部调用的是 `dn.insertAfterEnd` 方法 -- 示例 - -插入节点。 - -```tsx -import React from 'react'; -import { - SchemaComponentProvider, - SchemaComponent, - useDesignable, -} from '@nocobase/client'; -import { observer, Schema, useFieldSchema } from '@formily/react'; -import { Button, Space } from 'antd'; -import { uid } from '@formily/shared'; - -const Hello = observer( - (props) => { - const { insertAdjacent } = useDesignable(); - const fieldSchema = useFieldSchema(); - return ( -
-

{fieldSchema.name}

- - - - - - -
{props.children}
-
- ); - }, - { displayName: 'Hello' }, -); - -const Page = observer( - (props) => { - return
{props.children}
; - }, - { displayName: 'Page' }, -); - -export default () => { - return ( - - - - ); -}; -``` - -部分更新。 - -```tsx -import React from 'react'; -import { - SchemaComponentProvider, - SchemaComponent, - useDesignable, -} from '@nocobase/client'; -import { observer, Schema, useField, useFieldSchema } from '@formily/react'; -import { FormItem } from '@formily/antd-v5'; -import { Button } from 'antd'; -import { uid } from '@formily/shared'; - -const Hello = observer( - (props) => { - const fieldSchema = useFieldSchema(); - const field = useField(); - const { dn } = useDesignable(); - return ( -
-

{field.title}

- { JSON.stringify(props) } -
- { JSON.stringify(field.componentProps) } -
- { JSON.stringify(field.decoratorProps) } -
- { JSON.stringify(fieldSchema.toJSON()) } -
- - -
- ); - }, - { displayName: 'Hello' }, -); - -const Page = observer( - (props) => { - return
{props.children}
; - }, - { displayName: 'Page' }, -); - -export default () => { - return ( - - - - ); -}; -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/schema-component.md b/packages/core/client/docs/zh-CN/core/ui-schema/schema-component.md deleted file mode 100644 index 9a6aa8310..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/schema-component.md +++ /dev/null @@ -1,212 +0,0 @@ -# SchemaComponent - -## Context - -### SchemaComponentContext - -```tsx | pure -interface SchemaComponentContext { - scope?: any; - components?: SchemaReactComponents; - refresh?: () => void; - reset?: () => void; - designable?: boolean; - setDesignable?: (value: boolean) => void; -} -``` - -Schema 渲染的上下文。 - -- `scope`:Schema 中变量的映射 -- `components`: Schema 中组件的映射 -- `refresh`:触发 React 重新渲染的工具函数 -- `reset`:重置整个 Schema 节点 -- `designable`:是否显示设计器,默认 `false` -- `setDesignable`:用于切换 `designable` 的值 - -## Hooks - -### useSchemaOptionsContext() - -用于获取注册的 `scope` 和 `components`。 - -```tsx | pure -const { scope, components } = useSchemaOptionsContext(); -``` - -## 组件 - -### SchemaComponentProvider - -其是对 `SchemaComponentContext.Provider` 和 [FormProvider ](https://react.formilyjs.org/api/components/form-provider)的封装,并内置在 `Application` 中,并且会将 `app.components` 和 `app.scopes` 传递过去,所以一般情况下 *不需要关注* 此组件。 - -- props - -```tsx | pure -interface SchemaComponentProviderProps { - designable?: boolean; - form?: Form; - scope?: any; - components?: SchemaReactComponents; -} -``` - -- 详细解释 - - `designable`:`SchemaComponentContext` 中 `designable` 的默认值 - - `form`:NocoBase 的 Schema 能力是基于 formily 的 `FormProvider` 提供的,form 是其参数,默认为 `createForm()` - - `scope`:Schema 中所用到的变量,会通过 `SchemaComponentContext` 进行传递 - - `components`:Schema 中所用到的组件,会通过 `SchemaComponentContext` 进行传递 - -### SchemaComponent - -用于渲染 Schema,此组件必须和 `SchemaComponentProvider` 一起使用,因为 `SchemaComponentProvider` 提供了 [FormProvider](https://react.formilyjs.org/api/components/form-provider) 作为渲染 Schema 的根节点。 - -- Props - -```tsx | pure -type SchemaComponentProps = (ISchemaFieldProps | IRecursionFieldProps) & { - memoized?: boolean; - components?: SchemaReactComponents; - scope?: any; -} -``` - -- 详细解释 - - - `memoized`:当为 `true` 时,会对每层的 Schema 使用 `useMemo()` 进行处理 - - `components`:同 `SchemaComponentProvider` 的 `components` - - `scope`: 同 `SchemaComponentProvider` 的 `components` - -## 综合示例 - -结合 `SchemaComponentProvider`、 `useSchemaComponentContext()` 和 `SchemaComponent`。 - -```tsx -/** - * defaultShowCode: true - */ -import { SchemaComponentProvider, useSchemaComponentContext, SchemaComponent, } from '@nocobase/client'; -const Hello = () => { - const { designable, setDesignable } = useSchemaComponentContext(); - return
-
hello world
- -
; -} - -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Hello', -} - -const Demo = () => { - return -} - -const Root = () => { - return - - -} - -export default Root; -``` - -使用 `new Application()` 的方式,其内置了 `SchemaComponentProvider` ,我们可以如下操作: - -```tsx -/** - * defaultShowCode: true - */ -import { Application, Plugin, useSchemaComponentContext, SchemaComponent } from '@nocobase/client'; -const Hello = () => { - const { designable, setDesignable } = useSchemaComponentContext(); - return
-
hello world
- -
; -} - -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Hello', -} - -const HomePage = () => { - return -} - -class MyPlugin extends Plugin { - async load() { - this.app.addComponents({ Hello }); - this.app.router.add('home', { - path: '/', - Component: HomePage, - }) - } -} - -const app = new Application({ - router: { - type: 'memory', - initialEntries: ['/'], - }, - plugins: [MyPlugin], -}) - -export default app.getRootComponent(); -``` - -### SchemaComponentOptions - -在应用中,会有很多层级的嵌套,每一层都可能提供自己的组件和 scope,此组件就是为了层层传递 Schema 所需的 `components` 和 `scope` 的。 - -- props - -```tsx | pure -interface SchemaComponentOptionsProps { - scope?: any; - components?: SchemaReactComponents; -} -``` - -- 示例 - -```tsx -/** - * defaultShowCode: true - */ -import { SchemaComponentProvider, useSchemaComponentContext, SchemaComponent, SchemaComponentOptions } from '@nocobase/client'; -const World = () => { - return
world
-} - -const Hello = ({ children }) => { - return
-
hello
- { children } -
; -} - -const schema = { - type: 'void', - name: 'hello', - 'x-component': 'Hello', - properties: { - world: { - type: 'void', - 'x-component': 'World', - }, - }, -} - -const Root = () => { - return - - -} - -export default Root; -``` diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/schema-initializer-manager.md b/packages/core/client/docs/zh-CN/core/ui-schema/schema-initializer-manager.md deleted file mode 100644 index 483f9d2b6..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/schema-initializer-manager.md +++ /dev/null @@ -1,186 +0,0 @@ -# SchemaInitializerManager - -## 实例方法 - -### schemaInitializerManager.add() - -添加 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - add(...schemaInitializerList: SchemaInitializer[]): void -} -``` - -- 示例 - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add block', - items: [ - { - name: 'demo', - type: 'item', - title: 'Demo' - } - ], -}); - -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.add(myInitializer); - } -} -``` - -### schemaInitializerManager.get() - -获取一个 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - get(name: string): SchemaInitializer | undefined -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const myInitializer = this.app.schemaInitializerManager.get('MyInitializer'); - } -} -``` - -### schemaInitializerManager.getAll() - -获取所有的 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - getAll(): Record> -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const list = this.app.schemaInitializerManager.getAll(); - } -} -``` - -### app.schemaInitializerManager.has() - -判断是否有存在某个 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - has(name: string): boolean -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const hasMyInitializer = this.app.schemaInitializerManager.has('MyInitializer'); - } -} -``` - -### schemaInitializerManager.remove() - -移除 SchemaInitializer 实例。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - remove(name: string): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.schemaInitializerManager.remove('MyInitializer'); - } -} -``` - -### schemaInitializerManager.addItem() - -添加 SchemaInitializer 实例的 Item 项,其和直接 schemaInitializer.add() 方法的区别是,可以确保在实例存在时才会添加。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - addItem(schemaInitializerName: string, itemName: string, data: Omit): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - // 方式1:先获取,再添加子项,需要确保已注册 - const myInitializer = this.app.schemaInitializerManager.get('MyInitializer'); - if (myInitializer) { - myInitializer.add('b', { type: 'item', title: 'B' }) - } - - // 方式2:通过 addItem,内部确保在 MyInitializer 注册时才会添加 - this.app.schemaInitializerManager.addItem('MyInitializer', 'b', { - type: 'item', - title: 'B' - }) - } -} -``` - -### schemaInitializerManager.removeItem() - -移除 实例的 Item 项,其和直接 schemaInitializer.remove() 方法的区别是,可以确保在实例存在时才会移除。 - -- 类型 - -```tsx | pure -class SchemaInitializerManager { - removeItem(schemaInitializerName: string, itemName: string): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - // 方式1:先获取,再删除子项,需要确保已注册 - const myInitializer = this.app.schemaInitializerManager.get('MyInitializer'); - if (myInitializer) { - myInitializer.remove('a') - } - - // 方式2:通过 addItem,内部确保在 MyInitializer 注册时才会移除 - this.app.schemaInitializerManager.remove('MyInitializer', 'a') - } -} -``` diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/schema-initializer.md b/packages/core/client/docs/zh-CN/core/ui-schema/schema-initializer.md deleted file mode 100644 index 2637b0a80..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/schema-initializer.md +++ /dev/null @@ -1,704 +0,0 @@ -# SchemaInitializer - -## new SchemaInitializer(options) - -```tsx | pure -interface SchemaInitializerOptions { - Component?: ComponentType; - componentProps?: P1; - style?: React.CSSProperties; - title?: string; - icon?: ReactNode; - - items?: SchemaInitializerItemType[]; - ItemsComponent?: ComponentType; - itemsComponentProps?: P2; - itemsComponentStyle?: React.CSSProperties; - - insertPosition?: 'beforeBegin' | 'afterBegin' | 'beforeEnd' | 'afterEnd'; - designable?: boolean; - wrap?: (s: ISchema) => ISchema; - onSuccess?: (data: any) => void; - insert?: InsertType; - useInsert?: () => InsertType; - - popover?: boolean; - popoverProps?: PopoverProps; -} - -class SchemaInitializer { - constructor(options: SchemaInitializerOptions & { name: string }): SchemaInitializer; - add(name: string, item: Omit): void - get(nestedName: string): SchemaInitializerItemType | undefined - remove(nestedName: string): void -} -``` - -### 详细解释 - -![](../static/KTUWb69kioUg8bxYTAMc2ReDnRg.png) - -- name:唯一标识,必填 -- Component 相关 - - - Component:触发组件,默认是 `Button` 组件 - - componentProps: 组件属性,默认是 `ButtonProps` - - title: 按钮的文本 - - icon:按钮的 icon 属性 - - style:组件的样式 -- Items 相关 - - - items:列表项配置 - - ItemsComponent:默认是渲染成一个列表的形式,可通过此参数自定义 items - - itemsComponentProps:`ItemsComponent` 的属性 - - itemsComponentStyle:`ItemsComponent` 的样式 -- popover 组件相关 - - - popover:是否使用 popover,默认为 `true` - - popoverProps:popover 的属性 -- Schema 操作相关 - - - insertPosition:插入位置,参考:[useDesignable()](/core/ui-schema/designable#usedesignable) - - designable:是否显示设计模式,参考:[useDesignable()](/core/ui-schema/designable#usedesignable) - - wrap:对 Schema 的二次处理,参考:[useDesignable()](/core/ui-schema/designable#usedesignable) - - onSuccess:Schema 更新到服务端后的回调,参考:[useDesignable()](/core/ui-schema/designable#usedesignable) - - insert:自定义 Schema 插入逻辑,默认为 [useDesignable()](/core/ui-schema/designable#usedesignable) 的 `insertAdjacent` - - useInsert:当自定义插入 Schema 的逻辑需要用到 Hooks 时,可以使用此参数 - -### 示例 - -#### 基础用法 - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add Block', - // 插入位置 - insertPosition: 'beforeEnd', - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - }, - ], -}); -``` - - - - -#### 定制化 `Component` - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - Component: (props) => ( - - C - - ), - componentProps: { - size: 'large', - }, - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - } - ], -}); -``` - - - -#### 不使用 Popover - -关于 `useDesignable()` 的说明请参考 [useDesignable](/core/ui-schema/designable#usedesignable)。 - -```tsx | pure -const schema = { - type: 'void', - title: Math.random(), - 'x-component': 'Hello', -}; -const MyInitializerComponent = () => { - const { insertBeforeEnd } = useDesignable(); - return -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Add block', - popover: false, - Component: MyInitializerComponent, -}); -``` - - - - -#### 定制化 Items - -```tsx | pure -const CustomListGridMenu: FC>> = (props) => { - const { items, options, ...others } = props; - return ( - ( - - - - )} - > - ); -}; - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - ItemsComponent: CustomListGridMenu, - items: [ - { - name: 'a', - title: 'Item A', - Component: Demo, - } - ], -}); -``` - - - -## options.items 配置详解 - -### 类型 - -```tsx | pure -interface SchemaInitializerComponentCommonProps { - title?: string; - schema?: ISchema; - style?: React.CSSProperties; - className?: string; -} - -interface SchemaInitializerItemBaseType extends SchemaInitializerComponentCommonProps { - name: string; - sort?: number; - type?: string; - Component?: string | ComponentType; - componentProps?: Omit; - useComponentProps?: () => Omit; - useVisible?: () => boolean; - children?: SchemaInitializerItemType[]; - useChildren?: () => SchemaInitializerItemType[]; - [index: string]: any; -} -``` - -### 两种定义方式:`Component` 和 `type` - - -- 通过 `Component` 定义 - -```tsx | pure - -const Demo = () => { - // 最终渲染 `SchemaInitializerItem` - return -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - items: [ - { - name: 'a', - Component: Demo, // 通过 Component 定义 - } - ], -}); -``` - -- 通过 `type` 定义 - -NocoBase 内置了一些常用的 `type`,例如 `type: 'item'`,相当于 `Component: SchemaInitializerItem`。 - -更多内置类型,请参考:[内置组件和类型](/core/ui-schema/schema-initializer#%E5%86%85%E7%BD%AE%E7%BB%84%E4%BB%B6%E5%92%8C%E7%B1%BB%E5%9E%8B) - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - items: [ - { - name: 'a', - type: 'item', - title: 'Demo' - } - ], -}); -``` - - - -### `children` 和动态方式 `useChildren` - -对于某些组件而言是有子列表项的,例如 `type: 'itemGroup'`,那么我们使用 children 属性,同时考虑到某些场景下 children 是动态的,需要从 Hooks 里面获取,那么就可以通过 `useChildren` 来定义。 - - - -### 动态显示隐藏 `useVisible` - - - -### 组件属性 `componentProps` 和动态属性 `useComponentProps` - -对于一些通用组件,我们可以通过 `componentProps` 来定义组件属性,同时考虑到某些场景下组件属性是动态的,需要从 Hooks 里面获取,那么就可以通过 `useComponentProps` 来定义。 - -当然也可以不使用这两个属性,直接封装成一个组件,然后通过 `Component` 来定义。 - - - -### 公共属性和组件属性 - -```tsx | pure -{ - name: 'demo', - title: 'Demo', - foo: 'bar', - Component: Demo, - componentProps: { - zzz: 'xxx', - }, -} -``` - -从上面的示例中我么看到,从配置项中获取组件组件所需的数据有两个方式: - -- 组件属性:通过 `componentProps` 来定义,例如 `zzz: 'xxx'` -- 公共属性:将属性直接定义在配置项上,例如 `foo: 'bar'`、`name`、`title` - -在获取上 - -- `componentProps` 定义的数据会被传递给组件的 `props` -- 直接定义在配置项上的数据会则需要通过 [useSchemaInitializerItem()](/core/ui-schema/schema-initializer#useschemainitializeritem) 获取 - -```tsx | pure -const Demo = (props) => { - console.log(props); // { zzz: 'xxx' } - const { foo } = useSchemaInitializerItem(); // { foo: 'bar' } -} -``` - -## 实例方法 - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'item a', - type: 'itemGroup', - children: [ - { - name: 'a1', - title: 'item a1', - } - ], - }, - ], -}); -``` - -```tsx -import { SchemaInitializer, Application, useSchemaInitializerRender } from '@nocobase/client'; -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'item a', - type: 'itemGroup', - children: [ - { - name: 'a1', - title: 'item a1', - type: 'item', - } - ], - }, - ], -}); - -const Root = () => { - const { render } = useSchemaInitializerRender('MyInitializer'); - return render(); -} -const app = new Application({ - schemaInitializers: [myInitializer], - providers: [Root], - designable: true, -}); - -export default app.getRootComponent(); -``` - -### schemaInitializer.add() - -用于新增 Item,另一种添加方式参考 [schemaInitializerManager.addItem()](/core/ui-schema/schema-initializer-manager#schemainitializermanageradditem); - -- 类型 - -```tsx | pure -class SchemaInitializer { - add(name: string, item: Omit): void -} -``` - -- 参数说明 - -第一个参数是 name,作为唯一标识,用于增删改查,并且 `name` 支持 `.` 用于分割层级。 - -- 示例 - -```tsx | pure -myInitializer.add('b', { - type: 'item', - title: 'item b', -}) - -myInitializer.add('a.a2', { - type: 'item', - title: 'item a2', -}) -``` - -```tsx -import { SchemaInitializer, Application, useSchemaInitializerRender } from '@nocobase/client'; -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'item a', - type: 'itemGroup', - children: [ - { - name: 'a1', - title: 'item a1', - type: 'item', - } - ], - }, - ], -}); - -myInitializer.add('b', { - type: 'item', - title: 'item b', -}) - -myInitializer.add('a.a2', { - type: 'item', - title: 'item a2', -}) - -const Root = () => { - const { render } = useSchemaInitializerRender('MyInitializer'); - return render(); -} -const app = new Application({ - schemaInitializers: [myInitializer], - providers: [Root], - designable: true, -}); - - -export default app.getRootComponent(); -``` - - -### schemaInitializer.get() - -- 类型 - -```tsx | pure -class SchemaInitializer { - get(nestedName: string): SchemaInitializerItemType | undefined -} -``` - -- 示例 - -```tsx | pure -const itemA = myInitializer.get('a') - -const itemA1 = myInitializer.add('a.a1') -``` - -### schemaInitializer.remove() - -另一种移除方式参考 [schemaInitializerManager.addItem()](/core/ui-schema/schema-initializer-manager#schemainitializermanagerremoveitem); - -- 类型 - -```tsx | pure -class SchemaInitializer { - remove(nestedName: string): void -} -``` - -- 示例 - -```tsx | pure -myInitializer.remove('a.a1') - -myInitializer.remove('a') -``` - -## Hooks - -### useSchemaInitializer() - -用于获取 `SchemaInitializer` 上下文内容。 - -- 类型 - -```tsx | pure -export type InsertType = (s: ISchema) => void; - -const useSchemaInitializer: () => { - insert: InsertType; - options: SchemaInitializerOptions; - visible?: boolean; - setVisible?: (v: boolean) => void; -} -``` - -- 参数详解 - - `insert`:参数是 Schema 对象,用于插入 Schema - - `options`:获取 `new SchemaInitializer(options)` 时 options 配置 - - `visible`:popover 是否显示 - - `setVisible`:设置 popover 显示状态 - -- 示例 - -```tsx | pure -const schema = { - type: 'void', - 'x-component': 'Hello', -} -const Demo = () => { - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert(schema); - }; - return ; -} -``` - -### useSchemaInitializerRender() - -用于渲染 `SchemaInitializer`。 - -- 类型 - -```tsx | pure -function useSchemaInitializerRender(name: string, options?: SchemaInitializerOptions): { - exists: boolean; - render: (props?: SchemaInitializerOptions) => React.FunctionComponentElement; -} -``` - -- 参数详解 - -返回的 `render` 方法可以接收一个参数,用于覆盖 `new SchemaInitializer(options)` 的 `options` 配置。 - -- 示例 - -```tsx | pure -const Demo = () => { - const filedSchema = useFieldSchema(); - const { render } = useSchemaInitializerRender(fieldSchema['x-initializer'], fieldSchema['x-initializer-props']); - return
-
{ render() }
-
可以进行参数的二次覆盖:{ render({ style: { color: 'red' } }) }
-
-} -``` - - - -### useSchemaInitializerItem() - -用于获取配置项内容的,配置项是指的 `SchemaInitializer` 中的 `items` 中的一项。 - -- 类型 - -```tsx | pure -const useSchemaInitializerItem: () => T -``` - -- 示例 - -```tsx | pure -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'a', - title: 'Item A', - foo: 'bar', - Component: Demo, - }, - ], -}); - -/** - * 通过 useSchemaInitializerItem() 获取到的是 - * { - * name: 'a', - * title: 'Item A', - * foo: 'bar', - * Component: Demo, - * } - */ -const Demo = () => { - const { title, foo } = useSchemaInitializerItem(); - return
{ title } - { foo }
-} -``` - - - -## 内置组件和类型 - -| type | Component | 效果 | -| ----------- | ------------------------------ | ----------------------------------------- | -| item | SchemaInitializerItem | 文本| -| itemGroup | SchemaInitializerItemGroup | 分组,同 antd `Menu` 组件的 `type: 'group'` | -| subMenu | SchemaInitializerSubMenu | 子菜单,同 antd `Menu` 组件的子菜单 | -| divider | SchemaInitializerDivider | 分割线,同 antd `Menu` 组件的 `type: 'divider'` | -| switch | SchemaInitializerSwitch | 开关 | -| actionModal | SchemaInitializerActionModal | 弹窗| - -以下每个示例都提供了 2 种[定义方式](/core/ui-schema/schema-initializer#两种定义方式component-和-type),一种是通过 `Component` 定义,另一种是通过 `type` 定义。 - -### `type: 'item'` & `SchemaInitializerItem` - -文本项。 - -```tsx | pure -interface SchemaInitializerItemProps { - style?: React.CSSProperties; - className?: string; - name?: string; - icon?: React.ReactNode; - title?: React.ReactNode; - items?: SchemaInitializerItemType[]; - onClick?: (args?: any) => any; -} -``` - -核心参数是 `title`、`icon`、`onClick`、`items`,其中 `onClick` 用于插入 Schema,`items` 用于渲染子列表项。 - - - -### `type: 'itemGroup'` & SchemaInitializerItemGroup - -分组。 - -```tsx | pure -interface SchemaInitializerItemGroupProps { - name: string; - title: string; - children?: SchemaInitializerOptions['items']; - divider?: boolean; -} -``` - -核心参数是 `title`、`children`,其中 `children` 用于渲染子列表项,`divider` 用于渲染分割线。 - - - -### `type: 'switch'` & SchemaInitializerSwitch - -Switch 切换按钮。 - -```tsx | pure -interface SchemaInitializerSwitchItemProps extends SchemaInitializerItemProps { - checked?: boolean; - disabled?: boolean; -} -``` - -核心参数是 `checked`、`onClick`,其中 `onClick` 用于插入或者移除 Schema。 - - - -### `type: 'subMenu'` & SchemaInitializerSubMenu - -子菜单。 - - - -### `type: 'divider'` & SchemaInitializerDivider - -分割线。 - - - -## 渲染组件 - -### SchemaInitializerChildren - -用于自定义渲染多个列表项。 - -```tsx | pure - -const Demo = ({ children }) => { - // children: [{ name: 'a1', Component: ItemA1 }, { name: 'a2', type: 'item', title: 'ItemA2' }] - return { children } -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - items: [ - { - name: 'test', - Component: Demo, - children: [ - { - name: 'a1', - Component: ItemA1, - }, - { - name: 'a2', - type: 'item', - title: 'ItemA2', - } - ] - } - ], -}); -``` - -### SchemaInitializerChild - -用于自定义渲染单个列表项。 - -```tsx | pure -const Demo = (props) => { - return -} -``` diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/schema-settings-manager.md b/packages/core/client/docs/zh-CN/core/ui-schema/schema-settings-manager.md deleted file mode 100644 index e4f43a33d..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/schema-settings-manager.md +++ /dev/null @@ -1,188 +0,0 @@ -# SchemaSettingsManager - -## 实例方法 - -### schemaSettingsManager.add() - -添加 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - add(...schemaSettingList: SchemaSetting[]): void -} -``` - -- 示例 - -```tsx | pure -const mySchemaSettings = new SchemaSetting({ - name: 'MySchemaSettings', - title: 'Add block', - items: [ - { - name: 'demo', - type: 'item', - componentProps:{ - title: 'Demo' - } - } - ], -}); - -class MyPlugin extends Plugin { - async load() { - this.app.schemaSettingsManager.add(mySchemaSettings); - } -} -``` - -### schemaSettingsManager.get() - -获取一个 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - get(name: string): SchemaSetting | undefined -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const mySchemaSettings = this.app.schemaSettingsManager.get('MySchemaSettings'); - } -} -``` - -### schemaSettingsManager.getAll() - -获取所有的 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - getAll(): Record> -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const list = this.app.schemaSettingsManager.getAll(); - } -} -``` - -### app.schemaSettingsManager.has() - -判断是否有存在某个 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - has(name: string): boolean -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - const hasMySchemaSettings = this.app.schemaSettingsManager.has('MySchemaSettings'); - } -} -``` - -### schemaSettingsManager.remove() - -移除 SchemaSettings 实例。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - remove(name: string): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - this.app.schemaSettingsManager.remove('MySchemaSettings'); - } -} -``` - -### schemaSettingsManager.addItem() - -添加 SchemaSettings 实例的 Item 项,其和直接 schemaInitializer.add() 方法的区别是,可以确保在实例存在时才会添加。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - addItem(schemaInitializerName: string, itemName: string, data: Omit): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - // 方式1:先获取,再添加子项,需要确保已注册 - const mySchemaSettings = this.app.schemaSettingsManager.get('MySchemaSettings'); - if (mySchemaSettings) { - mySchemaSettings.add('b', { type: 'item', componentProps:{ title: 'B' } }) - } - - // 方式2:通过 addItem,内部确保在 mySchemaSettings 注册时才会添加 - this.app.schemaSettingsManager.addItem('MySchemaSettings', 'b', { - type: 'item', - componentProps:{ title: 'B' } - }) - } -} -``` - -### schemaSettingsManager.removeItem() - -移除 实例的 Item 项,其和直接 schemaInitializer.remove() 方法的区别是,可以确保在实例存在时才会移除。 - -- 类型 - -```tsx | pure -class SchemaSettingsManager { - removeItem(schemaInitializerName: string, itemName: string): void -} -``` - -- 示例 - -```tsx | pure -class MyPlugin extends Plugin { - async load() { - // 方式1:先获取,再删除子项,需要确保已注册 - const mySchemaSettings = this.app.schemaSettingsManager.get('MySchemaSettings'); - if (mySchemaSettings) { - mySchemaSettings.remove('a') - } - - // 方式2:通过 addItem,内部确保在 mySchemaSettings 注册时才会移除 - this.app.schemaSettingsManager.remove('MySchemaSettings', 'a') - } -} -``` diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/schema-settings.md b/packages/core/client/docs/zh-CN/core/ui-schema/schema-settings.md deleted file mode 100644 index b374cbdfa..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/schema-settings.md +++ /dev/null @@ -1,467 +0,0 @@ -# SchemaSettings - -## new SchemaSettings(options) - -创建一个 SchemaSettings 实例。 - -```tsx | pure -interface SchemaSettingsOptions { - name: string; - Component?: ComponentType; - componentProps?: T; - style?: React.CSSProperties; - - items: SchemaSettingsItemType[]; -} - -class SchemaSettings{ - constructor(options: SchemaSettingsOptions): SchemaSettings; - add(name: string, item: Omit): void - get(nestedName: string): SchemaSettingsItemType | undefined - remove(nestedName: string): void -} -``` - -### 详细解释 - -![](../static/VfPGbhWo9os0qTxcITkcHNfin4g.png) - -- name:唯一标识,必填 -- Component 相关 - - - Component:触发组件,默认是 `` 组件 - - componentProps: 组件属性 - - style:组件的样式 -- items:列表项配置 - -### 示例 - -#### 基础用法 - -```tsx | pure -const mySchemaSettings = new SchemaSettings({ - name: 'MySchemaSettings', - items: [ - { - name: 'demo1', // 唯一标识 - type: 'item', // 内置类型 - componentProps: { - title: 'DEMO1', - onClick() { - alert('DEMO1'); - }, - }, - }, - { - name: 'demo2', - Component: () => alert('DEMO2')} />, // 直接使用 Component 组件 - }, - ], -}); -``` - -#### 定制化 `Component` - -```tsx | pure -const mySchemaSettings = new SchemaSettings({ - name: 'MySchemaSettings', - Component: Button, // 自定义组件 - componentProps: { - type: 'primary', - children: '自定义按钮', - }, - // Component: (props) => , // 等同于上面效果 - items: [ - { - name: 'demo1', - type: 'item', - componentProps: { - title: 'DEMO', - }, - }, - ], -}); -``` - -## options.items 配置详解 - -```tsx | pure -interface SchemaSettingsItemCommon { - name: string; - sort?: number; - type?: string; - Component: string | ComponentType; - useVisible?: () => boolean; - children?: SchemaSettingsItemType[]; - useChildren?: () => SchemaSettingsItemType[]; - checkChildrenLength?: boolean; - componentProps?: Omit; - useComponentProps?: () => Omit; -} -``` - -### 两种定义方式:`Component` 和 `type` - - -- 通过 `Component` 定义 - -```tsx | pure - -const Demo = () => { - // 最终渲染 `SchemaSettingsItem` - return -} - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - Component: Demo, // 通过 Component 定义 - } - ], -}); -``` - -- 通过 `type` 定义 - -NocoBase 内置了一些常用的 `type`,例如 `type: 'item'`,相当于 `Component: SchemaSettingsItem`。 - -更多内置类型,请参考:[内置组件和类型](/core/ui-schema/schema-settings#%E5%86%85%E7%BD%AE%E7%BB%84%E4%BB%B6%E5%92%8C%E7%B1%BB%E5%9E%8B) - -```tsx | pure -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'a', - type: 'item', - componentProps: { - title: 'Demo', - }, - } - ], -}); -``` - - - -### `children` 和动态方式 `useChildren` - -对于某些组件而言是有子列表项的,例如 `type: 'itemGroup'`,那么我们使用 children 属性,同时考虑到某些场景下 children 是动态的,需要从 Hooks 里面获取,那么就可以通过 `useChildren` 来定义。 - - - -### 动态显示隐藏 `useVisible` - - - -### 组件属性 `componentProps` 和动态属性 `useComponentProps` - -对于一些通用组件,我们可以通过 `componentProps` 来定义组件属性,同时考虑到某些场景下组件属性是动态的,需要从 Hooks 里面获取,那么就可以通过 `useComponentProps` 来定义。 - -当然也可以不使用这两个属性,直接封装成一个组件,然后通过 `Component` 来定义。 - - - -## 实例方法 - -```tsx | pure -const mySchemaSettings = new SchemaSettings({ - name: 'MySchemaSettings', - items: [ - { - name: 'a', - type: 'itemGroup', - componentProps: { - title: 'item a' - }, - children: [ - { - name: 'a1', - title: 'item a1', - } - ], - }, - ], -}); -``` - -### schemaSettings.add() - -用于新增 Item。 - -- 类型 - -```tsx | pure -class SchemaSettings { - add(name: string, item: Omit): void -} -``` - -- 参数说明 - -第一个参数是 name,作为唯一标识,用于增删改查,并且 `name` 支持 `.` 用于分割层级。 - -- 示例 - -```tsx | pure -mySchemaSetting.add('b', { - type: 'item', - title: 'item b', -}) - -mySchemaSetting.add('a.a2', { - type: 'item', - title: 'item a2', -}) -``` - -### schemaSettings.get() - -- 类型 - -```tsx | pure -class SchemaSettings { - get(nestedName: string): SchemaSettingsItemType| undefined -} -``` - -- 示例 - -```tsx | pure -const itemA = mySchemaSetting.get('a') - -const itemA1 = mySchemaSetting.add('a.a1') -``` - -### schemaSettings.remove() - -- 类型 - -```tsx | pure -class SchemaSettings { - remove(nestedName: string): void -} -``` - -- 示例 - -```tsx | pure -mySchemaSetting.remove('a.a1') - -mySchemaSetting.remove('a') -``` - -## Hooks - -### useSchemaSettingsRender() - -用于渲染 SchemaSettings。 - -- 类型 - -```tsx | pure -function useSchemaSettingsRender(name: string, options?: SchemaSettingsOptions): { - exists: boolean; - render: (options?: SchemaSettingsRenderOptions) => React.ReactElement; -} -``` - -- 示例 - -```tsx | pure -const Demo = () => { - const filedSchema = useFieldSchema(); - const { render, exists } = useSchemaSettingsRender(fieldSchema['x-settings'], fieldSchema['x-settings-props']) - return
-
{ render() }
-
可以进行参数的二次覆盖:{ render({ style: { color: 'red' } }) }
-
-} -``` - - - -### useSchemaSettings() - -获取 schemaSetting 上下文数据。 - -上下文数据包含了 `schemaSetting` 实例化时的 `options` 以及调用 `useSchemaSettingsRender()` 时传入的 `options`。 - -- 类型 - -```tsx | pure -interface UseSchemaSettingsResult extends SchemaSettingsOptions { - dn?: Designable; - field?: GeneralField; - fieldSchema?: Schema; -} - -function useSchemaSettings(): UseSchemaSettingsResult; -``` - -- 示例 - -```tsx | pure -const { dn } = useSchemaSettings(); -``` - -### useSchemaSettingsItem() - -用于获取一个 item 的数据。 - -- 类型 - -```tsx | pure -export type SchemaSettingsItemType = { - name: string; - type?: string; - sort?: number; - Component?: string | ComponentType; - componentProps?: T; - useComponentProps?: () => T; - useVisible?: () => boolean; - children?: SchemaSettingsItemType[]; - [index]: any; -}; - -function useSchemaSettingsItem(): SchemaSettingsItemType; -``` - -- 示例 - -```tsx | pure -const { name } = useSchemaSettingsItem(); -``` - -## 内置组件和类型 - -| type | Component | 效果 | -| ----------- | ------------------------------ | ----------------------------------------- | -| item | SchemaSettingsItem | 文本 | -| itemGroup | SchemaSettingsItemGroup | 分组,同 Menu 组件的 `type: 'itemGroup'` | -| subMenu | SchemaSettingsSubMenu | 子菜单,同 Menu 组件的子菜单 | -| divider | SchemaSettingsDivider | 分割线,同 Menu 组件的 `type: 'divider'` | -| remove | SchemaSettingsRemove | 删除,用于删除一个区块 | -| select | SchemaSettingsSelectItem | 下拉选择 | -| cascader | SchemaSettingsCascaderItem | 级联选择 | -| switch | SchemaSettingsSwitchItem | 开关 | -| popup | SchemaSettingsPopupItem | 弹出层 | -| actionModal | SchemaSettingsActionModalItem | 操作弹窗 | -| modal | SchemaSettingsModalItem | 弹窗 | - -### SchemaSettingsItem - -文本,对应的 `type` 为 `item`。 - -```tsx | pure -interface SchemaSettingsItemProps extends Omit { - title: string; -} -``` - -核心参数为 `title` 和 `onClick`,可以在 `onClick` 中修改 schema。 - - - -### SchemaSettingsItemGroup - -分组,对应的 `type` 为 `itemGroup`。 - -核心参数是 `title`。 - - - -### SchemaSettingsSubMenu - -子菜单,对应的 `type` 为 `subMenu`。 - -核心参数是 `title`。 - - - -### SchemaSettingsDivider - -分割线,对应的 `type` 为 `divider`。 - - - -### SchemaSettingsRemove - -删除,对应的 `type` 为 `remove`。 - -```tsx | pure -interface SchemaSettingsRemoveProps { - confirm?: ModalFuncProps; - removeParentsIfNoChildren?: boolean; - breakRemoveOn?: ISchema | ((s: ISchema) => boolean); -} -``` - -- `confirm`:删除前的确认弹窗 -- `removeParentsIfNoChildren`:如果删除后没有子节点了,是否删除父节点 -- `breakRemoveOn`:如果删除的节点满足条件,是否中断删除 - - - -### SchemaSettingsSelectItem - -选择器,对应的 `type` 为 `select`。 - - - -### SchemaSettingsCascaderItem - -级联选择,对应的 `type` 为 `cascader`。 - -### SchemaSettingsSwitchItem - -开关,对应的 `type` 为 `switch`。 - - - -### SchemaSettingsModalItem - -弹窗,对应的 `type` 为 `modal`。 - -```tsx | pure -export interface SchemaSettingsModalItemProps { - title: string; - onSubmit: (values: any) => void; - initialValues?: any; - schema?: ISchema | (() => ISchema); - modalTip?: string; - components?: any; - hidden?: boolean; - scope?: any; - effects?: any; - width?: string | number; - children?: ReactNode; - asyncGetInitialValues?: () => Promise; - eventKey?: string; - hide?: boolean; -} -``` - -我们可以通过 `schema` 参数来定义弹窗的表单,然后在 `onSubmit` 中获取表单的值,然后修改当前 schema 节点。 - - - -### SchemaSettingsActionModalItem - -操作弹窗,对应的 `type` 为 `actionModal`。 - -其和 `modal` 的区别是,`SchemaSettingsModalItem` 弹窗会丢失上下文,而 `SchemaSettingsActionModalItem` 会保留上下文,简单场景下可以使用 `SchemaSettingsModalItem`,复杂场景下可以使用 `SchemaSettingsActionModalItem`。 - -```tsx | pure -export interface SchemaSettingsActionModalItemProps extends SchemaSettingsModalItemProps, Omit { - uid?: string; - initialSchema?: ISchema; - schema?: ISchema; - beforeOpen?: () => void; - maskClosable?: boolean; -} -``` - - diff --git a/packages/core/client/docs/zh-CN/core/ui-schema/schema-toolbar.md b/packages/core/client/docs/zh-CN/core/ui-schema/schema-toolbar.md deleted file mode 100644 index dfd809bba..000000000 --- a/packages/core/client/docs/zh-CN/core/ui-schema/schema-toolbar.md +++ /dev/null @@ -1,427 +0,0 @@ -# SchemaToolbar - -![SchemaToolbar](../static/designer.png) - -## 组件 - -### SchemaToolbar 组件 - -此为默认的 Toolbar 组件,其内部会自动根据 Schema 的 `x-settings`、`x-initializer` 渲染 `SchemaSettings`、`SchemaInitializer` 和 `Drag` 组件。 - -Toolbar 具体的渲染规则为:当有 `x-toolbar` 会渲染对应的组件;当无 `x-toolbar` 但是有 `x-settings`、`x-initializer` 会渲染默认的 `SchemaToolbar` 组件。 - -- 类型 - -```tsx | pure -interface SchemaToolbarProps { - title?: string; - draggable?: boolean; - initializer?: string | false; - settings?: string | false; - /** - * @default true - */ - showBorder?: boolean; - showBackground?: boolean; -} -``` - -- 详细解释 - - `title`:左上角的标题 - - `draggable`:是否可以拖拽,默认为 `true` - - `initializer`:`SchemaInitializer` 的默认值,当 schema 里没有 `x-initializer` 时,会使用此值;当为 `false` 时,不会渲染 `SchemaInitializer` - - `settings`:`SchemaSettings` 的默认值,当 schema 里没有 `x-settings` 时,会使用此值;当为 `false` 时,不会渲染 `SchemaSettings` - - `showBorder`:边框是否变为橘色 - - `showBackground`:背景是否变为橘色 - -- 示例 - -未指定 `x-toolbar` 时会渲染默认的 `SchemaToolbar` 这个组件。 - -```tsx -import { useFieldSchema } from '@formily/react'; -import { - Application, - CardItem, - Grid, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - SchemaSettings, - useSchemaInitializer, - useSchemaInitializerItem, -} from '@nocobase/client'; -import React from 'react'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'remove', - type: 'remove', - componentProps: { - removeParentsIfNoChildren: true, - }, - }, - ], -}); - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'demo1', - title: 'Demo1', - Component: () => { - const itemConfig = useSchemaInitializerItem(); - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - 'x-settings': 'mySettings', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', - }); - }; - return ; - }, - }, - ], -}); - -const Hello = () => { - const schema = useFieldSchema(); - return

Hello, world! {schema.name}

; -}; - -const hello1 = Grid.wrap({ - type: 'void', - // 仅指定了 `x-settings` 但是没有 `x-toolbar`,会使用默认的 `SchemaToolbar` 组件 - 'x-settings': 'mySettings', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', -}); - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.app.addComponents({ Grid, CardItem, Hello }); - this.app.schemaSettingsManager.add(mySettings); - this.app.schemaInitializerManager.add(myInitializer); - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - }, - designable: true, - plugins: [PluginHello], -}); - -export default app.getRootComponent(); -``` - -自定义 Toolbar 组件。 - - -```tsx -import { useFieldSchema } from '@formily/react'; -import { - Application, - CardItem, - Grid, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - SchemaSettings, - SchemaToolbar, - useSchemaInitializer, - useSchemaInitializerItem, -} from '@nocobase/client'; -import React from 'react'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'remove', - type: 'remove', - componentProps: { - removeParentsIfNoChildren: true, - }, - }, - ], -}); - -const MyToolbar = () => { - return -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'demo1', - title: 'Demo1', - Component: () => { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - // 使用自定义的 Toolbar 组件 - 'x-toolbar': 'MyToolbar', - 'x-settings': 'mySettings', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', - }); - }; - return ; - }, - }, - ], -}); - -const Hello = () => { - const schema = useFieldSchema(); - return

Hello, world! {schema.name}

; -}; - -const hello1 = Grid.wrap({ - type: 'void', - // 使用自定义的 Toolbar 组件 - 'x-toolbar': 'MyToolbar', - 'x-settings': 'mySettings', - 'x-decorator': 'CardItem', - 'x-component': 'Hello', -}); - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.app.addComponents({ Grid, CardItem, Hello, MyToolbar }); - this.app.schemaSettingsManager.add(mySettings); - this.app.schemaInitializerManager.add(myInitializer); - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - }, - designable: true, - plugins: [PluginHello], -}); - -export default app.getRootComponent(); -``` - -## Hooks - -### useSchemaToolbarRender() - -用于渲染 `SchemaToolbar`。 - -- 类型 - -```tsx | pure -const useSchemaToolbarRender: (fieldSchema: ISchema) => { - render(props?: SchemaToolbarProps): React.JSX.Element; - exists: boolean; -} -``` - -- 详细解释 - -前面示例中 `'x-decorator': 'CardItem'` 中组件 `CardItem` 里面就调用了 `useSchemaToolbarRender()` 进行渲染。内置的组件还有:`BlockItem`、`CardItem`、`Action`、`FormItem`。 - -`render()` 支持二次覆盖组件属性。 - -- 示例 - -```tsx | pure -const MyDecorator = () => { - const filedSchema = useFieldSchema(); - const { render } = useSchemaToolbarRender(filedSchema); // 从 Schema 中读取 Toolbar 组件 - - return { render() } -} -``` - - -```tsx -import { Card } from 'antd'; -import { useFieldSchema } from '@formily/react'; -import { - Application, - CardItem, - Grid, - Plugin, - SchemaComponent, - SchemaInitializer, - SchemaInitializerItem, - SchemaSettings, - SchemaToolbar, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaToolbarRender -} from '@nocobase/client'; -import React from 'react'; - -const mySettings = new SchemaSettings({ - name: 'mySettings', - items: [ - { - name: 'remove', - type: 'remove', - componentProps: { - removeParentsIfNoChildren: true, - }, - }, - ], -}); - -const MyToolbar = (props) => { - return -} - -// 自定义包装器 -const MyDecorator = ({children}) => { - const filedSchema = useFieldSchema(); - // 使用 `useSchemaToolbarRender()` 获取并渲染内容 - const { render } = useSchemaToolbarRender(filedSchema); - return { render({ draggable: false }) }{children} -} - -const myInitializer = new SchemaInitializer({ - name: 'MyInitializer', - title: 'Button Text', - wrap: Grid.wrap, - items: [ - { - name: 'demo1', - title: 'Demo1', - Component: () => { - const itemConfig = useSchemaInitializerItem(); - // 调用插入功能 - const { insert } = useSchemaInitializer(); - const handleClick = () => { - insert({ - type: 'void', - // 使用自定义的 Toolbar 组件 - 'x-toolbar': 'MyToolbar', - 'x-settings': 'mySettings', - 'x-decorator': 'MyDecorator', - 'x-component': 'Hello', - }); - }; - return ; - }, - }, - ], -}); - -const Hello = () => { - const schema = useFieldSchema(); - return

Hello, world! {schema.name}

; -}; - -const hello1 = Grid.wrap({ - type: 'void', - // 使用自定义的 Toolbar 组件 - 'x-toolbar': 'MyToolbar', - 'x-settings': 'mySettings', - 'x-decorator': 'MyDecorator', - 'x-component': 'Hello', -}); - -const HelloPage = () => { - return ( -
- -
- ); -}; - -class PluginHello extends Plugin { - async load() { - this.app.addComponents({ Grid, CardItem, Hello, MyToolbar, MyDecorator }); - this.app.schemaSettingsManager.add(mySettings); - this.app.schemaInitializerManager.add(myInitializer); - this.router.add('hello', { - path: '/', - Component: HelloPage, - }); - } -} - -const app = new Application({ - router: { - type: 'memory', - }, - designable: true, - plugins: [PluginHello], -}); - -export default app.getRootComponent(); -``` diff --git a/packages/core/client/docs/zh-CN/core/utils.md b/packages/core/client/docs/zh-CN/core/utils.md deleted file mode 100644 index 9fb88088e..000000000 --- a/packages/core/client/docs/zh-CN/core/utils.md +++ /dev/null @@ -1,13 +0,0 @@ -# Utils - -## Function - -### tval - -用于输出多语言的字符串。 - -- 类型 - - - -- 示例 diff --git a/packages/core/client/docs/zh-CN/index.md b/packages/core/client/docs/zh-CN/index.md deleted file mode 100644 index fe2d08520..000000000 --- a/packages/core/client/docs/zh-CN/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Index - - diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/add-new.md b/packages/core/client/docs/zh-CN/ui-schema/actions/add-new.md deleted file mode 100644 index 308dab604..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/add-new.md +++ /dev/null @@ -1,82 +0,0 @@ -# Add new - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-action": "create", - "x-acl-action": "create", - "title": "{{t('Add new')}}", - "x-designer": "Action.Designer", - "x-component": "Action", - "x-decorator": "ACLActionProvider", - "x-component-props": { - "openMode": "drawer", - "type": "primary", - "component": "CreateRecordAction", - "icon": "PlusOutlined" - }, - "x-align": "right", - "x-acl-action-props": { - "skipScopeCheck": true - }, - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"Add record\") }}", - "x-component": "Action.Container", - "x-component-props": { - "className": "nb-action-popup" - }, - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializersForCreateFormBlock", - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Add new\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "CreateFormBlockInitializers", - "x-uid": "psh2rj6pkab", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "3i7grk0aytf", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "75s24n1nlkh", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "wg1f4xyx7vp", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "2hwye7mt2th", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/add-record.md b/packages/core/client/docs/zh-CN/ui-schema/actions/add-record.md deleted file mode 100644 index 7dbce5eda..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/add-record.md +++ /dev/null @@ -1 +0,0 @@ -# Add record(任意表) \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/bulk-edit.md b/packages/core/client/docs/zh-CN/ui-schema/actions/bulk-edit.md deleted file mode 100644 index b602f30ff..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/bulk-edit.md +++ /dev/null @@ -1 +0,0 @@ -# 批量编辑 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/bulk-update.md b/packages/core/client/docs/zh-CN/ui-schema/actions/bulk-update.md deleted file mode 100644 index 9ac6d1890..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/bulk-update.md +++ /dev/null @@ -1 +0,0 @@ -# 批量更新 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/custom-request.md b/packages/core/client/docs/zh-CN/ui-schema/actions/custom-request.md deleted file mode 100644 index b69407f62..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/custom-request.md +++ /dev/null @@ -1,88 +0,0 @@ -# 自定义请求 - - -x-component 不统一,x-action 也不统一,有三种风格的 schema - - -## UI Schema - -### 表单的自定义请求 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Custom request\") }}", - "x-component": "CustomRequestAction", - "x-action": "customize:form:request", - "x-designer": "CustomRequestAction.Designer", - "x-decorator": "CustomRequestAction.Decorator", - "x-action-settings": { - "onSuccess": { - "manualClose": false, - "redirecting": false, - "successMessage": "{{t(\"Request success\")}}" - } - }, - "type": "void", - "x-uid": "d1rfalvivfo", - "x-async": false, - "x-index": 2 -} -``` - -### 表格列操作的自定义请求 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Custom request\") }}", - "x-component": "Action.Link", - "x-action": "customize:table:request", - "x-designer": "Action.Designer", - "x-action-settings": { - "requestSettings": {}, - "onSuccess": { - "manualClose": false, - "redirecting": false, - "successMessage": "{{t(\"Request success\")}}" - } - }, - "x-component-props": { - "useProps": "{{ useCustomizeRequestActionProps }}" - }, - "x-designer-props": { - "linkageAction": true - }, - "type": "void", - "x-uid": "edn0y4fq7xb", - "x-async": false, - "x-index": 1 -} -``` - -### 详情的自定义请求 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Custom request\") }}", - "x-component": "CustomRequestAction", - "x-action": "customize:form:request", - "x-designer": "CustomRequestAction.Designer", - "x-decorator": "CustomRequestAction.Decorator", - "x-action-settings": { - "onSuccess": { - "manualClose": false, - "redirecting": false, - "successMessage": "{{t(\"Request success\")}}" - } - }, - "type": "void", - "x-uid": "glc5zkr0ke3", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/delete.md b/packages/core/client/docs/zh-CN/ui-schema/actions/delete.md deleted file mode 100644 index d4f3659f0..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/delete.md +++ /dev/null @@ -1 +0,0 @@ -# 删除 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/duplicate.md b/packages/core/client/docs/zh-CN/ui-schema/actions/duplicate.md deleted file mode 100644 index 5fc15c69d..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/duplicate.md +++ /dev/null @@ -1 +0,0 @@ -# 复制 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/edit.md b/packages/core/client/docs/zh-CN/ui-schema/actions/edit.md deleted file mode 100644 index 3092287aa..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/edit.md +++ /dev/null @@ -1 +0,0 @@ -# 编辑 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/export.md b/packages/core/client/docs/zh-CN/ui-schema/actions/export.md deleted file mode 100644 index 9e6bd4bd6..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/export.md +++ /dev/null @@ -1 +0,0 @@ -# 导出 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/filter.md b/packages/core/client/docs/zh-CN/ui-schema/actions/filter.md deleted file mode 100644 index 653fc6d26..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/filter.md +++ /dev/null @@ -1 +0,0 @@ -# 筛选 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/import.md b/packages/core/client/docs/zh-CN/ui-schema/actions/import.md deleted file mode 100644 index a371bffd3..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/import.md +++ /dev/null @@ -1 +0,0 @@ -# 导入 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/index.md b/packages/core/client/docs/zh-CN/ui-schema/actions/index.md deleted file mode 100644 index e177708c4..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/index.md +++ /dev/null @@ -1,51 +0,0 @@ -# 概览 - -## UI Schema 协议 - -- `x-action` -- `x-align` -- `x-acl-action` -- `x-acl-action-props` -- `x-action-settings` - -## 常规操作 - -```json -{ - "type": "void", - "title": "{{ t(\"Submit\") }}", - "x-component": "Action", - "x-component-props": { - "type": "primary", - "htmlType": "submit", - "useProps": "{{ useCreateActionProps }}" - }, -} -``` - -## 弹窗操作 - -```json -{ - "type": "void", - "title": "{{t('Open drawer')}}", - "x-component": "Action", - "x-component-props": { - "openMode": "drawer", - "type": "primary", - "icon": "PlusOutlined" - }, - "x-align": "right", - "properties": { - "drawer": { - "type": "void", - "x-component": "Action.Container", - "x-component-props": {}, - "properties": { - }, - } - } -} -``` - -更多示例查看 [Action](/apis/action) \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/print.md b/packages/core/client/docs/zh-CN/ui-schema/actions/print.md deleted file mode 100644 index 2823a7a18..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/print.md +++ /dev/null @@ -1 +0,0 @@ -# 打印 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/refresh.md b/packages/core/client/docs/zh-CN/ui-schema/actions/refresh.md deleted file mode 100644 index 654d97cca..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/refresh.md +++ /dev/null @@ -1 +0,0 @@ -# 刷新 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/save-record.md b/packages/core/client/docs/zh-CN/ui-schema/actions/save-record.md deleted file mode 100644 index 83d1a5a37..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/save-record.md +++ /dev/null @@ -1 +0,0 @@ -# 保存数据 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/submit-to-workflow.md b/packages/core/client/docs/zh-CN/ui-schema/actions/submit-to-workflow.md deleted file mode 100644 index 97bfe3b19..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/submit-to-workflow.md +++ /dev/null @@ -1 +0,0 @@ -# 提交至工作流 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/submit.md b/packages/core/client/docs/zh-CN/ui-schema/actions/submit.md deleted file mode 100644 index 0634eb49d..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/submit.md +++ /dev/null @@ -1,28 +0,0 @@ -# 提交 - -## UI Schema - -### 新建数据的提交 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Submit\") }}", - "x-action": "submit", - "x-component": "Action", - "x-designer": "Action.Designer", - "x-component-props": { - "type": "primary", - "htmlType": "submit", - "useProps": "{{ useCreateActionProps }}" - }, - "x-action-settings": { - "triggerWorkflows": [] - }, - "type": "void", - "x-uid": "aaxbm1i5xxd", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/update-record.md b/packages/core/client/docs/zh-CN/ui-schema/actions/update-record.md deleted file mode 100644 index aa3ff7ffb..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/update-record.md +++ /dev/null @@ -1 +0,0 @@ -# 更新数据 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/actions/view.md b/packages/core/client/docs/zh-CN/ui-schema/actions/view.md deleted file mode 100644 index f5fd55d6b..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/actions/view.md +++ /dev/null @@ -1 +0,0 @@ -# 查看 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/calendar.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/calendar.md deleted file mode 100644 index 13e6c108e..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/calendar.md +++ /dev/null @@ -1,282 +0,0 @@ -# Calendar - -## x-initializer - -- CalendarActionInitializers -- TabPaneInitializers -- RecordBlockInitializers - -## x-designer - -- CalendarV2.Designer - -## x-settings - -- CalendarSettings - -## UI Schema - -### 日历区块 - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "CalendarV2.Designer", - "x-component": "CardItem", - "x-decorator": "CalendarBlockProvider", - "x-acl-action": "users:list", - "x-decorator-props": { - "action": "list", - "params": { - "paginate": false - }, - "resource": "users", - "collection": "users", - "fieldNames": { - "id": "id", - "end": ["f_nxqfedh5fd5"], - "start": ["f_nxqfedh5fd5"], - "title": "nickname" - } - }, - "_isJSONSchemaObject": true, - "properties": { - "puytl7p5x8o": { - "type": "void", - "version": "2.0", - "x-component": "CalendarV2", - "x-component-props": { - "useProps": "{{ useCalendarBlockProps }}" - }, - "_isJSONSchemaObject": true, - "properties": { - "toolBar": { - "type": "void", - "version": "2.0", - "x-component": "CalendarV2.ActionBar", - "x-initializer": "CalendarActionInitializers", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "_isJSONSchemaObject": true, - "x-uid": "494h1j6bxyg", - "x-async": false, - "x-index": 1 - }, - "event": { - "type": "void", - "version": "2.0", - "x-component": "CalendarV2.Event", - "_isJSONSchemaObject": true, - "properties": { - "drawer": { - "type": "void", - "title": "{{ t(\"View record\") }}", - "version": "2.0", - "x-component": "Action.Drawer", - "x-component-props": { - "className": "nb-action-popup" - }, - "_isJSONSchemaObject": true, - "properties": { - "tabs": { - "type": "void", - "version": "2.0", - "x-component": "Tabs", - "x-initializer": "TabPaneInitializers", - "x-component-props": {}, - "_isJSONSchemaObject": true, - "x-initializer-props": { - "gridInitializer": "RecordBlockInitializers" - }, - "properties": { - "tab1": { - "type": "void", - "title": "{{t(\"Details\")}}", - "version": "2.0", - "x-designer": "Tabs.Designer", - "x-component": "Tabs.TabPane", - "x-component-props": {}, - "_isJSONSchemaObject": true, - "properties": { - "grid": { - "type": "void", - "version": "2.0", - "x-component": "Grid", - "x-initializer": "RecordBlockInitializers", - "_isJSONSchemaObject": true, - "x-initializer-props": { - "actionInitializers": "CalendarFormActionInitializers" - }, - "x-uid": "yty9wg20qq0", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "hcsgenoc3hb", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "c5cpptwxw7s", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "c5iarcnpefc", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "080x8qlpn6s", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "pcche4s596p", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "gk2jk3gpo9f", - "x-async": false, - "x-index": 1 -} -``` - -### 关系的日历区块 - -```json -{ - "x-uid": "8q0hsbdr9fc", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:list", - "x-decorator": "CalendarBlockProvider", - "x-decorator-props": { - "collection": "b", - "resource": "a.o2m", - "action": "list", - "fieldNames": { - "id": "id", - "start": "createdAt", - "title": "f_ex4581dfc0t" - }, - "params": { - "paginate": false - }, - "association": "a.o2m" - }, - "x-designer": "CalendarV2.Designer", - "x-component": "CardItem", - "x-component-props": { - "title": "关系的日历区块" - }, - "properties": { - "v3za6qejuz7": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CalendarV2", - "x-component-props": { - "useProps": "{{ useCalendarBlockProps }}" - }, - "properties": { - "toolBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CalendarV2.ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-initializer": "CalendarActionInitializers", - "x-uid": "u9ntffsdsrh", - "x-async": false, - "x-index": 1 - }, - "event": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CalendarV2.Event", - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Action.Drawer", - "x-component-props": { - "className": "nb-action-popup" - }, - "title": "{{ t(\"View record\") }}", - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializers", - "x-initializer-props": { - "gridInitializer": "RecordBlockInitializers" - }, - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Details\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer-props": { - "actionInitializers": "CalendarFormActionInitializers" - }, - "x-initializer": "RecordBlockInitializers", - "x-uid": "2swhiw4lee5", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "z6odjfbwnht", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "mxr7ikhfc9y", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "mfgucnj7ev8", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "05l5a2h42pn", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "v2jazzvqa85", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/charts.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/charts.md deleted file mode 100644 index 77dbdbdbb..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/charts.md +++ /dev/null @@ -1,143 +0,0 @@ -# Charts - -## UI Schema - -### 图表区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CardItem", - "x-component-props": { - "name": "charts" - }, - "x-designer": "ChartV2BlockDesigner", - "properties": { - "u8841bjm65y": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-decorator": "ChartV2Block", - "x-initializer": "ChartInitializers", - "x-uid": "j4hzcpzcc3g", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "ldc2aokaop2", - "x-async": false, - "x-index": 1 -} -``` - -### 内嵌区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "CardItem", - "x-component-props": { - "name": "charts" - }, - "x-designer": "ChartV2BlockDesigner", - "properties": { - "g3jq3vkx9fv": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-decorator": "ChartV2Block", - "x-initializer": "ChartInitializers", - "properties": { - "ue7lfigjgm1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid.Row", - "properties": { - "43ztg8gu03v": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid.Col", - "properties": { - "n47fsb4i2lm": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "ChartRendererProvider", - "x-decorator-props": { - "query": { - "measures": [ - { - "field": ["id"] - } - ], - "dimensions": [], - "filter": { - "$and": [] - }, - "orders": [], - "cache": {} - }, - "config": { - "chartType": "Built-in.line", - "general": { - "xField": "id", - "yField": "id", - "smooth": false, - "isStack": false - } - }, - "collection": "a", - "mode": "builder" - }, - "x-acl-action": "a:list", - "x-designer": "ChartRenderer.Designer", - "x-component": "CardItem", - "x-component-props": { - "size": "small" - }, - "x-initializer": "ChartInitializers", - "properties": { - "y25sgh5pukl": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "ChartRenderer", - "x-component-props": {}, - "x-uid": "ma0s07k753t", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "k6naqcx59ow", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "o8ktlccovml", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "mvn9ai9rhx8", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "mcbyby93j6n", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "sn0lczwtkgm", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/details.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/details.md deleted file mode 100644 index 31f765bac..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/details.md +++ /dev/null @@ -1,169 +0,0 @@ -# Details - -## UI Schema - -### 详情区块(带分页) - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "DetailsDesigner", - "x-component": "CardItem", - "x-decorator": "DetailsBlockProvider", - "x-acl-action": "users:view", - "x-decorator-props": { - "action": "list", - "params": { - "pageSize": 1 - }, - "rowKey": "id", - "resource": "users", - "collection": "users", - "readPretty": true - }, - "_isJSONSchemaObject": true, - "properties": { - "mjad1dcywip": { - "type": "void", - "version": "2.0", - "x-component": "Details", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useDetailsBlockProps }}" - }, - "_isJSONSchemaObject": true, - "properties": { - "8avswx6qgyp": { - "type": "void", - "version": "2.0", - "x-component": "ActionBar", - "x-initializer": "DetailsActionInitializers", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "_isJSONSchemaObject": true, - "x-uid": "01w17yleng8", - "x-async": false, - "x-index": 1 - }, - "grid": { - "type": "void", - "version": "2.0", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "_isJSONSchemaObject": true, - "x-uid": "bgu0ix4lfmc", - "x-async": false, - "x-index": 2 - }, - "pagination": { - "type": "void", - "version": "2.0", - "x-component": "Pagination", - "x-component-props": { - "useProps": "{{ useDetailsPaginationProps }}" - }, - "_isJSONSchemaObject": true, - "x-uid": "6riuxghrz30", - "x-async": false, - "x-index": 3 - } - }, - "x-uid": "3apkfu8ngrp", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "yeodhismy2w", - "x-async": false, - "x-index": 1 -} -``` - -### 对多关系区块 - -```json -{ - "x-uid": "2gm2iw937q5", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:view", - "x-decorator": "DetailsBlockProvider", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "list", - "params": { - "pageSize": 1 - }, - "rowKey": "id" - }, - "x-designer": "DetailsDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "关系区块" - }, - "properties": { - "paj8b2noc1g": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Details", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useDetailsBlockProps }}" - }, - "properties": { - "3jisjip7503": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "DetailsActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "cbkfxafywtx", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "d1ls1w6gpzm", - "x-async": false, - "x-index": 2 - }, - "pagination": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Pagination", - "x-component-props": { - "useProps": "{{ useDetailsPaginationProps }}" - }, - "x-uid": "u0rzv8370za", - "x-async": false, - "x-index": 3 - } - }, - "x-uid": "1hfu8jbzzqw", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/form-read-pretty.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/form-read-pretty.md deleted file mode 100644 index 676df3034..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/form-read-pretty.md +++ /dev/null @@ -1,286 +0,0 @@ -# Form (Read pretty) - -## UI Schema - -### 单数据详情 - -```json -{ - "x-uid": "dt4q817fw81", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a:get", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a", - "collection": "a", - "readPretty": true, - "action": "get", - "useParams": "{{ useParamsFromRecord }}", - "useSourceId": "{{ useSourceIdFromParentRecord }}" - }, - "x-designer": "FormV2.ReadPrettyDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "Form read pretty" - }, - "properties": { - "30qrxij609o": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ReadPrettyFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "fznn1ygt50o", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "t3o4t8fi7l7", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "6dp2qqoc4s0", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 关系数据详情 - -```json -{ - "x-uid": "jf470wrzdaf", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2oBelongsTo:get", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a.o2oBelongsTo", - "collection": "b", - "association": "a.o2oBelongsTo", - "readPretty": true, - "action": "get", - "useParams": "{{ useParamsFromRecord }}", - "useSourceId": "{{ useSourceIdFromParentRecord }}" - }, - "x-designer": "FormV2.ReadPrettyDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "对一关系详情" - }, - "properties": { - "uauk2wbj3iq": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ReadPrettyFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "r3pcykksp8l", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "vs000etludp", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "rt228uhudcf", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 表格详情 - -```json -{ - "x-uid": "lxcjjkkor1m", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:get", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "get", - "useParams": "{{ useParamsFromRecord }}", - "useSourceId": "{{ useSourceIdFromParentRecord }}" - }, - "x-designer": "FormV2.ReadPrettyDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "表格详情" - }, - "properties": { - "7pe17tcgtye": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ReadPrettyFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "wek8nc795ja", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "5y5u8qm6yvz", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "5bpcm982n51", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 查看关系数据 - -```json -{ - "x-uid": "5ymsrq1fv37", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:get", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "get", - "useParams": "{{ useParamsFromRecord }}", - "useSourceId": "{{ useSourceIdFromParentRecord }}" - }, - "x-designer": "FormV2.ReadPrettyDesigner", - "x-component": "CardItem", - "x-component-props": { - "title": "查看关系数据" - }, - "properties": { - "vehcfr0fsh2": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ReadPrettyFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-uid": "zpuz629u2dg", - "x-async": false, - "x-index": 1 - }, - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-uid": "b8u8e2k5inf", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "2rz0u3j14px", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/form.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/form.md deleted file mode 100644 index 442457ba0..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/form.md +++ /dev/null @@ -1,418 +0,0 @@ -# Form - -## UI Schema - -### 添加表单 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": true - }, - "x-acl-action": "a:create", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a", - "collection": "a" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": {}, - "properties": { - "23pj9m7ot5a": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "x-uid": "0ctuwnatyzd", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "CreateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "properties": { - "j7ta88et3mv": { - "_isJSONSchemaObject": true, - "version": "2.0", - "title": "{{ t(\"Submit\") }}", - "x-action": "submit", - "x-component": "Action", - "x-designer": "Action.Designer", - "x-component-props": { - "type": "primary", - "htmlType": "submit", - "useProps": "{{ useCreateActionProps }}" - }, - "x-action-settings": { - "triggerWorkflows": [] - }, - "type": "void", - "x-uid": "ua858zswy37", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "o0riryr0ob0", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "1ng4hies4yu", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "ebiyvziafda", - "x-async": false, - "x-index": 1 -} -``` - -### 编辑表单 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": false - }, - "x-acl-action": "a:update", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "useSourceId": "{{ useSourceIdFromParentRecord }}", - "useParams": "{{ useParamsFromRecord }}", - "action": "get", - "resource": "a", - "collection": "a" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": {}, - "properties": { - "w533dipin7p": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "x-uid": "otncpmalhjr", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "UpdateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "x-uid": "qjjmm1qkapx", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "n12zo6qd72g", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "zafyvmng9m5", - "x-async": false, - "x-index": 1 -} -``` - -### 关系新增表单 - -```json -{ - "x-uid": "il5q341k4vg", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": true - }, - "x-acl-action": "a.o2m:create", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "useSourceId": "{{ useSourceIdFromParentRecord }}", - "useParams": "{{ useParamsFromRecord }}", - "action": null, - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": { - "title": "关系新增表单" - }, - "properties": { - "3357yvwe4je": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "x-uid": "88xhnoml321", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "CreateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "x-uid": "dhs8o8vpl1h", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "h6fhh9ox9ay", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 关系新增(关系表格里的 Add new) - -useSourceIdFromParentRecord 和 useParamsFromRecord 参数缺失 - -```json -{ - "x-uid": "6tknohm4ubr", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": true - }, - "x-acl-action": "a.o2m:create", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": { - "title": "关系新增表单-Table" - }, - "properties": { - "o96izt6ez7m": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "properties": { - "pk9l1i26yq6": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid.Row", - "properties": { - "32wz2lr9cry": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid.Col", - "properties": { - "id": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "string", - "x-designer": "FormItem.Designer", - "x-component": "CollectionField", - "x-decorator": "FormItem", - "x-collection-field": "b.id", - "x-component-props": {}, - "x-read-pretty": true, - "x-uid": "jb09nj4kbfm", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "rtx3b0uom75", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "5gvd7ks6m0z", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "fcw1y2xk6km", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "CreateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "x-uid": "msgopb1meoq", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "g0mg6fhho4x", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 关系编辑 - -```json -{ - "x-uid": "kzg1tz339ro", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action-props": { - "skipScopeCheck": false - }, - "x-acl-action": "a.o2m:update", - "x-decorator": "FormBlockProvider", - "x-decorator-props": { - "useSourceId": "{{ useSourceIdFromParentRecord }}", - "useParams": "{{ useParamsFromRecord }}", - "action": "get", - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m" - }, - "x-designer": "FormV2.Designer", - "x-component": "CardItem", - "x-component-props": { - "title": "关系编辑表单" - }, - "properties": { - "3jqysycq8m0": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FormItemInitializers", - "x-uid": "sy3sjswogh4", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "UpdateFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "marginTop": 24 - } - }, - "x-uid": "xarcyjpypsy", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "lepez9684rm", - "x-async": false, - "x-index": 1 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/gantt.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/gantt.md deleted file mode 100644 index 4b7ad1269..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/gantt.md +++ /dev/null @@ -1,185 +0,0 @@ -# Gantt - -## UI Schema - -### 甘特图区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "users:list", - "x-decorator": "GanttBlockProvider", - "x-decorator-props": { - "collection": "users", - "resource": "users", - "action": "list", - "fieldNames": { - "id": "id", - "start": "createdAt", - "range": "day", - "title": "nickname", - "end": "f_46b1u4dp820" - }, - "params": { - "paginate": false - } - }, - "x-designer": "Gantt.Designer", - "x-component": "CardItem", - "properties": { - "rx21gtpcj3w": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Gantt", - "x-component-props": { - "useProps": "{{ useGanttBlockProps }}" - }, - "properties": { - "toolBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 24 - } - }, - "x-initializer": "GanttActionInitializers", - "x-uid": "m0uru68ugw9", - "x-async": false, - "x-index": 1 - }, - "table": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-decorator": "div", - "x-decorator-props": { - "style": { - "float": "left", - "maxWidth": "35%" - } - }, - "x-initializer": "TableColumnInitializers", - "x-component": "TableV2", - "x-component-props": { - "rowKey": "id", - "rowSelection": { - "type": "checkbox" - }, - "useProps": "{{ useTableBlockProps }}", - "pagination": false - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"Actions\") }}", - "x-action-column": "actions", - "x-decorator": "TableV2.Column.ActionBar", - "x-component": "TableV2.Column", - "x-designer": "TableV2.ActionColumnDesigner", - "x-initializer": "TableActionColumnInitializers", - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "DndContext", - "x-component": "Space", - "x-component-props": { - "split": "|" - }, - "x-uid": "z2vnizu7bds", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "8gbabo6kdr6", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "5c8g2x6rvro", - "x-async": false, - "x-index": 2 - }, - "detail": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Gantt.Event", - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Action.Drawer", - "x-component-props": { - "className": "nb-action-popup" - }, - "title": "{{ t(\"View record\") }}", - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializers", - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Details\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "RecordBlockInitializers", - "x-uid": "jr5h3asz6gp", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "8uwfpgyok9x", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "bjm4sfwxmrx", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "7cmwpc0rrwj", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "nffb7qbs96o", - "x-async": false, - "x-index": 3 - } - }, - "x-uid": "hoi2j5lhlho", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "e0rdive4xpa", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/grid-card.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/grid-card.md deleted file mode 100644 index 6620d607b..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/grid-card.md +++ /dev/null @@ -1,219 +0,0 @@ -# GridCard - -## UI Schema - -### 栅格卡片 - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "GridCard.Designer", - "x-component": "BlockItem", - "x-decorator": "GridCard.Decorator", - "x-acl-action": "users:view", - "x-component-props": { - "useProps": "{{ useGridCardBlockItemProps }}" - }, - "x-decorator-props": { - "action": "list", - "params": { - "pageSize": 12 - }, - "rowKey": "id", - "resource": "users", - "collection": "users", - "readPretty": true, - "runWhenParamsChanged": true - }, - "_isJSONSchemaObject": true, - "properties": { - "actionBar": { - "type": "void", - "version": "2.0", - "x-component": "ActionBar", - "x-initializer": "GridCardActionInitializers", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "_isJSONSchemaObject": true, - "x-uid": "prx9wnlzqb1", - "x-async": false, - "x-index": 1 - }, - "list": { - "type": "array", - "version": "2.0", - "x-component": "GridCard", - "x-component-props": { - "useProps": "{{ useGridCardBlockProps }}" - }, - "_isJSONSchemaObject": true, - "properties": { - "item": { - "type": "object", - "version": "2.0", - "x-component": "GridCard.Item", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useGridCardItemProps }}" - }, - "_isJSONSchemaObject": true, - "properties": { - "grid": { - "type": "void", - "version": "2.0", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "_isJSONSchemaObject": true, - "x-initializer-props": { - "useProps": "{{ useGridCardItemInitializerProps }}" - }, - "x-uid": "pq895sv6136", - "x-async": false, - "x-index": 1 - }, - "actionBar": { - "type": "void", - "version": "2.0", - "x-align": "left", - "x-component": "ActionBar", - "x-initializer": "GridCardItemActionInitializers", - "x-component-props": { - "layout": "one-column", - "useProps": "{{ useGridCardActionBarProps }}" - }, - "_isJSONSchemaObject": true, - "x-uid": "w2c3qcp4nme", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "1ct8yn1jnzn", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "pvnkvtc6tte", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "phodsqwsifq", - "x-async": false, - "x-index": 1 -} -``` - -### 关系数据的栅格卡片 - -```json -{ - "x-uid": "yr79zvl98lc", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:view", - "x-decorator": "GridCard.Decorator", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "list", - "params": { - "pageSize": 12 - }, - "runWhenParamsChanged": true, - "columnCount": { - "xs": 1, - "md": 12, - "lg": 12, - "xxl": 12 - } - }, - "x-component": "BlockItem", - "x-component-props": { - "useProps": "{{ useGridCardBlockItemProps }}" - }, - "x-designer": "GridCard.Designer", - "properties": { - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "GridCardActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "u36l44beq6a", - "x-async": false, - "x-index": 1 - }, - "list": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-component": "GridCard", - "x-component-props": { - "useProps": "{{ useGridCardBlockProps }}" - }, - "properties": { - "item": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "object", - "x-component": "GridCard.Item", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useGridCardItemProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-initializer-props": { - "useProps": "{{ useGridCardItemInitializerProps }}" - }, - "x-uid": "aqxlonv3bpk", - "x-async": false, - "x-index": 1 - }, - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-align": "left", - "x-initializer": "GridCardItemActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "useProps": "{{ useGridCardActionBarProps }}", - "layout": "one-column" - }, - "x-uid": "zxhqo81kdf5", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "ed56owlyz1p", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "nfpuvrkwkk7", - "x-async": false, - "x-index": 2 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/index.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/index.md deleted file mode 100644 index d47422275..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/index.md +++ /dev/null @@ -1,255 +0,0 @@ -# 数据区块概述 - -数据可能是某个表(collection)的数据,也可能是某个关系(association)的数据 - -- collection,如 a 表 -- association,如 a.b 关系,关系表为 b - -collection 示例 - -```js -{ - "collection": "a" -} -``` - -association 示例 - -```js -{ - "collection": "b", - "association": "a.b" -} -``` - -数据的操作 - -```bash -: -.: -``` - -实际的请求参数 - -``` - /api/: - /api/:/ - /api///: - /api///:/ -``` - -- collection、association、action 是配置里存好的 -- sourceId、filterByTk 由上下文提供 - -## CollectionRecordProvider - -Record - -```ts -class CollectionRecord { - protected current = {}; - protected parent?: Record; - public isNew = false; - constructor(options = {}) { - const { current, parent, isNew } = options; - this.current = current || {}; - this.parent = parent; - this.isNew = isNew; - } -} -``` - -a:list(**list 外层不套空 RecordPicker**) - -```jsx | pure -{list.map((item) => { - const record = new CollectionRecord({ current: item }); - return -})} -``` - -a:get(view、edit) - -```jsx | pure -const record = new CollectionRecord({ current: item }); - -``` - -a:create - -```jsx | pure -const record = new CollectionRecord({ current, isNew: true }); - -``` - -a.b:list - -```jsx | pure - - {list.map((item) => { - const recordB = new CollectionRecord({ - current: item, - }); - return - })} - -``` - -a.b:get - -```jsx | pure -const recordA = new CollectionRecord({ - current: itemA, -}); -const recordB = new CollectionRecord({ - current: itemB, - parent: recordA, -}); -// 或者 -recordB.setParent(recordA); - - - - -``` - -a.b:create - -```jsx | pure -const recordA = new CollectionRecord({ - current: itemA, -}); -const recordB = new CollectionRecord({ - isNew: true, - parent: recordA, -}); - - - -``` - -## 区块 - -以下重要组件说明 - -- `DataBlockProvider` 数据区块的总称 -- `BlockProvider` 区块的各种参数设置 -- `CollectionProvider` collection 信息 -- `AssociationProvider` association 信息 -- `UseRequestProvider` useRequest 的 result - -没有当前记录的区块,如表格 - -```tsx | pure - - - - - - -
- - -``` - -DataBlockProvider 内容 - -```tsx | pure - - - - {props.children} - - - -``` - -有当前记录的区块,如表单 - -```tsx | pure - -
- -``` - -DataBlockProvider 内容 - -```tsx | pure - - - - - {props.children} - - - - -``` - -有当前父级记录的区块,如对多关系的表格区块,区块本身不套 RecordPicker - -```tsx | pure - - - - - - - -
- - - - - - - - -
- - - -``` - -DataBlockProvider 内容 - -```tsx | pure - - - - - {props.children} - - - - -``` - -有父级记录也有当前记录的区块,如关系的表单 - -```tsx | pure - - - - - - - - -``` - -DataBlockProvider 内容 - -```tsx | pure - - - - - - {props.children} - - - - - -``` diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/kanban.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/kanban.md deleted file mode 100644 index b84b1b62a..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/kanban.md +++ /dev/null @@ -1,160 +0,0 @@ -# Kanban - -## UI Schema - -### 看板区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "t_ehwqkw0ljw2:list", - "x-decorator": "KanbanBlockProvider", - "x-decorator-props": { - "collection": "t_ehwqkw0ljw2", - "resource": "t_ehwqkw0ljw2", - "action": "list", - "groupField": "f_5h4umwf59lc", - "params": { - "sort": ["f_5h4umwf59lc_sort"], - "paginate": false - } - }, - "x-designer": "Kanban.Designer", - "x-component": "CardItem", - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "KanbanActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "4vh5t2iohwp", - "x-async": false, - "x-index": 1 - }, - "iwnc45ou960": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-component": "Kanban", - "x-component-props": { - "useProps": "{{ useKanbanBlockProps }}" - }, - "properties": { - "card": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-read-pretty": true, - "x-label-disabled": true, - "x-decorator": "BlockItem", - "x-component": "Kanban.Card", - "x-component-props": { - "openMode": "drawer" - }, - "x-designer": "Kanban.Card.Designer", - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-component-props": { - "dndContext": false - }, - "x-uid": "3v010y09684", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "dk9a5cb9d95", - "x-async": false, - "x-index": 1 - }, - "cardViewer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"View\") }}", - "x-designer": "Action.Designer", - "x-component": "Kanban.CardViewer", - "x-action": "view", - "x-component-props": { - "openMode": "drawer" - }, - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"View record\") }}", - "x-component": "Action.Container", - "x-component-props": { - "className": "nb-action-popup" - }, - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializers", - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Details\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "RecordBlockInitializers", - "x-uid": "1lhiyyydpye", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "gisuj0zldz1", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "ohly2w4gnwp", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "29hjrxcfczh", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "0k56h1q80xo", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "uny2d4n5ry4", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "3gga5lop4t6", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/list.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/list.md deleted file mode 100644 index 4e690cb7d..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/list.md +++ /dev/null @@ -1,213 +0,0 @@ -# List - -## UI Schema - -### 列表区块 - -```json -{ - "x-uid": "h9mzrnxokk3", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a:view", - "x-decorator": "List.Decorator", - "x-decorator-props": { - "resource": "a", - "collection": "a", - "readPretty": true, - "action": "list", - "params": { - "pageSize": 10 - }, - "runWhenParamsChanged": true, - "rowKey": "id" - }, - "x-component": "CardItem", - "x-designer": "List.Designer", - "x-component-props": { - "title": "List 区块" - }, - "properties": { - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ListActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "chjgpgd45qz", - "x-async": false, - "x-index": 1 - }, - "list": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-component": "List", - "x-component-props": { - "props": "{{ useListBlockProps }}" - }, - "properties": { - "item": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "object", - "x-component": "List.Item", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useListItemProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-initializer-props": { - "useProps": "{{ useListItemInitializerProps }}" - }, - "x-uid": "u45nwmwlone", - "x-async": false, - "x-index": 1 - }, - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-align": "left", - "x-initializer": "ListItemActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "useProps": "{{ useListActionBarProps }}", - "layout": "one-column" - }, - "x-uid": "9erso7nhotq", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "qkuzlun8frh", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "1mfaa48qy5j", - "x-async": false, - "x-index": 2 - } - }, - "x-async": false, - "x-index": 1 -} -``` - -### 对多关系的列表区块 - -```json -{ - "x-uid": "6tzpnkz60rx", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "a.o2m:view", - "x-decorator": "List.Decorator", - "x-decorator-props": { - "resource": "a.o2m", - "collection": "b", - "association": "a.o2m", - "readPretty": true, - "action": "list", - "params": { - "pageSize": 10 - }, - "runWhenParamsChanged": true - }, - "x-component": "CardItem", - "x-designer": "List.Designer", - "x-component-props": { - "title": "对多关系的列表区块" - }, - "properties": { - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "ListActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "i05xr7nfs26", - "x-async": false, - "x-index": 1 - }, - "list": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-component": "List", - "x-component-props": { - "props": "{{ useListBlockProps }}" - }, - "properties": { - "item": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "object", - "x-component": "List.Item", - "x-read-pretty": true, - "x-component-props": { - "useProps": "{{ useListItemProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "ReadPrettyFormItemInitializers", - "x-initializer-props": { - "useProps": "{{ useListItemInitializerProps }}" - }, - "x-uid": "krerg70a28e", - "x-async": false, - "x-index": 1 - }, - "actionBar": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-align": "left", - "x-initializer": "ListItemActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "useProps": "{{ useListActionBarProps }}", - "layout": "one-column" - }, - "x-uid": "9745q36ltfv", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "yxc0lnax9gk", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "6mlzb7p6dvn", - "x-async": false, - "x-index": 2 - } - }, - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/map.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/map.md deleted file mode 100644 index 0413da64b..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/map.md +++ /dev/null @@ -1,115 +0,0 @@ -# Map - -## UI Schema - -### 地图区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-acl-action": "t_ddo5bd0swdg:list", - "x-decorator": "MapBlockProvider", - "x-decorator-props": { - "collection": "t_ddo5bd0swdg", - "resource": "t_ddo5bd0swdg", - "action": "list", - "fieldNames": { - "field": ["f_tmhy5bbusr8"] - }, - "params": { - "paginate": false - } - }, - "x-designer": "MapBlockDesigner", - "x-component": "CardItem", - "x-filter-targets": [], - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "MapActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": 16 - } - }, - "x-uid": "ap0xzy32bms", - "x-async": false, - "x-index": 1 - }, - "1672zefmplu": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "MapBlock", - "x-component-props": { - "useProps": "{{ useMapBlockProps }}" - }, - "properties": { - "drawer": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Action.Drawer", - "x-component-props": { - "className": "nb-action-popup" - }, - "title": "{{ t(\"View record\") }}", - "properties": { - "tabs": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Tabs", - "x-component-props": {}, - "x-initializer": "TabPaneInitializers", - "properties": { - "tab1": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{t(\"Details\")}}", - "x-component": "Tabs.TabPane", - "x-designer": "Tabs.Designer", - "x-component-props": {}, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "RecordBlockInitializers", - "x-uid": "vce3u8hfdrf", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "waw7z3qw7nn", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "szyybarlapl", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "83m07ksqbal", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "5cquhqq2161", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "p42awfpfnbf", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/table.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/data/table.md deleted file mode 100644 index 4c99e2554..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/data/table.md +++ /dev/null @@ -1,193 +0,0 @@ -# Table - -## UI Schema - -### 表格区块 - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "TableBlockDesigner", - "x-component": "CardItem", - "x-decorator": "TableBlockProvider", - "x-acl-action": "users:list", - "x-filter-targets": [], - "x-decorator-props": { - "action": "list", - "params": { - "pageSize": 20 - }, - "rowKey": "id", - "dragSort": false, - "resource": "users", - "showIndex": true, - "collection": "users", - "disableTemplate": false - }, - "_isJSONSchemaObject": true, - "properties": { - "actions": { - "type": "void", - "version": "2.0", - "x-component": "ActionBar", - "x-initializer": "TableActionInitializers", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "_isJSONSchemaObject": true, - "x-uid": "55tgsn1puqk", - "x-async": false, - "x-index": 1 - }, - "g22il5nkv67": { - "type": "array", - "version": "2.0", - "x-component": "TableV2", - "x-initializer": "TableColumnInitializers", - "x-component-props": { - "rowKey": "id", - "useProps": "{{ useTableBlockProps }}", - "rowSelection": { - "type": "checkbox" - } - }, - "_isJSONSchemaObject": true, - "properties": { - "actions": { - "type": "void", - "title": "{{ t(\"Actions\") }}", - "version": "2.0", - "x-designer": "TableV2.ActionColumnDesigner", - "x-component": "TableV2.Column", - "x-decorator": "TableV2.Column.ActionBar", - "x-initializer": "TableActionColumnInitializers", - "x-action-column": "actions", - "_isJSONSchemaObject": true, - "properties": { - "actions": { - "type": "void", - "version": "2.0", - "x-component": "Space", - "x-decorator": "DndContext", - "x-component-props": { - "split": "|" - }, - "_isJSONSchemaObject": true, - "x-uid": "qkcugf5l0h6", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "kbgbskxsj3j", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "6r8e3mhnuxg", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "b87bbc5x0cp", - "x-async": false, - "x-index": 1 -} -``` - -### 对多关系区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "TableBlockProvider", - "x-acl-action": "a.o2m:list", - "x-decorator-props": { - "collection": "b", - "resource": "a.o2m", - "action": "list", - "params": { - "pageSize": 20 - }, - "showIndex": true, - "dragSort": false, - "disableTemplate": false, - "association": "a.o2m" - }, - "x-designer": "TableBlockDesigner", - "x-component": "CardItem", - "x-filter-targets": [], - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "TableActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "style": { - "marginBottom": "var(--nb-spacing)" - } - }, - "x-uid": "0gwze38mzps", - "x-async": false, - "x-index": 1 - }, - "0wuk1cpy5zp": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "array", - "x-initializer": "TableColumnInitializers", - "x-component": "TableV2", - "x-component-props": { - "rowKey": "id", - "rowSelection": { - "type": "checkbox" - }, - "useProps": "{{ useTableBlockProps }}" - }, - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "{{ t(\"Actions\") }}", - "x-action-column": "actions", - "x-decorator": "TableV2.Column.ActionBar", - "x-component": "TableV2.Column", - "x-designer": "TableV2.ActionColumnDesigner", - "x-initializer": "TableActionColumnInitializers", - "properties": { - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "DndContext", - "x-component": "Space", - "x-component-props": { - "split": "|" - }, - "x-uid": "gq0nkc7rf0q", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "zx97354nzfq", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "nss8uocacdq", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "0j5kcrius5z", - "x-async": false, - "x-index": 1 -} -``` diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/filter/collapse.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/filter/collapse.md deleted file mode 100644 index 0bb30600a..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/filter/collapse.md +++ /dev/null @@ -1,41 +0,0 @@ -# Collapse - -## UI Schema - -### 折叠面板 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "AssociationFilter.Provider", - "x-decorator-props": { - "collection": "users", - "blockType": "filter", - "associationFilterStyle": { - "width": "100%" - }, - "name": "filter-collapse" - }, - "x-designer": "AssociationFilter.BlockDesigner", - "x-component": "CardItem", - "x-filter-targets": [], - "properties": { - "x8q0r7wp73e": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-action": "associateFilter", - "x-initializer": "AssociationFilter.FilterBlockInitializer", - "x-component": "AssociationFilter", - "x-uid": "j11suxuizte", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "0g6pyonrj83", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/filter/form.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/filter/form.md deleted file mode 100644 index f0145c51b..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/filter/form.md +++ /dev/null @@ -1,63 +0,0 @@ -# Form - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "FilterFormBlockProvider", - "x-decorator-props": { - "resource": "users", - "collection": "users" - }, - "x-designer": "FormV2.FilterDesigner", - "x-component": "CardItem", - "x-filter-targets": [], - "x-filter-operators": {}, - "properties": { - "dwltvxybiir": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "FormV2", - "x-component-props": { - "useProps": "{{ useFormBlockProps }}" - }, - "properties": { - "grid": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "FilterFormItemInitializers", - "x-uid": "aggw48stzwc", - "x-async": false, - "x-index": 1 - }, - "actions": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-initializer": "FilterFormActionInitializers", - "x-component": "ActionBar", - "x-component-props": { - "layout": "one-column", - "style": { - "float": "right" - } - }, - "x-uid": "7aogdo89a7s", - "x-async": false, - "x-index": 2 - } - }, - "x-uid": "wreuz6dr1pc", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "7d1o5bruekl", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/index.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/index.md deleted file mode 100644 index 07dd0c5c7..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/index.md +++ /dev/null @@ -1 +0,0 @@ -# Overview diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/others/iframe.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/others/iframe.md deleted file mode 100644 index 58a2bf038..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/others/iframe.md +++ /dev/null @@ -1,22 +0,0 @@ - -# iframe - -## UI Schema - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "Iframe.Designer", - "x-component": "Iframe", - "x-decorator": "BlockItem", - "x-component-props": {}, - "x-decorator-props": { - "name": "iframe" - }, - "_isJSONSchemaObject": true, - "x-uid": "fmmlqe8rrei", - "x-async": false, - "x-index": 1 -} -``` diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/others/markdown.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/others/markdown.md deleted file mode 100644 index 478fafd2c..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/others/markdown.md +++ /dev/null @@ -1,24 +0,0 @@ -# Markdown - -## UI Schema - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "Markdown.Void.Designer", - "x-editable": false, - "x-component": "Markdown.Void", - "x-decorator": "CardItem", - "x-component-props": { - "content": "This is a demo text, **supports Markdown syntax**." - }, - "x-decorator-props": { - "name": "markdown" - }, - "_isJSONSchemaObject": true, - "x-uid": "w75e9d5vs1e", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/blocks/others/workflow-todo.md b/packages/core/client/docs/zh-CN/ui-schema/blocks/others/workflow-todo.md deleted file mode 100644 index 9f477e5d7..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/blocks/others/workflow-todo.md +++ /dev/null @@ -1,33 +0,0 @@ -# Workflow todos - -## x-designer - -- TableBlockDesigner(不适合直接用表格区块的) - -## UI Schema - -```json -{ - "type": "void", - "version": "2.0", - "x-designer": "TableBlockDesigner", - "x-component": "CardItem", - "x-decorator": "WorkflowTodo.Decorator", - "x-decorator-props": {}, - "_isJSONSchemaObject": true, - "properties": { - "todos": { - "type": "void", - "version": "2.0", - "x-component": "WorkflowTodo", - "_isJSONSchemaObject": true, - "x-uid": "xq1qcdpq7rq", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "3z3ey8r6ik9", - "x-async": false, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/cascader-select.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/cascader-select.md deleted file mode 100644 index 94547e50c..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/cascader-select.md +++ /dev/null @@ -1 +0,0 @@ -# 级联选择器 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/file-manager.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/file-manager.md deleted file mode 100644 index 5b02970f7..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/file-manager.md +++ /dev/null @@ -1 +0,0 @@ -# 文件管理器 diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/index.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/index.md deleted file mode 100644 index e9f57784b..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/index.md +++ /dev/null @@ -1,21 +0,0 @@ -# 关系字段组件 - -### 标题 Read pretty - -### 标签 Read pretty - -### 子详情 Read pretty - -### 子表单 Editable - -### 子表单(弹窗) Editable - -### 下拉选择器 Editable - -### 数据选择器 Editable - -### 级联选择器 Editable - -### 文件管理器 Editable - -### 子表格 Editable Read pretty diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/record-picker.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/record-picker.md deleted file mode 100644 index ae439f012..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/record-picker.md +++ /dev/null @@ -1 +0,0 @@ -# 数据选择器 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/select.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/select.md deleted file mode 100644 index 9df4627f7..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/select.md +++ /dev/null @@ -1 +0,0 @@ -# 下拉选择器 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-details.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-details.md deleted file mode 100644 index a509906e4..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-details.md +++ /dev/null @@ -1 +0,0 @@ -# 子详情 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-form-popover.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-form-popover.md deleted file mode 100644 index acc10f4a7..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-form-popover.md +++ /dev/null @@ -1 +0,0 @@ -# 子表单 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-form.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-form.md deleted file mode 100644 index acc10f4a7..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-form.md +++ /dev/null @@ -1 +0,0 @@ -# 子表单 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-table.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-table.md deleted file mode 100644 index 9556a6c5c..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/sub-table.md +++ /dev/null @@ -1 +0,0 @@ -# 子表格 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/tag.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/tag.md deleted file mode 100644 index f927916b3..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/tag.md +++ /dev/null @@ -1 +0,0 @@ -# 标签 diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/title.md b/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/title.md deleted file mode 100644 index e8a280714..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/association-components/title.md +++ /dev/null @@ -1 +0,0 @@ -# 标题 \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/form-item.md b/packages/core/client/docs/zh-CN/ui-schema/fields/form-item.md deleted file mode 100644 index 74112ffb2..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/form-item.md +++ /dev/null @@ -1,22 +0,0 @@ -# FormItem - 表单项 - -## UI Schema - -### 表单字段 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "string", - "x-designer": "FormItem.Designer", - "x-component": "CollectionField", - "x-decorator": "FormItem", - "x-collection-field": "a.id", - "x-component-props": {}, - "x-read-pretty": true, - "x-uid": "u2nk80cguoa", - "x-async": false, - "x-index": 1 -} -``` diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/index.md b/packages/core/client/docs/zh-CN/ui-schema/fields/index.md deleted file mode 100644 index e734184db..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# Overview - -## UI Schema 协议 - -- `x-collection-field` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/fields/table-column.md b/packages/core/client/docs/zh-CN/ui-schema/fields/table-column.md deleted file mode 100644 index 61598b8f6..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/fields/table-column.md +++ /dev/null @@ -1,40 +0,0 @@ -# 表格列 - -## UI Schema - -### 表格列 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-decorator": "TableV2.Column.Decorator", - "x-designer": "TableV2.Column.Designer", - "x-component": "TableV2.Column", - "properties": { - "f_beilggsbj0r": { - "_isJSONSchemaObject": true, - "version": "2.0", - "x-collection-field": "a.f_beilggsbj0r", - "x-component": "CollectionField", - "x-component-props": { - "ellipsis": true - }, - "x-read-pretty": true, - "x-decorator": null, - "x-decorator-props": { - "labelStyle": { - "display": "none" - } - }, - "x-uid": "h5u4xi7uvji", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "z8p8ezctwsh", - "x-async": false, - "x-index": 2 -} -``` diff --git a/packages/core/client/docs/zh-CN/ui-schema/globals/menu.md b/packages/core/client/docs/zh-CN/ui-schema/globals/menu.md deleted file mode 100644 index 69a4e6a80..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/globals/menu.md +++ /dev/null @@ -1,127 +0,0 @@ -# Menu - - -菜单模块以后会重构,Item 直接用 items 对接,不用 schema 嵌套,Menu 也会开放到更多场景里使用。 - - -## `x-initializer` - -- MenuItemInitializers - -## `x-designer` - -- Menu.Designer - -## `x-settings` - -- MenuSettings - -## UI Schema - -### 菜单 - -```json -{ - "type": "void", - "x-component": "Menu", - "x-designer": "Menu.Designer", - "x-initializer": "MenuItemInitializers", - "x-component-props": { - "mode": "mix", - "theme": "dark", - "onSelect": "{{ onSelect }}", - "sideMenuRefScopeKey": "sideMenuRef" - }, - "name": "lap9zil5z4u", - "x-uid": "x77wpukk3qz", - "x-async": false -} -``` - -### 菜单分组 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "Group", - "x-component": "Menu.SubMenu", - "x-decorator": "ACLMenuItemProvider", - "x-component-props": { - "icon": "alipaycircleoutlined", - }, - "x-server-hooks": [ - { - "type": "onSelfCreate", - "method": "bindMenuToRole" - }, - { - "type": "onSelfSave", - "method": "extractTextToLocale" - } - ], - "x-uid": "zjxw5sph3do", - "x-async": false, - "x-index": 1 -} -``` - -### 菜单页面 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "Page1", - "x-component": "Menu.Item", - "x-decorator": "ACLMenuItemProvider", - "x-component-props": { - "icon": "alipaycircleoutlined", - }, - "x-server-hooks": [ - { - "type": "onSelfCreate", - "method": "bindMenuToRole" - }, - { - "type": "onSelfSave", - "method": "extractTextToLocale" - } - ], - "x-uid": "y0jp661nb8i", - "x-async": false, - "x-index": 2 -} -``` - -### 链接 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "Link", - "x-component": "Menu.URL", - "x-decorator": "ACLMenuItemProvider", - "x-component-props": { - "href": "#", - "icon": "alipaycircleoutlined" - }, - "x-server-hooks": [ - { - "type": "onSelfCreate", - "method": "bindMenuToRole" - }, - { - "type": "onSelfSave", - "method": "extractTextToLocale" - } - ], - "x-uid": "ynembhzwcj1", - "x-async": false, - "x-index": 3 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/globals/page.md b/packages/core/client/docs/zh-CN/ui-schema/globals/page.md deleted file mode 100644 index 2f93084f7..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/globals/page.md +++ /dev/null @@ -1,94 +0,0 @@ -# Page - - -现在页面依赖菜单,以后会独立出来,也可以创建无菜单的页面。另外,页面的标签页的设计还有问题。 - - -## `x-initializer` - -- PageTabsInitializers(暂无) -- BlockInitializers - -## `x-designer` - -- PageDesigner(暂无) -- PageTabsDesigner(暂无) - -## `x-settings` - -- PageSettings - -## UI Schema - -### 页面区块 - -```json -{ - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Page", - "title": "AA333", - "x-component-props": { - "enablePageTabs": true, - "hidePageTitle": true, - "disablePageHeader": true - }, - "properties": { - "nzxygx0iady": { - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "BlockInitializers", - "x-uid": "z8hxh8fxksb", - "x-async": false, - "x-index": 1 - } - }, - "x-uid": "9stdz1ld2p5", - "x-async": true, - "x-index": 1 -} -``` - -### 页面标签页 - -```json -{ - "x-uid": "cqq0ythy0yj", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Page", - "x-component-props": { - "enablePageTabs": true - }, - "properties": { - "o8gqaximg8c": { - "x-uid": "lzz2tqi8sxp", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "x-component": "Grid", - "x-initializer": "BlockInitializers", - "title": "Tab1", - "x-async": false, - "x-index": 1 - }, - "zjl1itzi6t8": { - "x-uid": "x10ru2grypq", - "_isJSONSchemaObject": true, - "version": "2.0", - "type": "void", - "title": "Tab2", - "x-component": "Grid", - "x-initializer": "BlockInitializers", - "x-async": false, - "x-index": 2 - } - }, - "x-async": true, - "x-index": 1 -} -``` \ No newline at end of file diff --git a/packages/core/client/docs/zh-CN/ui-schema/globals/tabs.md b/packages/core/client/docs/zh-CN/ui-schema/globals/tabs.md deleted file mode 100644 index c3ccea468..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/globals/tabs.md +++ /dev/null @@ -1,5 +0,0 @@ -# Tabs - - -标签页以后会重构,相关场景有页面的标签页和弹窗里的标签页 - diff --git a/packages/core/client/docs/zh-CN/ui-schema/index.md b/packages/core/client/docs/zh-CN/ui-schema/index.md deleted file mode 100644 index d908d9ed2..000000000 --- a/packages/core/client/docs/zh-CN/ui-schema/index.md +++ /dev/null @@ -1,25 +0,0 @@ -# 概述 - -## `x-initializer` - -不是所有节点都能使用 `x-initializer`,内置的 Schema 组件里,只有 Grid、ActionBar、Tabs、Table 组件有 `x-initializer` 参数 - -- Grid(通用) -- ActionBar(通用) -- Tabs(通用) -- Table -- Menu - -## `x-designer` - -`x-designer` 通常需要和 `BlockItem`、`FormItem`、`CardItem` 这类组件结合使用 - -完整的 Designer 组件有 - -- DragHandler -- Initializer -- Settings - -```tsx | pure - -``` diff --git a/packages/core/client/package.json b/packages/core/client/package.json index 2accc9085..11968944d 100644 --- a/packages/core/client/package.json +++ b/packages/core/client/package.json @@ -67,9 +67,7 @@ "@types/markdown-it": "12.2.3", "@types/markdown-it-highlightjs": "3.3.1", "@types/react-big-calendar": "^1.6.4", - "axios-mock-adapter": "^1.20.0", - "dumi": "^2.2.0", - "dumi-theme-nocobase": "^0.2.19" + "axios-mock-adapter": "^1.20.0" }, "peerDependencies": { "@nocobase/database": "workspace:*", diff --git a/packages/core/client/src/formula/Expression.tsx b/packages/core/client/src/formula/Expression.tsx deleted file mode 100644 index 34b4e0bff..000000000 --- a/packages/core/client/src/formula/Expression.tsx +++ /dev/null @@ -1,239 +0,0 @@ -import { css } from '@emotion/css'; -import { Field, onFormSubmitValidateStart } from '@nocobase/schema'; -import { useField, useFormEffects } from '@nocobase/schema'; -import { Dropdown, MenuProps } from 'antd'; -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { useTranslation } from 'react-i18next'; - -function pasteHtml(html, selectPastedContent = false) { - let sel, range; - if (window.getSelection) { - // IE9 and non-IE - sel = window.getSelection(); - if (sel.getRangeAt && sel.rangeCount) { - range = sel.getRangeAt(0); - range.deleteContents(); - - // Range.createContextualFragment() would be useful here but is - // only relatively recently standardized and is not supported in - // some browsers (IE9, for one) - const el = document.createElement('div'); - el.innerHTML = html; - let frag = document.createDocumentFragment(), - node, - lastNode; - while ((node = el.firstChild)) { - lastNode = frag.appendChild(node); - } - const firstNode = frag.firstChild; - range.insertNode(frag); - - // Preserve the selection - if (lastNode) { - range = range.cloneRange(); - range.setStartAfter(lastNode); - if (selectPastedContent) { - range.setStartBefore(firstNode); - } else { - range.collapse(true); - } - sel.removeAllRanges(); - sel.addRange(range); - } - } - } -} - -const getValue = (el) => { - const values: any[] = []; - for (const node of el.childNodes) { - if (node.nodeName === 'SPAN') { - values.push(`{{${node['dataset']['key']}}}`); - } else { - values.push(node.textContent?.trim?.()); - } - } - const text = values.join(' ')?.replace(/\s+/g, ' ').trim(); - return ` ${text} `; -}; - -const renderExp = (exp: string, scope = {}) => { - return exp.replace(/{{([^}]+)}}/g, (_, i) => { - return scope[i.trim()] || ''; - }); -}; - -export const Expression = (props) => { - const { evaluate, value, supports, useCurrentFields } = props; - const field = useField(); - const { t } = useTranslation(); - const fields = useCurrentFields(); - const inputRef = useRef(); - const [changed, setChanged] = useState(false); - - const onChange = useCallback( - (value) => { - setChanged(true); - props.onChange(value); - }, - [props.onChange], - ); - - const { numColumns, scope } = useMemo(() => { - const numColumns = new Map(); - const scope = {}; - fields - .filter((field) => supports.includes(field.interface)) - .forEach((field) => { - numColumns.set(field.name, field.uiSchema.title); - scope[field.name] = 1; - }); - - return { numColumns, scope }; - }, [fields, supports]); - - const keys = Array.from(numColumns.keys()); - const [html, setHtml] = useState(() => { - const scope = {}; - for (const key of keys) { - const val = numColumns.get(key); - scope[ - key - ] = ` ${val} `; - } - return renderExp(value || '', scope); - }); - - useEffect(() => { - if (changed) { - return; - } - const scope = {}; - for (const key of keys) { - const val = numColumns.get(key); - scope[ - key - ] = ` ${val} `; - } - const val = renderExp(value || '', scope); - setHtml(val); - }, [value]); - - const menuItems = useMemo(() => { - if (keys.length > 0) { - return keys.map((key) => ({ - key, - disabled: true, - label: ( - - ), - })); - } else { - return [ - { - key: 0, - disabled: true, - label: t('No available fields'), - }, - ]; - } - }, [keys, numColumns, onChange]); - - const menu = useMemo(() => { - return { - items: menuItems, - }; - }, [menuItems]); - - useFormEffects(() => { - onFormSubmitValidateStart(() => { - try { - evaluate(field.value, scope); - field.feedbacks = []; - } catch (e) { - console.error(field.value, scope, (e as Error).message); - field.setFeedback({ - type: 'error', - code: 'FormulaError', - messages: [t('Formula error.')], - }); - } - }); - }); - - return ( - - - ), - }} - components={{ - ExcelFormula, - }} - > - {props.children} - - ); -}); - -ExcelFormulaFieldProvider.displayName = 'ExcelFormulaFieldProvider'; diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/excel-formula.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/excel-formula.ts deleted file mode 100644 index 84a4f0edc..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/excel-formula.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { CollectionFieldInterface, interfacesProperties } from '@nocobase/client'; -const { defaultProps, operators } = interfacesProperties; - -export class ExcelFormulaFieldInterface extends CollectionFieldInterface { - name = 'excelFormula'; - type = 'object'; - group = 'advanced'; - order = 2; - title = '{{t("Excel formula")}}'; - description = '{{t("Compute a value based on the other fields using excel formula functions")}}'; - sortable = true; - default = { - type: 'excelFormula', - // name, - uiSchema: { - type: 'string', - // title, - 'x-disabled': true, - 'x-component': 'ExcelFormula.Result', - 'x-component-props': { - stringMode: true, - step: '1', - }, - }, - }; - properties = { - ...defaultProps, - dataType: { - type: 'string', - title: '{{t("Data type")}}', - 'x-component': 'Select', - 'x-decorator': 'FormItem', - default: 'number', - 'x-disabled': '{{ !createOnly }}', - 'x-reactions': [ - { - target: 'uiSchema.x-component-props.step', - fulfill: { - state: { - display: '{{$self.value !== "string" ? "visible" : "none"}}', - }, - }, - }, - ], - enum: [ - { value: 'string', label: '{{t("String")}}' }, - { value: 'number', label: '{{t("Number")}}' }, - ], - }, - 'uiSchema.x-component-props.step': { - type: 'string', - title: '{{t("Precision")}}', - 'x-component': 'Select', - 'x-decorator': 'FormItem', - required: true, - default: '0', - enum: [ - { value: '0', label: '1' }, - { value: '0.1', label: '1.0' }, - { value: '0.01', label: '1.00' }, - { value: '0.001', label: '1.000' }, - { value: '0.0001', label: '1.0000' }, - { value: '0.00001', label: '1.00000' }, - ], - }, - expression: { - type: 'string', - title: '{{t("Expression")}}', - required: true, - description: '{{excelExpressionDescription}}', - 'x-component': 'ExcelFormula.Expression', - 'x-decorator': 'FormItem', - 'x-component-props': { - supports: ['number', 'percent', 'integer', 'string'], - useCurrentFields: '{{ useCurrentFields }}', - }, - }, - }; - filterable = { - operators: operators.string, - }; -} diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/index.tsx b/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/index.tsx deleted file mode 100644 index adc576f98..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Plugin } from '@nocobase/client'; -import { ExcelFormulaFieldProvider } from './ExcelFormulaFieldProvider'; -import { ExcelFormulaFieldInterface } from './excel-formula'; - -export class ExcelFormulaFieldPlugin extends Plugin { - async load() { - this.app.use(ExcelFormulaFieldProvider); - this.app.dataSourceManager.addFieldInterfaces([ExcelFormulaFieldInterface]); - } -} - -export default ExcelFormulaFieldPlugin; diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/index.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/src/index.ts deleted file mode 100644 index 7e74612df..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './server'; -export { default } from './server'; diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/excel-formula-field.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/excel-formula-field.ts deleted file mode 100644 index 839c5e3ce..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/excel-formula-field.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { BaseFieldOptions, DataTypes, Field } from '@nocobase/database'; -import { evaluate } from '../utils/evaluate'; - -export class ExcelFormulaField extends Field { - get dataType() { - const { dataType } = this.options; - return dataType === 'string' ? DataTypes.STRING : DataTypes.DOUBLE; - } - - calculate(expression, scope) { - try { - return evaluate(expression, scope); - } catch {} - return null; - } - - initFieldData = async ({ transaction }) => { - const { expression, name } = this.options; - - const records = await this.collection.repository.find({ - order: [this.collection.model.primaryKeyAttribute], - transaction, - }); - - for (const record of records) { - const scope = record.toJSON(); - const result = this.calculate(expression, scope); - if (result) { - await record.update( - { - [name]: result, - }, - { - transaction, - silent: true, - hooks: false, - }, - ); - } - } - }; - - calculateField = async (instance) => { - const { expression, name } = this.options; - const scope = instance.toJSON(); - const result = this.calculate(expression, scope); - if (result) { - instance.set(name, result); - } - }; - - updateFieldData = async (instance, { transaction }) => { - if (this.collection.name === instance.collectionName && instance.name === this.options.name) { - this.options = Object.assign(this.options, instance.options); - const { name, expression } = this.options; - - const records = await this.collection.repository.find({ - order: [this.collection.model.primaryKeyAttribute], - transaction, - }); - - for (const record of records) { - const scope = record.toJSON(); - const result = this.calculate(expression, scope); - await record.update( - { - [name]: result, - }, - { - transaction, - silent: true, - hooks: false, - }, - ); - } - } - }; - - bind() { - super.bind(); - this.on('afterSync', this.initFieldData); - // TODO: should not depends on fields table (which is defined by other plugin) - this.database.on('fields.afterUpdate', this.updateFieldData); - this.on('beforeSave', this.calculateField); - } - - unbind() { - super.unbind(); - this.off('beforeSave', this.calculateField); - // TODO: should not depends on fields table - this.database.off('fields.afterUpdate', this.updateFieldData); - this.off('afterSync', this.initFieldData); - } - - toSequelize() { - const opts = super.toSequelize(); - delete opts.dataType; - return opts; - } -} - -export interface ExcelFormulaFieldOptions extends BaseFieldOptions { - type: 'excelFormula'; - dataType?: 'number' | 'string'; - expression: string; -} diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/index.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/index.ts deleted file mode 100644 index b68aea57f..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './plugin'; diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/plugin.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/plugin.ts deleted file mode 100644 index 75ed8247c..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/server/plugin.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { InstallOptions, Plugin } from '@nocobase/server'; -import { ExcelFormulaField } from './excel-formula-field'; - -export class ExcelFormulaFieldPlugin extends Plugin { - afterAdd() {} - - beforeLoad() { - this.db.registerFieldTypes({ - excelFormula: ExcelFormulaField, - }); - } - - async load() {} - - async install(options?: InstallOptions) {} - - async afterEnable() {} - - async afterDisable() {} - - async remove() {} -} - -export default ExcelFormulaFieldPlugin; diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/utils/evaluate.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/src/utils/evaluate.ts deleted file mode 100644 index cac69d182..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/utils/evaluate.ts +++ /dev/null @@ -1,9 +0,0 @@ -import * as formulajs from '@formulajs/formulajs'; - -export function evaluate(exp: string, scope = {}) { - const expression = exp.replace(/{{([^}]+)}}/g, (match, i) => { - return scope[i.trim()] || ''; - }); - const fn = new Function(...Object.keys(formulajs), ...Object.keys(scope), `return ${expression}`); - return fn(...Object.values(formulajs), ...Object.values(scope)); -} diff --git a/packages/plugins/@nocobase/plugin-formula-field/src/client/index.tsx b/packages/plugins/@nocobase/plugin-formula-field/src/client/index.tsx index 8571b40fe..229eac1b8 100644 --- a/packages/plugins/@nocobase/plugin-formula-field/src/client/index.tsx +++ b/packages/plugins/@nocobase/plugin-formula-field/src/client/index.tsx @@ -1,10 +1,16 @@ import { Plugin } from '@nocobase/client'; -import { FormulaFieldProvider } from './FormulaFieldProvider'; import { FormulaFieldInterface } from './interfaces/formula'; +import { Formula } from './components'; +import { renderExpressionDescription } from './scopes'; export class FormulaFieldPlugin extends Plugin { async load() { - this.app.use(FormulaFieldProvider); + this.app.addComponents({ + Formula, + }); + this.app.addScopes({ + renderExpressionDescription, + }); this.app.dataSourceManager.addFieldInterfaces([FormulaFieldInterface]); } } diff --git a/packages/plugins/@nocobase/plugin-formula-field/src/client/FormulaFieldProvider.tsx b/packages/plugins/@nocobase/plugin-formula-field/src/client/scopes.tsx similarity index 55% rename from packages/plugins/@nocobase/plugin-formula-field/src/client/FormulaFieldProvider.tsx rename to packages/plugins/@nocobase/plugin-formula-field/src/client/scopes.tsx index 43b010372..06dacd7b3 100644 --- a/packages/plugins/@nocobase/plugin-formula-field/src/client/FormulaFieldProvider.tsx +++ b/packages/plugins/@nocobase/plugin-formula-field/src/client/scopes.tsx @@ -1,11 +1,10 @@ -import { css, i18n, SchemaComponentOptions } from '@nocobase/client'; +import { css, i18n } from '@nocobase/client'; import { Evaluator, evaluators } from '@nocobase/evaluators/client'; import { Registry } from '@nocobase/utils/client'; import React from 'react'; -import { Formula } from './components'; import { NAMESPACE } from './locale'; -function renderExpressionDescription(key: string) { +export function renderExpressionDescription(key: string) { const engine = (evaluators as Registry).get(key); return engine?.link ? ( @@ -28,20 +27,3 @@ function renderExpressionDescription(key: string) { ) : null; } - -export const FormulaFieldProvider = React.memo((props) => { - return ( - - {props.children} - - ); -}); -FormulaFieldProvider.displayName = 'FormulaFieldProvider'; diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/.npmignore b/packages/plugins/@nocobase/plugin-math-formula-field/.npmignore deleted file mode 100644 index c593fe9df..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -/node_modules -/src \ No newline at end of file diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/LICENSE b/packages/plugins/@nocobase/plugin-math-formula-field/LICENSE deleted file mode 100644 index 0ad25db4b..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/README.md b/packages/plugins/@nocobase/plugin-math-formula-field/README.md deleted file mode 100644 index 09eeec113..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# math-formula-field - -English | [中文](./README.zh-CN.md) - -## 安装激活 - -内置插件无需手动安装激活。 - -## 使用方法 diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/README.zh-CN.md b/packages/plugins/@nocobase/plugin-math-formula-field/README.zh-CN.md deleted file mode 100644 index d408567ed..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/README.zh-CN.md +++ /dev/null @@ -1,9 +0,0 @@ -# math-formula-field - -[English](./README.md) | 中文 - -## 安装激活 - -内置插件无需手动安装激活。 - -## 使用方法 diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/client.d.ts b/packages/plugins/@nocobase/plugin-math-formula-field/client.d.ts deleted file mode 100644 index 6c459cbac..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/client.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/client'; -export { default } from './dist/client'; diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/client.js b/packages/plugins/@nocobase/plugin-math-formula-field/client.js deleted file mode 100644 index b6e3be70e..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/client.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/client/index.js'); diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/package.json b/packages/plugins/@nocobase/plugin-math-formula-field/package.json deleted file mode 100644 index 954a935ba..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@nocobase/plugin-math-formula-field", - "displayName": "math formula field", - "version": "0.21.6", - "description": "A powerful mathematical formula field plugin designed to provide flexible mathematical and formula calculation capabilities for databases or data management systems. It seamlessly integrates with various database systems such as MySQL, PostgreSQL, and offers an intuitive user interface for defining and executing mathematical formula fields.", - "keywords": [ - "Fields" - ], - "license": "AGPL-3.0", - "main": "./dist/server/index.js", - "devDependencies": { - "@nocobase/schema": "workspace:*", - "mathjs": "^10.6.0", - "react": "~18.2.0", - "react-i18next": "^11.15.1" - }, - "peerDependencies": { - "@nocobase/client": "workspace:*", - "@nocobase/database": "workspace:*", - "@nocobase/server": "workspace:*", - "@nocobase/test": "workspace:*" - }, - "description.zh-CN": "一个功能强大的数学公式字段插件,旨在为数据库或数据管理系统提供灵活的数学计算和公式计算功能。它可以与各种数据库系统(如MySQL、PostgreSQL)无缝集成,并提供直观的用户界面来定义和执行数学公式字段。", - "displayName.zh-CN": "数学公式字段", - "gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1" -} diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/server.d.ts b/packages/plugins/@nocobase/plugin-math-formula-field/server.d.ts deleted file mode 100644 index c41081ddc..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/server.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/server'; -export { default } from './dist/server'; diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/server.js b/packages/plugins/@nocobase/plugin-math-formula-field/server.js deleted file mode 100644 index 972842039..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/server.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/server/index.js'); diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/client/MathFormula/index.tsx b/packages/plugins/@nocobase/plugin-math-formula-field/src/client/MathFormula/index.tsx deleted file mode 100644 index 8877d8581..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/client/MathFormula/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { connect, observer } from '@nocobase/schema'; -import { Formula } from '@nocobase/client'; -import React from 'react'; -import { evaluate } from '../../utils/evaluate'; - -export const MathFormula: any = () => null; - -MathFormula.Result = observer( - (props) => - React.createElement(Formula.Result, { - ...props, - evaluate, - }), - { displayName: 'MathFormula.Result' }, -); - -MathFormula.Expression = connect((props) => { - return React.createElement(Formula.Expression, { - ...props, - evaluate, - }); -}); diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/client/MathFormulaFieldProvider.tsx b/packages/plugins/@nocobase/plugin-math-formula-field/src/client/MathFormulaFieldProvider.tsx deleted file mode 100644 index b1c319970..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/client/MathFormulaFieldProvider.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { SchemaComponentOptions } from '@nocobase/client'; -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { MathFormula } from './MathFormula'; - -export const MathFormulaFieldProvider = React.memo((props) => { - const { t } = useTranslation(); - return ( - - {t('Syntax see', { ns: 'math-formula-field' })}{' '} - - math.js - - - ), - }} - components={{ MathFormula }} - > - {props.children} - - ); -}); -MathFormulaFieldProvider.displayName = 'MathFormulaFieldProvider'; diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/client/index.tsx b/packages/plugins/@nocobase/plugin-math-formula-field/src/client/index.tsx deleted file mode 100644 index 80a9437c4..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/client/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Plugin } from '@nocobase/client'; -import { MathFormulaFieldProvider } from './MathFormulaFieldProvider'; -import { MathFormulaFieldInterface } from './math-formula'; - -export class MathFormulaFieldPlugin extends Plugin { - async load() { - this.app.use(MathFormulaFieldProvider); - this.app.dataSourceManager.addFieldInterfaces([MathFormulaFieldInterface]); - } -} - -export default MathFormulaFieldPlugin; diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/client/math-formula.tsx b/packages/plugins/@nocobase/plugin-math-formula-field/src/client/math-formula.tsx deleted file mode 100644 index ec1926ffc..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/client/math-formula.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { CollectionFieldInterface, interfacesProperties } from '@nocobase/client'; -const { defaultProps, operators } = interfacesProperties; - -export class MathFormulaFieldInterface extends CollectionFieldInterface { - name = 'mathFormula'; - type = 'object'; - group = 'advanced'; - order = 1; - title = '{{t("Math formula")}}'; - description = '{{t("Compute a value based on the other fields using mathjs")}}'; - sortable = true; - default = { - type: 'mathFormula', - // name, - uiSchema: { - type: 'number', - // title, - 'x-disabled': true, - 'x-component': 'MathFormula.Result', - 'x-component-props': { - stringMode: true, - step: '1', - }, - }, - }; - properties = { - ...defaultProps, - dataType: { - type: 'string', - title: '{{t("Data type")}}', - 'x-component': 'Select', - 'x-decorator': 'FormItem', - default: 'number', - 'x-disabled': '{{ !createOnly }}', - 'x-reactions': [ - { - target: 'uiSchema.x-component-props.step', - fulfill: { - state: { - display: '{{$self.value !== "string" ? "visible" : "none"}}', - }, - }, - }, - ], - enum: [ - { value: 'string', label: '{{t("String")}}' }, - { value: 'number', label: '{{t("Number")}}' }, - ], - }, - 'uiSchema.x-component-props.step': { - type: 'string', - title: '{{t("Precision")}}', - 'x-component': 'Select', - 'x-decorator': 'FormItem', - required: true, - default: '0', - enum: [ - { value: '0', label: '1' }, - { value: '0.1', label: '1.0' }, - { value: '0.01', label: '1.00' }, - { value: '0.001', label: '1.000' }, - { value: '0.0001', label: '1.0000' }, - { value: '0.00001', label: '1.00000' }, - ], - }, - expression: { - type: 'string', - title: '{{t("Expression")}}', - required: true, - description: '{{mathExpressionDescription}}', - 'x-component': 'MathFormula.Expression', - 'x-decorator': 'FormItem', - 'x-component-props': { - supports: ['number', 'percent', 'integer'], - useCurrentFields: '{{ useCurrentFields }}', - }, - }, - }; - filterable = { - operators: operators.number, - }; -} diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/index.ts b/packages/plugins/@nocobase/plugin-math-formula-field/src/index.ts deleted file mode 100644 index 7e74612df..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './server'; -export { default } from './server'; diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/__tests__/formula-field.test.ts b/packages/plugins/@nocobase/plugin-math-formula-field/src/server/__tests__/formula-field.test.ts deleted file mode 100644 index cff7ca966..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/__tests__/formula-field.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Database, mockDatabase } from '@nocobase/database'; -import { MathFormulaField } from '../math-formula-field'; - -describe('formula field', () => { - let db: Database; - - beforeEach(async () => { - db = mockDatabase(); - await db.clean({ drop: true }); - db.registerFieldTypes({ - mathFormula: MathFormulaField, - }); - }); - - afterEach(async () => { - await db.close(); - }); - - it('auto set formula field with create or update data', async () => { - const expression = 'price*count'; - const Test = db.collection({ - name: 'tests', - fields: [ - { type: 'float', name: 'price' }, - { type: 'float', name: 'count' }, - { name: 'sum', type: 'mathFormula', expression }, - ], - }); - - await db.sync(); - - const test = await Test.model.create({ - price: '1.2', - count: '2', - }); - - const sumField = Test.getField('sum'); - expect(test.get('sum')).toEqual(2.4); - - test.set('count', '6'); - await test.save(); - expect(test.get('sum')).toEqual(7.2); - }); - - it('auto set formula field with create or update data', async () => { - const expression = '{{price}}*{{count}}'; - const Test = db.collection({ - name: 'tests', - fields: [ - { type: 'float', name: 'price' }, - { type: 'float', name: 'count' }, - { name: 'sum', type: 'mathFormula', expression }, - ], - }); - - await db.sync(); - - const test = await Test.model.create({ - price: '1.2', - count: '2', - }); - - const sumField = Test.getField('sum'); - expect(test.get('sum')).toEqual(2.4); - - test.set('count', '6'); - await test.save(); - expect(test.get('sum')).toEqual(7.2); - }); - - it('1.22+2=3.22', async () => { - const expression = '{{a}}+{{b}}'; - const Test = db.collection({ - name: 'tests', - fields: [ - { type: 'float', name: 'a' }, - { type: 'float', name: 'b' }, - { name: 'sum', type: 'mathFormula', expression }, - ], - }); - - await db.sync(); - - const test = await Test.model.create({ - a: '2', - b: '1.22', - }); - - expect(test.get('sum')).toEqual(3.22); - }); -}); diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/index.ts b/packages/plugins/@nocobase/plugin-math-formula-field/src/server/index.ts deleted file mode 100644 index b68aea57f..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './plugin'; diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/math-formula-field.ts b/packages/plugins/@nocobase/plugin-math-formula-field/src/server/math-formula-field.ts deleted file mode 100644 index 9258e179c..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/math-formula-field.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { BaseFieldOptions, DataTypes, Field } from '@nocobase/database'; -import * as math from 'mathjs'; -import { evaluate } from '../utils/evaluate'; - -export class MathFormulaField extends Field { - get dataType() { - const { dataType } = this.options; - return dataType === 'string' ? DataTypes.STRING : DataTypes.DOUBLE; - } - - calculate(expression, scope) { - let result: any = null; - try { - result = evaluate(expression, scope); - result = math.round(result, 9); - } catch {} - return result; - } - - initFieldData = async ({ transaction }) => { - const { expression, name } = this.options; - - const records = await this.collection.repository.find({ - order: [this.collection.model.primaryKeyAttribute], - transaction, - }); - - for (const record of records) { - const scope = record.toJSON(); - const result = this.calculate(expression, scope); - if (result) { - await record.update( - { - [name]: result, - }, - { - transaction, - silent: true, - hooks: false, - }, - ); - } - } - }; - - calculateField = async (instance) => { - const { expression, name } = this.options; - const scope = instance.toJSON(); - let result; - try { - result = evaluate(expression, scope); - result = math.round(result, 9); - } catch {} - if (result === 0 || result) { - instance.set(name, result); - } - }; - - updateFieldData = async (instance, { transaction }) => { - if (this.collection.name === instance.collectionName && instance.name === this.options.name) { - this.options = Object.assign(this.options, instance.options); - const { name, expression } = this.options; - - const records = await this.collection.repository.find({ - order: [this.collection.model.primaryKeyAttribute], - transaction, - }); - - for (const record of records) { - const scope = record.toJSON(); - const result = this.calculate(expression, scope); - await record.update( - { - [name]: result, - }, - { - transaction, - silent: true, - hooks: false, - }, - ); - } - } - }; - - bind() { - super.bind(); - this.on('afterSync', this.initFieldData); - // TODO: should not depends on fields table (which is defined by other plugin) - this.database.on('fields.afterUpdate', this.updateFieldData); - this.on('beforeSave', this.calculateField); - } - - unbind() { - super.unbind(); - this.off('beforeSave', this.calculateField); - // TODO: should not depends on fields table - this.database.off('fields.afterUpdate', this.updateFieldData); - this.off('afterSync', this.initFieldData); - } -} - -export interface MathFormulaFieldOptions extends BaseFieldOptions { - type: 'mathFormula'; - expression: string; -} diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/migrations/20230110103214-alert-field.ts b/packages/plugins/@nocobase/plugin-math-formula-field/src/server/migrations/20230110103214-alert-field.ts deleted file mode 100644 index 418067c70..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/migrations/20230110103214-alert-field.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Migration } from '@nocobase/server'; - -export default class extends Migration { - async up() { - const result = await this.app.version.satisfies('<=0.8.3-alpha.1'); - if (!result) { - return; - } - const Field = this.context.db.getRepository('fields'); - const fields = await Field.find(); - await this.context.db.sequelize.transaction(async (transaction) => { - for (const field of fields) { - if (field.get('type') === 'formula') { - field.set('type', 'mathFormula'); - field.set('interface', 'mathFormula'); - await field.save({ transaction }); - const schema = await field.getUiSchema({ transaction }); - schema.set('x-component', 'MathFormula.Result'); - await schema.save({ transaction }); - } - } - }); - } -} diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/plugin.ts b/packages/plugins/@nocobase/plugin-math-formula-field/src/server/plugin.ts deleted file mode 100644 index 47ce0fbe7..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/server/plugin.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { InstallOptions, Plugin } from '@nocobase/server'; -import { resolve } from 'path'; -import { MathFormulaField } from './math-formula-field'; - -export class MathFormulaFieldPlugin extends Plugin { - afterAdd() {} - - beforeLoad() { - this.db.registerFieldTypes({ - formula: MathFormulaField, - mathFormula: MathFormulaField, - }); - - this.db.addMigrations({ - namespace: this.name, - directory: resolve(__dirname, './migrations'), - context: { - plugin: this, - }, - }); - } - - async load() {} - - async install(options?: InstallOptions) {} - - async afterEnable() {} - - async afterDisable() {} - - async remove() {} -} - -export default MathFormulaFieldPlugin; diff --git a/packages/plugins/@nocobase/plugin-math-formula-field/src/utils/evaluate.ts b/packages/plugins/@nocobase/plugin-math-formula-field/src/utils/evaluate.ts deleted file mode 100644 index 71c0eee14..000000000 --- a/packages/plugins/@nocobase/plugin-math-formula-field/src/utils/evaluate.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as math from 'mathjs'; - -export function evaluate(exp: string, scope = {}) { - const expression = exp.replace(/{{([^}]+)}}/g, (_, i) => { - return scope[i.trim()] || ''; - }); - return math.evaluate(expression, scope); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 42a97353e..61e8c3b6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -590,12 +590,6 @@ importers: axios-mock-adapter: specifier: ^1.20.0 version: 1.22.0(axios@1.6.7) - dumi: - specifier: ^2.2.0 - version: 2.2.16(@babel/core@7.22.10)(@types/node@20.12.7)(@types/react@18.2.75)(eslint@8.55.0)(prettier@3.2.5)(react-dom@18.2.0)(react@18.2.0)(stylelint@14.16.1)(typescript@4.9.5)(webpack@5.91.0) - dumi-theme-nocobase: - specifier: ^0.2.19 - version: 0.2.21(@babel/core@7.22.10)(@types/react@18.2.75)(dumi@2.2.16)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) packages/core/create-nocobase-app: dependencies: @@ -4762,12 +4756,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@ant-design/colors@6.0.0: - resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} - dependencies: - '@ctrl/tinycolor': 3.6.1 - dev: true - /@ant-design/colors@7.0.2: resolution: {integrity: sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==} dependencies: @@ -4821,10 +4809,6 @@ packages: react-dom: 18.2.0(react@18.2.0) stylis: 4.3.1 - /@ant-design/icons-svg@4.3.1: - resolution: {integrity: sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==} - dev: true - /@ant-design/icons-svg@4.4.2: resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} @@ -9131,74 +9115,6 @@ packages: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} dev: true - /@formatjs/ecma402-abstract@1.18.0: - resolution: {integrity: sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA==} - dependencies: - '@formatjs/intl-localematcher': 0.5.2 - tslib: 2.6.2 - dev: true - - /@formatjs/fast-memoize@2.2.0: - resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} - dependencies: - tslib: 2.6.2 - dev: true - - /@formatjs/icu-messageformat-parser@2.7.3: - resolution: {integrity: sha512-X/jy10V9S/vW+qlplqhMUxR8wErQ0mmIYSq4mrjpjDl9mbuGcCILcI1SUYkL5nlM4PJqpc0KOS0bFkkJNPxYRw==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - '@formatjs/icu-skeleton-parser': 1.7.0 - tslib: 2.6.2 - dev: true - - /@formatjs/icu-skeleton-parser@1.7.0: - resolution: {integrity: sha512-Cfdo/fgbZzpN/jlN/ptQVe0lRHora+8ezrEeg2RfrNjyp+YStwBy7cqDY8k5/z2LzXg6O0AdzAV91XS0zIWv+A==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - tslib: 2.6.2 - dev: true - - /@formatjs/intl-displaynames@6.6.4: - resolution: {integrity: sha512-ET8KQ+L9Q0K8x1SnJQa4DNssUcbATlMopWqYvGGR8yAvw5qwAQc1fv+DshCoZNIE9pbcue0IGC4kWNAkWqlFag==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - '@formatjs/intl-localematcher': 0.5.2 - tslib: 2.6.2 - dev: true - - /@formatjs/intl-listformat@7.5.3: - resolution: {integrity: sha512-l7EOr0Yh1m8KagytukB90yw81uyzrM7amKFrgxXqphz4KeSIL0KPa68lPsdtZ+JmQB73GaDQRwLOwUKFZ1VZPQ==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - '@formatjs/intl-localematcher': 0.5.2 - tslib: 2.6.2 - dev: true - - /@formatjs/intl-localematcher@0.5.2: - resolution: {integrity: sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw==} - dependencies: - tslib: 2.6.2 - dev: true - - /@formatjs/intl@2.9.9(typescript@4.9.5): - resolution: {integrity: sha512-JI3CNgL2Zdg5lv9ncT2sYKqbAj2RGrCbdzaCckIxMPxn4QuHuOVvYUGmBAXVusBmfG/0sxLmMrnwnBioz+QKdA==} - peerDependencies: - typescript: '5' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.3 - '@formatjs/intl-displaynames': 6.6.4 - '@formatjs/intl-listformat': 7.5.3 - intl-messageformat: 10.5.8 - tslib: 2.6.2 - typescript: 4.9.5 - dev: true - /@formily/antd-v5@1.1.9(@types/react-dom@18.2.24)(@types/react@18.2.75)(antd@5.16.1)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-Gw0wx6zERLJS8GvmTizV6UPNyxNrg2svbV1Dr38jwsw+dkEef7ZANNERfEpsl2TvCEDl4W3QVFNPws5woLGl8g==} engines: {npm: '>=3.0.0'} @@ -9636,15 +9552,6 @@ packages: react: 18.2.0 react-is: 16.13.1 - /@makotot/ghostui@2.0.0(react@18.2.0): - resolution: {integrity: sha512-LD6OeMv+yGjpYZNjh34yDTCIE1NegqOtJq5gm4wX6op3QL7K5psTVzMjkWzseBoYj0XOD4g+UJVIZTprfoOPGg==} - engines: {node: '>=10'} - peerDependencies: - react: '>=16' - dependencies: - react: 18.2.0 - dev: true - /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -10452,6 +10359,7 @@ packages: rc-util: 5.38.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /@rc-component/trigger@2.1.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-24BQg0M34hUDSFofZ8qpTdMXwbykXIl7svFi3OaZwYiz3HDpmv0pOJs0p3zV6hl7q4QuJypmsDQNs2ADqRu7Bw==} @@ -10656,114 +10564,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@reactflow/background@11.3.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-06FPlSUOOMALEEs+2PqPAbpqmL7WDjrkbG2UsDr2d6mbcDDhHiV4tu9FYoz44SQvXo7ma9VRotlsaR4OiRcYsg==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.7(@types/react@18.2.75)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: true - - /@reactflow/controls@11.2.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4QHT92/ACVlZkvV+Hq44bAPV8WbMhkJl+/J0EbXcqQ1+an7cWJsF84eeelJw7R5J76RoaSSpKdsWsL2v7HAVlw==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.7(@types/react@18.2.75)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: true - - /@reactflow/core@11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-GIh3usY1W3eVobx//OO9+Cwm+5evQBBdPGxDaeXwm25UqPMWRI240nXQA5F/5gL5Mwpf0DUC7DR2EmrKNQy+Rw==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@types/d3': 7.4.3 - '@types/d3-drag': 3.0.7 - '@types/d3-selection': 3.0.10 - '@types/d3-zoom': 3.0.8 - classcat: 5.0.4 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.7(@types/react@18.2.75)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: true - - /@reactflow/minimap@11.7.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kJEtyeQkTZYViLGebVWHVUJROMAGcvejvT+iX4DqKnFb5yK8E8LWlXQpRx2FrL9gDy80mJJaciy7IxnnQKE1bg==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - '@types/d3-selection': 3.0.10 - '@types/d3-zoom': 3.0.8 - classcat: 5.0.4 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.7(@types/react@18.2.75)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: true - - /@reactflow/node-resizer@2.2.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1Xb6q97uP7hRBLpog9sRCNfnsHdDgFRGEiU+lQqGgPEAeYwl4nRjWa/sXwH6ajniKxBhGEvrdzOgEFn6CRMcpQ==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.7(@types/react@18.2.75)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: true - - /@reactflow/node-toolbar@1.3.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-JXDEuZ0wKjZ8z7qK2bIst0eZPzNyVEsiHL0e93EyuqT4fA9icoyE0fLq2ryNOOp7MXgId1h7LusnH6ta45F0yQ==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.4.7(@types/react@18.2.75)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: true - /@redis/bloom@1.2.0(@redis/client@1.5.14): resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} peerDependencies: @@ -11124,13 +10924,6 @@ packages: string-argv: 0.3.2 dev: false - /@selderee/plugin-htmlparser2@0.11.0: - resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - dependencies: - domhandler: 5.0.3 - selderee: 0.11.0 - dev: true - /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -11139,10 +10932,6 @@ packages: engines: {node: '>=6'} dev: false - /@sketch-hq/sketch-file-format-ts@6.5.0: - resolution: {integrity: sha512-shaGl4ttFDpHjYBoMaZpciOtsi/lKvJ3VfcBYk6+PjjbFs6H5GxPAyhbiSqy3Vmx30aos284pd88QzD3rE6iag==} - dev: true - /@smithy/abort-controller@2.0.15: resolution: {integrity: sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==} engines: {node: '>=14.0.0'} @@ -11595,10 +11384,6 @@ packages: tslib: 2.6.2 dev: true - /@stackblitz/sdk@1.9.0: - resolution: {integrity: sha512-3m6C7f8pnR5KXys/Hqx2x6ylnpqOak6HtnZI6T5keEO0yT+E4Spkw37VEbdwuC+2oxmjdgq6YZEgiKX7hM1GmQ==} - dev: true - /@stylelint/postcss-css-in-js@0.38.0(postcss-syntax@0.36.2)(postcss@8.4.38): resolution: {integrity: sha512-XOz5CAe49kS95p5yRd+DAIWDojTjfmyAQ4bbDlXMdbZTQ5t0ThjSLvWI6JI2uiS7MFurVBkZ6zUqcimzcLTBoQ==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -11736,122 +11521,6 @@ packages: deepmerge: 4.3.1 svgo: 2.8.0 - /@swc/core-darwin-arm64@1.3.72: - resolution: {integrity: sha512-oNSI5hVfZ+1xpj+dH1g4kQqA0VsGtqd8S9S+cDqkHZiOOVOevw9KN6dzVtmLOcPtlULVypVc0TVvsB55KdVZhQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@swc/core-darwin-x64@1.3.72: - resolution: {integrity: sha512-y5O/WQ1g0/VfTgeNahWIOutbdD5U2Gi703jaefdcoJo3FUx8WU108QQdbVGwGMgaqapo3iQB6Qs9paixYQAYsA==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm-gnueabihf@1.3.72: - resolution: {integrity: sha512-05JdWcso0OomHF+7bk5MBDgI8MZ9skcQ/4nhSv5gboSgSiuBmKM15Bg3lZ5iAUwGByNj7pGkSmmd3YwTrXEB+g==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm64-gnu@1.3.72: - resolution: {integrity: sha512-8qRELJaeYshhJgqvyOeXCKqBOpai+JYdWuouMbvvDUL85j3OcZhzR+bipexEbbJKcOCdRnoYB7Qg6mjqZ0t7VA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm64-musl@1.3.72: - resolution: {integrity: sha512-tOqAGZw+Pe7YrBHFrwFVyRiKqjgjzwYbJmY+UDxLrzWrZSVtC3eO2TPrp7kWmhirg40Og81BbdfRAl8ds48w0Q==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - libc: [musl] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-x64-gnu@1.3.72: - resolution: {integrity: sha512-U2W2xWR3s9nplGVWz376GiBlcLTgxyYKlpZPBNZk0w3OvTcjKC62gW1Pe7PUkk4NgJUnaQDBa/mb4V4Zl+GZPA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - libc: [glibc] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-x64-musl@1.3.72: - resolution: {integrity: sha512-3+2dUiZBsifKgvnFEHWdysXjInK8K+BfPBw2tTZJmq1+fZLt0rvuErYDVMLfIJnVWLCcJMnDtTXrvkFV1y/6iA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - libc: [musl] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-arm64-msvc@1.3.72: - resolution: {integrity: sha512-ndI8xZ2AId806D25xgqw2SFJ9gc/jhg21+5hA8XPq9ZL+oDiaYDztaP3ijVmZ1G5xXKD9DpgB7xmylv/f6o6GA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-ia32-msvc@1.3.72: - resolution: {integrity: sha512-F3TK8JHP3SRFjLRlzcRVZPnvvGm2CQ5/cwbIkaEq0Dla3kyctU8SiRqvtYwWCW4JuY10cUygIg93Ec/C9Lkk4g==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-x64-msvc@1.3.72: - resolution: {integrity: sha512-FXMnIUtLl0yEmGkw+xbUg/uUPExvUxUlLSHbX7CnbSuOIHqMHzvEd9skIueLAst4bvmJ8kT1hDyAIWQcTIAJYQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core@1.3.72: - resolution: {integrity: sha512-+AKjwLH3/STfPrd7CHzB9+NG1FVT0UKJMUChuWq9sQ8b9xlV8vUeRgZXgh/EHYvNQgl/OUTQKtL6xU2yOLuEuA==} - engines: {node: '>=10'} - requiresBuild: true - peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true - optionalDependencies: - '@swc/core-darwin-arm64': 1.3.72 - '@swc/core-darwin-x64': 1.3.72 - '@swc/core-linux-arm-gnueabihf': 1.3.72 - '@swc/core-linux-arm64-gnu': 1.3.72 - '@swc/core-linux-arm64-musl': 1.3.72 - '@swc/core-linux-x64-gnu': 1.3.72 - '@swc/core-linux-x64-musl': 1.3.72 - '@swc/core-win32-arm64-msvc': 1.3.72 - '@swc/core-win32-ia32-msvc': 1.3.72 - '@swc/core-win32-x64-msvc': 1.3.72 - dev: true - /@swc/helpers@0.4.14: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: @@ -12077,189 +11746,10 @@ packages: '@types/node': 20.12.7 dev: true - /@types/d3-array@3.2.1: - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - dev: true - - /@types/d3-axis@3.0.6: - resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} - dependencies: - '@types/d3-selection': 3.0.10 - dev: true - - /@types/d3-brush@3.0.6: - resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} - dependencies: - '@types/d3-selection': 3.0.10 - dev: true - - /@types/d3-chord@3.0.6: - resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} - dev: true - - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: true - - /@types/d3-contour@3.0.6: - resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} - dependencies: - '@types/d3-array': 3.2.1 - '@types/geojson': 7946.0.13 - dev: true - - /@types/d3-delaunay@6.0.4: - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - dev: true - - /@types/d3-dispatch@3.0.6: - resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} - dev: true - - /@types/d3-drag@3.0.7: - resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} - dependencies: - '@types/d3-selection': 3.0.10 - dev: true - - /@types/d3-dsv@3.0.7: - resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} - dev: true - - /@types/d3-ease@3.0.2: - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - dev: true - - /@types/d3-fetch@3.0.7: - resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} - dependencies: - '@types/d3-dsv': 3.0.7 - dev: true - - /@types/d3-force@3.0.9: - resolution: {integrity: sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==} - dev: true - - /@types/d3-format@3.0.4: - resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - dev: true - - /@types/d3-geo@3.1.0: - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - dependencies: - '@types/geojson': 7946.0.13 - dev: true - - /@types/d3-hierarchy@3.1.6: - resolution: {integrity: sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw==} - dev: true - - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - dependencies: - '@types/d3-color': 3.1.3 - dev: true - - /@types/d3-path@3.0.2: - resolution: {integrity: sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==} - dev: true - - /@types/d3-polygon@3.0.2: - resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} - dev: true - - /@types/d3-quadtree@3.0.6: - resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - dev: true - - /@types/d3-random@3.0.3: - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} - dev: true - - /@types/d3-scale-chromatic@3.0.3: - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - dev: true - - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - dependencies: - '@types/d3-time': 3.0.3 - dev: true - - /@types/d3-selection@3.0.10: - resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} - dev: true - - /@types/d3-shape@3.1.6: - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - dependencies: - '@types/d3-path': 3.0.2 - dev: true - - /@types/d3-time-format@4.0.3: - resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - dev: true - - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: true - /@types/d3-timer@2.0.3: resolution: {integrity: sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg==} dev: false - /@types/d3-timer@3.0.2: - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - dev: true - - /@types/d3-transition@3.0.8: - resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==} - dependencies: - '@types/d3-selection': 3.0.10 - dev: true - - /@types/d3-zoom@3.0.8: - resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} - dependencies: - '@types/d3-interpolate': 3.0.4 - '@types/d3-selection': 3.0.10 - dev: true - - /@types/d3@7.4.3: - resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - dependencies: - '@types/d3-array': 3.2.1 - '@types/d3-axis': 3.0.6 - '@types/d3-brush': 3.0.6 - '@types/d3-chord': 3.0.6 - '@types/d3-color': 3.1.3 - '@types/d3-contour': 3.0.6 - '@types/d3-delaunay': 6.0.4 - '@types/d3-dispatch': 3.0.6 - '@types/d3-drag': 3.0.7 - '@types/d3-dsv': 3.0.7 - '@types/d3-ease': 3.0.2 - '@types/d3-fetch': 3.0.7 - '@types/d3-force': 3.0.9 - '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 - '@types/d3-hierarchy': 3.1.6 - '@types/d3-interpolate': 3.0.4 - '@types/d3-path': 3.0.2 - '@types/d3-polygon': 3.0.2 - '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - '@types/d3-selection': 3.0.10 - '@types/d3-shape': 3.1.6 - '@types/d3-time': 3.0.3 - '@types/d3-time-format': 4.0.3 - '@types/d3-timer': 3.0.2 - '@types/d3-transition': 3.0.8 - '@types/d3-zoom': 3.0.8 - dev: true - /@types/date-arithmetic@4.1.4: resolution: {integrity: sha512-p9eZ2X9B80iKiTW4ukVj8B4K6q9/+xFtQ5MGYA5HWToY9nL4EkhV9+6ftT2VHpVMEZb5Tv00Iel516bVdO+yRw==} dev: true @@ -12291,12 +11781,6 @@ packages: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - /@types/estree-jsx@1.0.3: - resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} - dependencies: - '@types/estree': 1.0.5 - dev: true - /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -12320,13 +11804,6 @@ packages: '@types/qs': 6.9.10 '@types/serve-static': 1.15.5 - /@types/fs-extra@11.0.1: - resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} - dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 20.12.7 - dev: true - /@types/fs-extra@11.0.4: resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} dependencies: @@ -12336,6 +11813,7 @@ packages: /@types/geojson@7946.0.13: resolution: {integrity: sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==} + dev: false /@types/glob-stream@8.0.2: resolution: {integrity: sha512-kyuRfGE+yiSJWzSO3t74rXxdZNdYfLcllO0IUha4eX1fl40pm9L02Q/TEc3mykTLjoWz4STBNwYnUWdFu3I0DA==} @@ -12373,12 +11851,6 @@ packages: /@types/hapi__joi@17.1.9: resolution: {integrity: sha512-oOMFT8vmCTFncsF1engrs04jatz8/Anwx3De9uxnOK4chgSEgWBvFtpSoJo8u3784JNO+ql5tzRR6phHoRnscQ==} - /@types/hast@2.3.8: - resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} - dependencies: - '@types/unist': 2.0.10 - dev: true - /@types/hoist-non-react-statics@3.3.5: resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} dependencies: @@ -12431,6 +11903,7 @@ packages: resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} dependencies: '@types/node': 20.12.7 + dev: false /@types/jsonwebtoken@8.5.9: resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} @@ -12444,6 +11917,7 @@ packages: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: '@types/node': 20.12.7 + dev: false /@types/koa-bodyparser@4.3.12: resolution: {integrity: sha512-hKMmRMVP889gPIdLZmmtou/BijaU1tHPyMNmcK7FAHAdATnRcGQQy78EqTTxLH1D4FTsrxIzklAQCso9oGoebQ==} @@ -12515,6 +11989,7 @@ packages: resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} dependencies: '@types/unist': 2.0.10 + dev: false /@types/mdurl@1.0.5: resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} @@ -12570,10 +12045,6 @@ packages: /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - dev: true - /@types/passport@1.0.16: resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} dependencies: @@ -12591,10 +12062,6 @@ packages: /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - /@types/q@1.5.8: - resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} - dev: true - /@types/qs@6.9.10: resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} @@ -12604,12 +12071,6 @@ packages: parchment: 1.1.4 dev: false - /@types/ramda@0.29.3: - resolution: {integrity: sha512-Yh/RHkjN0ru6LVhSQtTkCRo6HXkfL9trot/2elzM/yXLJmbLm2v6kJc8yftTnwv1zvUob6TEtqI2cYjdqG3U0Q==} - dependencies: - types-ramda: 0.29.6 - dev: true - /@types/range-parser@1.2.7: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -12654,12 +12115,7 @@ packages: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: '@types/node': 20.12.7 - - /@types/sax@1.2.7: - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - dependencies: - '@types/node': 20.12.7 - dev: true + dev: false /@types/semver@7.5.6: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} @@ -12762,6 +12218,7 @@ packages: /@types/unist@2.0.10: resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + dev: false /@types/validator@13.11.7: resolution: {integrity: sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==} @@ -12828,34 +12285,6 @@ packages: dependencies: '@types/yargs-parser': 21.0.3 - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.55.0)(typescript@4.9.5): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.55.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.55.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.55.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.55.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.0 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.55.0)(typescript@5.4.4): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -12941,26 +12370,6 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@5.62.0(eslint@8.55.0)(typescript@4.9.5): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.55.0 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.55.0)(typescript@5.4.4): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13037,26 +12446,6 @@ packages: '@typescript-eslint/visitor-keys': 6.14.0 dev: false - /@typescript-eslint/type-utils@5.62.0(eslint@8.55.0)(typescript@4.9.5): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.55.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@5.5.0) - eslint: 8.55.0 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.55.0)(typescript@5.4.4): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13126,27 +12515,6 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: false - /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@5.5.0) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.0 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.4): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13210,26 +12578,6 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@5.62.0(eslint@8.55.0)(typescript@4.9.5): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.55.0 - eslint-scope: 5.1.1 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.55.0)(typescript@5.4.4): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13335,18 +12683,6 @@ packages: transitivePeerDependencies: - supports-color - /@umijs/bundler-utils@4.0.89: - resolution: {integrity: sha512-/nKdEj0ku9MX5RYYLzDObuvDBb1sd89XD2Opldk7kgLbLw1iePksrWtP8gR5X2UGjqtEZYvcfrYFt0jV0LCcQg==} - dependencies: - '@umijs/utils': 4.0.89 - esbuild: 0.17.19 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - spdy: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /@umijs/bundler-utils@4.1.8: resolution: {integrity: sha512-SsbMgN8HzRvS2MqgqbpSnQpAdSYjl12wDznxlO8hiQJJ3sZm7pD4xLIHVIe1H452KsT3ilIDgyBaQ0U+sI8r0g==} dependencies: @@ -13384,7 +12720,7 @@ packages: - terser dev: false - /@umijs/bundler-vite@4.1.8(@types/node@20.12.7)(postcss@8.4.38)(sass@1.69.5): + /@umijs/bundler-vite@4.1.8(@types/node@20.12.7)(postcss@8.4.38): resolution: {integrity: sha512-uZEIlyh5aTtkbdbr2Gbv3C9NC4VMYOG3bsLNKjBzNbnUC4IMkpfcqpP/OZPzDySpvKCpHXkcOAo3x1U3G5zTng==} hasBin: true dependencies: @@ -13397,7 +12733,7 @@ packages: postcss-preset-env: 7.5.0(postcss@8.4.38) rollup-plugin-visualizer: 5.9.0 systemjs: 6.14.3 - vite: 4.5.2(@types/node@20.12.7)(less@4.1.3)(sass@1.69.5) + vite: 4.5.2(@types/node@20.12.7)(less@4.1.3) transitivePeerDependencies: - '@types/node' - lightningcss @@ -13410,43 +12746,6 @@ packages: - terser dev: true - /@umijs/bundler-webpack@4.1.8(typescript@4.9.5)(webpack@5.91.0): - resolution: {integrity: sha512-6yNmwTkgTd/A0vr5D3mMcTTXgDMxiwXQiTTBea6xrJgXfYYX0B7JftJQunITd75nvdToiDUwaIKFqUK1zxBDMw==} - hasBin: true - dependencies: - '@svgr/core': 6.5.1 - '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) - '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) - '@types/hapi__joi': 17.1.9 - '@umijs/babel-preset-umi': 4.1.8 - '@umijs/bundler-utils': 4.1.8 - '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 - '@umijs/mfsu': 4.1.8 - '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(webpack@5.91.0) - '@umijs/utils': 4.1.8 - cors: 2.8.5 - css-loader: 6.7.1(webpack@5.91.0) - es5-imcompatible-versions: 0.1.89 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@5.91.0) - jest-worker: 29.4.3 - lightningcss: 1.22.1 - node-libs-browser: 2.2.1 - postcss: 8.4.38 - postcss-preset-env: 7.5.0(postcss@8.4.38) - react-error-overlay: 6.0.9 - react-refresh: 0.14.0 - transitivePeerDependencies: - - '@types/webpack' - - sockjs-client - - supports-color - - type-fest - - typescript - - webpack - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - dev: true - /@umijs/bundler-webpack@4.1.8(typescript@5.4.4)(webpack@5.91.0): resolution: {integrity: sha512-6yNmwTkgTd/A0vr5D3mMcTTXgDMxiwXQiTTBea6xrJgXfYYX0B7JftJQunITd75nvdToiDUwaIKFqUK1zxBDMw==} hasBin: true @@ -13524,15 +12823,6 @@ packages: /@umijs/case-sensitive-paths-webpack-plugin@1.0.1: resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==} - /@umijs/core@4.0.89: - resolution: {integrity: sha512-S6K2Y8h6DyRoPP0EVrYgDs3iO7B2hHcd9QN+n6v0JHzhkHMVvsPnGlPx66yAptACBlBirR/ICIm0Pr1CrDADbg==} - dependencies: - '@umijs/bundler-utils': 4.0.89 - '@umijs/utils': 4.0.89 - transitivePeerDependencies: - - supports-color - dev: true - /@umijs/core@4.1.8: resolution: {integrity: sha512-c9jiLju4juc+3t60E38eZVh55eA/X240/JH0xxW/vOT4euFBfrq8U7J/66NRaKumdZ03wq2nX12mg4LtB9W8kQ==} dependencies: @@ -13651,34 +12941,6 @@ packages: '@babel/runtime': 7.23.6 query-string: 6.14.1 - /@umijs/lint@4.1.8(eslint@8.55.0)(stylelint@14.16.1)(typescript@4.9.5): - resolution: {integrity: sha512-IyTznUmlVTs4ReERK0leXSnK/PPiNrYNiTe6wIyQ5ltsdcQprRd2So97hzUYo/gHaD3VkOUX8kVlDou/N7Raiw==} - dependencies: - '@babel/core': 7.23.6 - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@8.55.0) - '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2)(postcss@8.4.38) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.55.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.55.0)(typescript@4.9.5) - '@umijs/babel-preset-umi': 4.1.8 - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.55.0)(typescript@4.9.5) - eslint-plugin-react: 7.33.2(eslint@8.55.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.55.0) - postcss: 8.4.38 - postcss-syntax: 0.36.2(postcss@8.4.38) - stylelint-config-standard: 25.0.0(stylelint@14.16.1) - transitivePeerDependencies: - - eslint - - jest - - postcss-html - - postcss-jsx - - postcss-less - - postcss-markdown - - postcss-scss - - stylelint - - supports-color - - typescript - dev: true - /@umijs/lint@4.1.8(eslint@8.55.0)(stylelint@14.16.1)(typescript@5.4.4): resolution: {integrity: sha512-IyTznUmlVTs4ReERK0leXSnK/PPiNrYNiTe6wIyQ5ltsdcQprRd2So97hzUYo/gHaD3VkOUX8kVlDou/N7Raiw==} dependencies: @@ -13809,64 +13071,6 @@ packages: - webpack-plugin-serve dev: false - /@umijs/preset-umi@4.1.8(@types/node@20.12.7)(@types/react@18.2.75)(sass@1.69.5)(typescript@4.9.5)(webpack@5.91.0): - resolution: {integrity: sha512-YZxHggqsZgl0cYiAifYAv2fVWMOzAyKQx1u00IXDJF5JfS0mcq2lnX2ZTBXXdoG7jYSlqRsqAo+AnR+BWHKu3A==} - dependencies: - '@iconify/utils': 2.1.1 - '@svgr/core': 6.5.1 - '@umijs/ast': 4.1.8 - '@umijs/babel-preset-umi': 4.1.8 - '@umijs/bundler-esbuild': 4.1.8 - '@umijs/bundler-utils': 4.1.8 - '@umijs/bundler-vite': 4.1.8(@types/node@20.12.7)(postcss@8.4.38)(sass@1.69.5) - '@umijs/bundler-webpack': 4.1.8(typescript@4.9.5)(webpack@5.91.0) - '@umijs/core': 4.1.8 - '@umijs/did-you-know': 1.0.3 - '@umijs/es-module-parser': 0.0.7 - '@umijs/history': 5.3.1 - '@umijs/mfsu': 4.1.8 - '@umijs/plugin-run': 4.1.8 - '@umijs/renderer-react': 4.1.8(react-dom@18.1.0)(react@18.1.0) - '@umijs/server': 4.1.8 - '@umijs/ui': 3.0.1 - '@umijs/utils': 4.1.8 - '@umijs/zod2ts': 4.1.8 - babel-plugin-dynamic-import-node: 2.3.3 - click-to-react-component: 1.1.0(@types/react@18.2.75)(react-dom@18.1.0)(react@18.1.0) - core-js: 3.34.0 - current-script-polyfill: 1.0.0 - enhanced-resolve: 5.9.3 - fast-glob: 3.2.12 - html-webpack-plugin: 5.5.0(webpack@5.91.0) - less-plugin-resolve: 1.0.2 - path-to-regexp: 1.7.0 - postcss: 8.4.38 - postcss-prefix-selector: 1.16.0(postcss@8.4.38) - react: 18.1.0 - react-dom: 18.1.0(react@18.1.0) - react-router: 6.3.0(react@18.1.0) - react-router-dom: 6.3.0(react-dom@18.1.0)(react@18.1.0) - regenerator-runtime: 0.13.11 - transitivePeerDependencies: - - '@types/node' - - '@types/react' - - '@types/webpack' - - lightningcss - - rollup - - sass - - sockjs-client - - stylus - - sugarss - - supports-color - - terser - - type-fest - - typescript - - webpack - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - dev: true - /@umijs/preset-umi@4.1.8(@types/node@20.12.7)(@types/react@18.2.75)(typescript@5.4.5)(webpack@5.91.0): resolution: {integrity: sha512-YZxHggqsZgl0cYiAifYAv2fVWMOzAyKQx1u00IXDJF5JfS0mcq2lnX2ZTBXXdoG7jYSlqRsqAo+AnR+BWHKu3A==} dependencies: @@ -13876,7 +13080,7 @@ packages: '@umijs/babel-preset-umi': 4.1.8 '@umijs/bundler-esbuild': 4.1.8 '@umijs/bundler-utils': 4.1.8 - '@umijs/bundler-vite': 4.1.8(@types/node@20.12.7)(postcss@8.4.38)(sass@1.69.5) + '@umijs/bundler-vite': 4.1.8(@types/node@20.12.7)(postcss@8.4.38) '@umijs/bundler-webpack': 4.1.8(typescript@5.4.5)(webpack@5.91.0) '@umijs/core': 4.1.8 '@umijs/did-you-know': 1.0.3 @@ -14036,13 +13240,6 @@ packages: '@umijs/deps': 3.5.20 dev: false - /@umijs/utils@4.0.89: - resolution: {integrity: sha512-Gq2yyuhp4m17DfU9VE59MkJGQrnbSsFp9/pfOFhbArV6AWzSo+EUY6UwLPmuQdJbJzVacZlN6N8t6cb794sVNw==} - dependencies: - chokidar: 3.5.3 - pino: 7.11.0 - dev: true - /@umijs/utils@4.1.8: resolution: {integrity: sha512-438dwza66i13H8EYhJuvJcvWGR9Ij5eUSqTaF0XEq+vL8YUCx3cOeYdE/oIrunxDIbNFLmLaG0FtTcEEvK4oeA==} dependencies: @@ -14083,7 +13280,7 @@ packages: '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) react-refresh: 0.14.0 - vite: 4.5.2(@types/node@20.12.7)(less@4.1.3)(sass@1.69.5) + vite: 4.5.2(@types/node@20.12.7)(less@4.1.3) transitivePeerDependencies: - supports-color @@ -14336,13 +13533,6 @@ packages: engines: {node: '>=0.8'} dev: true - /agent-base@4.3.0: - resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} - engines: {node: '>= 4.0.0'} - dependencies: - es6-promisify: 5.0.0 - dev: true - /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -14520,16 +13710,6 @@ packages: resolution: {integrity: sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==} dev: false - /animated-scroll-to@2.3.0: - resolution: {integrity: sha512-PT/5MSKCWQaK2kuOl2HT2KJMuJEvUS4/TgMhWy82c2EmF74/CIkvPBPKOvd8nMYP6Higo7xCn49/iSW9BccMoQ==} - dev: true - - /ansi-align@2.0.0: - resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} - dependencies: - string-width: 2.1.1 - dev: true - /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -14721,35 +13901,6 @@ packages: - react-dom dev: true - /antd-token-previewer@2.0.5(@babel/core@7.22.10)(@types/react@18.2.75)(antd@5.16.1)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-AIxkqI6nd1VJSNsd77tp1UhBQ0K0YdRcWan6E2aG9RTvapZf8hhwcDL/YVJaPaS/4V3iFeOtD2z12BMseemshg==} - peerDependencies: - antd: ^5.5.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - '@ant-design/colors': 6.0.0 - '@ant-design/cssinjs': 1.19.0(react-dom@18.2.0)(react@18.2.0) - '@ant-design/icons': 5.3.6(react-dom@18.2.0)(react@18.2.0) - '@arvinxu/layout-kit': 1.4.0(@babel/core@7.22.10)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - '@babel/runtime': 7.24.1 - '@ctrl/tinycolor': 3.6.1 - antd: 5.16.1(react-dom@18.2.0)(react@18.2.0) - classnames: 2.5.1 - rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-colorful: 5.6.1(react-dom@18.2.0)(react@18.2.0) - react-dom: 18.2.0(react@18.2.0) - reactflow: 11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - use-debouncy: 4.3.1(react@18.2.0) - vanilla-jsoneditor: 0.16.1 - transitivePeerDependencies: - - '@babel/core' - - '@types/react' - - immer - - react-is - dev: true - /antd@5.16.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-XAlLRrgYV+nj9FHnkXEPS6HNcKcluEa8v44e7Cixjlp8aOXRhUI6IfZaKpc2MPGjQ+06rp62/dsxOUNJW9kfLA==} peerDependencies: @@ -14840,10 +13991,6 @@ packages: /append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} - /aproba@1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - dev: true - /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -14924,10 +14071,6 @@ packages: /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true - /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -15100,17 +14243,6 @@ packages: es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - /array.prototype.reduce@1.0.6: - resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: true - /array.prototype.tosorted@1.1.3: resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} dependencies: @@ -15205,11 +14337,6 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - /astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - dev: true - /async-done@1.3.2: resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} engines: {node: '>= 0.10'} @@ -15263,6 +14390,7 @@ packages: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true + dev: false /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} @@ -15330,16 +14458,6 @@ packages: is-buffer: 2.0.5 dev: true - /axios@0.18.1: - resolution: {integrity: sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==} - deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 - dependencies: - follow-redirects: 1.5.10 - is-buffer: 2.0.5 - transitivePeerDependencies: - - supports-color - dev: true - /axios@0.21.4(debug@4.3.4): resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: @@ -15514,10 +14632,6 @@ packages: now-and-later: 2.0.1 dev: false - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -15599,11 +14713,6 @@ packages: chainsaw: 0.1.0 dev: true - /binaryextensions@2.3.0: - resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==} - engines: {node: '>=0.8'} - dev: true - /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} requiresBuild: true @@ -15651,9 +14760,6 @@ packages: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} dev: true - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -15682,19 +14788,6 @@ packages: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} dev: true - /boxen@1.3.0: - resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} - engines: {node: '>=4'} - dependencies: - ansi-align: 2.0.0 - camelcase: 4.1.0 - chalk: 2.4.2 - cli-boxes: 1.0.0 - string-width: 2.1.1 - term-size: 1.2.0 - widest-line: 2.0.1 - dev: true - /boxen@3.2.0: resolution: {integrity: sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==} engines: {node: '>=6'} @@ -15932,10 +15025,6 @@ packages: /builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - /builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - dev: true - /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: @@ -15986,24 +15075,6 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - /cacache@10.0.4: - resolution: {integrity: sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==} - dependencies: - bluebird: 3.7.2 - chownr: 1.1.4 - glob: 7.2.3 - graceful-fs: 4.2.11 - lru-cache: 4.1.5 - mississippi: 2.0.0 - mkdirp: 0.5.6 - move-concurrently: 1.0.1 - promise-inflight: 1.0.1(bluebird@3.7.2) - rimraf: 2.7.1 - ssri: 5.3.0 - unique-filename: 1.1.1 - y18n: 4.0.3 - dev: true - /cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} @@ -16022,7 +15093,7 @@ packages: minipass-pipeline: 1.2.4 mkdirp: 1.0.4 p-map: 4.0.0 - promise-inflight: 1.0.1(bluebird@3.7.2) + promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 tar: 6.2.0 @@ -16032,24 +15103,6 @@ packages: dev: false optional: true - /cacache@9.3.0: - resolution: {integrity: sha512-Vbi8J1XfC8v+FbQ6QkOtKXsHpPnB0i9uMeYFJoj40EbdOsEqWB3DPpNjfsnYBkqOPYA8UvrqH6FZPpBP0zdN7g==} - dependencies: - bluebird: 3.7.2 - chownr: 1.1.4 - glob: 7.2.3 - graceful-fs: 4.2.11 - lru-cache: 4.1.5 - mississippi: 1.3.1 - mkdirp: 0.5.6 - move-concurrently: 1.0.1 - promise-inflight: 1.0.1(bluebird@3.7.2) - rimraf: 2.7.1 - ssri: 4.1.6 - unique-filename: 1.1.1 - y18n: 3.2.2 - dev: true - /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} @@ -16152,11 +15205,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - dev: true - /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -16196,19 +15244,10 @@ packages: dev: true optional: true - /capture-stack-trace@1.0.2: - resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} - engines: {node: '>=0.10.0'} - dev: true - /caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: true - /center-align@0.1.3: resolution: {integrity: sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==} engines: {node: '>=0.10.0'} @@ -16292,34 +15331,18 @@ packages: engines: {node: '>=10'} dev: false - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: true - /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} dev: false - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: true - /character-entities@1.2.4: resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} dev: false - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: true - /character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} dev: false - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: true - /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true @@ -16401,10 +15424,6 @@ packages: optionalDependencies: fsevents: 2.3.3 - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -16413,10 +15432,6 @@ packages: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - /ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - dev: true - /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: false @@ -16445,14 +15460,6 @@ packages: static-extend: 0.1.2 dev: false - /classcat@5.0.4: - resolution: {integrity: sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==} - dev: true - - /classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - dev: true - /classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -16467,11 +15474,6 @@ packages: engines: {node: '>=6'} dev: false - /cli-boxes@1.0.0: - resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} - engines: {node: '>=0.10.0'} - dev: true - /cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} @@ -16506,11 +15508,6 @@ packages: restore-cursor: 4.0.0 dev: true - /cli-spinners@1.3.1: - resolution: {integrity: sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==} - engines: {node: '>=4'} - dev: true - /cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -16664,15 +15661,6 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: false - /coa@2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} - dependencies: - '@types/q': 1.5.8 - chalk: 2.4.2 - q: 1.5.1 - dev: true - /code-point-at@1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} @@ -16683,47 +15671,6 @@ packages: engines: {node: '>=0.8'} dev: true - /codesandbox-import-util-types@2.2.3: - resolution: {integrity: sha512-Qj00p60oNExthP2oR3vvXmUGjukij+rxJGuiaKM6tyUmSyimdZsqHI/TUvFFClAffk9s7hxGnQgWQ8KCce27qQ==} - dev: true - - /codesandbox-import-utils@2.2.3: - resolution: {integrity: sha512-ymtmcgZKU27U+nM2qUb21aO8Ut/u2S9s6KorOgG81weP+NA0UZkaHKlaRqbLJ9h4i/4FLvwmEXYAnTjNmp6ogg==} - dependencies: - codesandbox-import-util-types: 2.2.3 - istextorbinary: 2.6.0 - lz-string: 1.5.0 - dev: true - - /codesandbox@2.2.3: - resolution: {integrity: sha512-IAkWFk6UUglOhSemI7UFgNNL/jgg+1YjVEIllFULLgsaHhFnY51pCqAifMNuAd5d9Zp4Nk/xMgrEaGNV0L4Xlg==} - hasBin: true - dependencies: - axios: 0.18.1 - chalk: 2.4.2 - codesandbox-import-util-types: 2.2.3 - codesandbox-import-utils: 2.2.3 - commander: 2.20.3 - datauri: 3.0.0 - filesize: 3.6.1 - fs-extra: 3.0.1 - git-branch: 1.0.0 - git-repo-name: 0.6.0 - git-username: 0.5.1 - humps: 2.0.1 - inquirer: 6.5.2 - lodash: 4.17.21 - lz-string: 1.5.0 - ms: 2.1.3 - open: 6.4.0 - ora: 1.4.0 - pacote: 2.7.38 - shortid: 2.2.16 - update-notifier: 2.5.0 - transitivePeerDependencies: - - supports-color - dev: true - /collection-map@1.0.0: resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} engines: {node: '>=0.10.0'} @@ -16773,6 +15720,7 @@ packages: dependencies: color-convert: 1.9.3 color-string: 1.9.1 + dev: false /colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -16799,10 +15747,6 @@ packages: dependencies: delayed-stream: 1.0.0 - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: true - /commander@11.0.0: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} engines: {node: '>=16'} @@ -16944,18 +15888,6 @@ packages: proto-list: 1.2.4 dev: false - /configstore@3.1.5: - resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} - engines: {node: '>=4'} - dependencies: - dot-prop: 4.2.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - unique-string: 1.0.0 - write-file-atomic: 2.4.3 - xdg-basedir: 3.0.0 - dev: true - /configstore@4.0.0: resolution: {integrity: sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==} engines: {node: '>=6'} @@ -17054,17 +15986,6 @@ packages: dependencies: is-what: 3.14.1 - /copy-concurrently@1.0.5: - resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} - dependencies: - aproba: 1.2.0 - fs-write-stream-atomic: 1.0.10 - iferr: 0.1.5 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - dev: true - /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} @@ -17188,13 +16109,6 @@ packages: bn.js: 4.12.0 elliptic: 6.5.5 - /create-error-class@3.0.2: - resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} - engines: {node: '>=0.10.0'} - dependencies: - capture-stack-trace: 1.0.2 - dev: true - /create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} dependencies: @@ -17316,6 +16230,7 @@ packages: /crypto-random-string@1.0.0: resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} engines: {node: '>=4'} + dev: false /crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} @@ -17381,19 +16296,6 @@ packages: dependencies: postcss: 8.4.38 - /css-select-base-adapter@0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} - dev: true - - /css-select@2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} - dependencies: - boolbase: 1.0.0 - css-what: 3.4.2 - domutils: 1.7.0 - nth-check: 1.0.2 - dev: true - /css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} dependencies: @@ -17411,14 +16313,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /css-tree@1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.4 - source-map: 0.6.1 - dev: true - /css-tree@1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} engines: {node: '>=8.0.0'} @@ -17426,11 +16320,6 @@ packages: mdn-data: 2.0.14 source-map: 0.6.1 - /css-what@3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} - dev: true - /css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -17439,14 +16328,6 @@ packages: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: false - /css@3.0.0: - resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} - dependencies: - inherits: 2.0.4 - source-map: 0.6.1 - source-map-resolve: 0.6.0 - dev: true - /cssdb@6.6.3: resolution: {integrity: sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==} @@ -17509,17 +16390,6 @@ packages: /current-script-polyfill@1.0.0: resolution: {integrity: sha512-qv8s+G47V6Hq+g2kRE5th+ASzzrL7b6l+tap1DHKK25ZQJv3yIFhH96XaQ7NGL+zRW3t/RDbweJf/dJDe5Z5KA==} - /cwd@0.9.1: - resolution: {integrity: sha512-4+0D+ojEasdLndYX4Cqff057I/Jp6ysXpwKkdLQLnZxV8f6IYZmZtTP5uqD91a/kWqejoc0sSqK4u8wpTKCh8A==} - engines: {node: '>=0.8'} - dependencies: - find-pkg: 0.1.2 - dev: true - - /cyclist@1.0.2: - resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} - dev: true - /cytoscape-cose-bilkent@4.1.0(cytoscape@3.28.0): resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: @@ -17607,6 +16477,7 @@ packages: dependencies: d3-dispatch: 3.0.1 d3-selection: 3.0.0 + dev: false /d3-dsv@3.0.1: resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} @@ -17624,6 +16495,7 @@ packages: /d3-ease@3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} + dev: false /d3-fetch@3.0.1: resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} @@ -17707,6 +16579,7 @@ packages: /d3-selection@3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} + dev: false /d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} @@ -17748,6 +16621,7 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 + dev: false /d3-voronoi@1.1.4: resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} @@ -17762,6 +16636,7 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false /d3@7.8.5: resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} @@ -17877,14 +16752,6 @@ packages: es-errors: 1.3.0 is-data-view: 1.0.1 - /datauri@3.0.0: - resolution: {integrity: sha512-NeDFuUPV1YCpCn8MUIcDk1QnuyenUHs7f4Q5P0n9FFA0neKFrfEH9esR+YMW95BplbYfdmjbs0Pl/ZGAaM2QHQ==} - engines: {node: '>= 8'} - dependencies: - image-size: 0.8.3 - mimer: 1.1.0 - dev: true - /date-arithmetic@4.1.0: resolution: {integrity: sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg==} dev: true @@ -17924,17 +16791,6 @@ packages: dependencies: ms: 2.0.0 - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -17971,12 +16827,6 @@ packages: /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: true - /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} @@ -18097,18 +16947,11 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + dev: false /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /deep-rename-keys@0.2.1: - resolution: {integrity: sha512-RHd9ABw4Fvk+gYDWqwOftG849x0bYOySl/RgX0tLI9i27ZIeSO91mLZJEp7oPHOMFqHvpgu21YptmDt0FYD/0A==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - rename-keys: 1.2.0 - dev: true - /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -18323,11 +17166,6 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: true - /diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dependencies: @@ -18388,13 +17226,6 @@ packages: csstype: 3.1.3 dev: true - /dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} - dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - dev: true - /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: @@ -18408,15 +17239,12 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 + dev: false /domain-browser@1.2.0: resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} engines: {node: '>=0.4', npm: '>=1.2'} - /domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - dev: true - /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -18438,18 +17266,12 @@ packages: engines: {node: '>= 4'} dependencies: domelementtype: 2.3.0 + dev: false /dompurify@2.4.3: resolution: {integrity: sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==} dev: false - /domutils@1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} - dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 - dev: true - /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -18463,6 +17285,7 @@ packages: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 + dev: false /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -18475,6 +17298,7 @@ packages: engines: {node: '>=4'} dependencies: is-obj: 1.0.1 + dev: false /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} @@ -18504,146 +17328,6 @@ packages: /dottie@2.0.6: resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==} - /dumi-afx-deps@1.0.0-alpha.20: - resolution: {integrity: sha512-PRSJlHuJkyHDET7Hukykx/hLULkgUBX5q2CutMG5EDI3eJLzJlX634wNll10m3at1uomcDAVudL7Dgh5UOJ7IQ==} - dev: true - - /dumi-assets-types@2.0.0-alpha.0: - resolution: {integrity: sha512-a/Y5lf0G6gwsEQ9hop/n03CcjmHsGBk384Cz/AEX6mRYrfSpUx/lQvP9HLoXkCzScl9PL1sSmLPnMkgaXDCZLA==} - dev: true - - /dumi-theme-nocobase@0.2.21(@babel/core@7.22.10)(@types/react@18.2.75)(dumi@2.2.16)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SEAE25VQOaYbY+maD5XEdDUqCQojqbfZYKkl0qVKCWHjTeQZHqptqxD/yi8KtypBJ7B+tdNKljppt0fSm/vJHw==} - peerDependencies: - dumi: ^2.2.0 - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@ant-design/icons': 5.3.6(react-dom@18.2.0)(react@18.2.0) - '@babel/runtime': 7.24.0 - '@ctrl/tinycolor': 3.6.1 - '@emotion/react': 11.11.1(@types/react@18.2.75)(react@18.2.0) - antd: 5.16.1(react-dom@18.2.0)(react@18.2.0) - antd-token-previewer: 2.0.5(@babel/core@7.22.10)(@types/react@18.2.75)(antd@5.16.1)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - classnames: 2.5.1 - dayjs: 1.11.10 - dumi: 2.2.16(@babel/core@7.22.10)(@types/node@20.12.7)(@types/react@18.2.75)(eslint@8.55.0)(prettier@3.2.5)(react-dom@18.2.0)(react@18.2.0)(stylelint@14.16.1)(typescript@4.9.5)(webpack@5.91.0) - rc-drawer: 6.5.2(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@babel/core' - - '@types/react' - - date-fns - - immer - - luxon - - moment - - react-is - dev: true - - /dumi@2.2.16(@babel/core@7.22.10)(@types/node@20.12.7)(@types/react@18.2.75)(eslint@8.55.0)(prettier@3.2.5)(react-dom@18.2.0)(react@18.2.0)(stylelint@14.16.1)(typescript@4.9.5)(webpack@5.91.0): - resolution: {integrity: sha512-r2x/CY0fR8/YZOwEnG4JsLEpn8jOg94Qyd1u+7pRD9SCx7dF9It+GwkGbdNEsyenGsO/ZU9wD+Kz7KO+HU7/EA==} - hasBin: true - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - dependencies: - '@ant-design/icons-svg': 4.3.1 - '@makotot/ghostui': 2.0.0(react@18.2.0) - '@stackblitz/sdk': 1.9.0 - '@swc/core': 1.3.72 - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - '@umijs/bundler-utils': 4.0.89 - '@umijs/core': 4.0.89 - '@umijs/utils': 4.1.8 - animated-scroll-to: 2.3.0 - classnames: 2.3.2 - codesandbox: 2.2.3 - copy-to-clipboard: 3.3.3 - deepmerge: 4.3.1 - dumi-afx-deps: 1.0.0-alpha.20 - dumi-assets-types: 2.0.0-alpha.0 - enhanced-resolve: 5.15.0 - estree-util-to-js: 1.2.0 - estree-util-visit: 1.2.1 - file-system-cache: 2.4.4 - github-slugger: 1.5.0 - hast-util-is-element: 2.1.3 - hast-util-raw: 8.0.0 - hast-util-to-estree: 2.3.3 - hast-util-to-string: 2.0.0 - heti: 0.9.4 - hosted-git-info: 6.1.1 - html-to-text: 9.0.5 - html2sketch: 1.0.2 - js-yaml: 4.1.0 - lodash.throttle: 4.1.1 - mdast-util-find-and-replace: 2.2.2 - mdast-util-to-string: 3.2.0 - nprogress: 0.2.0 - pluralize: 8.0.0 - prism-react-renderer: 1.3.5(react@18.2.0) - prism-themes: 1.9.0 - prismjs: 1.29.0 - raw-loader: 4.0.2(webpack@5.91.0) - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-tabs: 12.15.0(react-dom@18.2.0)(react@18.2.0) - rc-tree: 5.8.2(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-copy-to-clipboard: 5.1.0(react@18.2.0) - react-dom: 18.2.0(react@18.2.0) - react-error-boundary: 4.0.11(react@18.2.0) - react-intl: 6.5.5(react@18.2.0)(typescript@4.9.5) - rehype-autolink-headings: 6.1.1 - rehype-remove-comments: 5.0.0 - rehype-stringify: 9.0.4 - remark-directive: 2.0.1 - remark-frontmatter: 4.0.1 - remark-gfm: 3.0.1 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - sass: 1.69.5 - sitemap: 7.1.1 - umi: 4.1.8(@babel/core@7.22.10)(@types/node@20.12.7)(@types/react@18.2.75)(eslint@8.55.0)(prettier@3.2.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5)(stylelint@14.16.1)(typescript@4.9.5)(webpack@5.91.0) - unified: 10.1.2 - unist-util-visit: 4.1.2 - unist-util-visit-parents: 5.1.3 - url: 0.11.3 - v8-compile-cache: 2.3.0 - vfile: 5.3.7 - transitivePeerDependencies: - - '@babel/core' - - '@swc/helpers' - - '@types/node' - - '@types/react' - - '@types/webpack' - - '@volar/vue-language-plugin-pug' - - '@volar/vue-typescript' - - eslint - - jest - - lightningcss - - postcss-html - - postcss-jsx - - postcss-less - - postcss-markdown - - postcss-scss - - prettier - - rollup - - sockjs-client - - stylelint - - stylus - - sugarss - - supports-color - - terser - - type-fest - - typescript - - webpack - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - dev: true - /duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: @@ -18651,6 +17335,7 @@ packages: /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: false /duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} @@ -18659,6 +17344,7 @@ packages: inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.1 + dev: false /duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} @@ -18697,14 +17383,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /editions@2.3.1: - resolution: {integrity: sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==} - engines: {node: '>=0.8'} - dependencies: - errlop: 2.2.0 - semver: 6.3.1 - dev: true - /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -18774,8 +17452,11 @@ packages: /encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true dependencies: iconv-lite: 0.6.3 + dev: false + optional: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -18796,14 +17477,6 @@ packages: tapable: 1.1.3 dev: false - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /enhanced-resolve@5.16.0: resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} @@ -18840,21 +17513,12 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - /err-code@1.1.2: - resolution: {integrity: sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==} - dev: true - /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} requiresBuild: true dev: false optional: true - /errlop@2.2.0: - resolution: {integrity: sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==} - engines: {node: '>=0.8'} - dev: true - /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -18967,10 +17631,6 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - /es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -19072,16 +17732,6 @@ packages: es6-symbol: 3.1.3 dev: false - /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: true - - /es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - dependencies: - es6-promise: 4.2.8 - dev: true - /es6-symbol@3.1.3: resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} dependencies: @@ -19281,11 +17931,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: true - /escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -19406,27 +18051,6 @@ packages: requireindex: 1.2.0 dev: true - /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.55.0)(typescript@4.9.5): - resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.55.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.55.0)(typescript@4.9.5) - eslint: 8.55.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.55.0)(typescript@5.4.4): resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -19684,31 +18308,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} - dependencies: - '@types/estree': 1.0.5 - dev: true - - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - dev: true - - /estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} - dependencies: - '@types/estree-jsx': 1.0.3 - astring: 1.8.6 - source-map: 0.7.4 - dev: true - - /estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/unist': 2.0.10 - dev: true - /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true @@ -19736,6 +18335,7 @@ packages: /eventemitter3@2.0.3: resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} + dev: false /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -19782,6 +18382,7 @@ packages: p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 + dev: false /execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} @@ -19876,13 +18477,6 @@ packages: - supports-color dev: false - /expand-tilde@1.2.2: - resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} - engines: {node: '>=0.10.0'} - dependencies: - os-homedir: 1.0.2 - dev: true - /expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} @@ -20052,12 +18646,6 @@ packages: dependencies: reusify: 1.0.4 - /fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - dependencies: - format: 0.2.2 - dev: true - /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: @@ -20102,11 +18690,6 @@ packages: dependencies: flat-cache: 3.2.0 - /file-name@0.1.0: - resolution: {integrity: sha512-Q8SskhjF4eUk/xoQkmubwLkoHwOTv6Jj/WGtOVLKkZ0vvM+LipkSXugkn1F/+mjWXU32AXLZB3qaz0arUzgtRw==} - engines: {node: '>=0.10.0'} - dev: true - /file-saver@2.0.5: resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} @@ -20116,15 +18699,6 @@ packages: moment: 2.29.4 dev: false - /file-system-cache@2.4.4: - resolution: {integrity: sha512-vCYhn8pb5nlC3Gs2FFCOkmf4NEg2Ym3ulJwkmS9o6p9oRShGj6CwTMFvpgZihBlsh373NaM0XgAgDHXQIlS4LQ==} - dependencies: - '@types/fs-extra': 11.0.1 - '@types/ramda': 0.29.3 - fs-extra: 11.1.1 - ramda: 0.29.0 - dev: true - /file-type@3.9.0: resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} engines: {node: '>=0.10.0'} @@ -20143,11 +18717,6 @@ packages: dev: false optional: true - /filesize@3.6.1: - resolution: {integrity: sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==} - engines: {node: '>= 0.4.0'} - dev: true - /fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} @@ -20168,25 +18737,10 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} - /find-file-up@0.1.3: - resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} - engines: {node: '>=0.10.0'} - dependencies: - fs-exists-sync: 0.1.0 - resolve-dir: 0.1.1 - dev: true - /find-package-json@1.2.0: resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==} dev: false - /find-pkg@0.1.2: - resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} - engines: {node: '>=0.10.0'} - dependencies: - find-file-up: 0.1.3 - dev: true - /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -20303,6 +18857,7 @@ packages: dependencies: inherits: 2.0.4 readable-stream: 2.3.8 + dev: false /fmin@0.0.2: resolution: {integrity: sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A==} @@ -20328,15 +18883,6 @@ packages: dependencies: debug: 4.3.4(supports-color@5.5.0) - /follow-redirects@1.5.10: - resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==} - engines: {node: '>=4.0'} - dependencies: - debug: 3.1.0 - transitivePeerDependencies: - - supports-color - dev: true - /fontkit@2.0.2: resolution: {integrity: sha512-jc4k5Yr8iov8QfS6u8w2CnHWVmbOGtdBtOXMze5Y+QD966Rx6PEVWXSEGwXlsDlKtu1G12cJjcsybnqhSk/+LA==} dependencies: @@ -20380,29 +18926,6 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /fork-ts-checker-webpack-plugin@8.0.0(typescript@4.9.5)(webpack@5.91.0): - resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.11.0 - dependencies: - '@babel/code-frame': 7.24.2 - chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 7.1.0 - deepmerge: 4.3.1 - fs-extra: 10.1.0 - memfs: 3.5.3 - minimatch: 3.1.2 - node-abort-controller: 3.1.1 - schema-utils: 3.3.0 - semver: 7.6.0 - tapable: 2.2.1 - typescript: 4.9.5 - webpack: 5.91.0 - dev: true - /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.4.4)(webpack@5.91.0): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} @@ -20474,11 +18997,6 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: true - /formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -20521,21 +19039,9 @@ packages: engines: {node: '>= 0.6'} dev: false - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - /fs-exists-sync@0.1.0: - resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} - engines: {node: '>=0.10.0'} - dev: true - /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -20544,15 +19050,6 @@ packages: jsonfile: 6.1.0 universalify: 2.0.1 - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - /fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -20561,14 +19058,6 @@ packages: jsonfile: 6.1.0 universalify: 2.0.1 - /fs-extra@3.0.1: - resolution: {integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 3.0.1 - universalify: 0.1.2 - dev: true - /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -20603,15 +19092,6 @@ packages: /fs-monkey@1.0.5: resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - /fs-write-stream-atomic@1.0.10: - resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} - dependencies: - graceful-fs: 4.2.11 - iferr: 0.1.5 - imurmurhash: 0.1.4 - readable-stream: 2.3.8 - dev: true - /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -20706,10 +19186,6 @@ packages: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} - /genfun@4.0.1: - resolution: {integrity: sha512-48yv1eDS5Qrz6cbSDBBik0u7jCgC/eA9eZrl9MIN1LfKzFTuGt6EHgr31YM8yT9cjb5BplXb4Iz3VtOYmgt8Jg==} - dev: true - /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -20777,6 +19253,7 @@ packages: /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} + dev: false /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} @@ -20834,6 +19311,7 @@ packages: /get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} + dev: false /getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} @@ -20841,20 +19319,6 @@ packages: assert-plus: 1.0.0 dev: true - /git-branch@1.0.0: - resolution: {integrity: sha512-ZTzuqw5Df8fyLXQWrX6hK+4FpNCdKzMcERlxENEGO5aKcLmG7MAszhrMhluUKNKmOS/JAGijDMQDXDCDw1mE/A==} - engines: {node: '>=0.8'} - dev: true - - /git-config-path@1.0.1: - resolution: {integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - homedir-polyfill: 1.0.3 - dev: true - /git-hooks-list@3.1.0: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} @@ -20881,31 +19345,10 @@ packages: through2: 4.0.2 dev: true - /git-repo-name@0.6.0: - resolution: {integrity: sha512-DF4XxB6H+Te79JA08/QF/IjIv+j+0gF990WlgAX3SXXU2irfqvBc/xxlAIh6eJWYaKz45MrrGVBFS0Qc4bBz5g==} - engines: {node: '>=0.8'} - dependencies: - cwd: 0.9.1 - file-name: 0.1.0 - lazy-cache: 1.0.4 - remote-origin-url: 0.5.3 - dev: true - /git-sha1@0.1.2: resolution: {integrity: sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==} dev: false - /git-username@0.5.1: - resolution: {integrity: sha512-xjUjrj3i4kup2A3a/ZVZB1Nt0PUX7SU7KeVqIbXPdslT7NbNfyO04JMxBv4gar77JePdS+A6f05jG1Viy6+U1w==} - engines: {node: '>=0.8'} - dependencies: - remote-origin-url: 0.4.0 - dev: true - - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: true - /gl-matrix@3.4.3: resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} @@ -21011,14 +19454,6 @@ packages: dependencies: ini: 1.3.8 - /global-modules@0.2.3: - resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} - engines: {node: '>=0.10.0'} - dependencies: - global-prefix: 0.1.5 - is-windows: 0.2.0 - dev: true - /global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} @@ -21034,16 +19469,6 @@ packages: dependencies: global-prefix: 3.0.0 - /global-prefix@0.1.5: - resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} - engines: {node: '>=0.10.0'} - dependencies: - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 0.2.0 - which: 1.3.1 - dev: true - /global-prefix@1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} @@ -21119,25 +19544,6 @@ packages: dependencies: get-intrinsic: 1.2.2 - /got@6.7.1: - resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} - engines: {node: '>=4'} - dependencies: - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - create-error-class: 3.0.2 - duplexer3: 0.1.5 - get-stream: 3.0.0 - is-redirect: 1.0.0 - is-retry-allowed: 1.2.0 - is-stream: 1.1.0 - lowercase-keys: 1.0.1 - safe-buffer: 5.2.1 - timed-out: 4.0.1 - unzip-response: 2.0.1 - url-parse-lax: 1.0.0 - dev: true - /got@9.6.0: resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} engines: {node: '>=8.6'} @@ -21336,6 +19742,7 @@ packages: get-value: 2.0.6 has-values: 0.1.4 isobject: 2.1.0 + dev: false /has-value@1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} @@ -21349,6 +19756,7 @@ packages: /has-values@0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} + dev: false /has-values@1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} @@ -21401,149 +19809,6 @@ packages: dependencies: function-bind: 1.1.2 - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} - dependencies: - '@types/hast': 2.3.8 - '@types/unist': 2.0.10 - hastscript: 7.2.0 - property-information: 6.4.0 - vfile: 5.3.7 - vfile-location: 4.1.0 - web-namespaces: 2.0.1 - dev: true - - /hast-util-has-property@2.0.1: - resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} - dev: true - - /hast-util-heading-rank@2.1.1: - resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==} - dependencies: - '@types/hast': 2.3.8 - dev: true - - /hast-util-is-conditional-comment@2.0.0: - resolution: {integrity: sha512-U66gW8ZWQdxP4ZjTEZ3xZT72y6rIKJqV4At5QmC1ItBbQyZyVkuTp8QkQwhxsbkHdzpifiZdQWrDipc9ByqhRg==} - dependencies: - '@types/hast': 2.3.8 - dev: true - - /hast-util-is-element@2.1.3: - resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} - dependencies: - '@types/hast': 2.3.8 - '@types/unist': 2.0.10 - dev: true - - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} - dependencies: - '@types/hast': 2.3.8 - dev: true - - /hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} - dependencies: - '@types/hast': 2.3.8 - '@types/parse5': 6.0.3 - hast-util-from-parse5: 7.1.2 - hast-util-to-parse5: 7.1.0 - html-void-elements: 2.0.1 - parse5: 6.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: true - - /hast-util-raw@8.0.0: - resolution: {integrity: sha512-bKbaUxMNLjZMMowgcrc4l3aQSPiMLiceZD+mp+AKF8Si0mtyR2DYVdxzS2XBxXYDeW/VvfZy40lNxHRiY6MMTg==} - dependencies: - '@types/hast': 2.3.8 - extend: 3.0.2 - hast-util-from-parse5: 7.1.2 - hast-util-to-parse5: 7.1.0 - html-void-elements: 2.0.1 - mdast-util-to-hast: 12.3.0 - parse5: 7.1.2 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: true - - /hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} - dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 - '@types/unist': 2.0.10 - comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 4.0.4 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /hast-util-to-html@8.0.4: - resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} - dependencies: - '@types/hast': 2.3.8 - '@types/unist': 2.0.10 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-raw: 7.2.3 - hast-util-whitespace: 2.0.1 - html-void-elements: 2.0.1 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 - zwitch: 2.0.4 - dev: true - - /hast-util-to-parse5@7.1.0: - resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} - dependencies: - '@types/hast': 2.3.8 - comma-separated-tokens: 2.0.3 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: true - - /hast-util-to-string@2.0.0: - resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} - dependencies: - '@types/hast': 2.3.8 - dev: true - - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: true - - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} - dependencies: - '@types/hast': 2.3.8 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - dev: true - /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -21552,16 +19817,6 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: false - /heti-findandreplacedomtext@0.5.0: - resolution: {integrity: sha512-GFZjqU8LAdu1uR72GqrReI+lzNLMlcWtvdz1TKNJiofyo1mfTecFYSZEoEbcLcRMl+KwEldnNQoS4BwO8wtg0A==} - dev: true - - /heti@0.9.4: - resolution: {integrity: sha512-DI1A/R6VabM8wulXrGVbeHZNZ8jJUm+Pwn+PEYZcNBxAO+4mXWPEX+Xu9R/YrHETGcevNrLO34m/99ZCnFnlhw==} - dependencies: - heti-findandreplacedomtext: 0.5.0 - dev: true - /hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} @@ -21591,6 +19846,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: parse-passwd: 1.0.0 + dev: false /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -21601,13 +19857,6 @@ packages: dependencies: lru-cache: 6.0.0 - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - lru-cache: 7.18.3 - dev: true - /hotkeys-js@3.9.4: resolution: {integrity: sha512-2zuLt85Ta+gIyvs4N88pCYskNrxf1TFv3LR9t5mdAZIX8BcgQQ48F2opUptvHa6m8zsy5v/a0i9mWzTrlNWU0Q==} dev: false @@ -21668,17 +19917,6 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} - /html-to-text@9.0.5: - resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} - engines: {node: '>=14'} - dependencies: - '@selderee/plugin-htmlparser2': 0.11.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.11.0 - dev: true - /html-tokenize@2.0.1: resolution: {integrity: sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==} hasBin: true @@ -21689,10 +19927,6 @@ packages: readable-stream: 1.0.34 through2: 0.4.2 - /html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} - dev: true - /html-webpack-plugin@5.5.0(webpack@5.91.0): resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} @@ -21706,20 +19940,6 @@ packages: tapable: 2.2.1 webpack: 5.91.0 - /html2sketch@1.0.2: - resolution: {integrity: sha512-/P9NcVH9yBhrOkcnaFkAbWJifDO8Ii+CTIxy9gE6trSQvo2OH++TKQIP5MICEoWvgXpVhZ6botj7P63Krl1/gg==} - engines: {node: '>=14.0.0'} - dependencies: - '@sketch-hq/sketch-file-format-ts': 6.5.0 - color: 3.2.1 - css: 3.0.0 - svg-pathdata: 5.0.5 - svgo-browser: 1.3.8 - svgson: 4.1.0 - transformation-matrix: 2.15.0 - uuid: 8.3.2 - dev: true - /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} dependencies: @@ -21735,6 +19955,7 @@ packages: domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 + dev: false /http-assert@1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} @@ -21744,10 +19965,6 @@ packages: http-errors: 1.8.1 dev: false - /http-cache-semantics@3.8.1: - resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} - dev: true - /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false @@ -21785,16 +20002,6 @@ packages: toidentifier: 1.0.1 dev: false - /http-proxy-agent@2.1.0: - resolution: {integrity: sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==} - engines: {node: '>= 4.5.0'} - dependencies: - agent-base: 4.3.0 - debug: 3.1.0 - transitivePeerDependencies: - - supports-color - dev: true - /http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} @@ -21827,16 +20034,6 @@ packages: /https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - /https-proxy-agent@2.2.4: - resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} - engines: {node: '>= 4.5.0'} - dependencies: - agent-base: 4.3.0 - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - dev: true - /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -21890,10 +20087,6 @@ packages: dependencies: ms: 2.1.3 - /humps@2.0.1: - resolution: {integrity: sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g==} - dev: true - /husky@9.0.11: resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} engines: {node: '>=18'} @@ -21947,10 +20140,6 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /iferr@0.1.5: - resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} - dev: true - /ignore@5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} @@ -21966,21 +20155,10 @@ packages: requiresBuild: true optional: true - /image-size@0.8.3: - resolution: {integrity: sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==} - engines: {node: '>=6.9.0'} - hasBin: true - dependencies: - queue: 6.0.1 - dev: true - /immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} dev: true - /immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} - /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -22000,6 +20178,7 @@ packages: /import-lazy@2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} engines: {node: '>=4'} + dev: false /import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} @@ -22057,10 +20236,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: false - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: true - /inquirer@6.5.2: resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} engines: {node: '>=6.0.0'} @@ -22129,15 +20304,6 @@ packages: /intersection-observer@0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - /intl-messageformat@10.5.8: - resolution: {integrity: sha512-NRf0jpBWV0vd671G5b06wNofAN8tp7WWDogMZyaU8GUAsmbouyvgwmFJI7zLjfAMpm3zK+vSwRP3jzaoIcMbaA==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.3 - tslib: 2.6.2 - dev: true - /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: @@ -22174,10 +20340,6 @@ packages: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} dev: false - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: true - /is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} dependencies: @@ -22185,13 +20347,6 @@ packages: is-decimal: 1.0.4 dev: false - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - dev: true - /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -22274,13 +20429,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - /is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true - dependencies: - ci-info: 1.6.0 - dev: true - /is-ci@2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true @@ -22320,10 +20468,6 @@ packages: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} dev: false - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: true - /is-descriptor@0.1.7: resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} engines: {node: '>= 0.4'} @@ -22440,10 +20584,6 @@ packages: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} dev: false - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: true - /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -22457,6 +20597,7 @@ packages: dependencies: global-dirs: 0.1.1 is-path-inside: 1.0.1 + dev: false /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} @@ -22496,11 +20637,6 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - /is-npm@1.0.0: - resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} - engines: {node: '>=0.10.0'} - dev: true - /is-npm@3.0.0: resolution: {integrity: sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==} engines: {node: '>=8'} @@ -22531,6 +20667,7 @@ packages: /is-obj@1.0.1: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} + dev: false /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} @@ -22542,6 +20679,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: path-is-inside: 1.0.2 + dev: false /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} @@ -22565,6 +20703,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 + dev: false /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} @@ -22576,11 +20715,6 @@ packages: /is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - /is-redirect@1.0.0: - resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} - engines: {node: '>=0.10.0'} - dev: true - /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: @@ -22601,11 +20735,6 @@ packages: is-unc-path: 1.0.0 dev: false - /is-retry-allowed@1.2.0: - resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} - engines: {node: '>=0.10.0'} - dev: true - /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} @@ -22738,20 +20867,10 @@ packages: /is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - /is-windows@0.2.0: - resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} - engines: {node: '>=0.10.0'} - dev: true - /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - /is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - dev: true - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -22784,10 +20903,12 @@ packages: engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 + dev: false /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + dev: false /isomorphic-unfetch@4.0.2: resolution: {integrity: sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA==} @@ -22815,15 +20936,6 @@ packages: transitivePeerDependencies: - supports-color - /istextorbinary@2.6.0: - resolution: {integrity: sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==} - engines: {node: '>=0.12'} - dependencies: - binaryextensions: 2.3.0 - editions: 2.3.1 - textextensions: 2.6.0 - dev: true - /iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: @@ -23040,10 +21152,6 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -23094,12 +21202,6 @@ packages: /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - /jsonfile@3.0.1: - resolution: {integrity: sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -23331,13 +21433,6 @@ packages: es6-weak-map: 2.0.3 dev: false - /latest-version@3.1.0: - resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} - engines: {node: '>=4'} - dependencies: - package-json: 4.0.1 - dev: true - /latest-version@5.1.0: resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} engines: {node: '>=8'} @@ -23375,10 +21470,6 @@ packages: invert-kv: 1.0.0 dev: false - /leac@0.6.0: - resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} - dev: true - /lead@1.0.0: resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} engines: {node: '>= 0.10'} @@ -23768,10 +21859,6 @@ packages: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: true - /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -23791,13 +21878,6 @@ packages: engines: {node: '>=0.8.6'} dev: false - /log-symbols@2.2.0: - resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} - engines: {node: '>=4'} - dependencies: - chalk: 2.4.2 - dev: true - /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -23836,10 +21916,6 @@ packages: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: true - /longest@1.0.1: resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==} engines: {node: '>=0.10.0'} @@ -23863,6 +21939,7 @@ packages: /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} + dev: false /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} @@ -23958,24 +22035,6 @@ packages: resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} dev: true - /make-fetch-happen@2.6.0: - resolution: {integrity: sha512-FFq0lNI0ax+n9IWzWpH8A4JdgYiAp2DDYIZ3rsaav8JDe8I+72CzK6PQW/oom15YDZpV5bYW/9INd6nIJ2ZfZw==} - dependencies: - agentkeepalive: 3.5.2 - cacache: 10.0.4 - http-cache-semantics: 3.8.1 - http-proxy-agent: 2.1.0 - https-proxy-agent: 2.2.4 - lru-cache: 4.1.5 - mississippi: 1.3.1 - node-fetch-npm: 2.0.4 - promise-retry: 1.1.1 - socks-proxy-agent: 3.0.1 - ssri: 5.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /make-fetch-happen@9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} @@ -24073,10 +22132,6 @@ packages: uc.micro: 1.0.6 dev: false - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: true - /matchdep@2.0.0: resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==} engines: {node: '>= 0.10.0'} @@ -24114,37 +22169,6 @@ packages: inherits: 2.0.4 safe-buffer: 5.2.1 - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - unist-util-visit: 4.1.2 - dev: true - - /mdast-util-directive@2.2.4: - resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.3 - unist-util-visit-parents: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - dependencies: - '@types/mdast': 3.0.15 - escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: true - /mdast-util-from-markdown@0.8.5: resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} dependencies: @@ -24157,163 +22181,13 @@ packages: - supports-color dev: false - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-frontmatter@1.0.1: - resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-extension-frontmatter: 1.1.1 - dev: true - - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} - dependencies: - '@types/mdast': 3.0.15 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 - dev: true - - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 - dev: true - - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - dev: true - - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} - dependencies: - '@types/mdast': 3.0.15 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - dev: true - - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - dependencies: - '@types/mdast': 3.0.15 - unist-util-is: 5.2.1 - dev: true - - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - dependencies: - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 - trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - dev: true - - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - dev: true - /mdast-util-to-string@2.0.0: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} dev: false - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - dependencies: - '@types/mdast': 3.0.15 - dev: true - /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - /mdn-data@2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - dev: true - /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: false @@ -24453,250 +22327,6 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-extension-directive@2.2.1: - resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - parse-entities: 4.0.1 - uvu: 0.5.6 - dev: true - - /micromark-extension-frontmatter@1.1.1: - resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==} - dependencies: - fault: 2.0.1 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} - dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} - dependencies: - micromark-util-types: 1.1.0 - dev: true - - /micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - dev: true - - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - dev: true - - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - dependencies: - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - dev: true - - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - dev: true - /micromark@2.11.4: resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} dependencies: @@ -24706,30 +22336,6 @@ packages: - supports-color dev: false - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@5.5.0) - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - /micromatch@3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} @@ -24805,12 +22411,6 @@ packages: engines: {node: '>=4.0.0'} hasBin: true - /mimer@1.1.0: - resolution: {integrity: sha512-y9dVfy2uiycQvDNiAYW6zp49ZhFlXDMr5wfdOiMbdzGM/0N5LNR6HTUn3un+WUQcM0koaw8FMTG1bt5EnHJdvQ==} - engines: {node: '>= 6.0'} - hasBin: true - dev: true - /mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} @@ -24961,37 +22561,6 @@ packages: minipass: 3.3.6 yallist: 4.0.0 - /mississippi@1.3.1: - resolution: {integrity: sha512-/6rB8YXFbAtsUVRphIRQqB0+9c7VaPHCjVtvto+JqwVxgz8Zz+I+f68/JgQ+Pb4VlZb2svA9OtdXnHHsZz7ltg==} - dependencies: - concat-stream: 1.6.2 - duplexify: 3.7.1 - end-of-stream: 1.4.4 - flush-write-stream: 1.1.1 - from2: 2.3.0 - parallel-transform: 1.2.0 - pump: 1.0.3 - pumpify: 1.5.1 - stream-each: 1.2.3 - through2: 2.0.5 - dev: true - - /mississippi@2.0.0: - resolution: {integrity: sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==} - engines: {node: '>=4.0.0'} - dependencies: - concat-stream: 1.6.2 - duplexify: 3.7.1 - end-of-stream: 1.4.4 - flush-write-stream: 1.1.1 - from2: 2.3.0 - parallel-transform: 1.2.0 - pump: 2.0.1 - pumpify: 1.5.1 - stream-each: 1.2.3 - through2: 2.0.5 - dev: true - /mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} dev: false @@ -25065,17 +22634,6 @@ packages: /moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} - /move-concurrently@1.0.1: - resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} - dependencies: - aproba: 1.2.0 - copy-concurrently: 1.0.5 - fs-write-stream-atomic: 1.0.10 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - dev: true - /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -25206,10 +22764,6 @@ packages: resolution: {integrity: sha512-JyK96AKVGAwVeMj3MoMhaSXaUNqgMbCRSQB3trUV8tYZfWEzqUBKdK1qJpfuNXgKeHOx1jv/IEYTM659ly7zUA==} dev: true - /nanoid@2.1.11: - resolution: {integrity: sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==} - dev: true - /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -25326,16 +22880,6 @@ packages: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} - /node-fetch-npm@2.0.4: - resolution: {integrity: sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==} - engines: {node: '>=4'} - deprecated: This module is not used anymore, npm uses minipass-fetch for its fetch implementation now - dependencies: - encoding: 0.1.13 - json-parse-better-errors: 1.0.2 - safe-buffer: 5.2.1 - dev: true - /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -25504,27 +23048,12 @@ packages: once: 1.4.0 dev: false - /npm-package-arg@5.1.2: - resolution: {integrity: sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA==} - dependencies: - hosted-git-info: 2.8.9 - osenv: 0.1.5 - semver: 5.7.2 - validate-npm-package-name: 3.0.0 - dev: true - - /npm-pick-manifest@1.0.4: - resolution: {integrity: sha512-MKxNdeyOZysPRTTbHtW0M5Fw38Jo/3ARsoGw5qjCfS+XGjvNB/Gb4qtAZUFmKPM2mVum+eX559eHvKywU856BQ==} - dependencies: - npm-package-arg: 5.1.2 - semver: 5.7.2 - dev: true - /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 + dev: false /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} @@ -25558,10 +23087,6 @@ packages: dev: false optional: true - /nprogress@0.2.0: - resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} - dev: true - /nssocket@0.6.0: resolution: {integrity: sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==} engines: {node: '>= 0.10.x'} @@ -25570,12 +23095,6 @@ packages: lazy: 1.0.11 dev: false - /nth-check@1.0.2: - resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} - dependencies: - boolbase: 1.0.0 - dev: true - /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: @@ -25686,17 +23205,6 @@ packages: es-abstract: 1.23.3 es-object-atoms: 1.0.0 - /object.getownpropertydescriptors@2.1.7: - resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} - engines: {node: '>= 0.8'} - dependencies: - array.prototype.reduce: 1.0.6 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - safe-array-concat: 1.0.1 - dev: true - /object.getprototypeof@1.0.6: resolution: {integrity: sha512-gUiHHFVGLDayJsXfudx6KQEA6iMhPnsmAqL0vdBXhtKzTupcgNTGDJfW1a8xw81jjyWN07IRsVsCKyTn9wiJvQ==} engines: {node: '>= 0.4'} @@ -25771,14 +23279,6 @@ packages: engines: {node: ^10.13.0 || >=12.0.0} dev: true - /omit-deep@0.3.0: - resolution: {integrity: sha512-Lbl/Ma59sss2b15DpnWnGmECBRL8cRl/PjPbPMVW+Y8zIQzRrwMaI65Oy6HvxyhYeILVKBJb2LWeG81bj5zbMg==} - engines: {node: '>=0.10.0'} - dependencies: - is-plain-object: 2.0.4 - unset-value: 0.1.2 - dev: true - /omit.js@2.0.2: resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} @@ -25830,13 +23330,6 @@ packages: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} dev: false - /open@6.4.0: - resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} - engines: {node: '>=8'} - dependencies: - is-wsl: 1.1.0 - dev: true - /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -25874,16 +23367,6 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /ora@1.4.0: - resolution: {integrity: sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==} - engines: {node: '>=4'} - dependencies: - chalk: 2.4.2 - cli-cursor: 2.1.0 - cli-spinners: 1.3.1 - log-symbols: 2.2.0 - dev: true - /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -25908,11 +23391,6 @@ packages: /os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - /os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - dev: true - /os-locale@1.4.0: resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} engines: {node: '>=0.10.0'} @@ -25934,13 +23412,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /osenv@0.1.5: - resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} - dependencies: - os-homedir: 1.0.2 - os-tmpdir: 1.0.2 - dev: true - /osx-release@1.1.0: resolution: {integrity: sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==} engines: {node: '>=0.10.0'} @@ -25979,6 +23450,7 @@ packages: /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} + dev: false /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -26057,16 +23529,6 @@ packages: netmask: 2.0.2 dev: false - /package-json@4.0.1: - resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} - engines: {node: '>=4'} - dependencies: - got: 6.7.1 - registry-auth-token: 3.4.0 - registry-url: 3.1.0 - semver: 5.7.2 - dev: true - /package-json@6.5.0: resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} engines: {node: '>=8'} @@ -26080,48 +23542,12 @@ packages: /packet-reader@1.0.0: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} - /pacote@2.7.38: - resolution: {integrity: sha512-XxHUyHQB7QCVBxoXeVu0yKxT+2PvJucsc0+1E+6f95lMUxEAYERgSAc71ckYXrYr35Ew3xFU/LrhdIK21GQFFA==} - dependencies: - bluebird: 3.7.2 - cacache: 9.3.0 - glob: 7.2.3 - lru-cache: 4.1.5 - make-fetch-happen: 2.6.0 - minimatch: 3.1.2 - mississippi: 1.3.1 - normalize-package-data: 2.5.0 - npm-package-arg: 5.1.2 - npm-pick-manifest: 1.0.4 - osenv: 0.1.5 - promise-inflight: 1.0.1(bluebird@3.7.2) - promise-retry: 1.1.1 - protoduck: 4.0.0 - safe-buffer: 5.2.1 - semver: 5.7.2 - ssri: 4.1.6 - tar-fs: 1.16.3 - tar-stream: 1.6.2 - unique-filename: 1.1.1 - which: 1.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - /parallel-transform@1.2.0: - resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} - dependencies: - cyclist: 1.0.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: @@ -26160,19 +23586,6 @@ packages: is-hexadecimal: 1.0.4 dev: false - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - dependencies: - '@types/unist': 2.0.10 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - dev: true - /parse-filepath@1.0.2: resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} engines: {node: '>=0.8'} @@ -26182,23 +23595,6 @@ packages: path-root: 0.1.1 dev: false - /parse-git-config@0.2.0: - resolution: {integrity: sha512-amapZFADOJtHvX2URcRfbzG2OFcW+UAwmdK2kht2N2vsH5Py65VxI5yZTlD2DjmxVhTz6htFoVCxROYUJaYOXQ==} - engines: {node: '>=0.10.0'} - dependencies: - ini: 1.3.8 - dev: true - - /parse-git-config@1.1.1: - resolution: {integrity: sha512-S3LGXJZVSy/hswvbSkfdbKBRVsnqKrVu6j8fcvdtJ4TxosSELyQDsJPuGPXuZ+EyuYuJd3O4uAF8gcISR0OFrQ==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - git-config-path: 1.0.1 - ini: 1.3.8 - dev: true - /parse-github-url@1.0.2: resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} engines: {node: '>=0.10.0'} @@ -26233,6 +23629,7 @@ packages: /parse-passwd@1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} + dev: false /parse-srcset@1.0.2: resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} @@ -26245,19 +23642,6 @@ packages: /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - - /parseley@0.12.1: - resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} - dependencies: - leac: 0.6.0 - peberminta: 0.9.0 - dev: true - /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -26308,10 +23692,12 @@ packages: /path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + dev: false /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} + dev: false /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -26426,10 +23812,6 @@ packages: - supports-color dev: true - /peberminta@0.9.0: - resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} - dev: true - /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -26638,11 +24020,6 @@ packages: extend-shallow: 3.0.2 dev: false - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true - /pm2-axon-rpc@0.7.1: resolution: {integrity: sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==} engines: {node: '>=5'} @@ -27226,11 +24603,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /prepend-http@1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - dev: true - /prepend-http@2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} @@ -27243,23 +24615,6 @@ packages: fast-diff: 1.3.0 dev: false - /prettier-plugin-organize-imports@3.2.4(prettier@3.2.5)(typescript@4.9.5): - resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} - peerDependencies: - '@volar/vue-language-plugin-pug': ^1.0.4 - '@volar/vue-typescript': ^1.0.4 - prettier: '>=2.0' - typescript: '>=2.9' - peerDependenciesMeta: - '@volar/vue-language-plugin-pug': - optional: true - '@volar/vue-typescript': - optional: true - dependencies: - prettier: 3.2.5 - typescript: 4.9.5 - dev: true - /prettier-plugin-organize-imports@3.2.4(prettier@3.2.5)(typescript@5.4.4): resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} peerDependencies: @@ -27421,23 +24776,6 @@ packages: hasBin: true dev: true - /prism-react-renderer@1.3.5(react@18.2.0): - resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} - peerDependencies: - react: '>=0.14.9' - dependencies: - react: 18.2.0 - dev: true - - /prism-themes@1.9.0: - resolution: {integrity: sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw==} - dev: true - - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - dev: true - /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -27453,23 +24791,16 @@ packages: engines: {node: '>=18'} dev: false - /promise-inflight@1.0.1(bluebird@3.7.2): + /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + requiresBuild: true peerDependencies: bluebird: '*' peerDependenciesMeta: bluebird: optional: true - dependencies: - bluebird: 3.7.2 - - /promise-retry@1.1.1: - resolution: {integrity: sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw==} - engines: {node: '>=0.12'} - dependencies: - err-code: 1.1.2 - retry: 0.10.1 - dev: true + dev: false + optional: true /promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} @@ -27494,20 +24825,10 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 - /property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} - dev: true - /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: false - /protoduck@4.0.0: - resolution: {integrity: sha512-9sxuz0YTU/68O98xuDn8NBxTVH9EuMhrBTxZdiBL0/qxRmWhB/5a8MagAebDa+98vluAZTs8kMZibCdezbRCeQ==} - dependencies: - genfun: 4.0.1 - dev: true - /proxy-agent@6.3.1: resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} engines: {node: '>= 14'} @@ -27547,18 +24868,12 @@ packages: randombytes: 2.1.0 safe-buffer: 5.2.1 - /pump@1.0.3: - resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - /pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 + dev: false /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -27572,6 +24887,7 @@ packages: duplexify: 3.7.1 inherits: 2.0.4 pump: 2.0.1 + dev: false /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -27637,12 +24953,6 @@ packages: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} dev: true - /queue@6.0.1: - resolution: {integrity: sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==} - dependencies: - inherits: 2.0.4 - dev: true - /queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} dependencies: @@ -27686,10 +24996,6 @@ packages: /railroad-diagrams@1.0.0: resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} - /ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} - dev: true - /randexp@0.4.6: resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} engines: {node: '>=0.12'} @@ -27723,17 +25029,6 @@ packages: unpipe: 1.0.0 dev: false - /raw-loader@4.0.2(webpack@5.91.0): - resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.91.0 - dev: true - /rbush@3.0.1: resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} dependencies: @@ -27809,21 +25104,6 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /rc-drawer@6.5.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.24.1 - '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) - classnames: 2.5.1 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /rc-drawer@7.1.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-nBE1rF5iZvpavoyqhSSz2mk/yANltA7g3aF0U45xkx381n3we/RKs9cJfNKp9mSWCedOKWt9FLEwZDaAaOGn2w==} peerDependencies: @@ -27838,20 +25118,6 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /rc-dropdown@4.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==} - peerDependencies: - react: '>=16.11.0' - react-dom: '>=16.11.0' - dependencies: - '@babel/runtime': 7.24.4 - '@rc-component/trigger': 1.18.3(react-dom@18.2.0)(react@18.2.0) - classnames: 2.5.1 - rc-util: 5.38.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /rc-dropdown@4.2.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==} peerDependencies: @@ -27949,22 +25215,6 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /rc-menu@9.12.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-t2NcvPLV1mFJzw4F21ojOoRVofK2rWhpKPx69q2raUsiHPDP6DDevsBILEYdsIegqBeSXoWs2bf6CueBKg3BFg==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.24.4 - '@rc-component/trigger': 1.18.3(react-dom@18.2.0)(react@18.2.0) - classnames: 2.5.1 - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.38.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /rc-menu@9.13.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1l8ooCB3HcYJKCltC/s7OxRKRjgymdl9htrCeGZcXNaMct0RxZRK6OPV3lPhVksIvAGMgzPd54ClpZ5J4b8cZA==} peerDependencies: @@ -28219,24 +25469,6 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /rc-tabs@12.15.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-aXFLRo7jo531Jed1LgRqrF0VmRnzM/Qki25PknM3S04gqyxpDaHNFpPba05pHhn+d1N+54qIi0IcY1odrCrF2A==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - dependencies: - '@babel/runtime': 7.24.4 - classnames: 2.5.1 - rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.12.4(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) - rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /rc-tabs@14.1.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-5nOr9PVpJy2SWHTLgv1+kESDOb0tFzl0cYU9r9d8LfL0Wg9i/n1B558rmkxdQHgBwMqxmwoyPSAbQROxMQe8nw==} engines: {node: '>=8.x'} @@ -28354,6 +25586,7 @@ packages: rc-virtual-list: 3.11.3(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /rc-tree@5.8.5(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-PRfcZtVDNkR7oh26RuNe1hpw11c1wfgzwmPFL0lnxGnYefe9lDAO6cg5wJKIAwyXFVt5zHgpjYmaz0CPy1ZtKg==} @@ -28433,6 +25666,7 @@ packages: rc-util: 5.38.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false /rc-virtual-list@3.11.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-NbBi0fvyIu26gP69nQBiWgUMTPX3mr4FcuBQiVqagU0BnuX8WQkiivnMs105JROeuUIFczLrlgUhLQwTWV1XDA==} @@ -28456,6 +25690,7 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 + dev: false /react-beautiful-dnd@13.1.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==} @@ -28511,16 +25746,6 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /react-copy-to-clipboard@5.1.0(react@18.2.0): - resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} - peerDependencies: - react: ^15.3.0 || 16 || 17 || 18 - dependencies: - copy-to-clipboard: 3.3.3 - prop-types: 15.8.1 - react: 18.2.0 - dev: true - /react-dom@18.1.0(react@18.1.0): resolution: {integrity: sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==} peerDependencies: @@ -28661,29 +25886,6 @@ packages: react-modal: 3.16.1(react-dom@18.2.0)(react@18.2.0) dev: false - /react-intl@6.5.5(react@18.2.0)(typescript@4.9.5): - resolution: {integrity: sha512-cI5UKvBh4tc1zxLIziHBYGMX3dhYWDEFlvUDVN6NfT2i96zTXz/zH2AmM8+2waqgOhwkFUzd+7kK1G9q7fiC2g==} - peerDependencies: - react: ^16.6.0 || 17 || 18 - typescript: '5' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - '@formatjs/icu-messageformat-parser': 2.7.3 - '@formatjs/intl': 2.9.9(typescript@4.9.5) - '@formatjs/intl-displaynames': 6.6.4 - '@formatjs/intl-listformat': 7.5.3 - '@types/hoist-non-react-statics': 3.3.5 - '@types/react': 18.2.75 - hoist-non-react-statics: 3.3.2 - intl-messageformat: 10.5.8 - react: 18.2.0 - tslib: 2.6.2 - typescript: 4.9.5 - dev: true - /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -28947,25 +26149,6 @@ packages: dependencies: loose-envify: 1.4.0 - /reactflow@11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Q616fElAc5/N37tMwjuRkkgm/VgmnLLTNNCj61z5mvJxae+/VXZQMfot1K6a5LLz9G3SVKqU97PMb9Ga1PRXew==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/background': 11.3.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/controls': 11.2.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/core': 11.10.1(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/minimap': 11.7.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-resizer': 2.2.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-toolbar': 1.3.6(@types/react@18.2.75)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: true - /read-ini-file@4.0.0: resolution: {integrity: sha512-zz4qv/sKETv7nAkATqSJ9YMbKD8NXRPuA8d17VdYCuNYrVstB1S6UAMU6aytf5vRa9MESbZN7jLZdcmrOxz4gg==} engines: {node: '>=14.6'} @@ -29229,13 +26412,6 @@ packages: safe-buffer: 5.2.1 dev: false - /registry-auth-token@3.4.0: - resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 - dev: true - /registry-auth-token@4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} engines: {node: '>=6.0.0'} @@ -29248,6 +26424,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: rc: 1.2.8 + dev: false /registry-url@5.1.0: resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} @@ -29263,103 +26440,10 @@ packages: jsesc: 0.5.0 dev: false - /rehype-autolink-headings@6.1.1: - resolution: {integrity: sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==} - dependencies: - '@types/hast': 2.3.8 - extend: 3.0.2 - hast-util-has-property: 2.0.1 - hast-util-heading-rank: 2.1.1 - hast-util-is-element: 2.1.3 - unified: 10.1.2 - unist-util-visit: 4.1.2 - dev: true - - /rehype-remove-comments@5.0.0: - resolution: {integrity: sha512-sfiVT+u1in19sxo9vv/SDQVbHE2mADScNrpeVsUxBFl14zOMZnfPb6l4hR+lXqe10G13UFVqv5pt8zDbCR4JYQ==} - dependencies: - '@types/hast': 2.3.8 - hast-util-is-conditional-comment: 2.0.0 - unified: 10.1.2 - unist-util-filter: 4.0.1 - dev: true - - /rehype-stringify@9.0.4: - resolution: {integrity: sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==} - dependencies: - '@types/hast': 2.3.8 - hast-util-to-html: 8.0.4 - unified: 10.1.2 - dev: true - /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} - /remark-directive@2.0.1: - resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-directive: 2.2.4 - micromark-extension-directive: 2.2.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /remark-frontmatter@4.0.1: - resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-frontmatter: 1.0.1 - micromark-extension-frontmatter: 1.1.1 - unified: 10.1.2 - dev: true - - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - dependencies: - '@types/hast': 2.3.8 - '@types/mdast': 3.0.15 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 - dev: true - - /remote-origin-url@0.4.0: - resolution: {integrity: sha512-HYhdsT2pNd0LP4Osb0vtQ1iassxIc3Yk1oze7j8dMJFciMkW8e0rdg9E/mOunqtSVHSzvMfwLDIYzPnEDmpk6Q==} - engines: {node: '>= 0.8.0'} - dependencies: - parse-git-config: 0.2.0 - dev: true - - /remote-origin-url@0.5.3: - resolution: {integrity: sha512-crQ7Xk1m/F2IiwBx5oTqk/c0hjoumrEz+a36+ZoVupskQRE/q7pAwHKsTNeiZ31sbSTELvVlVv4h1W0Xo5szKg==} - engines: {node: '>= 0.8.0'} - dependencies: - parse-git-config: 1.1.1 - dev: true - /remove-bom-buffer@3.0.0: resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} engines: {node: '>=0.10.0'} @@ -29381,11 +26465,6 @@ packages: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: false - /rename-keys@1.2.0: - resolution: {integrity: sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg==} - engines: {node: '>= 0.8.0'} - dev: true - /renderkid@3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} dependencies: @@ -29494,14 +26573,6 @@ packages: /resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - /resolve-dir@0.1.1: - resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} - engines: {node: '>=0.10.0'} - dependencies: - expand-tilde: 1.2.2 - global-modules: 0.2.3 - dev: true - /resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} @@ -29604,10 +26675,6 @@ packages: /retry-as-promised@7.0.4: resolution: {integrity: sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==} - /retry@0.10.1: - resolution: {integrity: sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==} - dev: true - /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -29786,12 +26853,6 @@ packages: dependencies: queue-microtask: 1.2.3 - /run-queue@1.0.3: - resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} - dependencies: - aproba: 1.2.0 - dev: true - /run-series@1.1.9: resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} dev: false @@ -29815,13 +26876,6 @@ packages: dependencies: tslib: 2.6.2 - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: true - /safe-array-concat@1.0.1: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} @@ -29894,19 +26948,6 @@ packages: postcss: 8.4.35 dev: false - /sass@1.69.5: - resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - chokidar: 3.6.0 - immutable: 4.3.4 - source-map-js: 1.0.2 - - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: true - /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} @@ -29965,12 +27006,6 @@ packages: dependencies: commander: 2.20.3 - /selderee@0.11.0: - resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} - dependencies: - parseley: 0.12.1 - dev: true - /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -29983,6 +27018,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: semver: 5.7.2 + dev: false /semver-greatest-satisfied-range@1.1.0: resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==} @@ -30225,13 +27261,6 @@ packages: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} dev: false - /shortid@2.2.16: - resolution: {integrity: sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dependencies: - nanoid: 2.1.11 - dev: true - /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -30283,17 +27312,6 @@ packages: dependencies: is-arrayish: 0.3.2 - /sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} - hasBin: true - dependencies: - '@types/node': 20.12.7 - '@types/sax': 1.2.7 - arg: 5.0.2 - sax: 1.3.0 - dev: true - /size-sensor@1.0.2: resolution: {integrity: sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==} dev: false @@ -30335,11 +27353,6 @@ packages: resolution: {integrity: sha512-KyFkIfr8QBlFG3uc3NaljaXdYcsbRy1KrSfc4tsQV8jW68jAktGeOcifu530Vx/5LC+PULHT0Rv8LiI8Gw+c1g==} dev: true - /smart-buffer@1.1.15: - resolution: {integrity: sha512-1+8bxygjTsNfvQe0/0pNBesTOlSHtOeG6b6LYbvsZCCHDKYZ40zcQo6YTnZBWrBSLWOCbrHljLdEmGMYebu7aQ==} - engines: {node: '>= 0.10.15', npm: '>= 1.3.5'} - dev: true - /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -30390,13 +27403,6 @@ packages: - supports-color dev: false - /socks-proxy-agent@3.0.1: - resolution: {integrity: sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==} - dependencies: - agent-base: 4.3.0 - socks: 1.1.10 - dev: true - /socks-proxy-agent@6.2.1: resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} engines: {node: '>= 10'} @@ -30421,15 +27427,6 @@ packages: - supports-color dev: false - /socks@1.1.10: - resolution: {integrity: sha512-ArX4vGPULWjKDKgUnW8YzfI2uXW7kzgkJuB0GnFBA/PfT3exrrOk+7Wk2oeb894Qf20u1PWv9LEgrO0Z82qAzA==} - engines: {node: '>= 0.10.0', npm: '>= 1.3.5'} - deprecated: If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0 - dependencies: - ip: 1.1.8 - smart-buffer: 1.1.15 - dev: true - /socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} @@ -30485,6 +27482,7 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: false /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} @@ -30501,14 +27499,6 @@ packages: urix: 0.1.0 dev: false - /source-map-resolve@0.6.0: - resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - dev: true - /source-map-support@0.3.3: resolution: {integrity: sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg==} dependencies: @@ -30550,10 +27540,6 @@ packages: whatwg-url: 7.1.0 dev: false - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: true - /sparkles@1.0.1: resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} engines: {node: '>= 0.10'} @@ -30689,18 +27675,6 @@ packages: tweetnacl: 0.14.5 dev: true - /ssri@4.1.6: - resolution: {integrity: sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /ssri@5.3.0: - resolution: {integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} @@ -30778,13 +27752,6 @@ packages: readable-stream: 3.6.2 dev: true - /stream-each@1.2.3: - resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} - dependencies: - end-of-stream: 1.4.4 - stream-shift: 1.0.1 - dev: true - /stream-exhaust@1.0.2: resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} dev: false @@ -30810,6 +27777,7 @@ packages: /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: false /stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -30978,13 +27946,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: true - /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} @@ -31044,6 +28005,7 @@ packages: /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} + dev: false /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} @@ -31062,6 +28024,7 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + dev: false /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -31079,12 +28042,6 @@ packages: /style-search@0.1.0: resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - dependencies: - inline-style-parser: 0.1.1 - dev: true - /styled-components@5.3.11(@babel/core@7.22.10)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} engines: {node: '>=10'} @@ -31278,33 +28235,9 @@ packages: resolution: {integrity: sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A==} dev: true - /svg-pathdata@5.0.5: - resolution: {integrity: sha512-TAAvLNSE3fEhyl/Da19JWfMAdhSXTYeviXsLSoDT1UM76ADj5ndwAPX1FKQEgB/gFMPavOy6tOqfalXKUiXrow==} - engines: {node: '>=6.9.5'} - dev: true - /svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - /svgo-browser@1.3.8: - resolution: {integrity: sha512-yOgDNIcewFZN3+jXdWeh/rQzbWJjCq1dTHphLz2r4T4AfTm+nqCxZ5B89v9bjQbFKA/s/k7TUc7J90+pP2HTyw==} - engines: {node: '>=4.0.0'} - hasBin: true - dependencies: - chalk: 2.4.2 - coa: 2.0.2 - css-select: 2.1.0 - css-select-base-adapter: 0.1.1 - css-tree: 1.0.0-alpha.37 - csso: 4.2.0 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - sax: 1.2.4 - stable: 0.1.8 - unquote: 1.1.1 - util.promisify: 1.0.1 - dev: true - /svgo@2.8.0: resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} engines: {node: '>=10.13.0'} @@ -31318,14 +28251,6 @@ packages: picocolors: 1.0.0 stable: 0.1.8 - /svgson@4.1.0: - resolution: {integrity: sha512-DodISxHtdLKUghDYA+PGK4Qq350+CbBAkdvGLkBFSmWd9WKSg4dijgjB1IiRPTmsUCd+a7KYe+ILHtklYgQyzQ==} - dependencies: - deep-rename-keys: 0.2.1 - omit-deep: 0.3.0 - xml-reader: 2.4.3 - dev: true - /swagger-ui-dist@5.10.5: resolution: {integrity: sha512-Uv8E7hV/nXALQKgW86X1i58gl1O6DFg+Uq54sDwhYqucBBxj/47dLNw872TNILNlOTuPA6dRvUMGQdmlpaX8qQ==} dev: true @@ -31417,15 +28342,6 @@ packages: resolve: 1.22.8 string.prototype.trim: 1.2.8 - /tar-fs@1.16.3: - resolution: {integrity: sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==} - dependencies: - chownr: 1.1.4 - mkdirp: 0.5.6 - pump: 1.0.3 - tar-stream: 1.6.2 - dev: true - /tar-fs@3.0.4: resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} dependencies: @@ -31509,6 +28425,7 @@ packages: engines: {node: '>=4'} dependencies: execa: 0.7.0 + dev: false /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} @@ -31568,11 +28485,6 @@ packages: /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - /textextensions@2.6.0: - resolution: {integrity: sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==} - engines: {node: '>=0.8'} - dev: true - /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -31611,6 +28523,7 @@ packages: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 + dev: false /through2@3.0.2: resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} @@ -31632,11 +28545,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} - dev: true - /timers-browserify@2.0.12: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} @@ -31794,10 +28702,6 @@ packages: dependencies: punycode: 2.3.1 - /transformation-matrix@2.15.0: - resolution: {integrity: sha512-HN3kCvvH4ug3Xm/ycOfCFQOOktg5htxlC4Ih1Z7Wb6BMtQho+q+irOdGo10ARRKpqkRBXgBzQFw/AVmR0oIf0g==} - dev: true - /traverse@0.3.9: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: true @@ -31807,10 +28711,6 @@ packages: hasBin: true dev: false - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: true - /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -31820,10 +28720,6 @@ packages: engines: {node: '>= 14.0.0'} dev: false - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: true - /ts-api-utils@1.0.3(typescript@5.4.4): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} @@ -31927,10 +28823,6 @@ packages: yn: 3.1.1 dev: false - /ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} - dev: true - /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: @@ -32005,16 +28897,6 @@ packages: - ts-node dev: false - /tsutils@3.21.0(typescript@4.9.5): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - dev: true - /tsutils@3.21.0(typescript@5.4.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -32242,12 +29124,6 @@ packages: /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - /types-ramda@0.29.6: - resolution: {integrity: sha512-VJoOk1uYNh9ZguGd3eZvqkdhD4hTGtnjRBUx5Zc0U9ftmnCgiWcSj/lsahzKunbiwRje1MxxNkEy1UdcXRCpYw==} - dependencies: - ts-toolbelt: 9.6.0 - dev: true - /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -32346,57 +29222,6 @@ packages: - webpack-plugin-serve dev: false - /umi@4.1.8(@babel/core@7.22.10)(@types/node@20.12.7)(@types/react@18.2.75)(eslint@8.55.0)(prettier@3.2.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5)(stylelint@14.16.1)(typescript@4.9.5)(webpack@5.91.0): - resolution: {integrity: sha512-XQ7SpvU2upXE8DSsfxms963izeagHX431jOi4wpZvBYaOQGVg39MnyUAhyCBqVHJbyfOahDRWDLWMWTQzY8Q7Q==} - engines: {node: '>=14'} - hasBin: true - dependencies: - '@babel/runtime': 7.23.6 - '@umijs/bundler-utils': 4.1.8 - '@umijs/bundler-webpack': 4.1.8(typescript@4.9.5)(webpack@5.91.0) - '@umijs/core': 4.1.8 - '@umijs/lint': 4.1.8(eslint@8.55.0)(stylelint@14.16.1)(typescript@4.9.5) - '@umijs/preset-umi': 4.1.8(@types/node@20.12.7)(@types/react@18.2.75)(sass@1.69.5)(typescript@4.9.5)(webpack@5.91.0) - '@umijs/renderer-react': 4.1.8(react-dom@18.2.0)(react@18.2.0) - '@umijs/server': 4.1.8 - '@umijs/test': 4.1.8(@babel/core@7.22.10) - '@umijs/utils': 4.1.8 - prettier-plugin-organize-imports: 3.2.4(prettier@3.2.5)(typescript@4.9.5) - prettier-plugin-packagejson: 2.4.3(prettier@3.2.5) - transitivePeerDependencies: - - '@babel/core' - - '@types/node' - - '@types/react' - - '@types/webpack' - - '@volar/vue-language-plugin-pug' - - '@volar/vue-typescript' - - eslint - - jest - - lightningcss - - postcss-html - - postcss-jsx - - postcss-less - - postcss-markdown - - postcss-scss - - prettier - - react - - react-dom - - rollup - - sass - - sockjs-client - - stylelint - - stylus - - sugarss - - supports-color - - terser - - type-fest - - typescript - - webpack - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - dev: true - /umi@4.1.8(@babel/core@7.22.10)(@types/node@20.12.7)(@types/react@18.2.75)(eslint@8.55.0)(prettier@3.2.5)(react-dom@18.2.0)(react@18.2.0)(stylelint@14.16.1)(typescript@5.4.5)(webpack@5.91.0): resolution: {integrity: sha512-XQ7SpvU2upXE8DSsfxms963izeagHX431jOi4wpZvBYaOQGVg39MnyUAhyCBqVHJbyfOahDRWDLWMWTQzY8Q7Q==} engines: {node: '>=14'} @@ -32565,18 +29390,6 @@ packages: tiny-inflate: 1.0.3 dev: true - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: true - /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -32589,13 +29402,19 @@ packages: /unique-filename@1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + requiresBuild: true dependencies: unique-slug: 2.0.2 + dev: false + optional: true /unique-slug@2.0.2: resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + requiresBuild: true dependencies: imurmurhash: 0.1.4 + dev: false + optional: true /unique-stream@2.3.1: resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} @@ -32609,6 +29428,7 @@ packages: engines: {node: '>=4'} dependencies: crypto-random-string: 1.0.0 + dev: false /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} @@ -32617,57 +29437,12 @@ packages: crypto-random-string: 2.0.0 dev: false - /unist-util-filter@4.0.1: - resolution: {integrity: sha512-RynicUM/vbOSTSiUK+BnaK9XMfmQUh6gyi7L6taNgc7FIf84GukXVV3ucGzEN/PhUUkdP5hb1MmXc+3cvPUm5Q==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: true - - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: true - - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.10 - dev: true - - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - dependencies: - '@types/unist': 2.0.10 - dev: true - /unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: '@types/unist': 2.0.10 dev: false - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.10 - dev: true - - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - dev: true - - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: true - /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -32685,18 +29460,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /unquote@1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} - dev: true - - /unset-value@0.1.2: - resolution: {integrity: sha512-yhv5I4TsldLdE3UcVQn0hD2T5sNCPv4+qm/CTUpRKIpwthYRIipsAPdsrNpOI79hPQa0rTTeW22Fq6JWRcTgNg==} - engines: {node: '>=0.10.0'} - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - dev: true - /unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} @@ -32709,11 +29472,6 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - /unzip-response@2.0.1: - resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} - engines: {node: '>=4'} - dev: true - /unzipper@0.10.14: resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} dependencies: @@ -32761,22 +29519,6 @@ packages: registry-url: 3.1.0 dev: false - /update-notifier@2.5.0: - resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} - engines: {node: '>=4'} - dependencies: - boxen: 1.3.0 - chalk: 2.4.2 - configstore: 3.1.5 - import-lazy: 2.1.0 - is-ci: 1.2.1 - is-installed-globally: 0.1.0 - is-npm: 1.0.0 - latest-version: 3.1.0 - semver-diff: 2.1.0 - xdg-basedir: 3.0.0 - dev: true - /update-notifier@3.0.0: resolution: {integrity: sha512-6Xe3oF2bvuoj4YECUc52yxVs94yWrxwqHbzyveDktTS1WhnlTRpNcQMxUshcB7nRVGi1jEXiqL5cW1S5WSyzKg==} engines: {node: '>=8'} @@ -32810,13 +29552,6 @@ packages: deprecated: Please see https://github.com/lydell/urix#deprecated dev: false - /url-parse-lax@1.0.0: - resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} - engines: {node: '>=0.10.0'} - dependencies: - prepend-http: 1.0.4 - dev: true - /url-parse-lax@3.0.0: resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} engines: {node: '>=4'} @@ -32863,14 +29598,6 @@ packages: - supports-color dev: true - /use-debouncy@4.3.1(react@18.2.0): - resolution: {integrity: sha512-K+qtK89KojRB2GbTGtmJRysSii+wVg540bYeW9YBF7jqtwoGjIpY3m71BP0NeZzOMCcbZ6ZodLw6QeN3ascTZg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: true - /use-debouncy@4.6.0(react@18.2.0): resolution: {integrity: sha512-5N3n/oQYMuU3QKLXDa9p/xtdPKBcNbGQdLqJJPrkT164IMpHdke5xqoehDZCmgDciy+wJC+iqyE3g8c+k03lGg==} peerDependencies: @@ -32931,15 +29658,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify@1.0.1: - resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} - dependencies: - define-properties: 1.2.1 - es-abstract: 1.22.3 - has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.7 - dev: true - /util@0.10.4: resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} dependencies: @@ -32987,17 +29705,6 @@ packages: hasBin: true dev: false - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: true - /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -33018,12 +29725,6 @@ packages: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - /validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} - dependencies: - builtins: 1.0.3 - dev: true - /validate-npm-package-name@5.0.0: resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -33040,10 +29741,6 @@ packages: engines: {node: '>= 0.10'} dev: false - /vanilla-jsoneditor@0.16.1: - resolution: {integrity: sha512-Wirg6DoCrJpYwMHxkwyvgQ16gr4kgH9zzueHSSSovzQDvlg/XSqpY/stVsI5lz1vqJW1RAtr0Ilyyg1AbokRXA==} - dev: true - /vanilla-jsoneditor@0.17.10: resolution: {integrity: sha512-2ScoLNqq3kRSJ1+sG8rzbh4YtetrgEXbRX0OYxOk1Lqlg6tSkELGPsTA4KADFwk1s84oPj2ozMmFY6SwbZRJhg==} dev: true @@ -33061,29 +29758,6 @@ packages: extsprintf: 1.4.1 dev: true - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - dependencies: - '@types/unist': 2.0.10 - vfile: 5.3.7 - dev: true - - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - dev: true - - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: true - /vinyl-fs@3.0.3: resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} engines: {node: '>= 0.10'} @@ -33216,7 +29890,7 @@ packages: fsevents: 2.3.3 dev: false - /vite@4.5.2(@types/node@20.12.7)(less@4.1.3)(sass@1.69.5): + /vite@4.5.2(@types/node@20.12.7)(less@4.1.3): resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -33249,7 +29923,6 @@ packages: less: 4.1.3 postcss: 8.4.38 rollup: 3.29.4 - sass: 1.69.5 optionalDependencies: fsevents: 2.3.3 @@ -33437,10 +30110,6 @@ packages: defaults: 1.0.4 dev: true - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: true - /web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -33655,6 +30324,7 @@ packages: engines: {node: '>=4'} dependencies: string-width: 2.1.1 + dev: false /widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} @@ -33783,6 +30453,7 @@ packages: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 + dev: false /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} @@ -33847,6 +30518,7 @@ packages: /xdg-basedir@3.0.0: resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} engines: {node: '>=4'} + dev: false /xlsx@0.17.5: resolution: {integrity: sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==} @@ -33879,22 +30551,9 @@ packages: xpath: 0.0.32 dev: true - /xml-lexer@0.2.2: - resolution: {integrity: sha512-G0i98epIwiUEiKmMcavmVdhtymW+pCAohMRgybyIME9ygfVu8QheIi+YoQh3ngiThsT0SQzJT4R0sKDEv8Ou0w==} - dependencies: - eventemitter3: 2.0.3 - dev: true - /xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - /xml-reader@2.4.3: - resolution: {integrity: sha512-xWldrIxjeAMAu6+HSf9t50ot1uL5M+BtOidRCWHXIeewvSeIpscWCsp4Zxjk8kHHhdqFBrfK8U0EJeCcnyQ/gA==} - dependencies: - eventemitter3: 2.0.3 - xml-lexer: 0.2.2 - dev: true - /xml2js@0.4.23: resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} engines: {node: '>=4.0.0'} @@ -33964,6 +30623,7 @@ packages: /y18n@3.2.2: resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: false /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -34124,27 +30784,3 @@ packages: compress-commons: 4.1.2 readable-stream: 3.6.2 dev: true - - /zustand@4.4.7(@types/react@18.2.75)(react@18.2.0): - resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - dependencies: - '@types/react': 18.2.75 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - dev: true - - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: true diff --git a/tsconfig.json b/tsconfig.json index 2b5430e50..c4b5c0bbf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,7 +26,7 @@ "module": "commonjs" } }, - "include": [".dumi/**/*", ".dumirc.ts", "packages/**/*", "playwright.config.ts", "vitest.config.mts"], + "include": ["packages/**/*", "playwright.config.ts", "vitest.config.mts"], "exclude": [ "packages/**/node_modules", "packages/**/dist",
{ - const text = getValue(e.currentTarget); - if (e.key === 'Backspace') { - if (text && keys.map((k) => `{{${k}}}`).includes(text)) { - inputRef.current.innerHTML = ' '; - } - } - }} - onKeyUp={(e) => { - const text = getValue(e.currentTarget); - if (e.key === 'Backspace') { - // pasteHtml(' '); - } - onChange(text); - }} - // onClick={(e) => { - // const text = getValue(e.currentTarget); - // onChange(text); - // console.log('onChange', text); - // }} - onBlur={(e) => { - const text = getValue(e.currentTarget); - onChange(text); - }} - onInput={(e) => { - const text = getValue(e.currentTarget); - onChange(text); - }} - className={'ant-input'} - style={{ display: 'block' }} - ref={inputRef as any} - contentEditable - dangerouslySetInnerHTML={{ __html: html }} - /> - - ); -}; - -export default Expression; diff --git a/packages/core/client/src/formula/Result.tsx b/packages/core/client/src/formula/Result.tsx deleted file mode 100644 index 6d174ba35..000000000 --- a/packages/core/client/src/formula/Result.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { onFormValuesChange } from '@nocobase/schema'; -import { useField, useFieldSchema, useForm, useFormEffects } from '@nocobase/schema'; -import { toFixedByStep } from '@nocobase/utils/client'; -import cloneDeep from 'lodash/cloneDeep'; -import * as math from 'mathjs'; -import { isNumber } from 'mathjs'; -import React, { useState } from 'react'; -import { useCollection_deprecated } from '../collection-manager'; - -const ReadPretty = (props) => { - if (props?.options?.dataType !== 'string') { - return
{toFixedByStep(props.value, props.step)}
; - } - return
{props.value}
; -}; - -const Input = (props) => { - const { evaluate, options } = props; - const { dataType, expression } = options; - const form = useForm(); - const val = () => { - const scope = cloneDeep(form.values); - try { - let result = evaluate(expression, scope); - result = isNumber(result) && Number.isFinite(result) ? math.round(result, 9) : result; - return result; - } catch (error) { - return null; - } - }; - const [value, setVal] = useState(() => { - return val(); - }); - useFormEffects(() => { - onFormValuesChange(() => { - setVal(val()); - }); - }); - if (dataType !== 'string') { - return
{toFixedByStep(value, props.step)}
; - } - return
{value}
; -}; - -export const Result = (props: any) => { - const field = useField(); - const { getField } = useCollection_deprecated(); - const fieldSchema = useFieldSchema(); - const options = getField(fieldSchema.name as string); - return field.readPretty ? : ; -}; - -export default Result; diff --git a/packages/core/client/src/formula/demos/demo2.tsx b/packages/core/client/src/formula/demos/demo2.tsx deleted file mode 100644 index da5bd9eed..000000000 --- a/packages/core/client/src/formula/demos/demo2.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/** - * title: Formula - */ -import { connect } from '@nocobase/schema'; -import { Formula, SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; -import React from 'react'; - -const Expression = connect(Formula.Expression); - -const schema = { - type: 'object', - properties: { - input: { - type: 'string', - default: '{{f1 }} + {{ f2}}', - 'x-component': 'Expression', - 'x-component-props': { - evaluate: (exp, scope) => { - return 1; - }, - supports: ['number'], - useCurrentFields: () => { - return [ - { - name: 'f1', - interface: 'number', - uiSchema: { - title: 'F1', - }, - }, - { - name: 'f2', - interface: 'number', - uiSchema: { - title: 'F2', - }, - }, - ]; - }, - }, - }, - }, -}; - -export default () => { - return ( - - - - ); -}; diff --git a/packages/core/client/src/formula/index.md b/packages/core/client/src/formula/index.md deleted file mode 100644 index db9bd0a45..000000000 --- a/packages/core/client/src/formula/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -group: - title: Client - order: 1 ---- - -# Formula - - diff --git a/packages/core/client/src/formula/index.tsx b/packages/core/client/src/formula/index.tsx deleted file mode 100644 index 9a59d66df..000000000 --- a/packages/core/client/src/formula/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import Expression from './Expression'; -import Result from './Result'; - -export const Formula = () => null; - -Formula.Result = Result; -Formula.Expression = Expression; - -export default Formula; diff --git a/packages/core/client/src/index.ts b/packages/core/client/src/index.ts index b30595767..031229d6b 100644 --- a/packages/core/client/src/index.ts +++ b/packages/core/client/src/index.ts @@ -29,7 +29,6 @@ export * from './data-source'; export * from './document-title'; export * from './filter-provider'; export * from './flag-provider'; -export * from './formula'; export * from './global-theme'; export * from './hooks'; export * from './i18n'; diff --git a/packages/core/client/tsconfig.json b/packages/core/client/tsconfig.json deleted file mode 100644 index 42c17ae84..000000000 --- a/packages/core/client/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "target": "ESNext", - "module": "ESNext" - } -} diff --git a/packages/core/test/vitest.mjs b/packages/core/test/vitest.mjs index 359d507ff..475969ebf 100644 --- a/packages/core/test/vitest.mjs +++ b/packages/core/test/vitest.mjs @@ -65,7 +65,7 @@ export const defineConfig = (config = {}) => { '**/e2e/**', '**/__e2e__/**', '**/{vitest,commitlint}.config.*', - 'packages/**/{dumi-theme-nocobase,sdk,client}/**/__tests__/**/*.{test,spec}.{ts,tsx}', + 'packages/**/{sdk,client}/**/__tests__/**/*.{test,spec}.{ts,tsx}', ], testTimeout: 300000, hookTimeout: 300000, @@ -94,7 +94,7 @@ export const defineConfig = (config = {}) => { environment: 'jsdom', css: false, alias: tsConfigPathsToAlias(), - include: ['packages/**/{dumi-theme-nocobase,sdk,client}/**/__tests__/**/*.{test,spec}.{ts,tsx}'], + include: ['packages/**/{sdk,client}/**/__tests__/**/*.{test,spec}.{ts,tsx}'], exclude: [ '**/node_modules/**', '**/dist/**', diff --git a/packages/core/utils/tsconfig.json b/packages/core/utils/tsconfig.json new file mode 100644 index 000000000..a7d36e8e4 --- /dev/null +++ b/packages/core/utils/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "lib": ["esnext", "DOM.Iterable", "DOM"], + "esModuleInterop": true, + "moduleResolution": "node", + "jsx": "react", + "target": "esnext", + "module": "esnext", + "allowJs": true, + "noUnusedLocals": false, + "preserveConstEnums": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "sourceMap": true, + "inlineSources": true, + "resolveJsonModule": true, + "declaration": true, + "experimentalDecorators": true, + "downlevelIteration": true + }, + "exclude": [ + "node_modules", + "lib", + "client.d.ts", + "server.d.ts", + "client.js", + "server.js", + "plugin-symlink.d.ts", + "plugin-symlink.js" + ] +} diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/.npmignore b/packages/plugins/@nocobase/plugin-excel-formula-field/.npmignore deleted file mode 100644 index c593fe9df..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -/node_modules -/src \ No newline at end of file diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/LICENSE b/packages/plugins/@nocobase/plugin-excel-formula-field/LICENSE deleted file mode 100644 index 0ad25db4b..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/README.md b/packages/plugins/@nocobase/plugin-excel-formula-field/README.md deleted file mode 100644 index 8b0979dd3..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# excel-formula-field - -English | [中文](./README.zh-CN.md) - -## 安装激活 - -内置插件无需手动安装激活。 - -## 使用方法 diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/README.zh-CN.md b/packages/plugins/@nocobase/plugin-excel-formula-field/README.zh-CN.md deleted file mode 100644 index 4171af5ea..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/README.zh-CN.md +++ /dev/null @@ -1,9 +0,0 @@ -# excel-formula-field - -[English](./README.md) | 中文 - -## 安装激活 - -内置插件无需手动安装激活。 - -## 使用方法 diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/client.d.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/client.d.ts deleted file mode 100644 index 6c459cbac..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/client.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/client'; -export { default } from './dist/client'; diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/client.js b/packages/plugins/@nocobase/plugin-excel-formula-field/client.js deleted file mode 100644 index b6e3be70e..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/client.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/client/index.js'); diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/package.json b/packages/plugins/@nocobase/plugin-excel-formula-field/package.json deleted file mode 100644 index 8df56776b..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "@nocobase/plugin-excel-formula-field", - "version": "0.21.6", - "description": "", - "keywords": [ - "Fields" - ], - "license": "AGPL-3.0", - "main": "./dist/server/index.js", - "devDependencies": { - "@formulajs/formulajs": "^4.2.0", - "@nocobase/schema": "workspace:*", - "react": "^18.2.0", - "react-i18next": "^11.15.1" - }, - "peerDependencies": { - "@nocobase/client": "workspace:*", - "@nocobase/database": "workspace:*", - "@nocobase/server": "workspace:*", - "@nocobase/test": "workspace:*" - }, - "gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1" -} diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/server.d.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/server.d.ts deleted file mode 100644 index c41081ddc..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/server.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/server'; -export { default } from './dist/server'; diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/server.js b/packages/plugins/@nocobase/plugin-excel-formula-field/server.js deleted file mode 100644 index 972842039..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/server.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/server/index.js'); diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/ExcelFormula/index.ts b/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/ExcelFormula/index.ts deleted file mode 100644 index 4c13a7b9e..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/ExcelFormula/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { connect, observer } from '@nocobase/schema'; -import { Formula } from '@nocobase/client'; -import React from 'react'; -import { evaluate } from '../../utils/evaluate'; - -export const ExcelFormula: any = () => null; - -ExcelFormula.Result = observer( - (props) => - React.createElement(Formula.Result, { - ...props, - evaluate, - }), - { displayName: 'ExcelFormula.Result' }, -); - -ExcelFormula.Expression = connect((props) => { - return React.createElement(Formula.Expression, { - ...props, - evaluate, - }); -}); - -ExcelFormula.Expression.displayName = 'ExcelFormula.Expression'; diff --git a/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/ExcelFormulaFieldProvider.tsx b/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/ExcelFormulaFieldProvider.tsx deleted file mode 100644 index 2be60535c..000000000 --- a/packages/plugins/@nocobase/plugin-excel-formula-field/src/client/ExcelFormulaFieldProvider.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { SchemaComponentOptions } from '@nocobase/client'; -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { ExcelFormula } from './ExcelFormula'; - -export const ExcelFormulaFieldProvider = React.memo((props) => { - const { t } = useTranslation(); - - return ( - - {t('Syntax see', { ns: 'math-formula-field' })}{' '} -
- formula.js - -