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 ?? ''
}