Showing preview only (1,549K chars total). Download the full file or copy to clipboard to get everything.
Repository: alibaba/x-render
Branch: master
Commit: 8912e5141893
Files: 709
Total size: 1.3 MB
Directory structure:
gitextract_d43v9j5z/
├── .dumi/
│ ├── loading.tsx
│ ├── theme/
│ │ ├── builtins/
│ │ │ └── TypeSchema/
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── layouts/
│ │ │ └── GlobalLayout/
│ │ │ └── index.tsx
│ │ └── slots/
│ │ └── Header/
│ │ ├── GithubLink.tsx
│ │ ├── Navigation.tsx
│ │ ├── ThemeSwitch.tsx
│ │ ├── index.less
│ │ └── index.tsx
│ └── tmp-production/
│ ├── core/
│ │ ├── EmptyRoute.tsx
│ │ ├── defineApp.ts
│ │ ├── exportStaticRuntimePlugin.ts
│ │ ├── helmet.ts
│ │ ├── helmetContext.ts
│ │ ├── history.ts
│ │ ├── historyIntelli.ts
│ │ ├── plugin.ts
│ │ ├── pluginConfig.ts
│ │ ├── pluginConfigJoi.d.ts
│ │ ├── polyfill.ts
│ │ ├── route.tsx
│ │ └── terminal.ts
│ ├── dumi/
│ │ ├── exportStaticRuntimePlugin.ts
│ │ ├── exports.ts
│ │ ├── locales/
│ │ │ ├── config.ts
│ │ │ └── runtime.tsx
│ │ ├── meta/
│ │ │ ├── atoms.ts
│ │ │ ├── index.ts
│ │ │ ├── runtime.ts
│ │ │ └── tabs.ts
│ │ └── theme/
│ │ ├── ContextWrapper.tsx
│ │ ├── builtins/
│ │ │ ├── API.ts
│ │ │ ├── Badge.ts
│ │ │ ├── Container.ts
│ │ │ ├── Previewer.ts
│ │ │ ├── SourceCode.ts
│ │ │ └── Table.ts
│ │ ├── layouts/
│ │ │ └── DocLayout.ts
│ │ └── slots/
│ │ ├── ColorSwitch.ts
│ │ ├── Content.ts
│ │ ├── ContentTabs.ts
│ │ ├── Features.ts
│ │ ├── Footer.ts
│ │ ├── HeadeExtra.ts
│ │ ├── Header.ts
│ │ ├── Hero.ts
│ │ ├── HeroTitle.ts
│ │ ├── LangSwitch.ts
│ │ ├── Logo.ts
│ │ ├── Navbar.ts
│ │ ├── NavbarExtra.ts
│ │ ├── NotFound.ts
│ │ ├── PreviewerActions.ts
│ │ ├── PreviewerActionsExtra.ts
│ │ ├── RtlSwitch.ts
│ │ ├── SearchBar.ts
│ │ ├── SearchResult.ts
│ │ ├── Sidebar.ts
│ │ ├── SocialIcon.ts
│ │ └── Toc.ts
│ ├── exports.ts
│ ├── testBrowser.tsx
│ └── umi.ts
├── .dumirc.ts
├── .editorconfig
├── .fatherrc.js
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ └── feature_request.md
│ └── workflows/
│ ├── ci.yml
│ ├── coverage.yml
│ ├── deploy.yml
│ ├── emoji-helper.yml
│ ├── issue-helper.yml
│ └── mirror.yml
├── .gitignore
├── .npmrc
├── .prettierignore
├── .prettierrc
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── README.md
├── app.ts
├── docs/
│ ├── data-render/
│ │ ├── data/
│ │ │ └── basic.ts
│ │ ├── index.md
│ │ └── schema/
│ │ └── basic.ts
│ ├── form-render/
│ │ ├── advaced-example.md
│ │ ├── advanced-bind.md
│ │ ├── advanced-layout.md
│ │ ├── advanced-linkage.md
│ │ ├── advanced-path.md
│ │ ├── advanced-slimrender.md
│ │ ├── advanced-validate.md
│ │ ├── advanced-widget.md
│ │ ├── api-props.md
│ │ ├── api-schema.md
│ │ ├── changelog.md
│ │ ├── demo/
│ │ │ ├── FormRender.jsx
│ │ │ ├── bind.tsx
│ │ │ ├── defaultChange.tsx
│ │ │ ├── dymic.tsx
│ │ │ ├── form-slim/
│ │ │ │ ├── basic.tsx
│ │ │ │ └── form-list.tsx
│ │ │ ├── linkage/
│ │ │ │ └── list.tsx
│ │ │ ├── outLabelCol.tsx
│ │ │ ├── validateFields.tsx
│ │ │ └── widget/
│ │ │ ├── basic.tsx
│ │ │ ├── depend-linkage.tsx
│ │ │ ├── desc-widget.tsx
│ │ │ ├── label-widget.tsx
│ │ │ ├── linkage.tsx
│ │ │ └── readonly-widget.tsx
│ │ ├── disaply-search.md
│ │ ├── display-row.md
│ │ ├── faq.md
│ │ ├── index.md
│ │ ├── migrate.md
│ │ ├── schema/
│ │ │ ├── baseControl.ts
│ │ │ ├── basic.ts
│ │ │ ├── cellSpan.ts
│ │ │ ├── schema.ts
│ │ │ ├── simple.ts
│ │ │ └── span.ts
│ │ ├── test/
│ │ │ ├── bigJson.tsx
│ │ │ ├── bind.tsx
│ │ │ ├── dependencies.tsx
│ │ │ ├── disaply-column.md
│ │ │ ├── removeHidden.tsx
│ │ │ └── test.md
│ │ └── utils/
│ │ └── index.js
│ ├── form-render-mobile/
│ │ ├── api.md
│ │ ├── demo/
│ │ │ ├── allWidget.tsx
│ │ │ ├── basic.tsx
│ │ │ ├── card.tsx
│ │ │ ├── collaspa.tsx
│ │ │ ├── group.tsx
│ │ │ ├── index.tsx
│ │ │ └── list.tsx
│ │ ├── disaply.md
│ │ ├── index.md
│ │ └── test/
│ │ ├── index.tsx
│ │ └── test.md
│ ├── index.en-US.md
│ ├── index.zh-CN.md
│ ├── playground/
│ │ ├── controller/
│ │ │ ├── index.css
│ │ │ └── index.tsx
│ │ ├── customized/
│ │ │ └── AsyncSelect.js
│ │ ├── example/
│ │ │ └── expression.ts
│ │ ├── index.less
│ │ ├── index.md
│ │ ├── index.tsx
│ │ ├── json/
│ │ │ ├── basic.json
│ │ │ ├── demo.json
│ │ │ ├── dynamic-function.js
│ │ │ ├── format.json
│ │ │ ├── function.json
│ │ │ ├── input.json
│ │ │ ├── new-feature.json
│ │ │ ├── select.json
│ │ │ └── simplest.json
│ │ └── serialize.js
│ ├── schema-builder/
│ │ ├── api.md
│ │ └── index.md
│ ├── schema-builder-online/
│ │ └── index.md
│ ├── table-render/
│ │ ├── .test/
│ │ │ └── test.md
│ │ ├── api.md
│ │ ├── basic.md
│ │ ├── collapsed.md
│ │ ├── custom-table.md
│ │ ├── demo/
│ │ │ ├── basic/
│ │ │ │ └── index.tsx
│ │ │ ├── display/
│ │ │ │ └── custom-table.tsx
│ │ │ └── toolbar/
│ │ │ ├── basic.tsx
│ │ │ └── selection-tool.tsx
│ │ ├── index.md
│ │ ├── migrate.md
│ │ ├── noSearch.md
│ │ ├── promptly-search.md
│ │ ├── static/
│ │ │ ├── request.ts
│ │ │ ├── search.ts
│ │ │ └── table.tsx
│ │ ├── tabs.md
│ │ ├── toolbar.md
│ │ └── valueType.md
│ ├── tools/
│ │ ├── proptypes/
│ │ │ └── index.md
│ │ └── vscode/
│ │ └── index.md
│ └── xflow/
│ ├── FlowProvider.md
│ ├── api.md
│ ├── best-practices.md
│ ├── custom-node-setting.md
│ ├── custom-node-view.md
│ ├── data/
│ │ └── basic.ts
│ ├── demo/
│ │ ├── basic/
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── best/
│ │ │ ├── basic/
│ │ │ │ ├── TextEllipsis/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── const.tsx
│ │ │ │ ├── header.tsx
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ ├── setting.tsx
│ │ │ │ ├── showSwitchNode.tsx
│ │ │ │ └── tools.tsx
│ │ │ └── demo2/
│ │ │ ├── CustomSvg.tsx
│ │ │ ├── TextEllipsis/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── const.tsx
│ │ │ ├── header.tsx
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ ├── setting.tsx
│ │ │ ├── showSwitchNode.tsx
│ │ │ └── tools.tsx
│ │ ├── custom-flow/
│ │ │ ├── advancedLinkageCase/
│ │ │ │ ├── customWidget.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting.tsx
│ │ │ ├── customWidget.tsx
│ │ │ ├── fullCase/
│ │ │ │ ├── components/
│ │ │ │ │ ├── ReadOnlyPanel.tsx
│ │ │ │ │ ├── TagWidget.tsx
│ │ │ │ │ ├── customWidget.tsx
│ │ │ │ │ └── secondTagWidget.tsx
│ │ │ │ ├── const.ts
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting.ts
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── flow-provider/
│ │ │ ├── edges.ts
│ │ │ ├── index.tsx
│ │ │ ├── nodes.ts
│ │ │ └── setting.tsx
│ │ ├── layout/
│ │ │ ├── LR/
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting.tsx
│ │ │ └── TB/
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── log/
│ │ │ ├── buildIn-log/
│ │ │ │ ├── CustomGroupTittle.tsx
│ │ │ │ ├── DetailLogWidget.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── setting.tsx
│ │ │ │ └── utils.tsx
│ │ │ ├── custom-log/
│ │ │ │ ├── index.tsx
│ │ │ │ ├── setting.tsx
│ │ │ │ └── utils.tsx
│ │ │ ├── index.tsx
│ │ │ ├── runNode/
│ │ │ │ ├── index.tsx
│ │ │ │ ├── setting.tsx
│ │ │ │ └── utils.tsx
│ │ │ ├── setting.tsx
│ │ │ └── utils.tsx
│ │ ├── nodeSetting/
│ │ │ ├── data.tsx
│ │ │ ├── fullDemo/
│ │ │ │ ├── CustomImg.tsx
│ │ │ │ ├── CustomSvg.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── settings.ts
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── nodeWidget/
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ └── setting.ts
│ │ ├── parallelNode/
│ │ │ ├── custome/
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting.tsx
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── quickStart/
│ │ │ └── index.tsx
│ │ └── switchNode/
│ │ ├── customSwitchNode/
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── index.tsx
│ │ └── setting.tsx
│ ├── index.md
│ ├── layout.md
│ ├── log.md
│ ├── nodeBuildIn.md
│ ├── nodeSetting.md
│ ├── question.md
│ ├── quickStart.md
│ ├── schema/
│ │ ├── basic.ts
│ │ ├── custom-settings.ts
│ │ └── settings.ts
│ ├── singlePointDebug.md
│ └── updateLog.md
├── lerna.json
├── package.json
├── packages/
│ ├── chart-render/
│ │ ├── .fatherrc.ts
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── ChartContainer/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ChartProvider/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Search/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── index.ts
│ │ │ ├── utils/
│ │ │ │ ├── index.ts
│ │ │ │ ├── store.ts
│ │ │ │ └── type.ts
│ │ │ └── widgets/
│ │ │ ├── Column/
│ │ │ │ └── index.tsx
│ │ │ └── Pie/
│ │ │ └── index.tsx
│ │ └── tsconfig.json
│ ├── data-render/
│ │ ├── .fatherrc.js
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── core/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── renderer.tsx
│ │ │ ├── index.ts
│ │ │ ├── models/
│ │ │ │ ├── context.ts
│ │ │ │ ├── expression.ts
│ │ │ │ ├── isHidden.ts
│ │ │ │ ├── resolver.tsx
│ │ │ │ └── store.ts
│ │ │ ├── type.ts
│ │ │ ├── utils/
│ │ │ │ └── common.ts
│ │ │ ├── widgets/
│ │ │ │ ├── FButton/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FButtonFold/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FCard/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FCollapse/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FDescriptions/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FEncryption/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FIconLabel/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FImage/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FLabel/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FPanel/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FProgress/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FProgressBar/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FRadioGroup/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FRow/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FSpace/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FStatistic/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FSteps/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FSuckNav/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTable/
│ │ │ │ │ ├── detalColumn.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTabs/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTags/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FText/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTextEllipsis/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTimeline/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTitle/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTooltip/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── BaseCollapse/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── BaseTable/
│ │ │ │ │ │ ├── basic.ts
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── CopyLabel/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── Encryption/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── IconLabel/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── IconView/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── InnerHtml/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── ReactNode/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── RequestTable/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── SuckTabs/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── TextEllipsis/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── TextView/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── utils/
│ │ │ │ ├── common.ts
│ │ │ │ ├── createIconFont.ts
│ │ │ │ └── hooks.ts
│ │ │ └── withProvider.tsx
│ │ └── tsconfig.json
│ ├── form-render/
│ │ ├── .fatherrc.js
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── core-utils.spec.ts
│ │ │ ├── demo.tsx
│ │ │ ├── form-demo.tsx
│ │ │ ├── form-fields.spec.tsx
│ │ │ ├── form.spec.tsx
│ │ │ ├── get-descriptor.spec.ts
│ │ │ ├── schema.ts
│ │ │ └── utils.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── derivative/
│ │ │ │ ├── SearchForm/
│ │ │ │ │ ├── ActionView.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ └── SlimRender/
│ │ │ │ └── index.tsx
│ │ │ ├── form-core/
│ │ │ │ ├── connectForm.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── index.ts
│ │ │ ├── locales/
│ │ │ │ ├── en_US.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── zh_CN.ts
│ │ │ ├── models/
│ │ │ │ ├── bindValues.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── expression.ts
│ │ │ │ ├── fieldShouldUpdate.ts
│ │ │ │ ├── filterValuesHidden.ts
│ │ │ │ ├── filterValuesUndefined.ts
│ │ │ │ ├── flattenSchema.ts
│ │ │ │ ├── formCoreUtils.ts
│ │ │ │ ├── formDataSkeleton.ts
│ │ │ │ ├── layout.ts
│ │ │ │ ├── mapping.tsx
│ │ │ │ ├── sortProperties.ts
│ │ │ │ ├── store.ts
│ │ │ │ ├── transformProps.ts
│ │ │ │ ├── useForm.ts
│ │ │ │ ├── validateMessage.ts
│ │ │ │ └── validates.ts
│ │ │ ├── render-core/
│ │ │ │ ├── FieldItem/
│ │ │ │ │ ├── field.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── module.tsx
│ │ │ │ ├── FieldList/
│ │ │ │ │ ├── field.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── modules.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── type.ts
│ │ │ ├── utils/
│ │ │ │ └── index.ts
│ │ │ ├── widgets/
│ │ │ │ ├── ErrorSchema/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── boxCollapse/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── boxLineTitle/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── boxSubInline/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── boxcard/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── DatePicker/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── FButton/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── HeaderTitle/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── PanelView/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── TimePicker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── fields/
│ │ │ │ │ ├── checkbox/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── checkboxes/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── color/
│ │ │ │ │ │ ├── alphahexMap.ts
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── date/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── dateRange/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── imageInput/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── input/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── number/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── percentSlider/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── radio/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── rate/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── select/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── slider/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── switch/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── textArea/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── time/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── timeRange/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── treeSelect/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── upload/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── urlInput/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── listCard/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── listDrawer/
│ │ │ │ │ ├── drawerForm.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── listSimple/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── listTab/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── listTable/
│ │ │ │ │ ├── index.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── tableCell.tsx
│ │ │ │ ├── listVirtual/
│ │ │ │ │ ├── index.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── virtualCell.tsx
│ │ │ │ ├── utils/
│ │ │ │ │ ├── hooks.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── withFieldWrap.tsx
│ │ │ │ └── voidTitle/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── withProvider.tsx
│ │ └── tsconfig.json
│ ├── form-render-mobile/
│ │ ├── .fatherrc.js
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── form-core/
│ │ │ │ ├── connectForm.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── index.tsx
│ │ │ ├── locales/
│ │ │ │ ├── en_US.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── zh_CN.ts
│ │ │ ├── models/
│ │ │ │ ├── context.ts
│ │ │ │ ├── store.ts
│ │ │ │ ├── transformProps.ts
│ │ │ │ └── useForm.ts
│ │ │ ├── render-core/
│ │ │ │ ├── FieldItem/
│ │ │ │ │ ├── field.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── module.tsx
│ │ │ │ ├── FieldList/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── type.ts
│ │ │ ├── utils/
│ │ │ │ └── index.ts
│ │ │ ├── widgets/
│ │ │ │ ├── Card/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Cascader/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Collapse/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DatePicker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Group/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Html/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Picker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Radio/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── utils.ts
│ │ │ └── withProvider.tsx
│ │ └── tsconfig.json
│ ├── table-render/
│ │ ├── .fatherrc.ts
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTION.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── utils.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── core/
│ │ │ │ ├── ErrorBoundary/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SearchView/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TableView/
│ │ │ │ │ ├── copy.tsx
│ │ │ │ │ ├── field.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── widgets.tsx
│ │ │ │ ├── ToolbarView/
│ │ │ │ │ ├── InteriorTool/
│ │ │ │ │ │ ├── ColumnSetting/
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── item.tsx
│ │ │ │ │ │ │ └── utils.ts
│ │ │ │ │ │ ├── DensityIcon.tsx
│ │ │ │ │ │ ├── FullScreenIcon.tsx
│ │ │ │ │ │ ├── ReloadIcon.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── TitleView.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── store.ts
│ │ │ ├── index.tsx
│ │ │ ├── locales/
│ │ │ │ ├── en_US.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── zh_CN.ts
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ └── index.ts
│ │ ├── tsconfig.json
│ │ └── 开发文档.md
│ └── x-flow/
│ ├── .fatherrc.js
│ ├── CHANGELOG.md
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── XFlow.tsx
│ │ ├── components/
│ │ │ ├── CandidateNode/
│ │ │ │ └── index.tsx
│ │ │ ├── CustomEdge/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── CustomNode/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── sourceHandle.tsx
│ │ │ ├── FAutoComplete/
│ │ │ │ └── index.tsx
│ │ │ ├── FlowProvider/
│ │ │ │ └── index.tsx
│ │ │ ├── IconView/
│ │ │ │ └── index.tsx
│ │ │ ├── NodeContainer/
│ │ │ │ ├── TitleMenuTooltip.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── NodeEditor/
│ │ │ │ └── index.tsx
│ │ │ ├── NodeLogPanel/
│ │ │ │ ├── components/
│ │ │ │ │ ├── CodePanel.tsx
│ │ │ │ │ ├── DetailPanel.tsx
│ │ │ │ │ ├── StatusPanel.tsx
│ │ │ │ │ ├── TrackNodeItem.tsx
│ │ │ │ │ └── TrackPanel.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── NodesMenu/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── NodesPopover/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── PanelContainer/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── PanelStatusLogContainer/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── TextEllipsis/
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── hooks/
│ │ │ ├── useEdges.ts
│ │ │ ├── useFlow.ts
│ │ │ ├── useNodes.ts
│ │ │ ├── useStore.ts
│ │ │ └── useTemporalStore.ts
│ │ ├── index.less
│ │ ├── index.ts
│ │ ├── models/
│ │ │ ├── context.ts
│ │ │ ├── event-emitter.tsx
│ │ │ └── store.ts
│ │ ├── nodes/
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ ├── node-common/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── node-end/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── node-note/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── node-parallel/
│ │ │ │ ├── ParallelBuildInNodeWidget.tsx
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting/
│ │ │ │ └── index.tsx
│ │ │ ├── node-start/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── node-switch/
│ │ │ ├── SwitchBuildInNodeWidget.tsx
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ └── setting/
│ │ │ └── index.tsx
│ │ ├── operator/
│ │ │ ├── Control/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── UndoRedo/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── ZoomInOut/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── shortcuts-name.tsx
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── types.ts
│ │ ├── utils/
│ │ │ ├── autoLayoutNodes.ts
│ │ │ ├── createIconFont.ts
│ │ │ ├── flow.ts
│ │ │ ├── hooks.ts
│ │ │ └── index.ts
│ │ └── withProvider.tsx
│ └── tsconfig.json
├── scripts/
│ ├── dumi-plugin/
│ │ ├── publicPath.ts
│ │ └── redirect.ts
│ └── prettier-plugin/
│ └── index.js
├── tools/
│ └── schema-builder/
│ ├── .fatherrc.js
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── createIframe.ts
│ │ ├── index.ts
│ │ ├── main.tsx
│ │ ├── settings/
│ │ │ ├── index.ts
│ │ │ ├── meta/
│ │ │ │ ├── card.ts
│ │ │ │ ├── cardList.ts
│ │ │ │ ├── checkbox.ts
│ │ │ │ ├── checkboxes.ts
│ │ │ │ ├── color.ts
│ │ │ │ ├── date.ts
│ │ │ │ ├── dateRange.ts
│ │ │ │ ├── form.ts
│ │ │ │ ├── imageInput.ts
│ │ │ │ ├── input.ts
│ │ │ │ ├── number.ts
│ │ │ │ ├── radio.ts
│ │ │ │ ├── rate.ts
│ │ │ │ ├── select.ts
│ │ │ │ ├── slider.ts
│ │ │ │ ├── switch.ts
│ │ │ │ ├── textarea.ts
│ │ │ │ ├── time.ts
│ │ │ │ ├── timeRange.ts
│ │ │ │ ├── treeSelect.ts
│ │ │ │ └── urlInput.ts
│ │ │ └── utils.ts
│ │ └── type.ts
│ └── tsconfig.json
├── tsconfig.jest.json
├── turbo.json
├── typing.d.ts
├── vitest.config.ts
└── widgets/
├── AsyncOptions/
│ ├── .fatherrc.js
│ ├── README.md
│ ├── package.json
│ └── src/
│ └── index.js
├── RichText/
│ ├── .fatherrc.js
│ ├── README.md
│ ├── package.json
│ └── src/
│ └── index.js
└── template/
├── .fatherrc.js
├── README.md
├── package.json
└── src/
└── index.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .dumi/loading.tsx
================================================
import React from 'react';
import { Spin } from 'antd';
export default () => {
return (
<div style={{ width: '100%', height: '100vh', display: 'flex', justifyContent: 'center', paddingTop: '340px'}}>
<Spin />
</div>
);
}
================================================
FILE: .dumi/theme/builtins/TypeSchema/index.less
================================================
.xr-doc-hero-demo {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 961px;
margin: 0 auto;
height: 500px;
position: relative;
p {
margin: 0;
padding: 0;
}
.xr-doc-hero-box {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 500px;
}
.xr-doc-hero-schema {
height: 350px;
color: #24292f;
font-size: 18px;
font-family: "SFMono-Regular", consolas, "Liberation Mono", menlo, courier, monospace, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
.xr-doc-hero-form {
width: 40%;
position: absolute;
top: -30px;
right: 30px;
flex: 1;
transition: all 0.5s;
margin-left: 50px;
}
.xr-doc-hero-loading {
margin-bottom: 20px;
color: #333;
font-size: 16px;
}
.ant-form-item-extra {
margin-bottom: -6px;
margin-left: 1px;
}
}
p {
margin: 0;
padding: 0;
}
================================================
FILE: .dumi/theme/builtins/TypeSchema/index.tsx
================================================
import React from 'react';
import TypeIt from 'typeit-react';
import FormRender, { useForm } from 'form-render';
import { Button, Card } from 'antd';
import './index.less';
const prefix = 'xr-doc-hero';
const time = (str: string, time: number) => {
let res = '';
for (let i = 0; i < time; i++) {
res += str;
}
return res;
}
const red = (val: string) => `<span style="color:#cf222e">${val}</span>`
const violet = (val: string) => `<span style="color:#8250df">${val}</span>`
const blue = (val: string) => `<span style="color:#0550ae">${val}</span>`
const black = (val: string) => `<span style="color:#0a3069">${val}</span>`
const br = (times: number) => time('<br/>', times);
const space = (times: number) => time(' ', times);
const TypeSchema: React.FC = () => {
const form = useForm();
const [schema, setSchema] = React.useState<any>();
return (
<div className={`${prefix}-demo`}>
<Card className={`${prefix}-box`}>
<div className={`${prefix}-schema`}>
<TypeIt
getBeforeInit={instance => {
instance
.options({
speed: 40,
})
.type('{}')
.move(-1, { instant: true })
.type(br(2), { instant: true })
.move(-1, { instant: true })
.type(space(2), { instant: true })
.type(`${blue('name')}: {},`)
.move(-2, { instant: true })
.type(`${br(2)}${space(2)}`, { instant: true })
.move(-3, { instant: true })
.type(space(4), { instant: true })
.type(`${blue('title')}: ${black(`'Name'`)},`)
.type(`${br(1)}${space(4)}`, { instant: true })
.type(`${blue('type')}: ${black(`'string'`)},`)
.type(`${br(1)}${space(4)}`, { instant: true })
.exec(() => {
setSchema({
type: 'object',
properties: {
name: {
title: 'Name',
type: 'string',
},
},
});
})
.type(`${blue('placeholder')}: ${black(`'Please input your name.'`)},`)
.exec(() => {
setSchema({
type: 'object',
properties: {
name: {
title: 'Name',
type: 'string',
placeholder: 'Please input your name.'
},
},
});
})
.move(5)
.type(`${br(1)}${space(2)}`, { instant: true })
.type(`${blue('fruit')}: {}`)
.move(-1, { instant: true })
.type(`${br(2)}${space(2)}`, { instant: true })
.move(-3, { instant: true })
.type(space(4), { instant: true })
.type(`${blue('title')}: ${black(`'Favorite Fruit'`)},`)
.type(`${br(1)}${space(4)}`, { instant: true })
.type(`${blue('type')}: ${black(`'number'`)},`)
.exec(() => {
setSchema({
type: 'object',
properties: {
name: {
title: 'Name',
type: 'string',
placeholder: 'Please input your name.'
},
fruit: {
title: 'Favorite Fruit',
type: 'string',
},
},
});
})
.type(`${br(1)}${space(4)}`, { instant: true })
.type(`${blue('enum')}: ${black(`[${violet('1')}, ${violet('2')}, ${violet('3')}]`)},`)
.type(`${br(1)}${space(4)}`, { instant: true })
.type(`${blue('enumNames')}: ${black(`['apple', 'cherry', 'pear'],`)}`)
.exec(() => {
setSchema({
type: 'object',
properties: {
name: {
title: 'Name',
type: 'string',
placeholder: 'Please input your name.'
},
fruit: {
title: 'Favorite Fruit',
type: 'number',
enum: [1, 2, 3],
enumNames: ['apple', 'cherry', 'pear'],
},
},
});
})
.type(`${br(1)}${space(4)}`, { instant: true })
.type(`${blue('required')}: ${violet('true')},`)
.exec(() => {
setSchema({
type: 'object',
properties: {
name: {
title: 'Name',
type: 'string',
placeholder: 'Please input your name.'
},
fruit: {
title: 'Favorite Fruit',
type: 'number',
enum: [1, 2, 3],
enumNames: ['apple', 'cherry', 'pear'],
required: true,
},
},
});
})
.type(`${br(1)}${space(4)}`, { instant: true })
.type(`${blue('default')}: ${black(`2,`)}`)
.exec(() => {
setSchema({
type: 'object',
properties: {
name: {
title: 'Name',
type: 'string',
placeholder: 'Please input your name.'
},
fruit: {
title: 'Favorite Fruit',
type: 'number',
enum: [1, 2, 3],
enumNames: ['apple', 'cherry', 'pear'],
required: true,
default: 2,
},
},
});
})
.move(-167, { instant: true })
.type(`${br(1)}${space(4)}`, { instant: true })
.type(`${blue('extra')}: ${red(`'Easiest way to build a form!'`)}`)
.exec(() => {
setSchema({
type: 'object',
properties: {
name: {
title: 'Name',
type: 'string',
placeholder: 'Please input your name.',
extra: 'Easiest way to build a form!'
},
fruit: {
title: 'Favorite Fruit',
type: 'number',
enum: [1, 2, 3],
enumNames: ['apple', 'cherry', 'pear'],
required: true,
default: 2,
},
},
});
})
return instance;
}}>
</TypeIt>
</div>
</Card>
<Card title="FormRender" className={`${prefix}-form`}>
{schema ? (
<FormRender
schema={schema}
form={form}
onFinish={(data) => {
window.alert(JSON.stringify(data))
}}
/>
) : (
<div className={`${prefix}-loading`}>Transform schema to form...</div>
)}
<Button onClick={form.submit} type="primary">
Submit
</Button>
</Card>
</div>
);
};
export default TypeSchema;
================================================
FILE: .dumi/theme/layouts/GlobalLayout/index.tsx
================================================
import React from 'react';
import { ConfigProvider } from 'antd';
import { useOutlet } from 'dumi';
const GlobalLayout: React.FC = () => {
const outlet = useOutlet();
return (
<ConfigProvider
>
{outlet}
</ConfigProvider>
);
};
export default GlobalLayout;
================================================
FILE: .dumi/theme/slots/Header/GithubLink.tsx
================================================
import React from 'react';
import { Button, Tooltip } from 'antd';
import { GithubFilled } from '@ant-design/icons';
const GithubLink: React.FC = () => {
return (
<Tooltip title="Github" placement="bottom">
<Button
href="https://github.com/alibaba/x-render"
target="_blank"
rel="noreferrer"
icon={<GithubFilled style={{ fontSize: 16 }} />}
type="text"
/>
</Tooltip>
);
};
export default GithubLink;
================================================
FILE: .dumi/theme/slots/Header/Navigation.tsx
================================================
import { CodeOutlined, DownOutlined, NodeIndexOutlined } from '@ant-design/icons';
import { Menu } from 'antd';
import { Link } from 'dumi';
import React from 'react';
const Navigation: React.FC = () => {
const items: any = [
{
label: <Link to="/form-render">FormRender</Link>,
key: 'form-render',
},
{
label: <Link to="/table-render">TableRender</Link>,
key: 'table-render',
},
{
label: <Link to="/xflow">XFlow</Link>,
key: 'xflow',
},
// {
// label: <Link to="/xflow">XFlow</Link>,
// key: 'xflow',
// },
{
label: <Link to="/form-render-mobile">FRMobile</Link>,
key: 'form-render-mobile',
},
// {
// label: <Link to="/data-render">DataView</Link>,
// key: 'data-render'
// },
{
label: <Link to="/playground">Playground</Link>,
key: 'playground',
},
// {
// label: <Link to="/schema-builder">SchemaBuilder</Link>,
// key: 'schema-builder',
// },
{
label: (
<div>
<span>更多</span>
<DownOutlined
style={{ fontSize: 12, color: '#666', marginLeft: 3 }}
/>
</div>
),
children: [
{
label: <Link to="/schema-builder">SchemaBuilder</Link>,
key: 'schema-builder',
icon: <NodeIndexOutlined />,
},
{
label: (
<a href="https://1.xrender.fun/chart-render" target="_black">
ChartRender
</a>
),
key: 'chart-render',
icon: <CodeOutlined />,
},
],
},
];
return <Menu disabledOverflow items={items} mode="horizontal" />;
};
export default Navigation;
================================================
FILE: .dumi/theme/slots/Header/ThemeSwitch.tsx
================================================
import React from 'react';
import { Dropdown, Button } from 'antd';
import { usePrefersColor } from 'dumi';
import { createFromIconfontCN } from '@ant-design/icons';
const themes = [
{
key: 'light',
label: 'Light',
icon: 'icon-Daytimemode',
},
{
key: 'dark',
label: 'Dark',
icon: 'icon-nightmode',
},
{
key: 'auto',
label: 'System',
icon: 'icon-computer',
},
];
const IconFont = createFromIconfontCN({
scriptUrl: '//at.alicdn.com/t/a/font_3889511_s7v69kz4pz.js',
});
const ThemeSwitch: React.FC = () => {
const [theme, preferTheme, changeTheme] = usePrefersColor();
const { icon } = themes.find(i => i.key === preferTheme) || {};
const getIconName = (name: string) => {
return name + `${theme === 'dark' ? '-dark' : ''}`;
};
return (
<Dropdown
menu={{
items: themes.map(i => ({
label: i.label,
key: i.key,
icon: (
<IconFont type={getIconName(i.icon)} style={{ fontSize: 20 }} />
),
onClick: () => changeTheme(i.key as 'light' | 'dark' | 'auto'),
})),
}}
>
<Button
type="text"
icon={
icon && <IconFont type={getIconName(icon)} style={{ fontSize: 22 }} />
}
/>
</Dropdown>
);
};
export default ThemeSwitch;
================================================
FILE: .dumi/theme/slots/Header/index.less
================================================
.xr-doc-header {
backdrop-filter: blur(6px);
background-color: rgba(255, 255,255, 0.8);
box-shadow: 0 1px 2px 0 rgb(0 0 0 / 3%), 0 1px 6px -1px rgb(0 0 0 / 2%), 0 2px 4px 0 rgb(0 0 0 / 2%);
width: 100%;
position: sticky;
top: 0;
z-index: 10;
margin-bottom: 20px;
@{dark-selector} & {
background-color: #050709e6;
}
&-nav-item {
color: #333;
cursor: pointer;
}
&-nva-item:hover {
color: #1677ff;
}
.ant-menu {
border: none;
line-height: unset;
display: flex;
align-items: center;
background: transparent;
font-size: 15px;
@{dark-selector} & {
color: #c6c9cd;
}
.ant-menu-item::after, .ant-menu-submenu::after {
bottom: -23px;
}
}
.dumi-default-search-bar-input {
border: none;
width: 220px;
}
.dumi-default-search-shortcut {
margin-left: 10px;
}
}
.dumi-default-doc-layout > main {
max-width: 100% !important;
padding: 0 !important;
}
.dumi-default-sidebar {
width: 200px;
}
.dumi-default-content {
border-top-left-radius: 0 !important;
border-top-right-radius: 0 !important;
}
.dumi-default-hero {
padding-top: 140px !important;
height: 600px !important;
}
.dumi-default-hero-title {
font-size: 80px !important;
}
.dumi-default-hero > p {
margin: 0 !important;
}
.dumi-default-hero-actions {
margin-top: 32px !important;
}
.dumi-default-features {
max-width: 960px !important;
}
.dumi-default-features-item {
text-align: center;
}
.dumi-default-sidebar ~ .dumi-default-content {
padding: 48px 48px 0 !important;
}
.dumi-default-content {
padding: 0 !important;
}
.xr-doc-header ~ main {
padding: 0 20px !important;
}
================================================
FILE: .dumi/theme/slots/Header/index.tsx
================================================
import React from 'react';
import DumiLogo from 'dumi/theme-default/slots/Logo';
import DumiSearch from 'dumi/theme-default/slots/SearchBar';
import { Row, Col, Space, Divider, Select, Badge } from 'antd';
import Navigation from './Navigation';
import ThemeSwitch from './ThemeSwitch';
import GithubLink from './GithubLink';
import './index.less';
const prefix = 'xr-doc-header';
const Header: React.FC = () => {
if (window.top.location.href.includes('/schema-builder-online')) {
return null;
}
return (
<header className={prefix}>
<Row align="middle" justify="space-between" style={{ padding: '10px 24px' }}>
<Col span={12}>
<Space size={20}>
<div style={{ paddingRight: '12px' }}>
<DumiLogo/>
</div>
</Space>
</Col>
<Col span={12}>
<Space size={0} style={{ float: 'right'}}>
<DumiSearch/>
<Navigation />
<Select
options={[{ label: '2.x', value: 2 }, { label: '1.x', value: 1}]}
style={{ width: '70px' }}
defaultValue={2}
onChange={(value) => {
if (value === 2) {
return;
}
window.open('https://1.xrender.fun/')
}}
/>
<Divider type="vertical" style={{ marginLeft: 0 }} />
<Space>
<ThemeSwitch />
<GithubLink />
</Space>
</Space>
</Col>
</Row>
</header>
);
};
export default Header;
================================================
FILE: .dumi/tmp-production/core/EmptyRoute.tsx
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import React from 'react';
import { Outlet, useOutletContext } from 'umi';
export default function EmptyRoute() {
const context = useOutletContext();
return <Outlet context={context} />;
}
================================================
FILE: .dumi/tmp-production/core/defineApp.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
interface IDefaultRuntimeConfig {
onRouteChange?: (props: { routes: any, clientRoutes: any, location: any, action: any, isFirst: boolean }) => void;
patchRoutes?: (props: { routes: any }) => void;
patchClientRoutes?: (props: { routes: any }) => void;
render?: (oldRender: () => void) => void;
rootContainer?: (lastRootContainer: JSX.Element, args?: any) => void;
[key: string]: any;
}
export type RuntimeConfig = IDefaultRuntimeConfig
export function defineApp(config: RuntimeConfig): RuntimeConfig {
return config;
}
================================================
FILE: .dumi/tmp-production/core/exportStaticRuntimePlugin.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export function modifyClientRenderOpts(memo: any) {
const { history, hydrate } = memo;
return {
...memo,
hydrate: hydrate && !["/~demos/:id"].includes(history.location.pathname),
};
}
================================================
FILE: .dumi/tmp-production/core/helmet.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import React from 'react';
import { HelmetProvider } from '/Users/zhanbo/happy/x-render/node_modules/@umijs/preset-umi/node_modules/@umijs/renderer-react';
import { context } from './helmetContext';
export const innerProvider = (container) => {
return React.createElement(HelmetProvider, { context }, container);
}
================================================
FILE: .dumi/tmp-production/core/helmetContext.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export const context = {};
================================================
FILE: .dumi/tmp-production/core/history.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import { createHashHistory, createMemoryHistory, createBrowserHistory } from '/Users/zhanbo/happy/x-render/node_modules/@umijs/preset-umi/node_modules/@umijs/renderer-react';
import type { UmiHistory } from './historyIntelli';
let history: UmiHistory;
let basename: string = '/';
export function createHistory(opts: any) {
let h;
if (opts.type === 'hash') {
h = createHashHistory();
} else if (opts.type === 'memory') {
h = createMemoryHistory(opts);
} else {
h = createBrowserHistory();
}
if (opts.basename) {
basename = opts.basename;
}
history = {
...h,
push(to, state) {
h.push(patchTo(to, h), state);
},
replace(to, state) {
h.replace(patchTo(to, h), state);
},
get location() {
return h.location;
},
get action() {
return h.action;
}
}
return h;
}
// Patch `to` to support basename
// Refs:
// https://github.com/remix-run/history/blob/3e9dab4/packages/history/index.ts#L484
// https://github.com/remix-run/history/blob/dev/docs/api-reference.md#to
function patchTo(to: any, h: History) {
if (typeof to === 'string') {
return `${stripLastSlash(basename)}${to}`;
} else if (typeof to === 'object') {
const currentPathname = h.location.pathname;
return {
...to,
pathname: to.pathname? `${stripLastSlash(basename)}${to.pathname}` : currentPathname,
};
} else {
throw new Error(`Unexpected to: ${to}`);
}
}
function stripLastSlash(path) {
return path.slice(-1) === '/' ? path.slice(0, -1) : path;
}
export { history };
================================================
FILE: .dumi/tmp-production/core/historyIntelli.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import { getRoutes } from './route'
import type { History } from '/Users/zhanbo/happy/x-render/node_modules/@umijs/preset-umi/node_modules/@umijs/renderer-react'
type Routes = Awaited<ReturnType<typeof getRoutes>>['routes']
type AllRoute = Routes[keyof Routes]
type IsRoot<T extends any> = 'parentId' extends keyof T ? false : true
// show `/` in not `layout / wrapper` only
type GetAllRouteWithoutLayout<Item extends AllRoute> = Item extends any
? 'isWrapper' extends keyof Item
? never
: 'isLayout' extends keyof Item
? never
: Item
: never
type AllRouteWithoutLayout = GetAllRouteWithoutLayout<AllRoute>
type IndexRoutePathname = '/' extends AllRouteWithoutLayout['path']
? '/'
: never
type GetChildrens<T extends any> = T extends any
? IsRoot<T> extends true
? never
: T
: never
type Childrens = GetChildrens<AllRoute>
type Root = Exclude<AllRoute, Childrens>
type AllIds = AllRoute['id']
type GetChildrensByParentId<
Id extends AllIds,
Item = AllRoute
> = Item extends any
? 'parentId' extends keyof Item
? Item['parentId'] extends Id
? Item
: never
: never
: never
type RouteObject<
Id extends AllIds,
Item = GetChildrensByParentId<Id>
> = IsNever<Item> extends true
? ''
: Item extends AllRoute
? {
[Key in Item['path'] as TrimSlash<Key>]: UnionMerge<
RouteObject<Item['id']>
>
}
: never
type GetRootRouteObject<Item extends Root> = Item extends Root
? {
[K in Item['path'] as TrimSlash<K>]: UnionMerge<RouteObject<Item['id']>>
}
: never
type MergedResult = UnionMerge<GetRootRouteObject<Root>>
// --- patch history types ---
type HistoryTo = Parameters<History['push']>['0']
type HistoryPath = Exclude<HistoryTo, string>
type UmiPathname = Path<MergedResult> | (string & {})
interface UmiPath extends HistoryPath {
pathname: UmiPathname
}
type UmiTo = UmiPathname | UmiPath
type UmiPush = (to: UmiTo, state?: any) => void
type UmiReplace = (to: UmiTo, state?: any) => void
export interface UmiHistory extends History {
push: UmiPush
replace: UmiReplace
}
// --- type utils ---
type TrimLeftSlash<T extends string> = T extends `/${infer R}`
? TrimLeftSlash<R>
: T
type TrimRightSlash<T extends string> = T extends `${infer R}/`
? TrimRightSlash<R>
: T
type TrimSlash<T extends string> = TrimLeftSlash<TrimRightSlash<T>>
type IsNever<T> = [T] extends [never] ? true : false
type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends <G>() => G extends B
? 1
: 2
? true
: false
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
k: infer I
) => void
? I
: never
type UnionMerge<U> = UnionToIntersection<U> extends infer O
? { [K in keyof O]: O[K] }
: never
type ExcludeEmptyKey<T> = IsEqual<T, ''> extends true ? never : T
type PathConcat<
TKey extends string,
TValue,
N = TrimSlash<TKey>
> = TValue extends string
? ExcludeEmptyKey<N>
:
| ExcludeEmptyKey<N>
| `${N & string}${IsNever<ExcludeEmptyKey<N>> extends true
? ''
: '/'}${UnionPath<TValue>}`
type UnionPath<T> = {
[K in keyof T]-?: PathConcat<K & string, T[K]>
}[keyof T]
type MakeSureLeftSlash<T> = T extends any
? `/${TrimRightSlash<T & string>}`
: never
// exclude `/*`, because it always at the top of the IDE tip list
type Path<T, K = UnionPath<T>> = Exclude<MakeSureLeftSlash<K>, '/*'> | IndexRoutePathname
================================================
FILE: .dumi/tmp-production/core/plugin.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import * as Plugin_0 from '@@/core/exportStaticRuntimePlugin.ts';
import * as Plugin_1 from '@@/core/helmet.ts';
import * as Plugin_2 from '@@/dumi/meta/runtime.ts';
import * as Plugin_3 from '@@/dumi/locales/runtime.tsx';
import * as Plugin_4 from '@@/dumi/exportStaticRuntimePlugin.ts';
import { PluginManager } from 'umi';
function __defaultExport (obj) {
if (obj.default) {
return typeof obj.default === 'function' ? obj.default() : obj.default
}
return obj;
}
export function getPlugins() {
return [
{
apply: Plugin_0,
path: process.env.NODE_ENV === 'production' ? void 0 : '@@/core/exportStaticRuntimePlugin.ts',
},
{
apply: Plugin_1,
path: process.env.NODE_ENV === 'production' ? void 0 : '@@/core/helmet.ts',
},
{
apply: Plugin_2,
path: process.env.NODE_ENV === 'production' ? void 0 : '@@/dumi/meta/runtime.ts',
},
{
apply: Plugin_3,
path: process.env.NODE_ENV === 'production' ? void 0 : '@@/dumi/locales/runtime.tsx',
},
{
apply: Plugin_4,
path: process.env.NODE_ENV === 'production' ? void 0 : '@@/dumi/exportStaticRuntimePlugin.ts',
},
];
}
export function getValidKeys() {
return ['patchRoutes','patchClientRoutes','modifyContextOpts','modifyClientRenderOpts','rootContainer','innerProvider','i18nProvider','accessProvider','dataflowProvider','outerProvider','render','onRouteChange',];
}
let pluginManager = null;
export function createPluginManager() {
pluginManager = PluginManager.create({
plugins: getPlugins(),
validKeys: getValidKeys(),
});
return pluginManager;
}
export function getPluginManager() {
return pluginManager;
}
================================================
FILE: .dumi/tmp-production/core/pluginConfig.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import { IConfigFromPluginsJoi } from "./pluginConfigJoi.d";
interface IConfigTypes {
codeSplitting: {
jsStrategy: "bigVendors" | "depPerChunk" | "granularChunks";
jsStrategyOptions?: ({
} | undefined);
cssStrategy?: ("mergeAll" | undefined);
cssStrategyOptions?: ({
} | undefined);
};
title: string;
styles: Array<string | {
src?: (string | undefined);
} | {
content?: (string | undefined);
} | { [x: string]: any }>;
scripts: Array<string | {
src?: (string | undefined);
} | {
content?: (string | undefined);
} | { [x: string]: any }>;
routes: Array<{
component?: (string | undefined);
layout?: (false | undefined);
path?: (string | undefined);
redirect?: (string | undefined);
routes?: IConfigTypes['routes'];
wrappers?: (Array<string> | undefined);
} | { [x: string]: any }>;
reactRouter5Compat: boolean | {
};
presets: Array<string>;
plugins: Array<string>;
npmClient: "pnpm" | "tnpm" | "cnpm" | "yarn" | "npm";
mountElementId: string;
metas: Array<{
charset?: (string | undefined);
content?: (string | undefined);
"http-equiv"?: (string | undefined);
name?: (string | undefined);
} | { [x: string]: any }>;
links: Array<{
crossorigin?: (string | undefined);
href?: (string | undefined);
hreflang?: (string | undefined);
media?: (string | undefined);
referrerpolicy?: (string | undefined);
rel?: (string | undefined);
sizes?: (any | undefined);
title?: (any | undefined);
type?: (any | undefined);
} | { [x: string]: any }>;
historyWithQuery: {
};
history: {
type: "browser" | "hash" | "memory";
};
headScripts: Array<string | {
src?: (string | undefined);
} | {
content?: (string | undefined);
} | { [x: string]: any }>;
esbuildMinifyIIFE: boolean;
conventionRoutes: {
base?: (string | undefined);
exclude?: (Array<any> | undefined);
};
base: string;
analyze: {
};
writeToDisk: boolean;
theme: { [x: string]: any };
targets: { [x: string]: any };
svgr: { [x: string]: any };
svgo: { [x: string]: any } | boolean;
styleLoader: { [x: string]: any };
srcTranspilerOptions: {
esbuild?: ({ [x: string]: any } | undefined);
swc?: ({ [x: string]: any } | undefined);
};
srcTranspiler: "babel" | "esbuild" | "swc" | "none";
sassLoader: { [x: string]: any };
runtimePublicPath: {
};
purgeCSS: { [x: string]: any };
publicPath: string;
proxy: { [x: string]: any } | Array<any>;
postcssLoader: { [x: string]: any };
outputPath: string;
normalCSSLoaderModules: { [x: string]: any };
mfsu: {
cacheDirectory?: (string | undefined);
chainWebpack?: (((...args: any[]) => unknown) | undefined);
esbuild?: (boolean | undefined);
exclude?: (Array<string | any> | undefined);
include?: (Array<string> | undefined);
mfName?: (string | undefined);
remoteAliases?: (Array<string> | undefined);
remoteName?: (string | undefined);
runtimePublicPath?: (boolean | undefined);
shared?: ({ [x: string]: any } | undefined);
strategy?: ("eager" | "normal" | undefined);
} | boolean;
mdx: {
loader?: (string | undefined);
loaderOptions?: ({ [x: string]: any } | undefined);
};
manifest: {
basePath?: (string | undefined);
fileName?: (string | undefined);
};
lessLoader: { [x: string]: any };
jsMinifierOptions: { [x: string]: any };
jsMinifier: "esbuild" | "swc" | "terser" | "uglifyJs" | "none";
inlineLimit: number;
ignoreMomentLocale: boolean;
https: {
cert?: (string | undefined);
hosts?: (Array<string> | undefined);
http2?: (boolean | undefined);
key?: (string | undefined);
};
hash: boolean;
forkTSChecker: { [x: string]: any };
fastRefresh: boolean;
extraPostCSSPlugins: Array<any>;
extraBabelPresets: Array<string | Array<any>>;
extraBabelPlugins: Array<string | Array<any>>;
extraBabelIncludes: Array<string | any>;
externals: { [x: string]: any } | string | ((...args: any[]) => unknown);
esm: {
};
devtool: "cheap-source-map" | "cheap-module-source-map" | "eval" | "eval-source-map" | "eval-cheap-source-map" | "eval-cheap-module-source-map" | "eval-nosources-cheap-source-map" | "eval-nosources-cheap-module-source-map" | "eval-nosources-source-map" | "source-map" | "hidden-source-map" | "hidden-nosources-cheap-source-map" | "hidden-nosources-cheap-module-source-map" | "hidden-nosources-source-map" | "hidden-cheap-source-map" | "hidden-cheap-module-source-map" | "inline-source-map" | "inline-cheap-source-map" | "inline-cheap-module-source-map" | "inline-nosources-cheap-source-map" | "inline-nosources-cheap-module-source-map" | "inline-nosources-source-map" | "nosources-source-map" | "nosources-cheap-source-map" | "nosources-cheap-module-source-map" | "#cheap-source-map" | "#cheap-module-source-map" | "#eval" | "#eval-source-map" | "#eval-cheap-source-map" | "#eval-cheap-module-source-map" | "#eval-nosources-cheap-source-map" | "#eval-nosources-cheap-module-source-map" | "#eval-nosources-source-map" | "#source-map" | "#hidden-source-map" | "#hidden-nosources-cheap-source-map" | "#hidden-nosources-cheap-module-source-map" | "#hidden-nosources-source-map" | "#hidden-cheap-source-map" | "#hidden-cheap-module-source-map" | "#inline-source-map" | "#inline-cheap-source-map" | "#inline-cheap-module-source-map" | "#inline-nosources-cheap-source-map" | "#inline-nosources-cheap-module-source-map" | "#inline-nosources-source-map" | "#nosources-source-map" | "#nosources-cheap-source-map" | "#nosources-cheap-module-source-map" | "@cheap-source-map" | "@cheap-module-source-map" | "@eval" | "@eval-source-map" | "@eval-cheap-source-map" | "@eval-cheap-module-source-map" | "@eval-nosources-cheap-source-map" | "@eval-nosources-cheap-module-source-map" | "@eval-nosources-source-map" | "@source-map" | "@hidden-source-map" | "@hidden-nosources-cheap-source-map" | "@hidden-nosources-cheap-module-source-map" | "@hidden-nosources-source-map" | "@hidden-cheap-source-map" | "@hidden-cheap-module-source-map" | "@inline-source-map" | "@inline-cheap-source-map" | "@inline-cheap-module-source-map" | "@inline-nosources-cheap-source-map" | "@inline-nosources-cheap-module-source-map" | "@inline-nosources-source-map" | "@nosources-source-map" | "@nosources-cheap-source-map" | "@nosources-cheap-module-source-map" | "#@cheap-source-map" | "#@cheap-module-source-map" | "#@eval" | "#@eval-source-map" | "#@eval-cheap-source-map" | "#@eval-cheap-module-source-map" | "#@eval-nosources-cheap-source-map" | "#@eval-nosources-cheap-module-source-map" | "#@eval-nosources-source-map" | "#@source-map" | "#@hidden-source-map" | "#@hidden-nosources-cheap-source-map" | "#@hidden-nosources-cheap-module-source-map" | "#@hidden-nosources-source-map" | "#@hidden-cheap-source-map" | "#@hidden-cheap-module-source-map" | "#@inline-source-map" | "#@inline-cheap-source-map" | "#@inline-cheap-module-source-map" | "#@inline-nosources-cheap-source-map" | "#@inline-nosources-cheap-module-source-map" | "#@inline-nosources-source-map" | "#@nosources-source-map" | "#@nosources-cheap-source-map" | "#@nosources-cheap-module-source-map" | boolean;
depTranspiler: "babel" | "esbuild" | "swc" | "none";
define: { [x: string]: any };
deadCode: {
context?: (string | undefined);
detectUnusedExport?: (boolean | undefined);
detectUnusedFiles?: (boolean | undefined);
exclude?: (Array<string> | undefined);
failOnHint?: (boolean | undefined);
patterns?: (Array<string> | undefined);
};
cssMinifierOptions: { [x: string]: any };
cssMinifier: "cssnano" | "esbuild" | "parcelCSS" | "none";
cssLoaderModules: { [x: string]: any };
cssLoader: { [x: string]: any };
copy: Array<{
from: string;
to: string;
} | string>;
cacheDirectoryPath: string;
babelLoaderCustomize: string;
autoprefixer: { [x: string]: any };
autoCSSModules: boolean;
alias: { [x: string]: any };
crossorigin: boolean | {
includes?: (Array<any> | undefined);
};
esmi: {
cdnOrigin: string;
shimUrl?: (string | undefined);
};
exportStatic: {
extraRoutePaths?: (((...args: any[]) => unknown) | Array<string> | undefined);
};
favicons: Array<string>;
helmet: boolean;
icons: {
autoInstall?: ({
} | undefined);
defaultComponentConfig?: ({
} | undefined);
alias?: ({
} | undefined);
include?: (Array<string> | undefined);
};
mock: {
exclude?: (Array<string> | undefined);
include?: (Array<string> | undefined);
};
mpa: {
template?: (string | undefined);
layout?: (string | undefined);
getConfigFromEntryFile?: (boolean | undefined);
entry?: ({
} | undefined);
};
phantomDependency: {
exclude?: (Array<string> | undefined);
};
polyfill: {
imports?: (Array<string> | undefined);
};
routePrefetch: {
};
terminal: {
};
tmpFiles: boolean;
clientLoader: {
};
routeProps: {
};
ssr: {
serverBuildPath?: (string | undefined);
platform?: (string | undefined);
builder?: ("esbuild" | "webpack" | undefined);
};
lowImport: {
libs?: (Array<any> | undefined);
css?: (string | undefined);
};
vite: {
};
apiRoute: {
platform?: (string | undefined);
};
monorepoRedirect: boolean | {
srcDir?: (Array<string> | undefined);
exclude?: (Array<any> | undefined);
peerDeps?: (boolean | undefined);
};
test: {
};
clickToComponent: {
/** 默认情况下,点击将默认编辑器为vscode, 你可以设置编辑器 vscode 或者 vscode-insiders */
editor?: (string | undefined);
};
legacy: {
buildOnly?: (boolean | undefined);
nodeModulesTransform?: (boolean | undefined);
checkOutput?: (boolean | undefined);
};
/** 设置 babel class-properties 启用 loose
@doc https://umijs.org/docs/api/config#classpropertiesloose */
classPropertiesLoose: boolean | {
};
ui: {
};
};
type PrettifyWithCloseable<T> = {
[K in keyof T]: T[K] | false;
} & {};
export type IConfigFromPlugins = PrettifyWithCloseable<
IConfigFromPluginsJoi & Partial<IConfigTypes>
>;
================================================
FILE: .dumi/tmp-production/core/pluginConfigJoi.d.ts
================================================
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
// Created by Umi Plugin
export interface IConfigFromPluginsJoi {
verifyCommit?: {
scope?: string[]
allowEmoji?: boolean
}
run?: {
globals?: string[]
}
logo?: string
themeConfig?: {
}
extraRehypePlugins?: unknown[]
extraRemarkPlugins?: unknown[]
resolve?: {
docDirs?: unknown[]
atomDirs?: {
type?: string
dir?: string
}[]
entityDirs?: unknown
codeBlockMode?: ("active" | "passive")
entryFile?: string
forceKebabCaseRouting?: boolean
}
autoAlias?: boolean
analytics?: ({
baidu?: string
ga?: string
ga_v2?: string
} | boolean)
locales?: ({
id?: string
name?: string
base?: string
}[] | {
id?: string
name?: string
suffix?: ""
}[])
apiParser?: {
unpkgHost?: string
resolveFilter?: (() => any)
parseOptions?: {
}
}
assets?: {
}
sitemap?: {
hostname?: string
exclude?: string[]
}
}
================================================
FILE: .dumi/tmp-production/core/polyfill.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.error.cause.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.aggregate-error.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.aggregate-error.cause.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.array.at.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.array.find-last.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.array.find-last-index.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.array.push.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.array.reduce.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.array.reduce-right.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.object.has-own.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.promise.any.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.reflect.to-string-tag.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.regexp.flags.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.string.at-alternative.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.string.replace-all.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.typed-array.at.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.typed-array.find-last.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.typed-array.find-last-index.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/es.typed-array.set.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.suppressed-error.constructor.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.from-async.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.filter-out.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.filter-reject.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.group.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.group-by.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.group-by-to-map.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.group-to-map.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.is-template-object.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.last-index.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.last-item.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.to-reversed.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.to-sorted.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.to-spliced.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.unique-by.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.array.with.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-disposable-stack.constructor.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.constructor.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.as-indexed-pairs.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.async-dispose.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.drop.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.every.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.filter.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.find.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.flat-map.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.for-each.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.from.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.indexed.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.map.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.reduce.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.some.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.take.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.async-iterator.to-array.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.bigint.range.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.composite-key.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.composite-symbol.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.disposable-stack.constructor.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.function.is-callable.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.function.is-constructor.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.function.un-this.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.constructor.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.as-indexed-pairs.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.dispose.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.drop.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.every.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.filter.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.find.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.flat-map.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.for-each.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.from.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.indexed.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.map.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.reduce.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.some.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.take.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.to-array.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.iterator.to-async.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.delete-all.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.emplace.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.every.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.filter.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.find.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.find-key.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.from.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.group-by.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.includes.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.key-by.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.key-of.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.map-keys.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.map-values.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.merge.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.of.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.reduce.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.some.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.update.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.update-or-insert.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.map.upsert.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.clamp.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.deg-per-rad.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.degrees.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.fscale.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.iaddh.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.imulh.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.isubh.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.rad-per-deg.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.radians.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.scale.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.seeded-prng.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.signbit.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.math.umulh.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.number.from-string.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.number.range.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.object.iterate-entries.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.object.iterate-keys.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.object.iterate-values.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.observable.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.promise.try.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.define-metadata.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.delete-metadata.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.get-metadata.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.get-metadata-keys.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.get-own-metadata.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.get-own-metadata-keys.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.has-metadata.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.has-own-metadata.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.reflect.metadata.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.add-all.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.delete-all.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.difference.v2.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.difference.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.every.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.filter.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.find.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.from.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.intersection.v2.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.intersection.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.is-disjoint-from.v2.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.is-disjoint-from.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.is-subset-of.v2.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.is-subset-of.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.is-superset-of.v2.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.is-superset-of.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.join.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.map.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.of.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.reduce.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.some.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.symmetric-difference.v2.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.symmetric-difference.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.union.v2.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.set.union.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.string.at.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.string.cooked.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.string.code-points.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.string.dedent.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.string.is-well-formed.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.string.to-well-formed.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.symbol.async-dispose.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.symbol.dispose.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.symbol.matcher.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.symbol.metadata.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.symbol.metadata-key.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.symbol.observable.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.symbol.pattern-match.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.symbol.replace-all.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.from-async.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.filter-out.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.filter-reject.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.group-by.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.to-reversed.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.to-sorted.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.to-spliced.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.unique-by.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.typed-array.with.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-map.delete-all.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-map.from.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-map.of.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-map.emplace.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-map.upsert.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-set.add-all.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-set.delete-all.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-set.from.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/esnext.weak-set.of.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/web.dom-exception.stack.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/web.immediate.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/web.self.js";
import "/Users/zhanbo/happy/x-render/node_modules/core-js/modules/web.structured-clone.js";
import '/Users/zhanbo/happy/x-render/node_modules/regenerator-runtime/runtime.js';
export {};
================================================
FILE: .dumi/tmp-production/core/route.tsx
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import React from 'react';
export async function getRoutes() {
const routes = {"404":{"id":"404","path":"*","parentId":"DocLayout"},"GlobalLayout":{"id":"GlobalLayout","path":"/","parentId":"dumi-context-layout","isLayout":true},"dumi-context-layout":{"id":"dumi-context-layout","path":"/","isLayout":true},"DocLayout":{"id":"DocLayout","path":"/","parentId":"GlobalLayout","isLayout":true},"docs/chart-render/0.1.X/demo/pivot-table":{"path":"chart-render/0/1/x/demo/pivot-table","id":"docs/chart-render/0.1.X/demo/pivot-table","parentId":"DocLayout"},"docs/form-render/advanced-slimrender":{"path":"form-render/advanced-slimrender","id":"docs/form-render/advanced-slimrender","parentId":"DocLayout"},"docs/form-render/demo/disaply-column":{"path":"form-render/demo/disaply-column","id":"docs/form-render/demo/disaply-column","parentId":"DocLayout"},"docs/chart-render/0.1.X/demo/column":{"path":"chart-render/0/1/x/demo/column","id":"docs/chart-render/0.1.X/demo/column","parentId":"DocLayout"},"docs/form-render/advanced-validate":{"path":"form-render/advanced-validate","id":"docs/form-render/advanced-validate","parentId":"DocLayout"},"docs/chart-render/0.1.X/demo/line":{"path":"chart-render/0/1/x/demo/line","id":"docs/chart-render/0.1.X/demo/line","parentId":"DocLayout"},"docs/form-render/advanced-linkage":{"path":"form-render/advanced-linkage","id":"docs/form-render/advanced-linkage","parentId":"DocLayout"},"docs/table-render/promptly-search":{"path":"table-render/promptly-search","id":"docs/table-render/promptly-search","parentId":"DocLayout"},"docs/form-render/advaced-example":{"path":"form-render/advaced-example","id":"docs/form-render/advaced-example","parentId":"DocLayout"},"docs/form-render/advanced-layout":{"path":"form-render/advanced-layout","id":"docs/form-render/advanced-layout","parentId":"DocLayout"},"docs/form-render/advanced-widget":{"path":"form-render/advanced-widget","id":"docs/form-render/advanced-widget","parentId":"DocLayout"},"docs/chart-render/widget/custom":{"path":"chart-render/widget/custom","id":"docs/chart-render/widget/custom","parentId":"DocLayout"},"docs/form-render/disaply-search":{"path":"form-render/disaply-search","id":"docs/form-render/disaply-search","parentId":"DocLayout"},"docs/form-render/advanced-path":{"path":"form-render/advanced-path","id":"docs/form-render/advanced-path","parentId":"DocLayout"},"docs/table-render/custom-table":{"path":"table-render/custom-table","id":"docs/table-render/custom-table","parentId":"DocLayout"},"docs/chart-render/0.1.X/index":{"path":"chart-render/0/1/x","id":"docs/chart-render/0.1.X/index","parentId":"DocLayout"},"docs/chart-render/widget/line":{"path":"chart-render/widget/line","id":"docs/chart-render/widget/line","parentId":"DocLayout"},"docs/form-render/disaply-row":{"path":"form-render/disaply-row","id":"docs/form-render/disaply-row","parentId":"DocLayout"},"docs/chart-render/0.1.X/faq":{"path":"chart-render/0/1/x/faq","id":"docs/chart-render/0.1.X/faq","parentId":"DocLayout"},"docs/form-render/api-schema":{"path":"form-render/api-schema","id":"docs/form-render/api-schema","parentId":"DocLayout"},"docs/table-render/collapsed":{"path":"table-render/collapsed","id":"docs/table-render/collapsed","parentId":"DocLayout"},"docs/table-render/valueType":{"path":"table-render/value-type","id":"docs/table-render/valueType","parentId":"DocLayout"},"docs/form-render/api-props":{"path":"form-render/api-props","id":"docs/form-render/api-props","parentId":"DocLayout"},"docs/form-render/changelog":{"path":"form-render/changelog","id":"docs/form-render/changelog","parentId":"DocLayout"},"docs/form-render/demo/demo":{"path":"form-render/demo/demo","id":"docs/form-render/demo/demo","parentId":"DocLayout"},"docs/table-render/noSearch":{"path":"table-render/no-search","id":"docs/table-render/noSearch","parentId":"DocLayout"},"docs/tools/proptypes/index":{"path":"tools/proptypes","id":"docs/tools/proptypes/index","parentId":"DocLayout"},"docs/generator/playground":{"path":"generator/playground","id":"docs/generator/playground","parentId":"DocLayout"},"docs/table-render/migrate":{"path":"table-render/migrate","id":"docs/table-render/migrate","parentId":"DocLayout"},"docs/form-render/migrate":{"path":"form-render/migrate","id":"docs/form-render/migrate","parentId":"DocLayout"},"docs/table-render/norBar":{"path":"table-render/nor-bar","id":"docs/table-render/norBar","parentId":"DocLayout"},"docs/chart-render/index":{"path":"chart-render","id":"docs/chart-render/index","parentId":"DocLayout"},"docs/table-render/basic":{"path":"table-render/basic","id":"docs/table-render/basic","parentId":"DocLayout"},"docs/table-render/index":{"path":"table-render","id":"docs/table-render/index","parentId":"DocLayout"},"docs/tools/vscode/index":{"path":"tools/vscode","id":"docs/tools/vscode/index","parentId":"DocLayout"},"docs/chart-render/demo":{"path":"chart-render/demo","id":"docs/chart-render/demo","parentId":"DocLayout"},"docs/form-render/index":{"path":"form-render","id":"docs/form-render/index","parentId":"DocLayout"},"docs/table-render/tabs":{"path":"table-render/tabs","id":"docs/table-render/tabs","parentId":"DocLayout"},"docs/chart-render/faq":{"path":"chart-render/faq","id":"docs/chart-render/faq","parentId":"DocLayout"},"docs/playground/index":{"path":"playground","id":"docs/playground/index","parentId":"DocLayout"},"docs/table-render/api":{"path":"table-render/api","id":"docs/table-render/api","parentId":"DocLayout"},"docs/form-render/faq":{"path":"form-render/faq","id":"docs/form-render/faq","parentId":"DocLayout"},"docs/generator/index":{"path":"generator","id":"docs/generator/index","parentId":"DocLayout"},"docs/generator/demo":{"path":"generator/demo","id":"docs/generator/demo","parentId":"DocLayout"},"docs/generator/faq":{"path":"generator/faq","id":"docs/generator/faq","parentId":"DocLayout"},"docs/index.en-US":{"path":"index/en--us","id":"docs/index.en-US","parentId":"DocLayout"},"docs/index.zh-CN":{"path":"","id":"docs/index.zh-CN","parentId":"DocLayout"},"demo-render":{"id":"demo-render","path":"~demos/:id","parentId":"GlobalLayout","prerender":false}} as const;
return {
routes,
routeComponents: {
'404': React.lazy(() => import(/* webpackChunkName: "nm__dumi__dist__client__pages__404" */'/Users/zhanbo/happy/x-render/node_modules/dumi/dist/client/pages/404.js')),
'GlobalLayout': React.lazy(() => import(/* webpackChunkName: "dumi__theme__layouts__GlobalLayout__index" */'/Users/zhanbo/happy/x-render/.dumi/theme/layouts/GlobalLayout/index.tsx')),
'dumi-context-layout': React.lazy(() => import(/* webpackChunkName: "dumi__tmp-production__dumi__theme__ContextWrapper" */'/Users/zhanbo/happy/x-render/.dumi/tmp-production/dumi/theme/ContextWrapper.tsx')),
'DocLayout': React.lazy(() => import(/* webpackChunkName: "nm__dumi__theme-default__layouts__DocLayout__index" */'/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/layouts/DocLayout/index.js')),
'docs/chart-render/0.1.X/demo/pivot-table': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__0.1.X__demo__pivot-table.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/demo/pivot-table.md')),
'docs/form-render/advanced-slimrender': React.lazy(() => import(/* webpackChunkName: "docs__form-render__advanced-slimrender.md" */'/Users/zhanbo/happy/x-render/docs/form-render/advanced-slimrender.md')),
'docs/form-render/demo/disaply-column': React.lazy(() => import(/* webpackChunkName: "docs__form-render__demo__disaply-column.md" */'/Users/zhanbo/happy/x-render/docs/form-render/demo/disaply-column.md')),
'docs/chart-render/0.1.X/demo/column': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__0.1.X__demo__column.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/demo/column.md')),
'docs/form-render/advanced-validate': React.lazy(() => import(/* webpackChunkName: "docs__form-render__advanced-validate.md" */'/Users/zhanbo/happy/x-render/docs/form-render/advanced-validate.md')),
'docs/chart-render/0.1.X/demo/line': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__0.1.X__demo__line.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/demo/line.md')),
'docs/form-render/advanced-linkage': React.lazy(() => import(/* webpackChunkName: "docs__form-render__advanced-linkage.md" */'/Users/zhanbo/happy/x-render/docs/form-render/advanced-linkage.md')),
'docs/table-render/promptly-search': React.lazy(() => import(/* webpackChunkName: "docs__table-render__promptly-search.md" */'/Users/zhanbo/happy/x-render/docs/table-render/promptly-search.md')),
'docs/form-render/advaced-example': React.lazy(() => import(/* webpackChunkName: "docs__form-render__advaced-example.md" */'/Users/zhanbo/happy/x-render/docs/form-render/advaced-example.md')),
'docs/form-render/advanced-layout': React.lazy(() => import(/* webpackChunkName: "docs__form-render__advanced-layout.md" */'/Users/zhanbo/happy/x-render/docs/form-render/advanced-layout.md')),
'docs/form-render/advanced-widget': React.lazy(() => import(/* webpackChunkName: "docs__form-render__advanced-widget.md" */'/Users/zhanbo/happy/x-render/docs/form-render/advanced-widget.md')),
'docs/chart-render/widget/custom': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__widget__custom.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/widget/custom.md')),
'docs/form-render/disaply-search': React.lazy(() => import(/* webpackChunkName: "docs__form-render__disaply-search.md" */'/Users/zhanbo/happy/x-render/docs/form-render/disaply-search.md')),
'docs/form-render/advanced-path': React.lazy(() => import(/* webpackChunkName: "docs__form-render__advanced-path.md" */'/Users/zhanbo/happy/x-render/docs/form-render/advanced-path.md')),
'docs/table-render/custom-table': React.lazy(() => import(/* webpackChunkName: "docs__table-render__custom-table.md" */'/Users/zhanbo/happy/x-render/docs/table-render/custom-table.md')),
'docs/chart-render/0.1.X/index': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__0.1.X__index.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/index.md')),
'docs/chart-render/widget/line': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__widget__line.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/widget/line.md')),
'docs/form-render/disaply-row': React.lazy(() => import(/* webpackChunkName: "docs__form-render__disaply-row.md" */'/Users/zhanbo/happy/x-render/docs/form-render/disaply-row.md')),
'docs/chart-render/0.1.X/faq': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__0.1.X__faq.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/faq.md')),
'docs/form-render/api-schema': React.lazy(() => import(/* webpackChunkName: "docs__form-render__api-schema.md" */'/Users/zhanbo/happy/x-render/docs/form-render/api-schema.md')),
'docs/table-render/collapsed': React.lazy(() => import(/* webpackChunkName: "docs__table-render__collapsed.md" */'/Users/zhanbo/happy/x-render/docs/table-render/collapsed.md')),
'docs/table-render/valueType': React.lazy(() => import(/* webpackChunkName: "docs__table-render__valueType.md" */'/Users/zhanbo/happy/x-render/docs/table-render/valueType.md')),
'docs/form-render/api-props': React.lazy(() => import(/* webpackChunkName: "docs__form-render__api-props.md" */'/Users/zhanbo/happy/x-render/docs/form-render/api-props.md')),
'docs/form-render/changelog': React.lazy(() => import(/* webpackChunkName: "docs__form-render__changelog.md" */'/Users/zhanbo/happy/x-render/docs/form-render/changelog.md')),
'docs/form-render/demo/demo': React.lazy(() => import(/* webpackChunkName: "docs__form-render__demo__demo.md" */'/Users/zhanbo/happy/x-render/docs/form-render/demo/demo.md')),
'docs/table-render/noSearch': React.lazy(() => import(/* webpackChunkName: "docs__table-render__noSearch.md" */'/Users/zhanbo/happy/x-render/docs/table-render/noSearch.md')),
'docs/tools/proptypes/index': React.lazy(() => import(/* webpackChunkName: "docs__tools__proptypes__index.md" */'/Users/zhanbo/happy/x-render/docs/tools/proptypes/index.md')),
'docs/generator/playground': React.lazy(() => import(/* webpackChunkName: "docs__generator__playground.md" */'/Users/zhanbo/happy/x-render/docs/generator/playground.md')),
'docs/table-render/migrate': React.lazy(() => import(/* webpackChunkName: "docs__table-render__migrate.md" */'/Users/zhanbo/happy/x-render/docs/table-render/migrate.md')),
'docs/form-render/migrate': React.lazy(() => import(/* webpackChunkName: "docs__form-render__migrate.md" */'/Users/zhanbo/happy/x-render/docs/form-render/migrate.md')),
'docs/table-render/norBar': React.lazy(() => import(/* webpackChunkName: "docs__table-render__norBar.md" */'/Users/zhanbo/happy/x-render/docs/table-render/norBar.md')),
'docs/chart-render/index': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__index.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/index.md')),
'docs/table-render/basic': React.lazy(() => import(/* webpackChunkName: "docs__table-render__basic.md" */'/Users/zhanbo/happy/x-render/docs/table-render/basic.md')),
'docs/table-render/index': React.lazy(() => import(/* webpackChunkName: "docs__table-render__index.md" */'/Users/zhanbo/happy/x-render/docs/table-render/index.md')),
'docs/tools/vscode/index': React.lazy(() => import(/* webpackChunkName: "docs__tools__vscode__index.md" */'/Users/zhanbo/happy/x-render/docs/tools/vscode/index.md')),
'docs/chart-render/demo': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__demo.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/demo.md')),
'docs/form-render/index': React.lazy(() => import(/* webpackChunkName: "docs__form-render__index.md" */'/Users/zhanbo/happy/x-render/docs/form-render/index.md')),
'docs/table-render/tabs': React.lazy(() => import(/* webpackChunkName: "docs__table-render__tabs.md" */'/Users/zhanbo/happy/x-render/docs/table-render/tabs.md')),
'docs/chart-render/faq': React.lazy(() => import(/* webpackChunkName: "docs__chart-render__faq.md" */'/Users/zhanbo/happy/x-render/docs/chart-render/faq.md')),
'docs/playground/index': React.lazy(() => import(/* webpackChunkName: "docs__playground__index.md" */'/Users/zhanbo/happy/x-render/docs/playground/index.md')),
'docs/table-render/api': React.lazy(() => import(/* webpackChunkName: "docs__table-render__api.md" */'/Users/zhanbo/happy/x-render/docs/table-render/api.md')),
'docs/form-render/faq': React.lazy(() => import(/* webpackChunkName: "docs__form-render__faq.md" */'/Users/zhanbo/happy/x-render/docs/form-render/faq.md')),
'docs/generator/index': React.lazy(() => import(/* webpackChunkName: "docs__generator__index.md" */'/Users/zhanbo/happy/x-render/docs/generator/index.md')),
'docs/generator/demo': React.lazy(() => import(/* webpackChunkName: "docs__generator__demo.md" */'/Users/zhanbo/happy/x-render/docs/generator/demo.md')),
'docs/generator/faq': React.lazy(() => import(/* webpackChunkName: "docs__generator__faq.md" */'/Users/zhanbo/happy/x-render/docs/generator/faq.md')),
'docs/index.en-US': React.lazy(() => import(/* webpackChunkName: "docs__index.en-US.md" */'/Users/zhanbo/happy/x-render/docs/index.en-US.md')),
'docs/index.zh-CN': React.lazy(() => import(/* webpackChunkName: "docs__index.zh-CN.md" */'/Users/zhanbo/happy/x-render/docs/index.zh-CN.md')),
'demo-render': React.lazy(() => import(/* webpackChunkName: "nm__dumi__dist__client__pages__Demo__index" */'/Users/zhanbo/happy/x-render/node_modules/dumi/dist/client/pages/Demo/index.js')),
},
};
}
================================================
FILE: .dumi/tmp-production/core/terminal.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
let count = 0;
let groupLevel = 0;
function send(type: string, message?: string) {
if(process.env.NODE_ENV==='production'){
return;
}else{
const encodedMessage = message ? `&m=${encodeURI(message)}` : '';
fetch(`/__umi/api/terminal?type=${type}&t=${Date.now()}&c=${count++}&g=${groupLevel}${encodedMessage}`, { mode: 'no-cors' })
}
}
function prettyPrint(obj: any) {
return JSON.stringify(obj, null, 2);
}
function stringifyObjs(objs: any[]) {
const obj = objs.length > 1 ? objs.map(stringify).join(' ') : objs[0];
return typeof obj === 'object' ? `${prettyPrint(obj)}` : obj.toString();
}
function stringify(obj: any) {
return typeof obj === 'object' ? `${JSON.stringify(obj)}` : obj.toString();
}
const terminal = {
log(...objs: any[]) { send('log', stringifyObjs(objs)) },
info(...objs: any[]) { send('info', stringifyObjs(objs)) },
warn(...objs: any[]) { send('warn', stringifyObjs(objs)) },
error(...objs: any[]) { send('error', stringifyObjs(objs)) },
group() { groupLevel++ },
groupCollapsed() { groupLevel++ },
groupEnd() { groupLevel && --groupLevel },
clear() { send('clear') },
trace(...args: any[]) { console.trace(...args) },
profile(...args: any[]) { console.profile(...args) },
profileEnd(...args: any[]) { console.profileEnd(...args) },
};
export { terminal };
================================================
FILE: .dumi/tmp-production/dumi/exportStaticRuntimePlugin.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export function modifyClientRenderOpts(memo: any) {
const { history, hydrate } = memo;
return {
...memo,
hydrate: hydrate && !history.location.pathname.startsWith('/~demos'),
};
}
================================================
FILE: .dumi/tmp-production/dumi/exports.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export * from '../exports';
export * from '/Users/zhanbo/happy/x-render/node_modules/dumi/dist/client/theme-api/index.js';
================================================
FILE: .dumi/tmp-production/dumi/locales/config.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export const locales = [
{
"id": "zh-CN",
"name": "中文",
"base": "/"
}
];
export const messages = {
"en-US": {
"header.search.placeholder": "Type keywords...",
"header.color.mode.light": "Light Mode",
"header.color.mode.dark": "Dark Mode",
"header.color.mode.auto": "Follow System",
"header.social.github": "GitHub",
"header.social.weibo": "Weibo",
"header.social.twitter": "Twitter",
"header.social.gitlab": "GitLab",
"header.social.facebook": "Facebook",
"header.social.zhihu": "Zhihu",
"header.social.yuque": "Yuque",
"header.social.linkedin": "Linkedin",
"previewer.actions.code.expand": "Show Code",
"previewer.actions.code.shrink": "Hide Code",
"previewer.actions.codesandbox": "Open in CodeSandbox",
"previewer.actions.codepen": "Open in CodePen (Not implemented)",
"previewer.actions.stackblitz": "Open in StackBlitz",
"previewer.actions.separate": "Open in separate page",
"404.title": "PAGE NOT FOUND",
"404.back": "Back to homepage",
"api.component.name": "Name",
"api.component.description": "Description",
"api.component.type": "Type",
"api.component.default": "Default",
"api.component.required": "(required)",
"api.component.unavailable": "apiParser must be enabled to use auto-generated API",
"api.component.loading": "Properties definition is resolving, wait a moment...",
"api.component.not.found": "Properties definition not found for {id} component",
"content.tabs.default": "Doc",
"search.not.found": "No content was found",
"layout.sidebar.btn": "Sidebar"
},
"zh-CN": {
"header.search.placeholder": "输入关键字搜索...",
"header.color.mode.light": "亮色模式",
"header.color.mode.dark": "暗色模式",
"header.color.mode.auto": "跟随系统",
"header.social.github": "GitHub",
"header.social.weibo": "微博",
"header.social.twitter": "Twitter",
"header.social.gitlab": "GitLab",
"header.social.facebook": "Facebook",
"header.social.zhihu": "知乎",
"header.social.yuque": "语雀",
"header.social.linkedin": "Linkedin",
"previewer.actions.code.expand": "展开代码",
"previewer.actions.code.shrink": "收起代码",
"previewer.actions.codesandbox": "在 CodeSandbox 中打开",
"previewer.actions.codepen": "在 CodePen 中打开(未实现)",
"previewer.actions.stackblitz": "在 StackBlitz 中打开",
"previewer.actions.separate": "在独立页面中打开",
"404.title": "页面未找到",
"404.back": "返回首页",
"api.component.name": "属性名",
"api.component.description": "描述",
"api.component.type": "类型",
"api.component.default": "默认值",
"api.component.required": "(必选)",
"api.component.unavailable": "必须启用 apiParser 才能使用自动 API 特性",
"api.component.loading": "属性定义正在解析中,稍等片刻...",
"api.component.not.found": "未找到 {id} 组件的属性定义",
"content.tabs.default": "文档",
"search.not.found": "未找到相关内容",
"layout.sidebar.btn": "侧边菜单"
}
};
================================================
FILE: .dumi/tmp-production/dumi/locales/runtime.tsx
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import { history } from 'dumi';
import React, { useState, useLayoutEffect, useCallback, type ReactNode } from 'react';
import { RawIntlProvider, createIntl, createIntlCache } from '/Users/zhanbo/happy/x-render/node_modules/react-intl';
import { useIsomorphicLayoutEffect } from '/Users/zhanbo/happy/x-render/node_modules/dumi/dist/client/theme-api/utils.js'
import { locales, messages } from './config';
const cache = createIntlCache();
const LocalesContainer: FC<{ children: ReactNode }> = (props) => {
const getIntl = useCallback(() => {
const matched = locales.slice().reverse().find((locale) => (
'suffix' in locale
// suffix mode
? history.location.pathname.replace(/([^/])\/$/, '$1').endsWith(locale.suffix)
// base mode
: history.location.pathname.replace(/([^/])\/$/, '$1').startsWith(locale.base)
));
const locale = matched ? matched.id : locales[0].id;
return createIntl({ locale, messages: messages[locale] || {} }, cache);
}, []);
const [intl, setIntl] = useState(() => getIntl());
useIsomorphicLayoutEffect(() => {
return history.listen(() => {
setIntl(getIntl());
});
}, []);
return <RawIntlProvider value={intl} key={intl.locale}>{props.children}</RawIntlProvider>;
}
export function i18nProvider(container: Element) {
return React.createElement(LocalesContainer, null, container);
}
================================================
FILE: .dumi/tmp-production/dumi/meta/atoms.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export const components = null;
================================================
FILE: .dumi/tmp-production/dumi/meta/index.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import { demos as dm0, frontmatter as fm0, toc as toc0, texts as txt0 } from '/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/demo/pivot-table.md?type=meta';
import { demos as dm1, frontmatter as fm1, toc as toc1, texts as txt1 } from '/Users/zhanbo/happy/x-render/docs/form-render/advanced-slimrender.md?type=meta';
import { demos as dm2, frontmatter as fm2, toc as toc2, texts as txt2 } from '/Users/zhanbo/happy/x-render/docs/form-render/demo/disaply-column.md?type=meta';
import { demos as dm3, frontmatter as fm3, toc as toc3, texts as txt3 } from '/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/demo/column.md?type=meta';
import { demos as dm4, frontmatter as fm4, toc as toc4, texts as txt4 } from '/Users/zhanbo/happy/x-render/docs/form-render/advanced-validate.md?type=meta';
import { demos as dm5, frontmatter as fm5, toc as toc5, texts as txt5 } from '/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/demo/line.md?type=meta';
import { demos as dm6, frontmatter as fm6, toc as toc6, texts as txt6 } from '/Users/zhanbo/happy/x-render/docs/form-render/advanced-linkage.md?type=meta';
import { demos as dm7, frontmatter as fm7, toc as toc7, texts as txt7 } from '/Users/zhanbo/happy/x-render/docs/table-render/promptly-search.md?type=meta';
import { demos as dm8, frontmatter as fm8, toc as toc8, texts as txt8 } from '/Users/zhanbo/happy/x-render/docs/form-render/advaced-example.md?type=meta';
import { demos as dm9, frontmatter as fm9, toc as toc9, texts as txt9 } from '/Users/zhanbo/happy/x-render/docs/form-render/advanced-layout.md?type=meta';
import { demos as dm10, frontmatter as fm10, toc as toc10, texts as txt10 } from '/Users/zhanbo/happy/x-render/docs/form-render/advanced-widget.md?type=meta';
import { demos as dm11, frontmatter as fm11, toc as toc11, texts as txt11 } from '/Users/zhanbo/happy/x-render/docs/chart-render/widget/custom.md?type=meta';
import { demos as dm12, frontmatter as fm12, toc as toc12, texts as txt12 } from '/Users/zhanbo/happy/x-render/docs/form-render/disaply-search.md?type=meta';
import { demos as dm13, frontmatter as fm13, toc as toc13, texts as txt13 } from '/Users/zhanbo/happy/x-render/docs/form-render/advanced-path.md?type=meta';
import { demos as dm14, frontmatter as fm14, toc as toc14, texts as txt14 } from '/Users/zhanbo/happy/x-render/docs/table-render/custom-table.md?type=meta';
import { demos as dm15, frontmatter as fm15, toc as toc15, texts as txt15 } from '/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/index.md?type=meta';
import { demos as dm16, frontmatter as fm16, toc as toc16, texts as txt16 } from '/Users/zhanbo/happy/x-render/docs/chart-render/widget/line.md?type=meta';
import { demos as dm17, frontmatter as fm17, toc as toc17, texts as txt17 } from '/Users/zhanbo/happy/x-render/docs/form-render/disaply-row.md?type=meta';
import { demos as dm18, frontmatter as fm18, toc as toc18, texts as txt18 } from '/Users/zhanbo/happy/x-render/docs/chart-render/0.1.X/faq.md?type=meta';
import { demos as dm19, frontmatter as fm19, toc as toc19, texts as txt19 } from '/Users/zhanbo/happy/x-render/docs/form-render/api-schema.md?type=meta';
import { demos as dm20, frontmatter as fm20, toc as toc20, texts as txt20 } from '/Users/zhanbo/happy/x-render/docs/table-render/collapsed.md?type=meta';
import { demos as dm21, frontmatter as fm21, toc as toc21, texts as txt21 } from '/Users/zhanbo/happy/x-render/docs/table-render/valueType.md?type=meta';
import { demos as dm22, frontmatter as fm22, toc as toc22, texts as txt22 } from '/Users/zhanbo/happy/x-render/docs/form-render/api-props.md?type=meta';
import { demos as dm23, frontmatter as fm23, toc as toc23, texts as txt23 } from '/Users/zhanbo/happy/x-render/docs/form-render/changelog.md?type=meta';
import { demos as dm24, frontmatter as fm24, toc as toc24, texts as txt24 } from '/Users/zhanbo/happy/x-render/docs/form-render/demo/demo.md?type=meta';
import { demos as dm25, frontmatter as fm25, toc as toc25, texts as txt25 } from '/Users/zhanbo/happy/x-render/docs/table-render/noSearch.md?type=meta';
import { demos as dm26, frontmatter as fm26, toc as toc26, texts as txt26 } from '/Users/zhanbo/happy/x-render/docs/tools/proptypes/index.md?type=meta';
import { demos as dm27, frontmatter as fm27, toc as toc27, texts as txt27 } from '/Users/zhanbo/happy/x-render/docs/generator/playground.md?type=meta';
import { demos as dm28, frontmatter as fm28, toc as toc28, texts as txt28 } from '/Users/zhanbo/happy/x-render/docs/table-render/migrate.md?type=meta';
import { demos as dm29, frontmatter as fm29, toc as toc29, texts as txt29 } from '/Users/zhanbo/happy/x-render/docs/form-render/migrate.md?type=meta';
import { demos as dm30, frontmatter as fm30, toc as toc30, texts as txt30 } from '/Users/zhanbo/happy/x-render/docs/table-render/norBar.md?type=meta';
import { demos as dm31, frontmatter as fm31, toc as toc31, texts as txt31 } from '/Users/zhanbo/happy/x-render/docs/chart-render/index.md?type=meta';
import { demos as dm32, frontmatter as fm32, toc as toc32, texts as txt32 } from '/Users/zhanbo/happy/x-render/docs/table-render/basic.md?type=meta';
import { demos as dm33, frontmatter as fm33, toc as toc33, texts as txt33 } from '/Users/zhanbo/happy/x-render/docs/table-render/index.md?type=meta';
import { demos as dm34, frontmatter as fm34, toc as toc34, texts as txt34 } from '/Users/zhanbo/happy/x-render/docs/tools/vscode/index.md?type=meta';
import { demos as dm35, frontmatter as fm35, toc as toc35, texts as txt35 } from '/Users/zhanbo/happy/x-render/docs/chart-render/demo.md?type=meta';
import { demos as dm36, frontmatter as fm36, toc as toc36, texts as txt36 } from '/Users/zhanbo/happy/x-render/docs/form-render/index.md?type=meta';
import { demos as dm37, frontmatter as fm37, toc as toc37, texts as txt37 } from '/Users/zhanbo/happy/x-render/docs/table-render/tabs.md?type=meta';
import { demos as dm38, frontmatter as fm38, toc as toc38, texts as txt38 } from '/Users/zhanbo/happy/x-render/docs/chart-render/faq.md?type=meta';
import { demos as dm39, frontmatter as fm39, toc as toc39, texts as txt39 } from '/Users/zhanbo/happy/x-render/docs/playground/index.md?type=meta';
import { demos as dm40, frontmatter as fm40, toc as toc40, texts as txt40 } from '/Users/zhanbo/happy/x-render/docs/table-render/api.md?type=meta';
import { demos as dm41, frontmatter as fm41, toc as toc41, texts as txt41 } from '/Users/zhanbo/happy/x-render/docs/form-render/faq.md?type=meta';
import { demos as dm42, frontmatter as fm42, toc as toc42, texts as txt42 } from '/Users/zhanbo/happy/x-render/docs/generator/index.md?type=meta';
import { demos as dm43, frontmatter as fm43, toc as toc43, texts as txt43 } from '/Users/zhanbo/happy/x-render/docs/generator/demo.md?type=meta';
import { demos as dm44, frontmatter as fm44, toc as toc44, texts as txt44 } from '/Users/zhanbo/happy/x-render/docs/generator/faq.md?type=meta';
import { demos as dm45, frontmatter as fm45, toc as toc45, texts as txt45 } from '/Users/zhanbo/happy/x-render/docs/index.en-US.md?type=meta';
import { demos as dm46, frontmatter as fm46, toc as toc46, texts as txt46 } from '/Users/zhanbo/happy/x-render/docs/index.zh-CN.md?type=meta';
export { components } from './atoms';
export { tabs } from './tabs';
export const filesMeta = {
'docs/chart-render/0.1.X/demo/pivot-table': {
frontmatter: fm0,
toc: toc0,
texts: txt0,
demos: dm0,
},
'docs/form-render/advanced-slimrender': {
frontmatter: fm1,
toc: toc1,
texts: txt1,
demos: dm1,
},
'docs/form-render/demo/disaply-column': {
frontmatter: fm2,
toc: toc2,
texts: txt2,
demos: dm2,
},
'docs/chart-render/0.1.X/demo/column': {
frontmatter: fm3,
toc: toc3,
texts: txt3,
demos: dm3,
},
'docs/form-render/advanced-validate': {
frontmatter: fm4,
toc: toc4,
texts: txt4,
demos: dm4,
},
'docs/chart-render/0.1.X/demo/line': {
frontmatter: fm5,
toc: toc5,
texts: txt5,
demos: dm5,
},
'docs/form-render/advanced-linkage': {
frontmatter: fm6,
toc: toc6,
texts: txt6,
demos: dm6,
},
'docs/table-render/promptly-search': {
frontmatter: fm7,
toc: toc7,
texts: txt7,
demos: dm7,
},
'docs/form-render/advaced-example': {
frontmatter: fm8,
toc: toc8,
texts: txt8,
demos: dm8,
},
'docs/form-render/advanced-layout': {
frontmatter: fm9,
toc: toc9,
texts: txt9,
demos: dm9,
},
'docs/form-render/advanced-widget': {
frontmatter: fm10,
toc: toc10,
texts: txt10,
demos: dm10,
},
'docs/chart-render/widget/custom': {
frontmatter: fm11,
toc: toc11,
texts: txt11,
demos: dm11,
},
'docs/form-render/disaply-search': {
frontmatter: fm12,
toc: toc12,
texts: txt12,
demos: dm12,
},
'docs/form-render/advanced-path': {
frontmatter: fm13,
toc: toc13,
texts: txt13,
demos: dm13,
},
'docs/table-render/custom-table': {
frontmatter: fm14,
toc: toc14,
texts: txt14,
demos: dm14,
},
'docs/chart-render/0.1.X/index': {
frontmatter: fm15,
toc: toc15,
texts: txt15,
demos: dm15,
},
'docs/chart-render/widget/line': {
frontmatter: fm16,
toc: toc16,
texts: txt16,
demos: dm16,
},
'docs/form-render/disaply-row': {
frontmatter: fm17,
toc: toc17,
texts: txt17,
demos: dm17,
},
'docs/chart-render/0.1.X/faq': {
frontmatter: fm18,
toc: toc18,
texts: txt18,
demos: dm18,
},
'docs/form-render/api-schema': {
frontmatter: fm19,
toc: toc19,
texts: txt19,
demos: dm19,
},
'docs/table-render/collapsed': {
frontmatter: fm20,
toc: toc20,
texts: txt20,
demos: dm20,
},
'docs/table-render/valueType': {
frontmatter: fm21,
toc: toc21,
texts: txt21,
demos: dm21,
},
'docs/form-render/api-props': {
frontmatter: fm22,
toc: toc22,
texts: txt22,
demos: dm22,
},
'docs/form-render/changelog': {
frontmatter: fm23,
toc: toc23,
texts: txt23,
demos: dm23,
},
'docs/form-render/demo/demo': {
frontmatter: fm24,
toc: toc24,
texts: txt24,
demos: dm24,
},
'docs/table-render/noSearch': {
frontmatter: fm25,
toc: toc25,
texts: txt25,
demos: dm25,
},
'docs/tools/proptypes/index': {
frontmatter: fm26,
toc: toc26,
texts: txt26,
demos: dm26,
},
'docs/generator/playground': {
frontmatter: fm27,
toc: toc27,
texts: txt27,
demos: dm27,
},
'docs/table-render/migrate': {
frontmatter: fm28,
toc: toc28,
texts: txt28,
demos: dm28,
},
'docs/form-render/migrate': {
frontmatter: fm29,
toc: toc29,
texts: txt29,
demos: dm29,
},
'docs/table-render/norBar': {
frontmatter: fm30,
toc: toc30,
texts: txt30,
demos: dm30,
},
'docs/chart-render/index': {
frontmatter: fm31,
toc: toc31,
texts: txt31,
demos: dm31,
},
'docs/table-render/basic': {
frontmatter: fm32,
toc: toc32,
texts: txt32,
demos: dm32,
},
'docs/table-render/index': {
frontmatter: fm33,
toc: toc33,
texts: txt33,
demos: dm33,
},
'docs/tools/vscode/index': {
frontmatter: fm34,
toc: toc34,
texts: txt34,
demos: dm34,
},
'docs/chart-render/demo': {
frontmatter: fm35,
toc: toc35,
texts: txt35,
demos: dm35,
},
'docs/form-render/index': {
frontmatter: fm36,
toc: toc36,
texts: txt36,
demos: dm36,
},
'docs/table-render/tabs': {
frontmatter: fm37,
toc: toc37,
texts: txt37,
demos: dm37,
},
'docs/chart-render/faq': {
frontmatter: fm38,
toc: toc38,
texts: txt38,
demos: dm38,
},
'docs/playground/index': {
frontmatter: fm39,
toc: toc39,
texts: txt39,
demos: dm39,
},
'docs/table-render/api': {
frontmatter: fm40,
toc: toc40,
texts: txt40,
demos: dm40,
},
'docs/form-render/faq': {
frontmatter: fm41,
toc: toc41,
texts: txt41,
demos: dm41,
},
'docs/generator/index': {
frontmatter: fm42,
toc: toc42,
texts: txt42,
demos: dm42,
},
'docs/generator/demo': {
frontmatter: fm43,
toc: toc43,
texts: txt43,
demos: dm43,
},
'docs/generator/faq': {
frontmatter: fm44,
toc: toc44,
texts: txt44,
demos: dm44,
},
'docs/index.en-US': {
frontmatter: fm45,
toc: toc45,
texts: txt45,
demos: dm45,
},
'docs/index.zh-CN': {
frontmatter: fm46,
toc: toc46,
texts: txt46,
demos: dm46,
},
}
// generate demos data in runtime, for reuse route.id to reduce bundle size
export const demos = Object.entries(filesMeta).reduce((acc, [id, meta]) => {
// append route id to demo
Object.values(meta.demos).forEach((demo) => {
demo.routeId = id;
});
// merge demos
Object.assign(acc, meta.demos);
// remove demos from meta, to avoid deep clone demos in umi routes/children compatible logic
delete meta.demos;
return acc;
}, {});
================================================
FILE: .dumi/tmp-production/dumi/meta/runtime.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import { filesMeta, tabs } from '.';
import deepmerge from '/Users/zhanbo/happy/x-render/node_modules/deepmerge';
export const patchRoutes = ({ routes }) => {
Object.values(routes).forEach((route) => {
if (filesMeta[route.id]) {
if (process.env.NODE_ENV === 'production' && (route.meta?.frontmatter?.debug || filesMeta[route.id].frontmatter.debug)) {
// hide route in production which set hide frontmatter
delete routes[route.id];
} else {
// merge meta to route object
route.meta = deepmerge(route.meta, filesMeta[route.id]);
// apply real tab data from id
route.meta.tabs = route.meta.tabs?.map((id) => {
const meta = {
frontmatter: { title: tabs[id].title },
toc: [],
texts: [],
}
return {
...tabs[id],
meta: filesMeta[id] || meta,
}
});
}
}
});
}
================================================
FILE: .dumi/tmp-production/dumi/meta/tabs.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export const tabs = {
}
================================================
FILE: .dumi/tmp-production/dumi/theme/ContextWrapper.tsx
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import React, { useState, useEffect, useRef } from 'react';
import { useOutlet, history } from 'dumi';
import { SiteContext } from '/Users/zhanbo/happy/x-render/node_modules/dumi/dist/client/theme-api/context.js';
import { demos, components } from '../meta';
import { locales } from '../locales/config';
const entryExports = {
};
export default function DumiContextWrapper() {
const outlet = useOutlet();
const [loading, setLoading] = useState(true);
const prev = useRef(history.location.pathname);
useEffect(() => {
return history.listen((next) => {
if (next.location.pathname !== prev.current) {
prev.current = next.location.pathname;
// mark loading when route change, page component will set false when loaded
setLoading(true);
// scroll to top when route changed
document.documentElement.scrollTo(0, 0);
}
});
}, []);
return (
<SiteContext.Provider value={{
pkg: {"name":"root","version":"0.0.1","repository":{"type":"git","url":"git+https://github.com/alibaba/x-render.git","branch":"master","platform":"github"}},
historyType: "browser",
entryExports,
demos,
components,
locales,
loading,
setLoading,
themeConfig: {"footer":" Please feel free to use and contribute to the development.","prefersColor":{"default":"light","switch":true},"name":"XRender","logo":"https://img.alicdn.com/tfs/TB17UtINiLaK1RjSZFxXXamPFXa-606-643.png","socialLinks":{"github":"https://github.com/alibaba/x-render"},"nav":{"zh-CN":[{"title":"FormRender","link":"/form-render"},{"title":"TableRender","link":"/table-render"},{"title":"ChartRender","link":"/chart-render"},{"title":"表单设计器","link":"/generator"},{"title":"Playground","link":"/playground"}]}},
}}>
{outlet}
</SiteContext.Provider>
);
}
================================================
FILE: .dumi/tmp-production/dumi/theme/builtins/API.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/builtins/API/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/builtins/Badge.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/builtins/Badge/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/builtins/Container.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/builtins/Container/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/builtins/Previewer.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/builtins/Previewer/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/builtins/SourceCode.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/builtins/SourceCode/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/builtins/Table.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/builtins/Table/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/layouts/DocLayout.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/layouts/DocLayout/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/ColorSwitch.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/ColorSwitch/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Content.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Content/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/ContentTabs.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/ContentTabs/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Features.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Features/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Footer.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Footer/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/HeadeExtra.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/HeadeExtra/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Header.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Header/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Hero.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Hero/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/HeroTitle.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/HeroTitle/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/LangSwitch.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/LangSwitch/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Logo.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Logo/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Navbar.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Navbar/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/NavbarExtra.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/NavbarExtra/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/NotFound.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/NotFound/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/PreviewerActions.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/PreviewerActions/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/PreviewerActionsExtra.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/PreviewerActionsExtra/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/RtlSwitch.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/RtlSwitch/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/SearchBar.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/SearchBar/index.js';
export * from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/SearchBar/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/SearchResult.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/SearchResult/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Sidebar.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Sidebar/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/SocialIcon.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/SocialIcon/index.js';
================================================
FILE: .dumi/tmp-production/dumi/theme/slots/Toc.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { default } from '/Users/zhanbo/happy/x-render/node_modules/dumi/theme-default/slots/Toc/index.js';
================================================
FILE: .dumi/tmp-production/exports.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
export { defineApp } from './core/defineApp'
export type { RuntimeConfig } from './core/defineApp'
// @umijs/renderer-*
export { createBrowserHistory, createHashHistory, createMemoryHistory, Helmet, HelmetProvider, createSearchParams, generatePath, matchPath, matchRoutes, Navigate, NavLink, Outlet, resolvePath, useLocation, useMatch, useNavigate, useOutlet, useOutletContext, useParams, useResolvedPath, useRoutes, useSearchParams, useAppData, useClientLoaderData, useRouteProps, useSelectedRoutes, useServerLoaderData, renderClient, __getRoot, Link, useRouteData, __useFetcher, withRouter } from '/Users/zhanbo/happy/x-render/node_modules/@umijs/preset-umi/node_modules/@umijs/renderer-react';
export type { History } from '/Users/zhanbo/happy/x-render/node_modules/@umijs/preset-umi/node_modules/@umijs/renderer-react'
// umi/client/client/plugin
export { ApplyPluginsType, PluginManager } from '/Users/zhanbo/happy/x-render/node_modules/dumi/node_modules/umi/client/client/plugin.js';
export { history, createHistory } from './core/history';
export { terminal } from './core/terminal';
// plugins
// plugins types.d.ts
================================================
FILE: .dumi/tmp-production/testBrowser.tsx
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import React, { useEffect, useState } from 'react';
import { ApplyPluginsType } from 'umi';
import { renderClient, RenderClientOpts } from '/Users/zhanbo/happy/x-render/node_modules/@umijs/preset-umi/node_modules/@umijs/renderer-react';
import { createHistory } from './core/history';
import { createPluginManager } from './core/plugin';
import { getRoutes } from './core/route';
import type { Location } from 'history';
const publicPath = '/';
const runtimePublicPath = false;
type TestBrowserProps = {
location?: Partial<Location>;
historyRef?: React.MutableRefObject<Location>;
};
export function TestBrowser(props: TestBrowserProps) {
const pluginManager = createPluginManager();
const [context, setContext] = useState<RenderClientOpts | undefined>(
undefined
);
useEffect(() => {
const genContext = async () => {
const { routes, routeComponents } = await getRoutes(pluginManager);
// allow user to extend routes
await pluginManager.applyPlugins({
key: 'patchRoutes',
type: ApplyPluginsType.event,
args: {
routes,
routeComponents,
},
});
const contextOpts = pluginManager.applyPlugins({
key: 'modifyContextOpts',
type: ApplyPluginsType.modify,
initialValue: {},
});
const basename = contextOpts.basename || '/';
const history = createHistory({
type: 'memory',
basename,
});
const context = {
routes,
routeComponents,
pluginManager,
rootElement: contextOpts.rootElement || document.getElementById('root'),
loadingComponent: Loading,
publicPath,
runtimePublicPath,
history,
basename,
components: true,
};
const modifiedContext = pluginManager.applyPlugins({
key: 'modifyClientRenderOpts',
type: ApplyPluginsType.modify,
initialValue: context,
});
return modifiedContext;
};
genContext().then((context) => {
setContext(context);
if (props.location) {
context?.history?.push(props.location);
}
if (props.historyRef) {
props.historyRef.current = context?.history;
}
});
}, []);
if (context === undefined) {
return <div id="loading" />;
}
const Children = renderClient(context);
return (
<React.Fragment>
<Children />
</React.Fragment>
);
}
================================================
FILE: .dumi/tmp-production/umi.ts
================================================
// @ts-nocheck
// This file is generated by Umi automatically
// DO NOT CHANGE IT MANUALLY!
import './core/polyfill';
import { renderClient } from '/Users/zhanbo/happy/x-render/node_modules/@umijs/preset-umi/node_modules/@umijs/renderer-react';
import { getRoutes } from './core/route';
import { createPluginManager } from './core/plugin';
import { createHistory } from './core/history';
import Loading from '/Users/zhanbo/happy/x-render/.dumi/loading.tsx';
import { ApplyPluginsType } from 'umi';
const publicPath = "/";
const runtimePublicPath = false;
async function render() {
const pluginManager = createPluginManager();
const { routes, routeComponents } = await getRoutes(pluginManager);
// allow user to extend routes
await pluginManager.applyPlugins({
key: 'patchRoutes',
type: ApplyPluginsType.event,
args: {
routes,
routeComponents,
},
});
const contextOpts = pluginManager.applyPlugins({
key: 'modifyContextOpts',
type: ApplyPluginsType.modify,
initialValue: {},
});
const basename = contextOpts.basename || '/';
const historyType = contextOpts.historyType || 'browser';
const history = createHistory({
type: historyType,
basename,
...contextOpts.historyOpts,
});
return (pluginManager.applyPlugins({
key: 'render',
type: ApplyPluginsType.compose,
initialValue() {
const context = {
routes,
routeComponents,
pluginManager,
rootElement: contextOpts.rootElement || document.getElementById('root'),
loadingComponent: Loading,
publicPath,
runtimePublicPath,
history,
historyType,
basename,
callback: contextOpts.callback,
};
const modifiedContext = pluginManager.applyPlugins({
key: 'modifyClientRenderOpts',
type: ApplyPluginsType.modify,
initialValue: context,
});
return renderClient(modifiedContext);
},
}))();
}
// always remove trailing slash from location.pathname
if (
typeof history !== 'undefined' &&
location.pathname.length > 1 &&
location.pathname.endsWith('/')
) {
history.replaceState(
{},
'',
location.pathname.slice(0, -1) + location.search + location.hash,
);
}
(function () {
var cache = typeof navigator !== 'undefined' && navigator.cookieEnabled && typeof window.localStorage !== 'undefined' && localStorage.getItem('dumi:prefers-color') || 'light';
var isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
var enums = ['light', 'dark', 'auto'];
document.documentElement.setAttribute(
'data-prefers-color',
cache === enums[2]
? (isDark ? enums[1] : enums[0])
: (enums.indexOf(cache) > -1 ? cache : enums[0])
);
})();
if(location.origin.includes('gitee')) location.href = 'https://xrender.fun'
render();
window.g_umi = {
version: '4.0.64',
};
================================================
FILE: .dumirc.ts
================================================
import { defineConfig } from 'dumi';
import path from 'path';
import MonacoWebpackPlugin from 'monaco-editor-webpack-plugin';
export default defineConfig({
favicons: ['https://img.alicdn.com/tfs/TB17UtINiLaK1RjSZFxXXamPFXa-606-643.png'],
outputPath: 'docs-dist',
// locales: [{ id: 'zh-CN', name: '中文' }, { id: 'en-US', name: 'English' }],
locales: [{ id: 'zh-CN', name: '中文' }],
themeConfig: {
name: 'XRender',
logo: 'https://img.alicdn.com/tfs/TB17UtINiLaK1RjSZFxXXamPFXa-606-643.png',
footer: false,
socialLinks: {
github: 'https://github.com/alibaba/x-render',
},
nav: {
'zh-CN': [
{
title: 'FormRender',
link: '/form-render',
},
{
title: 'TableRender',
link: '/table-render',
},
{
title: 'ChartRender',
link: '/chart-render',
},
{
title: 'Playground',
link: '/playground',
}
],
// 'en-US': [
// {
// title: 'FormRender',
// link: '/en/form-render',
// }
// ]
},
},
extraBabelPlugins: [
[
'import',
{
libraryName: 'antd',
libraryDirectory: 'es',
style: true,
},
'antd',
],
[
'import',
{
libraryName: '@alifd/next',
libraryDirectory: 'lib',
},
'@alifd/next',
],
],
ignoreMomentLocale: true,
chainWebpack(config, { webpack }) {
config.plugin('monaco-editor').use(MonacoWebpackPlugin);
},
headScripts: [
'https://g.alicdn.com/code/lib/react/17.0.1/umd/react.production.min.js',
'https://g.alicdn.com/code/lib/react-dom/17.0.1/umd/react-dom.production.min.js'
],
plugins: [require.resolve('./scripts/dumi-plugin/redirect')],
alias: {
'form-render/es': path.resolve(__dirname, 'packages/form-render/src'),
'form-render': path.resolve(__dirname, 'packages/form-render/src'),
'table-render': path.resolve(__dirname, 'packages/table-render/src'),
'form-render-mobile': path.resolve(__dirname, 'packages/form-render-mobile/src'),
'@xrenders/schema-builder': path.resolve(__dirname, 'tools/schema-builder/src'),
'@xrenders/data-render': path.resolve(__dirname, 'packages/data-render/src'),
'@xrenders/xflow': path.resolve(__dirname, 'packages/x-flow/src'),
},
codeSplitting: { jsStrategy: 'granularChunks' },
//...(process.env.NODE_ENV === 'development' ? {} : { ssr: {} }),
});
================================================
FILE: .editorconfig
================================================
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
================================================
FILE: .fatherrc.js
================================================
// 通用的配置,可以在每个package里写 fatherrc.js 来覆盖
export default {
esm: 'rollup',
disableTypeCheck: false, // 如果出了问题,这个可以改成true
cjs: { type: 'babel', lazy: true },
};
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: lhbxs
---
<!---
1. 提问前务必先搜索issue,查看是否已有类似问题。
1. try searching for similar issues before reporting yours
2. 非bug or feature类问题,欢迎加入我们的开源社区钉钉群进行讨论。
-->
**1.依赖仓库的版本(Dependencies versions)**:
- react:
- form-render:
- table-render:
- antd:
**2.问题描述(Bug description)**:
**3.出现问题的 schema demo(Reproduction schema demo)**:
```js
const schema = {
// ...
}
```
**4.最小复现 demo(Reproduction demo)**:
<!--
请尽可能提供复现demo,有 demo 的 bug report 会在第一时间处理
Please provide reproduction of your bug. Bug report with reproduction demo will be dealt first
-->
form-render demo https://codesandbox.io/s/unruffled-flower-jl78h
table-render demo https://codesandbox.io/s/sweet-euler-bdoty
fr-generator demo https://codesandbox.io/s/s13sh
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: lhbxs
---
### 期望的新功能 (describe the expected new feature)
### 简述一下使用场景,便于开发者更好理解新功能的必要性 (describe your scenario for us to understand the need)
================================================
FILE: .github/workflows/ci.yml
================================================
name: 🚀 Build CI
env:
NODE_OPTIONS: --max-old-space-size=6144
on:
push:
branches: [master, dev]
pull_request:
branches: [master, dev]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node: [ '14', '16' ]
name: build steps
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node }}
- name: Cache Node Dependencies
uses: actions/cache@v3
with:
path: node_modules
key: ${{runner.OS}}-${{ hashFiles('**/yarn.lock') }}
- name: Install
run: yarn install
if: steps.cache.outputs.cache-hit != 'true'
- name: Build
run: yarn build
- name: Test
run: yarn test
================================================
FILE: .github/workflows/coverage.yml
================================================
# name: 💯 Coverage CI
# on:
# workflow_run:
# workflows: ["🚀 Build CI"]
# types:
# - completed
# jobs:
# build:
# runs-on: ubuntu-latest
# strategy:
# matrix:
# node: [ '14', '16' ]
# name: build steps
# steps:
# - uses: actions/checkout@v2
# - name: Use Node.js ${{ matrix.node }}
# uses: actions/setup-node@v2
# with:
# node-version: ${{ matrix.node }}
# - name: Run Test
# - run: yarn run test
================================================
FILE: .github/workflows/deploy.yml
================================================
# name: Deploy CI
# on:
# push:
# branches:
# - master
# jobs:
# build-and-deploy:
# runs-on: ubuntu-latest
# name: deploy steps
# steps:
# - uses: actions/checkout@v2
# - name: install
# run: yarn install
# - name: build
# run: yarn doc
# - name: Deploy Action
# uses: peaceiris/actions-gh-pages@v3
# with:
# deploy_key: ${{ secrets.ACTIONS_DEPLOY_TOKEN }}
# publish_dir: ./docs-dist
# force_orphan: true
================================================
FILE: .github/workflows/emoji-helper.yml
================================================
name: Emoji Helper
on:
release:
types: [published]
jobs:
emoji:
runs-on: ubuntu-latest
steps:
- uses: actions-cool/emoji-helper@v1.0.0
with:
type: 'release'
emoji: '+1, laugh, heart, hooray, rocket, eyes'
================================================
FILE: .github/workflows/issue-helper.yml
================================================
name: Issue Reply
on:
issues:
types: [labeled]
jobs:
reply-helper:
runs-on: ubuntu-latest
steps:
- name: need demo
if: github.event.label.name == 'need demo'
uses: actions-cool/issues-helper@v2.5.0
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
Hello @${{ github.event.issue.user.login }}. To fix it quickly, We need you to provide a complete demo on codesandbox .
你好 @${{ github.event.issue.user.login }},我们需要你在codesandbox上提供一个完整的demo,便于我们快速修复哦。
- name: pr welcome
if: github.event.label.name == 'pr welcome'
uses: actions-cool/issues-helper@v2.5.0
with:
actions: 'create-comment'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
Hello @${{ github.event.issue.user.login }}. We totally like your proposal/feedback, welcome PR 🎉。
你好 @${{ github.event.issue.user.login }},我们完全同意你的提议/反馈,欢迎PR 🎉。
================================================
FILE: .github/workflows/mirror.yml
================================================
# name: 🔀 Sync mirror to Vercel
# on:
# push:
# branches:
# - master
# jobs:
# mirror:
# runs-on: ubuntu-latest
# steps:
# - name: mirror actions
# continue-on-error: true
# uses: wearerequired/git-mirror-action@v1
# env:
# SSH_PRIVATE_KEY: ${{ secrets.FORK_PRIVATE_KEY }}
# with:
# source-repo: 'https://github.com/alibaba/x-render.git'
# destination-repo: 'git@github.com:siyi98/x-render.git'
================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/npm-debug.log*
/yarn-error.log
/yarn.lock
/package-lock.json
*/*/yarn-error.log
.yarn
.turbo/cookies
.turbo/daemon
.turbo
# turbo
*/*/.turbo
# production
/dist
/lib
/docs-dist
# misc
.idea
.DS_Store
.idea
.vscode
# umi
.dumi/tmp
.dumi-production
.dumi-test
.env.local
# lerna
node_modules
/.local
/packages/*/es
/packages/*/lib
/packages/*/.local
/packages/*/dist
/widgets/*/es
/widgets/*/lib
/widgets/*/.local
/widgets/*/dist
/tools/*/es
/tools/*/lib
/tools/*/.local
/tools/*/dist
# custom
old-doc
test.json
/docs/guide/.test
/coverage
================================================
FILE: .npmrc
================================================
registry=https://registry.npmjs.org/
================================================
FILE: .prettierignore
================================================
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
**/*.svg
**/**/*.svg
**/*.ejs
**/**/*.ejs
**/*.html
**/**/*.html
# dependencies
/node_modules
/npm-debug.log*
/yarn-error.log
/yarn.lock
/package-lock.json
# production
/dist
/lib
/docs-dist
# misc
.idea
.DS_Store
.idea
.vscode
# umi
.umi
.umi-production
.umi-test
.env.local
# lerna
node_modules
/.local
/packages/*/es
/packages/*/lib
/packages/*/.local
/packages/*/dist
/widgets/*/es
/widgets/*/lib
/widgets/*/.local
/widgets/*/dist
/tools/*/es
/tools/*/lib
/tools/*/.local
/tools/*/dist
# custom
old-doc
test.json
/docs/guide/.test
/docs/*/*.md
/docs/playground/monaco/index.js
================================================
FILE: .prettierrc
================================================
{
"singleQuote": true,
"trailingComma": "es5",
"printWidth": 80,
"arrowParens": "avoid",
"overrides": [
{
"files": ".prettierrc",
"options": { "parser": "json" }
}
]
}
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at tw93@qq.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
================================================
FILE: CONTRIBUTING.md
================================================
## 如何开发
#### 1. 项目使用 lerna 管理,所有的大包在 `/packages`,所有的自定义组件包在 `/widgets`
#### 2. 如何跑起来(以下操作全在根目录)
```sh
# 安装依赖,请使用yarn,会去重的安装所有 node_modules (注意安装必须用 yarn,其他命令无所谓)
yarn
# 首次开发需要 build 一下,否则有些仓库的 import 在 dumi 里会找不到
yarn build
# 将文档网站跑起来
yarn start
```
#### 3. 进入文档网站了,如何开发呢?
- 例如要开发 form-render 在 /docs/form-render/guide 目录下写一个 test.md 文件, 参考 /docs/form-render/guide/new-feature.md 的写法即可。发布前把
test.md 干掉,或者放到不会被展示的文件目录下
- 提交前注意必须**格式化**。提交前注意必须**格式化**。提交前注意必须**格式化**。请安装 prettier 插件,或者在提交前执行
```sh
yarn format
```
#### 4. 重新安装依赖
```sh
# 先清空
yarn clean
# 再安装
yarn
```
注意 lerna clean 不会清除顶层的 node_modules,所以如果因为特殊原因要彻底清空依赖,请执行 `rm -rf node_modules`
#### 5. 发布
此操作只针对有 npm 发布权限的贡献,进入相应项目的文件夹,例如 form-render,执行 publish
```sh
# 进入
cd packages/form-render
# 换版本号、打tag。注意tag要打,便于release note的维护
yarn version --new-version 1.1.0
# 发布
npm publish
```
发布后记得到 [releases 页](https://github.com/alibaba/x-render/releases/) 补上最新发布日志
#### 6. 实际装包测试(本地 or 发布 beta 版本)
- 本地测试
推荐一下 yalc。是一个完全可以当做 yarn 来使用,但是发包和装包都在本地的工具,个人调试强烈推荐
- 发 beta 包
beta 版本的版本号规范为 x.x.x-beta.x,一般用于大功能上线前的真实测试,不会被正常 npm i 安装。
进入 package/form-render 文件夹,执行
```sh
# 换版本号、打tag。注意tag要打,便于release note的维护
yarn version --new-version 1.1.0-beta.0
# 发布
npm run beta
```
#### 7. 分支管理
外部同学请 fork,内部同学请在 dev 分支开发,然后都发 pull-request 到 master 分支,由负责同学审核后合并,master 分支请勿人为去动
#### 8. 如何检验一个 pull request
```
# ID 为 pr 的 id
git fetch origin pull/ID/head && git checkout FETCH_HEAD
```
#### 9. 编辑文档
编辑文档请参考 [文档规范](https://github.com/alibaba/x-render/wiki/%E6%96%87%E6%A1%A3%E8%A7%84%E8%8C%83)
================================================
FILE: README.md
================================================
<p align="center">
<a href="https://xrender.fun/" target="_blank"><img src="https://img.alicdn.com/tfs/TB17UtINiLaK1RjSZFxXXamPFXa-606-643.png" alt="logo" width="20%"/></a>
</p>
<h1 align= "center">
<a href="https://xrender.fun/" target="_blank">XRender</a>
</h1>
<p align="center">
<a href="https://www.npmjs.com/package/form-render?_blank">
<img alt="npm" src="https://img.shields.io/npm/v/form-render.svg?maxAge=3600&style=flat-square"></a>
<a href="https://github.com/alibaba/form-render/commits/dev">
<img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/alibaba/form-render.svg?style=flat-square"></a>
<a href="https://github.com/alibaba/form-render">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/alibaba/form-render"></a>
<a href="https://github.com/alibaba/form-render/issues?utf8=%E2%9C%93&q=">
<img alt = "GitHub closed issues" src="https://img.shields.io/github/issues-closed/alibaba/form-render.svg?style=flat-square"></a>
<a href="https://npmjs.org/package/form-render">
<img alt = "NPM downloads" src="https://img.shields.io/npm/dm/form-render.svg?style=flat-square"></a>
<a href="https://npmjs.org/package/form-render">
<img alt = "NPM all downloads" src="https://img.shields.io/npm/dt/form-render.svg?style=flat-square"></a>
<a>
<img alt = "PRs Welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square"></a>
</p>
> 中后台「表单 / 表格 / 图表」开箱即用解决方案
## 优势
- <a href="https://xrender.fun/form-render" target="_blank">FormRender</a>:像写一个 input 一样写表单
- <a href="https://xrender.fun/table-render" target="_blank">TableRender</a>:协议生成 & 高度灵活的搜索列表
- <a href="https://xrender.fun/chart-render" target="_blank">ChartRender</a>:傻瓜式的图表绘制库
- <a href="https://xrender.fun/generator" target="_blank">FormGenerator</a>:中后台表单可视化搭建生成利器
<div style="max-width: 961px; margin: auto;">
<h2>谁在使用?</h4>
<table style="border: none; background: #fff">
<tr>
<td width="160" align="center">
<img
src="https://gw.alicdn.com/bao/tfs/TB1mFZneMmH3KVjSZKzXXb2OXXa-748-467.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://gw.alipayobjects.com/zos/k/sx/kJRfKV.jpg"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://gw.alicdn.com/tfs/TB176rg4VP7gK0jSZFjXXc5aXXa-286-118.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/tfs/TB13DzOjXP7gK0jSZFjXXc5aXXa-212-48.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i1/O1CN01Uw1xNd1H1GnHYCaOr_!!6000000000697-2-tps-1920-1920.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://gw.alipayobjects.com/zos/k/dl/zJ2uhY.jpg"
width="110"
/>
</td>
</tr>
<tr>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i4/O1CN01SUv7rt1gMfdYr2Bnc_!!6000000004128-0-tps-800-373.jpg"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://gw.alipayobjects.com/zos/k/9l/RZCG03.jpg"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://gw.alipayobjects.com/zos/k/rh/4PXvlp.jpg"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i3/O1CN01xDuypG1V78PWpnnPz_!!6000000002605-2-tps-600-120.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://gw.alipayobjects.com/zos/k/wu/TzIbI0.jpg"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i1/O1CN01K3AD1b1WZMSHolALT_!!6000000002802-0-tps-700-207.jpg"
width="160"
/>
</td>
</tr>
<tr>
<td width="160" align="center">
<img
src="https://gw.alipayobjects.com/zos/k/w7/02gpTA.jpg"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i4/O1CN01BJ26gA1cYLKkfiaCG_!!6000000003612-2-tps-287-176.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i3/O1CN017E63ji1W3InNkUvJE_!!6000000002732-2-tps-1000-500.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i2/O1CN01Zu5QsE1OJm7GYKH06_!!6000000001685-2-tps-363-139.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i1/O1CN01RqiiQ81j0dUdUfoIN_!!6000000004486-2-tps-280-66.png"
width="160"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i1/O1CN01B0UOM61lnIoMVJU6f_!!6000000004863-2-tps-500-397.png"
/>
</td>
</tr>
<tr>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i2/O1CN01DiuhTS1u3o0WsTsNb_!!6000000005982-2-tps-367-137.png"
/>
</td>
<td width="160" align="center">
<img
src="https://img.alicdn.com/imgextra/i3/O1CN01Vj8xN329If5dlvb50_!!6000000008045-2-tps-495-405.png"
/>
</td>
</tr>
</table>
</div>
更多可见[使用场景](https://github.com/alibaba/form-render/issues/94),也很欢迎提交~
## 支持
- 如果你觉得 XRender 还不错,可以通过 [Star](https://github.com/alibaba/form-render/stargazers) 来表示你的喜欢
- 在公司或个人项目中使用 XRender,并帮忙推广给伙伴使用
## 贡献
想贡献代码、解 BUG 或者提高文档可读性?非常欢迎一起参与进来,在提交 PR 前阅读一下 [Contributing Guide](https://github.com/alibaba/form-render/blob/master/CONTRIBUTING.md)。

感谢给 XRender 贡献代码的你们:
<a href="https://github.com/alibaba/x-render/graphs/contributors">
<img src="https://contrib.rocks/image?repo=alibaba/form-render" />
</a>
<br>
https://user-images.githubusercontent.com/8736212/123383626-ff187a80-d5c5-11eb-803f-296762fe72d0.mp4
## 协议
- 遵循 MIT 协议
- 请自由地享受和参与开源
## 互助答疑群
<img style="height: 400px" src="https://img.alicdn.com/imgextra/i3/O1CN01HksNgs1DZNuQsORIp_!!6000000000230-0-tps-1242-1602.jpg">
## Star 趋势
[](https://star-history.com/#alibaba/x-render&Date)
================================================
FILE: app.ts
================================================
window.publicPath = '/';
if (location.origin.includes('gitee')) {
location.href = 'https://xrender.fun/';
}
if (location.origin.includes('alibaba')) {
window.publicPath = '/x-render/';
}
================================================
FILE: docs/data-render/data/basic.ts
================================================
export default {
"creator": "清风徐来",
"relevanceCode": "421421",
"desc": "浙江省杭州市工专路",
"create-time": "2019-10-10",
"effective-date": "2019-10-10 ~ 2020-10-31",
"safety": {
"name": "Test demo 001",
"app": "中后台详情页面",
"mode": "代码包",
"yum": "592342323904823489",
"fore": "23"
},
"operLog": [{
"type": "创建测试",
"creator": "清风徐来",
"time": "2019-10-30 12:23:45",
"result": "1",
"desc": "这是备注"
}, {
"type": "创建测试",
"creator": "清风徐来",
"time": "2019-10-30 12:23:45",
"result": "1",
"desc": "这是备注"
}, {
"type": "创建测试",
"creator": "清风徐来",
"time": "2019-10-30 12:23:45",
"result": "1",
"desc": "这是备注"
}, {
"type": "创建测试",
"creator": "清风徐来",
"time": "2019-10-30 12:23:45",
"result": "1",
"desc": "这是备注"
}, {
"type": "创建测试",
"creator": "清风徐来",
"time": "2019-10-30 12:23:45",
"result": "1",
"desc": "这是备注"
}, {
"type": "创建测试",
"creator": "清风徐来",
"time": "2019-10-30 12:23:45",
"result": "1",
"desc": "这是备注"
}]
}
================================================
FILE: docs/data-render/index.md
================================================
---
order: 0
title: 开始使用
mobile: false
---
<div style="display:flex;align-items:center;margin-bottom:24px">
<img src="https://img.alicdn.com/tfs/TB17UtINiLaK1RjSZFxXXamPFXa-606-643.png" alt="logo" width="48px"/>
<span style="font-size:30px;font-weight:600;display:inline-block;margin-left:12px">DataView</span>
</div>
<p style="display:flex;justify-content:space-between;width:440px">
<a href="https://www.npmjs.com/package/@xrenders/data-render" target="_blank">
<img alt="npm" src="https://img.shields.io/npm/v/@xrenders/data-render.svg?maxAge=3600&style=flat-square">
</a>
<a href="https://npmjs.org/package/@xrenders/data-render" target="_blank">
<img alt="NPM downloads" src="https://img.shields.io/npm/dm/@xrenders/data-render.svg?style=flat-square">
</a>
<a href="https://npmjs.org/package/@xrenders/data-render" target="_blank">
<img alt="NPM all downloads" src="https://img.shields.io/npm/dt/@xrenders/data-render.svg?style=flat-square">
</a>
<a>
<img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square">
</a>
</p>
中后台详情页解决方案,通过 schema 协议渲染页面
## 安装
```shell
npm i @xrenders/data-render --save
```
## 使用方式
**函数组件**
```jsx
/**
* transform: true
* defaultShowCode: true
*/
import React from 'react';
import DataView from '@xrenders/data-render';
import schema from './schema/basic';
import data from './data/basic';
export default () => {
return (
<DataView schema={schema} data={data} />
);
}
```
================================================
FILE: docs/data-render/schema/basic.ts
================================================
export default [
{
"widget": "FPanel",
"style": {
"paddingTop": "20px",
"paddingLeft": "20px",
"paddingBottom": "20px",
"paddingRight": "20px",
"backgroundColor": "#ffffff",
"marginBottom": "12px"
},
"children": [
{
"widget": "FTitle",
"data": "基础信息"
},
{
"widget": "FDescriptions",
"column": 3,
"items": [
{
"label": "创建人",
"dataKey": "creator"
},
{
"label": "关联单据",
"dataKey": "relevanceCode"
},
{
"label": "单据备注",
"dataKey": "desc"
},
{
"label": "创建时间",
"dataKey": "create-time"
},
{
"label": "生效日期",
"dataKey": "effective-date"
},
{
"label": "描述项",
"showLevel": 1
}
],
"style": {
"backgroundColor": "#ffffff",
"paddingTop": "0px",
"paddingLeft": "0px",
"paddingRight": "0px",
"paddingBottom": "0px"
},
"itemShowLevel": 1,
"getCompProps": "xxxx"
}
]
},
{
"widget": "FTabs",
"items": [
{
"label": "负载均衡(SLB)",
"children": [
{
"widget": "FPanel",
"style": {
"paddingTop": "20px",
"paddingLeft": "20px",
"paddingBottom": "20px",
"paddingRight": "20px",
"backgroundColor": "#ffffff",
"marginBottom": "12px"
},
"children": [
{
"widget": "FTitle",
"data": "安全信息"
},
{
"widget": "FDescriptions",
"column": 2,
"items": [
{
"label": "安全构建名称",
"dataKey": "name"
},
{
"label": "所属应用",
"dataKey": "app"
},
{
"label": "构建模式",
"dataKey": "mode"
},
{
"label": "公网域名",
"dataKey": "yum"
},
{
"label": "保留计算实例",
"dataKey": "fore"
}
],
"dataKey": "safety"
}
]
},
{
"widget": "FPanel",
"style": {
"paddingTop": "20px",
"paddingLeft": "20px",
"paddingBottom": "20px",
"paddingRight": "20px",
"backgroundColor": "#ffffff",
"marginBottom": "12px"
},
"children": [
{
"widget": "FTitle",
"data": "操作日志"
},
{
"widget": "FTable",
"pagination": {
"pageSize": "3"
},
"style": {
"backgroundColor": "#ffffff"
},
"dataKey": "operLog",
"column": {
"type": {
"title": "操作类型",
"dataKey": "type"
},
"creator": {
"title": "操作人",
"dataKey": "creator"
},
"time": {
"title": "操作时间",
"dataKey": "time"
},
"result": {
"title": "执行结果",
"dataKey": "result"
},
"desc": {
"title": "备注",
"dataKey": "desc"
}
}
}
]
}
]
},
{
"label": "云服务器(ECS)",
"children": []
}
]
}
]
================================================
FILE: docs/form-render/advaced-example.md
================================================
---
order: 3
toc: content
mobile: false
group:
title: 高级用法
order: 2
---
# 常用交互
## 表单数据提交
通过 `onFinish` 方法监听表单提交,外部可通过调用 `form.submit` 触发 `onFinish`。
```jsx
import React from 'react';
import { message } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/simple';
export default () => {
const form = useForm();
const onFinish = (data) => {
message.info(JSON.stringify(data));
};
return (
<FormRender form={form} schema={schema} onFinish={onFinish} footer={true} maxWidth={360} />
);
}
```
## 表单数据初始化
表单的初始化数据一般是通过接口异步查询获取的,当获取到数据时可以通过 `form.setValues` 方法进行表单数据初始化。
```jsx
import React, { useState, useEffect } from 'react';
import { Button, Space, message } from 'antd';
import FormRender, { useForm } from 'form-render';
import { fakeApi, delay } from './utils';
import schema from './schema/simple';
export default () => {
const form = useForm();
const getRemoteData = () => {
fakeApi('xxx/getForm').then(_ => {
form.setValues({ input: '表单数据获取成功', select: 'c' });
});
};
return (
<div>
<FormRender form={form} schema={schema} maxWidth={360} />
<Button type='primary' onClick={getRemoteData}>加载服务端数据</Button>
</div>
);
}
```
## 下拉选项异步加载
下拉选项的数据有时候来源于服务端下发,这时我们需要异步修改 Schema。
- 单个加载:通过 `form.setSchemaByPath` 方法进行加载
```jsx
import React, { useEffect } from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
properties: {
select: {
title: '下拉框',
type: 'string',
widget: 'select',
}
}
};
export default () => {
const form = useForm();
const onMount = () => {
// 根据服务端下发内容,重置下拉选项
form.setSchemaByPath('select', {
props: {
options: [
{label: '东', value: 'east'},
{label: '西', value: 'west'},
{label: '南', value: 'south'},
{label: '北', value: 'north'}
]
}
});
};
return (
<FormRender form={form} schema={schema} onMount={onMount} maxWidth={360}
/>
);
}
```
- 多个加载:通过 `form.setSchema` 方法进行加载
```jsx
import React, { useEffect } from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
properties: {
select1: {
title: '下拉框一',
type: 'string',
widget: 'select',
},
select2: {
title: '下拉框二',
type: 'string',
widget: 'select',
}
}
};
export default () => {
const form = useForm();
const onMount = () => {
form.setSchema({
select1: {
props: {
options: [
{label: '东', value: 'east'},
{label: '西', value: 'west'},
{label: '南', value: 'south'},
{label: '北', value: 'north'}
]
}
},
select2: {
props: {
options: [
{ label: '早', value: 'a' },
{ label: '中', value: 'b' },
{ label: '晚', value: 'c' }
]
}
}
});
};
return (
<FormRender
form={form}
schema={schema}
onMount={onMount}
maxWidth={360}
/>
);
}
```
## 表单协议重置
通过 `form.setSchema(schema, true)` 方法进行加载
```jsx
import React, { useState, useEffect } from 'react';
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
import { fakeApi, delay } from './utils';
import schema from './schema/simple';
import basic from './schema/basic';
const Demo = () => {
const form = useForm();
const getRemoteSchema = () => {
fakeApi('xxx/getForm').then(_ => {
form.setSchema(basic, true);
});
};
return (
<div>
<FormRender form={form} schema={schema} />
<Button type='primary' onClick={getRemoteSchema}>重置表单 Schema </Button>
</div>
);
};
export default Demo;
```
## 表单服务端校验
通过 `beforeFinish` 从外部回填 error 信息到表单,注意 `beforeFinish` 需返回要回填的 error
```jsx
import React from 'react';
import { Button, message } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/simple';
import { fakeApi } from './utils';
export default () => {
const form = useForm();
const onFinish = (data) => {
message.info(JSON.stringify(data));
};
// 服务端校验在这里做
const beforeFinish = ({ data, schema }) => {
return fakeApi('xxx/validation').then(_ => {
if (data.select1) {
return [{ name: 'select', errors: [] }];
}
return [{ name: 'select', errors: ['外部校验错误, 请进行选择'] }];
});
};
return (
<div>
<FormRender
form={form}
schema={schema}
beforeFinish={beforeFinish}
onFinish={onFinish}
maxWidth={400}
/>
<Button type='primary' onClick={form.submit}>
提交
</Button>
</div>
);
}
```
## 表单数据字段转换
服务端数据与展示经常会不符,通过配置 `bind` 字段进行转换(List嵌套下暂时不支持)
- 例如:日期范围组件接收的是一个数组,而服务端的数据是 startDate,endDate 两个字段。
```jsx
import React from 'react';
import { Button, message, Space } from 'antd';
import FormRender, { useForm } from 'form-render';
import { fakeApi } from './utils';
const schema = {
type: 'object',
properties: {
dateRange: {
bind: ['startDate', 'endDate'],
title: '日期范围',
type: 'range',
format: 'date',
},
},
};
export default () => {
const form = useForm();
const onFinish = (data) => {
message.info(JSON.stringify(data));
};
const getRemoteData = () => {
fakeApi('xxx/getForm').then(_ => {
form.setValues({ startDate: '2023-01-01', endDate: '2023-12-31' });
});
};
return (
<div>
<FormRender form={form} schema={schema} onFinish={onFinish} maxWidth={400} />
<Space>
<Button onClick={getRemoteData}>加载服务端数据</Button>
<Button type='primary' onClick={form.submit}>
提交
</Button>
</Space>
</div>
);
}
```
================================================
FILE: docs/form-render/advanced-bind.md
================================================
---
order: 3
toc: content
mobile: false
title: 数据转换
group:
title: 高级用法
order: 1
---
# bind
类型:string | string[] | false
有时候我们会遇到这样的问题:提交的数据,数据结构不符合服务端的要求,需要进行转换。这时候 bind 这个魔法字段就派上用场了。
注意点:`魔法虽好,切记滥用`
- `setValues`、`getValues`、`onFinish` 这三个 API,也就是`输入`、`输出` 数据的格式是转换之后的,其他情况下数据格式都是表单原始数据格式
- 最好不要跨层级转换,转换前后数据最好还是保持在同一层级,
`点击提交按钮,浏览器控制台会打印出提交的数据`
## 简单
`{ date: ['2023-04-01', '2023-04-23'] }` => `{ startDate: '2023-04-01', endDate: '2023-04-23' }`
```jsx
import React from 'react';
import { Button, Alert} from 'antd';
import FormRender, { useForm } from 'form-render';
const delay = ms => new Promise(res => setTimeout(res, ms));
const schema = {
type: 'object',
properties: {
date: {
bind: ['startDate', 'endDate'],
title: '日期',
type: 'range',
format: 'date',
description: 'bind 转换',
},
date1: {
title: '日期',
type: 'range',
format: 'date',
description: '未进行转换',
}
}
};
const Demo = () => {
const form = useForm();
const onFinish = (formData) => {
console.log(formData, 'formData');
};
return (
<FormRender
form={form}
schema={schema}
onFinish={onFinish}
footer={true}
maxWidth={400}
/>
);
};
export default Demo;
```
## 进阶
- 对象嵌套情况, bind 要写绝对路径
- List 组件嵌套情况,bind 路径从 List 嵌套的子节点开始写
```jsx
import React from 'react';
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
const delay = ms => new Promise(res => setTimeout(res, ms));
const schema = {
type: 'object',
properties: {
obj: {
title: '对象',
type: 'object',
description: '对象嵌套 bind 要写决定路径',
properties: {
range1: {
bind: ['obj.startDate', 'obj.endDate'],
title: '日期',
type: 'range',
format: 'date'
}
}
},
list: {
type: 'array',
widget: 'cardList',
items: {
type: 'object',
title: 'List-Item',
column: 3,
properties: {
obj: {
title: '对象',
type: 'object',
description: 'List 组件嵌套下,bind 路径从 List 嵌套的节点开始写',
properties: {
range1: {
bind: ['obj.startDate', 'obj.endDate'],
title: '日期',
type: 'range',
format: 'date'
}
}
}
}
}
}
}
};
const Demo = () => {
const form = useForm();
const onFinish = (formData) => {
console.log(formData, 'formData');
};
return (
<FormRender
form={form}
schema={schema}
onFinish={onFinish}
footer={true}
maxWidth={400}
/>
);
};
export default Demo;
```
## bind:false
某些字段数据只做纯展示,使用 bind: false 可避免字段在提交时出现。
```jsx
import React from 'react';
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
const delay = ms => new Promise(res => setTimeout(res, ms));
const schema = {
type: 'object',
properties: {
input: {
title: '输入框',
type: 'string',
props: {},
},
input1: {
title: '输入框',
type: 'string',
description: '纯展示',
readOnly: true,
bind: false
},
}
};
const Demo = () => {
const form = useForm();
const onMount = () => {
form.setValues({ input: '1', input1: '2' });
};
const onFinish = (formData) => {
console.log(formData, 'formData');
};
return (
<FormRender
form={form}
schema={schema}
onFinish={onFinish}
footer={true}
maxWidth={400}
onMount={onMount}
/>
);
};
export default Demo;
```
## bind:root
`{ list: [{ size: 1 }, { size: 2}] }` => `{ list: [1, 2] }`;
解决 List 嵌套,数组元素的数据格式只能是对象的问题
```jsx
import React from 'react';
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
const delay = ms => new Promise(res => setTimeout(res, ms));
const schema = {
type: 'object',
properties: {
list: {
type: 'array',
widget: 'simpleList',
items: {
type: 'object',
column: 3,
properties: {
input: {
bind: 'root',
title: '大小',
type: 'number',
}
}
}
}
}
};
const Demo = () => {
const form = useForm();
const onFinish = (formData) => {
console.log(formData, 'formData');
};
return (
<FormRender
form={form}
schema={schema}
onFinish={onFinish}
footer={true}
maxWidth={400}
/>
);
};
export default Demo;
```
================================================
FILE: docs/form-render/advanced-layout.md
================================================
---
order: 0
toc: content
mobile: false
group:
title: 高级用法
order: 1
---
# 表单布局
- `displayType` 标签排列方式
- `column` 表单一行能展示的表单项个数
- `labelWidth` 标签固定宽度
- `cellSpan` 表单项跨列
- `span` 自定义宽度
- `maxWidth` 输入控件最长宽度
- `labelCol`、`FieldCol` 表单项内部布局
- `footer` 内置按钮
## displayType
- displayType(标签排列方式):`row`(水平)| `column`(垂直)| `inline`(紧凑)
- 默认值:`column`
```jsx
import React, { useState } from 'react';
import { Button, Space, Form, Radio } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/basic';
export default () => {
const form = useForm();
const [displayType, setDisplay] = useState('row');
const handRadioChange = (ev) => {
const value = ev.target.value;
schema.displayType = value;
form.setSchema(schema, true);
setDisplay(value);
};
return (
<div>
<Form.Item label='displayType' style={{ marginBottom: '50px' }}>
<Radio.Group value={displayType} onChange={handRadioChange}>
<Radio.Button value='row'>row</Radio.Button>
<Radio.Button value='column'>column</Radio.Button>
<Radio.Button value='inline'>Inline</Radio.Button>
</Radio.Group>
</Form.Item>
<FormRender
schema={schema}
form={form}
labelCol={6}
fieldCol={17}
/>
</div>
);
}
```
## column
一行可以展示多少个表单项,默认值: 1
```jsx
import React, { useState } from 'react';
import { Button, Space, Form, Radio } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/basic';
export default () => {
const form = useForm();
const [column, setColumn] = useState(3);
const handRadioChange = (ev) => {
const value = ev.target.value;
schema.column = value;
form.setSchema(schema, true);
setColumn(value);
};
return (
<>
<Form.Item label='column' style={{ marginBottom: '50px' }}>
<Radio.Group value={column} onChange={handRadioChange}>
<Radio.Button value={1}>一列</Radio.Button>
<Radio.Button value={2}>两列</Radio.Button>
<Radio.Button value={3}>三列</Radio.Button>
<Radio.Button value={4}>四列</Radio.Button>
</Radio.Group>
</Form.Item>
<FormRender
form={form}
schema={schema}
labelCol={6}
fieldCol={17}
/>
</>
);
}
```
## lableWidth
设置标签固定宽度
```jsx
import React, { useState } from 'react';
import { InputNumber } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/basic';
export default () => {
const form = useForm();
const [labelWidth, setLabelWidth] = useState(60);
return (
<>
<div style={{ marginBottom: '50px' }}>
labelWidth:
<InputNumber onChange={setLabelWidth} value={labelWidth} />
</div>
<FormRender
form={form}
schema={schema}
labelWidth={labelWidth}
column={3}
/>
</>
);
};
```
## cellSpan
设置表单项跨列展示,目前需配合 `lableWidth` 来使用,否则无法与其他表单项在样式上对齐,通过配置单个表单项的 `labelCol`、`fieldCol` 勉强能改善
```jsx
import React, { useState } from 'react';
import { InputNumber } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/cellSpan';
export default () => {
const form = useForm();
const [labelWidth, setLabelWidth] = useState(60);
return (
<FormRender
form={form}
schema={schema}
labelWidth={60}
column={3}
/>
);
};
```
## span
设置表单项列宽度,表单布局会被切割成 24 等份,可以通过设置 span 来自定义表单项所占的宽度
```jsx
import React, { useState } from 'react';
import { InputNumber } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/span';
export default () => {
const form = useForm();
const [labelWidth, setLabelWidth] = useState(60);
return (
<FormRender
form={form}
schema={schema}
labelWidth={80}
maxWidth={300}
/>
);
};
```
## maxWidth
表单项控件的最大宽度
```jsx
import React, { useState } from 'react';
import { InputNumber } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/basic';
export default () => {
const form = useForm();
const [maxWidth, setMaxWidth] = useState(320);
return (
<>
<div style={{ marginBottom: '50px' }}>
maxWidth:
<InputNumber onChange={setMaxWidth} value={maxWidth} />
</div>
<FormRender
form={form}
schema={{
...schema,
column: 1
}}
maxWidth={maxWidth}
labelWidth={60}
/>
</>
);
};
```
## labelCol & fieldCol
- `labelCol`(标签占位格数),`fieldCol`(控件占位格数)
- 默认配置:
```js
// 当表单一行 一列 展示时
labelCol: 5
fieldCol: 9
// 当表单一行 两列 展示时
labelCol: 6
fieldCol: 14
// 当表单一行 两列以上 展示时
labelCol: 7
fieldCol: 16
```
实际业务中标签可能会比较长,默认配置无法满足布局,可以通过配置 `labelCol`、`fieldCol` 进行调整,两者加起来不超过 `24` 格数即可。
`labelCol`、`fieldCol` 也可以是复杂对象,具体配置规则参照 Antd Col 组件
```jsx
import React, { useState } from 'react';
import { InputNumber, Space } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/basic';
export default () => {
const form = useForm();
const [labelCol, setLabelCol] = useState(6);
const [fieldCol, setFieldcol] = useState(17);
return (
<>
<Space style={{ marginBottom: '50px' }}>
<span>
labelCol:
<InputNumber onChange={setLabelCol} value={labelCol} />
</span>
<span>
fieldCol:
<InputNumber onChange={setFieldcol} value={fieldCol} />
</span>
</Space>
<FormRender
form={form}
schema={schema}
labelCol={labelCol}
fieldCol={fieldCol}
/>
</>
)
};
```
## footer
- `footer`:true,显示默认配置
```jsx
import React, { useState } from 'react';
import { Button, Space, Form, Radio } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/simple';
export default () => {
const form = useForm();
return (
<FormRender
schema={schema}
form={form}
maxWidth={360}
footer={true}
/>
);
}
```
- 按钮属性配置
```jsx
import React, { useState } from 'react';
import { Button, Space, Form, Radio } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/simple';
export default () => {
const form = useForm();
return (
<FormRender
schema={schema}
form={form}
maxWidth={360}
footer={{
submit: {
text: '确定',
// loading: true
// hide: true
// ...btnProps
},
reset: {
text: '清空',
// hide: true
// ...btnProps
}
}}
/>
);
}
```
- `footer` 自定义
```jsx
import React, { useState } from 'react';
import { Button, Space, Form, Radio } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/simple';
export default () => {
const form = useForm();
return (
<FormRender
schema={schema}
form={form}
maxWidth={360}
footer={() => (
<Button>自定义</Button>
)}
/>
);
}
```
- `footer` dom 元素透传
```jsx
import React, { useState } from 'react';
import { Button, Space, Form, Radio } from 'antd';
import FormRender, { useForm } from 'form-render';
import schema from './schema/simple';
export default () => {
const form = useForm();
return (
<FormRender
schema={schema}
form={form}
maxWidth={360}
footer={(dom) => (
<Space>{dom}</Space>
)}
/>
);
}
```
================================================
FILE: docs/form-render/advanced-linkage.md
================================================
---
order: 1
toc: content
mobile: false
group:
title: 高级用法
order: 1
---
# 表单联动
表单联动是开发中常见的交互,FormRender 提供以下几种方式来满足不同的交互场景
- `{{ }}` 函数表达式,实现简单联动
- `watch` watch 监听,实现复杂联动
- `dependencies` 依赖字段设置,当依赖项数据发生变化时,触发更新
## {{ }} 函数表达式
函数表达式为字符串格式,并以双花括号`"{{...}}"`为语法特征,用一种简洁的配置方式来支持联动。例如:控制表单项禁用、隐藏等交互。
```json
{
"disabled": "{{ formData.switch1 === true }}",
"hidden": "{{ rootValue.input1 }}"
}
```
- formData: 整个表单的值
- rootValue: 用于 List 场景使用,表示 List.Item 的值
#### 示例
```jsx
import React from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
properties: {
switch1: {
title: '禁用输入框',
type: 'boolean',
widget: 'switch'
},
input1: {
title: '输入框',
type: 'string',
disabled: '{{ formData.switch1 === true }}'
},
list: {
title: 'List 场景',
type: 'array',
widget: 'CardList',
defaultValue: [{}],
items: {
type: 'object',
widget: 'card',
title: 'List.Item',
properties: {
switch1: {
title: '隐藏输入框 2 ',
type: 'boolean',
widget: 'switch'
},
input1: {
title: '输入框 1',
type: 'string',
description: '给输入框 赋值'
},
input2: {
title: '输入框 2',
type: 'string',
defaultValue: '{{ rootValue.input1 }}',
hidden: '{{ rootValue.switch1 }}'
}
}
}
}
}
};
export default () => {
const form = useForm();
return (
<FormRender
schema={schema}
form={form}
maxWidth={400}
/>
);
}
```
## watch 监听
`watch` 其实就是 `onValuesChange`(不提供对外使用)的增强版,用于监听表单数据改变,可以做到单字段细粒度的监听。
语法特征:`[path]: () => {}`,path 按照表单的数据结构路径书写就可以了,List 组件的比较特殊,例如对应的表单字段是 cityList 需要写成 `cityList[]`。
```js
const watch = {
'#': (allValues, changedValues) => { // '#': () => {} 等同于 onValuesChange
console.log('表单 allValues:', allValues);
console.log('表单 changedValues:', changedValues);
},
'input1': value => {
console.log('input1:', value);
},
'obj.input2': (value) => {
console.log('input2:', value);
},
'list[].input4': (value, indexList) => {
console.log('list[].input4:', value, ',indexList:', indexList);
},
};
```
#### 示例
```jsx
import React from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
maxWidth: 400,
properties: {
input1: {
title: '输入框 1',
type: 'string',
},
obj: {
type: 'object',
widget: 'card',
title: '一级嵌套',
properties: {
input2: {
title: '输入框 2',
type: 'string'
}
}
},
list: {
title: 'List 嵌套',
type: 'array',
widget: 'cardList',
items: {
type: 'object',
title: 'List.Item',
properties: {
input4: {
title: '输入框 4',
type: 'string',
},
obj: {
type: 'object',
widget: 'card',
title: '一级嵌套',
properties: {
input5: {
title: '输入框 5',
type: 'string',
},
list: {
type: 'array',
widget: 'cardList',
items: {
type: 'object',
title: '二级 List.Item',
properties: {
input6: {
title: '输入框 6',
type: 'string'
}
}
}
}
}
}
}
}
}
}
};
export default () => {
const form = useForm();
const watch = {
'#': (allValues, changedValues) => { // '#': () => {} 等同于 onValuesChange
console.log('表单 allValues:', allValues);
console.log('表单 changedValues:', changedValues);
},
'input1': (value) => {
console.log('input1:', value);
},
'obj.input2': (value) => {
console.log('input2:', value);
},
'obj.obj.input3': (value) => {
console.log('input3:', value);
},
'list': (value) => {
console.log('list:', value);
},
'list[].input4': (value, indexList) => {
console.log('list[].input4:', value, ',indexList:', indexList);
},
'list[].obj.input5': (value, indexList) => {
console.log('list[].obj.input5:', value, ',indexList:', indexList);
},
'list[].obj.list': (value, indexList) => {
console.log('list[].obj.list:', value, ',indexList:', indexList);
},
'list[].obj.list[]': (value, indexList) => {
console.log('list[].obj.list:', value, ',indexList:', indexList);
},
'list[].obj.list[].input6': (value, indexList) => {
console.log('list[].obj.list[].input6:', value, ',indexList:', indexList);
}
}
return <FormRender schema={schema} form={form} watch={watch}/>;
};
```
#### 修改表单项的值 (value)
form.setValueByPath:指定路径对值进行修改。[path 路径详见](/form-render/advanced-path)。
```jsx
import React from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
displayType: 'row',
properties: {
input1: {
title: '输入框 A',
type: 'string',
placeholder: '给输入框 B 赋值',
},
input2: {
title: '输入框 B',
type: 'string',
disabled: true
},
},
};
export default () => {
const form = useForm();
const watch = {
input1: val => {
form.setValueByPath('input2', val);
}
};
return (
<FormRender
form={form}
schema={schema}
watch={watch}
labelWidth={200}
maxWidth={400}
/>
);
};
```
#### 修改表单项的协议(schema)
form.setSchemaByPath:指定路径对 schema 进行修改 (不允许通过此 API 修改 default)。[path 路径详见](/form-render/advanced-path)。
```jsx
import React, { useEffect } from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
displayType: 'row',
properties: {
input1: {
title: '输入框',
type: 'number',
placeholder: '当值大于1时,会改变下拉框的选项',
},
select: {
title: '下拉框',
type: 'string',
enum: ['a', 'b', 'c'],
enumNames: ['早', '中', '晚'],
widget: 'radio'
}
}
};
export default () => {
const form = useForm();
const watch = {
input1: val => {
if (val > 1) {
form.setSchemaByPath('select', ({ enumNames }) => {
return {
enumNames: enumNames.map(item => item + 'a'),
};
});
return ;
}
form.setSchemaByPath('select', { enumNames: ['早', '中', '晚'] });
}
};
return (
<FormRender
form={form}
schema={schema}
watch={watch}
labelWidth={200}
maxWidth={400}
/>
);
};
```
## dependencies 依赖字段
当依赖项的值发生改变时,组件自身会触发`更新`和`校验`,可以通过组件 props.addons.dependValues 拿到依赖项的值
- dependencies:[`string`] 设置依赖字段,支持设置多个
- 用 `{{ }}` 函数表达式同样能使组件触发更新,但是无法实现触发校验的效果,所以 dependencies 的核心场景是 `被动触发校验`
- 同 `{{ }}` 函数表达式另一不同的地方就是值传递给组件的方式不同,设置 dependencies,依赖项的值会统一收集到 props.addons.dependValues 里面。
#### 示例 1:触发更新
依赖值发生变化,自定义组件触发更新
```json
{
"dependencies": ["input1"], // 方式一
"props": { // 方式二
"rows": "{{ formData.input1 }}"
}
}
```
```jsx
import React from 'react';
import { Input, } from 'antd';
import FormRender, { useForm } from 'form-render';
const { TextArea } = Input;
const CustomTextArea = props => {
console.log(props.addons.dependValues, 'dependValues');
return <TextArea rows={props.addons.dependValues?.[0] || 2} {...props} />;
};
export default () => {
const form = useForm();
const schema = {
type: 'object',
displayType: 'row',
displayType: 'row',
properties: {
input1: {
title: '输入框高度',
type: 'number'
},
select1: {
title: '输入框',
type: 'string',
widget: 'CustomTextArea',
dependencies: ['input1'],
props: {
rows: '{{ formData.input1 }}'
}
}
}
};
return (
<FormRender
form={form}
schema={schema}
widgets={{ CustomTextArea }}
labelWidth={200}
maxWidth={400}
/>
);
}
```
#### 示例 2:触发校验
当`密码输入框`的值和`确认密码输入框`的值一致时,再次修改密码会重新触发 `确认密码输入框` 的校验
```jsx
import React from 'react';
import { Input, } from 'antd';
import FormRender, { useForm } from 'form-render';
const { TextArea } = Input;
const CustomTextArea = props => {
const { dependValues } = props;
console.log(dependValues, 'dependValues');
return <TextArea rows={dependValues?.[0] || 2} />;
};
export default () => {
const form = useForm();
const schema = {
type: 'object',
displayType: 'row',
properties: {
input1: {
title: '密码',
type: 'string',
required: true,
},
input2: {
title: '确认密码',
type: 'string',
dependencies: ['input1'],
required: true,
rules: [
{
validator: (_, value, { form }) => {
if (!value || form.getValueByPath('input1') === value) {
return true;
}
return false;
},
message: '你输入的两个密码不匹配'
}
]
}
}
};
return (
<FormRender
form={form}
schema={schema}
widgets={{ CustomTextArea }}
labelWidth={200}
maxWidth={400}
/>
);
}
```
#### Form List 中的依赖
- `[index]` 表示特定位置的 List Item,比如 `list[1].foo`。
- 只传 `[]` 则表示相同位置的其他 List Item,比如 `list[].foo`。
<code src="./demo/linkage/list.tsx"></code>
================================================
FILE: docs/form-render/advanced-path.md
================================================
---
order: 3
toc: content
mobile: false
group:
title: 高级用法
order: 1
---
# path 书写
调用 setSchemaByPath 时,需要根据 path 改动表单元素的 schema。如果元素结构很深,如何正确书写 path 呢?
## 基础型:path
设置选项:form.setSchemaByPath('radio', { enum: [1, 2, 3] });
```jsx
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
import React from 'react';
const Demo = () => {
const form = useForm();
const onMount = () => {
setTimeout(() => {
form.setSchemaByPath('radio', { enum: [1, 2, 3] });
}, 1000);
};
const schema = {
type: 'object',
displayType: 'row',
properties: {
radio : {
title: '选择框',
type: 'string',
widget: 'radio',
enum: []
}
}
};
return (
<FormRender
form={form}
schema={schema}
onMount={onMount}
labelWidth={100}
maxWidth={400}
/>
);
};
export default Demo;
```
## 嵌套型:path
设置选项:form.setSchemaByPath('x.radio', { enum: [1, 2, 3] });
```jsx
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
import React from 'react';
const Demo = () => {
const form = useForm();
const schema = {
type: 'object',
displayType: 'row',
properties: {
x: {
type: 'object',
title: 'xxx',
properties: {
radio: {
title: '选择框',
type: 'string',
widget: 'radio',
enum: []
}
}
}
}
};
const onMount = () => {
setTimeout(() => {
form.setSchemaByPath('x.radio', { enum: [1, 2, 3] });
}, 1000);
};
return (
<FormRender
form={form}
schema={schema}
onMount={onMount}
labelWidth={100}
maxWidth={400}
/>
);
};
export default Demo;
```
## 列表型:path
设置选项:form.setSchemaByPath('x[].radio', { enum: [1, 2, 3] });
```jsx
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
import React from 'react';
const Demo = () => {
const form = useForm();
const schema = {
type: 'object',
displayType: 'row',
properties: {
x: {
title: '对象数组',
type: 'array',
default: [{}],
items: {
type: 'object',
properties: {
radio : {
title: '选择框',
type: 'string',
widget: 'radio',
enum: []
}
}
}
}
}
};
const onMount = () => {
setTimeout(() => {
form.setSchemaByPath('x[].radio', { enum: [1, 2, 3] });
}, 1000);
};
return (
<FormRender
form={form}
schema={schema}
onMount={onMount}
labelWidth={100}
maxWidth={400}
/>
);
};
export default Demo;
```
## 复杂嵌套:path
设置选项:form.setSchemaByPath('x.y[].radio', { enum: [1, 2, 3] });
```jsx
import { Button } from 'antd';
import FormRender, { useForm } from 'form-render';
import React from 'react';
const Demo = () => {
const form = useForm();
const schema = {
type: 'object',
displayType: 'row',
properties: {
select1: {
title: '输入框 A',
type: 'string',
},
select2: {
title: '输入框 B',
type: 'string',
},
x: {
type: 'object',
title: '复杂型',
widget: 'lineTitle',
properties: {
y: {
title: '对象数组',
type: 'array',
display: 'inline',
default: [{}],
items: {
type: 'object',
title: '基础信息',
properties: {
radio : {
title: '选择框',
type: 'string',
widget: 'radio',
enum: []
}
}
}
}
}
}
}
};
const onMount = () => {
setTimeout(() => {
form.setSchemaByPath('x.y[].radio', { enum: [1, 2, 3] });
}, 1000);
};
return (
<FormRender
form={form}
schema={schema}
onMount={onMount}
labelWidth={100}
maxWidth={400}
/>
);
};
export default Demo;
```
================================================
FILE: docs/form-render/advanced-slimrender.md
================================================
---
order: 4
toc: content
mobile: false
group:
title: 高级用法
order: 1
---
# 组件按需
FormRender 内置了很多控件,包括基础控件、嵌套控件、以及列表控件。有些组件可能在项目中从来都不会用到,希望组件按需引入。
这种情况下可以使用 `FormSlimRender` 按需加载组件,将需要的组件传入内部。
## 使用方式
<code src="./demo/form-slim/basic.tsx"></code>
## 列表组件
对于列表组件的按需使用,除了引入列表本身,还需引入列表嵌套组件,否则不能正常渲染。
<code src="./demo/form-slim/form-list.tsx"></code>
默认的嵌套组件为 `Collapse`,如需使用其他嵌套组件,需要在 schema 中指定 widget 属性。
```js
const schema = {
type: 'object',
displayType: 'row',
properties: {
list: {
title: '列表按需',
type: 'array',
widget: 'simpleList',
items: {
type: 'object',
widget: 'Card', // 自定义嵌套组件
properties: {
input1: {
title: '输入框',
type: 'string',
},
},
},
},
},
};
```
## 内置的组件
```js
// 基础控件
Input,
Number,
TextArea,
Select,
MultiSelect,
Switch,
Radio,
CheckBox,
Checkboxes,
Date,
DateRange,
Time,
TimeRange,
Color,
Rate,
TreeSelect,
ImageInput,
UrlInput,
Slider,
Upload,
Html,
PercentSlider,
// 嵌套控件
Card,
Collapse,
SubInline,
LineTitle,
// 列表控件
SimpleList,
CardList,
TableList,
DrawerList,
VirtualList,
TabList,
```
================================================
FILE: docs/form-render/advanced-validate.md
================================================
---
order: 2
toc: content
mobile: false
group:
title: 高级用法
order: 1
---
# 表单校验
- 通过内置校验字段配置,实现简单校验逻辑
- 通过 rules 配置,实现复杂校验逻辑
- 通过 validateMessages 实现校验提示模版定制
### 一、内置校验
- required:必填
- max:最大长度 | 最大值
- min:最小长度 | 最小值
- format:url | email | image | color
```jsx
import React from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
displayType: 'row',
properties: {
input1: {
title: '必填',
type: 'string',
required: true,
},
input2: {
title: '数字最大值',
type: 'number',
max: 2,
required: true
},
input3: {
title: '数字最小值',
type: 'number',
min: 10,
required: true,
},
input4: {
title: '字符最大长度',
type: 'string',
max: 2,
required: true,
},
input5: {
title: '字符最小长度',
type: 'string',
min: 10,
required: true,
},
input6: {
title: 'url 校验',
type: 'string',
required: true,
format: 'url',
},
input7: {
title: 'email 校验',
type: 'string',
required: true,
format: 'email',
},
input8: {
title: '图片格式校验',
type: 'string',
required: true,
format: 'image',
}
}
};
export default () => {
const form = useForm();
return (
<FormRender
schema={schema}
form={form}
footer={true}
/>
)
};
```
### 二、Rules 校验
- 全面拥抱 Antd Form Rules
- 自定义校验 validator:做了一点小小的改变,validator 直接返回布尔值。
```jsx
import React from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
displayType: 'row',
properties: {
input1: {
title: '正则表达式',
type: 'string',
required: true,
rules: [
{ pattern: '^[\u4E00-\u9FA5]+$', message: '请输入中文!' }
]
},
input2: {
title: '自定义校验',
type: 'string',
rules: [
{
validator: (_, value) => {
const pattern = '^[\u4E00-\u9FA5]+$';
const result = new RegExp(pattern).test(value);
return result;
// 或者是返回一个对象,用于动态设置 message 内容
// return {
// status: result,
// message: '请输入中文!',
// }
},
message: '请输入中文!'
}
]
}
}
};
export default () => {
const form = useForm();
return (
<FormRender
schema={schema}
form={form}
footer={true}
/>
)
};
```
### 三、子表单校验
自定义组件是一个子表单时,表单提交是无法触发子表单进行校验的,所以这种类型的子组件需要单独处理
```js
import { useImperativeHandle } from 'react';
const ChildForm = (props) => {
// 内部校验方法,异步校验请用 async、await 语法
const validator = async () => {
return true; // 返回 boolean 值,true 表示内部校验通过
// 如果需在外部显示子表单错误信息可以使用对象形式返回
// retrun { status: boolean, message: string };
};
useImperativeHandle(props.addons.fieldRef, () => {
// 将校验方法暴露出去,方便外部表单提交时,触发校验
return {
validator
};
});
return (
...// 表单渲染代码
);
}
export default ChildForm;
```
### 四、定制校验模版
- 全面拥抱 Antd Form Rules
- validateMessages:通过配置 validateMessages 定制校验模版,可以按需定制,定制模版会和默认校验模版进行合并处理
```jsx
import React from 'react';
import FormRender, { useForm } from 'form-render';
const schema = {
type: 'object',
displayType: 'row',
properties: {
input1: {
title: '地址(必填)',
type: 'string',
required: true,
}
}
};
export default () => {
const form = useForm();
const validateMessages = {
required: '${label} 不能为空',
};
return (
<FormRender
schema={schema}
form={form}
footer={true}
validateMessages={validateMessages}
/>
)
};
```
### 五、默认模版内容
- 中文模版
```Js
const typeTemplate = '${label}的类型不是${label}';
const validateMessagesCN = {
default: '${label}未通过校验',
required: '${label}必填',
whitespace: '${label}不能为空',
date: {
format: '${label}的格式错误',
parse: '${label}无法被解析',
invalid: '${label}数据不合法',
},
types: {
string: typeTemplate,
method: typeTemplate,
array: typeTemplate,
object: typeTemplate,
number: typeTemplate,
date: typeTemplate,
boolean: typeTemplate,
integer: typeTemplate,
float: typeTemplate,
regexp: typeTemplate,
email: typeTemplate,
url: typeTemplate,
hex: typeTemplate,
},
string: {
len: '${label}长度不是${len}',
min: '${label}长度不能小于${min}',
max: '${label}长度不能大于${max}',
range: '${label}长度需在${min}与${max}之间',
},
number: {
len: '${label}不等于${len}',
min: '${label}不能小于${min}',
max: '${label}不能大于${max}',
range: '${label}需在${min}与${max}之间',
},
array: {
len: '${label}长度不是${len}',
min: '${label}长度不能小于${min}',
max: '${label}长度不能大于${max}',
range: '${label}长度需在${min}与${max}之间',
},
pattern: {
mismatch: '${label}未通过正则判断${pattern}',
},
};
```
- 英文模版
```Js
const typeTemplate = "'${label}' is not a valid ${type}";
const validateMessages = {
default: "Validation error on field '${label}'",
required: "'${label}' is required",
enum: "'${label}' must be one of [${enum}]",
whitespace: "'${label}' cannot be empty",
date: {
format: "'${label}' is invalid for format date",
parse: "'${label}' could not be parsed as date",
invalid: "'${label}' is invalid date",
},
types: {
string: typeTemplate,
method: typeTemplate,
array: typeTemplate,
object: typeTemplate,
number: typeTemplate,
date: typeTemplate,
boolean: typeTemplate,
integer: typeTemplate,
float: typeTemplate,
regexp: typeTemplate,
email: typeTemplate,
url: typeTemplate,
hex: typeTemplate,
},
string: {
len: "'${label}' must be exactly ${len} characters",
min: "'${label}' must be at least ${min} characters",
max: "'${label}' cannot be longer than ${max} characters",
range: "'${label}' must be between ${min} and ${max} characters",
},
number: {
len: "'${label}' must equal ${len}",
min: "'${label}' cannot be less than ${min}",
max: "'${label}' cannot be greater than ${max}",
range: "'${label}' must be between ${min} and ${max}",
},
array: {
len: "'${label}' must be exactly ${len} in length",
min: "'${label}' cannot be less than ${min} in length",
max: "'${label}' cannot be greater than ${max} in length",
range: "'${label}' must be between ${min} and ${max} in length",
},
pattern: {
mismatch: "'${label}' does not match pattern ${pattern}",
},
};
```
================================================
FILE: docs/form-render/advanced-widget.md
================================================
---
order: 2
toc: content
mobile: false
group:
title: 高级用法
order: 1
---
# 自定义组件
在实际的开发中,可能会遇到如下的应用场景:
- 我需要写一个异步加载的搜索输入框(普适性不高/难以用 schema 描述的组件)
- 我们团队使用 xxx ui,与 antd 不搭,希望能适配一套 xxx ui 组件的 FormRender(欢迎 Pull Request)
- 我需要在表单内部写一个 excel 上传按钮(完全定制化的需求)
FormRender 内置的控件可能不能满足功能上的需要,这时就需要自定义组件 widget 的支持
使用自定义组件前,也许已经有内置组件支持。具体见 [内置组件](/form-render/display-row)
:::info
如果是新增一个常用组件,建议给 FormRender 维护的同学来提 Pull Request 或 Issue 并说明你的使用场景,这样可以更好扩展其生态,FormRender 的社区以及提供了部分 [常用自定义组件](https://github.com/alibaba/x-render/tree/master/widgets)。
:::
## 什么是 Widget
widget 只是一个普通的 React 组件,它会接收到 FormRender 传递给它的一些 props。开发者可以根据这些 props 完成控件的受控、联动、校验等操作。
比方说,我想在一个常规输入框的后面放一个按钮用于发送验证码。FormRender 的内置组件不能满足需求,那么我可以写一个如下的自定义组件:
```js
const CaptchaInput = (props: any) => {
const { value, onChange } = props;
console.log('widget props:', props);
const sendCaptcha = (phone: string) => {
console.log('send captcha to:', phone);
}
return (
<Space>
<Input
value={value}
onChange={(e) => onChange(e.target.value)}
placeholder="请输入手机号"
/>
<Button onClick={() => sendCaptcha(value)}>发送验证码</Button>
</Space>
);
};
```
## 使用 Widget
首先在 `<FormRender />` 中注册 widget。
```js
import CaptchaInput from 'my/widgets';
<FormRender widgets={{ CaptchaInput }} />
```
之后在 Schema 中指定 item 的 widget 属性为刚刚注册的 widget。
```js
const schema = {
type: 'object',
properties: {
phone: {
title: '网址输入自定义组件',
type: 'string',
// 指定为刚刚注册的 widget
widget: 'CaptchaInput',
}
}
};
```
完整代码如下:
<code src="./demo/widget/basic.tsx"></code>
## Widget 接收到的 props
默认情况下 Widget 会接收到如下的 props:
### id
- 类型:`string`
- 描述:当前 item 在表单中的唯一 key,一般用不到
### schema
- 类型:`Schema`
- 描述:当前 item 的 schema
### value
- 类型:`any`
- 描述:当前 item 的值,用于 widget 的受控
### onChange
- 类型:`(value: any) => void`
- 描述:当前 item 的值变化时的回调用于 widget 的受控
### disabled
- 类型:`boolean`
- 描述:当前 item 是否为禁用状态,如果没有单独为这个 item 指定,那么就继承全局的 `disabled` 属性
### readOnly
- 类型:`boolean`
- 描述:当前 item 是否为只读状态,如果没有单独为这个 item 指定,那么就继承全局的 `readOnly` 属性
### addons
addons 包含了全部的表单实例方法,详见 [FormInstance](/form-render/api-props#forminstance),这里不再赘述。除此之外 addons 还包含了如下一些额外属性。
#### addons.globalProps
- 类型:`Record<string, any>`
- 描述:全局属性
#### addons.dataIndex
- 类型:`string[]`
- 描述:是自上到下所有经过的数组的 index 按顺序存放的一个数组类型。例如当前的 `dataPath` 为 `a.b[2].c[0].d`,那么这时的 `dataIndex` 就为 `[2,0]`。
:::info
如果不是在 Form List 中,那么 `dataIndex` 始终为一个空数据 `[]`。
:::
#### addons.dataPath
- 类型:`string`
- 描述:目前数据所在的 path,例如`a.b[2].c[0].d`,详见 [Path 书写](/form-render/advanced-path)
#### addons.schemaPath
- 类型:`string`
- 描述:当前 item 的 schema 在整体中的路径
#### addons.dependValues
- 类型:`any[]`
- 描述:当自定义组件对应的 schema 使用到 dependencies 字段时,在此获得 dependencies 对应的表单项的实时的值
### others
实际上任何写入当前 schema 的 props 中的属性都会透传给 widget,所以你不必把所有自定义的属性都写在 widget 内部,更好的方式是通过 schema 控制,以得到更好的复用性。
:::error
在编写 props 时请避开 `value`、`onChange`、`addons` 等字段防止 FormRender 注入的 props 被覆盖。
:::
```js
const shcema = {
type: 'object',
properties: {
name: {
title: '姓名',
type: 'string',
widget: 'MyInput',
// props 中的属性都会透传给自定义组件 MyInput
props: {
addonAfter: 'name',
allowClear: true,
foo: 'xxx',
}
}
}
}
```
## 使用表达式联动
表达式是 FormRender 实现简单联动的一个方式。上面提到 widget 会接收到 props 中的属性,这其中也包括使用表达式的字段。FormRender 会先表达式根据表单状态表达式进行转换,然后传递给 widget,并且实时的更新这个属性。我们可以利用这一点很方便的实现一些表单联动。
`formData` 关键字当前全部的表单状态,对于 Form List 的场景,使用 `rootValue` 关键字来表示当前 List Item 的数据。详见 [表单联动](/form-render/advanced-linkage)
```js
const shcema = {
type: 'object',
properties: {
age: {
title: '年龄',
type: 'string',
},
name: {
title: '姓名',
type: 'string',
widget: 'MyInput',
props: {
// 当 age 字段更新时,自定义组件 MyInput 会接收到最新的 age 属性
age: '{{ formData.age }}'
}
},
}
}
```
完整示例如下:
<code src="./demo/widget/linkage.tsx"></code>
## 使用 dependencies 联动
除了使用表达式联动,widget 还可以使用 `dependencies` 属性进行联动。首先在 schema 中定义好 `dependencies`,比如:
```js
const shcema = {
type: 'object',
properties: {
age: {
title: '年龄',
type: 'string',
},
name: {
title: '姓名',
type: 'string',
widget: 'MyInput',
// 指定依赖的字段
dependencies: ['age']
},
}
}
```
之后在 widget 的 `props.addons.dependValues` 中可以拿到依赖的值。
```js
const MyInput = (props) => {
const { addons } = props;
console.log('dependValues:', addons.dependValues);
// dependValues: ['xxxx']
return (
// ...
)
}
```
与上面同样的例子,使用 `dependencies` 的代码如下:
<code src="./demo/widget/depend-linkage.tsx"></code>
:::info
`dependencies` 除了触自动更新之外,还能触发校验,详见 [表单联动](/form-render/advanced-linkage#dependencies-依赖字段)
:::
## 其他 Widget
除了输入控件可以自定义 widget 之外,Form Render 还提供了自定义一个表单项其他部分的能力。
### readOnlyWidget
只读模式下,默认会渲染内置的 html 组件,但有时 html 组件并不能满足一个自定义组件在只读模式下需要的展示,此时可使用`readOnlyWidget`字段来指定只读模式下的展示。
```js
const schema = {
type: 'object',
properties: {
string: {
title: 'ReadOnly widget',
type: 'string',
widget: 'SiteInput',
readOnlyWidget: 'ReadOnlySiteInput',
},
},
};
```
如果你打算在一个自定义组件里通过 readOnly 参数判断条件展示,既是说,site 组件已经写了只读和非只读情况下的渲染
```js
const SiteInput = ({ readOnly, value, ...rest }: WidgetProps) => {
if (readOnly) return <a href={`https://${value}.com`}>{`https://${value || ''}.com`}</a>;
return (
<Input addonBefore="https://" addonAfter=".com" value={value} {...rest} />
);
};
```
此时可以指定 `readOnlyWidget` 和 `widget` 为同一个组件:
```js
const schema = {
type: 'object',
properties: {
string: {
title: 'ReadOnly widget',
type: 'string',
widget: 'SiteInput',
readOnlyWidget: 'SiteInput',
},
},
};
```
完整代码如下:
<code src="./demo/widget/readonly-widget.tsx"></code>
### labelWidget
使用 `labelWidget` 自定义 label 组件,此时 widget 接收到的 props 只有 `schema`。
<code src="./demo/widget/label-widget.tsx"></code>
### descWidget
使用 `descWidget` 自定义 description 组件,此时 widget 接收到的 props 只有 `schema`。
<code src="./demo/widget/desc-widget.tsx"></code>
## 统一管理 Widget
同一个项目下不同的 form 里,使用到的自定义组件可能大致相同,但也有可能互相不同,我们建议是中心化一个 Form 组件,并一次性将所有需要的自定义组件注入其中。在项目的各处引入对应组件:
```js
// /Component/FormRender.js
import Form from 'form-render';
import Cascade from './Cascade';
import Percentage from './Percentage';
import MyCheckBox from './MyCheckBox';
import ExcelUploader from './ExcelUploader';
export default props => (
<Form
widgets={{
Percentage,
Cascade,
MyCheckBox,
ExcelUploader
}}
{...props}
/>
);
```
然后在每个 form 页面统一引入使用
```js
import { useForm } from 'form-render';
import FormRender from './Component/FormRender';
const Demo = props => {
const form = useForm();
return <FormRender form={form} onFinish={() => {}} />;
};
```
## 使用 TS
使用 `WidgetProps` 获得自定义组件 props 的类型支持。
```ts
import { FC } from 'react';
import type { WidgetProps } from 'form-render';
const MyWidget: FC<WidgetProps> = (props) => {
const { value, onChange, addons } = props;
return (
<div>My Widget</div>
)
}
export default MyWidget;
```
================================================
FILE: docs/form-render/api-props.md
================================================
---
order: 0
mobile: false
group:
title: API
order: 4
---
# 表单属性
## Props
| <div style="width:200px">参数</div> | 说明 | 类型 | <div style="width:100px">默认值</div> |
| ---------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------ |
| schema | **必填**,描述表单的 schema,详见 [协议配置项](/form-render/api-schema) | <a target="_blank" href="https://github.com/alibaba/x-render/blob/e2feff8fdb3bef5537b92a2157dbbf40b9d4eb17/packages/form-render/src/type.ts#L32">SchemaBase</a> | - |
| form | **必填**,`useForm` 创建的表单实例,与 Form 一对一绑定,详见[Forminstance](#forminstance) | `FormInstance` | - |
| onFinish | 提交后的回调,执行 `form.submit()` 后触发 | `(data) => void` | - |
| beforeFinish | 在 onFinish 前触发,一般用于外部校验逻辑的回填 | `({ data, errors, schema, ...rest }) => Error[] \| Promise<Error[]>` | - |
| onMount | 表单首次加载时触发 | `() => void` | - |
| displayType | 表单元素与 label 同行 or 分两行展示, inline 则整个展示自然顺排 | `'column' \| 'row' \| 'inline'` | column |
| labelAlign | label 标签的文本对齐方式 | `'left' \| 'right'` | right |
| colon | 是否显示 label 后面的冒号 | `boolean` | true |
| globalConfig | 表单全局配置,详见 [GlobalConfig](/form-render/api-props#globalconfig) | `GlobalConfig` | true |
| globalProps | 全局属性,注入到 widget 的 `addons.globalProps` 中 | `Record<string, any>` | - |
| widgets | 自定义组件,当内置组件无法满足时使用,详见[自定义组件](/form-render/advanced-widget) | `Record<string, ReactNode>` | - |
| watch | 监听表单的数据变化,详见 [Watch 监听](/form-render/advanced-linkage#watch-监听) | `Record<string, (val: any) => void \| { handler:(val:any) => void,immediate?: boolean }>` | - |
| removeHiddenData | 提交数据的时候是否去掉已经被隐藏的元素的数据,默认隐藏 | `boolean` | true |
| readOnly | 只读模式,一般用于预览展示,全文 text 展示 | `boolean` | false |
| className | 顶层 className | `string` | - |
| style | 顶层 style | `CSSProperties` | - |
| column | 一行展示多少列 | `number` | 1 |
| disabled | 禁用全部表单项 | `boolean` | false |
|scrollToFirstError | 提交失败自动滚动到第一个错误字段,默认关闭 | `boolean \|` <a href="https://github.com/scroll-into-view/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options" target="_blank">ScrollOptions</a> | false
| locale | 展示语言,目前只支持中文、英文 | `'zh-CN' \| 'en-US'` | zh-CN |
| configProvider | antd 的 configProvider,配置透传 | <a href="https://ant-design.antgroup.com/components/config-provider-cn/#API" target="_blank">ConfigProviderProps</a> | - |
| validateMessages | 修改默认的校验提示信息,详见[ValidateMessages](/form-render/advanced-validate) | `Record<string, string>` | - |
| id | 表单的 id,一般用于标识一个表单的语义化名称 | `string \| number` | - |
| antdVersion | antd 的版本 | `v4 \| v5` | `v5` |
## FormInstance
| <div style="width:200px">参数</div> | 描述 | 类型 |
| ----------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| submit | 触发提交流程,一般在提交按钮上使用 | `() => void` |
| resetFields | 清空表单(也会清空一些内置状态,例如校验) | `(fieldPath?: Path[]) => void` |
| setErrorFields | 外部手动修改 errorFields 校验信息,用于外部校验回填 | `(error: Error[]) => void` |
| setValues | 外部手动修改 formData,用于已填写的表单的数据回填 | `(formData:
gitextract_d43v9j5z/
├── .dumi/
│ ├── loading.tsx
│ ├── theme/
│ │ ├── builtins/
│ │ │ └── TypeSchema/
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── layouts/
│ │ │ └── GlobalLayout/
│ │ │ └── index.tsx
│ │ └── slots/
│ │ └── Header/
│ │ ├── GithubLink.tsx
│ │ ├── Navigation.tsx
│ │ ├── ThemeSwitch.tsx
│ │ ├── index.less
│ │ └── index.tsx
│ └── tmp-production/
│ ├── core/
│ │ ├── EmptyRoute.tsx
│ │ ├── defineApp.ts
│ │ ├── exportStaticRuntimePlugin.ts
│ │ ├── helmet.ts
│ │ ├── helmetContext.ts
│ │ ├── history.ts
│ │ ├── historyIntelli.ts
│ │ ├── plugin.ts
│ │ ├── pluginConfig.ts
│ │ ├── pluginConfigJoi.d.ts
│ │ ├── polyfill.ts
│ │ ├── route.tsx
│ │ └── terminal.ts
│ ├── dumi/
│ │ ├── exportStaticRuntimePlugin.ts
│ │ ├── exports.ts
│ │ ├── locales/
│ │ │ ├── config.ts
│ │ │ └── runtime.tsx
│ │ ├── meta/
│ │ │ ├── atoms.ts
│ │ │ ├── index.ts
│ │ │ ├── runtime.ts
│ │ │ └── tabs.ts
│ │ └── theme/
│ │ ├── ContextWrapper.tsx
│ │ ├── builtins/
│ │ │ ├── API.ts
│ │ │ ├── Badge.ts
│ │ │ ├── Container.ts
│ │ │ ├── Previewer.ts
│ │ │ ├── SourceCode.ts
│ │ │ └── Table.ts
│ │ ├── layouts/
│ │ │ └── DocLayout.ts
│ │ └── slots/
│ │ ├── ColorSwitch.ts
│ │ ├── Content.ts
│ │ ├── ContentTabs.ts
│ │ ├── Features.ts
│ │ ├── Footer.ts
│ │ ├── HeadeExtra.ts
│ │ ├── Header.ts
│ │ ├── Hero.ts
│ │ ├── HeroTitle.ts
│ │ ├── LangSwitch.ts
│ │ ├── Logo.ts
│ │ ├── Navbar.ts
│ │ ├── NavbarExtra.ts
│ │ ├── NotFound.ts
│ │ ├── PreviewerActions.ts
│ │ ├── PreviewerActionsExtra.ts
│ │ ├── RtlSwitch.ts
│ │ ├── SearchBar.ts
│ │ ├── SearchResult.ts
│ │ ├── Sidebar.ts
│ │ ├── SocialIcon.ts
│ │ └── Toc.ts
│ ├── exports.ts
│ ├── testBrowser.tsx
│ └── umi.ts
├── .dumirc.ts
├── .editorconfig
├── .fatherrc.js
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ └── feature_request.md
│ └── workflows/
│ ├── ci.yml
│ ├── coverage.yml
│ ├── deploy.yml
│ ├── emoji-helper.yml
│ ├── issue-helper.yml
│ └── mirror.yml
├── .gitignore
├── .npmrc
├── .prettierignore
├── .prettierrc
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── README.md
├── app.ts
├── docs/
│ ├── data-render/
│ │ ├── data/
│ │ │ └── basic.ts
│ │ ├── index.md
│ │ └── schema/
│ │ └── basic.ts
│ ├── form-render/
│ │ ├── advaced-example.md
│ │ ├── advanced-bind.md
│ │ ├── advanced-layout.md
│ │ ├── advanced-linkage.md
│ │ ├── advanced-path.md
│ │ ├── advanced-slimrender.md
│ │ ├── advanced-validate.md
│ │ ├── advanced-widget.md
│ │ ├── api-props.md
│ │ ├── api-schema.md
│ │ ├── changelog.md
│ │ ├── demo/
│ │ │ ├── FormRender.jsx
│ │ │ ├── bind.tsx
│ │ │ ├── defaultChange.tsx
│ │ │ ├── dymic.tsx
│ │ │ ├── form-slim/
│ │ │ │ ├── basic.tsx
│ │ │ │ └── form-list.tsx
│ │ │ ├── linkage/
│ │ │ │ └── list.tsx
│ │ │ ├── outLabelCol.tsx
│ │ │ ├── validateFields.tsx
│ │ │ └── widget/
│ │ │ ├── basic.tsx
│ │ │ ├── depend-linkage.tsx
│ │ │ ├── desc-widget.tsx
│ │ │ ├── label-widget.tsx
│ │ │ ├── linkage.tsx
│ │ │ └── readonly-widget.tsx
│ │ ├── disaply-search.md
│ │ ├── display-row.md
│ │ ├── faq.md
│ │ ├── index.md
│ │ ├── migrate.md
│ │ ├── schema/
│ │ │ ├── baseControl.ts
│ │ │ ├── basic.ts
│ │ │ ├── cellSpan.ts
│ │ │ ├── schema.ts
│ │ │ ├── simple.ts
│ │ │ └── span.ts
│ │ ├── test/
│ │ │ ├── bigJson.tsx
│ │ │ ├── bind.tsx
│ │ │ ├── dependencies.tsx
│ │ │ ├── disaply-column.md
│ │ │ ├── removeHidden.tsx
│ │ │ └── test.md
│ │ └── utils/
│ │ └── index.js
│ ├── form-render-mobile/
│ │ ├── api.md
│ │ ├── demo/
│ │ │ ├── allWidget.tsx
│ │ │ ├── basic.tsx
│ │ │ ├── card.tsx
│ │ │ ├── collaspa.tsx
│ │ │ ├── group.tsx
│ │ │ ├── index.tsx
│ │ │ └── list.tsx
│ │ ├── disaply.md
│ │ ├── index.md
│ │ └── test/
│ │ ├── index.tsx
│ │ └── test.md
│ ├── index.en-US.md
│ ├── index.zh-CN.md
│ ├── playground/
│ │ ├── controller/
│ │ │ ├── index.css
│ │ │ └── index.tsx
│ │ ├── customized/
│ │ │ └── AsyncSelect.js
│ │ ├── example/
│ │ │ └── expression.ts
│ │ ├── index.less
│ │ ├── index.md
│ │ ├── index.tsx
│ │ ├── json/
│ │ │ ├── basic.json
│ │ │ ├── demo.json
│ │ │ ├── dynamic-function.js
│ │ │ ├── format.json
│ │ │ ├── function.json
│ │ │ ├── input.json
│ │ │ ├── new-feature.json
│ │ │ ├── select.json
│ │ │ └── simplest.json
│ │ └── serialize.js
│ ├── schema-builder/
│ │ ├── api.md
│ │ └── index.md
│ ├── schema-builder-online/
│ │ └── index.md
│ ├── table-render/
│ │ ├── .test/
│ │ │ └── test.md
│ │ ├── api.md
│ │ ├── basic.md
│ │ ├── collapsed.md
│ │ ├── custom-table.md
│ │ ├── demo/
│ │ │ ├── basic/
│ │ │ │ └── index.tsx
│ │ │ ├── display/
│ │ │ │ └── custom-table.tsx
│ │ │ └── toolbar/
│ │ │ ├── basic.tsx
│ │ │ └── selection-tool.tsx
│ │ ├── index.md
│ │ ├── migrate.md
│ │ ├── noSearch.md
│ │ ├── promptly-search.md
│ │ ├── static/
│ │ │ ├── request.ts
│ │ │ ├── search.ts
│ │ │ └── table.tsx
│ │ ├── tabs.md
│ │ ├── toolbar.md
│ │ └── valueType.md
│ ├── tools/
│ │ ├── proptypes/
│ │ │ └── index.md
│ │ └── vscode/
│ │ └── index.md
│ └── xflow/
│ ├── FlowProvider.md
│ ├── api.md
│ ├── best-practices.md
│ ├── custom-node-setting.md
│ ├── custom-node-view.md
│ ├── data/
│ │ └── basic.ts
│ ├── demo/
│ │ ├── basic/
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── best/
│ │ │ ├── basic/
│ │ │ │ ├── TextEllipsis/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── const.tsx
│ │ │ │ ├── header.tsx
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ ├── setting.tsx
│ │ │ │ ├── showSwitchNode.tsx
│ │ │ │ └── tools.tsx
│ │ │ └── demo2/
│ │ │ ├── CustomSvg.tsx
│ │ │ ├── TextEllipsis/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── const.tsx
│ │ │ ├── header.tsx
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ ├── setting.tsx
│ │ │ ├── showSwitchNode.tsx
│ │ │ └── tools.tsx
│ │ ├── custom-flow/
│ │ │ ├── advancedLinkageCase/
│ │ │ │ ├── customWidget.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting.tsx
│ │ │ ├── customWidget.tsx
│ │ │ ├── fullCase/
│ │ │ │ ├── components/
│ │ │ │ │ ├── ReadOnlyPanel.tsx
│ │ │ │ │ ├── TagWidget.tsx
│ │ │ │ │ ├── customWidget.tsx
│ │ │ │ │ └── secondTagWidget.tsx
│ │ │ │ ├── const.ts
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting.ts
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── flow-provider/
│ │ │ ├── edges.ts
│ │ │ ├── index.tsx
│ │ │ ├── nodes.ts
│ │ │ └── setting.tsx
│ │ ├── layout/
│ │ │ ├── LR/
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting.tsx
│ │ │ └── TB/
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── log/
│ │ │ ├── buildIn-log/
│ │ │ │ ├── CustomGroupTittle.tsx
│ │ │ │ ├── DetailLogWidget.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── setting.tsx
│ │ │ │ └── utils.tsx
│ │ │ ├── custom-log/
│ │ │ │ ├── index.tsx
│ │ │ │ ├── setting.tsx
│ │ │ │ └── utils.tsx
│ │ │ ├── index.tsx
│ │ │ ├── runNode/
│ │ │ │ ├── index.tsx
│ │ │ │ ├── setting.tsx
│ │ │ │ └── utils.tsx
│ │ │ ├── setting.tsx
│ │ │ └── utils.tsx
│ │ ├── nodeSetting/
│ │ │ ├── data.tsx
│ │ │ ├── fullDemo/
│ │ │ │ ├── CustomImg.tsx
│ │ │ │ ├── CustomSvg.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── settings.ts
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── nodeWidget/
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ └── setting.ts
│ │ ├── parallelNode/
│ │ │ ├── custome/
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting.tsx
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── quickStart/
│ │ │ └── index.tsx
│ │ └── switchNode/
│ │ ├── customSwitchNode/
│ │ │ ├── index.tsx
│ │ │ └── setting.tsx
│ │ ├── index.tsx
│ │ └── setting.tsx
│ ├── index.md
│ ├── layout.md
│ ├── log.md
│ ├── nodeBuildIn.md
│ ├── nodeSetting.md
│ ├── question.md
│ ├── quickStart.md
│ ├── schema/
│ │ ├── basic.ts
│ │ ├── custom-settings.ts
│ │ └── settings.ts
│ ├── singlePointDebug.md
│ └── updateLog.md
├── lerna.json
├── package.json
├── packages/
│ ├── chart-render/
│ │ ├── .fatherrc.ts
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── ChartContainer/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ChartProvider/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Search/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── index.ts
│ │ │ ├── utils/
│ │ │ │ ├── index.ts
│ │ │ │ ├── store.ts
│ │ │ │ └── type.ts
│ │ │ └── widgets/
│ │ │ ├── Column/
│ │ │ │ └── index.tsx
│ │ │ └── Pie/
│ │ │ └── index.tsx
│ │ └── tsconfig.json
│ ├── data-render/
│ │ ├── .fatherrc.js
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── core/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── renderer.tsx
│ │ │ ├── index.ts
│ │ │ ├── models/
│ │ │ │ ├── context.ts
│ │ │ │ ├── expression.ts
│ │ │ │ ├── isHidden.ts
│ │ │ │ ├── resolver.tsx
│ │ │ │ └── store.ts
│ │ │ ├── type.ts
│ │ │ ├── utils/
│ │ │ │ └── common.ts
│ │ │ ├── widgets/
│ │ │ │ ├── FButton/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FButtonFold/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FCard/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FCollapse/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FDescriptions/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FEncryption/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FIconLabel/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FImage/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FLabel/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FPanel/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FProgress/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FProgressBar/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FRadioGroup/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FRow/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FSpace/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FStatistic/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FSteps/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FSuckNav/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTable/
│ │ │ │ │ ├── detalColumn.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTabs/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTags/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FText/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTextEllipsis/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTimeline/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTitle/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FTooltip/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── BaseCollapse/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── BaseTable/
│ │ │ │ │ │ ├── basic.ts
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── CopyLabel/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── Encryption/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── IconLabel/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── IconView/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── InnerHtml/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── ReactNode/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── RequestTable/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── SuckTabs/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── TextEllipsis/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── TextView/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── utils/
│ │ │ │ ├── common.ts
│ │ │ │ ├── createIconFont.ts
│ │ │ │ └── hooks.ts
│ │ │ └── withProvider.tsx
│ │ └── tsconfig.json
│ ├── form-render/
│ │ ├── .fatherrc.js
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── core-utils.spec.ts
│ │ │ ├── demo.tsx
│ │ │ ├── form-demo.tsx
│ │ │ ├── form-fields.spec.tsx
│ │ │ ├── form.spec.tsx
│ │ │ ├── get-descriptor.spec.ts
│ │ │ ├── schema.ts
│ │ │ └── utils.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── derivative/
│ │ │ │ ├── SearchForm/
│ │ │ │ │ ├── ActionView.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ └── SlimRender/
│ │ │ │ └── index.tsx
│ │ │ ├── form-core/
│ │ │ │ ├── connectForm.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── index.ts
│ │ │ ├── locales/
│ │ │ │ ├── en_US.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── zh_CN.ts
│ │ │ ├── models/
│ │ │ │ ├── bindValues.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── expression.ts
│ │ │ │ ├── fieldShouldUpdate.ts
│ │ │ │ ├── filterValuesHidden.ts
│ │ │ │ ├── filterValuesUndefined.ts
│ │ │ │ ├── flattenSchema.ts
│ │ │ │ ├── formCoreUtils.ts
│ │ │ │ ├── formDataSkeleton.ts
│ │ │ │ ├── layout.ts
│ │ │ │ ├── mapping.tsx
│ │ │ │ ├── sortProperties.ts
│ │ │ │ ├── store.ts
│ │ │ │ ├── transformProps.ts
│ │ │ │ ├── useForm.ts
│ │ │ │ ├── validateMessage.ts
│ │ │ │ └── validates.ts
│ │ │ ├── render-core/
│ │ │ │ ├── FieldItem/
│ │ │ │ │ ├── field.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── module.tsx
│ │ │ │ ├── FieldList/
│ │ │ │ │ ├── field.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── modules.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── type.ts
│ │ │ ├── utils/
│ │ │ │ └── index.ts
│ │ │ ├── widgets/
│ │ │ │ ├── ErrorSchema/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── boxCollapse/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── boxLineTitle/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── boxSubInline/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── boxcard/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── DatePicker/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── FButton/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── HeaderTitle/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── PanelView/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── TimePicker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── fields/
│ │ │ │ │ ├── checkbox/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── checkboxes/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── color/
│ │ │ │ │ │ ├── alphahexMap.ts
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── date/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── dateRange/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── html/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── imageInput/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── input/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── number/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── percentSlider/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── radio/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── rate/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── select/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── slider/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── switch/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── textArea/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── time/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── timeRange/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── treeSelect/
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── upload/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── urlInput/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── listCard/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── listDrawer/
│ │ │ │ │ ├── drawerForm.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── listSimple/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── listTab/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── listTable/
│ │ │ │ │ ├── index.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── tableCell.tsx
│ │ │ │ ├── listVirtual/
│ │ │ │ │ ├── index.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── virtualCell.tsx
│ │ │ │ ├── utils/
│ │ │ │ │ ├── hooks.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── withFieldWrap.tsx
│ │ │ │ └── voidTitle/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── withProvider.tsx
│ │ └── tsconfig.json
│ ├── form-render-mobile/
│ │ ├── .fatherrc.js
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── form-core/
│ │ │ │ ├── connectForm.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── index.tsx
│ │ │ ├── locales/
│ │ │ │ ├── en_US.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── zh_CN.ts
│ │ │ ├── models/
│ │ │ │ ├── context.ts
│ │ │ │ ├── store.ts
│ │ │ │ ├── transformProps.ts
│ │ │ │ └── useForm.ts
│ │ │ ├── render-core/
│ │ │ │ ├── FieldItem/
│ │ │ │ │ ├── field.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── main.tsx
│ │ │ │ │ └── module.tsx
│ │ │ │ ├── FieldList/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── type.ts
│ │ │ ├── utils/
│ │ │ │ └── index.ts
│ │ │ ├── widgets/
│ │ │ │ ├── Card/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Cascader/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Collapse/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── DatePicker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Group/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Html/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Picker/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Radio/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── utils.ts
│ │ │ └── withProvider.tsx
│ │ └── tsconfig.json
│ ├── table-render/
│ │ ├── .fatherrc.ts
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTION.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── utils.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── core/
│ │ │ │ ├── ErrorBoundary/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SearchView/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TableView/
│ │ │ │ │ ├── copy.tsx
│ │ │ │ │ ├── field.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── widgets.tsx
│ │ │ │ ├── ToolbarView/
│ │ │ │ │ ├── InteriorTool/
│ │ │ │ │ │ ├── ColumnSetting/
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ │ ├── item.tsx
│ │ │ │ │ │ │ └── utils.ts
│ │ │ │ │ │ ├── DensityIcon.tsx
│ │ │ │ │ │ ├── FullScreenIcon.tsx
│ │ │ │ │ │ ├── ReloadIcon.tsx
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── TitleView.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── store.ts
│ │ │ ├── index.tsx
│ │ │ ├── locales/
│ │ │ │ ├── en_US.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── zh_CN.ts
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ └── index.ts
│ │ ├── tsconfig.json
│ │ └── 开发文档.md
│ └── x-flow/
│ ├── .fatherrc.js
│ ├── CHANGELOG.md
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── XFlow.tsx
│ │ ├── components/
│ │ │ ├── CandidateNode/
│ │ │ │ └── index.tsx
│ │ │ ├── CustomEdge/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── CustomNode/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── sourceHandle.tsx
│ │ │ ├── FAutoComplete/
│ │ │ │ └── index.tsx
│ │ │ ├── FlowProvider/
│ │ │ │ └── index.tsx
│ │ │ ├── IconView/
│ │ │ │ └── index.tsx
│ │ │ ├── NodeContainer/
│ │ │ │ ├── TitleMenuTooltip.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── NodeEditor/
│ │ │ │ └── index.tsx
│ │ │ ├── NodeLogPanel/
│ │ │ │ ├── components/
│ │ │ │ │ ├── CodePanel.tsx
│ │ │ │ │ ├── DetailPanel.tsx
│ │ │ │ │ ├── StatusPanel.tsx
│ │ │ │ │ ├── TrackNodeItem.tsx
│ │ │ │ │ └── TrackPanel.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── NodesMenu/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── NodesPopover/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── PanelContainer/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── PanelStatusLogContainer/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── TextEllipsis/
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── hooks/
│ │ │ ├── useEdges.ts
│ │ │ ├── useFlow.ts
│ │ │ ├── useNodes.ts
│ │ │ ├── useStore.ts
│ │ │ └── useTemporalStore.ts
│ │ ├── index.less
│ │ ├── index.ts
│ │ ├── models/
│ │ │ ├── context.ts
│ │ │ ├── event-emitter.tsx
│ │ │ └── store.ts
│ │ ├── nodes/
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ ├── node-common/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── node-end/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── node-note/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── node-parallel/
│ │ │ │ ├── ParallelBuildInNodeWidget.tsx
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── setting/
│ │ │ │ └── index.tsx
│ │ │ ├── node-start/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── node-switch/
│ │ │ ├── SwitchBuildInNodeWidget.tsx
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ └── setting/
│ │ │ └── index.tsx
│ │ ├── operator/
│ │ │ ├── Control/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── UndoRedo/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── ZoomInOut/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── shortcuts-name.tsx
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── types.ts
│ │ ├── utils/
│ │ │ ├── autoLayoutNodes.ts
│ │ │ ├── createIconFont.ts
│ │ │ ├── flow.ts
│ │ │ ├── hooks.ts
│ │ │ └── index.ts
│ │ └── withProvider.tsx
│ └── tsconfig.json
├── scripts/
│ ├── dumi-plugin/
│ │ ├── publicPath.ts
│ │ └── redirect.ts
│ └── prettier-plugin/
│ └── index.js
├── tools/
│ └── schema-builder/
│ ├── .fatherrc.js
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── createIframe.ts
│ │ ├── index.ts
│ │ ├── main.tsx
│ │ ├── settings/
│ │ │ ├── index.ts
│ │ │ ├── meta/
│ │ │ │ ├── card.ts
│ │ │ │ ├── cardList.ts
│ │ │ │ ├── checkbox.ts
│ │ │ │ ├── checkboxes.ts
│ │ │ │ ├── color.ts
│ │ │ │ ├── date.ts
│ │ │ │ ├── dateRange.ts
│ │ │ │ ├── form.ts
│ │ │ │ ├── imageInput.ts
│ │ │ │ ├── input.ts
│ │ │ │ ├── number.ts
│ │ │ │ ├── radio.ts
│ │ │ │ ├── rate.ts
│ │ │ │ ├── select.ts
│ │ │ │ ├── slider.ts
│ │ │ │ ├── switch.ts
│ │ │ │ ├── textarea.ts
│ │ │ │ ├── time.ts
│ │ │ │ ├── timeRange.ts
│ │ │ │ ├── treeSelect.ts
│ │ │ │ └── urlInput.ts
│ │ │ └── utils.ts
│ │ └── type.ts
│ └── tsconfig.json
├── tsconfig.jest.json
├── turbo.json
├── typing.d.ts
├── vitest.config.ts
└── widgets/
├── AsyncOptions/
│ ├── .fatherrc.js
│ ├── README.md
│ ├── package.json
│ └── src/
│ └── index.js
├── RichText/
│ ├── .fatherrc.js
│ ├── README.md
│ ├── package.json
│ └── src/
│ └── index.js
└── template/
├── .fatherrc.js
├── README.md
├── package.json
└── src/
└── index.js
SYMBOL INDEX (312 symbols across 120 files)
FILE: .dumi/tmp-production/core/EmptyRoute.tsx
function EmptyRoute (line 6) | function EmptyRoute() {
FILE: .dumi/tmp-production/core/defineApp.ts
type IDefaultRuntimeConfig (line 4) | interface IDefaultRuntimeConfig {
type RuntimeConfig (line 12) | type RuntimeConfig = IDefaultRuntimeConfig
function defineApp (line 14) | function defineApp(config: RuntimeConfig): RuntimeConfig {
FILE: .dumi/tmp-production/core/exportStaticRuntimePlugin.ts
function modifyClientRenderOpts (line 4) | function modifyClientRenderOpts(memo: any) {
FILE: .dumi/tmp-production/core/history.ts
function createHistory (line 9) | function createHistory(opts: any) {
function patchTo (line 45) | function patchTo(to: any, h: History) {
function stripLastSlash (line 61) | function stripLastSlash(path) {
FILE: .dumi/tmp-production/core/historyIntelli.ts
type Routes (line 7) | type Routes = Awaited<ReturnType<typeof getRoutes>>['routes']
type AllRoute (line 8) | type AllRoute = Routes[keyof Routes]
type IsRoot (line 9) | type IsRoot<T extends any> = 'parentId' extends keyof T ? false : true
type GetAllRouteWithoutLayout (line 12) | type GetAllRouteWithoutLayout<Item extends AllRoute> = Item extends any
type AllRouteWithoutLayout (line 19) | type AllRouteWithoutLayout = GetAllRouteWithoutLayout<AllRoute>
type IndexRoutePathname (line 20) | type IndexRoutePathname = '/' extends AllRouteWithoutLayout['path']
type GetChildrens (line 24) | type GetChildrens<T extends any> = T extends any
type Childrens (line 29) | type Childrens = GetChildrens<AllRoute>
type Root (line 30) | type Root = Exclude<AllRoute, Childrens>
type AllIds (line 31) | type AllIds = AllRoute['id']
type GetChildrensByParentId (line 33) | type GetChildrensByParentId<
type RouteObject (line 44) | type RouteObject<
type GetRootRouteObject (line 57) | type GetRootRouteObject<Item extends Root> = Item extends Root
type MergedResult (line 62) | type MergedResult = UnionMerge<GetRootRouteObject<Root>>
type HistoryTo (line 66) | type HistoryTo = Parameters<History['push']>['0']
type HistoryPath (line 67) | type HistoryPath = Exclude<HistoryTo, string>
type UmiPathname (line 69) | type UmiPathname = Path<MergedResult> | (string & {})
type UmiPath (line 70) | interface UmiPath extends HistoryPath {
type UmiTo (line 73) | type UmiTo = UmiPathname | UmiPath
type UmiPush (line 75) | type UmiPush = (to: UmiTo, state?: any) => void
type UmiReplace (line 76) | type UmiReplace = (to: UmiTo, state?: any) => void
type UmiHistory (line 77) | interface UmiHistory extends History {
type TrimLeftSlash (line 83) | type TrimLeftSlash<T extends string> = T extends `/${infer R}`
type TrimRightSlash (line 86) | type TrimRightSlash<T extends string> = T extends `${infer R}/`
type TrimSlash (line 89) | type TrimSlash<T extends string> = TrimLeftSlash<TrimRightSlash<T>>
type IsNever (line 91) | type IsNever<T> = [T] extends [never] ? true : false
type IsEqual (line 92) | type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends <G>() => G e...
type UnionToIntersection (line 98) | type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) e...
type UnionMerge (line 103) | type UnionMerge<U> = UnionToIntersection<U> extends infer O
type ExcludeEmptyKey (line 107) | type ExcludeEmptyKey<T> = IsEqual<T, ''> extends true ? never : T
type PathConcat (line 109) | type PathConcat<
type UnionPath (line 121) | type UnionPath<T> = {
type MakeSureLeftSlash (line 125) | type MakeSureLeftSlash<T> = T extends any
type Path (line 130) | type Path<T, K = UnionPath<T>> = Exclude<MakeSureLeftSlash<K>, '/*'> | I...
FILE: .dumi/tmp-production/core/plugin.ts
function __defaultExport (line 11) | function __defaultExport (obj) {
function getPlugins (line 17) | function getPlugins() {
function getValidKeys (line 42) | function getValidKeys() {
function createPluginManager (line 48) | function createPluginManager() {
function getPluginManager (line 58) | function getPluginManager() {
FILE: .dumi/tmp-production/core/pluginConfig.ts
type IConfigTypes (line 6) | interface IConfigTypes {
type PrettifyWithCloseable (line 265) | type PrettifyWithCloseable<T> = {
type IConfigFromPlugins (line 269) | type IConfigFromPlugins = PrettifyWithCloseable<
FILE: .dumi/tmp-production/core/pluginConfigJoi.d.ts
type IConfigFromPluginsJoi (line 5) | interface IConfigFromPluginsJoi {
FILE: .dumi/tmp-production/core/route.tsx
function getRoutes (line 6) | async function getRoutes() {
FILE: .dumi/tmp-production/core/terminal.ts
function send (line 6) | function send(type: string, message?: string) {
function prettyPrint (line 14) | function prettyPrint(obj: any) {
function stringifyObjs (line 17) | function stringifyObjs(objs: any[]) {
function stringify (line 21) | function stringify(obj: any) {
method log (line 25) | log(...objs: any[]) { send('log', stringifyObjs(objs)) }
method info (line 26) | info(...objs: any[]) { send('info', stringifyObjs(objs)) }
method warn (line 27) | warn(...objs: any[]) { send('warn', stringifyObjs(objs)) }
method error (line 28) | error(...objs: any[]) { send('error', stringifyObjs(objs)) }
method group (line 29) | group() { groupLevel++ }
method groupCollapsed (line 30) | groupCollapsed() { groupLevel++ }
method groupEnd (line 31) | groupEnd() { groupLevel && --groupLevel }
method clear (line 32) | clear() { send('clear') }
method trace (line 33) | trace(...args: any[]) { console.trace(...args) }
method profile (line 34) | profile(...args: any[]) { console.profile(...args) }
method profileEnd (line 35) | profileEnd(...args: any[]) { console.profileEnd(...args) }
FILE: .dumi/tmp-production/dumi/exportStaticRuntimePlugin.ts
function modifyClientRenderOpts (line 4) | function modifyClientRenderOpts(memo: any) {
FILE: .dumi/tmp-production/dumi/locales/runtime.tsx
function i18nProvider (line 36) | function i18nProvider(container: Element) {
FILE: .dumi/tmp-production/dumi/theme/ContextWrapper.tsx
function DumiContextWrapper (line 15) | function DumiContextWrapper() {
FILE: .dumi/tmp-production/testBrowser.tsx
type TestBrowserProps (line 16) | type TestBrowserProps = {
function TestBrowser (line 21) | function TestBrowser(props: TestBrowserProps) {
FILE: .dumi/tmp-production/umi.ts
function render (line 17) | async function render() {
FILE: .dumirc.ts
method chainWebpack (line 64) | chainWebpack(config, { webpack }) {
FILE: docs/form-render/demo/dymic.tsx
type Language (line 7) | enum Language {
FILE: docs/playground/customized/AsyncSelect.js
function fetch (line 10) | function fetch(value, callback) {
class SearchInput (line 42) | class SearchInput extends React.Component {
method render (line 60) | render() {
FILE: docs/playground/serialize.js
function escapeUnsafeChars (line 36) | function escapeUnsafeChars(unsafeChar) {
function deleteFunctions (line 40) | function deleteFunctions(obj) {
function deleteUndefined (line 52) | function deleteUndefined(obj) {
function serializeUtil (line 65) | function serializeUtil(obj, options) {
function serialize (line 333) | function serialize(obj) {
function serializeToDraft (line 344) | function serializeToDraft(obj) {
function deserialize (line 356) | function deserialize(serializedJavascript) {
FILE: docs/xflow/demo/best/basic/TextEllipsis/index.tsx
type ITextEllipsisProps (line 5) | interface ITextEllipsisProps {
FILE: docs/xflow/demo/best/demo2/TextEllipsis/index.tsx
type ITextEllipsisProps (line 5) | interface ITextEllipsisProps {
FILE: docs/xflow/demo/custom-flow/advancedLinkageCase/customWidget.tsx
type AdvancedSettingWidgetProps (line 5) | interface AdvancedSettingWidgetProps {
type AdvancedSettingWidgetRef (line 11) | interface AdvancedSettingWidgetRef {
FILE: docs/xflow/demo/custom-flow/fullCase/components/TagWidget.tsx
type TagItem (line 7) | interface TagItem {
type TagWidgetProps (line 13) | interface TagWidgetProps {
FILE: docs/xflow/demo/custom-flow/fullCase/components/customWidget.tsx
type AdvancedSettingWidgetProps (line 8) | interface AdvancedSettingWidgetProps {
type AdvancedSettingWidgetRef (line 14) | interface AdvancedSettingWidgetRef {
FILE: docs/xflow/demo/custom-flow/fullCase/components/secondTagWidget.tsx
type AdvancedSettingWidgetProps (line 12) | interface AdvancedSettingWidgetProps {
type AdvancedSettingWidgetRef (line 18) | interface AdvancedSettingWidgetRef {
type MeasureData (line 22) | interface MeasureData {
FILE: docs/xflow/demo/flow-provider/index.tsx
function Sidebar (line 25) | function Sidebar() {
FILE: docs/xflow/demo/log/buildIn-log/DetailLogWidget.tsx
type DetailLogWidgetProps (line 6) | interface DetailLogWidgetProps {
FILE: packages/chart-render/src/components/Search/index.tsx
type ISearchProps (line 20) | interface ISearchProps
constant EMPTY_SCHEMA (line 71) | const EMPTY_SCHEMA: ISearchProps['schema'] = {
FILE: packages/chart-render/src/utils/index.ts
function splitMeta (line 3) | function splitMeta(meta: MetaItem[] = []) {
FILE: packages/chart-render/src/utils/store.ts
type IStore (line 5) | interface IStore {
FILE: packages/chart-render/src/utils/type.ts
type ArrayFilters (line 1) | type ArrayFilters = Array<
type ObjectFilters (line 21) | type ObjectFilters = Record<string, ArrayFilters[0]['value']>;
type MetaItem (line 33) | type MetaItem = {
type DataItem (line 47) | type DataItem = Record<string, any>;
type DataSource (line 49) | type DataSource = { meta: MetaItem[]; data: DataItem[] };
FILE: packages/chart-render/src/widgets/Column/index.tsx
type IColumnProps (line 12) | interface IColumnProps extends Omit<Partial<ColumnConfig>, 'data'> {
function generateConfig (line 17) | function generateConfig(
FILE: packages/chart-render/src/widgets/Pie/index.tsx
type IPieProps (line 8) | interface IPieProps extends Omit<Partial<PieConfig>, 'data'> {}
FILE: packages/data-render/src/models/store.ts
type FormStore (line 3) | type FormStore = {
FILE: packages/data-render/src/type.ts
type DataVProps (line 1) | interface DataVProps {
FILE: packages/data-render/src/utils/common.ts
function isArray (line 209) | function isArray(input: any): input is any[] {
FILE: packages/data-render/src/widgets/FButton/index.tsx
type FButtonProps (line 10) | interface FButtonProps extends ButtonProps {
FILE: packages/data-render/src/widgets/FCollapse/index.tsx
type IProps (line 5) | interface IProps {
FILE: packages/data-render/src/widgets/FDescriptions/index.tsx
constant WIDGETNAME (line 12) | const WIDGETNAME = 'dv-descriptions';
FILE: packages/data-render/src/widgets/FProgressBar/index.tsx
type FProgressBarProps (line 6) | interface FProgressBarProps extends Omit<ProgressProps, 'formatFunc' | '...
FILE: packages/data-render/src/widgets/FRadioGroup/index.tsx
type FRadioGroupProps (line 7) | interface FRadioGroupProps extends Omit<RadioGroupProps, 'onChange'> {
FILE: packages/data-render/src/widgets/FStatistic/index.tsx
type FStatisticProps (line 6) | interface FStatisticProps extends Omit<StatisticProps, 'value'> {
FILE: packages/data-render/src/widgets/FText/index.tsx
type IProps (line 9) | interface IProps {
FILE: packages/data-render/src/widgets/components/BaseCollapse/index.tsx
type IProps (line 8) | interface IProps {
FILE: packages/data-render/src/widgets/components/Encryption/index.tsx
type IIcon (line 8) | interface IIcon {
type IProps (line 15) | interface IProps {
FILE: packages/data-render/src/widgets/components/SuckTabs/index.tsx
type ITabItem (line 11) | interface ITabItem {
FILE: packages/data-render/src/widgets/components/TextEllipsis/index.tsx
type IProps (line 6) | interface IProps {
FILE: packages/data-render/src/widgets/utils/common.ts
function isArray (line 209) | function isArray(input: any): input is any[] {
FILE: packages/data-render/src/widgets/utils/hooks.ts
function usePrevious (line 3) | function usePrevious(value: any) {
FILE: packages/data-render/src/withProvider.tsx
function withProvider (line 12) | function withProvider<T>(
FILE: packages/form-render-mobile/src/models/store.ts
type FormStore (line 3) | type FormStore = {
FILE: packages/form-render-mobile/src/render-core/index.tsx
type RenderCoreProps (line 5) | interface RenderCoreProps {
type RenderItemProps (line 12) | interface RenderItemProps {
FILE: packages/form-render-mobile/src/type.ts
type AntdFormInstance (line 6) | type AntdFormInstance = Exclude<AntdFormProps['form'], undefined>
type SchemaType (line 9) | type SchemaType =
type SchemaBase (line 21) | interface SchemaBase {
type Schema (line 74) | type Schema = Partial<SchemaBase>;
type Error (line 76) | interface Error {
type FormParams (line 83) | interface FormParams {
type ValidateParams (line 94) | interface ValidateParams {
type ResetParams (line 102) | interface ResetParams {
type FieldParams (line 112) | interface FieldParams {
type ListOperate (line 120) | interface ListOperate {
type GlobalConfig (line 125) | interface GlobalConfig {
type FormInstance (line 129) | interface FormInstance extends AntdFormInstance {
type WatchProperties (line 188) | type WatchProperties = {
type FRProps (line 197) | interface FRProps extends AntdFormProps {
type SearchProps (line 291) | interface SearchProps<RecordType> extends Omit<FRProps, 'form'> {
type ConnectedForm (line 321) | type ConnectedForm<T> = T & {
FILE: packages/form-render-mobile/src/utils/index.ts
function isUrl (line 41) | function isUrl(string: string) {
function getFormat (line 55) | function getFormat(format) {
function isObjType (line 91) | function isObjType(schema: any) {
function isListType (line 96) | function isListType(schema: any) {
function isCheckBoxType (line 100) | function isCheckBoxType(schema, readOnly) {
FILE: packages/form-render-mobile/src/widgets/Html/index.tsx
type IProps (line 5) | interface IProps {
FILE: packages/form-render-mobile/src/widgets/utils.ts
function getFormat (line 1) | function getFormat(format) {
FILE: packages/form-render-mobile/src/withProvider.tsx
function withProvider (line 17) | function withProvider<T>(Element: React.ComponentType<T>): React.FC<FRPr...
FILE: packages/form-render/__tests__/form-fields.spec.tsx
function sleep (line 7) | function sleep(ms): Promise<never> {
FILE: packages/form-render/__tests__/form.spec.tsx
function sleep (line 7) | function sleep(ms): Promise<never> {
FILE: packages/form-render/src/models/expression.ts
function getRealDataPath (line 101) | function getRealDataPath(path) {
function getValueByPath (line 113) | function getValueByPath(formData, path) {
FILE: packages/form-render/src/models/flattenSchema.ts
function getSchemaFromFlatten (line 16) | function getSchemaFromFlatten(flatten: any, path = '#') {
function flattenSchema (line 43) | function flattenSchema(_schema = {}, name?: any, parent?: any, _result?:...
FILE: packages/form-render/src/models/formCoreUtils.ts
function yymmdd (line 158) | function yymmdd(timeStamp) {
function msToTime (line 170) | function msToTime(duration) {
FILE: packages/form-render/src/models/mapping.tsx
function getWidgetName (line 42) | function getWidgetName(schema, _mapping = mapping) {
function capitalizeFirstLetter (line 105) | function capitalizeFirstLetter(str: any) {
FILE: packages/form-render/src/models/store.ts
type FormStore (line 3) | type FormStore = {
FILE: packages/form-render/src/render-core/index.tsx
type RenderCoreProps (line 7) | interface RenderCoreProps {
type RenderItemProps (line 14) | interface RenderItemProps {
FILE: packages/form-render/src/type.ts
type SchemaType (line 8) | type SchemaType =
type ActionProps (line 20) | type ActionProps = {
type SchemaBase (line 33) | interface SchemaBase {
type Schema (line 93) | type Schema = Partial<SchemaBase>;
type Error (line 95) | interface Error {
type FormParams (line 102) | interface FormParams {
type ValidateParams (line 113) | interface ValidateParams {
type ResetParams (line 121) | interface ResetParams {
type FieldParams (line 131) | interface FieldParams {
type ListOperate (line 139) | interface ListOperate {
type GlobalConfig (line 146) | interface GlobalConfig {
type FormInstance (line 155) | interface FormInstance {
type WatchProperties (line 271) | type WatchProperties = {
type ExtendedColProps (line 280) | interface ExtendedColProps extends ColProps {
type FRProps (line 284) | interface FRProps extends Omit<AntdFormProps, 'form'> {
type SearchProps (line 415) | interface SearchProps<RecordType> extends Omit<FRProps, 'form'> {
type WidgetProps (line 442) | type WidgetProps = {
type WidgetAddonsType (line 455) | type WidgetAddonsType = FormInstance & {
type ConnectedForm (line 467) | type ConnectedForm<T> = T & {
FILE: packages/form-render/src/utils/index.ts
function isUrl (line 27) | function isUrl(string: string) {
function getFormat (line 41) | function getFormat(format) {
function isObjType (line 77) | function isObjType(schema: any) {
function isListType (line 82) | function isListType(schema: any) {
function isCheckBoxType (line 86) | function isCheckBoxType(schema: any, readOnly: boolean) {
FILE: packages/form-render/src/widgets/boxCollapse/index.tsx
type IProps (line 8) | interface IProps {
FILE: packages/form-render/src/widgets/fields/checkbox/index.tsx
type Props (line 5) | interface Props {
FILE: packages/form-render/src/widgets/fields/checkboxes/index.tsx
type Option (line 5) | interface Option {
type Props (line 11) | interface Props {
FILE: packages/form-render/src/widgets/fields/html/index.tsx
function html (line 4) | function html({ value, checked, options, schema = {} } : any) {
FILE: packages/form-render/src/widgets/fields/imageInput/index.tsx
constant DEFAULT_IMG (line 8) | const DEFAULT_IMG =
type PreviewNodeProps (line 11) | interface PreviewNodeProps {
type ImageInputProps (line 36) | interface ImageInputProps {
FILE: packages/form-render/src/widgets/fields/percentSlider/index.tsx
type Props (line 4) | interface Props {
FILE: packages/form-render/src/widgets/fields/radio/index.tsx
type Option (line 5) | interface Option {
type Props (line 11) | interface Props {
FILE: packages/form-render/src/widgets/fields/slider/index.tsx
type SliderWithNumberProps (line 8) | interface SliderWithNumberProps {
FILE: packages/form-render/src/widgets/fields/upload/index.tsx
type Props (line 10) | interface Props {
method onChange (line 34) | onChange(info: any) {
method onRemove (line 46) | onRemove() {
FILE: packages/form-render/src/widgets/fields/urlInput/index.tsx
type UrlNodeProps (line 5) | interface UrlNodeProps {
type UrlInputProps (line 28) | interface UrlInputProps {
FILE: packages/form-render/src/widgets/listDrawer/index.tsx
type Props (line 10) | interface Props {
FILE: packages/form-render/src/widgets/listTab/index.tsx
type ListTabProps (line 8) | interface ListTabProps {
FILE: packages/form-render/src/widgets/listTable/index.tsx
type ListTableProps (line 12) | interface ListTableProps {
FILE: packages/form-render/src/widgets/listVirtual/index.tsx
type ListVirtualProps (line 13) | interface ListVirtualProps {
FILE: packages/form-render/src/widgets/utils/hooks.ts
function usePrevious (line 4) | function usePrevious(value: any) {
FILE: packages/form-render/src/widgets/utils/index.ts
function isUrl (line 6) | function isUrl(str: string) {
function getFormat (line 13) | function getFormat(format: string) {
FILE: packages/form-render/src/withProvider.tsx
function withProvider (line 15) | function withProvider<T>(Element: React.ComponentType<T>, defaultWidgets...
FILE: packages/table-render/src/core/ErrorBoundary/index.tsx
class ErrorBoundary (line 4) | class ErrorBoundary extends React.Component<
method getDerivedStateFromError (line 10) | static getDerivedStateFromError(error: Error) {
method componentDidCatch (line 14) | componentDidCatch(error: any, errorInfo: ErrorInfo) {
method render (line 19) | render() {
FILE: packages/table-render/src/core/ToolbarView/InteriorTool/ColumnSetting/utils.ts
type Setting (line 4) | type Setting = ToolbarActionConfig['columnsSettingValue'];
FILE: packages/table-render/src/core/ToolbarView/InteriorTool/DensityIcon.tsx
type DensitySize (line 7) | type DensitySize = 'middle' | 'small' | 'default' | undefined;
FILE: packages/table-render/src/core/index.tsx
type ISearchParams (line 16) | type ISearchParams = {
FILE: packages/table-render/src/core/store.ts
type TableRenderStoreType (line 5) | type TableRenderStoreType = {
FILE: packages/table-render/src/types.ts
type ColumnsSettingValueType (line 7) | type ColumnsSettingValueType = Array<{
type ToolbarActionConfig (line 16) | type ToolbarActionConfig = {
type DoSearchType (line 24) | type DoSearchType = (
type RefreshType (line 34) | type RefreshType = (
type ChangeTabType (line 39) | type ChangeTabType = (tab: number | string) => Promise<void>;
type TableContext (line 41) | interface TableContext {
type ProColumnsType (line 49) | type ProColumnsType<T extends object = any> = Array<
type TableState (line 61) | interface TableState<RecordType> {
type SearchProps (line 78) | interface SearchProps<RecordType> extends Omit<FRProps, 'form'> {
type ApiType (line 103) | type ApiType<RecordType> =
type SearchApi (line 107) | type SearchApi<RecordType> = (
type TablePropsC (line 125) | interface TablePropsC<RecordType extends Object = any>
type TableRenderProps (line 133) | interface TableRenderProps<RecordType extends Object = any>
FILE: packages/x-flow/src/components/CustomNode/sourceHandle.tsx
type HandleProps (line 10) | type HandleProps = ComponentProps<typeof Handle>
FILE: packages/x-flow/src/components/NodeEditor/index.tsx
type INodeEditorProps (line 18) | interface INodeEditorProps {
function getSchema (line 72) | async function getSchema() {
FILE: packages/x-flow/src/components/NodeLogPanel/components/TrackNodeItem.tsx
type ITrackNodeItemProps (line 10) | interface ITrackNodeItemProps {
FILE: packages/x-flow/src/components/NodeLogPanel/index.tsx
type INodeEditorProps (line 9) | interface INodeEditorProps {
FILE: packages/x-flow/src/components/NodesMenu/index.tsx
function searchList (line 17) | function searchList(nodes: any, preResult = []) {
FILE: packages/x-flow/src/components/PanelContainer/index.tsx
type IPanelProps (line 14) | interface IPanelProps {
FILE: packages/x-flow/src/components/PanelStatusLogContainer/index.tsx
type IPanelProps (line 11) | interface IPanelProps {
FILE: packages/x-flow/src/components/TextEllipsis/index.tsx
type ITextEllipsisProps (line 5) | interface ITextEllipsisProps {
FILE: packages/x-flow/src/hooks/useEdges.ts
function useEdges (line 15) | function useEdges<EdgeType extends Edge = Edge>(): Edge[] {
FILE: packages/x-flow/src/hooks/useNodes.ts
function useNodes (line 14) | function useNodes<NodeType extends FlowNode = FlowNode>(): NodeType[] {
FILE: packages/x-flow/src/models/context.ts
type Config (line 5) | type Config = FlowProps & Record<string,any>
FILE: packages/x-flow/src/models/event-emitter.tsx
type EventEmitterContextProviderProps (line 12) | type EventEmitterContextProviderProps = {
FILE: packages/x-flow/src/models/store.ts
type FlowProps (line 16) | type FlowProps = {
type FlowStore (line 23) | type FlowStore = ReturnType<typeof createStore>;
type FlowNode (line 25) | type FlowNode = Node;
type FlowState (line 27) | type FlowState = {
method onSave (line 133) | onSave(pastState, currentState) {
FILE: packages/x-flow/src/nodes/node-parallel/setting/index.tsx
type INodeSwitchSettingPorps (line 6) | interface INodeSwitchSettingPorps {
FILE: packages/x-flow/src/nodes/node-switch/setting/index.tsx
type INodeSwitchSettingPorps (line 6) | interface INodeSwitchSettingPorps {
FILE: packages/x-flow/src/operator/UndoRedo/index.tsx
type UndoRedoProps (line 7) | type UndoRedoProps = {
FILE: packages/x-flow/src/operator/ZoomInOut/index.tsx
type ZoomType (line 10) | enum ZoomType {
constant ZOOM_IN_OUT_OPTIONS (line 21) | const ZOOM_IN_OUT_OPTIONS = [
FILE: packages/x-flow/src/operator/ZoomInOut/shortcuts-name.tsx
type ShortcutsNameProps (line 5) | type ShortcutsNameProps = {
FILE: packages/x-flow/src/operator/index.tsx
type OperatorProps (line 11) | type OperatorProps = {
FILE: packages/x-flow/src/types.ts
type SourceHandleType (line 11) | type SourceHandleType = typeof SourceHandle;
type ReactFlowProps (line 12) | type ReactFlowProps = ComponentProps<typeof ReactFlow>
type TNodeItem (line 13) | interface TNodeItem {
type TNodeGroup (line 64) | interface TNodeGroup {
type TNodeMenu (line 70) | interface TNodeMenu {
type TNodePanel (line 77) | interface TNodePanel {
type TNodeSelector (line 85) | interface TNodeSelector {
type TLogListItem (line 90) | interface TLogListItem {
type TLogPanel (line 103) | interface TLogPanel {
type TNodeView (line 115) | interface TNodeView {
type TEdge (line 123) | interface TEdge {
type TControl (line 132) | interface TControl{
type THandle (line 144) | interface THandle{
type node (line 150) | type node = {
type edge (line 159) | type edge = {
type FlowProps (line 164) | interface FlowProps {
type ItemInfo (line 203) | interface ItemInfo {
FILE: packages/x-flow/src/utils/autoLayoutNodes.ts
constant CUSTOM_NODE (line 5) | const CUSTOM_NODE = 'custom';
constant CUSTOM_EDGE (line 6) | const CUSTOM_EDGE = 'custom';
FILE: packages/x-flow/src/utils/hooks.ts
function usePrevious (line 4) | function usePrevious(value: any) {
type TCallback (line 24) | type TCallback = () => Promise<any>;
type TRequestLoading (line 25) | type TRequestLoading = () => [boolean, (callback: TCallback) => void];
FILE: packages/x-flow/src/utils/index.ts
function isUrl (line 44) | function isUrl(string: string) {
function getFormat (line 58) | function getFormat(format) {
function isObjType (line 94) | function isObjType(schema: any) {
function isListType (line 103) | function isListType(schema: any) {
function isCheckBoxType (line 111) | function isCheckBoxType(schema: any, readOnly: boolean) {
function safeJsonStringify (line 246) | function safeJsonStringify(obj: Object) {
function safeJSONParse (line 284) | function safeJSONParse<T = any>(
constant NODE_STATUS (line 302) | const NODE_STATUS = {
function getTransparentColor (line 336) | function getTransparentColor(colorInput: string, alpha: number) {
function isTruthy (line 347) | function isTruthy(value: any) {
function hexToRgba (line 358) | function hexToRgba(hex: string, alpha = 0.25) {
function getColorfulModeBackground (line 387) | function getColorfulModeBackground(color: string, openColorfulMode: bool...
FILE: packages/x-flow/src/withProvider.tsx
type ProviderProps (line 7) | interface ProviderProps<T> {
function withProvider (line 16) | function withProvider<T>(
FILE: scripts/prettier-plugin/index.js
function createParser (line 3) | function createParser(original, transform) {
function visit (line 15) | function visit(ast, callbackMap) {
function transformJavaScript (line 44) | function transformJavaScript(ast, options) {
FILE: tools/schema-builder/src/settings/meta/cardList.ts
method setValue (line 62) | setValue(target: any, value: string) {
method setValue (line 148) | setValue(target: any, value: number) {
FILE: tools/schema-builder/src/type.ts
type TProperties (line 1) | interface TProperties {
type TLogo (line 5) | interface TLogo {
type TSchema (line 11) | interface TSchema {
type TToolBtn (line 16) | interface TToolBtn {
type TSchemaBuilder (line 22) | interface TSchemaBuilder {
FILE: typing.d.ts
type Window (line 1) | interface Window {
FILE: widgets/AsyncOptions/src/index.js
function index (line 3) | function index() {
FILE: widgets/template/src/index.js
function Template (line 3) | function Template() {
Condensed preview — 709 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,532K chars).
[
{
"path": ".dumi/loading.tsx",
"chars": 239,
"preview": "import React from 'react';\nimport { Spin } from 'antd';\n\nexport default () => {\n return (\n <div style={{ width: '100"
},
{
"path": ".dumi/theme/builtins/TypeSchema/index.less",
"chars": 930,
"preview": ".xr-doc-hero-demo {\n display: flex;\n align-items: center;\n justify-content: space-between;\n max-width: 961px;\n marg"
},
{
"path": ".dumi/theme/builtins/TypeSchema/index.tsx",
"chars": 7969,
"preview": "import React from 'react';\nimport TypeIt from 'typeit-react';\nimport FormRender, { useForm } from 'form-render';\nimport "
},
{
"path": ".dumi/theme/layouts/GlobalLayout/index.tsx",
"chars": 282,
"preview": "import React from 'react';\nimport { ConfigProvider } from 'antd';\nimport { useOutlet } from 'dumi';\n\nconst GlobalLayout:"
},
{
"path": ".dumi/theme/slots/Header/GithubLink.tsx",
"chars": 466,
"preview": "import React from 'react';\nimport { Button, Tooltip } from 'antd';\n\nimport { GithubFilled } from '@ant-design/icons';\n\nc"
},
{
"path": ".dumi/theme/slots/Header/Navigation.tsx",
"chars": 1732,
"preview": "import { CodeOutlined, DownOutlined, NodeIndexOutlined } from '@ant-design/icons';\nimport { Menu } from 'antd';\nimport {"
},
{
"path": ".dumi/theme/slots/Header/ThemeSwitch.tsx",
"chars": 1326,
"preview": "import React from 'react';\nimport { Dropdown, Button } from 'antd';\nimport { usePrefersColor } from 'dumi';\nimport { cre"
},
{
"path": ".dumi/theme/slots/Header/index.less",
"chars": 1687,
"preview": ".xr-doc-header {\n backdrop-filter: blur(6px);\n background-color: rgba(255, 255,255, 0.8);\n box-shadow: 0 1px 2px 0 rg"
},
{
"path": ".dumi/theme/slots/Header/index.tsx",
"chars": 1578,
"preview": "import React from 'react';\nimport DumiLogo from 'dumi/theme-default/slots/Logo';\nimport DumiSearch from 'dumi/theme-defa"
},
{
"path": ".dumi/tmp-production/core/EmptyRoute.tsx",
"chars": 285,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport React from 'react';\ni"
},
{
"path": ".dumi/tmp-production/core/defineApp.ts",
"chars": 625,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\ninterface IDefaultRuntimeCon"
},
{
"path": ".dumi/tmp-production/core/exportStaticRuntimePlugin.ts",
"chars": 291,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport function modifyClient"
},
{
"path": ".dumi/tmp-production/core/helmet.ts",
"chars": 410,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport React from 'react';\ni"
},
{
"path": ".dumi/tmp-production/core/helmetContext.ts",
"chars": 119,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport const context = {};\n"
},
{
"path": ".dumi/tmp-production/core/history.ts",
"chars": 1659,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport { createHashHistory, "
},
{
"path": ".dumi/tmp-production/core/historyIntelli.ts",
"chars": 3512,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport { getRoutes } from '."
},
{
"path": ".dumi/tmp-production/core/plugin.ts",
"chars": 1779,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport * as Plugin_0 from '@"
},
{
"path": ".dumi/tmp-production/core/pluginConfig.ts",
"chars": 10248,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport { IConfigFromPluginsJ"
},
{
"path": ".dumi/tmp-production/core/pluginConfigJoi.d.ts",
"chars": 858,
"preview": "// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\n// Created by Umi Plugin\n\nexport interface "
},
{
"path": ".dumi/tmp-production/core/polyfill.ts",
"chars": 17793,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport \"/Users/zhanbo/happy/"
},
{
"path": ".dumi/tmp-production/core/route.tsx",
"chars": 15551,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport React from 'react';\n\n"
},
{
"path": ".dumi/tmp-production/core/terminal.ts",
"chars": 1417,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nlet count = 0;\nlet groupLeve"
},
{
"path": ".dumi/tmp-production/dumi/exportStaticRuntimePlugin.ts",
"chars": 287,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport function modifyClient"
},
{
"path": ".dumi/tmp-production/dumi/exports.ts",
"chars": 215,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport * from '../exports';\n"
},
{
"path": ".dumi/tmp-production/dumi/locales/config.ts",
"chars": 2998,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport const locales = [\n {"
},
{
"path": ".dumi/tmp-production/dumi/locales/runtime.tsx",
"chars": 1479,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport { history } from 'dum"
},
{
"path": ".dumi/tmp-production/dumi/meta/atoms.ts",
"chars": 124,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport const components = nu"
},
{
"path": ".dumi/tmp-production/dumi/meta/index.ts",
"chars": 13121,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport { demos as dm0, front"
},
{
"path": ".dumi/tmp-production/dumi/meta/runtime.ts",
"chars": 1030,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport { filesMeta, tabs } f"
},
{
"path": ".dumi/tmp-production/dumi/meta/tabs.ts",
"chars": 116,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport const tabs = {\n}\n"
},
{
"path": ".dumi/tmp-production/dumi/theme/ContextWrapper.tsx",
"chars": 1931,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport React, { useState, us"
},
{
"path": ".dumi/tmp-production/dumi/theme/builtins/API.ts",
"chars": 202,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/builtins/Badge.ts",
"chars": 204,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/builtins/Container.ts",
"chars": 208,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/builtins/Previewer.ts",
"chars": 208,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/builtins/SourceCode.ts",
"chars": 209,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/builtins/Table.ts",
"chars": 204,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/layouts/DocLayout.ts",
"chars": 207,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/ColorSwitch.ts",
"chars": 207,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Content.ts",
"chars": 203,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/ContentTabs.ts",
"chars": 207,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Features.ts",
"chars": 204,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Footer.ts",
"chars": 202,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/HeadeExtra.ts",
"chars": 206,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Header.ts",
"chars": 202,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Hero.ts",
"chars": 200,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/HeroTitle.ts",
"chars": 205,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/LangSwitch.ts",
"chars": 206,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Logo.ts",
"chars": 200,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Navbar.ts",
"chars": 202,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/NavbarExtra.ts",
"chars": 207,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/NotFound.ts",
"chars": 204,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/PreviewerActions.ts",
"chars": 212,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/PreviewerActionsExtra.ts",
"chars": 217,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/RtlSwitch.ts",
"chars": 205,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/SearchBar.ts",
"chars": 308,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/SearchResult.ts",
"chars": 208,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Sidebar.ts",
"chars": 203,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/SocialIcon.ts",
"chars": 206,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/dumi/theme/slots/Toc.ts",
"chars": 199,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { default } from '/Us"
},
{
"path": ".dumi/tmp-production/exports.ts",
"chars": 1217,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nexport { defineApp } from '."
},
{
"path": ".dumi/tmp-production/testBrowser.tsx",
"chars": 2525,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport React, { useEffect, u"
},
{
"path": ".dumi/tmp-production/umi.ts",
"chars": 2899,
"preview": "// @ts-nocheck\n// This file is generated by Umi automatically\n// DO NOT CHANGE IT MANUALLY!\nimport './core/polyfill';\n\ni"
},
{
"path": ".dumirc.ts",
"chars": 2501,
"preview": "import { defineConfig } from 'dumi';\nimport path from 'path';\nimport MonacoWebpackPlugin from 'monaco-editor-webpack-plu"
},
{
"path": ".editorconfig",
"chars": 245,
"preview": "# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_tr"
},
{
"path": ".fatherrc.js",
"chars": 163,
"preview": "// 通用的配置,可以在每个package里写 fatherrc.js 来覆盖\nexport default {\n esm: 'rollup',\n disableTypeCheck: false, // 如果出了问题,这个可以改成tru"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.md",
"chars": 824,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: lhbxs\n---\n\n<!---\n 1. 提问前"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 242,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: lhbxs\n---\n\n### 期望的新功能 "
},
{
"path": ".github/workflows/ci.yml",
"chars": 826,
"preview": "name: 🚀 Build CI\n\nenv:\n NODE_OPTIONS: --max-old-space-size=6144\n\non: \n push:\n branches: [master, dev]\n pull_reques"
},
{
"path": ".github/workflows/coverage.yml",
"chars": 499,
"preview": "# name: 💯 Coverage CI\n\n# on: \n# workflow_run:\n# workflows: [\"🚀 Build CI\"]\n# types:\n# - completed\n\n\n# job"
},
{
"path": ".github/workflows/deploy.yml",
"chars": 529,
"preview": "# name: Deploy CI\n\n# on:\n# push:\n# branches:\n# - master\n\n# jobs:\n# build-and-deploy:\n# runs-on: ubuntu"
},
{
"path": ".github/workflows/emoji-helper.yml",
"chars": 257,
"preview": "name: Emoji Helper\n\non:\n release:\n types: [published]\n\njobs:\n emoji:\n runs-on: ubuntu-latest\n steps:\n - "
},
{
"path": ".github/workflows/issue-helper.yml",
"chars": 1117,
"preview": "name: Issue Reply\n\non:\n issues:\n types: [labeled]\n\njobs:\n reply-helper:\n runs-on: ubuntu-latest\n steps:\n "
},
{
"path": ".github/workflows/mirror.yml",
"chars": 493,
"preview": "# name: 🔀 Sync mirror to Vercel\n\n# on:\n# push:\n# branches:\n# - master\n\n# jobs:\n# mirror:\n# runs-on: ub"
},
{
"path": ".gitignore",
"chars": 667,
"preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/npm"
},
{
"path": ".npmrc",
"chars": 37,
"preview": "registry=https://registry.npmjs.org/\n"
},
{
"path": ".prettierignore",
"chars": 676,
"preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n**/*.svg\n**/**/*.svg\n**/*.ejs\n**/*"
},
{
"path": ".prettierrc",
"chars": 200,
"preview": "{\n \"singleQuote\": true,\n \"trailingComma\": \"es5\",\n \"printWidth\": 80,\n \"arrowParens\": \"avoid\",\n \"overrides\": [\n {\n"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3346,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 1557,
"preview": "## 如何开发\n\n#### 1. 项目使用 lerna 管理,所有的大包在 `/packages`,所有的自定义组件包在 `/widgets`\n\n#### 2. 如何跑起来(以下操作全在根目录)\n\n```sh\n# 安装依赖,请使用yarn,"
},
{
"path": "README.md",
"chars": 6831,
"preview": "<p align=\"center\">\n <a href=\"https://xrender.fun/\" target=\"_blank\"><img src=\"https://img.alicdn.com/tfs/TB17UtINiLaK1Rj"
},
{
"path": "app.ts",
"chars": 193,
"preview": "window.publicPath = '/';\n\nif (location.origin.includes('gitee')) {\n location.href = 'https://xrender.fun/';\n}\n\nif (loca"
},
{
"path": "docs/data-render/data/basic.ts",
"chars": 1060,
"preview": "export default {\n \"creator\": \"清风徐来\",\n \"relevanceCode\": \"421421\",\n \"desc\": \"浙江省杭州市工专路\",\n \"create-time\": \"2019-10-10\","
},
{
"path": "docs/data-render/index.md",
"chars": 1505,
"preview": "---\norder: 0\ntitle: 开始使用\nmobile: false\n---\n\n<div style=\"display:flex;align-items:center;margin-bottom:24px\">\n <img src="
},
{
"path": "docs/data-render/schema/basic.ts",
"chars": 4089,
"preview": "export default [\n {\n \"widget\": \"FPanel\",\n \"style\": {\n \"paddingTop\": \"20px\",\n \"paddingLeft\": \"20px\",\n "
},
{
"path": "docs/form-render/advaced-example.md",
"chars": 5802,
"preview": "---\norder: 3\ntoc: content\nmobile: false\ngroup: \n title: 高级用法\n order: 2\n---\n\n# 常用交互\n\n## 表单数据提交\n通过 `onFinish` 方法监听表单提交,外"
},
{
"path": "docs/form-render/advanced-bind.md",
"chars": 4559,
"preview": "---\norder: 3\ntoc: content\nmobile: false\ntitle: 数据转换\ngroup: \n title: 高级用法\n order: 1\n---\n\n# bind\n\n类型:string | string[] |"
},
{
"path": "docs/form-render/advanced-layout.md",
"chars": 7535,
"preview": "---\norder: 0\ntoc: content\nmobile: false\ngroup: \n title: 高级用法\n order: 1\n---\n\n# 表单布局\n- `displayType` 标签排列方式\n- `column` 表"
},
{
"path": "docs/form-render/advanced-linkage.md",
"chars": 9512,
"preview": "---\norder: 1\ntoc: content\nmobile: false\ngroup: \n title: 高级用法\n order: 1\n---\n\n# 表单联动\n\n表单联动是开发中常见的交互,FormRender 提供以下几种方式来"
},
{
"path": "docs/form-render/advanced-path.md",
"chars": 4107,
"preview": "---\norder: 3\ntoc: content\nmobile: false\ngroup: \n title: 高级用法\n order: 1\n---\n\n# path 书写\n\n调用 setSchemaByPath 时,需要根据 path "
},
{
"path": "docs/form-render/advanced-slimrender.md",
"chars": 1155,
"preview": "---\norder: 4\ntoc: content\nmobile: false\ngroup: \n title: 高级用法\n order: 1\n---\n\n# 组件按需\nFormRender 内置了很多控件,包括基础控件、嵌套控件、以及列表"
},
{
"path": "docs/form-render/advanced-validate.md",
"chars": 6447,
"preview": "---\norder: 2\ntoc: content\nmobile: false\ngroup: \n title: 高级用法\n order: 1\n---\n\n# 表单校验\n- 通过内置校验字段配置,实现简单校验逻辑\n- 通过 rules 配置"
},
{
"path": "docs/form-render/advanced-widget.md",
"chars": 7288,
"preview": "---\norder: 2\ntoc: content\nmobile: false\ngroup: \n title: 高级用法\n order: 1\n---\n\n# 自定义组件\n\n在实际的开发中,可能会遇到如下的应用场景:\n\n- 我需要写一个异步"
},
{
"path": "docs/form-render/api-props.md",
"chars": 12240,
"preview": "---\norder: 0\nmobile: false\ngroup: \n title: API\n order: 4\n---\n\n# 表单属性\n\n## Props\n\n| <div style=\"width:200px\">参数</div> "
},
{
"path": "docs/form-render/api-schema.md",
"chars": 5725,
"preview": "---\norder: 1\ntoc: content\nmobile: false\ngroup: \n title: API\n order: 4\n---\n\n# 协议配置项\n\n`schema` 用于描述表单的基本信息、结构和校验。`schema"
},
{
"path": "docs/form-render/changelog.md",
"chars": 138,
"preview": "---\norder: 2\ntoc: content\nmobile: false\ngroup: \n title: 其他\n order: 5\n---\n\n<embed src=\"../../packages/form-render/CHANG"
},
{
"path": "docs/form-render/demo/FormRender.jsx",
"chars": 265,
"preview": "import FormRender, { useForm } from 'form-render';\nimport React from 'react';\n\nconst Demo = ({ schema, ...otherProps }) "
},
{
"path": "docs/form-render/demo/bind.tsx",
"chars": 1843,
"preview": "import React from 'react';\nimport { Button } from 'antd';\nimport FormRender, { useForm } from 'form-render';\n\nconst dela"
},
{
"path": "docs/form-render/demo/defaultChange.tsx",
"chars": 4352,
"preview": "import React from 'react';\nimport { Button } from 'antd';\nimport FormRender, { useForm } from 'form-render';\n\nconst dela"
},
{
"path": "docs/form-render/demo/dymic.tsx",
"chars": 2463,
"preview": "import React, { useState } from 'react';\nimport { Button, Modal } from 'antd';\nimport FormRender, { useForm } from 'form"
},
{
"path": "docs/form-render/demo/form-slim/basic.tsx",
"chars": 675,
"preview": "/**\n * transform: true\n * defaultShowCode: true\n */\nimport React from 'react';\nimport { FormSlimRender, useForm, Input, "
},
{
"path": "docs/form-render/demo/form-slim/form-list.tsx",
"chars": 722,
"preview": "/**\n * transform: true\n * defaultShowCode: true\n */\nimport React from 'react';\nimport { FormSlimRender, useForm, Input, "
},
{
"path": "docs/form-render/demo/linkage/list.tsx",
"chars": 1042,
"preview": "import React from 'react';\nimport { Input } from 'antd';\nimport FormRender, { useForm } from 'form-render';\n\nconst schem"
},
{
"path": "docs/form-render/demo/outLabelCol.tsx",
"chars": 1011,
"preview": "import React from 'react';\nimport FormRender, { useForm } from 'form-render';\nimport { Button } from 'antd';\n\nconst sche"
},
{
"path": "docs/form-render/demo/validateFields.tsx",
"chars": 996,
"preview": "import React from 'react';\nimport FormRender, { useForm } from 'form-render';\nimport { Button } from 'antd';\n\nconst sche"
},
{
"path": "docs/form-render/demo/widget/basic.tsx",
"chars": 1106,
"preview": "import React from 'react';\nimport { Input, Button, Space } from 'antd';\nimport Form, { useForm } from 'form-render';\nimp"
},
{
"path": "docs/form-render/demo/widget/depend-linkage.tsx",
"chars": 990,
"preview": "import React from 'react';\nimport { Input, Space } from 'antd';\nimport Form, { useForm } from 'form-render';\nimport type"
},
{
"path": "docs/form-render/demo/widget/desc-widget.tsx",
"chars": 616,
"preview": "import React from 'react';\nimport Form, { useForm } from 'form-render';\n\nconst schema = {\n type: 'object',\n properties"
},
{
"path": "docs/form-render/demo/widget/label-widget.tsx",
"chars": 586,
"preview": "import React from 'react';\nimport Form, { useForm } from 'form-render';\n\nconst schema = {\n type: 'object',\n properties"
},
{
"path": "docs/form-render/demo/widget/linkage.tsx",
"chars": 1002,
"preview": "import React from 'react';\nimport { Input, Space } from 'antd';\nimport Form, { useForm } from 'form-render';\nimport type"
},
{
"path": "docs/form-render/demo/widget/readonly-widget.tsx",
"chars": 1058,
"preview": "import React from 'react';\nimport { Input, Button, Switch } from 'antd';\nimport Form, { useForm } from 'form-render';\nim"
},
{
"path": "docs/form-render/disaply-search.md",
"chars": 4593,
"preview": "---\norder: 1\ntoc: content\nmobile: false\ngroup: \n title: 最佳示例\n order: 2\n---\n\n# 查询表单\n\n## 基础\n\n```jsx\nimport React from 'r"
},
{
"path": "docs/form-render/display-row.md",
"chars": 21015,
"preview": "---\norder: 0\ntoc: content\nmobile: false\ngroup: \n title: 最佳示例\n order: 2\n---\n\n# 内置组件\n\n## 基础组件\n\n```jsx\nimport React from "
},
{
"path": "docs/form-render/faq.md",
"chars": 583,
"preview": "---\norder: 1\ntoc: content\nmobile: false\ngroup: \n title: 其他\n order: 5\n---\n\n\n\n<!-- ---\norder: 11\ntoc: false\n--- -->\n# 常见"
},
{
"path": "docs/form-render/index.md",
"chars": 2688,
"preview": "---\norder: 0\ntoc: content\ntitle: 开始使用\nmobile: false\n---\n\n<div style=\"display:flex;align-items:center;margin-bottom:24px\""
},
{
"path": "docs/form-render/migrate.md",
"chars": 3228,
"preview": "---\norder: 0\ntoc: content\nmobile: false\nhide: true\ngroup: \n title: 其他\n order: 5\n---\n\n# V2 升级方案\n本文档将帮助你从 1.x 升级到 2.x 版本"
},
{
"path": "docs/form-render/schema/baseControl.ts",
"chars": 2641,
"preview": "export default {\n type: 'object',\n displayType: 'row',\n properties: {\n void1: {\n title: '常用组件',\n type: '"
},
{
"path": "docs/form-render/schema/basic.ts",
"chars": 355,
"preview": "export default {\n type: 'object',\n column: 3,\n displayType: 'row',\n properties: {\n input1: {\n title: 'Field "
},
{
"path": "docs/form-render/schema/cellSpan.ts",
"chars": 440,
"preview": "export default {\n type: 'object',\n column: 3,\n displayType: 'row',\n properties: {\n input1: {\n title: 'Field "
},
{
"path": "docs/form-render/schema/schema.ts",
"chars": 1961,
"preview": "export const basic = {\n type: 'object',\n column: 3,\n displayType: 'row',\n properties: {\n input1: {\n title: '"
},
{
"path": "docs/form-render/schema/simple.ts",
"chars": 393,
"preview": "export default {\n type: 'object',\n properties: {\n input: {\n title: '输入框',\n type: 'string',\n widget: "
},
{
"path": "docs/form-render/schema/span.ts",
"chars": 618,
"preview": "export default {\n type: 'object',\n displayType: 'row',\n properties: {\n input1: {\n title: 'Field A',\n typ"
},
{
"path": "docs/form-render/test/bigJson.tsx",
"chars": 2013,
"preview": "import React, { useEffect } from 'react';\nimport FormRender, { useForm } from 'form-render';\nimport { Button, Input } fr"
},
{
"path": "docs/form-render/test/bind.tsx",
"chars": 2403,
"preview": "import React from 'react';\nimport FormRender, { useForm } from 'form-render';\n\nconst schema = {\n type: 'object',\n disp"
},
{
"path": "docs/form-render/test/dependencies.tsx",
"chars": 3511,
"preview": "import React from 'react';\nimport { Input, } from 'antd';\nimport FormRender, { useForm } from 'form-render';\n\nconst { Te"
},
{
"path": "docs/form-render/test/disaply-column.md",
"chars": 14694,
"preview": "<!-- ---\norder: 3\ntoc: content\nmobile: false\ngroup: \n title: 最佳示例\n order: 2\n---\n\n# 纵向布局\n\n## 基础控件\n\n```jsx\nimport React "
},
{
"path": "docs/form-render/test/removeHidden.tsx",
"chars": 3558,
"preview": "import React from 'react';\nimport FormRender, { useForm } from 'form-render';\n\nconst schema = {\n type: 'object',\n prop"
},
{
"path": "docs/form-render/test/test.md",
"chars": 373,
"preview": "---\nmobile: false\n---\n\n\n<!-- <code src='./demo/dymic.tsx'></code> -->\n\n<!-- <code src='./demo/defaultChange.tsx'></code>"
},
{
"path": "docs/form-render/utils/index.js",
"chars": 221,
"preview": "export const delay = ms => new Promise(res => setTimeout(res, ms));\n\nexport const fakeApi = (url, data) => {\n console.g"
},
{
"path": "docs/form-render-mobile/api.md",
"chars": 13689,
"preview": "---\norder: 1\ntoc: content\ntitle: API\n---\n\n\n# 表单属性\n\n## Props\n\n| <div style=\"width:150px\">参数</div> | 说明 "
},
{
"path": "docs/form-render-mobile/demo/allWidget.tsx",
"chars": 2634,
"preview": "import React from 'react';\nimport { Button, Dialog } from 'antd-mobile';\nimport FormRender, { useForm } from 'form-rende"
},
{
"path": "docs/form-render-mobile/demo/basic.tsx",
"chars": 1953,
"preview": "import React from 'react';\nimport { Button, Dialog } from 'antd-mobile';\nimport FormRender, { useForm } from 'form-rende"
},
{
"path": "docs/form-render-mobile/demo/card.tsx",
"chars": 1468,
"preview": "import React from 'react';\nimport { Button, Dialog } from 'antd-mobile';\nimport FormRender, { useForm } from 'form-rende"
},
{
"path": "docs/form-render-mobile/demo/collaspa.tsx",
"chars": 1600,
"preview": "import React from 'react';\nimport FormRender, { useForm } from 'form-render-mobile';\n\nconst schema = {\n type: 'object',"
},
{
"path": "docs/form-render-mobile/demo/group.tsx",
"chars": 1670,
"preview": "import React from 'react';\nimport { Button, Dialog } from 'antd-mobile';\nimport FormRender, { useForm } from 'form-rende"
},
{
"path": "docs/form-render-mobile/demo/index.tsx",
"chars": 1952,
"preview": "import React from 'react';\nimport { Button, Dialog } from 'antd-mobile';\nimport FormRender, { useForm } from 'form-rende"
},
{
"path": "docs/form-render-mobile/demo/list.tsx",
"chars": 1200,
"preview": "import React from 'react';\nimport FormRender, { useForm } from 'form-render-mobile';\nimport { Button, Dialog } from 'ant"
},
{
"path": "docs/form-render-mobile/disaply.md",
"chars": 885,
"preview": "---\norder: 1\ntoc: content\ntitle: 内置控件\n---\n\n## 输入控件\n\n输入控件是由 antd mobile 组件,做了进一步的封装和兼容之后,组成的一系列开箱即用的 widget。如要对组件进行进一步的配置"
},
{
"path": "docs/form-render-mobile/index.md",
"chars": 1597,
"preview": "---\norder: 0\ntoc: content\ntitle: 开始使用\n---\n\n<div style=\"display:flex;align-items:center;margin-bottom:24px\">\n <img src=\""
},
{
"path": "docs/form-render-mobile/test/index.tsx",
"chars": 1206,
"preview": "import React from 'react';\nimport { Button, Dialog } from 'antd-mobile';\nimport FormRender, { useForm } from 'form-rende"
},
{
"path": "docs/form-render-mobile/test/test.md",
"chars": 45,
"preview": "<!-- <code src='./test/index.tsx'></code> -->"
},
{
"path": "docs/index.en-US.md",
"chars": 1226,
"preview": "---\ntitle: 首页\nhero:\n title: XRender 2.0\n description: |\n 中后台「表单/表格/图表/流程编排」开箱即用解决方案\n <br />\n <small style=\"op"
},
{
"path": "docs/index.zh-CN.md",
"chars": 1154,
"preview": "---\ntitle: 首页\nhero:\n title: XRender 2.0\n description: |\n 中后台「表单/表格/图表/流程编排」开箱即用解决方案\n <br />\n actions:\n - tex"
},
{
"path": "docs/playground/controller/index.css",
"chars": 265,
"preview": ".playground-controller .fr-field {\n margin-bottom: 4px;\n}\n\n.playground-controller {\n margin-bottom: 1px;\n background-"
},
{
"path": "docs/playground/controller/index.tsx",
"chars": 1562,
"preview": "import React from 'react';\nimport FormRender, { useForm } from 'form-render';\nimport './index.css';\n\nconst schema = {\n "
},
{
"path": "docs/playground/customized/AsyncSelect.js",
"chars": 1756,
"preview": "import React from 'react';\nimport { Select } from 'antd';\nimport jsonp from 'fetch-jsonp';\nimport querystring from 'quer"
},
{
"path": "docs/playground/example/expression.ts",
"chars": 1322,
"preview": "\nconst case1 = {\n\t\"type\": \"object\",\n \"properties\": {\n \"input\": {\n \"title\": \"输入框\",\n \"type\": \"string\",\n "
},
{
"path": "docs/playground/index.less",
"chars": 1888,
"preview": ".debug * {\n outline: 1px solid gold;\n}\n\n.markdown p {\n color: #454d64 !important;\n font-size: 15px !important;\n line"
},
{
"path": "docs/playground/index.md",
"chars": 103,
"preview": "---\norder: 0\nmobile: false\ntitle: ''\nsidebar: false\n---\n\n<code src='./index.tsx' inline={true}></code>\n"
},
{
"path": "docs/playground/index.tsx",
"chars": 4567,
"preview": "import React, { useCallback, useMemo, useState } from \"react\";\nimport FormRender, { useForm } from 'form-render';\nimport"
},
{
"path": "docs/playground/json/basic.json",
"chars": 5780,
"preview": "{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"AllString\": {\n \"title\": \"string类\",\n \"type"
},
{
"path": "docs/playground/json/demo.json",
"chars": 4504,
"preview": "{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"inputDemo\": {\n \"title\": \"长度\",\n \"type\": \"s"
},
{
"path": "docs/playground/json/dynamic-function.js",
"chars": 371,
"preview": "module.exports = {\n schema: {\n type: 'object',\n properties: {\n input: {\n title: '动态函数检验',\n too"
},
{
"path": "docs/playground/json/format.json",
"chars": 589,
"preview": "{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"inputName\": {\n \"title\": \"url输入框\",\n \"type\""
},
{
"path": "docs/playground/json/function.json",
"chars": 3292,
"preview": "{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"case1\": {\n \"title\": \"整体隐藏\",\n \"type\": \"obj"
},
{
"path": "docs/playground/json/input.json",
"chars": 1957,
"preview": "{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"string\": {\n \"title\": \"字符串\",\n \"description"
},
{
"path": "docs/playground/json/new-feature.json",
"chars": 4784,
"preview": "{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"html\": {\n \"title\": \"html元素的使用\",\n \"type\": "
},
{
"path": "docs/playground/json/select.json",
"chars": 644,
"preview": "{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"select\": {\n \"title\": \"带搜索的单选框\",\n \"type\": "
},
{
"path": "docs/playground/json/simplest.json",
"chars": 1311,
"preview": "{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"input\": {\n \"title\": \"简单输入框\",\n \"type\": \"st"
},
{
"path": "docs/playground/serialize.js",
"chars": 9392,
"preview": "/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompany"
},
{
"path": "docs/schema-builder/api.md",
"chars": 3434,
"preview": "---\norder: 0\nmobile: false\n---\n# API\n\n## Props\n\n| 属性 | 描述 "
},
{
"path": "docs/schema-builder/index.md",
"chars": 2096,
"preview": "---\norder: 0\ntitle: 开始使用\nmobile: false\n---\n\n<div style=\"display:flex;align-items:center;margin-bottom:24px\">\n <img src="
},
{
"path": "docs/schema-builder-online/index.md",
"chars": 478,
"preview": "---\nsidebar: false\n---\n\n```jsx\n/**\n * transform: true\n * compact: true\n * inline: true\n */\nimport React from 'react';\nim"
},
{
"path": "docs/table-render/.test/test.md",
"chars": 41,
"preview": "<!-- <code src='./test1.jsx'></code> -->\n"
},
{
"path": "docs/table-render/api.md",
"chars": 8960,
"preview": "---\norder: 0\nmobile: false\ngroup: \n title: 其他\n order: 5\n---\n# API\n\n## TableRender\n\n对 Antd Table 的 [props](https://ant-"
},
{
"path": "docs/table-render/basic.md",
"chars": 129,
"preview": "---\norder: 2\ntitle: '基础交互'\nmobile: false\ngroup: \n title: 最佳展示\n order: 2\n---\n# 基础交互\n\n<code src=\"./demo/basic/index.tsx\""
},
{
"path": "docs/table-render/collapsed.md",
"chars": 1429,
"preview": "---\norder: 2\nmobile: false\ntitle: '搜索栏折叠'\ngroup: \n title: 最佳展示\n order: 2\n---\n# 搜索栏折叠\n\n## 默认收起\n```jsx\n/**\n * transform:"
},
{
"path": "docs/table-render/custom-table.md",
"chars": 245,
"preview": "---\norder: 6\nmobile: false\ntitle: 'Table 包裹容器'\ngroup: \n title: 最佳展示\n order: 0\n---\n\n# tableWrapper 包裹容器\n\n有些情况下,你会希望在搜索栏"
},
{
"path": "docs/table-render/demo/basic/index.tsx",
"chars": 1097,
"preview": "/**\n * transform: true\n * defaultShowCode: true\n * background: 'rgb(245,245,245)'\n */\nimport React, { useRef } from 'rea"
},
{
"path": "docs/table-render/demo/display/custom-table.tsx",
"chars": 927,
"preview": "/**\n * defaultShowCode: true\n */\nimport React, { useRef } from 'react';\nimport TableRender, { TableContext } from 'table"
},
{
"path": "docs/table-render/demo/toolbar/basic.tsx",
"chars": 1296,
"preview": "/**\n * background: 'rgb(245,245,245)'\n */\nimport React, { useRef } from 'react';\nimport TableRender, { ProColumnsType } "
},
{
"path": "docs/table-render/demo/toolbar/selection-tool.tsx",
"chars": 1389,
"preview": "/**\n * transform: true\n * defaultShowCode: false\n * background: 'rgb(245,245,245)'\n */\nimport React, { useRef } from 're"
},
{
"path": "docs/table-render/index.md",
"chars": 2876,
"preview": "---\norder: 0\nmobile: false\ntitle: '使用教程'\ngroup: \n order: 1\n---\n\n<div style=\"display:flex;align-items:center;margin-bott"
},
{
"path": "docs/table-render/migrate.md",
"chars": 1580,
"preview": "---\norder: 0\nmobile: false\ngroup: \n title: 其他\n order: 5\n---\n# V2 升级方案\n\n本文档将帮助你从 1.x 升级到 2.x 版本\n\n## 特性\n\n全新的 table-rende"
},
{
"path": "docs/table-render/noSearch.md",
"chars": 631,
"preview": "---\norder: 3\nmobile: false\ngroup: \n title: 最佳展示\n order: 2\n---\n\n\n# 无搜索栏\n\n```jsx\n/**\n * transform: true\n * defaultShowCo"
},
{
"path": "docs/table-render/promptly-search.md",
"chars": 2169,
"preview": "---\norder: 3\nmobile: false\ntitle: '查询实时响应'\ngroup: \n title: 最佳展示\n order: 2\n---\n# 实时响应\n有些情况下,我们需要当查询条件值改变时,立即触发查询,这个时候可以"
},
{
"path": "docs/table-render/static/request.ts",
"chars": 890,
"preview": "import request from 'umi-request';\n\nconst requestData = (params: any) => {\n return request\n .get(\n 'https://www"
},
{
"path": "docs/table-render/static/search.ts",
"chars": 1735,
"preview": "export const schema = {\n type: 'object',\n labelWidth: 80,\n properties: {\n state: {\n title: '酒店状态',\n type"
},
{
"path": "docs/table-render/static/table.tsx",
"chars": 1030,
"preview": "import React from 'react';\nimport { Button } from 'antd';\nimport { PlusOutlined } from '@ant-design/icons';\nimport { Pro"
},
{
"path": "docs/table-render/tabs.md",
"chars": 873,
"preview": "---\norder: 6\nmobile: false\ntitle: 'Tab 数据分类'\ngroup: \n title: 最佳展示\n order: 2\n---\n\n# 数据分类\n```jsx\n/**\n * transform: true\n"
},
{
"path": "docs/table-render/toolbar.md",
"chars": 413,
"preview": "---\norder: 7\ntitle: '工具栏'\nmobile: false\ngroup: \n title: 最佳展示\n---\n\n# 工具栏\n\nTable Render 内置工具栏,通过 `toolbarAction` 开启。默认四种功"
},
{
"path": "docs/table-render/valueType.md",
"chars": 4056,
"preview": "---\norder: 5\nmobile: false\ntitle: '数据展示模版'\ngroup: \n title: 最佳展示\n order: 0\n---\n\n# 数据展示类型\n数据模版:`image`、`money`、`tag`、`ta"
},
{
"path": "docs/tools/proptypes/index.md",
"chars": 3298,
"preview": "---\ntitle: PropToSchema\ngroup:\n title: PropToSchema\ntoc: content\n---\n\n# PropToSchema [ => "
},
{
"path": "docs/xflow/demo/basic/setting.tsx",
"chars": 5828,
"preview": "export default [\n {\n title: '开始',\n type: 'Start',\n hidden: true,\n targetHandleHidden: true,\n icon: {\n "
},
{
"path": "docs/xflow/demo/best/basic/TextEllipsis/index.less",
"chars": 216,
"preview": ".text-ellipsis {\n display: inline-block;\n max-width: 100%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow:"
},
{
"path": "docs/xflow/demo/best/basic/TextEllipsis/index.tsx",
"chars": 2375,
"preview": "import { Tooltip, TooltipProps } from 'antd';\nimport React, { FC, memo, useEffect, useState } from 'react';\nimport './in"
},
{
"path": "docs/xflow/demo/best/basic/const.tsx",
"chars": 6365,
"preview": "export const nodes = [\n {\n id: 'y01s4993gdvyknzf',\n type: 'startEvent',\n position: {\n x: 0,\n y: 120,"
},
{
"path": "docs/xflow/demo/best/basic/header.tsx",
"chars": 570,
"preview": "import React ,{ FC } from 'react';\nimport './index.less';\n\nconst Header: FC<{ data: any }> = ({ data }) => {\n // const"
},
{
"path": "docs/xflow/demo/best/basic/index.less",
"chars": 1102,
"preview": ".settingSchemaStyle {\n .ant-col {\n width: 100% !important;\n\n .ant-form-item-label label {\n font-weight: 500;"
},
{
"path": "docs/xflow/demo/best/basic/index.tsx",
"chars": 630,
"preview": "import XFlow from '@xrenders/xflow';\nimport { settings } from './setting';\nimport { nodes,edges } from './const';\nimport"
},
{
"path": "docs/xflow/demo/best/basic/setting.tsx",
"chars": 10111,
"preview": "export const settingSchema = {\n properties: {\n type: 'array',\n widget: 'simpleList',\n props: {\n hideCopy:"
},
{
"path": "docs/xflow/demo/best/basic/showSwitchNode.tsx",
"chars": 832,
"preview": "import { Space } from 'antd';\nimport React from 'react';\nimport './index.less';\nimport TextEllipsis from './TextEllipsis"
}
]
// ... and 509 more files (download for full content)
About this extraction
This page contains the full source code of the alibaba/x-render GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 709 files (1.3 MB), approximately 413.5k tokens, and a symbol index with 312 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.