@qoretechnologies/reqraft 0.10.62 → 0.10.63-pr.142.g0b675cd
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/README.md +21 -1
- package/dist/components/Description/describedControl.d.ts +48 -0
- package/dist/components/Description/describedControl.d.ts.map +1 -0
- package/dist/components/Description/describedControl.js +81 -0
- package/dist/components/Description/describedControl.js.map +1 -0
- package/dist/components/Description/index.d.ts.map +1 -1
- package/dist/components/Description/index.js +3 -2
- package/dist/components/Description/index.js.map +1 -1
- package/dist/components/colorValue/colorValue.d.ts +59 -0
- package/dist/components/colorValue/colorValue.d.ts.map +1 -0
- package/dist/components/colorValue/colorValue.js +245 -0
- package/dist/components/colorValue/colorValue.js.map +1 -0
- package/dist/components/colorValue/index.d.ts +34 -0
- package/dist/components/colorValue/index.d.ts.map +1 -0
- package/dist/components/colorValue/index.js +136 -0
- package/dist/components/colorValue/index.js.map +1 -0
- package/dist/components/colorValue/labels.d.ts +12 -0
- package/dist/components/colorValue/labels.d.ts.map +1 -0
- package/dist/components/colorValue/labels.js +11 -0
- package/dist/components/colorValue/labels.js.map +1 -0
- package/dist/components/composer/Composer.d.ts +1 -1
- package/dist/components/composer/Composer.d.ts.map +1 -1
- package/dist/components/composer/Composer.js +2 -2
- 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 +25 -5
- package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts +10 -1
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.js +30 -13
- package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlTags.d.ts +11 -7
- package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlTags.js +11 -6
- package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
- package/dist/components/dpqlEditor/types.d.ts +47 -8
- package/dist/components/dpqlEditor/types.d.ts.map +1 -1
- package/dist/components/dpqlEditor/useDpqlSession.d.ts +2 -2
- package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
- package/dist/components/dpqlEditor/useDpqlSession.js +16 -7
- 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 +151 -83
- 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 +29 -3
- package/dist/components/form/engine/CompactToolbar.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +34 -1
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +487 -87
- package/dist/components/form/engine/FormEngine.js.map +1 -1
- package/dist/components/form/engine/HiddenFieldsNote.d.ts +28 -0
- package/dist/components/form/engine/HiddenFieldsNote.d.ts.map +1 -0
- package/dist/components/form/engine/HiddenFieldsNote.js +32 -0
- package/dist/components/form/engine/HiddenFieldsNote.js.map +1 -0
- package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
- package/dist/components/form/engine/OptionFieldMessages.js +24 -3
- package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts +2 -2
- package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.js +12 -6
- package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
- package/dist/components/form/engine/compactRowContext.d.ts +19 -0
- 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 +0 -1
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +12 -20
- package/dist/components/form/engine/compactRowStyles.js.map +1 -1
- package/dist/components/form/engine/compactToolbarColors.d.ts +16 -0
- package/dist/components/form/engine/compactToolbarColors.d.ts.map +1 -0
- package/dist/components/form/engine/compactToolbarColors.js +21 -0
- package/dist/components/form/engine/compactToolbarColors.js.map +1 -0
- package/dist/components/form/engine/readFirst.d.ts +24 -8
- package/dist/components/form/engine/readFirst.d.ts.map +1 -1
- package/dist/components/form/engine/readFirst.js +77 -109
- package/dist/components/form/engine/readFirst.js.map +1 -1
- package/dist/components/form/engine/readFirstColors.d.ts +30 -0
- package/dist/components/form/engine/readFirstColors.d.ts.map +1 -0
- package/dist/components/form/engine/readFirstColors.js +51 -0
- package/dist/components/form/engine/readFirstColors.js.map +1 -0
- package/dist/components/form/engine/rowFocus.d.ts +2 -0
- package/dist/components/form/engine/rowFocus.d.ts.map +1 -1
- package/dist/components/form/engine/rowFocus.js +26 -3
- package/dist/components/form/engine/rowFocus.js.map +1 -1
- package/dist/components/form/engine/typeChoices.d.ts +1 -1
- package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -1
- package/dist/components/form/engine/variants/VariantCalmTable.js +2 -1
- package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -1
- package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -1
- package/dist/components/form/engine/variants/VariantCards.js +2 -1
- package/dist/components/form/engine/variants/VariantCards.js.map +1 -1
- package/dist/components/form/engine/variants/VariantFocus.js +1 -1
- package/dist/components/form/engine/variants/VariantFocus.js.map +1 -1
- package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -1
- package/dist/components/form/engine/variants/VariantMinimal.js +2 -1
- package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -1
- package/dist/components/form/engine/variants/variantParts.d.ts +1 -1
- package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -1
- package/dist/components/form/engine/variants/variantParts.js +25 -17
- package/dist/components/form/engine/variants/variantParts.js.map +1 -1
- package/dist/components/form/expressions/DpqlRendering.d.ts +1 -1
- package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -1
- package/dist/components/form/expressions/DpqlRendering.js +3 -3
- package/dist/components/form/expressions/DpqlRendering.js.map +1 -1
- package/dist/components/form/expressions/ExpressionField.d.ts +41 -3
- package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
- package/dist/components/form/expressions/ExpressionField.js +396 -99
- package/dist/components/form/expressions/ExpressionField.js.map +1 -1
- package/dist/components/form/expressions/builder/argumentDetail.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/argumentDetail.js +4 -1
- package/dist/components/form/expressions/builder/argumentDetail.js.map +1 -1
- package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/argumentLabel.js +27 -9
- package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
- package/dist/components/form/expressions/builder/argumentWrapper.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/argumentWrapper.js +4 -2
- package/dist/components/form/expressions/builder/argumentWrapper.js.map +1 -1
- package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js +5 -4
- package/dist/components/form/expressions/builder/confirmMismatchedTypesModal.js.map +1 -1
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts +1 -1
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js +6 -3
- package/dist/components/form/expressions/builder/confirmUnsupportedTypeModal.js.map +1 -1
- package/dist/components/form/expressions/builder/index.d.ts +24 -2
- package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/index.js +121 -77
- package/dist/components/form/expressions/builder/index.js.map +1 -1
- package/dist/components/form/expressions/builder/item.d.ts +6 -2
- package/dist/components/form/expressions/builder/item.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/item.js +19 -5
- package/dist/components/form/expressions/builder/item.js.map +1 -1
- package/dist/components/form/expressions/builder/renderTemplate.js +1 -1
- package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
- package/dist/components/form/expressions/expressionOperands.d.ts +16 -0
- package/dist/components/form/expressions/expressionOperands.d.ts.map +1 -0
- package/dist/components/form/expressions/expressionOperands.js +97 -0
- package/dist/components/form/expressions/expressionOperands.js.map +1 -0
- package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
- package/dist/components/form/expressions/mockExpressions.js +22 -5
- package/dist/components/form/expressions/mockExpressions.js.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.d.ts +2 -0
- package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.js +35 -9
- package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
- package/dist/components/form/expressions/textOfExpression.d.ts +18 -0
- package/dist/components/form/expressions/textOfExpression.d.ts.map +1 -0
- package/dist/components/form/expressions/textOfExpression.js +37 -0
- package/dist/components/form/expressions/textOfExpression.js.map +1 -0
- package/dist/components/form/expressions/useExpressionType.d.ts +26 -0
- package/dist/components/form/expressions/useExpressionType.d.ts.map +1 -0
- package/dist/components/form/expressions/useExpressionType.js +181 -0
- package/dist/components/form/expressions/useExpressionType.js.map +1 -0
- package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
- package/dist/components/form/expressions/useRenderExpression.js +7 -7
- package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
- package/dist/components/form/fields/Field.d.ts.map +1 -1
- package/dist/components/form/fields/Field.js +20 -7
- package/dist/components/form/fields/Field.js.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.js +17 -4
- package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
- package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
- package/dist/components/form/fields/array/ArrayAuto.js +24 -0
- package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
- package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
- package/dist/components/form/fields/array/ArrayAutoField.js +36 -13
- package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts +20 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.js +81 -36
- package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
- package/dist/components/form/fields/auto/hostEditorValue.d.ts +30 -0
- package/dist/components/form/fields/auto/hostEditorValue.d.ts.map +1 -0
- package/dist/components/form/fields/auto/hostEditorValue.js +53 -0
- package/dist/components/form/fields/auto/hostEditorValue.js.map +1 -0
- package/dist/components/form/fields/binary/Binary.d.ts.map +1 -1
- package/dist/components/form/fields/binary/Binary.js +23 -3
- package/dist/components/form/fields/binary/Binary.js.map +1 -1
- package/dist/components/form/fields/boolean/Boolean.d.ts +5 -0
- package/dist/components/form/fields/boolean/Boolean.d.ts.map +1 -1
- package/dist/components/form/fields/boolean/Boolean.js +9 -1
- package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
- package/dist/components/form/fields/color/Color.d.ts +103 -16
- package/dist/components/form/fields/color/Color.d.ts.map +1 -1
- package/dist/components/form/fields/color/Color.js +611 -16
- package/dist/components/form/fields/color/Color.js.map +1 -1
- package/dist/components/form/fields/emittedValues.d.ts +34 -3
- package/dist/components/form/fields/emittedValues.d.ts.map +1 -1
- package/dist/components/form/fields/emittedValues.js +24 -1
- package/dist/components/form/fields/emittedValues.js.map +1 -1
- package/dist/components/form/fields/file/File.d.ts +1 -1
- package/dist/components/form/fields/file/File.d.ts.map +1 -1
- package/dist/components/form/fields/file/File.js +4 -2
- package/dist/components/form/fields/file/File.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 +17 -3
- package/dist/components/form/fields/long-string/LongString.js.map +1 -1
- package/dist/components/form/fields/markdown/MarkdownView.js +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js +4 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
- package/dist/components/form/fields/number/Number.d.ts +6 -0
- package/dist/components/form/fields/number/Number.d.ts.map +1 -1
- package/dist/components/form/fields/number/Number.js +41 -6
- package/dist/components/form/fields/number/Number.js.map +1 -1
- package/dist/components/form/fields/object/Object.d.ts +1 -1
- package/dist/components/form/fields/object/Object.d.ts.map +1 -1
- package/dist/components/form/fields/object/Object.js +4 -2
- package/dist/components/form/fields/object/Object.js.map +1 -1
- package/dist/components/form/fields/pendingEdit.d.ts +52 -0
- package/dist/components/form/fields/pendingEdit.d.ts.map +1 -0
- package/dist/components/form/fields/pendingEdit.js +79 -0
- package/dist/components/form/fields/pendingEdit.js.map +1 -0
- package/dist/components/form/fields/rich-text/RichText.d.ts +8 -1
- package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
- package/dist/components/form/fields/rich-text/RichText.js +190 -81
- package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
- package/dist/components/form/fields/rich-text/useTemplateTags.d.ts +18 -0
- package/dist/components/form/fields/rich-text/useTemplateTags.d.ts.map +1 -0
- package/dist/components/form/fields/rich-text/useTemplateTags.js +49 -0
- package/dist/components/form/fields/rich-text/useTemplateTags.js.map +1 -0
- package/dist/components/form/fields/schema-definition/CatalogLeafForm.d.ts.map +1 -1
- package/dist/components/form/fields/schema-definition/CatalogLeafForm.js +4 -1
- package/dist/components/form/fields/schema-definition/CatalogLeafForm.js.map +1 -1
- package/dist/components/form/fields/schema-definition/CatalogNodeEditor.d.ts.map +1 -1
- package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js +20 -5
- package/dist/components/form/fields/schema-definition/CatalogNodeEditor.js.map +1 -1
- package/dist/components/form/fields/schema-definition/TableEditor.d.ts.map +1 -1
- package/dist/components/form/fields/schema-definition/TableEditor.js +10 -2
- package/dist/components/form/fields/schema-definition/TableEditor.js.map +1 -1
- package/dist/components/form/fields/schema-definition/index.d.ts.map +1 -1
- package/dist/components/form/fields/schema-definition/index.js +8 -4
- package/dist/components/form/fields/schema-definition/index.js.map +1 -1
- package/dist/components/form/fields/select/Select.d.ts +2 -0
- package/dist/components/form/fields/select/Select.d.ts.map +1 -1
- package/dist/components/form/fields/select/Select.js +19 -10
- package/dist/components/form/fields/select/Select.js.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.js +8 -2
- package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
- package/dist/components/form/fields/select/unavailableRow.d.ts +23 -0
- package/dist/components/form/fields/select/unavailableRow.d.ts.map +1 -0
- package/dist/components/form/fields/select/unavailableRow.js +55 -0
- package/dist/components/form/fields/select/unavailableRow.js.map +1 -0
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +5 -5
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +11 -4
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
- package/dist/components/form/fields/template/TemplateBrowser.d.ts +22 -0
- package/dist/components/form/fields/template/TemplateBrowser.d.ts.map +1 -0
- package/dist/components/form/fields/template/TemplateBrowser.js +54 -0
- package/dist/components/form/fields/template/TemplateBrowser.js.map +1 -0
- package/dist/components/form/fields/template/TemplateField.d.ts +83 -1
- package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateField.js +535 -85
- package/dist/components/form/fields/template/TemplateField.js.map +1 -1
- package/dist/components/form/fields/template/TemplateText.d.ts +0 -17
- package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateText.js +8 -4
- package/dist/components/form/fields/template/TemplateText.js.map +1 -1
- package/dist/components/form/fields/template/writtenAsText.d.ts +55 -0
- package/dist/components/form/fields/template/writtenAsText.d.ts.map +1 -0
- package/dist/components/form/fields/template/writtenAsText.js +188 -0
- package/dist/components/form/fields/template/writtenAsText.js.map +1 -0
- package/dist/components/form/index.d.ts +10 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +23 -1
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -1
- package/dist/components/imageLightbox/ImageLightbox.js +19 -7
- package/dist/components/imageLightbox/ImageLightbox.js.map +1 -1
- package/dist/components/log/Log.d.ts.map +1 -1
- package/dist/components/log/Log.js +15 -7
- package/dist/components/log/Log.js.map +1 -1
- package/dist/components/menu/Menu.d.ts.map +1 -1
- package/dist/components/menu/Menu.js +19 -10
- package/dist/components/menu/Menu.js.map +1 -1
- package/dist/components/smartEditor/CompletionMenu.d.ts +43 -0
- package/dist/components/smartEditor/CompletionMenu.d.ts.map +1 -0
- package/dist/components/smartEditor/CompletionMenu.js +196 -0
- package/dist/components/smartEditor/CompletionMenu.js.map +1 -0
- package/dist/components/smartEditor/MarkdownDoc.d.ts +1 -1
- package/dist/components/smartEditor/MarkdownDoc.js +1 -1
- package/dist/components/smartEditor/MarkdownDoc.js.map +1 -1
- package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
- package/dist/components/smartEditor/SmartEditor.js +51 -136
- package/dist/components/smartEditor/SmartEditor.js.map +1 -1
- package/dist/components/smartEditor/completionStyle.d.ts +27 -0
- package/dist/components/smartEditor/completionStyle.d.ts.map +1 -0
- package/dist/components/smartEditor/completionStyle.js +66 -0
- package/dist/components/smartEditor/completionStyle.js.map +1 -0
- package/dist/components/smartEditor/index.d.ts +5 -1
- package/dist/components/smartEditor/index.d.ts.map +1 -1
- package/dist/components/smartEditor/index.js +19 -1
- package/dist/components/smartEditor/index.js.map +1 -1
- package/dist/components/smartEditor/templateCompletions.d.ts +18 -0
- package/dist/components/smartEditor/templateCompletions.d.ts.map +1 -0
- package/dist/components/smartEditor/templateCompletions.js +94 -0
- package/dist/components/smartEditor/templateCompletions.js.map +1 -0
- package/dist/components/smartEditor/types.d.ts +12 -1
- package/dist/components/smartEditor/types.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspAutocomplete.d.ts +32 -0
- package/dist/components/smartEditor/useLspAutocomplete.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspAutocomplete.js +228 -118
- package/dist/components/smartEditor/useLspAutocomplete.js.map +1 -1
- package/dist/components/smartEditor/useLspHover.d.ts +22 -7
- package/dist/components/smartEditor/useLspHover.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspHover.js +86 -17
- package/dist/components/smartEditor/useLspHover.js.map +1 -1
- package/dist/components/smartEditor/useLspSemanticTokens.js +1 -1
- package/dist/components/smartEditor/useLspSemanticTokens.js.map +1 -1
- package/dist/components/smartEditor/useLspSession.d.ts +6 -0
- package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspSession.js +7 -6
- package/dist/components/smartEditor/useLspSession.js.map +1 -1
- package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -1
- package/dist/components/supportTicket/AttachmentChips.js +15 -5
- package/dist/components/supportTicket/AttachmentChips.js.map +1 -1
- package/dist/components/supportTicket/ReferencePicker.d.ts +9 -2
- package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -1
- package/dist/components/supportTicket/ReferencePicker.js +27 -6
- package/dist/components/supportTicket/ReferencePicker.js.map +1 -1
- package/dist/components/supportTicket/TicketHeader.d.ts +3 -4
- package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -1
- package/dist/components/supportTicket/TicketHeader.js +20 -2
- package/dist/components/supportTicket/TicketHeader.js.map +1 -1
- package/dist/components/supportTicket/TicketMetaTags.d.ts +1 -1
- package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -1
- package/dist/components/ticketReferences/TicketReferences.js +9 -4
- package/dist/components/ticketReferences/TicketReferences.js.map +1 -1
- package/dist/components/ticketThread/TicketThread.d.ts.map +1 -1
- package/dist/components/ticketThread/TicketThread.js +36 -11
- package/dist/components/ticketThread/TicketThread.js.map +1 -1
- package/dist/helpers/descriptionTooltip.d.ts +43 -0
- package/dist/helpers/descriptionTooltip.d.ts.map +1 -0
- package/dist/helpers/descriptionTooltip.js +70 -0
- package/dist/helpers/descriptionTooltip.js.map +1 -0
- package/dist/helpers/domProps.d.ts +5 -0
- package/dist/helpers/domProps.d.ts.map +1 -0
- package/dist/helpers/domProps.js +47 -0
- package/dist/helpers/domProps.js.map +1 -0
- package/dist/helpers/expressions.d.ts +107 -2
- package/dist/helpers/expressions.d.ts.map +1 -1
- package/dist/helpers/expressions.js +223 -8
- package/dist/helpers/expressions.js.map +1 -1
- package/dist/helpers/hoveringPointer.d.ts +26 -0
- package/dist/helpers/hoveringPointer.d.ts.map +1 -0
- package/dist/helpers/hoveringPointer.js +29 -0
- package/dist/helpers/hoveringPointer.js.map +1 -0
- package/dist/helpers/markdownText.d.ts +14 -0
- package/dist/helpers/markdownText.d.ts.map +1 -0
- package/dist/helpers/markdownText.js +160 -0
- package/dist/helpers/markdownText.js.map +1 -0
- package/dist/helpers/qorusTypeCatalogue.d.ts +53 -0
- package/dist/helpers/qorusTypeCatalogue.d.ts.map +1 -0
- package/dist/helpers/qorusTypeCatalogue.js +262 -0
- package/dist/helpers/qorusTypeCatalogue.js.map +1 -0
- package/dist/helpers/readableColors.d.ts +36 -0
- package/dist/helpers/readableColors.d.ts.map +1 -0
- package/dist/helpers/readableColors.js +116 -0
- package/dist/helpers/readableColors.js.map +1 -0
- package/dist/helpers/templateItems.d.ts +2 -2
- package/dist/helpers/templateItems.d.ts.map +1 -1
- package/dist/helpers/templateItems.js +6 -4
- package/dist/helpers/templateItems.js.map +1 -1
- package/dist/helpers/templates.d.ts +26 -1
- package/dist/helpers/templates.d.ts.map +1 -1
- package/dist/helpers/templates.js +41 -6
- package/dist/helpers/templates.js.map +1 -1
- package/dist/helpers/validations.d.ts +9 -0
- package/dist/helpers/validations.d.ts.map +1 -1
- package/dist/helpers/validations.js +139 -33
- package/dist/helpers/validations.js.map +1 -1
- package/dist/hooks/useQorusTypes.d.ts +7 -15
- package/dist/hooks/useQorusTypes.d.ts.map +1 -1
- package/dist/hooks/useQorusTypes.js +25 -166
- package/dist/hooks/useQorusTypes.js.map +1 -1
- package/dist/hooks/useReadableIntentShade.d.ts +9 -0
- package/dist/hooks/useReadableIntentShade.d.ts.map +1 -0
- package/dist/hooks/useReadableIntentShade.js +23 -0
- package/dist/hooks/useReadableIntentShade.js.map +1 -0
- package/dist/hooks/useReadableOpacity.d.ts +6 -0
- package/dist/hooks/useReadableOpacity.d.ts.map +1 -0
- package/dist/hooks/useReadableOpacity.js +17 -0
- package/dist/hooks/useReadableOpacity.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/tracking/ui/ExperimentCard.d.ts +1 -1
- package/dist/tracking/ui/ExperimentCard.d.ts.map +1 -1
- package/dist/tracking/ui/ExperimentCard.js +26 -10
- package/dist/tracking/ui/ExperimentCard.js.map +1 -1
- package/dist/tracking/ui/card.d.ts +2 -2
- package/dist/tracking/ui/card.d.ts.map +1 -1
- package/dist/tracking/ui/card.js +2 -2
- package/dist/tracking/ui/card.js.map +1 -1
- package/dist/tracking/ui/readable.d.ts +14 -0
- package/dist/tracking/ui/readable.d.ts.map +1 -0
- package/dist/tracking/ui/readable.js +60 -0
- package/dist/tracking/ui/readable.js.map +1 -0
- package/package.json +14 -5
- package/.claude/CLAUDE.md +0 -317
- package/.tasks/EXPORT_EXPRESSION_BUILDER.md +0 -38
- package/.tasks/EXPRESSION_BUILDER_REPORT.md +0 -149
- package/.tasks/EXPRESSION_FIELD_SEAMS.md +0 -66
- package/.tasks/FIELD_STACK_REPORT.md +0 -234
- package/.tasks/FORM_ENGINE_COMPACT_READ_FIRST.md +0 -558
- package/.tasks/FORM_ENGINE_EXPRESSIONS.md +0 -197
- package/.tasks/FORM_ENGINE_OPTIONS_SYNC.md +0 -95
- package/.tasks/FORM_FIELD_EXTRAS.md +0 -72
- package/.tasks/INDEX.md +0 -111
- package/.tasks/LSP_SHARED_CONNECTION.md +0 -75
- package/.tasks/QONSOLE_ASSIST_FEATURES.md +0 -306
- package/.tasks/RENDER_EXPRESSION_LSP.md +0 -159
- package/.tasks/REQRAFT_AUTO_FIELD.md +0 -176
- package/.tasks/SCHEMA_DEFINITION_FIELD.md +0 -250
- package/.tasks/SMART_EDITOR_CONTEXT_AND_POLISH.md +0 -340
- package/.tasks/SMART_EDITOR_LSP_FEATURES.md +0 -299
- package/.tasks/SMART_EDITOR_REVIEW_FOLLOWUPS.md +0 -280
- package/.tasks/SMART_EDITOR_UX_POLISH.md +0 -383
- package/.tasks/SMART_EDITOR_VISUAL_POLISH.md +0 -246
- package/.tasks/STORY_NETWORK_ISOLATION.md +0 -98
- package/.tasks/TEMPLATE_TOKEN_GRAMMAR.md +0 -72
- package/CODE_OF_CONDUCT.md +0 -105
- package/CONTRIBUTING.MD +0 -78
- package/SECURITY.md +0 -3
- package/chromatic.config.json +0 -5
- package/design/COMPACT_ENGINE_REDESIGN.md +0 -156
- package/design/COMPACT_INFO_DISPLAY.md +0 -87
- package/design/COMPACT_PARITY.md +0 -85
- package/design/EXPRESSION_BUILDER_REPORT_STRATEGY.md +0 -92
- package/design/FORM_ENGINE_COMPACT.md +0 -300
- package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +0 -353
- package/design/FORM_ENGINE_EXPRESSIONS.md +0 -257
- package/design/FORM_ENGINE_FIELD_MIGRATION.md +0 -419
- package/design/IDE_INTEGRATION.md +0 -64
- package/design/RENDER_EXPRESSION_TRANSPORT.md +0 -156
- package/design/SELECT_DIALOG_FLOOR.md +0 -86
- package/design/SMART_EDITOR_UX.md +0 -438
- package/design/TRACKING.md +0 -290
- package/design/UNAVAILABLE_ALLOWED_VALUES.md +0 -226
- package/src/components/Description/index.tsx +0 -254
- package/src/components/Description/markdownRendererContext.tsx +0 -29
- package/src/components/FocusedEditing/index.tsx +0 -50
- package/src/components/codeSize/index.tsx +0 -79
- package/src/components/composer/Composer.stories.tsx +0 -238
- package/src/components/composer/Composer.tsx +0 -554
- package/src/components/composer/helpers.ts +0 -74
- package/src/components/composer/index.ts +0 -2
- package/src/components/dpqlEditor/DpqlEditor.stories.tsx +0 -1183
- package/src/components/dpqlEditor/DpqlEditor.tsx +0 -219
- package/src/components/dpqlEditor/dpqlHelpers.ts +0 -287
- package/src/components/dpqlEditor/dpqlInserter.ts +0 -121
- package/src/components/dpqlEditor/dpqlProbe.ts +0 -165
- package/src/components/dpqlEditor/dpqlTags.ts +0 -114
- package/src/components/dpqlEditor/index.ts +0 -41
- package/src/components/dpqlEditor/types.ts +0 -203
- package/src/components/dpqlEditor/useDpqlProbe.ts +0 -33
- package/src/components/dpqlEditor/useDpqlSession.ts +0 -411
- package/src/components/form/engine/CompactRow.tsx +0 -2620
- package/src/components/form/engine/CompactToolbar.tsx +0 -330
- package/src/components/form/engine/FormEngine.stories.tsx +0 -9920
- package/src/components/form/engine/FormEngine.tsx +0 -4569
- package/src/components/form/engine/FormEngineRemote.stories.tsx +0 -679
- package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +0 -331
- package/src/components/form/engine/FormFieldsSkeleton.tsx +0 -82
- package/src/components/form/engine/OptionFieldMessages.tsx +0 -477
- package/src/components/form/engine/OptionsHelpDialog.tsx +0 -29
- package/src/components/form/engine/__fixtures__/basicFormOptions.ts +0 -309
- package/src/components/form/engine/__fixtures__/fieldChromeOptions.ts +0 -45
- package/src/components/form/engine/_structuredData/SchemaDataView.stories.tsx +0 -233
- package/src/components/form/engine/_structuredData/SchemaDataView.tsx +0 -742
- package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +0 -85
- package/src/components/form/engine/_structuredData/StructuredDataView.tsx +0 -75
- package/src/components/form/engine/_structuredData/structuredData.ts +0 -145
- package/src/components/form/engine/compactRowContext.ts +0 -148
- package/src/components/form/engine/compactRowStyles.ts +0 -898
- package/src/components/form/engine/compactToolbarContext.ts +0 -69
- package/src/components/form/engine/optionActions.ts +0 -128
- package/src/components/form/engine/optionsContext.ts +0 -24
- package/src/components/form/engine/readFirst.ts +0 -1077
- package/src/components/form/engine/rendererTypes.ts +0 -107
- package/src/components/form/engine/revealRow.ts +0 -123
- package/src/components/form/engine/rowFocus.ts +0 -101
- package/src/components/form/engine/rowMenuContext.ts +0 -159
- package/src/components/form/engine/rowOpenPicker.ts +0 -27
- package/src/components/form/engine/typeChoices.ts +0 -63
- package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +0 -159
- package/src/components/form/engine/variants/VariantCalmTable.tsx +0 -244
- package/src/components/form/engine/variants/VariantCards.tsx +0 -212
- package/src/components/form/engine/variants/VariantFocus.tsx +0 -382
- package/src/components/form/engine/variants/VariantMinimal.tsx +0 -170
- package/src/components/form/engine/variants/focusDemo.ts +0 -145
- package/src/components/form/engine/variants/variantModel.ts +0 -223
- package/src/components/form/engine/variants/variantParts.tsx +0 -313
- package/src/components/form/expressions/DpqlRendering.tsx +0 -85
- package/src/components/form/expressions/ExpressionField.stories.tsx +0 -1395
- package/src/components/form/expressions/ExpressionField.tsx +0 -503
- package/src/components/form/expressions/argumentPresence.ts +0 -213
- package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +0 -1683
- package/src/components/form/expressions/builder/argumentDetail.tsx +0 -17
- package/src/components/form/expressions/builder/argumentLabel.tsx +0 -146
- package/src/components/form/expressions/builder/argumentSlot.tsx +0 -101
- package/src/components/form/expressions/builder/argumentWrapper.tsx +0 -243
- package/src/components/form/expressions/builder/confirmMismatchedTypesModal.tsx +0 -120
- package/src/components/form/expressions/builder/confirmUnsupportedTypeModal.tsx +0 -69
- package/src/components/form/expressions/builder/index.tsx +0 -1545
- package/src/components/form/expressions/builder/item.tsx +0 -89
- package/src/components/form/expressions/builder/moveToPositionStrip.tsx +0 -156
- package/src/components/form/expressions/builder/renderTemplate.tsx +0 -42
- package/src/components/form/expressions/dpqlMockLanguage.ts +0 -566
- package/src/components/form/expressions/dpqlMockLsp.ts +0 -126
- package/src/components/form/expressions/mockExpressions.ts +0 -317
- package/src/components/form/expressions/renderExpressionToText.ts +0 -137
- package/src/components/form/expressions/types.ts +0 -110
- package/src/components/form/expressions/useExpressions.ts +0 -101
- package/src/components/form/expressions/useRenderExpression.ts +0 -165
- package/src/components/form/fields/Field.stories.tsx +0 -143
- package/src/components/form/fields/Field.tsx +0 -732
- package/src/components/form/fields/allowed-values/AllowedValues.tsx +0 -297
- package/src/components/form/fields/array/ArrayAuto.tsx +0 -237
- package/src/components/form/fields/array/ArrayAutoField.stories.tsx +0 -475
- package/src/components/form/fields/array/ArrayAutoField.tsx +0 -367
- package/src/components/form/fields/auto/AutoFormField.stories.tsx +0 -825
- package/src/components/form/fields/auto/AutoFormField.tsx +0 -1164
- package/src/components/form/fields/binary/Binary.stories.tsx +0 -122
- package/src/components/form/fields/binary/Binary.tsx +0 -91
- package/src/components/form/fields/boolean/Boolean.stories.tsx +0 -125
- package/src/components/form/fields/boolean/Boolean.tsx +0 -34
- package/src/components/form/fields/byte-size/ByteSize.stories.tsx +0 -87
- package/src/components/form/fields/byte-size/ByteSize.tsx +0 -58
- package/src/components/form/fields/color/Color.stories.tsx +0 -99
- package/src/components/form/fields/color/Color.tsx +0 -46
- package/src/components/form/fields/cron/Cron.stories.tsx +0 -68
- package/src/components/form/fields/cron/Cron.tsx +0 -80
- package/src/components/form/fields/date/Date.stories.tsx +0 -77
- package/src/components/form/fields/date/Date.tsx +0 -55
- package/src/components/form/fields/emittedValues.ts +0 -70
- package/src/components/form/fields/file/File.stories.tsx +0 -161
- package/src/components/form/fields/file/File.tsx +0 -227
- package/src/components/form/fields/long-string/LongString.stories.tsx +0 -120
- package/src/components/form/fields/long-string/LongString.tsx +0 -130
- package/src/components/form/fields/markdown/Markdown.stories.tsx +0 -76
- package/src/components/form/fields/markdown/Markdown.tsx +0 -81
- package/src/components/form/fields/markdown/MarkdownView.tsx +0 -222
- package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +0 -139
- package/src/components/form/fields/number/Number.stories.tsx +0 -159
- package/src/components/form/fields/number/Number.tsx +0 -160
- package/src/components/form/fields/object/Object.stories.tsx +0 -398
- package/src/components/form/fields/object/Object.tsx +0 -255
- package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +0 -95
- package/src/components/form/fields/radio-group/RadioGroup.tsx +0 -46
- package/src/components/form/fields/radio-group/images/java-96x128.png +0 -0
- package/src/components/form/fields/radio-group/images/python-129x128.png +0 -0
- package/src/components/form/fields/radio-group/images/qore-106x128.png +0 -0
- package/src/components/form/fields/rich-text/RichText.stories.tsx +0 -260
- package/src/components/form/fields/rich-text/RichText.tsx +0 -537
- package/src/components/form/fields/schema-definition/CatalogLeafForm.tsx +0 -242
- package/src/components/form/fields/schema-definition/CatalogNodeEditor.tsx +0 -758
- package/src/components/form/fields/schema-definition/Hint.tsx +0 -22
- package/src/components/form/fields/schema-definition/InlineValidationBanner.tsx +0 -138
- package/src/components/form/fields/schema-definition/Loader.tsx +0 -20
- package/src/components/form/fields/schema-definition/MigrationsTab.tsx +0 -187
- package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +0 -286
- package/src/components/form/fields/schema-definition/TableEditor.tsx +0 -155
- package/src/components/form/fields/schema-definition/TablesTab.tsx +0 -138
- package/src/components/form/fields/schema-definition/catalog.ts +0 -237
- package/src/components/form/fields/schema-definition/helpers.ts +0 -90
- package/src/components/form/fields/schema-definition/index.tsx +0 -418
- package/src/components/form/fields/schema-definition/mockCatalog.ts +0 -325
- package/src/components/form/fields/schema-definition/mockDefinition.ts +0 -111
- package/src/components/form/fields/schema-definition/referenceSuggestions.tsx +0 -152
- package/src/components/form/fields/schema-definition/starterTemplate.ts +0 -68
- package/src/components/form/fields/schema-definition/types.ts +0 -185
- package/src/components/form/fields/schema-definition/useSchemaOptionCatalog.ts +0 -49
- package/src/components/form/fields/select/Select.stories.tsx +0 -872
- package/src/components/form/fields/select/Select.tsx +0 -624
- package/src/components/form/fields/select/SelectCollection.tsx +0 -594
- package/src/components/form/fields/string/String.stories.tsx +0 -86
- package/src/components/form/fields/string/String.tsx +0 -43
- package/src/components/form/fields/template/ExampleValueModal.stories.tsx +0 -114
- package/src/components/form/fields/template/ExampleValueModal.tsx +0 -99
- package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +0 -47
- package/src/components/form/fields/template/TemplateField.stories.tsx +0 -1121
- package/src/components/form/fields/template/TemplateField.tsx +0 -1717
- package/src/components/form/fields/template/TemplateText.tsx +0 -115
- package/src/components/form/fields/template/__fixtures__/longExampleValue.ts +0 -7
- package/src/components/form/fields/template/__fixtures__/multiLevelTemplates.json +0 -147
- package/src/components/form/fields/template/__fixtures__/templates.json +0 -83
- package/src/components/form/fields/timeout/Timeout.stories.tsx +0 -228
- package/src/components/form/fields/timeout/Timeout.tsx +0 -87
- package/src/components/form/fields/url/Url.stories.tsx +0 -94
- package/src/components/form/fields/url/Url.tsx +0 -85
- package/src/components/form/index.tsx +0 -47
- package/src/components/imageLightbox/ImageLightbox.stories.tsx +0 -238
- package/src/components/imageLightbox/ImageLightbox.tsx +0 -236
- package/src/components/imageLightbox/index.ts +0 -1
- package/src/components/log/Log.stories.tsx +0 -333
- package/src/components/log/Log.tsx +0 -285
- package/src/components/menu/Menu.stories.tsx +0 -155
- package/src/components/menu/Menu.tsx +0 -312
- package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +0 -797
- package/src/components/qonsoleSmartInput/QonsoleSmartInput.tsx +0 -105
- package/src/components/qonsoleSmartInput/index.ts +0 -16
- package/src/components/qonsoleSmartInput/qonsoleInserter.ts +0 -77
- package/src/components/qonsoleSmartInput/types.ts +0 -133
- package/src/components/qonsoleSmartInput/useQonsoleSession.ts +0 -124
- package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +0 -62
- package/src/components/searchFilterBar/SearchFilterBar.tsx +0 -144
- package/src/components/searchFilterBar/index.ts +0 -1
- package/src/components/smartEditor/MarkdownDoc.tsx +0 -190
- package/src/components/smartEditor/SmartEditor.stories.tsx +0 -475
- package/src/components/smartEditor/SmartEditor.tsx +0 -808
- package/src/components/smartEditor/__fixtures__/mockLspServer.ts +0 -205
- package/src/components/smartEditor/helpers.ts +0 -217
- package/src/components/smartEditor/index.ts +0 -35
- package/src/components/smartEditor/styling.ts +0 -45
- package/src/components/smartEditor/types.ts +0 -211
- package/src/components/smartEditor/useLspAutocomplete.ts +0 -758
- package/src/components/smartEditor/useLspDiagnosticDecorations.ts +0 -125
- package/src/components/smartEditor/useLspHover.ts +0 -230
- package/src/components/smartEditor/useLspSemanticTokens.ts +0 -298
- package/src/components/smartEditor/useLspSession.ts +0 -231
- package/src/components/smartEditor/useLspSignatureHelp.ts +0 -198
- package/src/components/supportTicket/AttachmentChips.stories.tsx +0 -171
- package/src/components/supportTicket/AttachmentChips.tsx +0 -147
- package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +0 -257
- package/src/components/supportTicket/InterfaceReferenceTags.tsx +0 -129
- package/src/components/supportTicket/ReferencePicker.stories.tsx +0 -584
- package/src/components/supportTicket/ReferencePicker.tsx +0 -563
- package/src/components/supportTicket/TicketConversation.stories.tsx +0 -121
- package/src/components/supportTicket/TicketHeader.stories.tsx +0 -183
- package/src/components/supportTicket/TicketHeader.tsx +0 -247
- package/src/components/supportTicket/TicketMetaTags.stories.tsx +0 -103
- package/src/components/supportTicket/TicketMetaTags.tsx +0 -85
- package/src/components/supportTicket/TicketReplyBox.stories.tsx +0 -354
- package/src/components/supportTicket/TicketReplyBox.tsx +0 -150
- package/src/components/supportTicket/__fixtures__/kindMarks.ts +0 -28
- package/src/components/supportTicket/attachmentAccess.ts +0 -97
- package/src/components/supportTicket/fileToAttachment.ts +0 -24
- package/src/components/supportTicket/index.ts +0 -10
- package/src/components/supportTicket/meta.ts +0 -206
- package/src/components/supportTicket/ticketModel.ts +0 -131
- package/src/components/supportTicket/useLoadedImages.ts +0 -73
- package/src/components/ticketReferences/TicketReferences.stories.tsx +0 -315
- package/src/components/ticketReferences/TicketReferences.tsx +0 -906
- package/src/components/ticketReferences/index.ts +0 -2
- package/src/components/ticketThread/TicketThread.stories.tsx +0 -829
- package/src/components/ticketThread/TicketThread.tsx +0 -719
- package/src/components/ticketThread/index.ts +0 -6
- package/src/contexts/FetchContext.tsx +0 -25
- package/src/contexts/ReqraftContext.tsx +0 -9
- package/src/contexts/StorageContext.tsx +0 -33
- package/src/global.d.ts +0 -4
- package/src/helpers/allowedValues.ts +0 -249
- package/src/helpers/choiceChip.ts +0 -227
- package/src/helpers/common.ts +0 -326
- package/src/helpers/dpqlDetection.ts +0 -209
- package/src/helpers/expressions.ts +0 -140
- package/src/helpers/optionUiTypes.ts +0 -199
- package/src/helpers/options.ts +0 -150
- package/src/helpers/providerValue.ts +0 -125
- package/src/helpers/scrollbar.ts +0 -32
- package/src/helpers/singleLineString.ts +0 -61
- package/src/helpers/templateItems.ts +0 -81
- package/src/helpers/templateText.ts +0 -350
- package/src/helpers/templates.ts +0 -602
- package/src/helpers/validations.ts +0 -2085
- package/src/hooks/useArgSchema.ts +0 -37
- package/src/hooks/useCoarsePointer.ts +0 -30
- package/src/hooks/useFetch/useFetch.stories.tsx +0 -379
- package/src/hooks/useFetch/useFetch.tsx +0 -154
- package/src/hooks/usePhoneViewport.ts +0 -34
- package/src/hooks/useQorusTypes.ts +0 -233
- package/src/hooks/useReqraftProperty.ts +0 -16
- package/src/hooks/useStorage/useStorage.stories.tsx +0 -168
- package/src/hooks/useStorage/useStorage.ts +0 -35
- package/src/hooks/useTemplates.ts +0 -123
- package/src/hooks/useValidation.ts +0 -9
- package/src/hooks/useWebSocket/useWebSocket.ts +0 -224
- package/src/hooks/useWebSocket/useWebsocket.stories.tsx +0 -640
- package/src/hooks/useWhyDidYouUpdate.ts +0 -38
- package/src/index.tsx +0 -86
- package/src/providers/FetchProvider.tsx +0 -40
- package/src/providers/ReqraftProvider.tsx +0 -52
- package/src/providers/StorageProvider.tsx +0 -131
- package/src/stores/currentUser/currentUser.stories.tsx +0 -100
- package/src/stores/currentUser/currentUser.tsx +0 -94
- package/src/stories/Data/fileFieldArgSchema.json +0 -86
- package/src/stories/Tests/utils.ts +0 -320
- package/src/stories/storyNetwork.ts +0 -92
- package/src/stories/tracking.tsx +0 -206
- package/src/tracking/browser/attach.ts +0 -186
- package/src/tracking/browser/env.ts +0 -78
- package/src/tracking/core/consent.ts +0 -37
- package/src/tracking/core/engagement.ts +0 -47
- package/src/tracking/core/experiments.ts +0 -258
- package/src/tracking/core/hash.ts +0 -26
- package/src/tracking/core/ids.ts +0 -25
- package/src/tracking/core/observable.ts +0 -23
- package/src/tracking/core/queue.ts +0 -131
- package/src/tracking/core/sections.ts +0 -166
- package/src/tracking/core/storage.ts +0 -69
- package/src/tracking/core/tracker.ts +0 -417
- package/src/tracking/core/types.ts +0 -162
- package/src/tracking/core/utm.ts +0 -23
- package/src/tracking/index.ts +0 -72
- package/src/tracking/markup.ts +0 -17
- package/src/tracking/react/Experiment.tsx +0 -44
- package/src/tracking/react/TrackingProvider.tsx +0 -56
- package/src/tracking/react/hooks.ts +0 -106
- package/src/tracking/react/index.ts +0 -13
- package/src/tracking/testing.ts +0 -108
- package/src/tracking/ui/ExperimentCard.stories.tsx +0 -296
- package/src/tracking/ui/ExperimentCard.tsx +0 -667
- package/src/tracking/ui/ExperimentsOverlay.stories.tsx +0 -155
- package/src/tracking/ui/ExperimentsOverlay.tsx +0 -437
- package/src/tracking/ui/anchor.ts +0 -180
- package/src/tracking/ui/card.ts +0 -464
- package/src/tracking/ui/client.ts +0 -117
- package/src/tracking/ui/index.ts +0 -77
- package/src/tracking/ui/types.ts +0 -110
- package/src/tracking/ui/useExperimentsAdmin.ts +0 -103
- package/src/types/Form.ts +0 -29
- package/src/types.ts +0 -14
- package/src/utils/datetime.ts +0 -10
- package/src/utils/fetch.ts +0 -457
- package/src/utils/lspClient.ts +0 -711
- package/src/utils/lspClient.types.ts +0 -211
- package/src/utils/queryUnlessCancelled.ts +0 -28
- package/src/utils/websocket.ts +0 -293
- package/vite.config.ts +0 -58
- package/vitest.config.ts +0 -69
|
@@ -1,1545 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ReqoreControlGroup,
|
|
3
|
-
ReqoreErrorBoundary,
|
|
4
|
-
ReqoreMessage,
|
|
5
|
-
ReqoreP,
|
|
6
|
-
ReqorePanel,
|
|
7
|
-
ReqorePanelSkeleton,
|
|
8
|
-
ReqoreSpinner,
|
|
9
|
-
ReqoreTag,
|
|
10
|
-
ReqoreVerticalSpacer,
|
|
11
|
-
useReqoreTheme,
|
|
12
|
-
} from '@qoretechnologies/reqore';
|
|
13
|
-
import {
|
|
14
|
-
TReqoreEffectColor,
|
|
15
|
-
TReqoreHexColor,
|
|
16
|
-
} from '@qoretechnologies/reqore/dist/components/Effect';
|
|
17
|
-
import { IReqorePanelAction } from '@qoretechnologies/reqore/dist/components/Panel';
|
|
18
|
-
import { IReqoreMenuItemProps } from '@qoretechnologies/reqore/dist/components/Menu/item';
|
|
19
|
-
import { IReqoreIconName } from '@qoretechnologies/reqore/dist/types/icons';
|
|
20
|
-
import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
|
|
21
|
-
import { TQorusType } from '@qoretechnologies/ts-toolkit';
|
|
22
|
-
import { clone, cloneDeep, get, isArray, set, size, unset } from 'lodash';
|
|
23
|
-
import { darken, rgba } from 'polished';
|
|
24
|
-
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
25
|
-
import styled from 'styled-components';
|
|
26
|
-
import { moveItem } from '../../../../helpers/common';
|
|
27
|
-
import {
|
|
28
|
-
areQorusTypesCompatible,
|
|
29
|
-
expressionFitsReturnType,
|
|
30
|
-
getArgumentType,
|
|
31
|
-
isConditionType,
|
|
32
|
-
isTextOrDateType,
|
|
33
|
-
} from '../../../../helpers/expressions';
|
|
34
|
-
import { addMissingExpressionArgs } from '../argumentPresence';
|
|
35
|
-
import { findTemplate } from '../../../../helpers/templates';
|
|
36
|
-
import { validateField, validateFieldWithResult } from '../../../../helpers/validations';
|
|
37
|
-
import { IQorusTypeObject, useQorusTypes } from '../../../../hooks/useQorusTypes';
|
|
38
|
-
import { useReqraftStorage } from '../../../../hooks/useStorage/useStorage';
|
|
39
|
-
import { usePhoneViewport } from '../../../../hooks/usePhoneViewport';
|
|
40
|
-
import { useCoarsePointer } from '../../../../hooks/useCoarsePointer';
|
|
41
|
-
import { useTemplates } from '../../../../hooks/useTemplates';
|
|
42
|
-
import { AutoFormField as auto } from '../../fields/auto/AutoFormField';
|
|
43
|
-
import { SelectFormField as Select } from '../../fields/select/Select';
|
|
44
|
-
import {
|
|
45
|
-
ITemplateMenuActions,
|
|
46
|
-
TCustomTemplateItems,
|
|
47
|
-
TemplateField,
|
|
48
|
-
} from '../../fields/template/TemplateField';
|
|
49
|
-
import {
|
|
50
|
-
ExpressionDefaultValue,
|
|
51
|
-
IExpression,
|
|
52
|
-
IExpressionSchema,
|
|
53
|
-
IExpressionSchemaArg,
|
|
54
|
-
TExpressionReorder,
|
|
55
|
-
TExpressionReorderSurface,
|
|
56
|
-
} from '../types';
|
|
57
|
-
import { useExpressions } from '../useExpressions';
|
|
58
|
-
import { ExpressionArgumentDetail } from './argumentDetail';
|
|
59
|
-
import { ExpressionBuilderAddArgumentSlot } from './argumentSlot';
|
|
60
|
-
import { ExpressionBuilderArgumentWrapper } from './argumentWrapper';
|
|
61
|
-
import { ConfirmMismatchedTypesModal } from './confirmMismatchedTypesModal';
|
|
62
|
-
import { ConfirmUnsupportedTypeModal } from './confirmUnsupportedTypeModal';
|
|
63
|
-
import { ExpressionItem } from './item';
|
|
64
|
-
import { ExpressionMoveToPositionStrip } from './moveToPositionStrip';
|
|
65
|
-
import { ExpressionRenderTemplate } from './renderTemplate';
|
|
66
|
-
|
|
67
|
-
const noopUseRegisterHintView = (...args: unknown[]): void => {
|
|
68
|
-
void args;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export interface IExpressionBuilderProps {
|
|
72
|
-
localTemplates?: IReqoreFormTemplates;
|
|
73
|
-
value?: IExpression;
|
|
74
|
-
isChild?: boolean;
|
|
75
|
-
level?: number;
|
|
76
|
-
type?: string;
|
|
77
|
-
path?: string;
|
|
78
|
-
index?: number;
|
|
79
|
-
returnType?: TQorusType | TQorusType[];
|
|
80
|
-
group?: '&&' | '||';
|
|
81
|
-
onChange?: (value: IExpression, remove?: boolean) => void;
|
|
82
|
-
onValueChange?: (value: IExpression, path: string, remove?: boolean) => void;
|
|
83
|
-
/** Operand reordering for varargs expressions — see `TExpressionReorder`. Default `true`. */
|
|
84
|
-
reorder?: TExpressionReorder;
|
|
85
|
-
readOnly?: boolean;
|
|
86
|
-
id?: string;
|
|
87
|
-
expressions?: IExpressionSchema[];
|
|
88
|
-
expressionsUrl?: string;
|
|
89
|
-
serverHandled?: boolean;
|
|
90
|
-
/**
|
|
91
|
-
* SEAM (reqraft): the host's per-`ui_type` editors, forwarded to the operand
|
|
92
|
-
* fields below.
|
|
93
|
-
*
|
|
94
|
-
* Without them an operand whose type is one of the CONSUMER's own ui_types
|
|
95
|
-
* falls through `AutoFormField`'s switch to the literal "Unknown type!" tag.
|
|
96
|
-
* That is what an assertion's `Value` did the moment it was turned into an
|
|
97
|
-
* expression: the field is `test-reference`, an IDE ui_type whose editor the
|
|
98
|
-
* IDE registers through `componentOverrides`, and the builder rendered its
|
|
99
|
-
* operands without them.
|
|
100
|
-
*/
|
|
101
|
-
componentOverrides?: Record<string, React.FC<any>>;
|
|
102
|
-
size?: string;
|
|
103
|
-
/**
|
|
104
|
-
* SEAM (reqraft): extra hover actions prepended to each expression card —
|
|
105
|
-
* where the IDE renders its `AiAssistanceAction` (AI-assist button). The
|
|
106
|
-
* button itself depends on IDE-only AI infrastructure, so reqraft exposes
|
|
107
|
-
* the slot and the consumer (the IDE) injects it.
|
|
108
|
-
*
|
|
109
|
-
* Pass a factory to get the per-card context the IDE's AI button needs
|
|
110
|
-
* (`selectedExpression` — the catalogue schema of the function chosen in
|
|
111
|
-
* that card — and the card's `value`), mirroring how the IDE builds
|
|
112
|
-
* `AiAssistanceAction({ context: selectedExpression, ... })` inline.
|
|
113
|
-
*/
|
|
114
|
-
extraActions?:
|
|
115
|
-
| IReqorePanelAction[]
|
|
116
|
-
| ((context: {
|
|
117
|
-
selectedExpression?: IExpressionSchema;
|
|
118
|
-
value?: IExpression;
|
|
119
|
-
}) => IReqorePanelAction[]);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const StyledExpressionItemLabel = styled.div`
|
|
123
|
-
position: absolute;
|
|
124
|
-
text-orientation: upright;
|
|
125
|
-
writing-mode: vertical-rl;
|
|
126
|
-
top: calc(50%);
|
|
127
|
-
transform: translateY(-50%);
|
|
128
|
-
white-space: nowrap;
|
|
129
|
-
height: calc(100% - 24px);
|
|
130
|
-
// Centered flex
|
|
131
|
-
display: flex;
|
|
132
|
-
align-items: center;
|
|
133
|
-
justify-content: center;
|
|
134
|
-
border-right: 1px solid ${() => rgba('#fff', 0.3)};
|
|
135
|
-
`;
|
|
136
|
-
|
|
137
|
-
export interface IExpressionProps extends IExpressionBuilderProps {}
|
|
138
|
-
|
|
139
|
-
export const Expression = ({
|
|
140
|
-
localTemplates,
|
|
141
|
-
value = ExpressionDefaultValue,
|
|
142
|
-
isChild,
|
|
143
|
-
index,
|
|
144
|
-
type,
|
|
145
|
-
level,
|
|
146
|
-
path,
|
|
147
|
-
onValueChange,
|
|
148
|
-
group,
|
|
149
|
-
returnType,
|
|
150
|
-
readOnly,
|
|
151
|
-
id,
|
|
152
|
-
expressionsUrl,
|
|
153
|
-
serverHandled,
|
|
154
|
-
extraActions,
|
|
155
|
-
componentOverrides,
|
|
156
|
-
...props
|
|
157
|
-
}: IExpressionProps) => {
|
|
158
|
-
const coarsePointer = useCoarsePointer();
|
|
159
|
-
const types = useQorusTypes();
|
|
160
|
-
const [showSummary, setShowSummary] = useState(false);
|
|
161
|
-
const [confirmDialogData, setConfirmDialogData] = useState<
|
|
162
|
-
| {
|
|
163
|
-
isOpen: boolean;
|
|
164
|
-
acceptedTypes: string[];
|
|
165
|
-
children?: React.ReactNode;
|
|
166
|
-
onConfirm: () => void;
|
|
167
|
-
onCancel?: () => void;
|
|
168
|
-
confirmText?: string;
|
|
169
|
-
cancelText?: string;
|
|
170
|
-
}
|
|
171
|
-
| undefined
|
|
172
|
-
>(undefined);
|
|
173
|
-
const [doNotShowTypeConfirmation] = useReqraftStorage<boolean>(
|
|
174
|
-
'doNotShowTypeExpressionConfirmation',
|
|
175
|
-
false,
|
|
176
|
-
true
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
const [firstArgument, ...rest] = value.value?.args || [];
|
|
180
|
-
|
|
181
|
-
const _expressions = useExpressions({
|
|
182
|
-
allow: true,
|
|
183
|
-
expressionsUrl,
|
|
184
|
-
// SEAM (reqraft): the catalogue is provided whole (by ExpressionField /
|
|
185
|
-
// stories), so it overrides the fetch rather than merging as "extras".
|
|
186
|
-
// When undefined, useExpressions fetches the live catalogue.
|
|
187
|
-
override: props.expressions,
|
|
188
|
-
});
|
|
189
|
-
const expressions = useMemo(
|
|
190
|
-
() => ({
|
|
191
|
-
..._expressions,
|
|
192
|
-
value: _expressions.expressions || [],
|
|
193
|
-
}),
|
|
194
|
-
[_expressions]
|
|
195
|
-
);
|
|
196
|
-
|
|
197
|
-
const selectedExpression = useMemo(
|
|
198
|
-
() => expressions.value?.find((exp) => exp.name === value.value?.exp),
|
|
199
|
-
[JSON.stringify(value), JSON.stringify(expressions.value)]
|
|
200
|
-
);
|
|
201
|
-
|
|
202
|
-
// SEAM (reqraft): resolve the consumer-injected hover actions. A factory
|
|
203
|
-
// gets this card's context — exactly what the IDE's `AiAssistanceAction`
|
|
204
|
-
// captured when it was built inline here.
|
|
205
|
-
const resolvedExtraActions = useMemo<IReqorePanelAction[]>(
|
|
206
|
-
() =>
|
|
207
|
-
typeof extraActions === 'function'
|
|
208
|
-
? extraActions({ selectedExpression, value })
|
|
209
|
-
: (extraActions ?? []),
|
|
210
|
-
[extraActions, selectedExpression, JSON.stringify(value)]
|
|
211
|
-
);
|
|
212
|
-
|
|
213
|
-
// If the `return_type_first_arg` is set, we need to get the return type from the first arguments type
|
|
214
|
-
const expressionReturnType = useMemo(() => {
|
|
215
|
-
if (selectedExpression?.return_type_first_arg && firstArgument) {
|
|
216
|
-
if (firstArgument.is_expression && firstArgument.value?.exp) {
|
|
217
|
-
const firstArgExpression = expressions.value?.find(
|
|
218
|
-
(exp) => exp.name === firstArgument.value.exp
|
|
219
|
-
);
|
|
220
|
-
|
|
221
|
-
return firstArgExpression?.ui_return_type;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return firstArgument.type;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
return selectedExpression?.ui_return_type;
|
|
228
|
-
}, [
|
|
229
|
-
JSON.stringify(selectedExpression),
|
|
230
|
-
JSON.stringify(firstArgument),
|
|
231
|
-
returnType,
|
|
232
|
-
JSON.stringify(expressions.value),
|
|
233
|
-
]);
|
|
234
|
-
const expectedReturnTypeText = isArray(returnType)
|
|
235
|
-
? returnType.map(types.getTypeDisplayName).join(' or ')
|
|
236
|
-
: types.getTypeDisplayName(returnType);
|
|
237
|
-
|
|
238
|
-
// Server Handler expressions is either defined by the option
|
|
239
|
-
// then it's always the first level
|
|
240
|
-
// Or if the first argument is a field (data_role: 'record') or the first selected expression is
|
|
241
|
-
// a server expression
|
|
242
|
-
const isFirstArgumentField =
|
|
243
|
-
findTemplate(localTemplates, firstArgument?.value)?.metadata?.dataRole === 'record';
|
|
244
|
-
const isExpressionServerHandled =
|
|
245
|
-
selectedExpression?.from_server ||
|
|
246
|
-
(selectedExpression?.from_both && isFirstArgumentField) ||
|
|
247
|
-
(level === 0 && serverHandled);
|
|
248
|
-
const serverExpression = isFirstArgumentField || isExpressionServerHandled;
|
|
249
|
-
const qorusExpression = selectedExpression && !serverExpression;
|
|
250
|
-
const serverAndQorusExpression = selectedExpression?.from_both;
|
|
251
|
-
|
|
252
|
-
const updateType = useCallback(
|
|
253
|
-
(val: string, conformsCurrentType?: boolean) => {
|
|
254
|
-
if (conformsCurrentType) {
|
|
255
|
-
onValueChange(
|
|
256
|
-
{
|
|
257
|
-
...value,
|
|
258
|
-
value: {
|
|
259
|
-
...value.value,
|
|
260
|
-
args: [
|
|
261
|
-
{
|
|
262
|
-
...value.value.args[0],
|
|
263
|
-
type: val,
|
|
264
|
-
},
|
|
265
|
-
...value.value.args.slice(1),
|
|
266
|
-
],
|
|
267
|
-
},
|
|
268
|
-
},
|
|
269
|
-
path
|
|
270
|
-
);
|
|
271
|
-
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
onValueChange(
|
|
276
|
-
{
|
|
277
|
-
value: {
|
|
278
|
-
args: [
|
|
279
|
-
{
|
|
280
|
-
type: val,
|
|
281
|
-
},
|
|
282
|
-
],
|
|
283
|
-
},
|
|
284
|
-
},
|
|
285
|
-
path
|
|
286
|
-
);
|
|
287
|
-
},
|
|
288
|
-
[onValueChange, JSON.stringify(value), path]
|
|
289
|
-
);
|
|
290
|
-
|
|
291
|
-
const addMissingArgs = useCallback(
|
|
292
|
-
(expression: string, args: IExpression[] = []): IExpression[] =>
|
|
293
|
-
addMissingExpressionArgs(expressions.value as never, expression, args as never) as never,
|
|
294
|
-
[JSON.stringify(expressions.value)]
|
|
295
|
-
);
|
|
296
|
-
|
|
297
|
-
const updateExp = useCallback(
|
|
298
|
-
(val: string) => {
|
|
299
|
-
// We need to get the new expression data and its arguments to see if we need to reset any of the arguments
|
|
300
|
-
const newExpression = expressions.value?.find((exp) => exp.name === val);
|
|
301
|
-
const newArgs = [];
|
|
302
|
-
|
|
303
|
-
newExpression.args.forEach((arg, index) => {
|
|
304
|
-
const argumentType = getArgumentType(expressions.value, value.value?.args[index], arg);
|
|
305
|
-
|
|
306
|
-
if (argumentType) {
|
|
307
|
-
// We need to check if the first argument type conforms to the new expression first argument type
|
|
308
|
-
// 1) If it matches directly (matches `ui_type` on the argument), we are good
|
|
309
|
-
// 2) If it matches inside `types_accepted` of the server type (ui_type of the arg),
|
|
310
|
-
// we are also good, but we need to let the user know that transformation may occur
|
|
311
|
-
// 3) If the type does not match, we need to reset the first argument type and value
|
|
312
|
-
const exactMatch = types.getExactMatches(arg.ui_type);
|
|
313
|
-
const acceptedTypes = types.getAcceptedTypes(arg.ui_type);
|
|
314
|
-
|
|
315
|
-
// If the types match exactly
|
|
316
|
-
if (exactMatch.includes(argumentType) || exactMatch.includes('any')) {
|
|
317
|
-
// All good, do nothing
|
|
318
|
-
newArgs.push(value.value.args[index]);
|
|
319
|
-
} else if (acceptedTypes.includes(argumentType) || acceptedTypes.includes('any')) {
|
|
320
|
-
// If the types is accepted but not exact, we need to show a confirmation dialog, but we will still
|
|
321
|
-
// add the argument and then later in the confirmation we will decide to keep it or not
|
|
322
|
-
newArgs.push({
|
|
323
|
-
...value.value.args[index],
|
|
324
|
-
types_mismatch: true,
|
|
325
|
-
});
|
|
326
|
-
} else {
|
|
327
|
-
// Type does not conform, we need to reset the argument
|
|
328
|
-
newArgs.push({});
|
|
329
|
-
}
|
|
330
|
-
} else {
|
|
331
|
-
// If there is no type set, we can just add the argument as is
|
|
332
|
-
newArgs.push(value.value.args[index]);
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
onValueChange(
|
|
337
|
-
{
|
|
338
|
-
...value,
|
|
339
|
-
value: {
|
|
340
|
-
...value.value,
|
|
341
|
-
exp: val,
|
|
342
|
-
args: addMissingArgs(val, newArgs),
|
|
343
|
-
},
|
|
344
|
-
},
|
|
345
|
-
path
|
|
346
|
-
);
|
|
347
|
-
},
|
|
348
|
-
[addMissingArgs, onValueChange, JSON.stringify(value), path, types.value]
|
|
349
|
-
);
|
|
350
|
-
|
|
351
|
-
const wrapExpression = useCallback(
|
|
352
|
-
(expression: string) => {
|
|
353
|
-
onValueChange(
|
|
354
|
-
{
|
|
355
|
-
value: {
|
|
356
|
-
exp: expression,
|
|
357
|
-
args: addMissingArgs(expression, [value]),
|
|
358
|
-
},
|
|
359
|
-
is_expression: true,
|
|
360
|
-
},
|
|
361
|
-
path
|
|
362
|
-
);
|
|
363
|
-
},
|
|
364
|
-
[onValueChange, JSON.stringify(value), path, addMissingArgs]
|
|
365
|
-
);
|
|
366
|
-
|
|
367
|
-
const unwrapExpression = useCallback(() => {
|
|
368
|
-
onValueChange(value.value.args[0], path);
|
|
369
|
-
}, [onValueChange, JSON.stringify(value), path]);
|
|
370
|
-
|
|
371
|
-
const updateExpToAndOr = useCallback(
|
|
372
|
-
(val: '&&' | '||') => {
|
|
373
|
-
onValueChange(
|
|
374
|
-
{
|
|
375
|
-
value: {
|
|
376
|
-
exp: val,
|
|
377
|
-
args: [value, ExpressionDefaultValue],
|
|
378
|
-
},
|
|
379
|
-
is_expression: true,
|
|
380
|
-
},
|
|
381
|
-
path
|
|
382
|
-
);
|
|
383
|
-
},
|
|
384
|
-
[onValueChange, JSON.stringify(value), path]
|
|
385
|
-
);
|
|
386
|
-
|
|
387
|
-
const removeVarArg = useCallback(
|
|
388
|
-
(index: number) => {
|
|
389
|
-
// Every operand after the removed one moves up a slot; remount the
|
|
390
|
-
// fields for the same reason `moveVarArg` does.
|
|
391
|
-
setArgsGeneration((generation) => generation + 1);
|
|
392
|
-
const args = value.value.args.filter((_, i) => i !== index);
|
|
393
|
-
|
|
394
|
-
onValueChange(
|
|
395
|
-
{
|
|
396
|
-
...value,
|
|
397
|
-
value: {
|
|
398
|
-
...value.value,
|
|
399
|
-
args,
|
|
400
|
-
},
|
|
401
|
-
},
|
|
402
|
-
path
|
|
403
|
-
);
|
|
404
|
-
},
|
|
405
|
-
[onValueChange, JSON.stringify(value), path]
|
|
406
|
-
);
|
|
407
|
-
|
|
408
|
-
const reorderSurfaces = useMemo((): TExpressionReorderSurface[] => {
|
|
409
|
-
const reorder = props.reorder ?? true;
|
|
410
|
-
|
|
411
|
-
if (reorder === false) {
|
|
412
|
-
return [];
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
return reorder === true ? ['dragHandle', 'overflowMenu'] : reorder;
|
|
416
|
-
}, [props.reorder]);
|
|
417
|
-
// Bumped on every move and folded into the operand keys: the operands are
|
|
418
|
-
// keyed by slot, and a slot's TemplateField keeps template / text-mode
|
|
419
|
-
// state that only resyncs one way — remounting hands every slot a field
|
|
420
|
-
// seeded from the operand that now lives there.
|
|
421
|
-
const [argsGeneration, setArgsGeneration] = useState(0);
|
|
422
|
-
const dragArg = useRef<number | null>(null);
|
|
423
|
-
const [dragOverArg, setDragOverArg] = useState<number | null>(null);
|
|
424
|
-
|
|
425
|
-
const moveVarArg = useCallback(
|
|
426
|
-
(from: number, to: number) => {
|
|
427
|
-
setArgsGeneration((generation) => generation + 1);
|
|
428
|
-
onValueChange(
|
|
429
|
-
{
|
|
430
|
-
...value,
|
|
431
|
-
value: {
|
|
432
|
-
...value.value,
|
|
433
|
-
args: moveItem(value.value.args, from, to),
|
|
434
|
-
},
|
|
435
|
-
},
|
|
436
|
-
path
|
|
437
|
-
);
|
|
438
|
-
},
|
|
439
|
-
[onValueChange, JSON.stringify(value), path]
|
|
440
|
-
);
|
|
441
|
-
|
|
442
|
-
const handleArgDragStart = useCallback((index: number) => {
|
|
443
|
-
dragArg.current = index;
|
|
444
|
-
}, []);
|
|
445
|
-
const handleArgDragOver = useCallback((index: number) => {
|
|
446
|
-
setDragOverArg((current) => (current === index ? current : index));
|
|
447
|
-
}, []);
|
|
448
|
-
const handleArgDragEnd = useCallback(() => {
|
|
449
|
-
dragArg.current = null;
|
|
450
|
-
setDragOverArg(null);
|
|
451
|
-
}, []);
|
|
452
|
-
const handleArgDrop = useCallback(
|
|
453
|
-
(index: number) => {
|
|
454
|
-
const from = dragArg.current;
|
|
455
|
-
|
|
456
|
-
if (from !== null && from !== index) {
|
|
457
|
-
moveVarArg(from, index);
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
handleArgDragEnd();
|
|
461
|
-
},
|
|
462
|
-
[moveVarArg, handleArgDragEnd]
|
|
463
|
-
);
|
|
464
|
-
|
|
465
|
-
const updateMultipleArgs = useCallback(
|
|
466
|
-
(args: IExpression[]) => {
|
|
467
|
-
onValueChange(
|
|
468
|
-
{
|
|
469
|
-
...value,
|
|
470
|
-
value: {
|
|
471
|
-
...value.value,
|
|
472
|
-
args: addMissingArgs(value.value.exp, args),
|
|
473
|
-
},
|
|
474
|
-
},
|
|
475
|
-
path
|
|
476
|
-
);
|
|
477
|
-
},
|
|
478
|
-
[onValueChange, JSON.stringify(value), path, addMissingArgs]
|
|
479
|
-
);
|
|
480
|
-
|
|
481
|
-
const updateArg = useCallback(
|
|
482
|
-
(val: any, index: number = 0, type?: string, isFunction?: boolean) => {
|
|
483
|
-
const args = clone(value.value.args);
|
|
484
|
-
const newVal = clone(val);
|
|
485
|
-
|
|
486
|
-
if (newVal?.exp) {
|
|
487
|
-
newVal.args = addMissingArgs(newVal.exp, newVal.args);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
/* `required` is NOT written here. It is a schema key — it describes the
|
|
491
|
-
catalogue's declaration of the argument, not the author's value, and
|
|
492
|
-
nothing reads it back off a stored argument (validation takes it from
|
|
493
|
-
the schema). Persisting it made a cleared argument indistinguishable
|
|
494
|
-
from real data: the value dropped out as `undefined`, `required: true`
|
|
495
|
-
stayed, and what was saved to the draft was `{type, required}` — an
|
|
496
|
-
argument DEFINITION sitting where its value should be. */
|
|
497
|
-
args[index] = {
|
|
498
|
-
...args[index],
|
|
499
|
-
value: newVal,
|
|
500
|
-
type: !isFunction ? type || args[index]?.type : undefined,
|
|
501
|
-
is_expression: isFunction,
|
|
502
|
-
};
|
|
503
|
-
|
|
504
|
-
onValueChange(
|
|
505
|
-
{
|
|
506
|
-
...value,
|
|
507
|
-
value: {
|
|
508
|
-
...value.value,
|
|
509
|
-
args,
|
|
510
|
-
},
|
|
511
|
-
},
|
|
512
|
-
path
|
|
513
|
-
);
|
|
514
|
-
},
|
|
515
|
-
[addMissingArgs, onValueChange, JSON.stringify(value), path]
|
|
516
|
-
);
|
|
517
|
-
|
|
518
|
-
const handleRemoveClick = useCallback(() => {
|
|
519
|
-
onValueChange?.(undefined, path, true);
|
|
520
|
-
}, [onValueChange, path]);
|
|
521
|
-
|
|
522
|
-
const firstArgSchema = selectedExpression?.args[0];
|
|
523
|
-
const firstParamType = firstArgument?.is_expression
|
|
524
|
-
? firstArgSchema?.ui_type
|
|
525
|
-
: firstArgument?.type || type || 'context';
|
|
526
|
-
let restOfArgs = selectedExpression?.args.slice(1);
|
|
527
|
-
const argCount = size(value.value?.args);
|
|
528
|
-
const canReorderArgs =
|
|
529
|
-
!!selectedExpression?.varargs && argCount > 1 && !readOnly && size(reorderSurfaces) > 0;
|
|
530
|
-
const argReorderSurfaces = canReorderArgs ? reorderSurfaces : undefined;
|
|
531
|
-
const isDragOverArg = (index: number) =>
|
|
532
|
-
dragOverArg === index && dragArg.current !== null && dragArg.current !== index;
|
|
533
|
-
|
|
534
|
-
// The `⋮` menu's "Move Argument" section, one per operand. The wording is
|
|
535
|
-
// axis-free on purpose — the operands wrap into a column on narrow screens.
|
|
536
|
-
const argMenuActions = useMemo((): ITemplateMenuActions[] | undefined => {
|
|
537
|
-
if (!canReorderArgs || !reorderSurfaces.includes('overflowMenu')) {
|
|
538
|
-
return undefined;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
const moves: [string, string, IReqoreIconName, (index: number) => number][] = [
|
|
542
|
-
['before', 'Move before', 'ArrowGoBackLine', (index) => index - 1],
|
|
543
|
-
['after', 'Move after', 'ArrowGoForwardLine', (index) => index + 1],
|
|
544
|
-
['start', 'Move to start', 'SkipBackLine', () => 0],
|
|
545
|
-
['end', 'Move to end', 'SkipForwardLine', () => argCount - 1],
|
|
546
|
-
];
|
|
547
|
-
|
|
548
|
-
return Array.from({ length: argCount }, (_, index) => ({
|
|
549
|
-
label: 'Move Argument',
|
|
550
|
-
icon: 'ArrowLeftRightLine',
|
|
551
|
-
items: [
|
|
552
|
-
...moves.map(([key, label, icon, target]) => {
|
|
553
|
-
const to = target(index);
|
|
554
|
-
|
|
555
|
-
return {
|
|
556
|
-
label,
|
|
557
|
-
icon,
|
|
558
|
-
className: `expression-arg-move-${key}`,
|
|
559
|
-
disabled: to === index || to < 0 || to >= argCount,
|
|
560
|
-
onClick: () => moveVarArg(index, to),
|
|
561
|
-
};
|
|
562
|
-
}),
|
|
563
|
-
// Any position in one pick — what a ten-part concat needs.
|
|
564
|
-
{
|
|
565
|
-
isCustom: true as const,
|
|
566
|
-
content: (closePopover) => (
|
|
567
|
-
<ExpressionMoveToPositionStrip
|
|
568
|
-
index={index}
|
|
569
|
-
count={argCount}
|
|
570
|
-
onMoveTo={(to) => {
|
|
571
|
-
moveVarArg(index, to);
|
|
572
|
-
closePopover?.();
|
|
573
|
-
}}
|
|
574
|
-
/>
|
|
575
|
-
),
|
|
576
|
-
},
|
|
577
|
-
],
|
|
578
|
-
}));
|
|
579
|
-
}, [canReorderArgs, reorderSurfaces, argCount, moveVarArg]);
|
|
580
|
-
|
|
581
|
-
if (selectedExpression?.varargs) {
|
|
582
|
-
restOfArgs = [
|
|
583
|
-
...restOfArgs,
|
|
584
|
-
...rest.map(() => ({
|
|
585
|
-
...selectedExpression.args[0],
|
|
586
|
-
})),
|
|
587
|
-
];
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
const isReturnTypeMatching =
|
|
591
|
-
expressionReturnType === 'any' ||
|
|
592
|
-
(isArray(returnType)
|
|
593
|
-
? areQorusTypesCompatible(returnType, expressionReturnType)
|
|
594
|
-
: returnType === 'auto' ||
|
|
595
|
-
returnType === 'any' ||
|
|
596
|
-
returnType === 'context' ||
|
|
597
|
-
expressionReturnType === 'any' ||
|
|
598
|
-
areQorusTypesCompatible(returnType, expressionReturnType) ||
|
|
599
|
-
returnType === expressionReturnType ||
|
|
600
|
-
!returnType) ||
|
|
601
|
-
// a condition is decided by any result but text, a date or a time
|
|
602
|
-
(isConditionType(returnType as string | string[] | undefined) &&
|
|
603
|
-
!!expressionReturnType &&
|
|
604
|
-
!isTextOrDateType(expressionReturnType));
|
|
605
|
-
|
|
606
|
-
const defaultItems = useMemo(
|
|
607
|
-
() =>
|
|
608
|
-
expressions.value
|
|
609
|
-
// a condition (a field or an operand that must be true or false) offers the operations whose
|
|
610
|
-
// result decides it - any but text, a date or a time, which are compared explicitly; a group's members
|
|
611
|
-
// are its own business, and the operation already chosen
|
|
612
|
-
// stays, so a stored mismatch can be seen and fixed
|
|
613
|
-
.filter(
|
|
614
|
-
(exp) =>
|
|
615
|
-
isChild ||
|
|
616
|
-
exp.name === value?.value?.exp ||
|
|
617
|
-
expressionFitsReturnType(returnType as string | string[] | undefined, exp)
|
|
618
|
-
)
|
|
619
|
-
.map((exp) => ({
|
|
620
|
-
name: exp.name,
|
|
621
|
-
value: exp.name,
|
|
622
|
-
display_name: exp.display_name,
|
|
623
|
-
short_desc: exp.short_desc,
|
|
624
|
-
desc: exp.desc,
|
|
625
|
-
badge: exp.symbol,
|
|
626
|
-
from_server: exp.from_server,
|
|
627
|
-
from_both: exp.from_both,
|
|
628
|
-
groups: exp.groups,
|
|
629
|
-
}))
|
|
630
|
-
.filter((exp) =>
|
|
631
|
-
serverExpression
|
|
632
|
-
? exp.from_server || exp.from_both
|
|
633
|
-
: firstArgument?.value && !isFirstArgumentField
|
|
634
|
-
? !exp.from_server
|
|
635
|
-
: true
|
|
636
|
-
),
|
|
637
|
-
[JSON.stringify(expressions.value), serverExpression, level, isChild, returnType, value?.value?.exp]
|
|
638
|
-
);
|
|
639
|
-
|
|
640
|
-
// SEAM (reqraft): reqraft's `SelectFormField` calls `onChange(value)` with
|
|
641
|
-
// the value directly (the IDE's Select used `(name, value)`).
|
|
642
|
-
const handleOperatorChange = useCallback(
|
|
643
|
-
(value: unknown) => {
|
|
644
|
-
updateExp(value as string);
|
|
645
|
-
},
|
|
646
|
-
[updateExp]
|
|
647
|
-
);
|
|
648
|
-
|
|
649
|
-
// The panel whose slot was clicked, kept until the operand it adds has
|
|
650
|
-
// rendered: the new field then takes focus, so adding a value and typing
|
|
651
|
-
// it is one gesture. The slot sits inside this builder's own panel, and a
|
|
652
|
-
// nested builder's operands come before it in DOM order, so the last
|
|
653
|
-
// operand of the panel is the one just added.
|
|
654
|
-
const focusNewArgIn = useRef<HTMLElement | null>(null);
|
|
655
|
-
|
|
656
|
-
const handleAddArgumentClick = useCallback(
|
|
657
|
-
(event?: React.MouseEvent<HTMLElement>) => {
|
|
658
|
-
focusNewArgIn.current = event?.currentTarget?.closest<HTMLElement>('.expression') ?? null;
|
|
659
|
-
updateArg(undefined, size(value.value.args), undefined, false);
|
|
660
|
-
},
|
|
661
|
-
[updateArg, JSON.stringify(value)]
|
|
662
|
-
);
|
|
663
|
-
|
|
664
|
-
useEffect(() => {
|
|
665
|
-
const panel = focusNewArgIn.current;
|
|
666
|
-
|
|
667
|
-
if (!panel) {
|
|
668
|
-
return;
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
focusNewArgIn.current = null;
|
|
672
|
-
const operands = panel.querySelectorAll<HTMLElement>('.expression-arg');
|
|
673
|
-
const added = operands[operands.length - 1];
|
|
674
|
-
|
|
675
|
-
if (!added) {
|
|
676
|
-
return;
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
// A typed operand mounts a text field; an untyped one opens on its
|
|
680
|
-
// template picker, whose trigger is the field's first button that is not
|
|
681
|
-
// one of the operand's own controls (grip, position, ⋮, remove).
|
|
682
|
-
const field =
|
|
683
|
-
added.querySelector<HTMLElement>('textarea, input') ??
|
|
684
|
-
Array.from(added.querySelectorAll<HTMLElement>('button')).find(
|
|
685
|
-
(button) =>
|
|
686
|
-
!button.closest(
|
|
687
|
-
'.expression-arg-drag-handle, .expression-arg-position, .template-more, .expression-remove-arg'
|
|
688
|
-
)
|
|
689
|
-
);
|
|
690
|
-
|
|
691
|
-
field?.focus();
|
|
692
|
-
}, [argCount]);
|
|
693
|
-
|
|
694
|
-
const canAddArg = !!selectedExpression?.varargs && !readOnly;
|
|
695
|
-
|
|
696
|
-
// On a phone the operand row has no room for a remove button beside the
|
|
697
|
-
// field, the grip and the `⋮`; it wrapped onto a line of its own. The
|
|
698
|
-
// operand already has an always-visible menu, so the action goes there,
|
|
699
|
-
// as the last row. Same media query as the slot, for the same reason.
|
|
700
|
-
const phone = usePhoneViewport();
|
|
701
|
-
// Any operand can go, the first included (the next one becomes first),
|
|
702
|
-
// down to the catalogue's minimum — one for most, so the last operand
|
|
703
|
-
// left is the one that cannot be removed.
|
|
704
|
-
const canRemoveArgs =
|
|
705
|
-
!!selectedExpression?.varargs &&
|
|
706
|
-
argCount > Math.max(1, selectedExpression.min_args ?? 1) &&
|
|
707
|
-
!readOnly;
|
|
708
|
-
const removeArgInline = canRemoveArgs && !phone;
|
|
709
|
-
const handleRemoveFirstArg = useCallback(() => removeVarArg(0), [removeVarArg]);
|
|
710
|
-
const argRemoveMenuItems = useMemo((): IReqoreMenuItemProps[][] | undefined => {
|
|
711
|
-
if (!canRemoveArgs || !phone) {
|
|
712
|
-
return undefined;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
const name = (selectedExpression.args[0]?.display_name || 'argument').toLowerCase();
|
|
716
|
-
|
|
717
|
-
return Array.from({ length: argCount }, (_, index) => [
|
|
718
|
-
{
|
|
719
|
-
label: `Remove ${name}`,
|
|
720
|
-
icon: 'DeleteBinLine',
|
|
721
|
-
intent: 'danger',
|
|
722
|
-
className: 'expression-remove-arg',
|
|
723
|
-
onClick: () => removeVarArg(index),
|
|
724
|
-
},
|
|
725
|
-
]);
|
|
726
|
-
}, [canRemoveArgs, phone, argCount, removeVarArg, JSON.stringify(selectedExpression?.args[0])]);
|
|
727
|
-
const isSlotDropTarget = canReorderArgs && reorderSurfaces.includes('dragHandle');
|
|
728
|
-
// The slot is indexed one past the last operand, so its drag-over state
|
|
729
|
-
// never lights an operand and vice versa.
|
|
730
|
-
const handleSlotDragOver = useCallback(
|
|
731
|
-
() => handleArgDragOver(argCount),
|
|
732
|
-
[handleArgDragOver, argCount]
|
|
733
|
-
);
|
|
734
|
-
const handleSlotDrop = useCallback(() => handleArgDrop(argCount - 1), [handleArgDrop, argCount]);
|
|
735
|
-
|
|
736
|
-
const handleWrapExpressionClick = useCallback(
|
|
737
|
-
(value: unknown) => {
|
|
738
|
-
wrapExpression(value as string);
|
|
739
|
-
},
|
|
740
|
-
[wrapExpression]
|
|
741
|
-
);
|
|
742
|
-
|
|
743
|
-
const handleUpdateExpToAnd = useCallback(() => {
|
|
744
|
-
updateExpToAndOr('&&');
|
|
745
|
-
}, [updateExpToAndOr]);
|
|
746
|
-
|
|
747
|
-
const handleUpdateExpToOr = useCallback(() => {
|
|
748
|
-
updateExpToAndOr('||');
|
|
749
|
-
}, [updateExpToAndOr]);
|
|
750
|
-
|
|
751
|
-
const handleUpdateTypeChange = useCallback(
|
|
752
|
-
(value) => {
|
|
753
|
-
updateType(value === 'context' ? undefined : value, true);
|
|
754
|
-
},
|
|
755
|
-
[updateType]
|
|
756
|
-
);
|
|
757
|
-
|
|
758
|
-
const handleFirstParamChange = useCallback(
|
|
759
|
-
(_name, value, type, isFunction) => {
|
|
760
|
-
if (isFunction || (type !== 'any' && type !== 'auto')) {
|
|
761
|
-
updateArg(value, 0, isFunction ? undefined : type, isFunction);
|
|
762
|
-
}
|
|
763
|
-
},
|
|
764
|
-
[updateArg]
|
|
765
|
-
);
|
|
766
|
-
|
|
767
|
-
const buildCustomTemplateItems = useCallback(
|
|
768
|
-
(
|
|
769
|
-
arg: IExpressionSchemaArg,
|
|
770
|
-
onClick: (type: IQorusTypeObject, removeTemplate: () => void) => void
|
|
771
|
-
) => {
|
|
772
|
-
// If the argument has allowed values or element allowed values, do not allow type changing
|
|
773
|
-
if (arg?.allowed_values || arg?.element_allowed_values) {
|
|
774
|
-
return [];
|
|
775
|
-
}
|
|
776
|
-
// For every type in the types we need to check if it matches a type in the args accepted types
|
|
777
|
-
// We need to sort these types at the top, and but the rest at the bottom with a warning intent
|
|
778
|
-
const serverAcceptedTypes = types.getAcceptedTypes(arg?.ui_type);
|
|
779
|
-
const acceptedTypes = types.compactValue?.filter(
|
|
780
|
-
(type) =>
|
|
781
|
-
!arg || serverAcceptedTypes.includes(type.name) || serverAcceptedTypes.includes('any')
|
|
782
|
-
);
|
|
783
|
-
|
|
784
|
-
const otherTypes = types.compactValue?.filter(
|
|
785
|
-
(type) =>
|
|
786
|
-
arg && !serverAcceptedTypes.includes(type.name) && !serverAcceptedTypes.includes('any')
|
|
787
|
-
);
|
|
788
|
-
|
|
789
|
-
let result: TCustomTemplateItems = [];
|
|
790
|
-
|
|
791
|
-
if (size(acceptedTypes)) {
|
|
792
|
-
result = acceptedTypes?.map((type) => ({
|
|
793
|
-
label: type.display_name,
|
|
794
|
-
description: type.short_desc,
|
|
795
|
-
minimal: true,
|
|
796
|
-
onClick: (_e, removeTemplate) => {
|
|
797
|
-
removeTemplate?.();
|
|
798
|
-
onClick?.(type, removeTemplate);
|
|
799
|
-
},
|
|
800
|
-
}));
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
if (size(otherTypes)) {
|
|
804
|
-
result = [
|
|
805
|
-
...result,
|
|
806
|
-
{
|
|
807
|
-
isDivider: true,
|
|
808
|
-
line: true,
|
|
809
|
-
},
|
|
810
|
-
...(otherTypes?.map((type) => ({
|
|
811
|
-
label: type.display_name,
|
|
812
|
-
description: type.short_desc,
|
|
813
|
-
minimal: true,
|
|
814
|
-
intent: 'warning',
|
|
815
|
-
onClick: (_e, removeTemplate) => {
|
|
816
|
-
if (doNotShowTypeConfirmation) {
|
|
817
|
-
removeTemplate?.();
|
|
818
|
-
onClick?.(type, removeTemplate);
|
|
819
|
-
return;
|
|
820
|
-
}
|
|
821
|
-
|
|
822
|
-
setConfirmDialogData({
|
|
823
|
-
isOpen: true,
|
|
824
|
-
acceptedTypes: serverAcceptedTypes,
|
|
825
|
-
onConfirm: () => {
|
|
826
|
-
removeTemplate?.();
|
|
827
|
-
onClick?.(type, removeTemplate);
|
|
828
|
-
},
|
|
829
|
-
});
|
|
830
|
-
},
|
|
831
|
-
})) as TCustomTemplateItems),
|
|
832
|
-
];
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
return result;
|
|
836
|
-
},
|
|
837
|
-
[types?.compactValue]
|
|
838
|
-
);
|
|
839
|
-
|
|
840
|
-
const hasArgumentsWithTypeMismatch = useMemo(() => {
|
|
841
|
-
return value.value?.args?.some((arg) => arg?.types_mismatch);
|
|
842
|
-
}, [JSON.stringify(value)]);
|
|
843
|
-
|
|
844
|
-
// The type hook is seeded with the complete built-in catalogue and refreshes
|
|
845
|
-
// it in the background. Do not hide an otherwise usable expression behind
|
|
846
|
-
// a skeleton while that optional refresh is in flight.
|
|
847
|
-
if (expressions.loading || (types.loading && !size(types.value))) {
|
|
848
|
-
return <ReqorePanelSkeleton size='small' />;
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
const validationData = validateFieldWithResult('expression', value, {
|
|
852
|
-
expressions: expressions.value,
|
|
853
|
-
});
|
|
854
|
-
|
|
855
|
-
return (
|
|
856
|
-
<ExpressionItem
|
|
857
|
-
index={index}
|
|
858
|
-
as={ReqorePanel}
|
|
859
|
-
intent={validationData.isValid && !!returnType && isReturnTypeMatching ? 'muted' : 'danger'}
|
|
860
|
-
description={
|
|
861
|
-
isExpressionServerHandled ? 'This expression will be executed outside of Qorus' : ''
|
|
862
|
-
}
|
|
863
|
-
flat
|
|
864
|
-
readOnly={readOnly}
|
|
865
|
-
minimal
|
|
866
|
-
size='small'
|
|
867
|
-
isChild={isChild}
|
|
868
|
-
className='expression'
|
|
869
|
-
customTheme={{
|
|
870
|
-
main: `main:darken:${level}` as TReqoreEffectColor,
|
|
871
|
-
}}
|
|
872
|
-
id={id}
|
|
873
|
-
label={
|
|
874
|
-
<Select
|
|
875
|
-
size='tiny'
|
|
876
|
-
className='expression-operator-selector'
|
|
877
|
-
value={value?.value?.exp}
|
|
878
|
-
icon='Functions'
|
|
879
|
-
placeholder='Select operation'
|
|
880
|
-
fluid={false}
|
|
881
|
-
// shrinks with a narrow panel, its name shortened, rather than holding the panel open
|
|
882
|
-
fixed={false}
|
|
883
|
-
style={{ minWidth: 0, maxWidth: '100%' }}
|
|
884
|
-
flat
|
|
885
|
-
// The operation catalogue is long and every entry carries a description,
|
|
886
|
-
// so it belongs in the searchable collection modal rather than an inline
|
|
887
|
-
// dropdown. `SelectFormField` defaults `forceDropdown` to `true`, which
|
|
888
|
-
// would otherwise collapse this picker into the dropdown presentation.
|
|
889
|
-
forceDropdown={false}
|
|
890
|
-
minimal
|
|
891
|
-
items={defaultItems}
|
|
892
|
-
onChange={handleOperatorChange}
|
|
893
|
-
showDescription='tooltip'
|
|
894
|
-
disabled={readOnly}
|
|
895
|
-
id='expression-builder-select-function'
|
|
896
|
-
/>
|
|
897
|
-
}
|
|
898
|
-
style={{
|
|
899
|
-
marginLeft: isChild ? 10 : undefined,
|
|
900
|
-
// indented, it is as wide as what is left of the group's width: at its full width the indent
|
|
901
|
-
// pushed it - and the actions floating above it on hover - past the group and a narrow screen
|
|
902
|
-
maxWidth: isChild ? 'calc(100% - 10px)' : undefined,
|
|
903
|
-
minWidth: 0,
|
|
904
|
-
borderStyle: 'dashed',
|
|
905
|
-
flexShrink: 1,
|
|
906
|
-
}}
|
|
907
|
-
contentStyle={{
|
|
908
|
-
overflowX: 'hidden',
|
|
909
|
-
}}
|
|
910
|
-
// with a mouse, the actions float above the panel while it is hovered; a finger cannot hover, and a
|
|
911
|
-
// tap left them floating over what is above - the Visual / Text switch, where a tap meant for
|
|
912
|
-
// Text hit "Remove this expression" - so on a touch device they stay in the panel's own bar
|
|
913
|
-
floatingActions={!coarsePointer}
|
|
914
|
-
actions={[
|
|
915
|
-
// SEAM (reqraft): the IDE renders `AiAssistanceAction` first here;
|
|
916
|
-
// consumers inject it (or anything else) via `extraActions`.
|
|
917
|
-
...resolvedExtraActions,
|
|
918
|
-
// "Add value" is not up here: it is the slot after the last operand
|
|
919
|
-
// (`ExpressionBuilderAddArgumentSlot`), where the value will appear.
|
|
920
|
-
{
|
|
921
|
-
as: Select,
|
|
922
|
-
show: readOnly ? false : 'hover',
|
|
923
|
-
props: {
|
|
924
|
-
className: 'expression-wrap',
|
|
925
|
-
id: 'expression-builder-wrap',
|
|
926
|
-
placeholder: 'Wrap',
|
|
927
|
-
icon: 'Functions',
|
|
928
|
-
showRightIcon: false,
|
|
929
|
-
fluid: false,
|
|
930
|
-
transparent: false,
|
|
931
|
-
fixed: true,
|
|
932
|
-
minimal: false,
|
|
933
|
-
// Same catalogue as the operation selector above — keep the collection
|
|
934
|
-
// modal rather than the `forceDropdown` default's inline dropdown.
|
|
935
|
-
forceDropdown: false,
|
|
936
|
-
items: defaultItems,
|
|
937
|
-
hideItemCount: true,
|
|
938
|
-
onChange: handleWrapExpressionClick,
|
|
939
|
-
showDescription: 'tooltip',
|
|
940
|
-
tooltip: 'Wrap this expression in another expression',
|
|
941
|
-
size: 'tiny',
|
|
942
|
-
},
|
|
943
|
-
},
|
|
944
|
-
{
|
|
945
|
-
className: 'expression-unwrap',
|
|
946
|
-
label: 'Remove',
|
|
947
|
-
textAlign: 'center',
|
|
948
|
-
icon: 'CloseLine',
|
|
949
|
-
tooltip: 'Remove this expression but keep the children',
|
|
950
|
-
fixed: true,
|
|
951
|
-
onClick: unwrapExpression,
|
|
952
|
-
show: value.value?.args?.[0]?.is_expression === true && !readOnly ? 'hover' : false,
|
|
953
|
-
},
|
|
954
|
-
{
|
|
955
|
-
className: 'expression-explain',
|
|
956
|
-
label: showSummary ? 'Hide Explanation' : 'Explain',
|
|
957
|
-
show: level === 0,
|
|
958
|
-
onClick: () => setShowSummary(!showSummary),
|
|
959
|
-
icon: 'InformationLine',
|
|
960
|
-
tooltip: showSummary
|
|
961
|
-
? 'Hide explanation of this expression'
|
|
962
|
-
: 'Show explanation of this expression',
|
|
963
|
-
fixed: true,
|
|
964
|
-
},
|
|
965
|
-
{
|
|
966
|
-
className: 'expression-group-remove',
|
|
967
|
-
intent: 'danger',
|
|
968
|
-
textAlign: 'center',
|
|
969
|
-
icon: 'DeleteBinLine',
|
|
970
|
-
tooltip: 'Remove this expression and its children',
|
|
971
|
-
fixed: true,
|
|
972
|
-
minimal: true,
|
|
973
|
-
show: readOnly ? false : 'hover',
|
|
974
|
-
onClick: handleRemoveClick,
|
|
975
|
-
},
|
|
976
|
-
]}
|
|
977
|
-
bottomActions={[
|
|
978
|
-
{
|
|
979
|
-
show: !!selectedExpression && areQorusTypesCompatible('bool', returnType) && !readOnly,
|
|
980
|
-
group: [
|
|
981
|
-
{
|
|
982
|
-
flat: true,
|
|
983
|
-
className: 'expression-and',
|
|
984
|
-
label: 'AND',
|
|
985
|
-
textAlign: 'center',
|
|
986
|
-
icon: 'AddLine',
|
|
987
|
-
fixed: true,
|
|
988
|
-
compact: true,
|
|
989
|
-
size: 'tiny',
|
|
990
|
-
show: (!group || group === '||') && !readOnly,
|
|
991
|
-
onClick: handleUpdateExpToAnd,
|
|
992
|
-
},
|
|
993
|
-
{
|
|
994
|
-
flat: true,
|
|
995
|
-
className: 'expression-or',
|
|
996
|
-
label: 'OR',
|
|
997
|
-
textAlign: 'center',
|
|
998
|
-
icon: 'AddLine',
|
|
999
|
-
show: (!group || group === '&&') && !readOnly,
|
|
1000
|
-
fixed: true,
|
|
1001
|
-
compact: true,
|
|
1002
|
-
size: 'tiny',
|
|
1003
|
-
onClick: handleUpdateExpToOr,
|
|
1004
|
-
},
|
|
1005
|
-
],
|
|
1006
|
-
},
|
|
1007
|
-
]}
|
|
1008
|
-
>
|
|
1009
|
-
{hasArgumentsWithTypeMismatch && (
|
|
1010
|
-
<ConfirmMismatchedTypesModal
|
|
1011
|
-
args={value.value?.args}
|
|
1012
|
-
expression={selectedExpression}
|
|
1013
|
-
onSubmit={updateMultipleArgs}
|
|
1014
|
-
expressions={expressions.value}
|
|
1015
|
-
/>
|
|
1016
|
-
)}
|
|
1017
|
-
{confirmDialogData?.isOpen && (
|
|
1018
|
-
<ConfirmUnsupportedTypeModal
|
|
1019
|
-
acceptedTypes={confirmDialogData.acceptedTypes}
|
|
1020
|
-
onClose={() => {
|
|
1021
|
-
setConfirmDialogData(undefined);
|
|
1022
|
-
}}
|
|
1023
|
-
maxSize='550px'
|
|
1024
|
-
bottomActions={[
|
|
1025
|
-
{
|
|
1026
|
-
label: confirmDialogData?.cancelText || 'Cancel',
|
|
1027
|
-
onClick: () => {
|
|
1028
|
-
confirmDialogData?.onCancel?.();
|
|
1029
|
-
setConfirmDialogData(undefined);
|
|
1030
|
-
},
|
|
1031
|
-
icon: 'CloseFill',
|
|
1032
|
-
minimal: true,
|
|
1033
|
-
},
|
|
1034
|
-
{
|
|
1035
|
-
label: confirmDialogData?.confirmText || 'Confirm',
|
|
1036
|
-
intent: 'warning',
|
|
1037
|
-
icon: 'CheckFill',
|
|
1038
|
-
minimal: true,
|
|
1039
|
-
position: 'right',
|
|
1040
|
-
onClick: () => {
|
|
1041
|
-
confirmDialogData.onConfirm?.();
|
|
1042
|
-
setConfirmDialogData(undefined);
|
|
1043
|
-
},
|
|
1044
|
-
},
|
|
1045
|
-
]}
|
|
1046
|
-
>
|
|
1047
|
-
{confirmDialogData.children}
|
|
1048
|
-
</ConfirmUnsupportedTypeModal>
|
|
1049
|
-
)}
|
|
1050
|
-
{showSummary && (
|
|
1051
|
-
<ExpressionRenderTemplate exp={value} expressions={expressions.value} templates={localTemplates} />
|
|
1052
|
-
)}
|
|
1053
|
-
{!selectedExpression && !serverExpression && !firstArgument?.value && level === 0 ? (
|
|
1054
|
-
<ReqoreMessage size='small' opaque={false} intent='info'>
|
|
1055
|
-
Select an operation to start building your expression
|
|
1056
|
-
</ReqoreMessage>
|
|
1057
|
-
) : (
|
|
1058
|
-
<ReqoreControlGroup
|
|
1059
|
-
// On a phone every operand is a full-width row, so the group spans
|
|
1060
|
-
// the panel; on desktop it hugs its content and wraps.
|
|
1061
|
-
fluid={phone}
|
|
1062
|
-
style={{ maxWidth: '100%' }}
|
|
1063
|
-
wrap
|
|
1064
|
-
verticalAlign='flex-start'
|
|
1065
|
-
size='normal'
|
|
1066
|
-
gapSize='big'
|
|
1067
|
-
>
|
|
1068
|
-
{firstArgSchema?.label_before && (
|
|
1069
|
-
<ExpressionArgumentDetail label={firstArgSchema.label_before} />
|
|
1070
|
-
)}
|
|
1071
|
-
<ExpressionBuilderArgumentWrapper
|
|
1072
|
-
expressions={expressions.value}
|
|
1073
|
-
arg={firstArgument}
|
|
1074
|
-
schema={firstArgSchema}
|
|
1075
|
-
onTypeChange={handleUpdateTypeChange}
|
|
1076
|
-
onRemoveArgClick={handleRemoveFirstArg}
|
|
1077
|
-
hasMultipleArgs={removeArgInline}
|
|
1078
|
-
fluid={phone}
|
|
1079
|
-
readOnly={readOnly}
|
|
1080
|
-
reorder={argReorderSurfaces}
|
|
1081
|
-
argIndex={0}
|
|
1082
|
-
argCount={argCount}
|
|
1083
|
-
dragOver={isDragOverArg(0)}
|
|
1084
|
-
onMoveArg={moveVarArg}
|
|
1085
|
-
onArgDragStart={handleArgDragStart}
|
|
1086
|
-
onArgDragOver={handleArgDragOver}
|
|
1087
|
-
onArgDrop={handleArgDrop}
|
|
1088
|
-
onArgDragEnd={handleArgDragEnd}
|
|
1089
|
-
>
|
|
1090
|
-
<TemplateField
|
|
1091
|
-
component={auto}
|
|
1092
|
-
componentOverrides={componentOverrides}
|
|
1093
|
-
// SEAM (reqraft): an operand that becomes an expression mounts
|
|
1094
|
-
// its own builder through this TemplateField — hand the host's
|
|
1095
|
-
// actions on, or nesting silently drops them (the group
|
|
1096
|
-
// recursion below already forwards them).
|
|
1097
|
-
extraActions={extraActions}
|
|
1098
|
-
minimal
|
|
1099
|
-
label={
|
|
1100
|
-
serverAndQorusExpression
|
|
1101
|
-
? 'Select Template Or Field'
|
|
1102
|
-
: serverExpression
|
|
1103
|
-
? 'Select Field'
|
|
1104
|
-
: qorusExpression
|
|
1105
|
-
? 'Select Template'
|
|
1106
|
-
: 'Select Template Or Field'
|
|
1107
|
-
}
|
|
1108
|
-
allowFunctions={
|
|
1109
|
-
!serverExpression &&
|
|
1110
|
-
!!selectedExpression &&
|
|
1111
|
-
!firstArgSchema?.allowed_values &&
|
|
1112
|
-
!firstArgSchema?.element_allowed_values
|
|
1113
|
-
}
|
|
1114
|
-
level={level + 1}
|
|
1115
|
-
key={`${argsGeneration}-${firstParamType}${selectedExpression?.name}`}
|
|
1116
|
-
type={firstParamType}
|
|
1117
|
-
defaultType={
|
|
1118
|
-
firstArgument?.allowed_values || firstArgument?.element_allowed_values
|
|
1119
|
-
? firstArgument?.type.base_type
|
|
1120
|
-
: firstParamType
|
|
1121
|
-
}
|
|
1122
|
-
returnType={types.getAcceptedTypes(firstArgSchema?.ui_type) as any}
|
|
1123
|
-
value={firstArgument?.value}
|
|
1124
|
-
isFunction={firstArgument?.is_expression}
|
|
1125
|
-
onChange={handleFirstParamChange as any}
|
|
1126
|
-
templates={localTemplates}
|
|
1127
|
-
allowTemplates
|
|
1128
|
-
filterTemplatesByType={false}
|
|
1129
|
-
allowCustomValues={
|
|
1130
|
-
!!firstArgument?.allowed_values ||
|
|
1131
|
-
!!firstArgument?.element_allowed_values ||
|
|
1132
|
-
(!!firstArgument?.type && !serverExpression)
|
|
1133
|
-
}
|
|
1134
|
-
filterTemplatesFunc={(templates) => {
|
|
1135
|
-
// PORT NOTE: `?.` on `items` added — with no templates at all
|
|
1136
|
-
// (FormEngine with templates off) the IDE original crashes on
|
|
1137
|
-
// `{}.items.filter`.
|
|
1138
|
-
const filteredTemplates = templates?.items?.filter((item) => {
|
|
1139
|
-
return serverExpression ? item.metadata?.dataRole === 'record' : true;
|
|
1140
|
-
});
|
|
1141
|
-
|
|
1142
|
-
return {
|
|
1143
|
-
...templates,
|
|
1144
|
-
items: filteredTemplates,
|
|
1145
|
-
};
|
|
1146
|
-
}}
|
|
1147
|
-
fluid={phone}
|
|
1148
|
-
fixed={!phone}
|
|
1149
|
-
disableManagement
|
|
1150
|
-
disabled={readOnly}
|
|
1151
|
-
allowed_values={firstArgSchema?.allowed_values}
|
|
1152
|
-
element_allowed_values={firstArgSchema?.element_allowed_values}
|
|
1153
|
-
menuItems={
|
|
1154
|
-
isExpressionServerHandled
|
|
1155
|
-
? undefined
|
|
1156
|
-
: buildCustomTemplateItems(firstArgSchema, (type, removeTemplate) => {
|
|
1157
|
-
removeTemplate?.();
|
|
1158
|
-
updateArg(
|
|
1159
|
-
undefined,
|
|
1160
|
-
0,
|
|
1161
|
-
type.name === 'context' ? undefined : (type.name as string)
|
|
1162
|
-
);
|
|
1163
|
-
})
|
|
1164
|
-
}
|
|
1165
|
-
menuActions={argMenuActions?.[0]}
|
|
1166
|
-
menuTrailingItems={argRemoveMenuItems?.[0]}
|
|
1167
|
-
reorder={props.reorder}
|
|
1168
|
-
expressions={props.expressions as any}
|
|
1169
|
-
expressions_url={expressionsUrl}
|
|
1170
|
-
/>
|
|
1171
|
-
</ExpressionBuilderArgumentWrapper>
|
|
1172
|
-
{firstArgSchema?.label_after && (
|
|
1173
|
-
<ExpressionArgumentDetail label={firstArgSchema.label_after} />
|
|
1174
|
-
)}
|
|
1175
|
-
{selectedExpression
|
|
1176
|
-
? restOfArgs?.map((arg, index) => (
|
|
1177
|
-
<React.Fragment
|
|
1178
|
-
key={`${argsGeneration}-${index}-${arg.ui_type}-${arg.display_name}`}
|
|
1179
|
-
>
|
|
1180
|
-
{arg?.label_before && <ExpressionArgumentDetail label={arg.label_before} />}
|
|
1181
|
-
<ExpressionBuilderArgumentWrapper
|
|
1182
|
-
readOnly={readOnly}
|
|
1183
|
-
expressions={expressions.value}
|
|
1184
|
-
arg={{
|
|
1185
|
-
...rest[index],
|
|
1186
|
-
type: getArgumentType(expressions.value, rest[index], arg),
|
|
1187
|
-
}}
|
|
1188
|
-
schema={arg}
|
|
1189
|
-
onTypeChange={(value) => {
|
|
1190
|
-
updateArg(
|
|
1191
|
-
undefined,
|
|
1192
|
-
index + 1,
|
|
1193
|
-
value === 'context' ? undefined : (value as string)
|
|
1194
|
-
);
|
|
1195
|
-
}}
|
|
1196
|
-
onRemoveArgClick={() => {
|
|
1197
|
-
removeVarArg(index + 1);
|
|
1198
|
-
}}
|
|
1199
|
-
hasMultipleArgs={removeArgInline}
|
|
1200
|
-
fluid={phone}
|
|
1201
|
-
reorder={argReorderSurfaces}
|
|
1202
|
-
argIndex={index + 1}
|
|
1203
|
-
argCount={argCount}
|
|
1204
|
-
dragOver={isDragOverArg(index + 1)}
|
|
1205
|
-
onMoveArg={moveVarArg}
|
|
1206
|
-
onArgDragStart={handleArgDragStart}
|
|
1207
|
-
onArgDragOver={handleArgDragOver}
|
|
1208
|
-
onArgDrop={handleArgDrop}
|
|
1209
|
-
onArgDragEnd={handleArgDragEnd}
|
|
1210
|
-
>
|
|
1211
|
-
<TemplateField
|
|
1212
|
-
minimal
|
|
1213
|
-
component={auto}
|
|
1214
|
-
componentOverrides={componentOverrides}
|
|
1215
|
-
// SEAM (reqraft): same as the first operand above.
|
|
1216
|
-
extraActions={extraActions}
|
|
1217
|
-
level={level + 1}
|
|
1218
|
-
allowFunctions={!arg?.allowed_values && !arg?.element_allowed_values}
|
|
1219
|
-
isFunction={rest[index]?.is_expression}
|
|
1220
|
-
key={`${argsGeneration}-${index}-${arg.ui_type}-${arg.display_name}-${level + 1}`}
|
|
1221
|
-
// An empty argument has no value to take a type from; fall
|
|
1222
|
-
// back to the type the catalogue declares for it, as the
|
|
1223
|
-
// first-argument mount already does. Without this an
|
|
1224
|
-
// empty bool argument rendered as an untyped `auto` field
|
|
1225
|
-
// — a type picker under a label that already said
|
|
1226
|
-
// "true or false" — and an empty `any` argument never
|
|
1227
|
-
// qualified for the template-selector default, because
|
|
1228
|
-
// that rule reads `type`, and `type` was undefined.
|
|
1229
|
-
type={rest[index]?.type ?? arg.ui_type}
|
|
1230
|
-
defaultType={
|
|
1231
|
-
arg.allowed_values || arg.element_allowed_values
|
|
1232
|
-
? arg.ui_type
|
|
1233
|
-
: (rest[index]?.type ?? arg.ui_type)
|
|
1234
|
-
}
|
|
1235
|
-
returnType={types.getAcceptedTypes(arg.ui_type) as any}
|
|
1236
|
-
canBeNull={false}
|
|
1237
|
-
value={rest[index]?.value}
|
|
1238
|
-
templates={localTemplates}
|
|
1239
|
-
allowTemplates={!arg?.allowed_values && !arg?.element_allowed_values}
|
|
1240
|
-
filterTemplatesByType={false}
|
|
1241
|
-
allowCustomValues={
|
|
1242
|
-
!!arg.allowed_values ||
|
|
1243
|
-
!!arg.element_allowed_values ||
|
|
1244
|
-
!!rest[index]?.type ||
|
|
1245
|
-
!!arg.default_value
|
|
1246
|
-
}
|
|
1247
|
-
onChange={((_name, value, type, isFunction) => {
|
|
1248
|
-
updateArg(value, index + 1, isFunction ? undefined : type, isFunction);
|
|
1249
|
-
}) as any}
|
|
1250
|
-
fluid={phone}
|
|
1251
|
-
fixed={!phone}
|
|
1252
|
-
disableManagement
|
|
1253
|
-
disabled={readOnly}
|
|
1254
|
-
menuItems={buildCustomTemplateItems(arg, (type, removeTemplate) => {
|
|
1255
|
-
removeTemplate?.();
|
|
1256
|
-
updateArg(
|
|
1257
|
-
undefined,
|
|
1258
|
-
index + 1,
|
|
1259
|
-
type.name === 'context' ? undefined : (type.name as string)
|
|
1260
|
-
);
|
|
1261
|
-
})}
|
|
1262
|
-
menuActions={argMenuActions?.[index + 1]}
|
|
1263
|
-
menuTrailingItems={argRemoveMenuItems?.[index + 1]}
|
|
1264
|
-
reorder={props.reorder}
|
|
1265
|
-
expressions={props.expressions as any}
|
|
1266
|
-
expressions_url={expressionsUrl}
|
|
1267
|
-
allowed_values={arg?.allowed_values}
|
|
1268
|
-
element_allowed_values={arg?.element_allowed_values}
|
|
1269
|
-
ui_element_type={(arg as any)?.ui_element_type}
|
|
1270
|
-
/>
|
|
1271
|
-
</ExpressionBuilderArgumentWrapper>
|
|
1272
|
-
{arg?.label_after && <ExpressionArgumentDetail label={arg.label_after} />}
|
|
1273
|
-
</React.Fragment>
|
|
1274
|
-
))
|
|
1275
|
-
: null}
|
|
1276
|
-
{canAddArg && (
|
|
1277
|
-
<ExpressionBuilderAddArgumentSlot
|
|
1278
|
-
argumentName={selectedExpression.args[0]?.display_name}
|
|
1279
|
-
disabled={!validateField('expression', value, { expressions: expressions.value })}
|
|
1280
|
-
droppable={isSlotDropTarget}
|
|
1281
|
-
dragOver={isDragOverArg(argCount)}
|
|
1282
|
-
onClick={handleAddArgumentClick}
|
|
1283
|
-
onDragOver={handleSlotDragOver}
|
|
1284
|
-
onDrop={handleSlotDrop}
|
|
1285
|
-
/>
|
|
1286
|
-
)}
|
|
1287
|
-
</ReqoreControlGroup>
|
|
1288
|
-
)}
|
|
1289
|
-
{!isReturnTypeMatching && (
|
|
1290
|
-
<>
|
|
1291
|
-
<ReqoreVerticalSpacer height={5} />
|
|
1292
|
-
<ReqoreTag
|
|
1293
|
-
minimal
|
|
1294
|
-
icon='ErrorWarningLine'
|
|
1295
|
-
intent='danger'
|
|
1296
|
-
size='tiny'
|
|
1297
|
-
wrap
|
|
1298
|
-
label={
|
|
1299
|
-
isConditionType(returnType as string | string[] | undefined) &&
|
|
1300
|
-
!!expressionReturnType &&
|
|
1301
|
-
isTextOrDateType(expressionReturnType)
|
|
1302
|
-
? // a condition that gives text, a date or a time: say how to make it one
|
|
1303
|
-
`A condition can't give ${types.getTypeDisplayName(expressionReturnType)}: compare it explicitly, for example @status == "open" or @note != "".`
|
|
1304
|
-
: `This expression returns ${types.getTypeDisplayName(expressionReturnType) || 'nothing'} but the expected return type is ${expectedReturnTypeText}. Please select an expression that returns ${expectedReturnTypeText} or wrap this expression inside another one that does.`
|
|
1305
|
-
}
|
|
1306
|
-
/>
|
|
1307
|
-
</>
|
|
1308
|
-
)}
|
|
1309
|
-
{selectedExpression && !validationData.isValid ? (
|
|
1310
|
-
<>
|
|
1311
|
-
<ReqoreVerticalSpacer height={5} />
|
|
1312
|
-
<ReqoreTag
|
|
1313
|
-
minimal
|
|
1314
|
-
icon='ErrorWarningLine'
|
|
1315
|
-
intent='danger'
|
|
1316
|
-
size='tiny'
|
|
1317
|
-
wrap
|
|
1318
|
-
label={validationData.reason || 'Expression is not valid for unknown reasons'}
|
|
1319
|
-
/>
|
|
1320
|
-
</>
|
|
1321
|
-
) : null}
|
|
1322
|
-
</ExpressionItem>
|
|
1323
|
-
);
|
|
1324
|
-
};
|
|
1325
|
-
|
|
1326
|
-
export const ExpressionBuilder = ({
|
|
1327
|
-
localTemplates,
|
|
1328
|
-
value = ExpressionDefaultValue,
|
|
1329
|
-
isChild,
|
|
1330
|
-
level = 0,
|
|
1331
|
-
index = 0,
|
|
1332
|
-
path,
|
|
1333
|
-
type,
|
|
1334
|
-
returnType,
|
|
1335
|
-
group,
|
|
1336
|
-
onChange,
|
|
1337
|
-
onValueChange,
|
|
1338
|
-
readOnly,
|
|
1339
|
-
expressions,
|
|
1340
|
-
expressionsUrl,
|
|
1341
|
-
serverHandled,
|
|
1342
|
-
extraActions,
|
|
1343
|
-
componentOverrides,
|
|
1344
|
-
reorder,
|
|
1345
|
-
}: IExpressionBuilderProps) => {
|
|
1346
|
-
const templates = useTemplates(!isChild, localTemplates);
|
|
1347
|
-
/* A builder nested in a group does not resolve templates again: its parent hands it the resolved ones.
|
|
1348
|
-
`useTemplates` gives a nested builder none, and they were what it handed on, so every comparison in
|
|
1349
|
-
an AND/OR group had no templates - its field pickers had nothing to offer and were drawn disabled,
|
|
1350
|
-
and the operands read as read-only. */
|
|
1351
|
-
const resolvedTemplates = isChild ? localTemplates : templates.value;
|
|
1352
|
-
const theme = useReqoreTheme();
|
|
1353
|
-
const [showSummary, setShowSummary] = useState(false);
|
|
1354
|
-
const _expressions = useExpressions({
|
|
1355
|
-
allow: true,
|
|
1356
|
-
expressionsUrl,
|
|
1357
|
-
// SEAM (reqraft): the catalogue is provided whole; override the fetch
|
|
1358
|
-
// (and thread it through the group recursion above) so offline stories /
|
|
1359
|
-
// CI are deterministic.
|
|
1360
|
-
override: expressions,
|
|
1361
|
-
});
|
|
1362
|
-
|
|
1363
|
-
noopUseRegisterHintView('expression_builder', level === 0 && index === 0);
|
|
1364
|
-
|
|
1365
|
-
const handleChange = useCallback(
|
|
1366
|
-
(newValue: IExpression, newPath: string, remove?: boolean) => {
|
|
1367
|
-
if (onChange) {
|
|
1368
|
-
if (!newPath) {
|
|
1369
|
-
onChange(newValue, remove);
|
|
1370
|
-
return;
|
|
1371
|
-
}
|
|
1372
|
-
|
|
1373
|
-
const clonedValue = cloneDeep(value);
|
|
1374
|
-
|
|
1375
|
-
if (remove) {
|
|
1376
|
-
unset(clonedValue, newPath);
|
|
1377
|
-
const pathArray = newPath.split('.');
|
|
1378
|
-
|
|
1379
|
-
pathArray.pop();
|
|
1380
|
-
|
|
1381
|
-
const parentPath = pathArray.join('.');
|
|
1382
|
-
let parent = get(clonedValue, parentPath);
|
|
1383
|
-
|
|
1384
|
-
parent = parent.filter((item: any) => item);
|
|
1385
|
-
|
|
1386
|
-
if (size(parent) === 1) {
|
|
1387
|
-
pathArray.pop();
|
|
1388
|
-
|
|
1389
|
-
const grandParentPath = pathArray.join('.');
|
|
1390
|
-
|
|
1391
|
-
if (grandParentPath === '') {
|
|
1392
|
-
onChange(parent[0].value, remove);
|
|
1393
|
-
return;
|
|
1394
|
-
}
|
|
1395
|
-
|
|
1396
|
-
set(clonedValue, grandParentPath, parent[0].value);
|
|
1397
|
-
} else {
|
|
1398
|
-
set(clonedValue, parentPath, parent);
|
|
1399
|
-
}
|
|
1400
|
-
} else {
|
|
1401
|
-
set(clonedValue, newPath, newValue);
|
|
1402
|
-
}
|
|
1403
|
-
|
|
1404
|
-
onChange(clonedValue, remove && !newPath);
|
|
1405
|
-
} else if (onValueChange) {
|
|
1406
|
-
onValueChange(newValue, newPath, remove);
|
|
1407
|
-
}
|
|
1408
|
-
},
|
|
1409
|
-
[JSON.stringify(value), onChange, onValueChange]
|
|
1410
|
-
);
|
|
1411
|
-
|
|
1412
|
-
if (templates.loading) {
|
|
1413
|
-
return (
|
|
1414
|
-
<ReqoreSpinner type={5} size='normal'>
|
|
1415
|
-
Loading...
|
|
1416
|
-
</ReqoreSpinner>
|
|
1417
|
-
);
|
|
1418
|
-
}
|
|
1419
|
-
|
|
1420
|
-
if (
|
|
1421
|
-
value.is_expression &&
|
|
1422
|
-
value.value &&
|
|
1423
|
-
(value.value?.exp === '&&' || value.value?.exp === '||')
|
|
1424
|
-
) {
|
|
1425
|
-
return (
|
|
1426
|
-
<ReqoreErrorBoundary>
|
|
1427
|
-
<ExpressionItem
|
|
1428
|
-
index={index}
|
|
1429
|
-
as={ReqorePanel}
|
|
1430
|
-
isChild={isChild}
|
|
1431
|
-
isAndOr
|
|
1432
|
-
minimal
|
|
1433
|
-
readOnly={readOnly}
|
|
1434
|
-
size='small'
|
|
1435
|
-
flat
|
|
1436
|
-
customTheme={{
|
|
1437
|
-
main: darken(`0.0${level * 25}`, theme.main) as TReqoreHexColor,
|
|
1438
|
-
}}
|
|
1439
|
-
label={isChild ? (value.value.exp === '||' ? 'OR group' : 'AND group') : 'IF group'}
|
|
1440
|
-
style={{
|
|
1441
|
-
marginLeft: isChild ? 10 : 0,
|
|
1442
|
-
// a nested group too: its indent is taken out of its width, not added past it
|
|
1443
|
-
maxWidth: isChild ? 'calc(100% - 10px)' : undefined,
|
|
1444
|
-
minWidth: 0,
|
|
1445
|
-
}}
|
|
1446
|
-
actions={[
|
|
1447
|
-
{
|
|
1448
|
-
icon: 'AddCircleLine',
|
|
1449
|
-
show: !readOnly,
|
|
1450
|
-
onClick: () => {
|
|
1451
|
-
handleChange(
|
|
1452
|
-
ExpressionDefaultValue,
|
|
1453
|
-
`${path ? `${path}.` : ''}value.args.${size(value.value.args)}`
|
|
1454
|
-
);
|
|
1455
|
-
},
|
|
1456
|
-
tooltip: 'Add condition parameter',
|
|
1457
|
-
},
|
|
1458
|
-
{
|
|
1459
|
-
className: 'expression-explain',
|
|
1460
|
-
label: showSummary ? 'Hide Explanation' : 'Explain',
|
|
1461
|
-
show: level === 0,
|
|
1462
|
-
onClick: () => setShowSummary(!showSummary),
|
|
1463
|
-
icon: 'InformationLine',
|
|
1464
|
-
tooltip: showSummary
|
|
1465
|
-
? 'Hide explanation of this expression'
|
|
1466
|
-
: 'Show explanation of this expression',
|
|
1467
|
-
fixed: true,
|
|
1468
|
-
},
|
|
1469
|
-
]}
|
|
1470
|
-
>
|
|
1471
|
-
<ReqoreControlGroup vertical fluid size='normal' style={{ position: 'relative' }} wrap>
|
|
1472
|
-
{showSummary && (
|
|
1473
|
-
<ExpressionRenderTemplate
|
|
1474
|
-
exp={value}
|
|
1475
|
-
expressions={_expressions.expressions}
|
|
1476
|
-
templates={localTemplates}
|
|
1477
|
-
/>
|
|
1478
|
-
)}
|
|
1479
|
-
<StyledExpressionItemLabel
|
|
1480
|
-
as={ReqoreP}
|
|
1481
|
-
color='transparent'
|
|
1482
|
-
className='expression-operator'
|
|
1483
|
-
></StyledExpressionItemLabel>
|
|
1484
|
-
{value.value.args?.map((arg, index) => (
|
|
1485
|
-
<React.Fragment key={index}>
|
|
1486
|
-
<ExpressionBuilder
|
|
1487
|
-
value={arg}
|
|
1488
|
-
localTemplates={resolvedTemplates}
|
|
1489
|
-
isChild
|
|
1490
|
-
path={`${path ? `${path}.` : ''}value.args.${index}`}
|
|
1491
|
-
level={level + 1}
|
|
1492
|
-
index={index}
|
|
1493
|
-
type={type}
|
|
1494
|
-
onValueChange={handleChange}
|
|
1495
|
-
returnType='bool'
|
|
1496
|
-
group={value.value.exp}
|
|
1497
|
-
readOnly={readOnly}
|
|
1498
|
-
expressions={expressions}
|
|
1499
|
-
expressionsUrl={expressionsUrl}
|
|
1500
|
-
serverHandled={serverHandled}
|
|
1501
|
-
extraActions={extraActions}
|
|
1502
|
-
reorder={reorder}
|
|
1503
|
-
/>
|
|
1504
|
-
{index < size(value.value.args) - 1 && (
|
|
1505
|
-
<ExpressionArgumentDetail
|
|
1506
|
-
label={value.value.exp === '||' ? 'OR' : 'AND'}
|
|
1507
|
-
align='left'
|
|
1508
|
-
style={{
|
|
1509
|
-
marginLeft: 10,
|
|
1510
|
-
}}
|
|
1511
|
-
/>
|
|
1512
|
-
)}
|
|
1513
|
-
</React.Fragment>
|
|
1514
|
-
))}
|
|
1515
|
-
</ReqoreControlGroup>
|
|
1516
|
-
</ExpressionItem>
|
|
1517
|
-
</ReqoreErrorBoundary>
|
|
1518
|
-
);
|
|
1519
|
-
}
|
|
1520
|
-
|
|
1521
|
-
return (
|
|
1522
|
-
<ReqoreErrorBoundary>
|
|
1523
|
-
<Expression
|
|
1524
|
-
localTemplates={resolvedTemplates}
|
|
1525
|
-
value={value}
|
|
1526
|
-
isChild={isChild}
|
|
1527
|
-
type={type}
|
|
1528
|
-
returnType={returnType}
|
|
1529
|
-
level={level}
|
|
1530
|
-
path={path}
|
|
1531
|
-
index={index}
|
|
1532
|
-
onValueChange={handleChange}
|
|
1533
|
-
group={group}
|
|
1534
|
-
readOnly={readOnly}
|
|
1535
|
-
expressions={expressions}
|
|
1536
|
-
expressionsUrl={expressionsUrl}
|
|
1537
|
-
id={level === 0 && index === 0 ? 'expression-builder' : undefined}
|
|
1538
|
-
serverHandled={serverHandled}
|
|
1539
|
-
extraActions={extraActions}
|
|
1540
|
-
componentOverrides={componentOverrides}
|
|
1541
|
-
reorder={reorder}
|
|
1542
|
-
/>
|
|
1543
|
-
</ReqoreErrorBoundary>
|
|
1544
|
-
);
|
|
1545
|
-
};
|