@baishuyun/ai-design 1.0.9 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +570 -26
- package/CHANGELOG.md +18 -0
- package/dist/ai-design.css +4 -3
- package/dist/ai-design.js +9554 -9498
- package/dist/ai-design.js.map +1 -1
- package/dist/ai-design.umd.cjs +82 -94
- package/dist/ai-design.umd.cjs.map +1 -1
- package/dist/src/components/agent-helper/agent-category-select-menu/index.d.ts +1 -1
- package/dist/src/components/agent-helper/agent-category-select-menu/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/agent-entry-card/index.d.ts +1 -1
- package/dist/src/components/agent-helper/agent-entry-card/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/agent-helper-card/index.d.ts +1 -1
- package/dist/src/components/agent-helper/agent-helper-card/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/agent-helper-card-list/index.d.ts +1 -1
- package/dist/src/components/agent-helper/agent-helper-card-list/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/agent-helper-main-layout/index.d.ts +5 -5
- package/dist/src/components/agent-helper/agent-sort-select/index.d.ts +8 -0
- package/dist/src/components/agent-helper/agent-sort-select/index.d.ts.map +1 -0
- package/dist/src/components/agent-helper/agent-tag/index.d.ts +1 -1
- package/dist/src/components/agent-helper/agent-tag/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/app-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/app-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/condition-group/index.d.ts +1 -1
- package/dist/src/components/agent-helper/condition-input/index.d.ts +2 -2
- package/dist/src/components/agent-helper/condition-input/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/condition-item/index.d.ts +1 -1
- package/dist/src/components/agent-helper/condition-quantifier-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/condition-quantifier-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/condition-trigger-description/index.d.ts +1 -1
- package/dist/src/components/agent-helper/condition-trigger-description/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/date-picker/calendar-panel.d.ts +1 -1
- package/dist/src/components/agent-helper/date-picker/calendar-panel.d.ts.map +1 -1
- package/dist/src/components/agent-helper/date-picker/date-input.d.ts +1 -1
- package/dist/src/components/agent-helper/date-picker/date-input.d.ts.map +1 -1
- package/dist/src/components/agent-helper/date-picker/date-picker.d.ts +1 -1
- package/dist/src/components/agent-helper/date-picker/date-picker.d.ts.map +1 -1
- package/dist/src/components/agent-helper/date-picker/footer-panel.d.ts +1 -1
- package/dist/src/components/agent-helper/date-picker/footer-panel.d.ts.map +1 -1
- package/dist/src/components/agent-helper/date-picker/month-panel.d.ts +1 -1
- package/dist/src/components/agent-helper/date-picker/month-panel.d.ts.map +1 -1
- package/dist/src/components/agent-helper/date-picker/time-panel.d.ts +1 -1
- package/dist/src/components/agent-helper/date-picker/time-panel.d.ts.map +1 -1
- package/dist/src/components/agent-helper/date-picker/year-panel.d.ts +1 -1
- package/dist/src/components/agent-helper/date-picker/year-panel.d.ts.map +1 -1
- package/dist/src/components/agent-helper/exec-log-filter/index.d.ts +1 -1
- package/dist/src/components/agent-helper/exec-log-filter/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/field-edit-preference-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/field-edit-preference-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/field-select/index.d.ts +2 -2
- package/dist/src/components/agent-helper/field-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/field-value-input/display.d.ts +4 -4
- package/dist/src/components/agent-helper/field-value-input/display.d.ts.map +1 -1
- package/dist/src/components/agent-helper/field-value-input/icons.d.ts +5 -5
- package/dist/src/components/agent-helper/field-value-input/icons.d.ts.map +1 -1
- package/dist/src/components/agent-helper/field-value-input/index.d.ts +2 -2
- package/dist/src/components/agent-helper/field-value-input/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/field-value-input/inputs.d.ts +8 -8
- package/dist/src/components/agent-helper/field-value-input/inputs.d.ts.map +1 -1
- package/dist/src/components/agent-helper/field-value-input/picker-inputs.d.ts +8 -8
- package/dist/src/components/agent-helper/field-value-input/picker-inputs.d.ts.map +1 -1
- package/dist/src/components/agent-helper/flow-node-action-trigger-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/flow-node-action-trigger-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/form-action-trigger-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/form-action-trigger-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/form-divider/index.d.ts +1 -1
- package/dist/src/components/agent-helper/form-divider/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/monthdays-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/monthdays-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/offset-preference-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/offset-preference-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/offset-type-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/offset-type-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/offset-unit-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/offset-unit-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/placeholder-card/index.d.ts +1 -1
- package/dist/src/components/agent-helper/placeholder-card/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/prompt-input/index.d.ts +1 -1
- package/dist/src/components/agent-helper/prompt-input/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/relational-operator-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/relational-operator-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/repeat-by-type-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/repeat-by-type-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/repeat-preference-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/repeat-preference-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/repeat-preference-type-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/repeat-preference-type-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/search-input/index.d.ts +1 -1
- package/dist/src/components/agent-helper/search-input/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/table/index.d.ts +1 -1
- package/dist/src/components/agent-helper/table/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/trigger-select/index.d.ts +2 -2
- package/dist/src/components/agent-helper/trigger-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/trigger-time-preference-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/trigger-time-preference-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/trigger-time-source-type-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/trigger-time-source-type-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-helper/weekdays-select/index.d.ts +1 -1
- package/dist/src/components/agent-helper/weekdays-select/index.d.ts.map +1 -1
- package/dist/src/components/agent-scroll-selector.d.ts +1 -1
- package/dist/src/components/agent-scroll-selector.d.ts.map +1 -1
- package/dist/src/components/agent-select.d.ts +1 -1
- package/dist/src/components/agent-select.d.ts.map +1 -1
- package/dist/src/components/attachment-part-group.d.ts +1 -1
- package/dist/src/components/attachment-part-group.d.ts.map +1 -1
- package/dist/src/components/attachment-part.d.ts +1 -1
- package/dist/src/components/attachment-part.d.ts.map +1 -1
- package/dist/src/components/attachments-previewer.d.ts +1 -1
- package/dist/src/components/attachments-previewer.d.ts.map +1 -1
- package/dist/src/components/border-color-animation.d.ts +1 -1
- package/dist/src/components/border-color-animation.d.ts.map +1 -1
- package/dist/src/components/bot-avatar-name.d.ts +1 -1
- package/dist/src/components/bot-avatar-name.d.ts.map +1 -1
- package/dist/src/components/bot-icon.d.ts +1 -1
- package/dist/src/components/bot-icon.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/app-group-folder.d.ts +1 -1
- package/dist/src/components/bs-entry-select/app-group-folder.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/bs-entry-select.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/entry-item.d.ts +1 -1
- package/dist/src/components/bs-entry-select/entry-item.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/entry-popover.d.ts +3 -2
- package/dist/src/components/bs-entry-select/entry-popover.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/other-app-section.d.ts +1 -1
- package/dist/src/components/bs-entry-select/other-app-section.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/scroll-slider.d.ts +3 -2
- package/dist/src/components/bs-entry-select/scroll-slider.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/search-input.d.ts +1 -1
- package/dist/src/components/bs-entry-select/search-input.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/tree-item-node.d.ts +1 -1
- package/dist/src/components/bs-entry-select/tree-item-node.d.ts.map +1 -1
- package/dist/src/components/bs-entry-select/types.d.ts +1 -0
- package/dist/src/components/bs-entry-select/types.d.ts.map +1 -1
- package/dist/src/components/bs-icons.d.ts +72 -72
- package/dist/src/components/bs-icons.d.ts.map +1 -1
- package/dist/src/components/card-field.d.ts +2 -2
- package/dist/src/components/card-field.d.ts.map +1 -1
- package/dist/src/components/card.d.ts +1 -1
- package/dist/src/components/card.d.ts.map +1 -1
- package/dist/src/components/chat-area-header.d.ts +1 -1
- package/dist/src/components/chat-area-header.d.ts.map +1 -1
- package/dist/src/components/check-card.d.ts +1 -1
- package/dist/src/components/check-card.d.ts.map +1 -1
- package/dist/src/components/circle-checker.d.ts +1 -1
- package/dist/src/components/circle-checker.d.ts.map +1 -1
- package/dist/src/components/collapsible-txt-msg.d.ts +1 -1
- package/dist/src/components/collapsible-txt-msg.d.ts.map +1 -1
- package/dist/src/components/confirm-dialog.d.ts +1 -1
- package/dist/src/components/confirm-dialog.d.ts.map +1 -1
- package/dist/src/components/date-range-picker.d.ts +1 -1
- package/dist/src/components/date-range-picker.d.ts.map +1 -1
- package/dist/src/components/fake-bot-msg.d.ts +1 -1
- package/dist/src/components/fake-bot-msg.d.ts.map +1 -1
- package/dist/src/components/field-checker-list-msg.d.ts +3 -3
- package/dist/src/components/field-checker-list-msg.d.ts.map +1 -1
- package/dist/src/components/field-checker.d.ts +4 -6
- package/dist/src/components/field-checker.d.ts.map +1 -1
- package/dist/src/components/field-icon.d.ts +1 -1
- package/dist/src/components/field-icon.d.ts.map +1 -1
- package/dist/src/components/field-value-checker.d.ts +4 -6
- package/dist/src/components/field-value-checker.d.ts.map +1 -1
- package/dist/src/components/fields-design-info-table.d.ts +1 -1
- package/dist/src/components/fields-design-info-table.d.ts.map +1 -1
- package/dist/src/components/fields-generating-indicator.d.ts +2 -2
- package/dist/src/components/fields-generating-indicator.d.ts.map +1 -1
- package/dist/src/components/font-icon.d.ts +2 -2
- package/dist/src/components/font-icon.d.ts.map +1 -1
- package/dist/src/components/form-info-editor.d.ts +1 -1
- package/dist/src/components/form-info-editor.d.ts.map +1 -1
- package/dist/src/components/formula-tag.d.ts +1 -1
- package/dist/src/components/formula-tag.d.ts.map +1 -1
- package/dist/src/components/generate-animation.d.ts +1 -1
- package/dist/src/components/generate-animation.d.ts.map +1 -1
- package/dist/src/components/icon-card.d.ts +1 -1
- package/dist/src/components/icon-card.d.ts.map +1 -1
- package/dist/src/components/icons/calendar-icon.d.ts +1 -1
- package/dist/src/components/icons/calendar-icon.d.ts.map +1 -1
- package/dist/src/components/icons/clear-all-icon.d.ts +1 -1
- package/dist/src/components/icons/clear-all-icon.d.ts.map +1 -1
- package/dist/src/components/icons/empty-table-icon.d.ts +1 -1
- package/dist/src/components/icons/empty-table-icon.d.ts.map +1 -1
- package/dist/src/components/icons/grids-icon.d.ts +1 -1
- package/dist/src/components/icons/grids-icon.d.ts.map +1 -1
- package/dist/src/components/img-part.d.ts +1 -1
- package/dist/src/components/img-part.d.ts.map +1 -1
- package/dist/src/components/legacy-slot.d.ts +1 -1
- package/dist/src/components/legacy-slot.d.ts.map +1 -1
- package/dist/src/components/linear-gradient-color-bg-animation.d.ts +1 -1
- package/dist/src/components/linear-gradient-color-bg-animation.d.ts.map +1 -1
- package/dist/src/components/memoized-markdown.d.ts +1 -1
- package/dist/src/components/memoized-markdown.d.ts.map +1 -1
- package/dist/src/components/message-content.d.ts +1 -1
- package/dist/src/components/message-content.d.ts.map +1 -1
- package/dist/src/components/number-part.d.ts +1 -1
- package/dist/src/components/number-part.d.ts.map +1 -1
- package/dist/src/components/office-container.d.ts +2 -0
- package/dist/src/components/office-container.d.ts.map +1 -1
- package/dist/src/components/option-item.d.ts +1 -1
- package/dist/src/components/option-item.d.ts.map +1 -1
- package/dist/src/components/output-config-editor.d.ts +6 -11
- package/dist/src/components/output-config-editor.d.ts.map +1 -1
- package/dist/src/components/previewer-header.d.ts +1 -1
- package/dist/src/components/previewer-header.d.ts.map +1 -1
- package/dist/src/components/primary-confirm-btn.d.ts +1 -1
- package/dist/src/components/primary-confirm-btn.d.ts.map +1 -1
- package/dist/src/components/primary-entry-btn.d.ts +1 -1
- package/dist/src/components/primary-entry-btn.d.ts.map +1 -1
- package/dist/src/components/radio-card.d.ts +1 -1
- package/dist/src/components/radio-card.d.ts.map +1 -1
- package/dist/src/components/scroll-to-bottom-btn.d.ts +1 -1
- package/dist/src/components/scroll-to-bottom-btn.d.ts.map +1 -1
- package/dist/src/components/split-line.d.ts +1 -1
- package/dist/src/components/split-line.d.ts.map +1 -1
- package/dist/src/components/subform-fields-value-checker.d.ts +4 -6
- package/dist/src/components/subform-fields-value-checker.d.ts.map +1 -1
- package/dist/src/components/tooltip.d.ts +1 -1
- package/dist/src/components/tooltip.d.ts.map +1 -1
- package/dist/src/components/ui/calendar.d.ts +1 -1
- package/dist/src/components/ui/calendar.d.ts.map +1 -1
- package/dist/src/components/ui/dialog.d.ts +2 -2
- package/dist/src/components/ui/drawer.d.ts +11 -11
- package/dist/src/components/ui/drawer.d.ts.map +1 -1
- package/dist/src/components/ui/form.d.ts +1 -1
- package/dist/src/components/ui/form.d.ts.map +1 -1
- package/dist/src/components/ui/icons.d.ts +63 -63
- package/dist/src/components/ui/icons.d.ts.map +1 -1
- package/dist/src/components/ui/spinner.d.ts +1 -1
- package/dist/src/components/ui/spinner.d.ts.map +1 -1
- package/dist/src/components/ui/switch.d.ts +1 -1
- package/dist/src/components/ui/switch.d.ts.map +1 -1
- package/dist/src/components/ui/tooltip.d.ts +1 -1
- package/dist/src/components/ui/tooltip.d.ts.map +1 -1
- package/dist/src/components/user-txt-msg-bubble.d.ts +1 -1
- package/dist/src/components/user-txt-msg-bubble.d.ts.map +1 -1
- package/dist/src/components/warning-msg.d.ts +1 -1
- package/dist/src/components/warning-msg.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/stories/AgentCategorySelectMenu.stories.d.ts +1 -1
- package/dist/src/stories/AgentEntryCard.stories.d.ts +1 -1
- package/dist/src/stories/AgentHelperCard.stories.d.ts +1 -1
- package/dist/src/stories/AgentHelperCardList.stories.d.ts +1 -1
- package/dist/src/stories/AgentTag.stories.d.ts +1 -1
- package/dist/src/stories/AttachmentPart.stories.d.ts +2 -2
- package/dist/src/stories/AttachmentPartGroup.stories.d.ts +2 -2
- package/dist/src/stories/BaseButton.stories.d.ts +1 -1
- package/dist/src/stories/BorderColorAnimation.stories.d.ts +1 -1
- package/dist/src/stories/BotAvatarAndName.stories.d.ts +1 -1
- package/dist/src/stories/BotIcon.stories.d.ts +1 -1
- package/dist/src/stories/BsEntrySelect.stories.d.ts +1 -0
- package/dist/src/stories/BsEntrySelect.stories.d.ts.map +1 -1
- package/dist/src/stories/Card.stories.d.ts +1 -1
- package/dist/src/stories/ChatAreaHeader.stories.d.ts +1 -1
- package/dist/src/stories/CheckCard.stories.d.ts +1 -1
- package/dist/src/stories/CircleChecker.stories.d.ts +1 -1
- package/dist/src/stories/CollapsibleTextMsg.stories.d.ts +1 -1
- package/dist/src/stories/ConditonQuantifierSelect.stories.d.ts +1 -1
- package/dist/src/stories/ConditonTriggerDescription.stories.d.ts +1 -1
- package/dist/src/stories/FakeBotMsg.stories.d.ts +1 -1
- package/dist/src/stories/FlowNodeActionTriggerSelect.stories.d.ts +1 -1
- package/dist/src/stories/FormActionTriggerSelect.stories.d.ts +1 -1
- package/dist/src/stories/FormDivider.stories.d.ts +1 -1
- package/dist/src/stories/FormulaTag.stories.d.ts +1 -1
- package/dist/src/stories/GenerateAnimation.stories.d.ts +1 -1
- package/dist/src/stories/IconCard.stories.d.ts +1 -1
- package/dist/src/stories/IconLib.d.ts +1 -1
- package/dist/src/stories/Icons.stories.d.ts +1 -1
- package/dist/src/stories/ImgMsgPart.stories.d.ts +1 -1
- package/dist/src/stories/LinearGradientColorBgAnimation.stories.d.ts +1 -1
- package/dist/src/stories/MemoizedMarkdown.stories.d.ts +1 -1
- package/dist/src/stories/MessageContent.stories.d.ts +1 -1
- package/dist/src/stories/NumbersMsgPart.stories.d.ts +1 -1
- package/dist/src/stories/OfficeContainer.stories.d.ts +1 -0
- package/dist/src/stories/OfficeContainer.stories.d.ts.map +1 -1
- package/dist/src/stories/OptionItem.stories.d.ts +1 -1
- package/dist/src/stories/OutputConfigEditor.stories.d.ts.map +1 -1
- package/dist/src/stories/PlaceholderCard.stories.d.ts +14 -1
- package/dist/src/stories/PlaceholderCard.stories.d.ts.map +1 -1
- package/dist/src/stories/PrimaryConfirmBtn.stories.d.ts +1 -1
- package/dist/src/stories/PrimaryEntryBtn.stories.d.ts +1 -1
- package/dist/src/stories/PromptInput.stories.d.ts.map +1 -1
- package/dist/src/stories/RadioCard.stories.d.ts +1 -1
- package/dist/src/stories/RelationalOperatorSelect.stories.d.ts +1 -1
- package/dist/src/stories/ScrollToBottom.stories.d.ts +1 -1
- package/dist/src/stories/SearchInput.stories.d.ts +1 -1
- package/dist/src/stories/TriggerSelect.stories.d.ts +1 -1
- package/dist/src/stories/UserTextMsgBubble.stories.d.ts +1 -1
- package/dist/src/stories/WarningMessage.stories.d.ts +1 -1
- package/dist/src/stories/fields-generating.stories.d.ts +1 -1
- package/package.json +24 -22
- package/src/components/agent-helper/agent-entry-card/index.tsx +3 -3
- package/src/components/agent-helper/agent-sort-select/index.tsx +89 -0
- package/src/components/agent-helper/condition-input/index.tsx +13 -2
- package/src/components/agent-helper/field-select/index.tsx +35 -12
- package/src/components/agent-helper/field-value-input/picker-inputs.tsx +4 -3
- package/src/components/agent-helper/placeholder-card/index.tsx +14 -11
- package/src/components/agent-helper/prompt-input/index.tsx +44 -33
- package/src/components/agent-scroll-selector.tsx +1 -1
- package/src/components/bs-entry-select/bs-entry-select.tsx +12 -4
- package/src/components/bs-entry-select/entry-popover.tsx +3 -1
- package/src/components/bs-entry-select/other-app-section.tsx +1 -1
- package/src/components/bs-entry-select/scroll-slider.tsx +12 -2
- package/src/components/bs-entry-select/types.ts +1 -0
- package/src/components/field-checker.tsx +5 -7
- package/src/components/field-value-checker.tsx +3 -5
- package/src/components/office-container.tsx +67 -4
- package/src/components/output-config-editor.tsx +259 -241
- package/src/components/subform-fields-value-checker.tsx +10 -11
- package/src/index.ts +3 -1
- package/src/stories/BsEntrySelect.stories.tsx +10 -0
- package/src/stories/OfficeContainer.stories.tsx +56 -0
- package/src/stories/OutputConfigEditor.stories.tsx +43 -23
- package/src/stories/PromptInput.stories.tsx +12 -1
- package/style.css +4 -3
|
@@ -2,7 +2,7 @@ import { useState, useCallback, useMemo, useRef } from 'react';
|
|
|
2
2
|
import { cn } from '../../../lib/utils';
|
|
3
3
|
import { transCls } from '../../../const/ui';
|
|
4
4
|
import { Popover, PopoverTrigger, PopoverContent } from '../../ui/popover';
|
|
5
|
-
import type { IField, FieldType } from '@baishuyun/types';
|
|
5
|
+
import type { IField, FieldType, ISubformField } from '@baishuyun/types';
|
|
6
6
|
import { SearchIcon } from '../../bs-icons';
|
|
7
7
|
|
|
8
8
|
const ToggleIcon = ({ expanded }: { expanded: boolean }) => (
|
|
@@ -77,6 +77,7 @@ interface FieldTreeNode {
|
|
|
77
77
|
depth: number;
|
|
78
78
|
children: FieldTreeNode[];
|
|
79
79
|
isExpandable?: boolean;
|
|
80
|
+
widgetName?: string;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
// ── Tree Builder ──────────────────────────────────────────────────
|
|
@@ -85,8 +86,8 @@ function buildNodeKey(field: IField, index: number): string {
|
|
|
85
86
|
return field.widget?.widgetName || String(index);
|
|
86
87
|
}
|
|
87
88
|
|
|
88
|
-
function buildItemNodeKey(parentKey: string, item: { widget?: { widgetName?: string } }, index: number): string {
|
|
89
|
-
return item.widget?.widgetName || `${parentKey}-${index}`;
|
|
89
|
+
function buildItemNodeKey(parentKey: string, item: { widget?: { widgetName?: string }; value?: unknown; text?: string }, index: number): string {
|
|
90
|
+
return (item as { widget?: { widgetName?: string } }).widget?.widgetName || `${parentKey}-${index}`;
|
|
90
91
|
}
|
|
91
92
|
|
|
92
93
|
function buildFieldTree(fields: IField[], searchQuery: string): FieldTreeNode[] {
|
|
@@ -97,22 +98,31 @@ function buildFieldTree(fields: IField[], searchQuery: string): FieldTreeNode[]
|
|
|
97
98
|
for (let i = 0; i < fields.length; i++) {
|
|
98
99
|
const field = fields[i];
|
|
99
100
|
const label = field.label;
|
|
101
|
+
const parentWidgetName = field.widget?.widgetName;
|
|
102
|
+
|
|
103
|
+
// Only items with a 'widget' property (ISubformField) are expandable sub-fields
|
|
100
104
|
const items = field.widget?.items;
|
|
101
|
-
const
|
|
102
|
-
|
|
105
|
+
const subformItems = items?.filter(
|
|
106
|
+
(item): item is ISubformField => 'widget' in item
|
|
107
|
+
);
|
|
108
|
+
const hasItems = subformItems && subformItems.length > 0;
|
|
109
|
+
const rootKey = parentWidgetName || buildNodeKey(field, i);
|
|
103
110
|
|
|
104
111
|
const children: FieldTreeNode[] = [];
|
|
105
112
|
if (hasItems) {
|
|
106
|
-
for (let j = 0; j <
|
|
107
|
-
const item =
|
|
113
|
+
for (let j = 0; j < subformItems!.length; j++) {
|
|
114
|
+
const item = subformItems![j];
|
|
115
|
+
const childWidgetName = item.widget?.widgetName || `${rootKey}-item-${j}`;
|
|
116
|
+
const fullWidgetName = `${parentWidgetName}.${childWidgetName}`;
|
|
108
117
|
children.push({
|
|
109
|
-
key:
|
|
110
|
-
label: item.label
|
|
118
|
+
key: fullWidgetName,
|
|
119
|
+
label: item.label || `选项 ${j + 1}`,
|
|
111
120
|
field: field,
|
|
112
121
|
fieldType: item.widget?.type,
|
|
113
122
|
depth: 1,
|
|
114
123
|
children: [],
|
|
115
124
|
isExpandable: false,
|
|
125
|
+
widgetName: fullWidgetName,
|
|
116
126
|
});
|
|
117
127
|
}
|
|
118
128
|
}
|
|
@@ -129,6 +139,7 @@ function buildFieldTree(fields: IField[], searchQuery: string): FieldTreeNode[]
|
|
|
129
139
|
depth: 0,
|
|
130
140
|
children,
|
|
131
141
|
isExpandable: hasItems,
|
|
142
|
+
widgetName: parentWidgetName,
|
|
132
143
|
});
|
|
133
144
|
}
|
|
134
145
|
}
|
|
@@ -184,6 +195,7 @@ export const FieldSelectPopover = ({
|
|
|
184
195
|
|
|
185
196
|
const handleSelect = useCallback(
|
|
186
197
|
(node: FieldTreeNode) => {
|
|
198
|
+
if (node.isExpandable) return;
|
|
187
199
|
if (node.field) {
|
|
188
200
|
onSelect(node.field, node.key);
|
|
189
201
|
}
|
|
@@ -201,7 +213,11 @@ export const FieldSelectPopover = ({
|
|
|
201
213
|
: undefined;
|
|
202
214
|
|
|
203
215
|
const handleRowClick = () => {
|
|
204
|
-
|
|
216
|
+
if (node.isExpandable) {
|
|
217
|
+
toggleExpanded(node.key);
|
|
218
|
+
} else {
|
|
219
|
+
handleSelect(node);
|
|
220
|
+
}
|
|
205
221
|
};
|
|
206
222
|
|
|
207
223
|
const handleToggleClick = (e: React.MouseEvent) => {
|
|
@@ -300,8 +316,15 @@ function buildKeyLabelMap(fields: IField[]): Map<string, string> {
|
|
|
300
316
|
const items = field.widget?.items;
|
|
301
317
|
if (items) {
|
|
302
318
|
for (let j = 0; j < items.length; j++) {
|
|
303
|
-
const
|
|
304
|
-
|
|
319
|
+
const item = items[j];
|
|
320
|
+
// For ISubformField items, use dot-joined widgetName as key
|
|
321
|
+
if ('widget' in item) {
|
|
322
|
+
const fullKey = `${field.widget?.widgetName}.${item.widget?.widgetName}`;
|
|
323
|
+
map.set(fullKey, item.label || `选项 ${j + 1}`);
|
|
324
|
+
} else {
|
|
325
|
+
const childKey = buildItemNodeKey(rootKey, item, j);
|
|
326
|
+
map.set(childKey, item.text || `选项 ${j + 1}`);
|
|
327
|
+
}
|
|
305
328
|
}
|
|
306
329
|
}
|
|
307
330
|
}
|
|
@@ -285,7 +285,7 @@ export function AsyncPicker({ field, value, onChange, disabled, service, kind, m
|
|
|
285
285
|
return;
|
|
286
286
|
}
|
|
287
287
|
if (service?.searchUsers && kind === 'user') {
|
|
288
|
-
service.searchUsers('').then((users) => {
|
|
288
|
+
service.searchUsers('', { field: fieldName }).then((users) => {
|
|
289
289
|
const map: Record<string, string> = {};
|
|
290
290
|
users.forEach((u) => {
|
|
291
291
|
if (value.includes(u.id)) map[u.id] = u.name;
|
|
@@ -299,7 +299,7 @@ export function AsyncPicker({ field, value, onChange, disabled, service, kind, m
|
|
|
299
299
|
return;
|
|
300
300
|
}
|
|
301
301
|
if (service?.searchUsers && kind === 'user') {
|
|
302
|
-
service.searchUsers('').then((users) => {
|
|
302
|
+
service.searchUsers('', { field: fieldName }).then((users) => {
|
|
303
303
|
const found = users.find((u) => u.id === value);
|
|
304
304
|
if (found) setSelectedLabel(found.name);
|
|
305
305
|
});
|
|
@@ -307,12 +307,13 @@ export function AsyncPicker({ field, value, onChange, disabled, service, kind, m
|
|
|
307
307
|
}
|
|
308
308
|
}, [value, service, kind, multiple]);
|
|
309
309
|
|
|
310
|
+
const fieldName = field.widget?.widgetName || "";
|
|
310
311
|
const doSearch = useCallback(
|
|
311
312
|
async (kw: string) => {
|
|
312
313
|
if (!searchFn) return;
|
|
313
314
|
setLoading(true);
|
|
314
315
|
try {
|
|
315
|
-
const results = await searchFn(kw);
|
|
316
|
+
const results = await searchFn(kw, { field: fieldName });
|
|
316
317
|
setOptions(results);
|
|
317
318
|
} finally {
|
|
318
319
|
setLoading(false);
|
|
@@ -45,17 +45,20 @@ export const PlaceholderCard = ({
|
|
|
45
45
|
|
|
46
46
|
<div className="mt-[16px] text-center text-[#999] text-[14px] leading-[normal]">
|
|
47
47
|
<p className="mb-0">{description}</p>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
48
|
+
{
|
|
49
|
+
detailAddress ? (
|
|
50
|
+
<p>
|
|
51
|
+
<a
|
|
52
|
+
href={detailAddress}
|
|
53
|
+
target="_blank"
|
|
54
|
+
rel="noopener noreferrer"
|
|
55
|
+
className="text-[#0265ff] underline [text-decoration-skip-ink:none] decoration-solid"
|
|
56
|
+
>
|
|
57
|
+
了解详情
|
|
58
|
+
</a>
|
|
59
|
+
</p>
|
|
60
|
+
) : null
|
|
61
|
+
}
|
|
59
62
|
</div>
|
|
60
63
|
|
|
61
64
|
<button
|
|
@@ -3,7 +3,7 @@ import CodeMirror from 'codemirror';
|
|
|
3
3
|
import { cn } from '../../../lib/utils';
|
|
4
4
|
import { Popover, PopoverTrigger, PopoverContent } from '../../ui/popover';
|
|
5
5
|
import { FieldSelectPopover } from '../field-select';
|
|
6
|
-
import type { IField } from '@baishuyun/types';
|
|
6
|
+
import type { IField, ISubformField } from '@baishuyun/types';
|
|
7
7
|
|
|
8
8
|
// ── Create a DOM node for the field tag (used inside CodeMirror) ────
|
|
9
9
|
|
|
@@ -26,30 +26,45 @@ function createFieldTagDom(label: string): HTMLSpanElement {
|
|
|
26
26
|
|
|
27
27
|
// ── CodeMirror Helpers ──────────────────────────────────────────────
|
|
28
28
|
|
|
29
|
-
function
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
function resolveFieldWidgetInfo(
|
|
30
|
+
fields: IField[],
|
|
31
|
+
key: string,
|
|
32
|
+
): { widgetName: string; label: string } | undefined {
|
|
33
|
+
const dotIndex = key.indexOf('.');
|
|
34
|
+
if (dotIndex > 0) {
|
|
35
|
+
const parentName = key.substring(0, dotIndex);
|
|
36
|
+
const childName = key.substring(dotIndex + 1);
|
|
37
|
+
const parent = fields.find((f) => f.widget?.widgetName === parentName);
|
|
38
|
+
if (parent?.widget?.items) {
|
|
39
|
+
const child = parent.widget.items.find(
|
|
40
|
+
(item): item is ISubformField =>
|
|
41
|
+
'widget' in item && item.widget?.widgetName === childName,
|
|
42
|
+
);
|
|
43
|
+
if (child) {
|
|
44
|
+
return { widgetName: key, label: child.label };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
const field = fields.find((f) => f.widget?.widgetName === key);
|
|
49
|
+
if (field) {
|
|
50
|
+
return { widgetName: key, label: field.label };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
35
54
|
}
|
|
36
55
|
|
|
37
56
|
function addFieldToCM(
|
|
38
57
|
cm: CodeMirror.Editor,
|
|
39
|
-
|
|
58
|
+
widgetName: string,
|
|
59
|
+
displayLabel: string,
|
|
40
60
|
): void {
|
|
41
|
-
const key = FIELD_KEY(field);
|
|
42
|
-
const displayLabel = field.label;
|
|
43
61
|
const from = cm.getCursor('from');
|
|
44
62
|
|
|
45
|
-
|
|
46
|
-
// getTemplateFromCM always outputs ${key} regardless of whether
|
|
47
|
-
// markText has applied the replacedWith DOM decoration yet.
|
|
48
|
-
cm.replaceSelection('${' + key + '}');
|
|
63
|
+
cm.replaceSelection('${' + widgetName + '}');
|
|
49
64
|
const to = cm.getCursor();
|
|
50
65
|
|
|
51
66
|
const tagNode = createFieldTagDom(displayLabel);
|
|
52
|
-
tagNode.setAttribute('data-field-key',
|
|
67
|
+
tagNode.setAttribute('data-field-key', widgetName);
|
|
53
68
|
|
|
54
69
|
cm.markText(from, to, {
|
|
55
70
|
handleMouseEvents: true,
|
|
@@ -108,9 +123,9 @@ function setTemplateToCM(
|
|
|
108
123
|
for (const part of parts) {
|
|
109
124
|
const match = part.match(/^\$\{([^${}]*)\}$/);
|
|
110
125
|
if (match) {
|
|
111
|
-
const
|
|
112
|
-
if (
|
|
113
|
-
addFieldToCM(cm,
|
|
126
|
+
const info = resolveFieldWidgetInfo(fields, match[1]);
|
|
127
|
+
if (info) {
|
|
128
|
+
addFieldToCM(cm, info.widgetName, info.label);
|
|
114
129
|
} else {
|
|
115
130
|
cm.replaceSelection(part);
|
|
116
131
|
}
|
|
@@ -216,11 +231,14 @@ export const PromptInput = ({
|
|
|
216
231
|
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
217
232
|
|
|
218
233
|
// Handle controlled value updates
|
|
234
|
+
const prevFieldsLenRef = useRef(0);
|
|
219
235
|
useEffect(() => {
|
|
220
236
|
const cm = cmRef.current;
|
|
221
237
|
if (!cm || value === undefined) return;
|
|
222
238
|
const currentTemplate = getTemplateFromCM(cm);
|
|
223
|
-
|
|
239
|
+
const fieldsBecameAvailable = prevFieldsLenRef.current === 0 && fields.length > 0;
|
|
240
|
+
prevFieldsLenRef.current = fields.length;
|
|
241
|
+
if (currentTemplate !== value || fieldsBecameAvailable) {
|
|
224
242
|
isInternalUpdateRef.current = true;
|
|
225
243
|
setTemplateToCM(cm, value, fields);
|
|
226
244
|
isInternalUpdateRef.current = false;
|
|
@@ -239,12 +257,14 @@ export const PromptInput = ({
|
|
|
239
257
|
}, [placeholder]);
|
|
240
258
|
|
|
241
259
|
const handleFieldSelect = useCallback(
|
|
242
|
-
(
|
|
260
|
+
(_field: IField, nodeKey: string) => {
|
|
243
261
|
const cm = cmRef.current;
|
|
244
262
|
if (!cm) return;
|
|
263
|
+
const info = resolveFieldWidgetInfo(fieldsRef.current, nodeKey);
|
|
264
|
+
if (!info) return;
|
|
245
265
|
cm.focus();
|
|
246
266
|
isInternalUpdateRef.current = true;
|
|
247
|
-
addFieldToCM(cm,
|
|
267
|
+
addFieldToCM(cm, info.widgetName, info.label);
|
|
248
268
|
isInternalUpdateRef.current = false;
|
|
249
269
|
const template = getTemplateFromCM(cm);
|
|
250
270
|
onChangeRef.current?.(template);
|
|
@@ -585,7 +605,7 @@ export const PromptInput = ({
|
|
|
585
605
|
background: #EFF0F6;
|
|
586
606
|
border-radius: 4px;
|
|
587
607
|
font-size: 14px;
|
|
588
|
-
margin: 3px
|
|
608
|
+
margin: 3px 3px;
|
|
589
609
|
line-height: normal;
|
|
590
610
|
color: #000000;
|
|
591
611
|
white-space: nowrap;
|
|
@@ -601,18 +621,9 @@ export const PromptInput = ({
|
|
|
601
621
|
line-height: 1.4; /* 设置一个符合你字体大小的行高,例如 20px */
|
|
602
622
|
}
|
|
603
623
|
|
|
604
|
-
.CodeMirror-line > span {
|
|
605
|
-
display: inline-flex; /* 让行内元素使用 inline-flex 布局 */
|
|
606
|
-
align-items: center; /* 垂直居中对齐行内元素 */
|
|
607
|
-
gap: 6px; /* 行内元素之间的间距 */
|
|
608
|
-
flex-wrap: wrap; /* 允许行内元素换行 */
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
/* 保证光标元素自身不继承异常高度 */
|
|
612
624
|
.CodeMirror-cursor {
|
|
613
|
-
height:
|
|
614
|
-
border-left: 1px solid black;
|
|
615
|
-
transform: translateY(0);
|
|
625
|
+
height: 1.4em;
|
|
626
|
+
border-left: 1px solid black;
|
|
616
627
|
}
|
|
617
628
|
|
|
618
629
|
.prompt-field-tag-icon {
|
|
@@ -13,7 +13,7 @@ import { ScrollSlider } from './scroll-slider';
|
|
|
13
13
|
import { EntryPopover } from './entry-popover';
|
|
14
14
|
import { buildEntryTreeFromAliasMap } from './build-tree';
|
|
15
15
|
import type { BsEntrySelectProps, BsEntrySelectChangeResult } from './types';
|
|
16
|
-
import {
|
|
16
|
+
import { MenuLinesIcon } from '../bs-icons';
|
|
17
17
|
|
|
18
18
|
export type { BsEntrySelectProps, BsEntrySelectChangeResult };
|
|
19
19
|
|
|
@@ -29,6 +29,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
|
|
|
29
29
|
disabled = false,
|
|
30
30
|
className,
|
|
31
31
|
showSlider = true,
|
|
32
|
+
showCurrentAppEntriesOnly = false,
|
|
32
33
|
},
|
|
33
34
|
ref,
|
|
34
35
|
) => {
|
|
@@ -171,7 +172,12 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
|
|
|
171
172
|
const currentAppTree = useMemo(() => {
|
|
172
173
|
if (!currentAppId || !appDetails[currentAppId]) return [];
|
|
173
174
|
return buildEntryTreeFromAliasMap(appDetails[currentAppId], searchQuery);
|
|
174
|
-
}, [
|
|
175
|
+
}, [
|
|
176
|
+
appDetails,
|
|
177
|
+
currentAppId,
|
|
178
|
+
searchQuery,
|
|
179
|
+
currentAppId != null ? (appDetails[currentAppId]?.entryList?.length ?? 0) : 0,
|
|
180
|
+
]);
|
|
175
181
|
|
|
176
182
|
const hasSearch = searchQuery.trim().length > 0;
|
|
177
183
|
|
|
@@ -185,6 +191,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
|
|
|
185
191
|
selectedEntryId={selectedEntryId}
|
|
186
192
|
onSelect={handleSelect}
|
|
187
193
|
onOverflowChange={handleOverflowChange}
|
|
194
|
+
showCurrentAppEntriesOnly={showCurrentAppEntriesOnly}
|
|
188
195
|
/>
|
|
189
196
|
)}
|
|
190
197
|
|
|
@@ -230,7 +237,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
|
|
|
230
237
|
</span>
|
|
231
238
|
)} */}
|
|
232
239
|
</span>
|
|
233
|
-
<span
|
|
240
|
+
{/* <span
|
|
234
241
|
className={cn(
|
|
235
242
|
'shrink-0 flex items-center justify-center w-[16px] h-[16px] text-[#666666]',
|
|
236
243
|
transCls,
|
|
@@ -238,7 +245,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
|
|
|
238
245
|
)}
|
|
239
246
|
>
|
|
240
247
|
<ChevronDownIcon size={16} />
|
|
241
|
-
</span>
|
|
248
|
+
</span> */}
|
|
242
249
|
</div>
|
|
243
250
|
)}
|
|
244
251
|
|
|
@@ -258,6 +265,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
|
|
|
258
265
|
hasOtherApps={hasOtherApps}
|
|
259
266
|
hasAnyContent={hasAnyContent}
|
|
260
267
|
hasSearch={hasSearch}
|
|
268
|
+
showCurrentAppEntriesOnly={showCurrentAppEntriesOnly}
|
|
261
269
|
onSelect={handleSelect}
|
|
262
270
|
/>
|
|
263
271
|
</div>,
|
|
@@ -19,6 +19,7 @@ export function EntryPopover({
|
|
|
19
19
|
hasOtherApps,
|
|
20
20
|
hasAnyContent,
|
|
21
21
|
hasSearch,
|
|
22
|
+
showCurrentAppEntriesOnly = false,
|
|
22
23
|
onSelect,
|
|
23
24
|
}: {
|
|
24
25
|
searchQuery: string;
|
|
@@ -32,6 +33,7 @@ export function EntryPopover({
|
|
|
32
33
|
hasOtherApps: boolean;
|
|
33
34
|
hasAnyContent: boolean;
|
|
34
35
|
hasSearch: boolean;
|
|
36
|
+
showCurrentAppEntriesOnly?: boolean;
|
|
35
37
|
onSelect: (result: BsEntrySelectChangeResult) => void;
|
|
36
38
|
}) {
|
|
37
39
|
return (
|
|
@@ -70,7 +72,7 @@ export function EntryPopover({
|
|
|
70
72
|
</AppGroupFolder>
|
|
71
73
|
)}
|
|
72
74
|
|
|
73
|
-
{hasOtherApps && (
|
|
75
|
+
{hasOtherApps && !showCurrentAppEntriesOnly && (
|
|
74
76
|
<AppGroupFolder label="其他应用表单" searchQuery={searchQuery}>
|
|
75
77
|
{otherAppIds.map((appId) => (
|
|
76
78
|
<OtherAppSection
|
|
@@ -36,12 +36,14 @@ export function ScrollSlider({
|
|
|
36
36
|
selectedEntryId,
|
|
37
37
|
onSelect,
|
|
38
38
|
onOverflowChange,
|
|
39
|
+
showCurrentAppEntriesOnly = false,
|
|
39
40
|
}: {
|
|
40
41
|
appDetails: Record<string, IAppDetail>;
|
|
41
42
|
currentAppId?: string;
|
|
42
43
|
selectedEntryId?: string;
|
|
43
44
|
onSelect: (result: BsEntrySelectChangeResult) => void;
|
|
44
45
|
onOverflowChange?: (hasOverflow: boolean) => void;
|
|
46
|
+
showCurrentAppEntriesOnly?: boolean;
|
|
45
47
|
}) {
|
|
46
48
|
const scrollRef = useRef<HTMLDivElement>(null);
|
|
47
49
|
const [canScrollLeft, setCanScrollLeft] = useState(false);
|
|
@@ -73,8 +75,16 @@ export function ScrollSlider({
|
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
+
const merged = [...currentFirst, ...otherNodes];
|
|
79
|
+
return showCurrentAppEntriesOnly ? currentFirst : merged;
|
|
80
|
+
}, [
|
|
81
|
+
appDetails,
|
|
82
|
+
currentAppId,
|
|
83
|
+
showCurrentAppEntriesOnly,
|
|
84
|
+
Object.keys(appDetails)
|
|
85
|
+
.map((id) => (appDetails[id]?.entryList?.length ?? 0))
|
|
86
|
+
.join(','),
|
|
87
|
+
]);
|
|
78
88
|
|
|
79
89
|
// Filtered tree for the active group popover
|
|
80
90
|
const filteredGroupTree = useMemo(() => {
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { memo, useEffect, useRef, useState } from 'react';
|
|
2
|
-
import { FieldType,
|
|
2
|
+
import { type FieldType, IField, type IFieldOption as Option } from '@baishuyun/types';
|
|
3
3
|
import { FieldTypeNameMap } from '../const/ui';
|
|
4
|
-
import { ToolUIPart } from 'ai';
|
|
5
|
-
import { FieldsTools, Option } from '@baishuyun/agents';
|
|
6
4
|
import LineChecker from './line-checker';
|
|
7
5
|
import { OptionItem } from './option-item';
|
|
8
6
|
import { FieldIcon } from './field-icon';
|
|
9
7
|
|
|
10
|
-
type Field =
|
|
8
|
+
type Field = IField;
|
|
11
9
|
|
|
12
10
|
export interface FieldCheckerProps {
|
|
13
|
-
field:
|
|
11
|
+
field: IField;
|
|
14
12
|
isSubField?: boolean;
|
|
15
13
|
disabled?: boolean;
|
|
16
14
|
icon?: React.ReactNode;
|
|
@@ -95,7 +93,7 @@ export const FieldChecker = memo(
|
|
|
95
93
|
|
|
96
94
|
return next;
|
|
97
95
|
});
|
|
98
|
-
onChange?.(subChecked, subField, field.widget
|
|
96
|
+
onChange?.(subChecked, subField, field.widget?.widgetName, index);
|
|
99
97
|
};
|
|
100
98
|
// --- end subform state management ---
|
|
101
99
|
|
|
@@ -160,7 +158,7 @@ export const FieldChecker = memo(
|
|
|
160
158
|
disabled={disabled}
|
|
161
159
|
checked={subCheckedMap[index]}
|
|
162
160
|
field={subField}
|
|
163
|
-
icon={<FieldIcon type={subField.widget?.type} />}
|
|
161
|
+
icon={<FieldIcon type={subField.widget?.type!} />}
|
|
164
162
|
onChange={(subChecked) => {
|
|
165
163
|
handleSubFieldChange(subChecked, subField, index);
|
|
166
164
|
}}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { memo, useEffect } from 'react';
|
|
2
|
-
import { FieldType,
|
|
2
|
+
import { FieldType, IField } from '@baishuyun/types';
|
|
3
3
|
import { FieldTypeNameMap } from '../const/ui';
|
|
4
|
-
import { ToolUIPart } from 'ai';
|
|
5
|
-
import { FieldsTools } from '@baishuyun/agents';
|
|
6
4
|
import { isSubformFieldEqual, toHumanReadable } from '../lib/utils';
|
|
7
5
|
import { SubformFieldsValueChecker } from './subform-fields-value-checker';
|
|
8
6
|
import LineChecker from './line-checker';
|
|
9
7
|
|
|
10
|
-
type Field =
|
|
8
|
+
type Field = IField;
|
|
11
9
|
|
|
12
10
|
export interface FieldValueCheckerProps {
|
|
13
|
-
field:
|
|
11
|
+
field: IField;
|
|
14
12
|
isSubField?: boolean;
|
|
15
13
|
disabled?: boolean;
|
|
16
14
|
readonly?: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FC, useCallback, useRef } from 'react';
|
|
1
|
+
import { FC, useCallback, useEffect, useRef } from 'react';
|
|
2
2
|
import { useResizableWidth } from '../hooks/use-resizable-width';
|
|
3
3
|
import { useColumnAppear } from '../hooks/use-column-appear';
|
|
4
4
|
import classNames from 'classnames';
|
|
@@ -25,6 +25,9 @@ export interface IOfficeContainerProps {
|
|
|
25
25
|
|
|
26
26
|
children?: React.ReactNode;
|
|
27
27
|
|
|
28
|
+
onResize?: (leftColWid: number, rightColWid: number) => void;
|
|
29
|
+
|
|
30
|
+
className?: string;
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
|
|
@@ -41,10 +44,15 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
|
|
|
41
44
|
rightColHeaderElement,
|
|
42
45
|
rightColContentElement,
|
|
43
46
|
fullscreenPart = 'none',
|
|
47
|
+
className,
|
|
48
|
+
onResize,
|
|
44
49
|
}) => {
|
|
45
50
|
const isRightResizable = !!rightColWidthRange;
|
|
46
51
|
const activeRange = rightColWidthRange ?? leftColWidthRange;
|
|
47
52
|
|
|
53
|
+
const transitioningRef = useRef(false);
|
|
54
|
+
const mountRef = useRef(true);
|
|
55
|
+
|
|
48
56
|
const { width, handleMouseDown, isDragging } = useResizableWidth({
|
|
49
57
|
range: activeRange,
|
|
50
58
|
initialWidth: activeRange[0],
|
|
@@ -93,6 +101,61 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
|
|
|
93
101
|
return `calc(100% - ${width}px)`;
|
|
94
102
|
}, [hideLeftCol, isLeftFullscreen, isRightFullscreen, isRightResizable, width]);
|
|
95
103
|
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
if (!onResize || transitioningRef.current) return;
|
|
106
|
+
const raf = requestAnimationFrame(() => {
|
|
107
|
+
const leftW = leftColRef.current?.offsetWidth ?? 0;
|
|
108
|
+
const rightW = rightColRef.current?.offsetWidth ?? 0;
|
|
109
|
+
onResize(leftW, rightW);
|
|
110
|
+
});
|
|
111
|
+
return () => cancelAnimationFrame(raf);
|
|
112
|
+
}, [width, fullscreenPart, hideLeftCol, isRightResizable, onResize]);
|
|
113
|
+
|
|
114
|
+
// Set guard when fullscreen/hide triggers CSS transitions. Skip mount.
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
if (mountRef.current) {
|
|
117
|
+
mountRef.current = false;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
transitioningRef.current = true;
|
|
121
|
+
}, [fullscreenPart, hideLeftCol]);
|
|
122
|
+
|
|
123
|
+
// Fire onResize after CSS width transitions complete
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
if (!onResize) return;
|
|
126
|
+
|
|
127
|
+
let resolved = false;
|
|
128
|
+
const onWidthTransitionEnd = (e: TransitionEvent) => {
|
|
129
|
+
if (e.propertyName !== 'width' || resolved) return;
|
|
130
|
+
resolved = true;
|
|
131
|
+
transitioningRef.current = false;
|
|
132
|
+
const leftW = leftColRef.current?.offsetWidth ?? 0;
|
|
133
|
+
const rightW = rightColRef.current?.offsetWidth ?? 0;
|
|
134
|
+
onResize(leftW, rightW);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const leftEl = leftColRef.current;
|
|
138
|
+
const rightEl = rightColRef.current;
|
|
139
|
+
|
|
140
|
+
leftEl?.addEventListener('transitionend', onWidthTransitionEnd);
|
|
141
|
+
rightEl?.addEventListener('transitionend', onWidthTransitionEnd);
|
|
142
|
+
|
|
143
|
+
const fallback = setTimeout(() => {
|
|
144
|
+
if (resolved) return;
|
|
145
|
+
resolved = true;
|
|
146
|
+
transitioningRef.current = false;
|
|
147
|
+
const leftW = leftColRef.current?.offsetWidth ?? 0;
|
|
148
|
+
const rightW = rightColRef.current?.offsetWidth ?? 0;
|
|
149
|
+
onResize(leftW, rightW);
|
|
150
|
+
}, 500);
|
|
151
|
+
|
|
152
|
+
return () => {
|
|
153
|
+
leftEl?.removeEventListener('transitionend', onWidthTransitionEnd);
|
|
154
|
+
rightEl?.removeEventListener('transitionend', onWidthTransitionEnd);
|
|
155
|
+
clearTimeout(fallback);
|
|
156
|
+
};
|
|
157
|
+
}, [fullscreenPart, hideLeftCol, onResize]);
|
|
158
|
+
|
|
96
159
|
const borderColorCls = 'border-[#0265fc]';
|
|
97
160
|
|
|
98
161
|
// 全屏时补全 shrink-0,确保 width: 100% 或 width: 0 不会被 flex 容器挤压
|
|
@@ -112,7 +175,7 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
|
|
|
112
175
|
const contentStyle: React.CSSProperties = { /*scrollbarGutter: 'stable' */};
|
|
113
176
|
|
|
114
177
|
return (
|
|
115
|
-
<div className="relative h-full w-full flex overflow-hidden
|
|
178
|
+
<div className={classNames("relative h-full w-full flex overflow-hidden", className)}>
|
|
116
179
|
{/* fullscreen overlay */}
|
|
117
180
|
{children && (
|
|
118
181
|
<div>
|
|
@@ -133,7 +196,7 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
|
|
|
133
196
|
<div
|
|
134
197
|
ref={leftColInnerRef}
|
|
135
198
|
className="shrink-0 w-full overflow-hidden"
|
|
136
|
-
style={{ height: headerHeight }}
|
|
199
|
+
style={{ height: headerHeight, background: '#fff' }}
|
|
137
200
|
>
|
|
138
201
|
{leftColHeaderElement}
|
|
139
202
|
</div>
|
|
@@ -164,7 +227,7 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
|
|
|
164
227
|
<div
|
|
165
228
|
ref={rightColInnerRef}
|
|
166
229
|
className="shrink-0 w-full"
|
|
167
|
-
style={{ height: headerHeight }}
|
|
230
|
+
style={{ height: headerHeight, background: "#fff" }}
|
|
168
231
|
>
|
|
169
232
|
{rightColHeaderElement}
|
|
170
233
|
</div>
|