diff --git a/backend/parsers/windmill-parser-py/src/lib.rs b/backend/parsers/windmill-parser-py/src/lib.rs index ce11875053..cd797d0eb2 100644 --- a/backend/parsers/windmill-parser-py/src/lib.rs +++ b/backend/parsers/windmill-parser-py/src/lib.rs @@ -182,6 +182,7 @@ static PYTHON_IMPORTS_REPLACEMENT: phf::Map<&'static str, &'static str> = phf_ma "shopify" => "ShopifyAPI", "seleniumwire" => "selenium-wire", "openbb-terminal" => "openbb[all]", + "riskfolio" => "riskfolio-lib", }; fn replace_import(x: String) -> String { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 53796f5e8c..63fe174903 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7,7 +7,6 @@ "": { "name": "windmill", "version": "1.101.1", - "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "^4.0.0", @@ -76,7 +75,7 @@ "svelte-awesome-color-picker": "^2.4.3", "svelte-check": "^3.3.2", "svelte-highlight": "^7.3.0", - "svelte-multiselect": "^8.6.0", + "svelte-multiselect": "^8.6.2", "svelte-overlay": "^1.4.1", "svelte-popperjs": "^1.3.2", "svelte-preprocess": "^5.0.1", @@ -6482,12 +6481,12 @@ } }, "node_modules/svelte-multiselect": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/svelte-multiselect/-/svelte-multiselect-8.6.0.tgz", - "integrity": "sha512-ce1axNn5YrvDwpUA1R4pSKC7oCD8buP7If61VRoOEM5cxMU8t14tLp5fJf27qd8FBJ7vzvJokiN9BUl1u8oL6w==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/svelte-multiselect/-/svelte-multiselect-8.6.2.tgz", + "integrity": "sha512-lR7zc/B6yAi9oZxIZyuv8q2VTRDS9aT84HRjHiEcmWD7vbz64pfbmKJZgCUcH5oCtr0wN1NfYymXQvRMfolZkQ==", "dev": true, "dependencies": { - "svelte": "^3.57.0" + "svelte": "^3.59.1" } }, "node_modules/svelte-overlay": { @@ -12040,12 +12039,12 @@ "requires": {} }, "svelte-multiselect": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/svelte-multiselect/-/svelte-multiselect-8.6.0.tgz", - "integrity": "sha512-ce1axNn5YrvDwpUA1R4pSKC7oCD8buP7If61VRoOEM5cxMU8t14tLp5fJf27qd8FBJ7vzvJokiN9BUl1u8oL6w==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/svelte-multiselect/-/svelte-multiselect-8.6.2.tgz", + "integrity": "sha512-lR7zc/B6yAi9oZxIZyuv8q2VTRDS9aT84HRjHiEcmWD7vbz64pfbmKJZgCUcH5oCtr0wN1NfYymXQvRMfolZkQ==", "dev": true, "requires": { - "svelte": "^3.57.0" + "svelte": "^3.59.1" } }, "svelte-overlay": { diff --git a/frontend/package.json b/frontend/package.json index 32504e3d90..17d9697261 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,7 +54,7 @@ "svelte-awesome-color-picker": "^2.4.3", "svelte-check": "^3.3.2", "svelte-highlight": "^7.3.0", - "svelte-multiselect": "^8.6.0", + "svelte-multiselect": "^8.6.2", "svelte-overlay": "^1.4.1", "svelte-popperjs": "^1.3.2", "svelte-preprocess": "^5.0.1", diff --git a/frontend/src/lib/components/Multiselect.svelte b/frontend/src/lib/components/Multiselect.svelte deleted file mode 100644 index 61283f152f..0000000000 --- a/frontend/src/lib/components/Multiselect.svelte +++ /dev/null @@ -1,326 +0,0 @@ - - -
- -
- {#each Object.values(selected) as s} -
- {s.name} - {#if !readonly} -
- - - -
- {/if} -
- {/each} -
- {#if !readonly} - -
- - - -
- - {/if} -
-
- - - - {#if showOptions} - - {/if} -
- - diff --git a/frontend/src/lib/components/apps/components/display/table/AppTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppTable.svelte index 8c16ff948b..79415b3e64 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppTable.svelte @@ -22,6 +22,7 @@ import { initConfig, initOutput } from '$lib/components/apps/editor/appUtils' import ResolveConfig from '../../helpers/ResolveConfig.svelte' import AppCheckbox from '../../inputs/AppCheckbox.svelte' + import AppSelect from '../../inputs/AppSelect.svelte' export let id: string export let componentInput: AppInput | undefined @@ -297,7 +298,7 @@ on:keypress={() => toggleRow(row, rowIndex)} on:click={() => toggleRow(row, rowIndex)} > -
+
{#each actionButtons as actionButton, actionIndex (actionButton?.id)}
+ {:else if actionButton.type == 'selectcomponent'} + { + toggleRow(row, rowIndex) + }} + {controls} + /> {/if} {:else if actionButton.type == 'buttoncomponent'} + {:else if actionButton.type == 'selectcomponent'} + { + toggleRow(row, rowIndex) + }} + /> {/if}
{/each} diff --git a/frontend/src/lib/components/apps/components/helpers/AlignWrapper.svelte b/frontend/src/lib/components/apps/components/helpers/AlignWrapper.svelte index 1c41cb4007..ee04134185 100644 --- a/frontend/src/lib/components/apps/components/helpers/AlignWrapper.svelte +++ b/frontend/src/lib/components/apps/components/helpers/AlignWrapper.svelte @@ -6,6 +6,7 @@ export let horizontalAlignment: HorizontalAlignment | undefined = undefined export let verticalAlignment: VerticalAlignment | undefined = undefined export let noWFull = false + export let hFull = false let c = '' export { c as class } export let style = '' @@ -16,7 +17,7 @@ noWFull ? '' : 'w-full', tailwindHorizontalAlignment(horizontalAlignment), tailwindVerticalAlignment(verticalAlignment), - verticalAlignment ? 'h-full' : '', + verticalAlignment || hFull ? 'h-full' : '', c ) diff --git a/frontend/src/lib/components/apps/components/inputs/AppCheckbox.svelte b/frontend/src/lib/components/apps/components/inputs/AppCheckbox.svelte index d7fd52d5d4..1f9ccc856d 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppCheckbox.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppCheckbox.svelte @@ -1,12 +1,13 @@ - - +{#each Object.keys(components['checkboxcomponent'].initialData.configuration) as key (key)} + +{/each} { diff --git a/frontend/src/lib/components/apps/components/inputs/AppMultiSelect.svelte b/frontend/src/lib/components/apps/components/inputs/AppMultiSelect.svelte index 46062a135f..847abf18e6 100644 --- a/frontend/src/lib/components/apps/components/inputs/AppMultiSelect.svelte +++ b/frontend/src/lib/components/apps/components/inputs/AppMultiSelect.svelte @@ -1,69 +1,72 @@ - - +{#each Object.keys(components['multiselectcomponent'].initialData.configuration) as key (key)} + +{/each} - +
{ if (!e.shiftKey) { e.stopPropagation() @@ -71,30 +74,16 @@ }} > {#if !value || Array.isArray(value)} -
diff --git a/frontend/src/lib/components/apps/editor/component/Component.svelte b/frontend/src/lib/components/apps/editor/component/Component.svelte index 22bf1926fa..c6ae43034d 100644 --- a/frontend/src/lib/components/apps/editor/component/Component.svelte +++ b/frontend/src/lib/components/apps/editor/component/Component.svelte @@ -252,9 +252,9 @@ /> {:else if component.type === 'selectcomponent' || component.type === 'resourceselectcomponent'} export type DisplayComponent = BaseComponent<'displaycomponent'> export type ImageComponent = BaseComponent<'imagecomponent'> export type InputComponent = BaseComponent<'inputcomponent'> -export type SelectComponent = BaseComponent<'resourceselectcomponent'> -export type ResourceSelectComponent = BaseComponent<'selectcomponent'> +export type SelectComponent = BaseComponent<'selectcomponent'> & RecomputeOthersSource +export type ResourceSelectComponent = BaseComponent<'resourceselectcomponent'> & + RecomputeOthersSource export type MultiSelectComponent = BaseComponent<'multiselectcomponent'> export type CheckboxComponent = BaseComponent<'checkboxcomponent'> & RecomputeOthersSource export type RadioComponent = BaseComponent<'radiocomponent'> @@ -470,7 +471,7 @@ export const components = { fields: {}, runnable: undefined }, - recomputeIds: undefined, + recomputeIds: true, configuration: { label: { type: 'static', @@ -480,7 +481,6 @@ export const components = { color: { fieldType: 'select', type: 'static', - onlyStatic: true, selectOptions: selectOptions.buttonColorOptions, value: 'blue', tooltip: 'Theses presets can be overwritten with custom styles.' @@ -562,7 +562,6 @@ export const components = { color: { fieldType: 'select', type: 'static', - onlyStatic: true, selectOptions: selectOptions.buttonColorOptions, value: 'blue' }, @@ -610,7 +609,7 @@ export const components = { fields: {}, runnable: undefined }, - recomputeIds: undefined, + recomputeIds: true, configuration: { label: { type: 'static', @@ -620,7 +619,6 @@ export const components = { color: { fieldType: 'select', type: 'static', - onlyStatic: true, value: 'dark', selectOptions: selectOptions.buttonColorOptions }, @@ -653,7 +651,7 @@ export const components = { fields: {}, runnable: undefined }, - recomputeIds: undefined, + recomputeIds: true, configuration: { label: { type: 'static', @@ -663,7 +661,6 @@ export const components = { color: { fieldType: 'select', type: 'static', - onlyStatic: true, value: 'dark', selectOptions: buttonColorOptions, tooltip: 'Theses presets can be overwritten with custom styles.' @@ -1060,7 +1057,7 @@ Hello \${ctx.username} initialData: { ...defaultAlignement, componentInput: undefined, - recomputeIds: undefined, + recomputeIds: true, configuration: { label: { type: 'static', @@ -1132,9 +1129,13 @@ Hello \${ctx.username} dims: '2:1-3:1' as AppComponentDimensions, customCss: { - input: { style: '' } + input: { + style: '', + tooltip: 'https://github.com/rob-balfre/svelte-select/blob/master/docs/theming_variables.md' + } }, initialData: { + recomputeIds: true, verticalAlignment: 'center', componentInput: undefined, configuration: { @@ -1153,7 +1154,7 @@ Hello \${ctx.username} value: false, onlyStatic: true, tooltip: 'Allows user to manually add new value', - customTitle: 'Manually add new value ' + customTitle: 'User creatable' }, placeholder: { type: 'static', @@ -1175,7 +1176,11 @@ Hello \${ctx.username} dims: '2:1-3:1' as AppComponentDimensions, customCss: { - input: { style: '' } + multiselect: { + style: '', + tooltip: + 'See https://multiselect.janosh.dev/#with-css-variables for the available variables' + } }, initialData: { componentInput: undefined, @@ -1191,6 +1196,22 @@ Hello \${ctx.username} fieldType: 'text', value: 'Select items', onlyStatic: true + }, + create: { + type: 'static', + fieldType: 'boolean', + value: false, + onlyStatic: true, + tooltip: 'Allows user to manually add new value', + customTitle: 'User creatable' + }, + allowOverflow: { + type: 'static', + fieldType: 'boolean', + value: true, + onlyStatic: true, + tooltip: + 'If too many items, the box overflow its container instead of having an internal scroll' } } } @@ -1718,7 +1739,6 @@ Hello \${ctx.username} color: { fieldType: 'select', type: 'static', - onlyStatic: true, selectOptions: buttonColorOptions, value: 'blue', tooltip: diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/CssProperty.svelte b/frontend/src/lib/components/apps/editor/componentsPanel/CssProperty.svelte index 407c5e2316..e440bcc2ab 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/CssProperty.svelte +++ b/frontend/src/lib/components/apps/editor/componentsPanel/CssProperty.svelte @@ -16,6 +16,8 @@ export let forceClass: boolean = false export let quickStyleProperties: PropertyGroup[] | undefined = undefined export let componentType: TypedComponent['type'] | undefined = undefined + export let tooltip: string | undefined = undefined + const dispatch = createEventDispatcher() let isQuickMenuOpen = false @@ -33,6 +35,9 @@
{#if value}
+ {#if tooltip} +
{tooltip}
+ {/if} {#if value.style !== undefined || forceStyle}
diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index 1b81f2509b..996bbeac35 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -267,7 +267,7 @@ {/if} - {#if componentSettings.item.data.type === 'buttoncomponent' || componentSettings.item.data.type === 'formcomponent' || componentSettings.item.data.type === 'formbuttoncomponent' || componentSettings.item.data.type === 'checkboxcomponent'} + {#if (`recomputeIds` in componentSettings.item.data && Array.isArray(componentSettings.item.data.recomputeIds)) || componentSettings.item.data.type === 'buttoncomponent' || componentSettings.item.data.type === 'formcomponent' || componentSettings.item.data.type === 'formbuttoncomponent' || componentSettings.item.data.type === 'checkboxcomponent'} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/Recompute.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/Recompute.svelte index c2beb0d140..c2a96a0666 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/Recompute.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/Recompute.svelte @@ -20,8 +20,8 @@ {#if Object.keys($runnableComponents ?? {}).filter((id) => id !== ownId).length > 0} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/StylePanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/StylePanel.svelte index aa04934a61..69bf711c82 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/StylePanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/StylePanel.svelte @@ -60,6 +60,7 @@ quickStyleProperties={quickStyleProperties?.[component.type]?.[name]} forceStyle={ccomponents[component.type].customCss[name].style !== undefined} forceClass={ccomponents[component.type].customCss[name].class !== undefined} + tooltip={ccomponents[component.type].customCss[name].tooltip} {name} componentType={component.type} bind:value={component.customCss[name]} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/TableActions.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/TableActions.svelte index 75390ddeae..f599c072eb 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/TableActions.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/TableActions.svelte @@ -12,18 +12,19 @@ clearErrorByComponentId, clearJobsByComponentId } from '../appUtils' - import type { ButtonComponent, CheckboxComponent } from '../component' + import type { ButtonComponent, CheckboxComponent, SelectComponent } from '../component' import PanelSection from './common/PanelSection.svelte' import TableActionLabel from './TableActionLabel.svelte' - import { Inspect, ToggleRightIcon } from 'lucide-svelte' + import { Inspect, List, ToggleRightIcon } from 'lucide-svelte' - export let components: (BaseAppComponent & (ButtonComponent | CheckboxComponent))[] + export let components: (BaseAppComponent & + (ButtonComponent | CheckboxComponent | SelectComponent))[] export let id: string const { selectedComponent, app, errorByComponent, jobs } = getContext('AppViewerContext') - function addComponent(typ: 'buttoncomponent' | 'checkboxcomponent') { + function addComponent(typ: 'buttoncomponent' | 'checkboxcomponent' | 'selectcomponent') { const actionId = getNextId(components.map((x) => x.id.split('_')[1])) const newComponent = { @@ -96,5 +97,15 @@ > + +
diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/script/shared/ScriptRunConfiguration.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/script/shared/ScriptRunConfiguration.svelte index 7c75d60b72..bb4dbed9a9 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/script/shared/ScriptRunConfiguration.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/script/shared/ScriptRunConfiguration.svelte @@ -21,8 +21,8 @@ Run on start and app refresh You may want to disable this so that the background runnable is only triggered by - changes to other values or triggered by another computation on a button (See - 'Recompute Others') + changes to other values or triggered by another computation on a button (See 'Trigger + Runnables')