Merge branch 'main' into python-uv

This commit is contained in:
pyranota
2024-10-31 14:03:32 +00:00
committed by GitHub
27 changed files with 269 additions and 158 deletions
+20
View File
@@ -1,5 +1,25 @@
# Changelog
## [1.415.1](https://github.com/windmill-labs/windmill/compare/v1.415.0...v1.415.1) (2024-10-31)
### Bug Fixes
* **cli:** improve --instance handling wmill instance push ([cb005a1](https://github.com/windmill-labs/windmill/commit/cb005a15baef4272bc58c7e80a43e44723556d31))
## [1.415.0](https://github.com/windmill-labs/windmill/compare/v1.414.2...v1.415.0) (2024-10-31)
### Features
* **cli:** opts.instance as instace name and prefix ([#4609](https://github.com/windmill-labs/windmill/issues/4609)) ([a07f57e](https://github.com/windmill-labs/windmill/commit/a07f57e698107056d045d8d5c2458e04c809fcc8))
### Bug Fixes
* improve express oauth setup ([ba4aed5](https://github.com/windmill-labs/windmill/commit/ba4aed5bf51c65204332cfc158d0ffd9c7095ec7))
* improve user resource input ([8c7f53b](https://github.com/windmill-labs/windmill/commit/8c7f53b2ebe0990cd93879258d004ac89dc8b24c))
## [1.414.2](https://github.com/windmill-labs/windmill/compare/v1.414.1...v1.414.2) (2024-10-29)
+31 -31
View File
@@ -512,7 +512,7 @@ dependencies = [
"async-task",
"concurrent-queue",
"fastrand 2.1.1",
"futures-lite 2.3.0",
"futures-lite 2.4.0",
"slab",
]
@@ -527,7 +527,7 @@ dependencies = [
"async-io",
"async-lock",
"blocking",
"futures-lite 2.3.0",
"futures-lite 2.4.0",
"once_cell",
]
@@ -541,7 +541,7 @@ dependencies = [
"cfg-if",
"concurrent-queue",
"futures-io",
"futures-lite 2.3.0",
"futures-lite 2.4.0",
"parking",
"polling",
"rustix",
@@ -605,7 +605,7 @@ dependencies = [
"futures-channel",
"futures-core",
"futures-io",
"futures-lite 2.3.0",
"futures-lite 2.4.0",
"gloo-timers",
"kv-log-macro",
"log",
@@ -1357,7 +1357,7 @@ dependencies = [
"async-channel 2.3.1",
"async-task",
"futures-io",
"futures-lite 2.3.0",
"futures-lite 2.4.0",
"piper",
]
@@ -3556,9 +3556,9 @@ dependencies = [
[[package]]
name = "futures-lite"
version = "2.3.0"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
checksum = "3f1fa2f9765705486b33fd2acf1577f8ec449c2ba1f318ae5447697b7c08d210"
dependencies = [
"fastrand 2.1.1",
"futures-core",
@@ -10395,7 +10395,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windmill"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"axum",
@@ -10437,7 +10437,7 @@ dependencies = [
[[package]]
name = "windmill-api"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"argon2",
@@ -10522,7 +10522,7 @@ dependencies = [
[[package]]
name = "windmill-api-client"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"base64 0.21.7",
"chrono",
@@ -10540,7 +10540,7 @@ dependencies = [
[[package]]
name = "windmill-audit"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"chrono",
"serde",
@@ -10553,7 +10553,7 @@ dependencies = [
[[package]]
name = "windmill-autoscaling"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"rsmq_async",
@@ -10568,7 +10568,7 @@ dependencies = [
[[package]]
name = "windmill-common"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"async-stream",
@@ -10614,7 +10614,7 @@ dependencies = [
[[package]]
name = "windmill-git-sync"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"regex",
"rsmq_async",
@@ -10629,7 +10629,7 @@ dependencies = [
[[package]]
name = "windmill-indexer"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"bytes",
@@ -10651,7 +10651,7 @@ dependencies = [
[[package]]
name = "windmill-macros"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"itertools 0.13.0",
"lazy_static",
@@ -10663,7 +10663,7 @@ dependencies = [
[[package]]
name = "windmill-parser"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"convert_case 0.6.0",
"serde",
@@ -10672,7 +10672,7 @@ dependencies = [
[[package]]
name = "windmill-parser-bash"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -10684,7 +10684,7 @@ dependencies = [
[[package]]
name = "windmill-parser-go"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"gosyn",
@@ -10696,7 +10696,7 @@ dependencies = [
[[package]]
name = "windmill-parser-graphql"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -10708,7 +10708,7 @@ dependencies = [
[[package]]
name = "windmill-parser-php"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"itertools 0.13.0",
@@ -10719,7 +10719,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"itertools 0.13.0",
@@ -10730,7 +10730,7 @@ dependencies = [
[[package]]
name = "windmill-parser-py-imports"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"async-recursion",
@@ -10748,7 +10748,7 @@ dependencies = [
[[package]]
name = "windmill-parser-rust"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"convert_case 0.6.0",
@@ -10765,7 +10765,7 @@ dependencies = [
[[package]]
name = "windmill-parser-sql"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -10777,7 +10777,7 @@ dependencies = [
[[package]]
name = "windmill-parser-ts"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"lazy_static",
@@ -10795,7 +10795,7 @@ dependencies = [
[[package]]
name = "windmill-parser-wasm"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"getrandom 0.2.15",
@@ -10816,7 +10816,7 @@ dependencies = [
[[package]]
name = "windmill-parser-yaml"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"serde_json",
@@ -10826,7 +10826,7 @@ dependencies = [
[[package]]
name = "windmill-queue"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"async-recursion",
@@ -10859,7 +10859,7 @@ dependencies = [
[[package]]
name = "windmill-sql-datatype-parser-wasm"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"wasm-bindgen",
"wasm-bindgen-test",
@@ -10869,7 +10869,7 @@ dependencies = [
[[package]]
name = "windmill-worker"
version = "1.414.2"
version = "1.415.1"
dependencies = [
"anyhow",
"async-recursion",
+2 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "windmill"
version = "1.414.2"
version = "1.415.1"
authors.workspace = true
edition.workspace = true
@@ -29,7 +29,7 @@ members = [
]
[workspace.package]
version = "1.414.2"
version = "1.415.1"
authors = ["Ruben Fiszel <ruben@windmill.dev>"]
edition = "2021"
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: "3.0.3"
info:
version: 1.414.2
version: 1.415.1
title: Windmill API
contact:
@@ -1054,6 +1054,9 @@ pub async fn handle_python_reqs(
let mut req_with_penv: Vec<(String, String)> = vec![];
for req in requirements {
if req.starts_with('#') {
continue;
}
let py_prefix = if no_uv_install {
PIP_CACHE_DIR
} else {
+1 -1
View File
@@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts";
import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts";
import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts";
export const VERSION = "v1.414.2";
export const VERSION = "v1.415.1";
export async function login(email: string, password: string): Promise<string> {
return await windmill.UserService.login({
+14 -4
View File
@@ -183,6 +183,7 @@ export type InstanceSyncOptions = {
token?: string;
folderPerInstance?: boolean;
yes?: boolean;
prefix?: string;
};
export async function pickInstance(
@@ -202,7 +203,7 @@ export async function pickInstance(
name: opts.instance,
remote: opts.baseUrl,
token: opts.token,
prefix: opts.instance,
prefix: opts.prefix ?? opts.instance,
};
}
if (opts.baseUrl && opts.token) {
@@ -217,7 +218,7 @@ export async function pickInstance(
name: "custom",
remote: opts.baseUrl,
token: opts.token,
prefix: "custom",
prefix: opts.prefix ?? "custom",
};
}
if (!allowNew && instances.length < 1) {
@@ -448,8 +449,8 @@ async function instancePush(opts: GlobalOptions & InstanceSyncOptions) {
const rootDir = Deno.cwd();
let localPrefix;
if (opts.baseUrl && opts.token) {
localPrefix = "custom";
if (opts.prefix) {
localPrefix = opts.prefix;
} else {
localPrefix = (await Select.prompt({
message: "What is the prefix of the local workspaces you want to sync?",
@@ -704,6 +705,11 @@ const command = new Command()
"--instance <instance:string>",
"Name of the instance to pull from, override the active instance"
)
.option(
"--prefix <prefix:string>",
"Prefix of the local workspaces to pull, used to create the folders when using --include-workspaces"
)
.action(instancePull as any)
.command("push")
.description(
@@ -720,6 +726,10 @@ const command = new Command()
"--instance <instance:string>",
"Name of the instance to push to, override the active instance"
)
.option(
"--prefix <prefix:string>",
"Prefix of the local workspaces folders to push"
)
.action(instancePush as any)
.command("whoami")
.description("Display information about the currently logged-in user")
+1 -1
View File
@@ -60,7 +60,7 @@ export {
// }
// });
export const VERSION = "1.414.2";
export const VERSION = "1.415.1";
const command = new Command()
.name("wmill")
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "windmill-components",
"version": "1.414.2",
"version": "1.415.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "windmill-components",
"version": "1.414.2",
"version": "1.415.1",
"license": "AGPL-3.0",
"dependencies": {
"@aws-crypto/sha256-js": "^4.0.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "windmill-components",
"version": "1.414.2",
"version": "1.415.1",
"scripts": {
"dev": "vite dev",
"build": "vite build",
@@ -7,9 +7,10 @@
import DarkModeObserver from './DarkModeObserver.svelte'
import { Button, Drawer, DrawerContent } from './common'
import { Plus, Loader2 } from 'lucide-svelte'
import { Plus, Loader2, Link2Off } from 'lucide-svelte'
import type { AppViewerContext } from './apps/types'
import { sendUserToast } from '$lib/toast'
import path from 'path'
const dispatch = createEventDispatcher()
@@ -30,30 +31,36 @@
value: value ?? initialValue,
label: value ?? initialValue
}
: ''
: undefined
let collection = [valueSelect]
let loading = true
async function loadResources(resourceType: string | undefined) {
const nc = (
await ResourceService.listResource({
workspace: $workspaceStore!,
resourceType
})
).map((x) => ({
value: x.path,
label: x.path
}))
loading = true
try {
const nc = (
await ResourceService.listResource({
workspace: appViewerContext?.workspace ?? $workspaceStore,
resourceType
})
).map((x) => ({
value: x.path,
label: x.path
}))
// TODO check if this is needed
if (!nc.find((x) => x.value == value) && (initialValue || value)) {
nc.push({ value: value ?? initialValue!, label: value ?? initialValue! })
}
collection = nc
if (expressOAuthSetup && nc.length > 0) {
value = nc[0].value
valueSelect = nc[0]
// TODO check if this is needed
if (!nc.find((x) => x.value == value) && (initialValue || value)) {
nc.push({ value: value ?? initialValue!, label: value ?? initialValue! })
}
collection = nc
console.log('collection', collection)
if (expressOAuthSetup && nc.length > 0) {
value = nc[0].value
valueSelect = nc[0]
}
} finally {
loading = false
}
}
@@ -85,6 +92,12 @@
sendUserToast(e.detail, true)
open = false
}}
on:refresh={async (e) => {
await loadResources(resourceType)
value = e.detail
valueSelect = { value, label: value }
open = false
}}
/>
{/await}
{/key}
@@ -107,7 +120,8 @@
on:error={(e) => {
sendUserToast(e.detail, true)
}}
on:refresh={(e) => {
on:refresh={async (e) => {
await loadResources(resourceType)
value = e.detail
valueSelect = { value, label: value }
drawer?.closeDrawer?.()
@@ -127,42 +141,89 @@
{/if}
<div class="flex flex-col w-full items-start">
<div class="flex flex-row gap-x-1 w-full">
<Select
{disabled}
portal={!disablePortal}
value={valueSelect}
on:change={(e) => {
value = e.detail.value
valueSelect = e.detail
}}
on:clear={() => {
value = undefined
valueSelect = ''
}}
items={collection}
class="text-clip grow min-w-0"
placeholder="{resourceType ?? 'any'} resource"
inputStyles={SELECT_INPUT_DEFAULT_STYLE.inputStyles}
containerStyles={darkMode
? SELECT_INPUT_DEFAULT_STYLE.containerStylesDark
: SELECT_INPUT_DEFAULT_STYLE.containerStyles}
/>
{#if resourceType}
<Button
<div class="flex flex-row gap-x-1 w-full justify-between items-center">
{#if loading}
<Loader2 size={12} class="animate-spin" />
{:else if expressOAuthSetup && collection.length < 2}
{#if collection.length == 0}
<div class="text-2xs text-primary pr-2">Connect {resourceType}</div>
{:else if collection.length == 1 && value == collection[0]?.value}
<div class="text-2xs text-primary pr-2 flex items-center gap-1">
{resourceType} <div class="rounded-full w-2 h-2 bg-green-600 animate-pulse" />
</div>
{:else}
<Button
color="light"
size="sm"
on:click={() => {
const item = collection[0]
if (item) {
value = item.value
valueSelect = item
}
}}>Use existing</Button
>
{/if}
{:else}
<Select
{disabled}
color="light"
variant="contained"
btnClasses="w-8 px-0.5 py-1.5"
size="sm"
on:click={() => {
open = true
drawer?.openDrawer?.()
portal={!disablePortal}
value={valueSelect}
on:change={(e) => {
value = e.detail.value
valueSelect = e.detail
}}
startIcon={{ icon: Plus }}
iconOnly
on:clear={() => {
value = undefined
valueSelect = undefined
}}
items={collection}
class="text-clip grow min-w-0"
placeholder="{resourceType ?? 'any'} resource"
inputStyles={SELECT_INPUT_DEFAULT_STYLE.inputStyles}
containerStyles={darkMode
? SELECT_INPUT_DEFAULT_STYLE.containerStylesDark
: SELECT_INPUT_DEFAULT_STYLE.containerStyles}
/>
{/if}
<div class="flex gap-1 items-center">
{#if valueSelect && expressOAuthSetup}
<Button
{disabled}
color="light"
variant="contained"
size="sm"
btnClasses="w-8 px-0.5 py-1.5"
iconOnly
on:click={async () => {
if (valueSelect && valueSelect.label) {
value = undefined
await ResourceService.deleteResource({
workspace: appViewerContext?.workspace ?? $workspaceStore,
path: valueSelect.label
})
await loadResources(resourceType)
valueSelect = undefined
}
}}
startIcon={{ icon: Link2Off }}
/>
{/if}
{#if resourceType}
<Button
{disabled}
color="light"
variant="contained"
btnClasses="w-8 px-0.5 py-1.5"
size="sm"
on:click={() => {
open = true
drawer?.openDrawer?.()
}}
startIcon={{ icon: Plus }}
iconOnly
/>
{/if}
</div>
</div>
</div>
@@ -5,6 +5,7 @@
let isAtBottom: boolean = false
let isScrollable = false
export let id: string | null | undefined = undefined
export let scrollableClass: string = ''
export let shiftedShadow: boolean = false
let mutationObserver: MutationObserver
@@ -43,7 +44,7 @@
})
</script>
<div class={twMerge('relative pb-1', scrollableClass)}>
<div {id} class={twMerge('relative pb-1', scrollableClass)}>
<div bind:this={el} on:scroll={handleScroll} class="w-full h-full overflow-y-auto">
<slot />
</div>
@@ -7,7 +7,7 @@
</script>
<div class="max-w-min">
<ToggleButtonGroup bind:selected>
<ToggleButtonGroup id="flow-editor-flow-providers" bind:selected>
<ToggleButton value="all" label="All" light small />
<ToggleButton value="hub" icon={WindmillIcon2} label="Hub" light small />
<ToggleButton value="workspace" icon={Building} label="Workspace" light small />
@@ -11,6 +11,7 @@
import { TabGroup, TabList } from '@rgossiaux/svelte-headlessui'
import { twMerge } from 'tailwind-merge'
export let id: string | null | undefined = undefined
export let selected: any
export let noWFull: boolean = false
export let disabled: boolean = false
@@ -38,6 +39,7 @@
</script>
<TabGroup
{id}
class={twMerge(
`h-8 flex ${noWFull ? '' : 'w-full'} ${disabled ? 'disabled' : ''}`,
$$props.class
@@ -292,7 +292,7 @@
{/if}
</Scrollable>
{/if}
<Scrollable bind:this={scrollable} scrollableClass="grow min-w-0">
<Scrollable id="flow-editor-flow-atom" bind:this={scrollable} scrollableClass="grow min-w-0">
{#if kind == 'script'}
{#each topLevelNodes as [label, kind], i (label)}
<FlowToplevelNode
@@ -33,6 +33,7 @@
<svelte:window on:keydown={handleKeydown} />
<button
id={`flow-editor-new-${lang}`}
class={twMerge(
'px-3 py-2 gap-2 w-full text-left hover:bg-surface-hover flex flex-row items-center transition-all rounded-md',
selected ? 'bg-surface-hover' : ''
@@ -7,13 +7,13 @@
isFlowTainted,
selectFlowStepKind,
setInputBySelector,
triggerAddFlowStep
triggerAddFlowStep,
waitForElementLoading
} from './utils'
import Tutorial from './Tutorial.svelte'
const { flowStore } = getContext<FlowEditorContext>('FlowEditorContext')
const dispatch = createEventDispatcher()
const queue: string[] = []
let tutorial: Tutorial | undefined = undefined
@@ -51,13 +51,12 @@
element: '#svelvet-Input'
},
{
element: '#flow-editor-add-property',
element: 'input[placeholder="Field name"]',
popover: {
title: 'Add a property',
description: 'Click here to add a property to your schema',
title: 'Name your property',
description: 'Give a name to your property. Here we will call it firstname',
onNextClick: () => {
clickButtonBySelector('#flow-editor-add-property')
setInputBySelector('input[placeholder="Field name"]', 'firstname')
setTimeout(() => {
driver.moveNext()
})
@@ -65,27 +64,12 @@
}
},
{
element: '#schema-modal-name',
element: '#flow-editor-add-property',
popover: {
title: 'Name your property',
description: 'Give a name to your property. Here we will call it firstname',
onNextClick: () => {
setInputBySelector('#schema-modal-name', 'firstname')
driver.moveNext()
}
}
},
{
element: '#schema-modal-save',
popover: {
title: 'Save your property',
title: 'Add your property',
description: 'Click here to save your property',
onNextClick: () => {
queue.push(JSON.stringify($flowStore))
clickButtonBySelector('#schema-modal-save')
clickButtonBySelector('#flow-editor-add-property')
setTimeout(() => {
driver.moveNext()
})
@@ -99,20 +83,12 @@
description: 'Click here to add a step to your flow',
onNextClick: () => {
triggerAddFlowStep(0)
setTimeout(() => {
driver.moveNext()
})
},
onPrevClick: () => {
driver.moveTo(1)
$flowStore = JSON.parse(queue.pop() || '{}')
dispatch('reload')
}
}
},
{
popover: {
title: 'Steps kind',
@@ -132,45 +108,48 @@
})
}
},
element: '#flow-editor-insert-module > div > button:nth-child(1)'
element: '#flow-editor-insert-module > div > div > button:nth-child(1)'
},
{
element: '#flow-editor-flow-inputs',
element: '#flow-editor-flow-providers',
popover: {
title: 'Action configuration',
description: 'An action can be inlined, imported from your workspace or the Hub.'
}
},
{
element: '#flow-editor-action-script',
element: '#flow-editor-flow-atom',
popover: {
title: 'Supported languages',
description: 'Windmill support the following languages/runtimes.'
}
},
{
element: '#flow-editor-action-script-bun',
element: '#flow-editor-new-bun',
popover: {
title: 'Typescript',
description: "Let's pick an action to add to your flow",
description: "Let's write a script for your flow",
onNextClick: () => {
clickButtonBySelector('#flow-editor-action-script-bun')
setTimeout(() => {
clickButtonBySelector('#flow-editor-new-bun')
waitForElementLoading('#flow-editor-editor', () => {
driver.moveNext()
})
}
}
},
{
element: '#flow-editor-editor',
popover: {
title: 'Action editor',
description: 'Windmill provides a full code editor to write your actions'
description: 'Windmill provides a full code editor to write your actions',
onPrevClick: () => {
triggerAddFlowStep(0)
setTimeout(() => {
driver.movePrevious()
})
}
}
},
{
element: '#flow-editor-step-input',
popover: {
@@ -178,7 +157,6 @@
description: 'The schema and the UI is autogenerated from your code'
}
},
{
element: '#flow-editor-plug',
popover: {
@@ -187,7 +165,6 @@
'You can provide static values or connect to other nodes result. Here we will connect to the firstname input',
onNextClick: () => {
clickButtonBySelector('#flow-editor-plug')
setTimeout(() => {
driver.moveNext()
})
@@ -79,7 +79,19 @@
})
tutorialControls.$on('previous', () => {
tutorial?.movePrevious()
const step = tutorial?.getActiveStep()
if (step) {
if (tutorial?.getActiveStep()?.popover?.onPrevClick) {
const activeElement = tutorial?.getActiveElement()
tutorial?.getActiveStep()?.popover?.onPrevClick?.(activeElement, step, {
config,
state
})
} else {
tutorial?.movePrevious()
}
}
})
if (popoverDescription) {
+26 -2
View File
@@ -33,13 +33,13 @@ export function triggerAddFlowStep(index: number) {
const button = document.querySelector(`#flow-editor-add-step-${index}`) as HTMLButtonElement
if (button) {
button.parentElement?.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }))
button.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }))
}
}
export function selectFlowStepKind(index: number) {
const button = document.querySelector(
`#flow-editor-insert-module > div > button:nth-child(${index})`
`#flow-editor-insert-module > div > div > button:nth-child(${index})`
) as HTMLButtonElement
if (button) {
@@ -334,3 +334,27 @@ export function connectInlineRunnableInputToComponentOutput(
}
}
}
function elementExists(selector: string): boolean {
return !!document.querySelector(selector)
}
export function waitForElementLoading(
selector: string,
callback: () => void,
interval: number = 50,
maxAttempts: number = 30
): void {
let attempts = 0
const checkExistence = setInterval(() => {
if (elementExists(selector)) {
clearInterval(checkExistence)
callback()
} else if (attempts >= maxAttempts) {
clearInterval(checkExistence)
console.error('Element not found after multiple attempts.')
}
attempts++
}, interval)
}
+2 -2
View File
@@ -4,8 +4,8 @@ verify_ssl = true
name = "pypi"
[packages]
wmill = ">=1.414.2"
wmill_pg = ">=1.414.2"
wmill = ">=1.415.1"
wmill_pg = ">=1.415.1"
sendgrid = "*"
mysql-connector-python = "*"
pymongo = "*"
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: "3.0.3"
info:
version: 1.414.2
version: 1.415.1
title: OpenFlow Spec
contact:
name: Ruben Fiszel
@@ -12,7 +12,7 @@
RootModule = 'WindmillClient.psm1'
# Version number of this module.
ModuleVersion = '1.414.2'
ModuleVersion = '1.415.1'
# Supported PSEditions
# CompatiblePSEditions = @()
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill"
version = "1.414.2"
version = "1.415.1"
description = "A client library for accessing Windmill server wrapping the Windmill client API"
license = "Apache-2.0"
homepage = "https://windmill.dev"
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "wmill-pg"
version = "1.414.2"
version = "1.415.1"
description = "An extension client for the wmill client library focused on pg"
license = "Apache-2.0"
homepage = "https://windmill.dev"
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@windmill/windmill",
"version": "1.414.2",
"version": "1.415.1",
"exports": "./src/index.ts",
"publish": {
"exclude": ["!src", "./s3Types.ts", "./client.ts"]
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "windmill-client",
"description": "Windmill SDK client for browsers and Node.js",
"version": "1.414.2",
"version": "1.415.1",
"author": "Ruben Fiszel",
"license": "Apache 2.0",
"devDependencies": {
+1 -1
View File
@@ -1 +1 @@
1.414.2
1.415.1