windmill-components 1.309.7 → 1.352.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/assets/app.css +22 -13
- package/package/ata/index.js +1 -0
- package/package/autosize.js +2 -2
- package/package/common.d.ts +14 -2
- package/package/common.js +6 -1
- package/package/components/AllFlowLogs.svelte +30 -0
- package/package/components/AllFlowLogs.svelte.d.ts +18 -0
- package/package/components/ApiConnectForm.svelte +10 -4
- package/package/components/AppConnectDrawer.svelte +74 -0
- package/package/components/AppConnectDrawer.svelte.d.ts +20 -0
- package/package/components/AppConnectInner.svelte +507 -0
- package/package/components/AppConnectInner.svelte.d.ts +28 -0
- package/package/components/ArgEnum.svelte +4 -1
- package/package/components/ArgEnum.svelte.d.ts +3 -1
- package/package/components/ArgInfo.svelte +19 -3
- package/package/components/ArgInput.svelte +222 -122
- package/package/components/ArgInput.svelte.d.ts +11 -7
- package/package/components/ArrayTypeNarrowing.svelte +29 -27
- package/package/components/CenteredPage.svelte +2 -2
- package/package/components/ConcurrentJobsChart.svelte +212 -0
- package/package/components/ConcurrentJobsChart.svelte.d.ts +23 -0
- package/package/components/CustomOauth.svelte +2 -2
- package/package/components/DateInput.svelte +47 -0
- package/package/components/DateInput.svelte.d.ts +24 -0
- package/package/components/DateTimeInput.svelte +25 -3
- package/package/components/DefaultScripts.svelte +5 -8
- package/package/components/DefaultTags.svelte +3 -2
- package/package/components/DefaultTags.svelte.d.ts +3 -1
- package/package/components/DefaultTagsInner.svelte +2 -11
- package/package/components/DefaultTagsInner.svelte.d.ts +3 -1
- package/package/components/Dev.svelte +72 -10
- package/package/components/DiffDrawer.svelte +1 -2
- package/package/components/DiffEditor.svelte +3 -0
- package/package/components/DisplayResult.svelte +467 -344
- package/package/components/DisplayResult.svelte.d.ts +1 -0
- package/package/components/DropdownV2.svelte.d.ts +2 -2
- package/package/components/DurationMs.svelte +11 -3
- package/package/components/DurationMs.svelte.d.ts +2 -0
- package/package/components/EditableSchemaForm.svelte +447 -100
- package/package/components/EditableSchemaForm.svelte.d.ts +16 -6
- package/package/components/Editor.svelte +112 -93
- package/package/components/Editor.svelte.d.ts +4 -2
- package/package/components/EditorBar.svelte +101 -10
- package/package/components/EditorBar.svelte.d.ts +0 -1
- package/package/components/ErrorOrRecoveryHandler.svelte +0 -1
- package/package/components/FlowBuilder.svelte +14 -6
- package/package/components/FlowGraphViewer.svelte +2 -1
- package/package/components/FlowGraphViewerStep.svelte +56 -10
- package/package/components/FlowGraphViewerStep.svelte.d.ts +2 -7
- package/package/components/FlowJobResult.svelte +14 -3
- package/package/components/FlowJobResult.svelte.d.ts +3 -0
- package/package/components/FlowMetadata.svelte +41 -36
- package/package/components/FlowMetadata.svelte.d.ts +3 -1
- package/package/components/FlowPreviewContent.svelte +18 -9
- package/package/components/FlowStatusViewer.svelte +4 -0
- package/package/components/FlowStatusViewer.svelte.d.ts +3 -0
- package/package/components/FlowStatusViewerInner.svelte +96 -19
- package/package/components/FlowStatusViewerInner.svelte.d.ts +3 -0
- package/package/components/FlowTimeline.svelte +13 -0
- package/package/components/FlowTimeline.svelte.d.ts +2 -0
- package/package/components/FlowViewer.svelte +0 -5
- package/package/components/FolderEditor.svelte +25 -0
- package/package/components/FolderEditor.svelte.d.ts +2 -0
- package/package/components/GroupEditor.svelte +36 -91
- package/package/components/GroupInfo.svelte +1 -1
- package/package/components/HighlightCode.svelte +3 -0
- package/package/components/InputTransformForm.svelte +19 -1
- package/package/components/InputTransformForm.svelte.d.ts +2 -0
- package/package/components/InputTransformSchemaForm.svelte +6 -0
- package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
- package/package/components/InstanceSettings.svelte +196 -16
- package/package/components/InstanceSettings.svelte.d.ts +4 -0
- package/package/components/JobLogs.svelte +12 -0
- package/package/components/JobLogs.svelte.d.ts +16 -0
- package/package/components/JobStatus.svelte +3 -3
- package/package/components/Label.svelte +1 -1
- package/package/components/Label.svelte.d.ts +1 -0
- package/package/components/LightweightArgInput.svelte +342 -264
- package/package/components/LightweightArgInput.svelte.d.ts +6 -2
- package/package/components/LightweightResourcePicker.svelte +74 -26
- package/package/components/LightweightSchemaForm.svelte +49 -39
- package/package/components/LogViewer.svelte +52 -15
- package/package/components/LogViewer.svelte.d.ts +1 -0
- package/package/components/Login.svelte +288 -0
- package/package/components/Login.svelte.d.ts +19 -0
- package/package/components/ModulePreviewForm.svelte +4 -0
- package/package/components/NoMainFuncBadge.svelte +8 -0
- package/package/components/NoMainFuncBadge.svelte.d.ts +14 -0
- package/package/components/NumberTypeNarrowing.svelte +71 -44
- package/package/components/OauthExtraParams.svelte +1 -1
- package/package/components/OauthScopes.svelte +1 -1
- package/package/components/ObjectResourceInput.svelte +2 -0
- package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
- package/package/components/ObjectStoreConfigSettings.svelte +12 -1
- package/package/components/ObjectStoreConfigSettings.svelte.d.ts +1 -0
- package/package/components/ObjectTypeNarrowing.svelte +0 -1
- package/package/components/ParqetCsvTableRenderer.svelte +181 -0
- package/package/components/ParqetCsvTableRenderer.svelte.d.ts +21 -0
- package/package/components/Password.svelte +1 -0
- package/package/components/Password.svelte.d.ts +2 -0
- package/package/components/PasswordArgInput.svelte +49 -0
- package/package/components/PasswordArgInput.svelte.d.ts +17 -0
- package/package/components/Path.svelte +2 -2
- package/package/components/PersistentScriptDrawer.svelte +6 -3
- package/package/components/QueueMetricsDrawer.svelte +225 -0
- package/package/components/QueueMetricsDrawer.svelte.d.ts +18 -0
- package/package/components/Range.svelte +88 -286
- package/package/components/Range.svelte.d.ts +9 -23
- package/package/components/ResourceEditor.svelte +138 -140
- package/package/components/ResourceEditor.svelte.d.ts +9 -2
- package/package/components/ResourceEditorDrawer.svelte +45 -0
- package/package/components/ResourceEditorDrawer.svelte.d.ts +21 -0
- package/package/components/ResourcePicker.svelte +8 -9
- package/package/components/ResourceTypePicker.svelte +88 -36
- package/package/components/ResultJobLoader.svelte +2 -2
- package/package/components/ResultJobLoader.svelte.d.ts +9 -9
- package/package/components/RunChart.svelte +55 -5
- package/package/components/RunChart.svelte.d.ts +1 -0
- package/package/components/RunForm.svelte +1 -1
- package/package/components/S3FilePicker.svelte +21 -9
- package/package/components/S3FilePicker.svelte.d.ts +2 -0
- package/package/components/SavedInputs.svelte +49 -13
- package/package/components/ScheduleEditorInner.svelte +294 -264
- package/package/components/SchemaForm.svelte +193 -99
- package/package/components/SchemaForm.svelte.d.ts +17 -2
- package/package/components/ScriptBuilder.svelte +23 -14
- package/package/components/ScriptEditor.svelte +1 -2
- package/package/components/ScriptEditor.svelte.d.ts +1 -1
- package/package/components/ScriptSchedules.svelte +11 -8
- package/package/components/ScriptSchema.svelte +3 -21
- package/package/components/ScriptVersionHistory.svelte +1 -1
- package/package/components/SimpleEditor.svelte +4 -1
- package/package/components/StringTypeNarrowing.svelte +229 -167
- package/package/components/StringTypeNarrowing.svelte.d.ts +6 -1
- package/package/components/TemplateEditor.svelte +1 -0
- package/package/components/TestJobLoader.svelte +14 -5
- package/package/components/TestJobLoader.svelte.d.ts +1 -1
- package/package/components/Toggle.svelte +6 -3
- package/package/components/Toggle.svelte.d.ts +1 -0
- package/package/components/Tooltip.svelte +8 -2
- package/package/components/Tooltip.svelte.d.ts +1 -0
- package/package/components/UserSettings.svelte +24 -1
- package/package/components/WorkspaceGroup.svelte +84 -21
- package/package/components/WorkspaceGroup.svelte.d.ts +1 -0
- package/package/components/app_connect.d.ts +7 -0
- package/package/components/app_connect.js +78 -0
- package/package/components/apps/components/buttons/AppButton.svelte +2 -1
- package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
- package/package/components/apps/components/display/AppAlert.svelte +1 -1
- package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
- package/package/components/apps/components/display/AppDisplayComponent.svelte +2 -2
- package/package/components/apps/components/display/AppDownload.svelte +1 -1
- package/package/components/apps/components/display/AppFlowStatusComponent.svelte +13 -70
- package/package/components/apps/components/display/AppFlowStatusComponent.svelte.d.ts +1 -9
- package/package/components/apps/components/display/AppIcon.svelte +1 -1
- package/package/components/apps/components/display/AppJobIdFlowStatus.svelte +23 -10
- package/package/components/apps/components/display/AppJobIdFlowStatus.svelte.d.ts +1 -3
- package/package/components/apps/components/display/AppJobIdLogComponent.svelte +22 -10
- package/package/components/apps/components/display/AppJobIdLogComponent.svelte.d.ts +1 -3
- package/package/components/apps/components/display/AppLogsComponent.svelte +13 -70
- package/package/components/apps/components/display/AppLogsComponent.svelte.d.ts +1 -9
- package/package/components/apps/components/display/AppMap.svelte +3 -2
- package/package/components/apps/components/display/AppMenu.svelte +1 -1
- package/package/components/apps/components/display/AppPdf.svelte +3 -11
- package/package/components/apps/components/display/AppText.svelte +7 -2
- package/package/components/apps/components/display/charts/AppAgCharts.svelte +31 -18
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +32 -30
- package/package/components/apps/components/display/dbtable/InsertRow.svelte +3 -6
- package/package/components/apps/components/display/dbtable/queries/delete.js +1 -1
- package/package/components/apps/components/display/dbtable/queries/insert.js +1 -12
- package/package/components/apps/components/display/dbtable/queries/select.js +1 -1
- package/package/components/apps/components/display/dbtable/queries/update.js +2 -2
- package/package/components/apps/components/display/dbtable/utils.d.ts +0 -1
- package/package/components/apps/components/display/dbtable/utils.js +0 -83
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +75 -44
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte.d.ts +5 -1
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +172 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +27 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte +38 -0
- package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte.d.ts +28 -0
- package/package/components/apps/components/display/table/AppAggridTable.svelte +189 -56
- package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -1
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte +13 -2
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +1 -0
- package/package/components/apps/components/display/table/AppCell.svelte +1 -3
- package/package/components/apps/components/display/table/AppTable.svelte +320 -281
- package/package/components/apps/components/display/table/AppTableFooter.svelte +42 -23
- package/package/components/apps/components/display/table/AppTableFooter.svelte.d.ts +2 -2
- package/package/components/apps/components/display/table/SyncColumnDefs.svelte +119 -0
- package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +21 -0
- package/package/components/apps/components/display/table/theme/windmill-theme.css +656 -0
- package/package/components/apps/components/display/table/utils.js +22 -0
- package/package/components/apps/components/helpers/DebouncedInput.svelte +3 -2
- package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -1
- package/package/components/apps/components/helpers/NonRunnableComponent.svelte +35 -0
- package/package/components/apps/components/helpers/RefreshButton.svelte +30 -12
- package/package/components/apps/components/helpers/RefreshButton.svelte.d.ts +1 -3
- package/package/components/apps/components/helpers/RefreshIndicator.svelte +19 -0
- package/package/components/apps/components/helpers/RefreshIndicator.svelte.d.ts +16 -0
- package/package/components/apps/components/helpers/ResolveConfig.svelte +1 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte +102 -41
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +9 -5
- package/package/components/apps/components/helpers/RunnableWrapper.svelte +9 -1
- package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +6 -0
- package/package/components/apps/components/helpers/eval.js +1 -36
- package/package/components/apps/components/inputs/AppDateInput.svelte +5 -1
- package/package/components/apps/components/inputs/AppFileInput.svelte +13 -2
- package/package/components/apps/components/inputs/AppFileInput.svelte.d.ts +1 -0
- package/package/components/apps/components/inputs/AppMultiSelect.svelte +56 -50
- package/package/components/apps/components/inputs/AppMultiSelect.svelte.d.ts +1 -0
- package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +178 -0
- package/package/components/apps/components/inputs/AppMultiSelectV2.svelte.d.ts +24 -0
- package/package/components/apps/components/inputs/AppNumberInput.svelte +1 -1
- package/package/components/apps/components/inputs/AppQuillEditor.svelte +26 -0
- package/package/components/apps/components/inputs/AppRangeInput.svelte +38 -37
- package/package/components/apps/components/inputs/AppS3FileInput.svelte +3 -1
- package/package/components/apps/components/inputs/AppS3FileInput.svelte.d.ts +1 -0
- package/package/components/apps/components/inputs/AppSelect.svelte +21 -10
- package/package/components/apps/components/inputs/AppSliderInputs.svelte +26 -31
- package/package/components/apps/components/inputs/AppTextInput.svelte +1 -1
- package/package/components/apps/components/inputs/currency/AppCurrencyInput.svelte +1 -1
- package/package/components/apps/components/layout/AppConditionalWrapper.svelte +10 -3
- package/package/components/apps/components/layout/AppConditionalWrapper.svelte.d.ts +1 -0
- package/package/components/apps/components/layout/AppContainer.svelte +1 -1
- package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
- package/package/components/apps/components/layout/AppDrawer.svelte +16 -3
- package/package/components/apps/components/layout/AppDrawer.svelte.d.ts +2 -0
- package/package/components/apps/components/layout/AppModal.svelte +85 -79
- package/package/components/apps/components/layout/AppModal.svelte.d.ts +2 -0
- package/package/components/apps/components/layout/AppStepper.svelte +7 -2
- package/package/components/apps/components/layout/AppStepper.svelte.d.ts +2 -0
- package/package/components/apps/components/layout/AppTabs.svelte +4 -2
- package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
- package/package/components/apps/editor/AppEditor.svelte +3 -2
- package/package/components/apps/editor/AppEditorHeader.svelte +68 -38
- package/package/components/apps/editor/AppInputs.svelte +1 -1
- package/package/components/apps/editor/AppPreview.svelte +18 -7
- package/package/components/apps/editor/ComponentHeader.svelte +37 -1
- package/package/components/apps/editor/ComponentHeader.svelte.d.ts +2 -0
- package/package/components/apps/editor/GridEditor.svelte +15 -6
- package/package/components/apps/editor/GridEditorMenu.svelte +120 -49
- package/package/components/apps/editor/GridViewer.svelte +14 -5
- package/package/components/apps/editor/GridViewer.svelte.d.ts +5 -1
- package/package/components/apps/editor/RecomputeAllComponents.svelte +17 -3
- package/package/components/apps/editor/RunnableJobPanel.svelte +9 -5
- package/package/components/apps/editor/SettingsPanel.svelte +19 -5
- package/package/components/apps/editor/SubGridEditor.svelte +44 -27
- package/package/components/apps/editor/appUtils.d.ts +6 -1
- package/package/components/apps/editor/appUtils.js +85 -7
- package/package/components/apps/editor/component/Component.svelte +86 -18
- package/package/components/apps/editor/component/Component.svelte.d.ts +3 -0
- package/package/components/apps/editor/component/components.d.ts +285 -23
- package/package/components/apps/editor/component/components.js +178 -13
- package/package/components/apps/editor/component/default-codes.d.ts +1 -1
- package/package/components/apps/editor/component/default-codes.js +241 -9
- package/package/components/apps/editor/component/sets.d.ts +3 -0
- package/package/components/apps/editor/component/sets.js +12 -2
- package/package/components/apps/editor/componentsPanel/ComponentList.svelte +15 -2
- package/package/components/apps/editor/componentsPanel/componentControlUtils.js +4 -2
- package/package/components/apps/editor/componentsPanel/cssUtils.js +1 -1
- package/package/components/apps/editor/componentsPanel/quickStyleProperties.js +5 -0
- package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +9 -5
- package/package/components/apps/editor/contextPanel/components/TableActionsOutput.svelte +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +46 -6
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelWithTable.svelte +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/utils.js +3 -1
- package/package/components/apps/editor/settingsPanel/AlignmentEditor.svelte +1 -1
- package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +5 -34
- package/package/components/apps/editor/settingsPanel/ComponentControl.svelte +1 -1
- package/package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +8 -5
- package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +41 -29
- package/package/components/apps/editor/settingsPanel/ContextVariables.svelte +61 -0
- package/package/components/apps/editor/settingsPanel/ContextVariables.svelte.d.ts +16 -0
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +12 -10
- package/package/components/apps/editor/settingsPanel/DeleteComponent.svelte +29 -32
- package/package/components/apps/editor/settingsPanel/DeleteComponent.svelte.d.ts +0 -5
- package/package/components/apps/editor/settingsPanel/EventHandlerItem.svelte +33 -0
- package/package/components/apps/editor/settingsPanel/EventHandlerItem.svelte.d.ts +19 -0
- package/package/components/apps/editor/settingsPanel/EventHandlers.svelte +103 -0
- package/package/components/apps/editor/settingsPanel/EventHandlers.svelte.d.ts +18 -0
- package/package/components/apps/editor/settingsPanel/GridCondition.svelte +14 -36
- package/package/components/apps/editor/settingsPanel/GridTab.svelte +4 -24
- package/package/components/apps/editor/settingsPanel/GridTabDisabled.svelte +2 -1
- package/package/components/apps/editor/settingsPanel/GridTabDisabled.svelte.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +24 -3
- package/package/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte +32 -2
- package/package/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte.d.ts +1 -0
- package/package/components/apps/editor/settingsPanel/StylePanel.svelte +4 -3
- package/package/components/apps/editor/settingsPanel/SubTypeEditor.svelte +0 -2
- package/package/components/apps/editor/settingsPanel/SubTypeEditor.svelte.d.ts +0 -1
- package/package/components/apps/editor/settingsPanel/inputEditor/ColorInput.svelte +3 -2
- package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +8 -1
- package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +7 -14
- package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte.d.ts +0 -1
- package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +4 -4
- package/package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte +6 -3
- package/package/components/apps/inputType.d.ts +4 -0
- package/package/components/apps/rx.d.ts +1 -1
- package/package/components/apps/rx.js +7 -0
- package/package/components/apps/svelte-grid/Grid.svelte +13 -4
- package/package/components/apps/svelte-grid/Grid.svelte.d.ts +2 -1
- package/package/components/apps/svelte-grid/types.d.ts +1 -0
- package/package/components/apps/svelte-grid/utils/helper.js +1 -0
- package/package/components/apps/svelte-grid/utils/overlap.d.ts +3 -0
- package/package/components/apps/svelte-grid/utils/overlap.js +21 -0
- package/package/components/apps/svelte-select/lib/Select.svelte.d.ts +2 -2
- package/package/components/apps/svelte-select/lib/tailwind.css +1 -1
- package/package/components/apps/types.d.ts +1 -0
- package/package/components/apps/utils.js +13 -3
- package/package/components/auditLogs/AuditLogsTable.svelte +5 -2
- package/package/components/build_workers.js +1 -0
- package/package/components/common/alert/Alert.svelte +17 -17
- package/package/components/common/badge/Badge.svelte +6 -3
- package/package/components/common/badge/model.d.ts +1 -1
- package/package/components/common/button/Button.svelte +22 -14
- package/package/components/common/button/ButtonDropdown.svelte +1 -0
- package/package/components/common/calendarPicker/CalendarPicker.svelte +2 -0
- package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +1 -0
- package/package/components/common/drawer/ConditionalPortal.svelte +9 -0
- package/package/components/common/drawer/ConditionalPortal.svelte.d.ts +18 -0
- package/package/components/common/drawer/Disposable.svelte +67 -0
- package/package/components/common/drawer/Disposable.svelte.d.ts +37 -0
- package/package/components/common/drawer/Drawer.svelte +40 -56
- package/package/components/common/drawer/Drawer.svelte.d.ts +2 -1
- package/package/components/common/fileDownload/FileDownload.svelte +4 -2
- package/package/components/common/fileInput/FileInput.svelte +3 -3
- package/package/components/common/fileInput/FileInput.svelte.d.ts +1 -0
- package/package/components/common/fileUpload/FileUpload.svelte +5 -4
- package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
- package/package/components/common/modal/Modal.svelte +4 -1
- package/package/components/common/modal/Modal.svelte.d.ts +1 -0
- package/package/components/common/popup/Popup.svelte +1 -1
- package/package/components/common/table/RowIcon.svelte +4 -4
- package/package/components/common/table/ScriptRow.svelte +12 -1
- package/package/components/common/table/ScriptRow.svelte.d.ts +1 -0
- package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +4 -1
- package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
- package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +45 -0
- package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +24 -0
- package/package/components/common/waitTimeWarning/WaitTimeWarning.svelte +79 -0
- package/package/components/common/waitTimeWarning/WaitTimeWarning.svelte.d.ts +18 -0
- package/package/components/copilot/CronGen.svelte +2 -2
- package/package/components/copilot/FlowCopilotStatus.svelte +1 -1
- package/package/components/copilot/RegexGen.svelte +17 -39
- package/package/components/copilot/ScriptGen.svelte +14 -5
- package/package/components/copilot/StepInputGen.svelte +2 -1
- package/package/components/copilot/StepInputsGen.svelte +2 -1
- package/package/components/copilot/completion.js +60 -9
- package/package/components/copilot/lib.js +5 -3
- package/package/components/copilot/prompts/edit.yaml +24 -0
- package/package/components/copilot/prompts/editPrompt.d.ts +3 -0
- package/package/components/copilot/prompts/editPrompt.js +3 -0
- package/package/components/copilot/prompts/fix.yaml +25 -0
- package/package/components/copilot/prompts/fixPrompt.d.ts +3 -0
- package/package/components/copilot/prompts/fixPrompt.js +3 -0
- package/package/components/copilot/prompts/gen.yaml +20 -0
- package/package/components/copilot/prompts/genPrompt.d.ts +3 -0
- package/package/components/copilot/prompts/genPrompt.js +3 -0
- package/package/components/copilot/utils.d.ts +2 -1
- package/package/components/copilot/utils.js +38 -0
- package/package/components/details/createAppFromScript.d.ts +26 -0
- package/package/components/details/createAppFromScript.js +50 -24
- package/package/components/flows/CreateActionsApp.svelte +1 -0
- package/package/components/flows/CreateActionsFlow.svelte +1 -0
- package/package/components/flows/content/FlowEditorPanel.svelte +16 -2
- package/package/components/flows/content/FlowInput.svelte +63 -53
- package/package/components/flows/content/FlowInputs.svelte +2 -2
- package/package/components/flows/content/FlowModuleComponent.svelte +41 -9
- package/package/components/flows/content/FlowModuleScript.svelte +40 -1
- package/package/components/flows/content/FlowModuleScript.svelte.d.ts +2 -0
- package/package/components/flows/content/FlowModuleSuspend.svelte +99 -59
- package/package/components/flows/content/FlowModuleWrapper.svelte +16 -1
- package/package/components/flows/content/FlowSchedules.svelte +11 -8
- package/package/components/flows/content/ScriptEditorDrawer.svelte +6 -6
- package/package/components/flows/flowExplorer.js +4 -1
- package/package/components/flows/flowStateUtils.js +4 -1
- package/package/components/flows/map/FlowConstantsItem.svelte +1 -1
- package/package/components/flows/map/FlowErrorHandlerItem.svelte +1 -1
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +19 -1
- package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +6 -1
- package/package/components/flows/map/FlowSettingsItem.svelte +1 -1
- package/package/components/flows/map/MapItem.svelte +2 -0
- package/package/components/flows/map/MapItem.svelte.d.ts +1 -0
- package/package/components/flows/types.d.ts +4 -0
- package/package/components/flows/utils.d.ts +5 -1
- package/package/components/flows/utils.js +36 -0
- package/package/components/graph/FlowGraph.svelte +6 -2
- package/package/components/graph/FlowGraph.svelte.d.ts +2 -0
- package/package/components/graph/svelvet/container/models/index.d.ts +0 -5
- package/package/components/graph/svelvet/container/models/index.js +1 -1
- package/package/components/graph/svelvet/container/views/Svelvet.svelte +2 -5
- package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte +41 -16
- package/package/components/graph/util.d.ts +1 -37
- package/package/components/graph/util.js +0 -34
- package/package/components/home/ItemsList.svelte +44 -9
- package/package/components/home/TreeView.svelte +2 -0
- package/package/components/icons/AzureIcon.svelte +25 -1
- package/package/components/icons/PHPIcon.svelte +117 -0
- package/package/components/icons/PHPIcon.svelte.d.ts +17 -0
- package/package/components/instanceSettings.d.ts +1 -1
- package/package/components/instanceSettings.js +20 -3
- package/package/components/jobs/JobPreview.svelte +6 -1
- package/package/components/multiselect/MultiSelect.svelte +783 -0
- package/package/components/multiselect/MultiSelect.svelte.d.ts +98 -0
- package/package/components/multiselect/MultiSelectWrapper.svelte +89 -0
- package/package/components/multiselect/MultiSelectWrapper.svelte.d.ts +20 -0
- package/package/components/multiselect/types.d.ts +56 -0
- package/package/components/multiselect/types.js +1 -0
- package/package/components/multiselect/utils.d.ts +7 -0
- package/package/components/multiselect/utils.js +54 -0
- package/package/components/propertyPicker/ObjectViewer.svelte +19 -2
- package/package/components/runs/JobLoader.svelte +135 -17
- package/package/components/runs/JobLoader.svelte.d.ts +7 -2
- package/package/components/runs/JobPreview.svelte +44 -4
- package/package/components/runs/JobPreview.svelte.d.ts +2 -0
- package/package/components/runs/RunRow.svelte +99 -33
- package/package/components/runs/RunRow.svelte.d.ts +5 -1
- package/package/components/runs/RunsFilter.svelte +125 -9
- package/package/components/runs/RunsFilter.svelte.d.ts +4 -2
- package/package/components/runs/RunsTable.svelte +71 -10
- package/package/components/runs/RunsTable.svelte.d.ts +8 -1
- package/package/components/schema/AddProperty.svelte +149 -0
- package/package/components/schema/AddProperty.svelte.d.ts +23 -0
- package/package/components/schema/AddPropertyForm.svelte +33 -0
- package/package/components/schema/AddPropertyForm.svelte.d.ts +16 -0
- package/package/components/schema/EditableSchemaDrawer.svelte +198 -0
- package/package/components/schema/EditableSchemaDrawer.svelte.d.ts +21 -0
- package/package/components/schema/EditableSchemaWrapper.svelte +31 -0
- package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +22 -0
- package/package/components/schema/FlowPropertyEditor.svelte +393 -0
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +47 -0
- package/package/components/schema/PropertyEditor.svelte +185 -0
- package/package/components/schema/PropertyEditor.svelte.d.ts +46 -0
- package/package/components/schema/SchemaFormDND.svelte +75 -0
- package/package/components/schema/SchemaFormDND.svelte.d.ts +28 -0
- package/package/components/scriptEditor/LogPanel.svelte +46 -33
- package/package/components/scriptEditor/LogPanel.svelte.d.ts +1 -0
- package/package/components/scripts/CreateActionsScript.svelte +1 -1
- package/package/components/settings/WorkspaceUserSettings.svelte +246 -226
- package/package/components/sidebar/MenuButton.svelte +1 -1
- package/package/components/sidebar/MenuLink.svelte +1 -1
- package/package/components/sidebar/changelogs.js +40 -0
- package/package/components/table/AutoDataTable.svelte +124 -163
- package/package/components/table/Cell.svelte +4 -1
- package/package/components/table/Cell.svelte.d.ts +1 -0
- package/package/components/table/DataTable.svelte +13 -5
- package/package/components/table/DataTable.svelte.d.ts +1 -0
- package/package/components/table/DownloadCsv.svelte +30 -0
- package/package/components/table/DownloadCsv.svelte.d.ts +17 -0
- package/package/components/table/tableUtils.d.ts +8 -0
- package/package/components/table/tableUtils.js +37 -0
- package/package/components/vscode.js +1 -1
- package/package/components/wizards/AgGridWizard.svelte +27 -2
- package/package/components/wizards/AgGridWizard.svelte.d.ts +1 -0
- package/package/consts.js +7 -1
- package/package/defaults.d.ts +2 -2
- package/package/defaults.js +2 -2
- package/package/deno_fetch.d.ts.txt +36 -0
- package/package/editorUtils.js +2 -0
- package/package/gen/core/OpenAPI.js +5 -6
- package/package/gen/core/request.js +4 -1
- package/package/gen/index.d.ts +0 -1
- package/package/gen/index.js +0 -1
- package/package/gen/schemas.gen.d.ts +173 -428
- package/package/gen/schemas.gen.js +173 -433
- package/package/gen/services.gen.d.ts +3182 -1840
- package/package/gen/services.gen.js +3652 -2368
- package/package/gen/types.gen.d.ts +5445 -1529
- package/package/infer.d.ts +1 -1
- package/package/infer.js +6 -2
- package/package/inferArgSig.d.ts +10 -0
- package/package/inferArgSig.js +64 -4
- package/package/init_scripts/python_init_code.d.ts +1 -1
- package/package/init_scripts/python_init_code.js +1 -1
- package/package/process.d.ts.txt +1770 -0
- package/package/script_helpers.d.ts +3 -2
- package/package/script_helpers.js +28 -3
- package/package/scripts.d.ts +3 -1
- package/package/scripts.js +10 -3
- package/package/utils.d.ts +5 -1
- package/package/utils.js +53 -5
- package/package/windmill_fetch.d.ts.txt +16966 -0
- package/package/workspace_settings.d.ts +15 -0
- package/package/workspace_settings.js +81 -0
- package/package/zIndexes.d.ts +12 -0
- package/package/zIndexes.js +12 -0
- package/package.json +19 -10
- package/package/components/AppConnect.svelte +0 -566
- package/package/components/AppConnect.svelte.d.ts +0 -23
- package/package/components/ContextMenu.svelte +0 -89
- package/package/components/ContextMenu.svelte.d.ts +0 -28
- package/package/components/ParqetTableRenderer.svelte +0 -121
- package/package/components/ParqetTableRenderer.svelte.d.ts +0 -18
- package/package/components/PropertyRow.svelte +0 -80
- package/package/components/PropertyRow.svelte.d.ts +0 -23
- package/package/components/SchemaEditor.svelte +0 -344
- package/package/components/SchemaEditor.svelte.d.ts +0 -23
- package/package/components/SchemaModal.svelte +0 -350
- package/package/components/SchemaModal.svelte.d.ts +0 -31
- package/package/components/apps/components/display/index.d.ts +0 -17
- package/package/components/apps/components/display/index.js +0 -17
- package/package/components/apps/components/helpers/index.d.ts +0 -10
- package/package/components/apps/components/helpers/index.js +0 -10
- package/package/components/apps/components/index.d.ts +0 -5
- package/package/components/apps/components/index.js +0 -5
- package/package/components/apps/editor/settingsPanel/Recompute.svelte +0 -55
- package/package/components/apps/editor/settingsPanel/Recompute.svelte.d.ts +0 -20
|
@@ -0,0 +1,783 @@
|
|
|
1
|
+
<script>import { createEventDispatcher, tick } from 'svelte';
|
|
2
|
+
import { flip } from 'svelte/animate';
|
|
3
|
+
import VirtualList from 'svelte-tiny-virtual-list';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { get_label, get_style, scroll_into_view_if_needed_polyfill } from './utils';
|
|
6
|
+
import { ChevronsUpDown, X } from 'lucide-svelte';
|
|
7
|
+
export let activeIndex = null;
|
|
8
|
+
export let activeOption = null;
|
|
9
|
+
export let createOptionMsg = `Create this option...`;
|
|
10
|
+
export let allowUserOptions = false;
|
|
11
|
+
export let autocomplete = `off`;
|
|
12
|
+
export let autoScroll = true;
|
|
13
|
+
export let breakpoint = 800; // any screen with more horizontal pixels is considered desktop, below is mobile
|
|
14
|
+
export let defaultDisabledTitle = `This option is disabled`;
|
|
15
|
+
export let disabled = false;
|
|
16
|
+
export let disabledInputTitle = `This input is disabled`;
|
|
17
|
+
// prettier-ignore
|
|
18
|
+
export let duplicateOptionMsg = `This option is already selected`;
|
|
19
|
+
export let duplicates = false; // whether to allow duplicate options
|
|
20
|
+
// takes two options and returns true if they are equal
|
|
21
|
+
// case-insensitive equality comparison after string coercion and looks only at the `label` key of object options by default
|
|
22
|
+
export let key = (opt) => `${get_label(opt)}`.toLowerCase();
|
|
23
|
+
export let filterFunc = (opt, searchText) => {
|
|
24
|
+
if (!searchText)
|
|
25
|
+
return true;
|
|
26
|
+
return `${get_label(opt)}`.toLowerCase().includes(searchText.toLowerCase());
|
|
27
|
+
};
|
|
28
|
+
export let closeDropdownOnSelect = `desktop`;
|
|
29
|
+
export let form_input = null;
|
|
30
|
+
export let highlightMatches = true;
|
|
31
|
+
export let id = null;
|
|
32
|
+
export let input = null;
|
|
33
|
+
export let inputClass = ``;
|
|
34
|
+
export let inputStyle = null;
|
|
35
|
+
export let inputmode = null;
|
|
36
|
+
export let invalid = false;
|
|
37
|
+
export let liSelectedClass = ``;
|
|
38
|
+
export let liSelectedStyle = null;
|
|
39
|
+
export let loading = false;
|
|
40
|
+
export let matchingOptions = [];
|
|
41
|
+
export let maxSelect = null; // null means there is no upper limit for selected.length
|
|
42
|
+
export let name = null;
|
|
43
|
+
export let noMatchingOptionsMsg = `No matching options`;
|
|
44
|
+
export let open = false;
|
|
45
|
+
export let options;
|
|
46
|
+
export let outerDiv = null;
|
|
47
|
+
export let outerDivClass = ``;
|
|
48
|
+
export let parseLabelsAsHtml = false; // should not be combined with allowUserOptions!
|
|
49
|
+
export let pattern = null;
|
|
50
|
+
export let placeholder = null;
|
|
51
|
+
export let removeAllTitle = `Remove all`;
|
|
52
|
+
export let removeBtnTitle = `Remove`;
|
|
53
|
+
export let minSelect = null; // null means there is no lower limit for selected.length
|
|
54
|
+
export let required = false;
|
|
55
|
+
export let resetFilterOnAdd = true;
|
|
56
|
+
export let searchText = ``;
|
|
57
|
+
export let selected = options
|
|
58
|
+
?.filter((opt) => opt instanceof Object && opt?.preselected)
|
|
59
|
+
.slice(0, maxSelect ?? undefined) ?? []; // don't allow more than maxSelect preselected options
|
|
60
|
+
export let sortSelected = false;
|
|
61
|
+
export let selectedOptionsDraggable = !sortSelected;
|
|
62
|
+
export let style = null;
|
|
63
|
+
export let ulSelectedClass = ``;
|
|
64
|
+
export let ulSelectedStyle = null;
|
|
65
|
+
export let value = null;
|
|
66
|
+
export let disableRemoveAll = false;
|
|
67
|
+
const selected_to_value = (selected) => {
|
|
68
|
+
value = maxSelect === 1 ? selected[0] ?? null : selected;
|
|
69
|
+
};
|
|
70
|
+
const value_to_selected = (value) => {
|
|
71
|
+
if (maxSelect === 1)
|
|
72
|
+
selected = value ? [value] : [];
|
|
73
|
+
else
|
|
74
|
+
selected = value ?? [];
|
|
75
|
+
};
|
|
76
|
+
// if maxSelect=1, value is the single item in selected (or null if selected is empty)
|
|
77
|
+
// this solves both https://github.com/janosh/svelte-multiselect/issues/86 and
|
|
78
|
+
// https://github.com/janosh/svelte-multiselect/issues/136
|
|
79
|
+
$: selected_to_value(selected);
|
|
80
|
+
$: value_to_selected(value);
|
|
81
|
+
const dispatch = createEventDispatcher();
|
|
82
|
+
let option_msg_is_active = false; // controls active state of <li>{createOptionMsg}</li>
|
|
83
|
+
let window_width;
|
|
84
|
+
// options matching the current search text
|
|
85
|
+
$: matchingOptions = options?.filter((opt) => filterFunc(opt, searchText) &&
|
|
86
|
+
// remove already selected options from dropdown list unless duplicate selections are allowed
|
|
87
|
+
(!selected.map(key).includes(key(opt)) || duplicates));
|
|
88
|
+
// raise if matchingOptions[activeIndex] does not yield a value
|
|
89
|
+
if (activeIndex !== null && !matchingOptions[activeIndex]) {
|
|
90
|
+
throw `Run time error, activeIndex=${activeIndex} is out of bounds, matchingOptions.length=${matchingOptions.length}`;
|
|
91
|
+
}
|
|
92
|
+
// update activeOption when activeIndex changes
|
|
93
|
+
$: activeOption = matchingOptions?.[activeIndex ?? -1] ?? null;
|
|
94
|
+
// add an option to selected list
|
|
95
|
+
function add(option, event) {
|
|
96
|
+
if (maxSelect && maxSelect > 1 && selected.length >= maxSelect) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (!isNaN(Number(option)) && typeof selected.map(get_label)[0] === `number`) {
|
|
100
|
+
option = Number(option); // convert to number if possible
|
|
101
|
+
}
|
|
102
|
+
const is_duplicate = selected.map(key).includes(key(option));
|
|
103
|
+
if ((maxSelect === null || maxSelect === 1 || selected.length < maxSelect) &&
|
|
104
|
+
(duplicates || !is_duplicate)) {
|
|
105
|
+
if (
|
|
106
|
+
// @ts-ignore
|
|
107
|
+
!options.includes(option) && // first check if we find option in the options list
|
|
108
|
+
// this has the side-effect of not allowing to user to add the same
|
|
109
|
+
// custom option twice in append mode
|
|
110
|
+
[true, `append`].includes(allowUserOptions) &&
|
|
111
|
+
searchText.length > 0) {
|
|
112
|
+
// user entered text but no options match, so if allowUserOptions = true | 'append', we create
|
|
113
|
+
// a new option from the user-entered text
|
|
114
|
+
if (typeof options[0] === `object`) {
|
|
115
|
+
// if 1st option is an object, we create new option as object to keep type homogeneity
|
|
116
|
+
option = { label: searchText };
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
if ([`number`, `undefined`].includes(typeof options[0]) && !isNaN(Number(searchText))) {
|
|
120
|
+
// create new option as number if it parses to a number and 1st option is also number or missing
|
|
121
|
+
option = Number(searchText);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
option = searchText; // else create custom option as string
|
|
125
|
+
}
|
|
126
|
+
// @ts-ignore
|
|
127
|
+
dispatch(`create`, { option });
|
|
128
|
+
}
|
|
129
|
+
// @ts-ignore
|
|
130
|
+
if (allowUserOptions === `append`)
|
|
131
|
+
options = [...options, option];
|
|
132
|
+
}
|
|
133
|
+
if (resetFilterOnAdd)
|
|
134
|
+
searchText = ``; // reset search string on selection
|
|
135
|
+
if ([``, undefined, null].includes(option)) {
|
|
136
|
+
console.error(`MultiSelect: encountered falsy option ${option}`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (maxSelect === 1) {
|
|
140
|
+
// for maxSelect = 1 we always replace current option with new one
|
|
141
|
+
// @ts-ignore
|
|
142
|
+
selected = [option];
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// @ts-ignore
|
|
146
|
+
selected = [...selected, option];
|
|
147
|
+
if (sortSelected === true) {
|
|
148
|
+
selected = selected.sort((op1, op2) => {
|
|
149
|
+
const [label1, label2] = [get_label(op1), get_label(op2)];
|
|
150
|
+
// coerce to string if labels are numbers
|
|
151
|
+
return `${label1}`.localeCompare(`${label2}`);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else if (typeof sortSelected === `function`) {
|
|
155
|
+
selected = selected.sort(sortSelected);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const reached_max_select = selected.length === maxSelect;
|
|
159
|
+
const dropdown_should_close = closeDropdownOnSelect === true ||
|
|
160
|
+
(closeDropdownOnSelect === `desktop` && window_width < breakpoint);
|
|
161
|
+
if (reached_max_select || dropdown_should_close) {
|
|
162
|
+
close_dropdown(event);
|
|
163
|
+
}
|
|
164
|
+
else if (!dropdown_should_close) {
|
|
165
|
+
input?.focus();
|
|
166
|
+
}
|
|
167
|
+
// @ts-ignore
|
|
168
|
+
dispatch(`add`, { option });
|
|
169
|
+
// @ts-ignore
|
|
170
|
+
dispatch(`change`, { option, type: `add` });
|
|
171
|
+
invalid = false; // reset error status whenever new items are selected
|
|
172
|
+
form_input?.setCustomValidity(``);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// remove an option from selected list
|
|
176
|
+
function remove(to_remove) {
|
|
177
|
+
if (selected.length === 0)
|
|
178
|
+
return;
|
|
179
|
+
const idx = selected.findIndex((opt) => key(opt) === key(to_remove));
|
|
180
|
+
let [option] = selected.splice(idx, 1); // remove option from selected list
|
|
181
|
+
if (option === undefined && allowUserOptions) {
|
|
182
|
+
// if option with label could not be found but allowUserOptions is truthy,
|
|
183
|
+
// assume it was created by user and create corresponding option object
|
|
184
|
+
// on the fly for use as event payload
|
|
185
|
+
const other_ops_type = typeof options[0];
|
|
186
|
+
option = (other_ops_type ? { label: to_remove } : to_remove);
|
|
187
|
+
}
|
|
188
|
+
if (option === undefined) {
|
|
189
|
+
return console.error(`Multiselect can't remove selected option ${JSON.stringify(to_remove)}, not found in selected list`);
|
|
190
|
+
}
|
|
191
|
+
selected = [...selected]; // trigger Svelte rerender
|
|
192
|
+
invalid = false; // reset error status whenever items are removed
|
|
193
|
+
form_input?.setCustomValidity(``);
|
|
194
|
+
dispatch(`remove`, { option });
|
|
195
|
+
dispatch(`change`, { option, type: `remove` });
|
|
196
|
+
}
|
|
197
|
+
function open_dropdown(event) {
|
|
198
|
+
if (disabled)
|
|
199
|
+
return;
|
|
200
|
+
open = true;
|
|
201
|
+
if (!(event instanceof FocusEvent)) {
|
|
202
|
+
// avoid double-focussing input when event that opened dropdown was already input FocusEvent
|
|
203
|
+
input?.focus();
|
|
204
|
+
}
|
|
205
|
+
dispatch(`open`, { event });
|
|
206
|
+
}
|
|
207
|
+
function close_dropdown(event) {
|
|
208
|
+
open = false;
|
|
209
|
+
input?.blur();
|
|
210
|
+
activeIndex = null;
|
|
211
|
+
dispatch(`close`, { event });
|
|
212
|
+
}
|
|
213
|
+
// handle all keyboard events this component receives
|
|
214
|
+
async function handle_keydown(event) {
|
|
215
|
+
// on escape or tab out of input: close options dropdown and reset search text
|
|
216
|
+
if (event.key === `Escape` || event.key === `Tab`) {
|
|
217
|
+
close_dropdown(event);
|
|
218
|
+
searchText = ``;
|
|
219
|
+
}
|
|
220
|
+
// on enter key: toggle active option and reset search text
|
|
221
|
+
else if (event.key === `Enter`) {
|
|
222
|
+
event.preventDefault(); // prevent enter key from triggering form submission
|
|
223
|
+
if (activeOption) {
|
|
224
|
+
selected.includes(activeOption) ? remove(activeOption) : add(activeOption, event);
|
|
225
|
+
searchText = ``;
|
|
226
|
+
}
|
|
227
|
+
else if (allowUserOptions && searchText.length > 0) {
|
|
228
|
+
// user entered text but no options match, so if allowUserOptions is truthy, we create new option
|
|
229
|
+
add(searchText, event);
|
|
230
|
+
}
|
|
231
|
+
// no active option and no search text means the options dropdown is closed
|
|
232
|
+
// in which case enter means open it
|
|
233
|
+
else
|
|
234
|
+
open_dropdown(event);
|
|
235
|
+
}
|
|
236
|
+
// on up/down arrow keys: update active option
|
|
237
|
+
else if ([`ArrowDown`, `ArrowUp`].includes(event.key)) {
|
|
238
|
+
// if no option is active yet, but there are matching options, make first one active
|
|
239
|
+
if (activeIndex === null && matchingOptions.length > 0) {
|
|
240
|
+
activeIndex = 0;
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
else if (allowUserOptions && !matchingOptions.length && searchText.length > 0) {
|
|
244
|
+
// if allowUserOptions is truthy and user entered text but no options match, we make
|
|
245
|
+
// <li>{addUserMsg}</li> active on keydown (or toggle it if already active)
|
|
246
|
+
option_msg_is_active = !option_msg_is_active;
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
else if (activeIndex === null) {
|
|
250
|
+
// if no option is active and no options are matching, do nothing
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
event.preventDefault();
|
|
254
|
+
// if none of the above special cases apply, we make next/prev option
|
|
255
|
+
// active with wrap around at both ends
|
|
256
|
+
const increment = event.key === `ArrowUp` ? -1 : 1;
|
|
257
|
+
activeIndex = (activeIndex + increment) % matchingOptions.length;
|
|
258
|
+
// in JS % behaves like remainder operator, not real modulo, so negative numbers stay negative
|
|
259
|
+
// need to do manual wrap around at 0
|
|
260
|
+
if (activeIndex < 0)
|
|
261
|
+
activeIndex = matchingOptions.length - 1;
|
|
262
|
+
if (autoScroll) {
|
|
263
|
+
await tick();
|
|
264
|
+
const li = document.querySelector(`ul.options > li.active`);
|
|
265
|
+
if (li)
|
|
266
|
+
scroll_into_view_if_needed_polyfill(li);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// on backspace key: remove last selected option
|
|
270
|
+
else if (event.key === `Backspace` && selected.length > 0 && !searchText) {
|
|
271
|
+
remove(selected.at(-1));
|
|
272
|
+
}
|
|
273
|
+
// make first matching option active on any keypress (if none of the above special cases match)
|
|
274
|
+
else if (matchingOptions.length > 0) {
|
|
275
|
+
activeIndex = 0;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function remove_all() {
|
|
279
|
+
dispatch(`removeAll`, { options: selected });
|
|
280
|
+
dispatch(`change`, { options: selected, type: `removeAll` });
|
|
281
|
+
selected = [];
|
|
282
|
+
searchText = ``;
|
|
283
|
+
}
|
|
284
|
+
$: is_selected = (label) => selected.map(get_label).includes(label);
|
|
285
|
+
const if_enter_or_space = (handler) => (event) => {
|
|
286
|
+
if ([`Enter`, `Space`].includes(event.code)) {
|
|
287
|
+
event.preventDefault();
|
|
288
|
+
handler();
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
function on_click_outside(event) {
|
|
292
|
+
if (outerDiv && !outerDiv.contains(event.target)) {
|
|
293
|
+
close_dropdown(event);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
let drag_idx = null;
|
|
297
|
+
// event handlers enable dragging to reorder selected options
|
|
298
|
+
const drop = (target_idx) => (event) => {
|
|
299
|
+
if (!event.dataTransfer)
|
|
300
|
+
return;
|
|
301
|
+
event.dataTransfer.dropEffect = `move`;
|
|
302
|
+
const start_idx = parseInt(event.dataTransfer.getData(`text/plain`));
|
|
303
|
+
const new_selected = [...selected];
|
|
304
|
+
if (start_idx < target_idx) {
|
|
305
|
+
new_selected.splice(target_idx + 1, 0, new_selected[start_idx]);
|
|
306
|
+
new_selected.splice(start_idx, 1);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
new_selected.splice(target_idx, 0, new_selected[start_idx]);
|
|
310
|
+
new_selected.splice(start_idx + 1, 1);
|
|
311
|
+
}
|
|
312
|
+
selected = new_selected;
|
|
313
|
+
drag_idx = null;
|
|
314
|
+
};
|
|
315
|
+
const dragstart = (idx) => (event) => {
|
|
316
|
+
if (!event.dataTransfer)
|
|
317
|
+
return;
|
|
318
|
+
// only allow moving, not copying (also affects the cursor during drag)
|
|
319
|
+
event.dataTransfer.effectAllowed = `move`;
|
|
320
|
+
event.dataTransfer.dropEffect = `move`;
|
|
321
|
+
event.dataTransfer.setData(`text/plain`, `${idx}`);
|
|
322
|
+
};
|
|
323
|
+
let ul_options;
|
|
324
|
+
// highlight text matching user-entered search text in available options
|
|
325
|
+
function highlight_matching_options(event) {
|
|
326
|
+
// @ts-ignore
|
|
327
|
+
if (!highlightMatches || typeof CSS == `undefined` || !CSS.highlights)
|
|
328
|
+
return; // abort if CSS highlight API not supported
|
|
329
|
+
// clear previous ranges from HighlightRegistry
|
|
330
|
+
// @ts-ignore
|
|
331
|
+
CSS.highlights.clear();
|
|
332
|
+
// get input's search query
|
|
333
|
+
const query = event?.target?.value.trim().toLowerCase();
|
|
334
|
+
if (!query)
|
|
335
|
+
return;
|
|
336
|
+
const tree_walker = document.createTreeWalker(ul_options, NodeFilter.SHOW_TEXT, {
|
|
337
|
+
acceptNode: (node) => {
|
|
338
|
+
// don't highlight text in the "no matching options" message
|
|
339
|
+
if (node?.textContent === noMatchingOptionsMsg)
|
|
340
|
+
return NodeFilter.FILTER_REJECT;
|
|
341
|
+
return NodeFilter.FILTER_ACCEPT;
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
const text_nodes = [];
|
|
345
|
+
let current_node = tree_walker.nextNode();
|
|
346
|
+
while (current_node) {
|
|
347
|
+
text_nodes.push(current_node);
|
|
348
|
+
current_node = tree_walker.nextNode();
|
|
349
|
+
}
|
|
350
|
+
// iterate over all text nodes and find matches
|
|
351
|
+
const ranges = text_nodes.map((el) => {
|
|
352
|
+
const text = el.textContent?.toLowerCase();
|
|
353
|
+
const indices = [];
|
|
354
|
+
let start_pos = 0;
|
|
355
|
+
while (text && start_pos < text.length) {
|
|
356
|
+
const index = text.indexOf(query, start_pos);
|
|
357
|
+
if (index === -1)
|
|
358
|
+
break;
|
|
359
|
+
indices.push(index);
|
|
360
|
+
start_pos = index + query.length;
|
|
361
|
+
}
|
|
362
|
+
// create range object for each str found in the text node
|
|
363
|
+
return indices.map((index) => {
|
|
364
|
+
const range = new Range();
|
|
365
|
+
range.setStart(el, index);
|
|
366
|
+
range.setEnd(el, index + query.length);
|
|
367
|
+
return range;
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
// create Highlight object from ranges and add to registry
|
|
371
|
+
// @ts-ignore
|
|
372
|
+
CSS.highlights.set(`sms-search-matches`, new Highlight(...ranges.flat()));
|
|
373
|
+
}
|
|
374
|
+
// reset form validation when required prop changes
|
|
375
|
+
// https://github.com/janosh/svelte-multiselect/issues/285
|
|
376
|
+
$: required, form_input?.setCustomValidity(``);
|
|
377
|
+
</script>
|
|
378
|
+
|
|
379
|
+
<svelte:window
|
|
380
|
+
on:click={on_click_outside}
|
|
381
|
+
on:touchstart={on_click_outside}
|
|
382
|
+
bind:innerWidth={window_width}
|
|
383
|
+
/>
|
|
384
|
+
|
|
385
|
+
<div
|
|
386
|
+
bind:this={outerDiv}
|
|
387
|
+
class:disabled
|
|
388
|
+
class:single={maxSelect === 1}
|
|
389
|
+
class:open
|
|
390
|
+
class:invalid
|
|
391
|
+
class="multiselect {outerDivClass}"
|
|
392
|
+
on:mouseup|stopPropagation={open_dropdown}
|
|
393
|
+
title={disabled ? disabledInputTitle : null}
|
|
394
|
+
data-id={id}
|
|
395
|
+
role="searchbox"
|
|
396
|
+
tabindex="-1"
|
|
397
|
+
{style}
|
|
398
|
+
>
|
|
399
|
+
<!-- form control input invisible to the user, only purpose is to abort form submission if this component fails data validation -->
|
|
400
|
+
<!-- bind:value={selected} prevents form submission if required prop is true and no options are selected -->
|
|
401
|
+
<input
|
|
402
|
+
{name}
|
|
403
|
+
{required}
|
|
404
|
+
value={selected.length >= Number(required) ? JSON.stringify(selected) : null}
|
|
405
|
+
tabindex="-1"
|
|
406
|
+
aria-hidden="true"
|
|
407
|
+
aria-label="ignore this, used only to prevent form submission if select is required but empty"
|
|
408
|
+
class="form-control"
|
|
409
|
+
bind:this={form_input}
|
|
410
|
+
on:invalid={() => {
|
|
411
|
+
invalid = true
|
|
412
|
+
let msg
|
|
413
|
+
if (maxSelect && maxSelect > 1 && Number(required) > 1) {
|
|
414
|
+
msg = `Please select between ${required} and ${maxSelect} options`
|
|
415
|
+
} else if (Number(required) > 1) {
|
|
416
|
+
msg = `Please select at least ${required} options`
|
|
417
|
+
} else {
|
|
418
|
+
msg = `Please select an option`
|
|
419
|
+
}
|
|
420
|
+
form_input?.setCustomValidity(msg)
|
|
421
|
+
}}
|
|
422
|
+
/>
|
|
423
|
+
<slot name="expand-icon" {open}>
|
|
424
|
+
<ChevronsUpDown size={16} />
|
|
425
|
+
</slot>
|
|
426
|
+
<ul class="selected {ulSelectedClass}" aria-label="selected options" style={ulSelectedStyle}>
|
|
427
|
+
{#each selected as option, idx (duplicates ? [key(option), idx] : key(option))}
|
|
428
|
+
<li
|
|
429
|
+
class={liSelectedClass}
|
|
430
|
+
role="option"
|
|
431
|
+
aria-selected="true"
|
|
432
|
+
animate:flip={{ duration: 100 }}
|
|
433
|
+
draggable={selectedOptionsDraggable && !disabled && selected.length > 1}
|
|
434
|
+
on:dragstart={dragstart(idx)}
|
|
435
|
+
on:drop|preventDefault={drop(idx)}
|
|
436
|
+
on:dragenter={() => (drag_idx = idx)}
|
|
437
|
+
on:dragover|preventDefault
|
|
438
|
+
class:active={drag_idx === idx}
|
|
439
|
+
style="{get_style(option, `selected`)} {liSelectedStyle}"
|
|
440
|
+
>
|
|
441
|
+
<!-- on:dragover|preventDefault needed for the drop to succeed https://stackoverflow.com/a/31085796 -->
|
|
442
|
+
<slot name="selected" {option} {idx}>
|
|
443
|
+
<slot {option} {idx}>
|
|
444
|
+
{#if parseLabelsAsHtml}
|
|
445
|
+
{@html get_label(option)}
|
|
446
|
+
{:else}
|
|
447
|
+
{get_label(option)}
|
|
448
|
+
{/if}
|
|
449
|
+
</slot>
|
|
450
|
+
</slot>
|
|
451
|
+
{#if !disabled && (minSelect === null || selected.length > minSelect)}
|
|
452
|
+
<button
|
|
453
|
+
on:mouseup|stopPropagation={() => remove(option)}
|
|
454
|
+
on:keydown={if_enter_or_space(() => remove(option))}
|
|
455
|
+
type="button"
|
|
456
|
+
title="{removeBtnTitle} {get_label(option)}"
|
|
457
|
+
class="remove"
|
|
458
|
+
>
|
|
459
|
+
<slot name="remove-icon">
|
|
460
|
+
<X size={20} class="text-primary dark:text-primary-inverse p-0.5" />
|
|
461
|
+
</slot>
|
|
462
|
+
</button>
|
|
463
|
+
{/if}
|
|
464
|
+
</li>
|
|
465
|
+
{/each}
|
|
466
|
+
<input
|
|
467
|
+
class={inputClass}
|
|
468
|
+
style={inputStyle}
|
|
469
|
+
bind:this={input}
|
|
470
|
+
bind:value={searchText}
|
|
471
|
+
on:mouseup|self|stopPropagation={(e) => open_dropdown(e)}
|
|
472
|
+
on:keydown|stopPropagation={(e) => handle_keydown(e)}
|
|
473
|
+
on:focus={(e) => open_dropdown(e)}
|
|
474
|
+
on:input={(e) => highlight_matching_options(e)}
|
|
475
|
+
{id}
|
|
476
|
+
{disabled}
|
|
477
|
+
{autocomplete}
|
|
478
|
+
{inputmode}
|
|
479
|
+
{pattern}
|
|
480
|
+
placeholder={selected.length === 0 ? placeholder : undefined}
|
|
481
|
+
aria-invalid={invalid ? 'true' : undefined}
|
|
482
|
+
on:blur
|
|
483
|
+
on:change
|
|
484
|
+
on:click
|
|
485
|
+
on:keydown
|
|
486
|
+
on:keyup
|
|
487
|
+
on:mousedown
|
|
488
|
+
on:mouseenter
|
|
489
|
+
on:mouseleave
|
|
490
|
+
on:touchcancel
|
|
491
|
+
on:touchend
|
|
492
|
+
on:touchmove
|
|
493
|
+
on:touchstart
|
|
494
|
+
/>
|
|
495
|
+
|
|
496
|
+
<!-- the above on:* lines forward potentially useful DOM events -->
|
|
497
|
+
<slot name="after-input" {selected} {disabled} {invalid} {id} {placeholder} {open} {required} />
|
|
498
|
+
</ul>
|
|
499
|
+
{#if loading}
|
|
500
|
+
<slot name="spinner">spinner</slot>
|
|
501
|
+
{/if}
|
|
502
|
+
{#if disabled}
|
|
503
|
+
<slot name="disabled-icon">disable</slot>
|
|
504
|
+
{:else if selected.length > 0}
|
|
505
|
+
{#if maxSelect !== 1 && selected.length > 1 && !disableRemoveAll}
|
|
506
|
+
<button
|
|
507
|
+
type="button"
|
|
508
|
+
class="remove remove-all"
|
|
509
|
+
title={removeAllTitle}
|
|
510
|
+
on:mouseup|stopPropagation={remove_all}
|
|
511
|
+
on:keydown={if_enter_or_space(remove_all)}
|
|
512
|
+
>
|
|
513
|
+
<slot name="remove-icon">
|
|
514
|
+
<X
|
|
515
|
+
size={24}
|
|
516
|
+
class="text-secondary p-1 rounded-full bg-surface hover:bg-surface-secondary"
|
|
517
|
+
/>
|
|
518
|
+
</slot>
|
|
519
|
+
</button>
|
|
520
|
+
{/if}
|
|
521
|
+
{/if}
|
|
522
|
+
<!-- only render options dropdown if options or searchText is not empty (needed to avoid briefly flashing empty dropdown) -->
|
|
523
|
+
{#if (searchText && noMatchingOptionsMsg) || options?.length > 0}
|
|
524
|
+
<div class="options bg-surface shadow-md rounded-component">
|
|
525
|
+
<VirtualList
|
|
526
|
+
width="100%"
|
|
527
|
+
height={Math.min(32 * matchingOptions.length, 320)}
|
|
528
|
+
itemCount={matchingOptions.length}
|
|
529
|
+
itemSize={32}
|
|
530
|
+
>
|
|
531
|
+
<div slot="item" let:index let:style {style}>
|
|
532
|
+
{@const option = matchingOptions[index]}
|
|
533
|
+
{@const {
|
|
534
|
+
label,
|
|
535
|
+
disabled = null,
|
|
536
|
+
title = null,
|
|
537
|
+
selectedTitle = null,
|
|
538
|
+
disabledTitle = defaultDisabledTitle
|
|
539
|
+
} = option instanceof Object ? option : { label: option }}
|
|
540
|
+
|
|
541
|
+
<!-- svelte-ignore a11y-interactive-supports-focus -->
|
|
542
|
+
<div
|
|
543
|
+
on:mousedown|stopPropagation
|
|
544
|
+
on:mouseup|stopPropagation={(event) => {
|
|
545
|
+
if (!disabled) add(option, event)
|
|
546
|
+
}}
|
|
547
|
+
title={disabled ? disabledTitle : (is_selected(label) && selectedTitle) || title}
|
|
548
|
+
class={twMerge('hover:bg-blue-100 hover:dark:bg-gray-900 cursor-pointer !px-2 py-1')}
|
|
549
|
+
on:mouseover={() => {
|
|
550
|
+
if (!disabled) activeIndex = index
|
|
551
|
+
}}
|
|
552
|
+
on:focus={() => {
|
|
553
|
+
if (!disabled) activeIndex = index
|
|
554
|
+
}}
|
|
555
|
+
on:mouseout={() => (activeIndex = null)}
|
|
556
|
+
on:blur={() => (activeIndex = null)}
|
|
557
|
+
role="option"
|
|
558
|
+
aria-selected="false"
|
|
559
|
+
style={get_style(option, `option`)}
|
|
560
|
+
>
|
|
561
|
+
<slot name="option" {option} {index}>
|
|
562
|
+
<slot {option} {index}>
|
|
563
|
+
{#if parseLabelsAsHtml}
|
|
564
|
+
{@html get_label(option)}
|
|
565
|
+
{:else}
|
|
566
|
+
{get_label(option)}
|
|
567
|
+
{/if}
|
|
568
|
+
</slot>
|
|
569
|
+
</slot>
|
|
570
|
+
</div>
|
|
571
|
+
</div>
|
|
572
|
+
<div slot="footer" class="h-0" />
|
|
573
|
+
</VirtualList>
|
|
574
|
+
{#if searchText}
|
|
575
|
+
{@const text_input_is_duplicate = selected.map(get_label).includes(searchText)}
|
|
576
|
+
{@const is_dupe = !duplicates && text_input_is_duplicate && `dupe`}
|
|
577
|
+
{@const can_create = Boolean(allowUserOptions && createOptionMsg) && `create`}
|
|
578
|
+
{@const no_match =
|
|
579
|
+
Boolean(matchingOptions?.length == 0 && noMatchingOptionsMsg) && `no-match`}
|
|
580
|
+
{@const msgType = is_dupe || can_create || no_match}
|
|
581
|
+
{#if msgType}
|
|
582
|
+
{@const msg = {
|
|
583
|
+
dupe: duplicateOptionMsg,
|
|
584
|
+
create: createOptionMsg,
|
|
585
|
+
'no-match': noMatchingOptionsMsg
|
|
586
|
+
}[msgType]}
|
|
587
|
+
<!-- svelte-ignore a11y-interactive-supports-focus -->
|
|
588
|
+
<div
|
|
589
|
+
on:mousedown|stopPropagation
|
|
590
|
+
on:mouseup|stopPropagation={(event) => {
|
|
591
|
+
if (allowUserOptions) add(searchText, event)
|
|
592
|
+
}}
|
|
593
|
+
title={createOptionMsg}
|
|
594
|
+
class:active={option_msg_is_active}
|
|
595
|
+
on:mouseover={() => (option_msg_is_active = true)}
|
|
596
|
+
on:focus={() => (option_msg_is_active = true)}
|
|
597
|
+
on:mouseout={() => (option_msg_is_active = false)}
|
|
598
|
+
on:blur={() => (option_msg_is_active = false)}
|
|
599
|
+
role="option"
|
|
600
|
+
aria-selected="false"
|
|
601
|
+
class="user-msg p-1"
|
|
602
|
+
style:cursor={{
|
|
603
|
+
dupe: `not-allowed`,
|
|
604
|
+
create: `pointer`,
|
|
605
|
+
'no-match': `default`
|
|
606
|
+
}[msgType]}
|
|
607
|
+
>
|
|
608
|
+
<slot name="user-msg" {searchText} {msgType} {msg}>
|
|
609
|
+
{msg}
|
|
610
|
+
</slot>
|
|
611
|
+
</div>
|
|
612
|
+
{/if}
|
|
613
|
+
{/if}
|
|
614
|
+
</div>
|
|
615
|
+
{/if}
|
|
616
|
+
</div>
|
|
617
|
+
|
|
618
|
+
<style>
|
|
619
|
+
:where(div.multiselect) {
|
|
620
|
+
position: relative;
|
|
621
|
+
align-items: center;
|
|
622
|
+
display: flex;
|
|
623
|
+
cursor: text;
|
|
624
|
+
box-sizing: border-box;
|
|
625
|
+
border: var(--sms-border, 1pt solid lightgray);
|
|
626
|
+
border-radius: var(--sms-border-radius, 3pt);
|
|
627
|
+
background: var(--sms-bg);
|
|
628
|
+
width: var(--sms-width);
|
|
629
|
+
max-width: var(--sms-max-width);
|
|
630
|
+
padding: var(--sms-padding, 0 3pt);
|
|
631
|
+
color: var(--sms-text-color);
|
|
632
|
+
font-size: var(--sms-font-size, inherit);
|
|
633
|
+
min-height: var(--sms-min-height, 22pt);
|
|
634
|
+
margin: var(--sms-margin);
|
|
635
|
+
}
|
|
636
|
+
:where(div.multiselect.open) {
|
|
637
|
+
/* increase z-index when open to ensure the dropdown of one <MultiSelect />
|
|
638
|
+
displays above that of another slightly below it on the page */
|
|
639
|
+
z-index: var(--sms-open-z-index, 4);
|
|
640
|
+
}
|
|
641
|
+
:where(div.multiselect:focus-within) {
|
|
642
|
+
border: var(--sms-focus-border, 1pt solid var(--sms-active-color, cornflowerblue));
|
|
643
|
+
}
|
|
644
|
+
:where(div.multiselect.disabled) {
|
|
645
|
+
background: var(--sms-disabled-bg, lightgray);
|
|
646
|
+
cursor: not-allowed;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
:where(div.multiselect > ul.selected) {
|
|
650
|
+
display: flex;
|
|
651
|
+
flex: 1;
|
|
652
|
+
padding: 0;
|
|
653
|
+
margin: 0;
|
|
654
|
+
flex-wrap: wrap;
|
|
655
|
+
}
|
|
656
|
+
:where(div.multiselect > ul.selected > li) {
|
|
657
|
+
align-items: center;
|
|
658
|
+
border-radius: 3pt;
|
|
659
|
+
display: flex;
|
|
660
|
+
margin: 2pt;
|
|
661
|
+
line-height: normal;
|
|
662
|
+
transition: 0.3s;
|
|
663
|
+
white-space: nowrap;
|
|
664
|
+
background: var(--sms-selected-bg, rgba(0, 0, 0, 0.15));
|
|
665
|
+
padding: var(--sms-selected-li-padding, 1pt 5pt);
|
|
666
|
+
color: var(--sms-selected-text-color, var(--sms-text-color));
|
|
667
|
+
}
|
|
668
|
+
:where(div.multiselect > ul.selected > li[draggable='true']) {
|
|
669
|
+
cursor: grab;
|
|
670
|
+
}
|
|
671
|
+
:where(div.multiselect > ul.selected > li.active) {
|
|
672
|
+
background: var(--sms-li-active-bg, var(--sms-active-color, rgba(0, 0, 0, 0.15)));
|
|
673
|
+
}
|
|
674
|
+
:where(div.multiselect button) {
|
|
675
|
+
border-radius: 50%;
|
|
676
|
+
display: flex;
|
|
677
|
+
transition: 0.2s;
|
|
678
|
+
color: inherit;
|
|
679
|
+
background: transparent;
|
|
680
|
+
border: none;
|
|
681
|
+
cursor: pointer;
|
|
682
|
+
outline: none;
|
|
683
|
+
padding: 0;
|
|
684
|
+
margin: 0 0 0 3pt; /* CSS reset */
|
|
685
|
+
}
|
|
686
|
+
:where(div.multiselect button.remove-all) {
|
|
687
|
+
margin: 0 3pt;
|
|
688
|
+
}
|
|
689
|
+
:where(ul.selected > li button:hover, button.remove-all:hover, button:focus) {
|
|
690
|
+
color: var(--sms-remove-btn-hover-color, lightskyblue);
|
|
691
|
+
background: var(--sms-remove-btn-hover-bg, rgba(0, 0, 0, 0.2));
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
:where(div.multiselect input) {
|
|
695
|
+
margin: auto 0; /* CSS reset */
|
|
696
|
+
padding: 0; /* CSS reset */
|
|
697
|
+
}
|
|
698
|
+
:where(div.multiselect > ul.selected > input) {
|
|
699
|
+
border: none;
|
|
700
|
+
outline: none;
|
|
701
|
+
background: none;
|
|
702
|
+
flex: 1; /* this + next line fix issue #12 https://git.io/JiDe3 */
|
|
703
|
+
min-width: 2em;
|
|
704
|
+
/* ensure input uses text color and not --sms-selected-text-color */
|
|
705
|
+
color: var(--sms-text-color);
|
|
706
|
+
font-size: inherit;
|
|
707
|
+
cursor: inherit; /* needed for disabled state */
|
|
708
|
+
border-radius: 0; /* reset ul.selected > li */
|
|
709
|
+
}
|
|
710
|
+
/* don't wrap ::placeholder rules in :where() as it seems to be overpowered by browser defaults i.t.o. specificity */
|
|
711
|
+
div.multiselect > ul.selected > input::-moz-placeholder {
|
|
712
|
+
padding-left: 5pt;
|
|
713
|
+
color: var(--sms-placeholder-color);
|
|
714
|
+
opacity: var(--sms-placeholder-opacity);
|
|
715
|
+
}
|
|
716
|
+
div.multiselect > ul.selected > input::placeholder {
|
|
717
|
+
padding-left: 5pt;
|
|
718
|
+
color: var(--sms-placeholder-color);
|
|
719
|
+
opacity: var(--sms-placeholder-opacity);
|
|
720
|
+
}
|
|
721
|
+
:where(div.multiselect > input.form-control) {
|
|
722
|
+
width: 2em;
|
|
723
|
+
position: absolute;
|
|
724
|
+
background: transparent;
|
|
725
|
+
border: none;
|
|
726
|
+
outline: none;
|
|
727
|
+
z-index: -1;
|
|
728
|
+
opacity: 0;
|
|
729
|
+
pointer-events: none;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
:where(div.multiselect > ul.options) {
|
|
733
|
+
list-style: none;
|
|
734
|
+
top: 100%;
|
|
735
|
+
left: 0;
|
|
736
|
+
width: 100%;
|
|
737
|
+
position: absolute;
|
|
738
|
+
overflow: auto;
|
|
739
|
+
transition: all 0.2s;
|
|
740
|
+
box-sizing: border-box;
|
|
741
|
+
background: var(--sms-options-bg, white);
|
|
742
|
+
max-height: var(--sms-options-max-height, 50vh);
|
|
743
|
+
overscroll-behavior: var(--sms-options-overscroll, none);
|
|
744
|
+
border: var(--sms-options-border);
|
|
745
|
+
border-width: var(--sms-options-border-width);
|
|
746
|
+
border-radius: var(--sms-options-border-radius, 1ex);
|
|
747
|
+
padding: var(--sms-options-padding);
|
|
748
|
+
margin: var(--sms-options-margin, inherit);
|
|
749
|
+
}
|
|
750
|
+
:where(div.multiselect > ul.options.hidden) {
|
|
751
|
+
visibility: hidden;
|
|
752
|
+
opacity: 0;
|
|
753
|
+
transform: translateY(50px);
|
|
754
|
+
}
|
|
755
|
+
:where(div.multiselect > ul.options > li) {
|
|
756
|
+
padding: 3pt 2ex;
|
|
757
|
+
cursor: pointer;
|
|
758
|
+
scroll-margin: var(--sms-options-scroll-margin, 100px);
|
|
759
|
+
}
|
|
760
|
+
:where(div.multiselect > ul.options .user-msg) {
|
|
761
|
+
/* block needed so vertical padding applies to span */
|
|
762
|
+
display: block;
|
|
763
|
+
padding: 3pt 2ex;
|
|
764
|
+
}
|
|
765
|
+
:where(div.multiselect > ul.options > li.selected) {
|
|
766
|
+
background: var(--sms-li-selected-bg);
|
|
767
|
+
color: var(--sms-li-selected-color);
|
|
768
|
+
}
|
|
769
|
+
:where(div.multiselect > ul.options > li.active) {
|
|
770
|
+
background: var(--sms-li-active-bg, var(--sms-active-color, rgba(0, 0, 0, 0.15)));
|
|
771
|
+
}
|
|
772
|
+
:where(div.multiselect > ul.options > li.disabled) {
|
|
773
|
+
cursor: not-allowed;
|
|
774
|
+
background: var(--sms-li-disabled-bg, #f5f5f6);
|
|
775
|
+
color: var(--sms-li-disabled-text, #b8b8b8);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
:where(span.max-select-msg) {
|
|
779
|
+
padding: 0 3pt;
|
|
780
|
+
}
|
|
781
|
+
::highlight(sms-search-matches) {
|
|
782
|
+
color: mediumaquamarine;
|
|
783
|
+
}</style>
|