@qoretechnologies/reqraft 0.10.54 → 0.10.55-pr.115.g37abdfc
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/.claude/CLAUDE.md +25 -0
- package/.tasks/INDEX.md +1 -0
- package/.tasks/STORY_NETWORK_ISOLATION.md +98 -0
- package/README.md +1 -1
- package/design/FORM_ENGINE_COMPACT.md +34 -0
- package/design/FORM_ENGINE_EXPRESSIONS.md +110 -0
- package/design/FORM_ENGINE_FIELD_MIGRATION.md +155 -1
- package/design/IDE_INTEGRATION.md +13 -0
- package/design/RENDER_EXPRESSION_TRANSPORT.md +76 -10
- package/design/SELECT_DIALOG_FLOOR.md +86 -0
- package/design/SMART_EDITOR_UX.md +21 -0
- package/design/UNAVAILABLE_ALLOWED_VALUES.md +226 -0
- package/dist/components/composer/Composer.d.ts +8 -3
- package/dist/components/composer/Composer.d.ts.map +1 -1
- package/dist/components/composer/Composer.js.map +1 -1
- package/dist/components/dpqlEditor/DpqlEditor.d.ts.map +1 -1
- package/dist/components/dpqlEditor/DpqlEditor.js +3 -3
- package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts +6 -0
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.js +21 -2
- package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlProbe.d.ts +37 -0
- package/dist/components/dpqlEditor/dpqlProbe.d.ts.map +1 -0
- package/dist/components/dpqlEditor/dpqlProbe.js +203 -0
- package/dist/components/dpqlEditor/dpqlProbe.js.map +1 -0
- package/dist/components/dpqlEditor/dpqlTags.d.ts +8 -0
- package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlTags.js +5 -1
- package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
- package/dist/components/dpqlEditor/index.d.ts +4 -0
- package/dist/components/dpqlEditor/index.d.ts.map +1 -1
- package/dist/components/dpqlEditor/index.js +5 -1
- package/dist/components/dpqlEditor/index.js.map +1 -1
- package/dist/components/dpqlEditor/types.d.ts +42 -2
- package/dist/components/dpqlEditor/types.d.ts.map +1 -1
- package/dist/components/dpqlEditor/types.js +0 -4
- package/dist/components/dpqlEditor/types.js.map +1 -1
- package/dist/components/dpqlEditor/useDpqlProbe.d.ts +4 -0
- package/dist/components/dpqlEditor/useDpqlProbe.d.ts.map +1 -0
- package/dist/components/dpqlEditor/useDpqlProbe.js +29 -0
- package/dist/components/dpqlEditor/useDpqlProbe.js.map +1 -0
- package/dist/components/dpqlEditor/useDpqlSession.d.ts +5 -2
- package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
- package/dist/components/dpqlEditor/useDpqlSession.js +8 -2
- package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
- package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
- package/dist/components/form/engine/CompactRow.js +414 -128
- package/dist/components/form/engine/CompactRow.js.map +1 -1
- package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
- package/dist/components/form/engine/CompactToolbar.js +5 -2
- package/dist/components/form/engine/CompactToolbar.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +272 -19
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +666 -161
- package/dist/components/form/engine/FormEngine.js.map +1 -1
- package/dist/components/form/engine/FormFieldsSkeleton.d.ts +48 -0
- package/dist/components/form/engine/FormFieldsSkeleton.d.ts.map +1 -0
- package/dist/components/form/engine/FormFieldsSkeleton.js +41 -0
- package/dist/components/form/engine/FormFieldsSkeleton.js.map +1 -0
- package/dist/components/form/engine/OptionFieldMessages.d.ts +108 -2
- package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
- package/dist/components/form/engine/OptionFieldMessages.js +203 -13
- package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.js +68 -5
- package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
- package/dist/components/form/engine/compactRowContext.d.ts +15 -1
- package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowContext.js.map +1 -1
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +55 -29
- package/dist/components/form/engine/compactRowStyles.js.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
- package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
- package/dist/components/form/engine/optionActions.d.ts +37 -1
- package/dist/components/form/engine/optionActions.d.ts.map +1 -1
- package/dist/components/form/engine/optionActions.js +71 -1
- package/dist/components/form/engine/optionActions.js.map +1 -1
- package/dist/components/form/engine/optionsContext.d.ts +22 -0
- package/dist/components/form/engine/optionsContext.d.ts.map +1 -0
- package/dist/components/form/engine/optionsContext.js +20 -0
- package/dist/components/form/engine/optionsContext.js.map +1 -0
- package/dist/components/form/engine/readFirst.d.ts +42 -1
- package/dist/components/form/engine/readFirst.d.ts.map +1 -1
- package/dist/components/form/engine/readFirst.js +76 -8
- package/dist/components/form/engine/readFirst.js.map +1 -1
- package/dist/components/form/engine/rendererTypes.d.ts +42 -3
- package/dist/components/form/engine/rendererTypes.d.ts.map +1 -1
- package/dist/components/form/engine/rendererTypes.js +3 -1
- package/dist/components/form/engine/rendererTypes.js.map +1 -1
- package/dist/components/form/engine/rowFocus.d.ts +30 -0
- package/dist/components/form/engine/rowFocus.d.ts.map +1 -0
- package/dist/components/form/engine/rowFocus.js +93 -0
- package/dist/components/form/engine/rowFocus.js.map +1 -0
- package/dist/components/form/engine/rowMenuContext.d.ts +78 -0
- package/dist/components/form/engine/rowMenuContext.d.ts.map +1 -0
- package/dist/components/form/engine/rowMenuContext.js +103 -0
- package/dist/components/form/engine/rowMenuContext.js.map +1 -0
- package/dist/components/form/engine/rowOpenPicker.d.ts +27 -0
- package/dist/components/form/engine/rowOpenPicker.d.ts.map +1 -0
- package/dist/components/form/engine/rowOpenPicker.js +30 -0
- package/dist/components/form/engine/rowOpenPicker.js.map +1 -0
- package/dist/components/form/engine/typeChoices.d.ts +42 -0
- package/dist/components/form/engine/typeChoices.d.ts.map +1 -0
- package/dist/components/form/engine/typeChoices.js +33 -0
- package/dist/components/form/engine/typeChoices.js.map +1 -0
- package/dist/components/form/expressions/DpqlRendering.d.ts +26 -0
- package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -0
- package/dist/components/form/expressions/DpqlRendering.js +53 -0
- package/dist/components/form/expressions/DpqlRendering.js.map +1 -0
- package/dist/components/form/expressions/ExpressionField.d.ts +7 -1
- package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
- package/dist/components/form/expressions/ExpressionField.js +203 -45
- package/dist/components/form/expressions/ExpressionField.js.map +1 -1
- package/dist/components/form/expressions/argumentPresence.d.ts +84 -0
- package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -0
- package/dist/components/form/expressions/argumentPresence.js +217 -0
- package/dist/components/form/expressions/argumentPresence.js.map +1 -0
- package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/argumentLabel.js +9 -4
- package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
- package/dist/components/form/expressions/builder/index.d.ts +15 -2
- package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/index.js +21 -65
- package/dist/components/form/expressions/builder/index.js.map +1 -1
- package/dist/components/form/expressions/builder/renderTemplate.d.ts +4 -1
- package/dist/components/form/expressions/builder/renderTemplate.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/renderTemplate.js +10 -67
- package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
- package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
- package/dist/components/form/expressions/mockExpressions.js +8 -4
- package/dist/components/form/expressions/mockExpressions.js.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.d.ts +1 -1
- package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.js +95 -19
- package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
- package/dist/components/form/expressions/types.d.ts +7 -0
- package/dist/components/form/expressions/types.d.ts.map +1 -1
- package/dist/components/form/expressions/useExpressions.d.ts.map +1 -1
- package/dist/components/form/expressions/useExpressions.js +5 -2
- package/dist/components/form/expressions/useExpressions.js.map +1 -1
- package/dist/components/form/expressions/useRenderExpression.d.ts +7 -16
- package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
- package/dist/components/form/expressions/useRenderExpression.js +50 -126
- package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
- package/dist/components/form/fields/Field.d.ts +18 -0
- package/dist/components/form/fields/Field.d.ts.map +1 -1
- package/dist/components/form/fields/Field.js +54 -8
- package/dist/components/form/fields/Field.js.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +11 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.js +52 -8
- package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts +7 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.js +91 -28
- package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
- package/dist/components/form/fields/date/Date.d.ts +1 -1
- package/dist/components/form/fields/date/Date.d.ts.map +1 -1
- package/dist/components/form/fields/date/Date.js +16 -2
- package/dist/components/form/fields/date/Date.js.map +1 -1
- package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
- package/dist/components/form/fields/long-string/LongString.js +14 -2
- package/dist/components/form/fields/long-string/LongString.js.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js +50 -4
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
- package/dist/components/form/fields/rich-text/RichText.d.ts +47 -2
- package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
- package/dist/components/form/fields/rich-text/RichText.js +153 -12
- package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
- package/dist/components/form/fields/select/Select.d.ts.map +1 -1
- package/dist/components/form/fields/select/Select.js +120 -20
- package/dist/components/form/fields/select/Select.js.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.d.ts +166 -9
- package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.js +200 -7
- package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +2 -1
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +3 -2
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
- package/dist/components/form/fields/template/TemplateField.d.ts +34 -2
- package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateField.js +606 -58
- package/dist/components/form/fields/template/TemplateField.js.map +1 -1
- package/dist/components/form/fields/template/TemplateText.d.ts +36 -0
- package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -0
- package/dist/components/form/fields/template/TemplateText.js +80 -0
- package/dist/components/form/fields/template/TemplateText.js.map +1 -0
- package/dist/components/form/index.d.ts +2 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +4 -0
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
- package/dist/components/smartEditor/SmartEditor.js +29 -8
- package/dist/components/smartEditor/SmartEditor.js.map +1 -1
- package/dist/components/smartEditor/useLspSession.d.ts +5 -1
- package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspSession.js +16 -2
- package/dist/components/smartEditor/useLspSession.js.map +1 -1
- package/dist/components/supportTicket/TicketReplyBox.d.ts +8 -4
- package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -1
- package/dist/components/supportTicket/TicketReplyBox.js.map +1 -1
- package/dist/helpers/common.d.ts.map +1 -1
- package/dist/helpers/common.js +7 -3
- package/dist/helpers/common.js.map +1 -1
- package/dist/helpers/dpqlDetection.d.ts +58 -0
- package/dist/helpers/dpqlDetection.d.ts.map +1 -0
- package/dist/helpers/dpqlDetection.js +164 -0
- package/dist/helpers/dpqlDetection.js.map +1 -0
- package/dist/helpers/optionUiTypes.d.ts +31 -3
- package/dist/helpers/optionUiTypes.d.ts.map +1 -1
- package/dist/helpers/optionUiTypes.js +36 -1
- package/dist/helpers/optionUiTypes.js.map +1 -1
- package/dist/helpers/options.d.ts +57 -0
- package/dist/helpers/options.d.ts.map +1 -1
- package/dist/helpers/options.js +97 -1
- package/dist/helpers/options.js.map +1 -1
- package/dist/helpers/templateItems.d.ts +47 -0
- package/dist/helpers/templateItems.d.ts.map +1 -0
- package/dist/helpers/templateItems.js +88 -0
- package/dist/helpers/templateItems.js.map +1 -0
- package/dist/helpers/templateText.d.ts +80 -0
- package/dist/helpers/templateText.d.ts.map +1 -0
- package/dist/helpers/templateText.js +291 -0
- package/dist/helpers/templateText.js.map +1 -0
- package/dist/helpers/templates.d.ts +30 -12
- package/dist/helpers/templates.d.ts.map +1 -1
- package/dist/helpers/templates.js +91 -33
- package/dist/helpers/templates.js.map +1 -1
- package/dist/helpers/validations.d.ts +17 -8
- package/dist/helpers/validations.d.ts.map +1 -1
- package/dist/helpers/validations.js +117 -22
- package/dist/helpers/validations.js.map +1 -1
- package/dist/hooks/useArgSchema.d.ts +2 -1
- package/dist/hooks/useArgSchema.d.ts.map +1 -1
- package/dist/hooks/useFetch/useFetch.d.ts +3 -1
- package/dist/hooks/useFetch/useFetch.d.ts.map +1 -1
- package/dist/hooks/useFetch/useFetch.js +47 -9
- package/dist/hooks/useFetch/useFetch.js.map +1 -1
- package/dist/hooks/useTemplates.d.ts +20 -0
- package/dist/hooks/useTemplates.d.ts.map +1 -1
- package/dist/hooks/useTemplates.js +34 -2
- package/dist/hooks/useTemplates.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/fetch.d.ts +151 -1
- package/dist/utils/fetch.d.ts.map +1 -1
- package/dist/utils/fetch.js +256 -44
- package/dist/utils/fetch.js.map +1 -1
- package/dist/utils/lspClient.d.ts +6 -0
- package/dist/utils/lspClient.d.ts.map +1 -1
- package/dist/utils/lspClient.js +62 -11
- package/dist/utils/lspClient.js.map +1 -1
- package/dist/utils/websocket.d.ts +6 -0
- package/dist/utils/websocket.d.ts.map +1 -1
- package/dist/utils/websocket.js +15 -7
- package/dist/utils/websocket.js.map +1 -1
- package/package.json +8 -4
- package/src/components/composer/Composer.tsx +7 -2
- package/src/components/dpqlEditor/DpqlEditor.stories.tsx +3 -119
- package/src/components/dpqlEditor/DpqlEditor.tsx +5 -2
- package/src/components/dpqlEditor/dpqlHelpers.ts +20 -1
- package/src/components/dpqlEditor/dpqlProbe.ts +165 -0
- package/src/components/dpqlEditor/dpqlTags.ts +13 -0
- package/src/components/dpqlEditor/index.ts +4 -0
- package/src/components/dpqlEditor/types.ts +38 -2
- package/src/components/dpqlEditor/useDpqlProbe.ts +33 -0
- package/src/components/dpqlEditor/useDpqlSession.ts +20 -4
- package/src/components/form/engine/CompactRow.tsx +487 -160
- package/src/components/form/engine/CompactToolbar.tsx +10 -3
- package/src/components/form/engine/FormEngine.stories.tsx +1294 -161
- package/src/components/form/engine/FormEngine.tsx +916 -213
- package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +331 -0
- package/src/components/form/engine/FormFieldsSkeleton.tsx +77 -0
- package/src/components/form/engine/OptionFieldMessages.tsx +300 -14
- package/src/components/form/engine/_structuredData/SchemaDataView.tsx +94 -3
- package/src/components/form/engine/compactRowContext.ts +15 -6
- package/src/components/form/engine/compactRowStyles.ts +56 -2
- package/src/components/form/engine/compactToolbarContext.ts +1 -1
- package/src/components/form/engine/optionActions.ts +89 -1
- package/src/components/form/engine/optionsContext.ts +24 -0
- package/src/components/form/engine/readFirst.ts +88 -8
- package/src/components/form/engine/rendererTypes.ts +48 -4
- package/src/components/form/engine/rowFocus.ts +101 -0
- package/src/components/form/engine/rowMenuContext.ts +159 -0
- package/src/components/form/engine/rowOpenPicker.ts +27 -0
- package/src/components/form/engine/typeChoices.ts +63 -0
- package/src/components/form/expressions/DpqlRendering.tsx +85 -0
- package/src/components/form/expressions/ExpressionField.stories.tsx +826 -48
- package/src/components/form/expressions/ExpressionField.tsx +269 -55
- package/src/components/form/expressions/argumentPresence.ts +213 -0
- package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +38 -21
- package/src/components/form/expressions/builder/argumentLabel.tsx +10 -4
- package/src/components/form/expressions/builder/index.tsx +39 -81
- package/src/components/form/expressions/builder/renderTemplate.tsx +23 -56
- package/src/components/form/expressions/dpqlMockLanguage.ts +565 -0
- package/src/components/form/expressions/dpqlMockLsp.ts +109 -83
- package/src/components/form/expressions/mockExpressions.ts +8 -4
- package/src/components/form/expressions/renderExpressionToText.ts +112 -22
- package/src/components/form/expressions/types.ts +7 -0
- package/src/components/form/expressions/useExpressions.ts +5 -1
- package/src/components/form/expressions/useRenderExpression.ts +43 -127
- package/src/components/form/fields/Field.tsx +99 -20
- package/src/components/form/fields/allowed-values/AllowedValues.tsx +106 -44
- package/src/components/form/fields/auto/AutoFormField.stories.tsx +85 -18
- package/src/components/form/fields/auto/AutoFormField.tsx +97 -21
- package/src/components/form/fields/date/Date.tsx +17 -1
- package/src/components/form/fields/long-string/LongString.tsx +15 -3
- package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +65 -6
- package/src/components/form/fields/rich-text/RichText.tsx +248 -30
- package/src/components/form/fields/select/Select.stories.tsx +392 -0
- package/src/components/form/fields/select/Select.tsx +164 -27
- package/src/components/form/fields/select/SelectCollection.tsx +350 -6
- package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +4 -2
- package/src/components/form/fields/template/TemplateField.stories.tsx +93 -14
- package/src/components/form/fields/template/TemplateField.tsx +825 -131
- package/src/components/form/fields/template/TemplateText.tsx +115 -0
- package/src/components/form/index.tsx +4 -0
- package/src/components/log/Log.stories.tsx +2 -1
- package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +3 -3
- package/src/components/smartEditor/SmartEditor.tsx +41 -9
- package/src/components/smartEditor/__fixtures__/mockLspServer.ts +52 -3
- package/src/components/smartEditor/useLspSession.ts +21 -3
- package/src/components/supportTicket/TicketReplyBox.tsx +8 -4
- package/src/components/ticketThread/TicketThread.stories.tsx +1 -0
- package/src/helpers/common.ts +7 -3
- package/src/helpers/dpqlDetection.ts +209 -0
- package/src/helpers/optionUiTypes.ts +38 -0
- package/src/helpers/options.ts +96 -0
- package/src/helpers/templateItems.ts +81 -0
- package/src/helpers/templateText.ts +350 -0
- package/src/helpers/templates.ts +94 -41
- package/src/helpers/validations.ts +138 -39
- package/src/hooks/useFetch/useFetch.stories.tsx +6 -5
- package/src/hooks/useFetch/useFetch.tsx +53 -7
- package/src/hooks/useStorage/useStorage.stories.tsx +2 -1
- package/src/hooks/useTemplates.ts +41 -0
- package/src/hooks/useWebSocket/useWebsocket.stories.tsx +2 -1
- package/src/index.tsx +14 -1
- package/src/stores/currentUser/currentUser.stories.tsx +2 -1
- package/src/stories/storyNetwork.ts +92 -0
- package/src/utils/fetch.ts +311 -21
- package/src/utils/lspClient.ts +68 -11
- package/src/utils/websocket.ts +20 -9
- package/dist/components/form/engine/__fixtures__/basicFormOptions.d.ts +0 -73
- package/dist/components/form/engine/__fixtures__/basicFormOptions.d.ts.map +0 -1
- package/dist/components/form/engine/__fixtures__/basicFormOptions.js +0 -317
- package/dist/components/form/engine/__fixtures__/basicFormOptions.js.map +0 -1
- package/dist/components/form/engine/__fixtures__/fieldChromeOptions.d.ts +0 -41
- package/dist/components/form/engine/__fixtures__/fieldChromeOptions.d.ts.map +0 -1
- package/dist/components/form/engine/__fixtures__/fieldChromeOptions.js +0 -45
- package/dist/components/form/engine/__fixtures__/fieldChromeOptions.js.map +0 -1
- package/dist/components/form/expressions/dpqlMockLsp.d.ts +0 -3
- package/dist/components/form/expressions/dpqlMockLsp.d.ts.map +0 -1
- package/dist/components/form/expressions/dpqlMockLsp.js +0 -91
- package/dist/components/form/expressions/dpqlMockLsp.js.map +0 -1
- package/dist/components/form/fields/template/__fixtures__/longExampleValue.d.ts +0 -2
- package/dist/components/form/fields/template/__fixtures__/longExampleValue.d.ts.map +0 -1
- package/dist/components/form/fields/template/__fixtures__/longExampleValue.js +0 -9
- package/dist/components/form/fields/template/__fixtures__/longExampleValue.js.map +0 -1
- package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts +0 -55
- package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts.map +0 -1
- package/dist/components/smartEditor/__fixtures__/mockLspServer.js +0 -126
- package/dist/components/smartEditor/__fixtures__/mockLspServer.js.map +0 -1
- package/dist/stories/Data/fileFieldArgSchema.json +0 -86
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// Copyright 2026 Qore Technologies, s.r.o.
|
|
2
|
+
import { IReqoreDropdownItem } from '@qoretechnologies/reqore/dist/components/Dropdown/list';
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
useCallback,
|
|
6
|
+
useContext,
|
|
7
|
+
useEffect,
|
|
8
|
+
useId,
|
|
9
|
+
useMemo,
|
|
10
|
+
useRef,
|
|
11
|
+
useState,
|
|
12
|
+
} from 'react';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* SEAM (reqraft): an editor publishes its own actions into the row's ⋮ menu.
|
|
16
|
+
*
|
|
17
|
+
* A row already renders one overflow menu — Edit fullscreen, Remove field, and
|
|
18
|
+
* any `optionActions` the host injected — and the comment on it has always said
|
|
19
|
+
* why: *"this row already has a menu, so they reuse it rather than adding a
|
|
20
|
+
* second one beside it."* An EDITOR could not reach that menu, so an editor
|
|
21
|
+
* with affordances of its own had no choice but to draw a second ⋮ inside the
|
|
22
|
+
* value cell. The IDE's template field does exactly that, and the two menus
|
|
23
|
+
* ended up side by side on one control, at slightly different widths.
|
|
24
|
+
*
|
|
25
|
+
* `optionActions` does not solve it: that seam is host configuration, resolved
|
|
26
|
+
* from the option's name and schema before the editor exists, so it cannot know
|
|
27
|
+
* what the editor can offer *now* — whether its templates have loaded, whether
|
|
28
|
+
* the value is already an expression, which custom items the field was given.
|
|
29
|
+
*
|
|
30
|
+
* ## Why registration is keyed, and by whom
|
|
31
|
+
*
|
|
32
|
+
* Menu items carry `onClick` handlers, so they are a new array on every render
|
|
33
|
+
* and cannot be compared by value. An editor therefore publishes a `key`
|
|
34
|
+
* alongside them: a primitive describing WHICH items it is currently offering
|
|
35
|
+
* (`'expression,template'`). The row re-renders only when a publisher's key
|
|
36
|
+
* changes, so a re-rendering editor cannot drive the row into a state loop.
|
|
37
|
+
*
|
|
38
|
+
* Each registration also belongs to ONE publisher. A single shared slot let
|
|
39
|
+
* two publishers in the same row — an expression builder's operands — overwrite
|
|
40
|
+
* each other's key on every render, which re-rendered the row and both of them,
|
|
41
|
+
* which published again: a synchronous render loop that froze the page. And a
|
|
42
|
+
* slot that outlived its editor kept that editor's handlers after it unmounted,
|
|
43
|
+
* so a row closed and reopened offered items that did nothing. Registrations
|
|
44
|
+
* are therefore per publisher, withdrawn on unmount, and a click always reaches
|
|
45
|
+
* the handler from the publisher's latest render.
|
|
46
|
+
*
|
|
47
|
+
* Publish with `useRowMenuPublisher`; provide with `useRowMenuRegistry`.
|
|
48
|
+
*/
|
|
49
|
+
export interface IRowMenuRegistration {
|
|
50
|
+
/**
|
|
51
|
+
* Publish a publisher's menu items into the containing row's ⋮.
|
|
52
|
+
*
|
|
53
|
+
* @param publisherId identifies the publishing editor (one per mounted editor)
|
|
54
|
+
* @param key a primitive describing which items are being offered; the row
|
|
55
|
+
* re-renders only when it changes
|
|
56
|
+
* @param items the items to merge, or an empty array to contribute none
|
|
57
|
+
*/
|
|
58
|
+
registerRowMenuItems: (publisherId: string, key: string, items: IReqoreDropdownItem[]) => void;
|
|
59
|
+
/** Withdraw a publisher's items — when it unmounts or leaves the row. */
|
|
60
|
+
unregisterRowMenuItems: (publisherId: string) => void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Absent outside a compact row — the classic (non-compact) render path has no
|
|
65
|
+
* row menu to merge into, and an editor there keeps drawing its own control.
|
|
66
|
+
*/
|
|
67
|
+
export const RowMenuContext = createContext<IRowMenuRegistration | undefined>(undefined);
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The row-menu channel for the row this editor is inside, or `undefined` when
|
|
71
|
+
* there is no row menu to publish into.
|
|
72
|
+
*
|
|
73
|
+
* An editor that finds it should render no menu of its own; one that does not
|
|
74
|
+
* must keep rendering its own, or its actions become unreachable.
|
|
75
|
+
*/
|
|
76
|
+
export const useRowMenu = (): IRowMenuRegistration | undefined => useContext(RowMenuContext);
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Publish `items` into `rowMenu` for as long as the calling editor is mounted.
|
|
80
|
+
* `rowMenu` is passed rather than read here so an editor can claim the channel
|
|
81
|
+
* and hide it from what it renders (see `TemplateField`).
|
|
82
|
+
*/
|
|
83
|
+
export const useRowMenuPublisher = (
|
|
84
|
+
rowMenu: IRowMenuRegistration | undefined,
|
|
85
|
+
key: string,
|
|
86
|
+
items: IReqoreDropdownItem[]
|
|
87
|
+
): void => {
|
|
88
|
+
const publisherId = useId();
|
|
89
|
+
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
rowMenu?.registerRowMenuItems(publisherId, key, items);
|
|
92
|
+
}, [rowMenu, publisherId, key, items]);
|
|
93
|
+
|
|
94
|
+
useEffect(() => () => rowMenu?.unregisterRowMenuItems(publisherId), [rowMenu, publisherId]);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The row side of the channel: the registration to provide, and the items the
|
|
99
|
+
* row's ⋮ should list.
|
|
100
|
+
*/
|
|
101
|
+
export const useRowMenuRegistry = (): {
|
|
102
|
+
rowMenu: IRowMenuRegistration;
|
|
103
|
+
items: IReqoreDropdownItem[];
|
|
104
|
+
} => {
|
|
105
|
+
// Which publishers are offering which item SET — the only state, so only a
|
|
106
|
+
// change of set re-renders the row.
|
|
107
|
+
const [keys, setKeys] = useState<Record<string, string>>({});
|
|
108
|
+
// Each publisher's items from its latest render, read at click time.
|
|
109
|
+
const latest = useRef<Record<string, IReqoreDropdownItem[]>>({});
|
|
110
|
+
|
|
111
|
+
const registerRowMenuItems = useCallback(
|
|
112
|
+
(publisherId: string, key: string, items: IReqoreDropdownItem[]) => {
|
|
113
|
+
latest.current[publisherId] = items;
|
|
114
|
+
setKeys((previous) =>
|
|
115
|
+
previous[publisherId] === key ? previous : { ...previous, [publisherId]: key }
|
|
116
|
+
);
|
|
117
|
+
},
|
|
118
|
+
[]
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
const unregisterRowMenuItems = useCallback((publisherId: string) => {
|
|
122
|
+
delete latest.current[publisherId];
|
|
123
|
+
setKeys((previous) => {
|
|
124
|
+
if (!(publisherId in previous)) {
|
|
125
|
+
return previous;
|
|
126
|
+
}
|
|
127
|
+
const next = { ...previous };
|
|
128
|
+
delete next[publisherId];
|
|
129
|
+
return next;
|
|
130
|
+
});
|
|
131
|
+
}, []);
|
|
132
|
+
|
|
133
|
+
const rowMenu = useMemo(
|
|
134
|
+
() => ({ registerRowMenuItems, unregisterRowMenuItems }),
|
|
135
|
+
[registerRowMenuItems, unregisterRowMenuItems]
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const items = useMemo(
|
|
139
|
+
() =>
|
|
140
|
+
Object.keys(keys).flatMap((publisherId) =>
|
|
141
|
+
(latest.current[publisherId] ?? []).map((item, index) =>
|
|
142
|
+
item.onClick
|
|
143
|
+
? {
|
|
144
|
+
...item,
|
|
145
|
+
// Same key, same item set, so the index still names this item;
|
|
146
|
+
// the handler is whatever the publisher rendered last.
|
|
147
|
+
onClick: ((...args: unknown[]) =>
|
|
148
|
+
(latest.current[publisherId]?.[index]?.onClick as
|
|
149
|
+
| ((...clickArgs: unknown[]) => unknown)
|
|
150
|
+
| undefined)?.(...args)) as IReqoreDropdownItem['onClick'],
|
|
151
|
+
}
|
|
152
|
+
: item
|
|
153
|
+
)
|
|
154
|
+
),
|
|
155
|
+
[keys]
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
return { rowMenu, items };
|
|
159
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* "The row you are in has just been opened, and the control you are is the one
|
|
5
|
+
* it offers — so show the choices."
|
|
6
|
+
*
|
|
7
|
+
* A compact row is read-first: collapsed, it prints the value; clicked, it
|
|
8
|
+
* mounts the editor. For a PICKER the editor is a closed trigger printing the
|
|
9
|
+
* same value the read row had just printed, so the row opened and nothing on
|
|
10
|
+
* screen changed — the author had to click a second time to reach the list.
|
|
11
|
+
* Read-first is the collapsed row's job; it must not be the answer twice.
|
|
12
|
+
*
|
|
13
|
+
* The row decides, because only the row knows both things that matter: that the
|
|
14
|
+
* AUTHOR opened it (a row the form opens to show a value must not throw a list
|
|
15
|
+
* over it) and WHICH control it offers (`findRowFocusTarget` — the same scan
|
|
16
|
+
* that hands over the caret). The control obeys, because only the control knows
|
|
17
|
+
* how it opens.
|
|
18
|
+
*
|
|
19
|
+
* A one-shot pulse rather than a standing flag: it is `true` for exactly the
|
|
20
|
+
* commit in which the editor acts on it, and false again afterwards, so an
|
|
21
|
+
* editor that remounts later — a picker whose catalogue reloaded, after the
|
|
22
|
+
* author had closed it — does not reopen itself off a stale instruction.
|
|
23
|
+
*
|
|
24
|
+
* Exported so a host's own editor can obey it too: read it with
|
|
25
|
+
* `useContext(RowOpenPickerContext)` and open on the rising edge.
|
|
26
|
+
*/
|
|
27
|
+
export const RowOpenPickerContext = createContext<boolean>(false);
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Copyright 2026 Qore Technologies, s.r.o.
|
|
2
|
+
/**
|
|
3
|
+
* Which options offer the per-type choices ("Integer", "Text", "Hash", …) in
|
|
4
|
+
* the row's menu.
|
|
5
|
+
*
|
|
6
|
+
* A field that pins no concrete type has to give the author some way to say
|
|
7
|
+
* what kind of value they mean, and the row menu is where that lives — the
|
|
8
|
+
* alternative, a standalone *"Please select data type"* control, replaces a
|
|
9
|
+
* typable field with a pick-only one.
|
|
10
|
+
*
|
|
11
|
+
* The rule was `ui_type === 'any'`, which is one of the three ways a schema
|
|
12
|
+
* says "untyped", so the choices went missing on the other two:
|
|
13
|
+
*
|
|
14
|
+
* - **`type: 'auto'` with no `ui_type` at all.** This is how the server
|
|
15
|
+
* declares an assertion's Expected Value, so that field never offered them.
|
|
16
|
+
* They appeared only inside an expression, where the OPERAND's schema does
|
|
17
|
+
* say `ui_type: 'any'` — so the same option offered them in the Visual view
|
|
18
|
+
* and not in the Text view, which reads as the menu losing items.
|
|
19
|
+
* - **A host's own untyped editor.** The IDE renders Expected Value through
|
|
20
|
+
* `test-reference`, a `ui_type` reqraft knows nothing about; the field is no
|
|
21
|
+
* less untyped for having a custom editor.
|
|
22
|
+
*
|
|
23
|
+
* `ui_type` is asked FIRST and on its own: a schema that names a concrete
|
|
24
|
+
* editor (`ui_type: 'string'`) has pinned the field even if its storage `type`
|
|
25
|
+
* is still `auto`.
|
|
26
|
+
*/
|
|
27
|
+
import type { TQorusFormFieldSchema } from '@qoretechnologies/ts-toolkit';
|
|
28
|
+
import { firstDeclaredType, UNTYPED_OPTION_TYPES } from '../../../helpers/optionUiTypes';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The spellings that mean "no concrete type" wherever they appear.
|
|
32
|
+
*
|
|
33
|
+
* Re-exported from the type vocabulary in `helpers/optionUiTypes`, which is
|
|
34
|
+
* where it now lives so non-component code can ask the same question.
|
|
35
|
+
*/
|
|
36
|
+
export const BuiltInAnyLikeTypes: readonly string[] = UNTYPED_OPTION_TYPES;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Does this option leave its type up to the author?
|
|
40
|
+
*
|
|
41
|
+
* @param option the option's schema entry
|
|
42
|
+
* @param extraUiTypes host `ui_type` names that are untyped editors of their
|
|
43
|
+
* own — see `FormEngine`'s `anyLikeUiTypes`
|
|
44
|
+
*/
|
|
45
|
+
export const offersTypeChoices = (
|
|
46
|
+
option: TQorusFormFieldSchema | undefined,
|
|
47
|
+
extraUiTypes?: string[]
|
|
48
|
+
): boolean => {
|
|
49
|
+
if (!option) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const uiType: string | undefined = option.ui_type;
|
|
54
|
+
|
|
55
|
+
if (uiType) {
|
|
56
|
+
return BuiltInAnyLikeTypes.includes(uiType) || !!extraUiTypes?.includes(uiType);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// No `ui_type`: the storage type is the only thing that can pin the field,
|
|
60
|
+
// read as the field is rendered (`firstDeclaredType`).
|
|
61
|
+
const type = firstDeclaredType(option.type);
|
|
62
|
+
return type !== undefined && BuiltInAnyLikeTypes.includes(type);
|
|
63
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Copyright 2026 Qore Technologies, s.r.o.
|
|
2
|
+
// How a DPQL expression is shown when it is shown but not edited.
|
|
3
|
+
//
|
|
4
|
+
// ONE rendering for every read-only place an expression appears — the Explain
|
|
5
|
+
// panel, the Text view's Preview, the conversion a type-fit message suggests,
|
|
6
|
+
// a collapsed expression row — so they read the same everywhere: monospace,
|
|
7
|
+
// coloured by the language server's semantic tokens (the canonical tokenizer,
|
|
8
|
+
// see `useLspSemanticTokens`), template references as chips. Before, the same
|
|
9
|
+
// expression could be highlighted in one place, plain proportional text in the
|
|
10
|
+
// next and a bare `<code>` in a third, depending only on which component
|
|
11
|
+
// happened to draw it.
|
|
12
|
+
import { ReqoreMessage } from '@qoretechnologies/reqore';
|
|
13
|
+
import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
|
|
14
|
+
import { useAsync } from 'react-use';
|
|
15
|
+
import { DpqlEditor } from '../../dpqlEditor';
|
|
16
|
+
import { FormFieldsSkeleton } from '../engine/FormFieldsSkeleton';
|
|
17
|
+
import { IExpressionValue } from './types';
|
|
18
|
+
import { useRenderExpression } from './useRenderExpression';
|
|
19
|
+
|
|
20
|
+
const noop = (): void => undefined;
|
|
21
|
+
|
|
22
|
+
export interface IDpqlRenderingProps {
|
|
23
|
+
/** DPQL, or a readable rendering of it, to show. */
|
|
24
|
+
text: string;
|
|
25
|
+
/** The surface's template catalogue: a reference in it reads as its name. */
|
|
26
|
+
templates?: IReqoreFormTemplates;
|
|
27
|
+
'data-testid'?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Shows `text` as DPQL: monospace, server-coloured, references as chips. */
|
|
31
|
+
export const DpqlRendering = ({ text, templates, 'data-testid': testId }: IDpqlRenderingProps) => (
|
|
32
|
+
<div className='dpql-rendering' data-testid={testId} style={{ width: '100%', minWidth: 0 }}>
|
|
33
|
+
<DpqlEditor
|
|
34
|
+
value={text}
|
|
35
|
+
onChange={noop}
|
|
36
|
+
readOnly
|
|
37
|
+
// The text is a rendering, not something being written: nothing to
|
|
38
|
+
// diagnose, and a hover would describe tokens of a document nobody edits.
|
|
39
|
+
showDiagnostics={false}
|
|
40
|
+
enableHover={false}
|
|
41
|
+
templateTagsUseIntent
|
|
42
|
+
templates={templates}
|
|
43
|
+
// The text is already known; only its colours wait for the server, so
|
|
44
|
+
// nothing is hidden behind "Connecting to language server…".
|
|
45
|
+
loadingIndicator={null}
|
|
46
|
+
/>
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
export interface IExpressionRenderingProps {
|
|
51
|
+
/** The expression AST to render. */
|
|
52
|
+
expression: IExpressionValue;
|
|
53
|
+
/** The surface's template catalogue: a reference in it reads as its name. */
|
|
54
|
+
templates?: IReqoreFormTemplates;
|
|
55
|
+
'data-testid'?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The server's readable rendering of `expression`, shown through
|
|
60
|
+
* `DpqlRendering`. It waits for the server — in the form's one waiting shape —
|
|
61
|
+
* and says so plainly if the server cannot render, rather than showing an
|
|
62
|
+
* approximation that reads like the real thing.
|
|
63
|
+
*/
|
|
64
|
+
export const ExpressionRendering = ({
|
|
65
|
+
expression,
|
|
66
|
+
templates,
|
|
67
|
+
'data-testid': testId,
|
|
68
|
+
}: IExpressionRenderingProps) => {
|
|
69
|
+
const { renderRich } = useRenderExpression();
|
|
70
|
+
const rendering = useAsync(() => renderRich(expression), [JSON.stringify(expression)]);
|
|
71
|
+
|
|
72
|
+
if (rendering.loading) {
|
|
73
|
+
return <FormFieldsSkeleton rows={1} reason='expression-rendering' />;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!rendering.value) {
|
|
77
|
+
return (
|
|
78
|
+
<ReqoreMessage size='small' intent='muted' flat opaque={false} data-testid={testId}>
|
|
79
|
+
This expression could not be rendered.
|
|
80
|
+
</ReqoreMessage>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return <DpqlRendering text={rendering.value.text} templates={templates} data-testid={testId} />;
|
|
85
|
+
};
|