From b471d356b95912ef86ecd563263f824bedcbad67 Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Mon, 22 Sep 2025 20:20:28 +0500 Subject: [PATCH] Process fixes (#9910) --- .../components/criterias/BaseCriteria.svelte | 28 +++-- .../criterias/CriteriasEditor.svelte | 2 +- .../UpdateAttributePresenter.svelte | 4 + .../components/settings/ParamsEditor.svelte | 2 +- plugins/process-resources/src/query.ts | 108 +++++++++++------- server-plugins/process-resources/src/index.ts | 3 +- 6 files changed, 93 insertions(+), 54 deletions(-) diff --git a/plugins/process-resources/src/components/criterias/BaseCriteria.svelte b/plugins/process-resources/src/components/criterias/BaseCriteria.svelte index ac8e504d58..e2f90e6aff 100644 --- a/plugins/process-resources/src/components/criterias/BaseCriteria.svelte +++ b/plugins/process-resources/src/components/criterias/BaseCriteria.svelte @@ -37,14 +37,8 @@ $: [val, selectedMode] = parseValue(modesValues, value) - function changeResult () { - if (!selectedMode.withoutEditor && (val === undefined || val === '')) { - dispatch('change', null) - return - } - - const result = buildResult(selectedMode, val) - + function changeResult (value: any): void { + const result = buildResult(selectedMode, value) dispatch('change', result) } @@ -65,7 +59,7 @@ if (prevEditor !== newEditor) { val = undefined } - changeResult() + changeResult(val) }} /> {#if selectedMode.editor} @@ -79,11 +73,23 @@ readonly, val }} - on:change={changeResult} + on:change={(e) => { + changeResult(e.detail) + }} on:delete /> {:else if !selectedMode.withoutEditor} - + { + changeResult(e.detail) + }} + on:delete + /> {/if} diff --git a/plugins/process-resources/src/components/criterias/CriteriasEditor.svelte b/plugins/process-resources/src/components/criterias/CriteriasEditor.svelte index 503e9aa81f..d46ae832ad 100644 --- a/plugins/process-resources/src/components/criterias/CriteriasEditor.svelte +++ b/plugins/process-resources/src/components/criterias/CriteriasEditor.svelte @@ -34,7 +34,7 @@ delete (params as any)[key] } params = params - dispatch('change', { params }) + dispatch('change', params) } diff --git a/plugins/process-resources/src/components/presenters/UpdateAttributePresenter.svelte b/plugins/process-resources/src/components/presenters/UpdateAttributePresenter.svelte index 9c06d0aeec..cc65335f51 100644 --- a/plugins/process-resources/src/components/presenters/UpdateAttributePresenter.svelte +++ b/plugins/process-resources/src/components/presenters/UpdateAttributePresenter.svelte @@ -67,6 +67,10 @@ {#if presenter && !selectedMode.withoutEditor} {#if contextValue && context} + {:else if Array.isArray(val)} + {#each val as item} + + {/each} {:else} {/if} diff --git a/plugins/process-resources/src/components/settings/ParamsEditor.svelte b/plugins/process-resources/src/components/settings/ParamsEditor.svelte index 8f5a5b9f28..6a6b259030 100644 --- a/plugins/process-resources/src/components/settings/ParamsEditor.svelte +++ b/plugins/process-resources/src/components/settings/ParamsEditor.svelte @@ -34,7 +34,7 @@ delete (params as any)[key] } params = params - dispatch('change', { params }) + dispatch('change', params) } diff --git a/plugins/process-resources/src/query.ts b/plugins/process-resources/src/query.ts index f83d6be38b..6473f7161d 100644 --- a/plugins/process-resources/src/query.ts +++ b/plugins/process-resources/src/query.ts @@ -55,8 +55,7 @@ const Between: Mode = { label: view.string.Between, query: { $gte: '$val[0]' as any, $lte: '$val[1]' as any }, parse: (value: any): any => { - if (!Array.isArray(value) || value.length !== 2) return value - return value + return [value.$gte, value.$lte] }, editor: plugin.criteriaEditor.RangeCriteria } @@ -151,54 +150,83 @@ export const Modes = { export type ModeId = keyof typeof Modes +function hasSameKeys (target: any, value: any): boolean { + if (typeof target === 'object' && target !== null && typeof value === 'object' && value !== null) { + const keys1 = Object.keys(target) + const keys2 = Object.keys(value) + + if (keys1.length !== keys2.length) return false + for (const k of keys1) { + if (!keys2.includes(k)) return false + } + + for (const k of keys1) { + if (!hasSameKeys(target[k], value[k])) return false + } + return true + } else { + return true + } +} + +function isModeMatch (mode: Mode, value: any): boolean { + if (typeof mode.query === 'object' && (typeof value !== 'object' || Array.isArray(value))) return false + if (typeof mode.query !== 'object') return typeof value !== 'object' || Array.isArray(value) + return hasSameKeys(mode.query, value) +} + +function getValue (_value: any): any { + let value = _value + while (typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 1) { + value = value[Object.keys(value)[0]] + } + return value +} + export function parseValue (modes: Mode[], value: any): [any, Mode] { if (value == null) { return [value, modes[0]] } for (const mode of modes) { - if (typeof mode.query === 'string' && typeof value !== 'object') { - return [value, mode] - } - let obj1: any = mode.query - let obj2: any = value - while (typeof obj1 === 'object' && typeof obj2 === 'object' && Object.keys(obj1)[0] === Object.keys(obj2)[0]) { - const key1 = Object.keys(obj1)[0] - const key2 = Object.keys(obj2)[0] - if ( - ['string', 'boolean'].includes(typeof obj1[key1]) && - (typeof obj2[key2] !== 'object' || Array.isArray(obj2[key2])) - ) { - if (mode.parse !== undefined) { - return [mode.parse(obj2[key2]), mode] - } - return [mode.withoutEditor === true ? undefined : obj2[key2], mode] + if (isModeMatch(mode, value)) { + if (mode.parse != null) { + return [mode.parse(getValue(value)), mode] } - obj1 = obj1[key1] - obj2 = obj2[key2] + + return [getValue(value), mode] } } return [value, modes[0]] } export function buildResult (mode: Mode, value: any): any { - let q = mode.query - if (typeof q !== 'object') return value - const result: any = {} - let res = result - while (typeof q === 'object') { - const key = Object.keys(q)[0] - const v: any = (q as any)[key] - if (typeof v !== 'object') { - if (typeof value === 'string' && typeof v === 'string') { - res[key] = v.replace('$val', value) - } else { - res[key] = mode.withoutEditor === true ? v : value ?? v - } - return result - } - q = v - res[key] = {} - res = res[key] - } - return result + if (typeof mode.query !== 'object') return value + const res = JSON.parse(JSON.stringify(mode.query)) + fillResult(mode, res, value) + return res +} + +function fillResult (mode: Mode, obj: any, value: any): void { + if (typeof obj !== 'object') return + for (const key in obj) { + const v: any = obj[key] + if (typeof v === 'object') { + fillResult(mode, v, value) + } else { + if (typeof value === 'string' && typeof v === 'string') { + obj[key] = v.replace('$val', value) + } else if (typeof v === 'string' && v === '$val') { + obj[key] = value + } else if (typeof v === 'string' && v.startsWith('$val[')) { + const index = parseInt(v.slice(5, -1)) + if (Array.isArray(value) && !isNaN(index) && index >= 0 && index < value.length) { + obj[key] = value[index] + } else { + obj[key] = undefined + } + } else { + obj[key] = mode.withoutEditor === true ? v : value ?? v + } + } + } } diff --git a/server-plugins/process-resources/src/index.ts b/server-plugins/process-resources/src/index.ts index 3ef716fe15..d49186811b 100644 --- a/server-plugins/process-resources/src/index.ts +++ b/server-plugins/process-resources/src/index.ts @@ -29,6 +29,7 @@ import process, { ContextId, Execution, Method, + parseContext, Process, ProcessContext, ProcessToDo, @@ -279,7 +280,7 @@ function getName (current: ProcessContext | undefined, method: Method, acti const nameField = method.createdContext?.nameField if (nameField !== undefined) { const name = action.params[nameField] - if (name !== undefined && typeof name === 'string' && name !== '') return name + if (name !== undefined && typeof name === 'string' && name !== '' && parseContext(name) === undefined) return name } return current?.name ?? '' }