From 545e05c3e8dc1354a4c498eb3b65b022cff9e9e5 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 23 Jul 2024 16:42:54 +0200 Subject: [PATCH 01/27] debug container update --- designer/client/src/containers/Debug.tsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/designer/client/src/containers/Debug.tsx b/designer/client/src/containers/Debug.tsx index 053c2dce8a0..4b1d1daab0b 100644 --- a/designer/client/src/containers/Debug.tsx +++ b/designer/client/src/containers/Debug.tsx @@ -1,11 +1,23 @@ /* eslint-disable i18next/no-literal-string */ import React from "react"; -import Inspector from "react-inspector"; +import Inspector, { ObjectLabel, ObjectName } from "react-inspector"; -export function Debug({ data }: { data: any }): JSX.Element { +const defaultNodeRenderer = ({ depth, name, data, isNonenumerable, expanded }) => { + return depth === 0 ? ( + + ) : expanded ? ( + <> + : + + ) : ( + + ); +}; + +export function Debug({ data, name }: { data: any; name?: string }): JSX.Element { return (
- +
); } From 41167a7bb05b317eed96e3244c111d5016cf737d Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 23 Jul 2024 16:48:33 +0200 Subject: [PATCH 02/27] placeholders support --- .../editors/expression/AceWrapper.tsx | 2 ++ .../editors/expression/ExpressionSuggest.tsx | 18 ++++++++++++------ .../editors/expression/RawEditor.tsx | 5 ++++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx b/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx index 25dbad80d4c..63a1528aa92 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx @@ -17,6 +17,7 @@ export type AceWrapperInputProps = { style?: SerializedStyles; rows?: number; cols?: number; + placeholder?: string; }; export interface AceWrapperProps extends Pick { @@ -166,6 +167,7 @@ export default forwardRef(function AceWrapper( setOptions={{ ...DEFAULT_OPTIONS, showLineNumbers }} enableBasicAutocompletion={customAceEditorCompleter && [customAceEditorCompleter]} commands={[...DEFAULT_COMMANDS, ...commands] as unknown as ICommand[]} + placeholder={inputProps.placeholder} /> ); }); diff --git a/designer/client/src/components/graph/node-modal/editors/expression/ExpressionSuggest.tsx b/designer/client/src/components/graph/node-modal/editors/expression/ExpressionSuggest.tsx index f5604664d95..43453118cb1 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/ExpressionSuggest.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/ExpressionSuggest.tsx @@ -2,23 +2,29 @@ import "ace-builds/src-noconflict/ace"; import { isEmpty, isEqual } from "lodash"; import React, { useEffect, useRef, useState } from "react"; import { useSelector } from "react-redux"; -import { getProcessDefinitionData } from "../../../../../reducers/selectors/settings"; -import { getProcessingType } from "../../../../../reducers/selectors/graph"; -import { BackendExpressionSuggester } from "./ExpressionSuggester"; import HttpService from "../../../../../http/HttpService"; -import { CustomAceEditorCompleter } from "./CustomAceEditorCompleter"; +import { getProcessingType } from "../../../../../reducers/selectors/graph"; +import { getProcessDefinitionData } from "../../../../../reducers/selectors/settings"; import { VariableTypes } from "../../../../../types"; +import { CustomAceEditorCompleter } from "./CustomAceEditorCompleter"; import { CustomCompleterAceEditor, CustomCompleterAceEditorProps } from "./CustomCompleterAceEditor"; +import { BackendExpressionSuggester } from "./ExpressionSuggester"; export type ExpressionSuggestProps = Omit & { variableTypes: VariableTypes; }; function useDeepMemo(factory: () => T, deps: React.DependencyList): T { - const ref = useRef<{ value: T; deps: React.DependencyList }>(); + const ref = useRef<{ + value: T; + deps: React.DependencyList; + }>(); if (!ref.current || !isEqual(deps, ref.current.deps)) { - ref.current = { value: factory(), deps }; + ref.current = { + value: factory(), + deps, + }; } return ref.current.value; diff --git a/designer/client/src/components/graph/node-modal/editors/expression/RawEditor.tsx b/designer/client/src/components/graph/node-modal/editors/expression/RawEditor.tsx index a88c608d508..bb7eefb51a1 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/RawEditor.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/RawEditor.tsx @@ -18,6 +18,7 @@ export type RawEditorProps = { variableTypes: VariableTypes; validationLabelInfo?: string; editorMode?: EditorMode; + placeholder?: string; }; const RawEditorComponent = (props: RawEditorProps, forwardedRef: ForwardedRef) => { @@ -34,6 +35,7 @@ const RawEditorComponent = (props: RawEditorProps, forwardedRef: ForwardedRef expressionObj.expression, [expressionObj.expression]); @@ -49,8 +51,9 @@ const RawEditorComponent = (props: RawEditorProps, forwardedRef: ForwardedRef Date: Tue, 23 Jul 2024 16:51:25 +0200 Subject: [PATCH 03/27] optional fieldErrors --- .../components/graph/node-modal/editors/EditableEditor.tsx | 4 ++-- .../src/components/graph/node-modal/editors/field/Input.tsx | 4 ++-- .../graph/node-modal/fragment-input-definition/TypeSelect.tsx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/editors/EditableEditor.tsx b/designer/client/src/components/graph/node-modal/editors/EditableEditor.tsx index 483b22fe317..52119f9d3ca 100644 --- a/designer/client/src/components/graph/node-modal/editors/EditableEditor.tsx +++ b/designer/client/src/components/graph/node-modal/editors/EditableEditor.tsx @@ -22,14 +22,14 @@ interface Props { isMarked?: boolean; showValidation?: boolean; onValueChange: (value: string) => void; - fieldErrors: FieldError[]; + fieldErrors?: FieldError[]; variableTypes: VariableTypes; validationLabelInfo?: string; placeholder?: string; } export const EditableEditor = forwardRef((props: Props, ref) => { - const { expressionObj, valueClassName, param, fieldErrors, validationLabelInfo } = props; + const { expressionObj, valueClassName, param, fieldErrors = [], validationLabelInfo } = props; const editorType = useMemo(() => (isEmpty(param) ? EditorType.RAW_PARAMETER_EDITOR : param.editor.type), [param]); diff --git a/designer/client/src/components/graph/node-modal/editors/field/Input.tsx b/designer/client/src/components/graph/node-modal/editors/field/Input.tsx index d6abe1cc8d0..4bb1355a869 100644 --- a/designer/client/src/components/graph/node-modal/editors/field/Input.tsx +++ b/designer/client/src/components/graph/node-modal/editors/field/Input.tsx @@ -13,7 +13,7 @@ export interface InputProps > { value: string; inputClassName?: string; - fieldErrors: FieldError[]; + fieldErrors?: FieldError[]; isMarked?: boolean; showValidation?: boolean; } @@ -24,7 +24,7 @@ export default function Input(props: InputProps): JSX.Element { showValidation, className, value, - fieldErrors, + fieldErrors = [], type = "text", inputClassName, autoFocus, diff --git a/designer/client/src/components/graph/node-modal/fragment-input-definition/TypeSelect.tsx b/designer/client/src/components/graph/node-modal/fragment-input-definition/TypeSelect.tsx index 442597b937e..f3b730b94d8 100644 --- a/designer/client/src/components/graph/node-modal/fragment-input-definition/TypeSelect.tsx +++ b/designer/client/src/components/graph/node-modal/fragment-input-definition/TypeSelect.tsx @@ -41,7 +41,7 @@ interface RowSelectProps extends Omit, "value" | "o isMarked?: boolean; value: Option; placeholder?: string; - fieldErrors: FieldError[]; + fieldErrors?: FieldError[]; } export function TypeSelect({ @@ -52,7 +52,7 @@ export function TypeSelect({ onChange, onBlur, placeholder, - fieldErrors, + fieldErrors = [], ...props }: RowSelectProps): JSX.Element { const { setCaptureEsc, preventEsc } = useCaptureEsc(); From 7aaa9a8b63614adfe3440b6ccc41586ff74eceea Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 23 Jul 2024 16:53:14 +0200 Subject: [PATCH 04/27] cleanup --- .../components/graph/node-modal/editors/field/Input.tsx | 2 +- .../node-modal/fragment-input-definition/TypeSelect.tsx | 8 +++----- .../src/components/graph/node-modal/node/NodeValue.tsx | 5 ++++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/editors/field/Input.tsx b/designer/client/src/components/graph/node-modal/editors/field/Input.tsx index 4bb1355a869..30f3fcf3a1c 100644 --- a/designer/client/src/components/graph/node-modal/editors/field/Input.tsx +++ b/designer/client/src/components/graph/node-modal/editors/field/Input.tsx @@ -38,7 +38,7 @@ export default function Input(props: InputProps): JSX.Element { return (
-
+
+ { + onChange(uuid, { name: e.target.value.replaceAll(/["]/g, "") }); + }} + value={name} + className={css({ + flexBasis: "35%", + })} + disabled={readOnly} + /> + { + onChange(uuid, { agg: value }); + }} + value={options.find(({ value }) => value === agg)} + options={options} + readOnly={readOnly} + /> + { + onChange(uuid, { value }); + }} + valueClassName={css({ + flexBasis: "70%", + })} + readOnly={readOnly} + /> + + ); +} diff --git a/designer/client/src/components/graph/node-modal/customNode.tsx b/designer/client/src/components/graph/node-modal/customNode.tsx index f772a22d822..3191170a412 100644 --- a/designer/client/src/components/graph/node-modal/customNode.tsx +++ b/designer/client/src/components/graph/node-modal/customNode.tsx @@ -6,6 +6,7 @@ import { NodeField } from "./NodeField"; import { FieldType } from "./editors/field/Field"; import { DescriptionField } from "./DescriptionField"; import { ParametersList } from "./parametersList"; +import { CustomNodeFieldOverrideWrapper } from "./customNodeParameters"; export type CustomNodeProps = { errors: NodeValidationError[]; @@ -73,6 +74,7 @@ export function CustomNode({ renderFieldLabel={renderFieldLabel} setProperty={setProperty} getListFieldPath={(index: number) => `parameters[${index}]`} + FieldWrapper={CustomNodeFieldOverrideWrapper} /> { + switch (props.node.nodeType) { + case "aggregate-session": + case "aggregate-sliding": + case "aggregate-tumbling": + switch (props.parameter.name) { + case "aggregator": + return {children}; + case "aggregateBy": + return null; + } + } + return <>{children}; +}; diff --git a/designer/client/src/components/graph/node-modal/parameterHelpers.tsx b/designer/client/src/components/graph/node-modal/parameterHelpers.tsx index 6a3e713ca5d..e74f8883621 100644 --- a/designer/client/src/components/graph/node-modal/parameterHelpers.tsx +++ b/designer/client/src/components/graph/node-modal/parameterHelpers.tsx @@ -1,4 +1,13 @@ -import { UIParameter } from "../../../types"; +import { Parameter, UIParameter } from "../../../types"; +import { useMemo } from "react"; + +export function useParameter(parameters: Parameter[], paramName: string): [Parameter, string] { + const index = useMemo(() => parameters?.findIndex((param) => param.name === paramName), [paramName, parameters]); + const parameter = useMemo(() => parameters[index], [index, parameters]); + const path = useMemo(() => `parameters[${index}].expression.expression`, [index]); + + return [parameter, path]; +} export function findParamDefinitionByName(definitions: UIParameter[], paramName: string): UIParameter { return definitions?.find((param) => param.name === paramName); From 8675e388aab5aad0896f845d392a1ac9d9e30a02 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Fri, 2 Aug 2024 23:33:47 +0200 Subject: [PATCH 08/27] refactor & test fix --- .../components/common/dndItems/DndItems.tsx | 8 +- .../components/common/dndItems/DropTarget.tsx | 7 +- .../node-modal/ParameterExpressionField.tsx | 24 ++- .../node-modal/aggregate/aggMapLikeParser.tsx | 10 +- .../node-modal/aggregate/aggregateContext.tsx | 110 ++++++++++++++ .../node-modal/aggregate/aggregatorField.tsx | 140 +++++++----------- .../aggregate/aggregatorFieldsStack.tsx | 91 +++++++----- .../node-modal/aggregate/dynamicLabel.tsx | 27 ++++ .../node-modal/aggregateParametersList.tsx | 13 ++ .../graph/node-modal/customNode.tsx | 11 +- .../graph/node-modal/customNodeParameters.tsx | 23 ++- .../graph/node-modal/parameterHelpers.tsx | 11 +- designer/client/src/http/HttpService.ts | 64 ++++++-- .../client/test/CompareVersionDialog-test.tsx | 5 + 14 files changed, 372 insertions(+), 172 deletions(-) create mode 100644 designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx create mode 100644 designer/client/src/components/graph/node-modal/aggregate/dynamicLabel.tsx create mode 100644 designer/client/src/components/graph/node-modal/aggregateParametersList.tsx diff --git a/designer/client/src/components/common/dndItems/DndItems.tsx b/designer/client/src/components/common/dndItems/DndItems.tsx index 9e7efa28808..a11c744b958 100644 --- a/designer/client/src/components/common/dndItems/DndItems.tsx +++ b/designer/client/src/components/common/dndItems/DndItems.tsx @@ -11,10 +11,11 @@ import { alpha, Box } from "@mui/material"; interface DndListProps extends ItemsProps { disabled?: boolean; onChange: (value: I[]) => void; + onDestinationChange?: (index: number | null) => void; } export function DndItems(props: DndListProps): JSX.Element { - const { items, onChange, disabled } = props; + const { items, onChange, onDestinationChange, disabled } = props; const moveItem = useCallback( (source: number, target: number) => { @@ -28,8 +29,9 @@ export function DndItems(props: DndListProps): JSX.Element { }); onChange(newFields); } + onDestinationChange?.(null); }, - [items, onChange], + [items, onChange, onDestinationChange], ); const droppableId = useRef(Date.now().toString()); @@ -61,6 +63,8 @@ export function DndItems(props: DndListProps): JSX.Element { renderClone={renderDraggable} CloneWrapper={FakeFormWindow} onDragEnd={({ destination, source }) => moveItem(source?.index, destination?.index)} + onDragStart={({ source }) => onDestinationChange?.(source?.index)} + onDragUpdate={({ destination }) => onDestinationChange?.(destination?.index)} > {items.map((_, index) => ( diff --git a/designer/client/src/components/common/dndItems/DropTarget.tsx b/designer/client/src/components/common/dndItems/DropTarget.tsx index 78896dc5759..7691c811286 100644 --- a/designer/client/src/components/common/dndItems/DropTarget.tsx +++ b/designer/client/src/components/common/dndItems/DropTarget.tsx @@ -8,16 +8,19 @@ export function DropTarget({ renderClone, CloneWrapper = "div", onDragEnd, + onDragStart, + onDragUpdate, ...props }: PropsWithChildren< - { CloneWrapper?: ReactComponentLike } & Pick & Omit + { CloneWrapper?: ReactComponentLike } & Pick & + Omit >): JSX.Element { const clone: DraggableChildrenFn = useCallback( (...args) => {renderClone(...args)}, [CloneWrapper, renderClone], ); return ( - + {(p) => (
diff --git a/designer/client/src/components/graph/node-modal/ParameterExpressionField.tsx b/designer/client/src/components/graph/node-modal/ParameterExpressionField.tsx index b06d6e5149c..0212b2c3643 100644 --- a/designer/client/src/components/graph/node-modal/ParameterExpressionField.tsx +++ b/designer/client/src/components/graph/node-modal/ParameterExpressionField.tsx @@ -24,7 +24,7 @@ export type ParameterExpressionFieldProps = { }; //this is for "dynamic" parameters in sources, sinks, services etc. -export function ParameterExpressionField({ FieldWrapper = React.Fragment, ...props }: ParameterExpressionFieldProps): JSX.Element { +export function ParameterExpressionField({ FieldWrapper, ...props }: ParameterExpressionFieldProps): JSX.Element { const { errors, findAvailableVariables, @@ -50,8 +50,8 @@ export function ParameterExpressionField({ FieldWrapper = React.Fragment, ...pro [findAvailableVariables, node.id, parameter.name, parameterDefinitions], ); - return ( - + const field = useMemo( + () => ( - + ), + [ + errors, + isEditMode, + listFieldPath, + node, + parameter.name, + parameterDefinitions, + renderFieldLabel, + setProperty, + showSwitch, + showValidation, + testResultsState.testResultsToShow, + variableTypes, + ], ); + + return FieldWrapper ? {field} : <>{field}; } diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx index 69cac10ef1a..530ef4a49bb 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx @@ -18,7 +18,7 @@ const Colon = createToken({ }); const Identifier = createToken({ name: "Identifier", - pattern: /([a-zA-Z]\w+|"[^"]+")/, + pattern: /([a-zA-Z]\w*|"[^"]+")/, }); const Number = createToken({ name: "Number", @@ -72,8 +72,12 @@ export class AggMapLikeParser extends EmbeddedActionsParser { { ALT: () => this.CONSUME(Number) }, ]); - const key = lit.isInsertedInRecovery ? "BAD_KEY" : lit.image.replaceAll(/"/g, ""); - obj[key] = value.image; + let key: string; + + if (!lit.isInsertedInRecovery) { + key = lit.image.replaceAll(/"/g, ""); + obj[key] = value.image; + } return obj; }); diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx new file mode 100644 index 00000000000..cc9b2db46e9 --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx @@ -0,0 +1,110 @@ +import React, { createContext, PropsWithChildren, useCallback, useMemo, useState } from "react"; +import { ParametersListProps } from "../parametersList"; +import { useParameterPath } from "../parameterHelpers"; +import { get, padStart, uniqBy } from "lodash"; +import { AggregateValue, AggRow, appendUuid } from "./aggregatorField"; +import { useDiffMark } from "../PathsToMark"; +import { NodeValidationError } from "../../../../types"; +import { AggMapLikeLexer, AggMapLikeParser } from "./aggMapLikeParser"; + +function useAggParamsSerializer(): [(text: string) => Record, (paramName: string, map: Record) => string] { + const parser = useMemo(() => new AggMapLikeParser(), []); + + const deserialize = useCallback( + (text: string): Record => { + const lexingResult = AggMapLikeLexer.tokenize(text); + parser.input = lexingResult.tokens; + return parser.object() || null; + }, + [parser], + ); + + const serialize = useCallback((paramName: string, map: Record): string => { + const entries = Object.entries(map || {}).map(([key, value]) => { + const trimmedKey = key.trim(); + return [/^[^a-zA-Z]|\W/.test(trimmedKey) ? `"${trimmedKey}"` : trimmedKey, value]; + }); + + const keyLength = entries.reduce((value, [key]) => Math.max(value, key.length), 0); + const content = entries.map(([key, value]) => ` ${padStart(key, keyLength, " ")}: ${value}`).join(",\n"); + + if (!content) return ""; + + switch (paramName) { + case "aggregator": + return `#AGG.map({\n${content}\n})`; + case "aggregateBy": + return `{\n${content}\n}`; + } + }, []); + return [deserialize, serialize]; +} + +type AggregateContextProviderProps = PropsWithChildren>; + +export const AggregateContextProvider = ({ children, node, setProperty, errors }: AggregateContextProviderProps) => { + const { parameters } = node; + + const [deserialize, serialize] = useAggParamsSerializer(); + + const aggregatorPath = useParameterPath(parameters, "aggregator"); + const aggregateByPath = useParameterPath(parameters, "aggregateBy"); + + const [values = [], setValues] = useState(() => { + const aggregatorParam = deserialize(get(node, aggregatorPath)); + const aggregateByParam = deserialize(get(node, aggregateByPath)); + + const keys = Object.keys({ ...aggregateByParam, ...aggregatorParam }); + + if (!keys.length) { + return null; + } + + return keys + .map((name) => ({ + name, + agg: aggregatorParam?.[name], + expression: aggregateByParam?.[name], + })) + .map(appendUuid); + }); + + const onChange = useCallback( + (values: AggregateValue[]) => { + setValues(values); + const aggregator = Object.fromEntries(values.map(({ name, agg }) => (name && agg ? [name, agg] : null)).filter(Boolean)); + const aggregateBy = Object.fromEntries( + values.map(({ name, expression }) => (name && expression ? [name, expression] : null)).filter(Boolean), + ); + setProperty(aggregatorPath, serialize("aggregator", aggregator)); + setProperty(aggregateByPath, serialize("aggregateBy", aggregateBy)); + }, + [aggregateByPath, aggregatorPath, serialize, setProperty], + ); + + const [diffMark] = useDiffMark(); + const isMarked = useMemo(() => diffMark(aggregatorPath) || diffMark(aggregateByPath), [aggregateByPath, aggregatorPath, diffMark]); + + const fieldErrors = useMemo(() => { + const fieldErrors = errors.filter(({ fieldName }) => ["aggregator", "aggregateBy"].includes(fieldName)); + return uniqBy(fieldErrors, "message"); + }, [errors]); + + const value = useMemo( + () => ({ + values, + onChange, + isMarked, + fieldErrors, + }), + [fieldErrors, isMarked, onChange, values], + ); + return {children}; +}; + +export const AggregateContext = createContext<{ + values: AggregateValue[]; + onChange?: (value: AggregateValue[]) => void; + isMarked?: boolean; + fieldErrors?: NodeValidationError[]; +}>({ values: null }); diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx index 83d6c1ef41a..9efee9cbf49 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx @@ -1,23 +1,23 @@ import { FieldWrapperProps } from "../ParameterExpressionField"; -import React, { useCallback, useEffect, useMemo } from "react"; -import { AggMapLikeLexer, AggMapLikeParser } from "./aggMapLikeParser"; -import { findParamDefinitionByName, useParameter } from "../parameterHelpers"; +import React, { useCallback, useContext, useEffect, useMemo, useState } from "react"; +import { findParamDefinitionByName } from "../parameterHelpers"; import { useArrayState } from "rooks"; import { NodeRowFieldsProvider } from "../node-row-fields-provider"; import { v4 as uuid4 } from "uuid"; import { AggregatorFieldsStack } from "./aggregatorFieldsStack"; import { useSelector } from "react-redux"; import { getFindAvailableVariables } from "../NodeDetailsContent/selectors"; -import { padStart } from "lodash"; import { FieldsRow } from "../fragment-input-definition/FieldsRow"; import { DndItems } from "../../../common/dndItems/DndItems"; -import { useDiffMark } from "../PathsToMark"; import { cx } from "@emotion/css"; +import { AggregateContext } from "./aggregateContext"; +import { Box } from "@mui/material"; + export type AggRow = { name: string; agg: string; - value: string; + expression: string; }; export type WithUuid> = Omit & { @@ -28,82 +28,30 @@ export function appendUuid>(o: T): WithUuid { return { uuid: uuid4(), ...o }; } -export function AggregatorField({ parameterDefinitions, node: { id, parameters }, setProperty, ...props }: FieldWrapperProps) { - const parser = useMemo(() => new AggMapLikeParser(), []); - - const deserialize = useCallback( - (text: string): Record => { - const lexingResult = AggMapLikeLexer.tokenize(text); - parser.input = lexingResult.tokens; - return parser.object() || null; - }, - [parser], - ); - - const serialize = useCallback((paramName: string, map: Record): string => { - const entries = Object.entries(map || {}).map(([key, value]) => { - const trimmedKey = key.trim(); - return [/^[^a-zA-Z]|\W/.test(trimmedKey) ? `"${trimmedKey}"` : trimmedKey, value]; - }); - - const keyLength = entries.reduce((value, [key]) => Math.max(value, key.length), 0); - const content = entries.map(([key, value]) => ` ${padStart(key, keyLength, " ")}: ${value}`).join(",\n"); - - switch (paramName) { - case "aggregator": - return `#AGG.map({\n${content}\n})`; - case "aggregateBy": - return `{\n${content}\n}`; - } - }, []); +export type AggregateValue = WithUuid; +export function AggregatorField({ parameterDefinitions, node: { id }, isEditMode, showValidation }: FieldWrapperProps) { const aggregators = useMemo(() => { const definition = findParamDefinitionByName(parameterDefinitions, "aggregator"); return definition.editor.simpleEditor.possibleValues; }, [parameterDefinitions]); - const [aggregator, aggregatorPath] = useParameter(parameters, "aggregator"); - const [aggregateBy, aggregateByPath] = useParameter(parameters, "aggregateBy"); - - const [diffMark] = useDiffMark(); - - const isMarked = useMemo(() => diffMark(aggregatorPath) || diffMark(aggregateByPath), [aggregateByPath, aggregatorPath, diffMark]); - const errors = useMemo(() => props.errors.filter(({ fieldName }) => ["aggregator", "aggregateBy"].includes(fieldName)), [props.errors]); - - const parsed = useMemo(() => { - const aggregatorParam = deserialize(aggregator?.expression.expression); - const aggregateByParam = deserialize(aggregateBy?.expression.expression); - - const keys = Object.keys({ ...aggregateByParam, ...aggregatorParam }); - - return keys - .map((name) => ({ - name, - agg: aggregatorParam[name], - value: aggregateByParam[name], - })) - .map(appendUuid); - }, [aggregateBy?.expression.expression, aggregator?.expression.expression, deserialize]); - - const [data, dataControls] = useArrayState>(() => parsed); - - useEffect(() => { - const filtered = data.filter(({ name, agg, value }) => name && agg && value); - const aggregator = Object.fromEntries(filtered.map(({ name, agg }) => [name, agg])); - const aggregateBy = Object.fromEntries(filtered.map(({ name, value }) => [name, value])); - setProperty(aggregatorPath, serialize("aggregator", aggregator)); - setProperty(aggregateByPath, serialize("aggregateBy", aggregateBy)); - }, [aggregateByPath, aggregatorPath, data, serialize, setProperty]); - - const onAdd = useCallback(() => { - dataControls.push( - appendUuid({ - name: "", - agg: aggregators[0].expression, - value: "", - }), - ); - }, [aggregators, dataControls]); + const { values, onChange, isMarked, fieldErrors = [] } = useContext(AggregateContext); + const [data, dataControls] = useArrayState(() => values); + + const onAdd = useCallback( + (value?: Partial) => { + dataControls.push( + appendUuid({ + name: "", + agg: aggregators[0].expression, + expression: "", + ...value, + }), + ); + }, + [aggregators, dataControls], + ); const onRemove = useCallback( (_: string, uuid: string) => { @@ -127,36 +75,48 @@ export function AggregatorField({ parameterDefinitions, node: { id, parameters } const findAvailableVariables = useSelector(getFindAvailableVariables); const variableTypes = useMemo(() => findAvailableVariables?.(id), [findAvailableVariables, id]); + const errors = showValidation ? fieldErrors : []; + + const [hovered, setHovered] = useState(null); + const items = useMemo(() => { return data.map((item, index) => ({ item, el: ( - + ), })); - }, [aggregators, onChangeItem, data, variableTypes]); + }, [data, onChangeItem, aggregators, variableTypes, hovered]); useEffect(() => { - if (data.length < 1) { - onAdd(); - } - }, [data.length, onAdd]); + onChange?.(data); + }, [data, onChange]); - const readOnly = !props.isEditMode; return ( 1 && onRemove} - onFieldAdd={onAdd} - readOnly={readOnly} - errors={props.showValidation ? errors : []} + onFieldAdd={() => onAdd()} + readOnly={!isEditMode} + errors={errors} > -
- -
+ + +
); } diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx index 9f481b00536..888505ca816 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx @@ -1,12 +1,12 @@ import React, { useMemo } from "react"; import { AggRow, WithUuid } from "./aggregatorField"; -import { css } from "@emotion/css"; import Input from "../editors/field/Input"; import { TypeSelect } from "../fragment-input-definition/TypeSelect"; import { EditableEditor } from "../editors/EditableEditor"; import { ExpressionLang } from "../editors/expression/types"; import { VariableTypes } from "../../../../types"; import { useFieldsContext } from "../node-row-fields-provider"; +import { DynamicLabel } from "./dynamicLabel"; export type PossibleValue = { expression: string; @@ -18,57 +18,72 @@ type AggregatorFieldsStackProps = { onChange: (uuid: string, updated: Partial) => void; aggregators: PossibleValue[]; variableTypes: VariableTypes; + hovered?: boolean; }; +const PRESETS = [ + { + label: "(Count)", + value: "@COUNT", + agg: "#AGG.sum", + expression: "1", + }, +]; + export function AggregatorFieldsStack({ - value: { agg, name, uuid, value }, + value: { agg, name, uuid, expression }, onChange, aggregators, variableTypes, + hovered, }: AggregatorFieldsStackProps) { const { readOnly } = useFieldsContext(); - const options = useMemo(() => { - return aggregators.map(({ expression: value, label }) => ({ + const options = useMemo<{ value: string; label: string; expression?: string }[]>(() => { + const values = aggregators.map(({ expression: value, label }) => ({ value, label, })); + return [...values, ...PRESETS]; }, [aggregators]); + return ( <> - { - onChange(uuid, { name: e.target.value.replaceAll(/["]/g, "") }); - }} - value={name} - className={css({ - flexBasis: "35%", - })} - disabled={readOnly} - /> - { - onChange(uuid, { agg: value }); - }} - value={options.find(({ value }) => value === agg)} - options={options} - readOnly={readOnly} - /> - { - onChange(uuid, { value }); - }} - valueClassName={css({ - flexBasis: "70%", - })} - readOnly={readOnly} - /> + + { + onChange(uuid, { name: e.target.value.replaceAll(/["]/g, "") }); + }} + value={name} + disabled={readOnly} + /> + + + { + const preset = PRESETS.find((p) => p.value === value); + if (preset) { + return onChange(uuid, preset); + } + onChange(uuid, { agg: value }); + }} + value={options.find(({ value }) => value === agg)} + options={options} + readOnly={readOnly} + /> + + + { + onChange(uuid, { expression: value }); + }} + readOnly={readOnly} + /> + ); } diff --git a/designer/client/src/components/graph/node-modal/aggregate/dynamicLabel.tsx b/designer/client/src/components/graph/node-modal/aggregate/dynamicLabel.tsx new file mode 100644 index 00000000000..d2bd3377ed9 --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/dynamicLabel.tsx @@ -0,0 +1,27 @@ +import { Box, styled } from "@mui/material"; + +type DynamicLabelProps = { + label: string; + hovered: boolean; +}; + +export const DynamicLabel = styled(Box, { + shouldForwardProp: (propName: string) => !["text", "hovered"].includes(propName), +})(({ theme, label, hovered }) => ({ + "&::before": { + ...theme.typography.overline, + color: theme.palette.text.disabled, + + position: "absolute", + bottom: "100%", + marginBottom: theme.spacing(0.75), + + "[data-testid^='draggable']:first-of-type &": { + content: hovered ? "unset" : `'${label}'`, + }, + + "[data-testid^='draggable'][style*='fixed'] &": { + content: hovered ? `'${label}'` : "unset", + }, + }, +})); diff --git a/designer/client/src/components/graph/node-modal/aggregateParametersList.tsx b/designer/client/src/components/graph/node-modal/aggregateParametersList.tsx new file mode 100644 index 00000000000..7c8145c6a6d --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregateParametersList.tsx @@ -0,0 +1,13 @@ +import { ParametersList, ParametersListProps } from "./parametersList"; +import { AggregateContextProvider } from "./aggregate/aggregateContext"; +import { AggregateFieldOverrideWrapper } from "./customNodeParameters"; +import React from "react"; + +export const AggregateParametersList = (props: ParametersListProps) => { + const { errors, node, setProperty } = props; + return ( + + ; + + ); +}; diff --git a/designer/client/src/components/graph/node-modal/customNode.tsx b/designer/client/src/components/graph/node-modal/customNode.tsx index 3191170a412..2fcc80dc4ce 100644 --- a/designer/client/src/components/graph/node-modal/customNode.tsx +++ b/designer/client/src/components/graph/node-modal/customNode.tsx @@ -6,7 +6,7 @@ import { NodeField } from "./NodeField"; import { FieldType } from "./editors/field/Field"; import { DescriptionField } from "./DescriptionField"; import { ParametersList } from "./parametersList"; -import { CustomNodeFieldOverrideWrapper } from "./customNodeParameters"; +import { AggregateParametersList } from "./aggregateParametersList"; export type CustomNodeProps = { errors: NodeValidationError[]; @@ -38,6 +38,12 @@ export function CustomNode({ (): boolean => !!ProcessUtils.extractComponentDefinition(node, processDefinitionData.components)?.returnType || !!node.outputVar, [node, processDefinitionData.components], ); + + const ParametersComponent = useMemo(() => { + const isAggregate = ["aggregate-session", "aggregate-sliding", "aggregate-tumbling"].includes(node.nodeType); + return isAggregate ? AggregateParametersList : ParametersList; + }, [node.nodeType]); + return ( <> )} {children} - `parameters[${index}]`} - FieldWrapper={CustomNodeFieldOverrideWrapper} /> { - switch (props.node.nodeType) { - case "aggregate-session": - case "aggregate-sliding": - case "aggregate-tumbling": - switch (props.parameter.name) { - case "aggregator": - return {children}; - case "aggregateBy": - return null; - } +export const AggregateFieldOverrideWrapper = function AggregateFieldOverrideWrapper({ children, ...props }: FieldWrapperProps) { + const { values } = useContext(AggregateContext); + if (values?.length) { + switch (props.parameter.name) { + case "aggregator": + return ; + case "aggregateBy": + return null; + } } return <>{children}; }; diff --git a/designer/client/src/components/graph/node-modal/parameterHelpers.tsx b/designer/client/src/components/graph/node-modal/parameterHelpers.tsx index e74f8883621..32ef992f3c4 100644 --- a/designer/client/src/components/graph/node-modal/parameterHelpers.tsx +++ b/designer/client/src/components/graph/node-modal/parameterHelpers.tsx @@ -1,12 +1,13 @@ import { Parameter, UIParameter } from "../../../types"; import { useMemo } from "react"; -export function useParameter(parameters: Parameter[], paramName: string): [Parameter, string] { - const index = useMemo(() => parameters?.findIndex((param) => param.name === paramName), [paramName, parameters]); - const parameter = useMemo(() => parameters[index], [index, parameters]); - const path = useMemo(() => `parameters[${index}].expression.expression`, [index]); +export function getParamIndex(parameters: Parameter[], paramName: string) { + return parameters?.findIndex((param) => param.name === paramName); +} - return [parameter, path]; +export function useParameterPath(parameters: Parameter[], paramName: string): string { + const index = useMemo(() => getParamIndex(parameters, paramName), [paramName, parameters]); + return useMemo(() => `parameters[${index}].expression.expression`, [index]); } export function findParamDefinitionByName(definitions: UIParameter[], paramName: string): UIParameter { diff --git a/designer/client/src/http/HttpService.ts b/designer/client/src/http/HttpService.ts index d7b4a45b34e..75ad9b0c7cd 100644 --- a/designer/client/src/http/HttpService.ts +++ b/designer/client/src/http/HttpService.ts @@ -18,7 +18,7 @@ import { } from "../components/Process/types"; import { ToolbarsConfig } from "../components/toolbarSettings/types"; import { AuthenticationSettings } from "../reducers/settings"; -import { Expression, NodeType, ProcessAdditionalFields, ProcessDefinitionData, ReturnedType, ScenarioGraph, VariableTypes } from "../types"; +import { Component, Expression, NodeType, ProcessAdditionalFields, ProcessDefinitionData, ScenarioGraph, VariableTypes } from "../types"; import { Instant, WithId } from "../types/common"; import { BackendNotification } from "../containers/Notifications"; import { ProcessCounts } from "../reducers/graph"; @@ -27,7 +27,6 @@ import { AdditionalInfo } from "../components/graph/node-modal/NodeAdditionalInf import { withoutHackOfEmptyEdges } from "../components/graph/GraphPartialsInTS/EdgeUtils"; import { CaretPosition2d, ExpressionSuggestion } from "../components/graph/node-modal/editors/expression/ExpressionSuggester"; import { GenericValidationRequest } from "../actions/nk/genericAction"; -import { EventTrackingSelector } from "../containers/event-tracking"; import { EventTrackingSelectorType, EventTrackingType } from "../containers/event-tracking/use-register-tracking-events"; type HealthCheckProcessDeploymentType = { @@ -160,6 +159,46 @@ export interface ScenarioParametersCombinations { export type ProcessDefinitionDataDictOption = { key: string; label: string }; type DictOption = { id: string; label: string }; +function fixBranchParametersTemplate({ node, branchParametersTemplate, ...component }: Component): Component { + // This is a walk-around for having part of node template (branch parameters) outside of itself. + // See note in DefinitionPreparer on backend side. // TODO remove it after API refactor + return { + ...component, + node: { + ...node, + branchParametersTemplate, + }, + branchParametersTemplate, + }; +} + +function fixAggregateParameters(component: Component): Component { + if (!["aggregate-session", "aggregate-sliding", "aggregate-tumbling"].includes(component.node.nodeType)) { + return component; + } + + const parameters = component.node.parameters.map((parameter) => { + switch (parameter.name) { + case "aggregator": + return { + ...parameter, + expression: { ...parameter.expression, expression: "#AGG.map({count: #AGG.sum})" }, + }; + case "aggregateBy": + return { + ...parameter, + expression: { ...parameter.expression, expression: "{count: 1}" }, + }; + } + return parameter; + }); + + return { + ...component, + node: { ...component.node, parameters }, + }; +} + class HttpService { //TODO: Move show information about error to another place. HttpService should avoid only action (get / post / etc..) - handling errors should be in another place. #notificationActions: NotificationActions = null; @@ -220,17 +259,16 @@ class HttpService { fetchProcessDefinitionData(processingType: string, isFragment: boolean) { const promise = api .get(`/processDefinitionData/${processingType}?isFragment=${isFragment}`) - .then((response) => { - // This is a walk-around for having part of node template (branch parameters) outside of itself. - // See note in DefinitionPreparer on backend side. // TODO remove it after API refactor - response.data.componentGroups.forEach((group) => { - group.components.forEach((component) => { - component.node.branchParametersTemplate = component.branchParametersTemplate; - }); - }); - - return response; - }); + .then(({ data, ...response }) => ({ + ...response, + data: { + ...data, + componentGroups: data.componentGroups.map(({ components, ...group }) => ({ + ...group, + components: components.map(fixBranchParametersTemplate).map(fixAggregateParameters), + })), + }, + })); promise.catch((error) => this.#addError(i18next.t("notification.error.cannotFindChosenVersions", "Cannot find chosen versions"), error, true), ); diff --git a/designer/client/test/CompareVersionDialog-test.tsx b/designer/client/test/CompareVersionDialog-test.tsx index cf343347ced..4e2ed37aa9d 100644 --- a/designer/client/test/CompareVersionDialog-test.tsx +++ b/designer/client/test/CompareVersionDialog-test.tsx @@ -24,6 +24,11 @@ jest.mock("../src/windowManager", () => ({ WindowContent: ({ children }) =>
{children}
, })); +// this module brings nothing but problems with some nested imports to this test, so it could be safely mocked +jest.mock("../src/components/graph/node-modal/NodeDetailsContent", () => ({ + NodeDetailsContent: ({ children }) =>
{children}
, +})); + const mockStore = configureMockStore([thunk]); const graphReducer = { history: { From 217a7459e9891313b1f0ff1f00d99d6a67d029cb Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Mon, 19 Aug 2024 09:50:06 +0200 Subject: [PATCH 09/27] fixed ace editor tabindex --- .../editors/expression/AceWrapper.tsx | 52 ++++++++++++++----- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx b/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx index 63a1528aa92..9f5875fcd10 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx @@ -45,7 +45,14 @@ export interface AceKeyCommand extends Omit { exec: (editor: Ace.Editor) => boolean | void; } -function getTabindexedElements(root: Element, currentElement?: HTMLElement) { +function splitElements(sortedElements: HTMLElement[], currentElement: HTMLElement): [HTMLElement[], HTMLElement[]] { + const index = sortedElements.indexOf(currentElement); + const nextElements = sortedElements.slice(index + 1); + const prevElements = sortedElements.slice(0, index); + return [nextElements, prevElements]; +} + +function getTabindexedElements(root: Element, currentElement?: HTMLElement): [HTMLElement[], HTMLElement[]] { const treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, (node: HTMLElement) => { if (currentElement === node) { return NodeFilter.FILTER_ACCEPT; @@ -69,18 +76,23 @@ function getTabindexedElements(root: Element, currentElement?: HTMLElement) { elements.push(node as HTMLElement); } - if (elements.length <= 1) { + const sortedElements = elements.sort((a, b) => Math.max(0, a.tabIndex) - Math.max(0, b.tabIndex)); + + if (sortedElements.length <= 1 && root !== document.body) { return getTabindexedElements(root.parentElement, currentElement); } - const htmlElements = elements.sort((a, b) => Math.max(0, a.tabIndex) - Math.max(0, b.tabIndex)); - if (currentElement) { - const index = htmlElements.indexOf(currentElement); - const nextElements = htmlElements.slice(index + 1); - const prevElements = htmlElements.slice(0, index); - return [nextElements, prevElements]; + if (!currentElement) { + return [sortedElements, []]; + } + + const [nextElements, prevElements] = splitElements(sortedElements, currentElement); + + if ((prevElements.length <= 0 || nextElements.length <= 0) && root !== document.body) { + return getTabindexedElements(root.parentElement, currentElement); } - return [htmlElements, []]; + + return [nextElements, prevElements]; } function handleTab(editor: Ace.Editor, shiftKey?: boolean): boolean { @@ -105,7 +117,7 @@ function handleTab(editor: Ace.Editor, shiftKey?: boolean): boolean { editor.blur(); - const [nextElements, prevElements] = getTabindexedElements(editor.container.offsetParent, editor.container); + const [nextElements, prevElements] = getTabindexedElements(editor.container.parentElement.offsetParent, editor.container); const element = shiftKey ? prevElements.pop() : nextElements.shift(); element?.focus(); } @@ -130,17 +142,26 @@ export default forwardRef(function AceWrapper( () => [ { name: "find", - bindKey: { win: "Ctrl-F", mac: "Command-F" }, + bindKey: { + win: "Ctrl-F", + mac: "Command-F", + }, exec: () => false, }, { name: "focusNext", - bindKey: { win: "Tab", mac: "Tab" }, + bindKey: { + win: "Tab", + mac: "Tab", + }, exec: (editor) => handleTab(editor), }, { name: "focusPrevious", - bindKey: { win: "Shift-Tab", mac: "Shift-Tab" }, + bindKey: { + win: "Shift-Tab", + mac: "Shift-Tab", + }, exec: (editor) => handleTab(editor, true), }, ], @@ -164,7 +185,10 @@ export default forwardRef(function AceWrapper( showGutter={!!showLineNumbers} highlightActiveLine={false} editorProps={DEFAULF_EDITOR_PROPS} - setOptions={{ ...DEFAULT_OPTIONS, showLineNumbers }} + setOptions={{ + ...DEFAULT_OPTIONS, + showLineNumbers, + }} enableBasicAutocompletion={customAceEditorCompleter && [customAceEditorCompleter]} commands={[...DEFAULT_COMMANDS, ...commands] as unknown as ICommand[]} placeholder={inputProps.placeholder} From b2e04f253a09b2d48aee37fac89c4cbd9a885fa5 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 20 Aug 2024 02:22:14 +0200 Subject: [PATCH 10/27] groupBy cleanup --- .../node-modal/aggregate/aggMapLikeParser.tsx | 80 ++++++++++- .../node-modal/aggregate/aggregateContext.tsx | 128 +++++++++--------- .../node-modal/aggregate/aggregatorField.tsx | 21 +-- .../aggregate/groupBy/collectionField.tsx | 125 +++++++++++++++++ .../node-modal/aggregate/groupBy/editor.tsx | 25 ++++ .../aggregate/groupBy/groupByField.tsx | 24 ++++ .../aggregate/groupBy/highlightedSpel.tsx | 19 +++ .../node-modal/aggregate/groupBy/spelChip.tsx | 18 +++ .../aggregate/groupBy/valuesList.tsx | 37 +++++ .../aggregate/useAggParamsSerializer.tsx | 70 ++++++++++ .../node-modal/aggregateParametersList.tsx | 6 +- .../graph/node-modal/customNodeParameters.tsx | 26 ++-- .../editors/expression/AceWrapper.tsx | 2 +- .../editors/expression/RawEditor.tsx | 8 +- .../client/src/containers/theme/styles.ts | 5 +- 15 files changed, 497 insertions(+), 97 deletions(-) create mode 100644 designer/client/src/components/graph/node-modal/aggregate/groupBy/collectionField.tsx create mode 100644 designer/client/src/components/graph/node-modal/aggregate/groupBy/editor.tsx create mode 100644 designer/client/src/components/graph/node-modal/aggregate/groupBy/groupByField.tsx create mode 100644 designer/client/src/components/graph/node-modal/aggregate/groupBy/highlightedSpel.tsx create mode 100644 designer/client/src/components/graph/node-modal/aggregate/groupBy/spelChip.tsx create mode 100644 designer/client/src/components/graph/node-modal/aggregate/groupBy/valuesList.tsx create mode 100644 designer/client/src/components/graph/node-modal/aggregate/useAggParamsSerializer.tsx diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx index 530ef4a49bb..229639cd40c 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx @@ -1,5 +1,21 @@ import { createToken, EmbeddedActionsParser, Lexer } from "chevrotain"; +const CollectionOpen = createToken({ + name: "CollectionOpen", + pattern: /#COLLECTION.join\(\{/, +}); +const CollectionClose = createToken({ + name: "CollectionClose", + pattern: /}, "|"\)/, +}); +const ListOpen = createToken({ + name: "ListOpen", + pattern: /{/, +}); +const ListClose = createToken({ + name: "ListClose", + pattern: /}\.toString/, +}); const MapOpen = createToken({ name: "MapOpen", pattern: /(#AGG\.map\()?{/, @@ -34,7 +50,20 @@ const WhiteSpace = createToken({ group: Lexer.SKIPPED, }); -const aggMapTokens = [MapClose, MapOpen, Comma, Spel, Identifier, Number, Colon, WhiteSpace]; +const aggMapTokens = [ + CollectionClose, + CollectionOpen, + ListClose, + ListOpen, + MapClose, + MapOpen, + Comma, + Spel, + Identifier, + Number, + Colon, + WhiteSpace, +]; export const AggMapLikeLexer = new Lexer(aggMapTokens); @@ -81,4 +110,53 @@ export class AggMapLikeParser extends EmbeddedActionsParser { return obj; }); + + collection = this.RULE("collection", () => { + const arr = []; + + this.OR([ + { + ALT: () => { + this.CONSUME(CollectionOpen); + this.AT_LEAST_ONE_SEP({ + SEP: Comma, + DEF: () => { + const item = this.SUBRULE(this.collectionItem); + if (!item) return; + arr.push(item); + }, + }); + this.CONSUME(CollectionClose); + }, + }, + { + ALT: () => { + this.CONSUME(ListOpen); + this.AT_LEAST_ONE_SEP2({ + SEP: Comma, + DEF: () => { + const item = this.SUBRULE2(this.collectionItem); + if (!item) return; + arr.push(item); + }, + }); + this.CONSUME(ListClose); + }, + }, + ]); + + return arr; + }); + + collectionItem = this.RULE("collectionItem", () => { + const value = this.OR([ + { ALT: () => this.CONSUME(Spel) }, + { ALT: () => this.CONSUME(Identifier) }, + { ALT: () => this.CONSUME(Number) }, + ]); + + if (!value.isInsertedInRecovery) { + return value.image; + } + }); } diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx index cc9b2db46e9..d597dc4856b 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx @@ -1,58 +1,27 @@ +import { get, uniqBy } from "lodash"; import React, { createContext, PropsWithChildren, useCallback, useMemo, useState } from "react"; -import { ParametersListProps } from "../parametersList"; +import { NodeValidationError } from "../../../../types"; import { useParameterPath } from "../parameterHelpers"; -import { get, padStart, uniqBy } from "lodash"; -import { AggregateValue, AggRow, appendUuid } from "./aggregatorField"; +import { ParametersListProps } from "../parametersList"; import { useDiffMark } from "../PathsToMark"; -import { NodeValidationError } from "../../../../types"; -import { AggMapLikeLexer, AggMapLikeParser } from "./aggMapLikeParser"; - -function useAggParamsSerializer(): [(text: string) => Record, (paramName: string, map: Record) => string] { - const parser = useMemo(() => new AggMapLikeParser(), []); - - const deserialize = useCallback( - (text: string): Record => { - const lexingResult = AggMapLikeLexer.tokenize(text); - parser.input = lexingResult.tokens; - return parser.object() || null; - }, - [parser], - ); - - const serialize = useCallback((paramName: string, map: Record): string => { - const entries = Object.entries(map || {}).map(([key, value]) => { - const trimmedKey = key.trim(); - return [/^[^a-zA-Z]|\W/.test(trimmedKey) ? `"${trimmedKey}"` : trimmedKey, value]; - }); - - const keyLength = entries.reduce((value, [key]) => Math.max(value, key.length), 0); - const content = entries.map(([key, value]) => ` ${padStart(key, keyLength, " ")}: ${value}`).join(",\n"); - - if (!content) return ""; - - switch (paramName) { - case "aggregator": - return `#AGG.map({\n${content}\n})`; - case "aggregateBy": - return `{\n${content}\n}`; - } - }, []); - return [deserialize, serialize]; -} +import { AggregateValue, AggRow, appendUuid } from "./aggregatorField"; +import { useAggParamsSerializer, useGroupByParamsSerializer } from "./useAggParamsSerializer"; type AggregateContextProviderProps = PropsWithChildren>; export const AggregateContextProvider = ({ children, node, setProperty, errors }: AggregateContextProviderProps) => { const { parameters } = node; - const [deserialize, serialize] = useAggParamsSerializer(); + const [deserializeGroupBy, serializeGroupBy] = useGroupByParamsSerializer(); + const [deserializeAggregate, serializeAggregate] = useAggParamsSerializer(); + const groupByPath = useParameterPath(parameters, "groupBy"); const aggregatorPath = useParameterPath(parameters, "aggregator"); const aggregateByPath = useParameterPath(parameters, "aggregateBy"); - const [values = [], setValues] = useState(() => { - const aggregatorParam = deserialize(get(node, aggregatorPath)); - const aggregateByParam = deserialize(get(node, aggregateByPath)); + const [aggValues = [], setAggValues] = useState(() => { + const aggregatorParam = deserializeAggregate(get(node, aggregatorPath)); + const aggregateByParam = deserializeAggregate(get(node, aggregateByPath)); const keys = Object.keys({ ...aggregateByParam, ...aggregatorParam }); @@ -69,42 +38,75 @@ export const AggregateContextProvider = ({ children, node, setProperty, errors } .map(appendUuid); }); - const onChange = useCallback( + const onAggChange = useCallback( (values: AggregateValue[]) => { - setValues(values); + setAggValues(values); const aggregator = Object.fromEntries(values.map(({ name, agg }) => (name && agg ? [name, agg] : null)).filter(Boolean)); const aggregateBy = Object.fromEntries( values.map(({ name, expression }) => (name && expression ? [name, expression] : null)).filter(Boolean), ); - setProperty(aggregatorPath, serialize("aggregator", aggregator)); - setProperty(aggregateByPath, serialize("aggregateBy", aggregateBy)); + setProperty(aggregatorPath, serializeAggregate("aggregator", aggregator)); + setProperty(aggregateByPath, serializeAggregate("aggregateBy", aggregateBy)); }, - [aggregateByPath, aggregatorPath, serialize, setProperty], + [aggregateByPath, aggregatorPath, serializeAggregate, setProperty], ); const [diffMark] = useDiffMark(); - const isMarked = useMemo(() => diffMark(aggregatorPath) || diffMark(aggregateByPath), [aggregateByPath, aggregatorPath, diffMark]); - const fieldErrors = useMemo(() => { - const fieldErrors = errors.filter(({ fieldName }) => ["aggregator", "aggregateBy"].includes(fieldName)); - return uniqBy(fieldErrors, "message"); - }, [errors]); + const aggregator = useMemo( + () => ({ + values: aggValues, + onChange: onAggChange, + isMarked: diffMark(aggregatorPath) || diffMark(aggregateByPath), + fieldErrors: uniqBy( + errors.filter(({ fieldName }) => ["aggregator", "aggregateBy"].includes(fieldName)), + "message", + ), + }), + [aggregateByPath, aggregatorPath, diffMark, errors, onAggChange, aggValues], + ); + + const [groupByValues, setGroupByValues] = useState(() => { + const value: string = get(node, groupByPath) || serializeGroupBy("groupBy", []); + return value ? deserializeGroupBy(value) : []; + }); - const value = useMemo( + const groupBy = useMemo( () => ({ - values, - onChange, - isMarked, - fieldErrors, + values: groupByValues, + onChange: (values) => { + setGroupByValues(values); + setProperty(groupByPath, serializeGroupBy("groupBy", values)); + }, + isMarked: diffMark(groupByPath), + fieldErrors: errors.filter(({ fieldName }) => ["groupBy"].includes(fieldName)), }), - [fieldErrors, isMarked, onChange, values], + [diffMark, errors, groupByPath, groupByValues, serializeGroupBy, setProperty], + ); + + return ( + + {children} + ); - return {children}; }; -export const AggregateContext = createContext<{ - values: AggregateValue[]; - onChange?: (value: AggregateValue[]) => void; +type FieldContext = { + values: T[] | null; + onChange?: (value: T[]) => void; isMarked?: boolean; fieldErrors?: NodeValidationError[]; -}>({ values: null }); +}; + +export const AggregateContext = createContext<{ + aggregator: FieldContext; + groupBy: FieldContext; +}>({ + aggregator: { values: null }, + groupBy: { values: null }, +}); diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx index 9efee9cbf49..4a3c5329bbe 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx @@ -1,18 +1,18 @@ -import { FieldWrapperProps } from "../ParameterExpressionField"; +import { cx } from "@emotion/css"; +import { Box } from "@mui/material"; import React, { useCallback, useContext, useEffect, useMemo, useState } from "react"; -import { findParamDefinitionByName } from "../parameterHelpers"; +import { useSelector } from "react-redux"; import { useArrayState } from "rooks"; -import { NodeRowFieldsProvider } from "../node-row-fields-provider"; import { v4 as uuid4 } from "uuid"; -import { AggregatorFieldsStack } from "./aggregatorFieldsStack"; -import { useSelector } from "react-redux"; -import { getFindAvailableVariables } from "../NodeDetailsContent/selectors"; -import { FieldsRow } from "../fragment-input-definition/FieldsRow"; import { DndItems } from "../../../common/dndItems/DndItems"; -import { cx } from "@emotion/css"; +import { FieldsRow } from "../fragment-input-definition/FieldsRow"; +import { NodeRowFieldsProvider } from "../node-row-fields-provider"; +import { getFindAvailableVariables } from "../NodeDetailsContent/selectors"; +import { FieldWrapperProps } from "../ParameterExpressionField"; +import { findParamDefinitionByName } from "../parameterHelpers"; import { AggregateContext } from "./aggregateContext"; -import { Box } from "@mui/material"; +import { AggregatorFieldsStack } from "./aggregatorFieldsStack"; export type AggRow = { name: string; @@ -36,7 +36,8 @@ export function AggregatorField({ parameterDefinitions, node: { id }, isEditMode return definition.editor.simpleEditor.possibleValues; }, [parameterDefinitions]); - const { values, onChange, isMarked, fieldErrors = [] } = useContext(AggregateContext); + const { aggregator } = useContext(AggregateContext); + const { values, onChange, isMarked, fieldErrors = [] } = aggregator; const [data, dataControls] = useArrayState(() => values); const onAdd = useCallback( diff --git a/designer/client/src/components/graph/node-modal/aggregate/groupBy/collectionField.tsx b/designer/client/src/components/graph/node-modal/aggregate/groupBy/collectionField.tsx new file mode 100644 index 00000000000..44e94dd49ae --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/groupBy/collectionField.tsx @@ -0,0 +1,125 @@ +import { Collapse, Stack } from "@mui/material"; +import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import ReactAce from "react-ace/lib/ace"; +import { useArrayState, useFocusWithin } from "rooks"; +import { getBorderColor } from "../../../../../containers/theme/helpers"; +import { VariableTypes } from "../../../../../types"; +import { ValueFieldProps } from "../../../../valueField"; +import { rowAceEditor } from "../../NodeDetailsContent/NodeTableStyled"; +import { Editor } from "./editor"; +import { ValuesList } from "./valuesList"; + +type CollectionFieldProps = ValueFieldProps & { + variableTypes: VariableTypes; + disabled?: boolean; +}; + +export function CollectionField({ value, onChange, variableTypes, disabled }: CollectionFieldProps) { + const ref = useRef(); + + const [values, controller] = useArrayState(value); + const [expression, setExpression] = useState(""); + + const applyValue = useCallback( + (value: string) => { + if (!value.trim().length) return; + controller.push(value.trim()); + setExpression(""); + }, + [controller], + ); + + const editValue = useCallback( + (value: string) => { + if (!ref.current) return; + const { editor } = ref.current; + applyValue(expression); + editor.focus(); + editor.setValue(value); + editor.navigateFileEnd(); + }, + [applyValue, expression], + ); + + const addOnEnter = useMemo( + () => ({ + name: "newLine", + readOnly: true, + bindKey: { + win: "Enter", + mac: "Enter", + }, + exec: (editor) => applyValue(editor.getValue()), + }), + [applyValue], + ); + + useEffect(() => { + const editor = ref.current?.editor; + editor?.commands.addCommand(addOnEnter); + return () => { + editor?.commands.removeCommand(addOnEnter); + }; + }, [addOnEnter, controller]); + + useEffect(() => { + onChange(values); + }, [onChange, values]); + + const [focusWithin, setFocusWithin] = useState(false); + const { focusWithinProps } = useFocusWithin({ + onFocusWithinChange: setFocusWithin, + onBlurWithin: () => applyValue(expression), + }); + + useEffect(() => { + if (!focusWithin) return; + ref.current?.editor.focus(); + }, [focusWithin]); + + const editorVisible = focusWithin || !values.length; + const itemsVisible = values.length > 0; + + const onClick = useCallback(() => { + ref.current?.editor.focus(); + }, []); + + const onEdit = useMemo(() => { + return (i: number) => { + editValue(values[i]); + controller.removeItemAtIndex(i); + }; + }, [controller, editValue, values]); + + const onRemove = useMemo(() => { + return (i: number) => { + controller.removeItemAtIndex(i); + }; + }, [controller]); + + return ( + `1px solid ${getBorderColor(theme)}`, + + ":focus, :focus-within": { + outline: (theme) => `1px solid ${theme.palette.primary.main}`, + }, + + [`.${rowAceEditor}`]: { + outline: 0, + }, + }} + > + + + + + + + + ); +} diff --git a/designer/client/src/components/graph/node-modal/aggregate/groupBy/editor.tsx b/designer/client/src/components/graph/node-modal/aggregate/groupBy/editor.tsx new file mode 100644 index 00000000000..f8be78fb5ee --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/groupBy/editor.tsx @@ -0,0 +1,25 @@ +import React, { forwardRef } from "react"; +import ReactAce from "react-ace/lib/ace"; +import { RawEditor, RawEditorProps } from "../../editors/expression/RawEditor"; +import { ExpressionLang } from "../../editors/expression/types"; + +type EditorProps = Omit & { + value: string; + onChange: (value: string) => void; +}; + +export const Editor = forwardRef(function Editor(props, ref) { + const { value, onChange, ...passProps } = props; + return ( + + ); +}); diff --git a/designer/client/src/components/graph/node-modal/aggregate/groupBy/groupByField.tsx b/designer/client/src/components/graph/node-modal/aggregate/groupBy/groupByField.tsx new file mode 100644 index 00000000000..4cd1068fb7c --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/groupBy/groupByField.tsx @@ -0,0 +1,24 @@ +import React, { useContext, useMemo } from "react"; +import { useSelector } from "react-redux"; +import ValidationLabels from "../../../../modals/ValidationLabels"; +import { NodeRow, NodeValue } from "../../node"; +import { getFindAvailableVariables } from "../../NodeDetailsContent/selectors"; +import { FieldWrapperProps } from "../../ParameterExpressionField"; +import { AggregateContext } from "../aggregateContext"; +import { CollectionField } from "./collectionField"; + +export function GroupByField({ node, isEditMode }: FieldWrapperProps) { + const { groupBy } = useContext(AggregateContext); + + const findAvailableVariables = useSelector(getFindAvailableVariables); + const variableTypes = useMemo(() => findAvailableVariables?.(node.id), [findAvailableVariables, node.id]); + + return ( + + + + + + + ); +} diff --git a/designer/client/src/components/graph/node-modal/aggregate/groupBy/highlightedSpel.tsx b/designer/client/src/components/graph/node-modal/aggregate/groupBy/highlightedSpel.tsx new file mode 100644 index 00000000000..a8598aa2dd1 --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/groupBy/highlightedSpel.tsx @@ -0,0 +1,19 @@ +import staticHighlight from "ace-builds/src-noconflict/ext-static_highlight"; +import React, { PropsWithChildren, useEffect, useRef } from "react"; +import { EditorMode } from "../../editors/expression/types"; + +export const HighlightedSpel = ({ children }: PropsWithChildren) => { + const ref = useRef(null); + + useEffect(() => { + if (ref.current && children) { + staticHighlight(ref.current, { + mode: `ace/mode/${EditorMode.SpEL}`, + theme: "ace/theme/nussknacker", + trim: true, + }); + } + }, [children]); + + return {children}; +}; diff --git a/designer/client/src/components/graph/node-modal/aggregate/groupBy/spelChip.tsx b/designer/client/src/components/graph/node-modal/aggregate/groupBy/spelChip.tsx new file mode 100644 index 00000000000..d918ac87e1e --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/groupBy/spelChip.tsx @@ -0,0 +1,18 @@ +import { Chip, ChipProps } from "@mui/material"; +import React from "react"; +import { HighlightedSpel } from "./highlightedSpel"; + +export const SpelChip = ({ label, ...props }: ChipProps) => ( + {label}} + sx={{ + "& .ace-nussknacker": { + outline: 0, + background: "transparent", + }, + }} + {...props} + /> +); diff --git a/designer/client/src/components/graph/node-modal/aggregate/groupBy/valuesList.tsx b/designer/client/src/components/graph/node-modal/aggregate/groupBy/valuesList.tsx new file mode 100644 index 00000000000..7a86780fcec --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/groupBy/valuesList.tsx @@ -0,0 +1,37 @@ +import { Stack } from "@mui/material"; +import React, { UIEvent, useCallback } from "react"; +import { getTabindexedElements } from "../../editors/expression/AceWrapper"; +import { SpelChip } from "./spelChip"; + +export type LastOf = T extends [...unknown[], infer L] ? L : never; + +type ValuesListProps = { + values: string[]; + onRemove?: (i: number) => void; + onEdit?: (i: number) => void; +}; + +export function ValuesList({ values, onRemove, onEdit }: ValuesListProps) { + const focusPrevious = useCallback((element: HTMLElement) => { + const [, prev] = getTabindexedElements(element, element); + prev.pop()?.focus(); + }, []); + + const onDelete = useCallback( + (index: number) => { + return ({ currentTarget }: UIEvent) => { + focusPrevious(currentTarget); + onRemove?.(index); + }; + }, + [onRemove, focusPrevious], + ); + + return ( + + {values.map((value, index) => ( + onEdit(index) : null} /> + ))} + + ); +} diff --git a/designer/client/src/components/graph/node-modal/aggregate/useAggParamsSerializer.tsx b/designer/client/src/components/graph/node-modal/aggregate/useAggParamsSerializer.tsx new file mode 100644 index 00000000000..e9b72827524 --- /dev/null +++ b/designer/client/src/components/graph/node-modal/aggregate/useAggParamsSerializer.tsx @@ -0,0 +1,70 @@ +import { padStart } from "lodash"; +import { useCallback, useMemo } from "react"; +import { AggMapLikeLexer, AggMapLikeParser } from "./aggMapLikeParser"; + +export function useAggParamsSerializer(): [ + (text: string) => Record, + (paramName: string, map: Record) => string, +] { + const parser = useMemo(() => new AggMapLikeParser(), []); + + const deserialize = useCallback( + (text: string): Record => { + const lexingResult = AggMapLikeLexer.tokenize(text); + parser.input = lexingResult.tokens; + return parser.object() || null; + }, + [parser], + ); + + const serialize = useCallback((paramName: string, map: Record): string => { + const entries = Object.entries(map || {}).map(([key, value]) => { + const trimmedKey = key.trim(); + return [/^[^a-zA-Z]|\W/.test(trimmedKey) ? `"${trimmedKey}"` : trimmedKey, value]; + }); + + const keyLength = entries.reduce((value, [key]) => Math.max(value, key.length), 0); + const content = entries.map(([key, value]) => ` ${padStart(key, keyLength, " ")}: ${value}`).join(",\n"); + + if (!content) return ""; + + switch (paramName) { + case "aggregator": + return `#AGG.map({\n${content}\n})`; + case "aggregateBy": + return `{\n${content}\n}`; + } + }, []); + + return [deserialize, serialize]; +} + +export function useGroupByParamsSerializer(): [(text: string) => string[], (paramName: string, arr: string[]) => string] { + const parser = useMemo(() => new AggMapLikeParser(), []); + + const deserialize = useCallback( + (text: string): string[] => { + const lexingResult = AggMapLikeLexer.tokenize(text); + parser.input = lexingResult.tokens; + return parser.collection() || null; + }, + [parser], + ); + + const serialize = useCallback((paramName: string, arr: string[]): string => { + const entries = arr.map((value) => { + return value?.trim(); + }); + + const content = entries.join(", "); + + if (!content) return ""; + + switch (paramName) { + case "groupBy": + return `{ ${content} }.toString`; + } + }, []); + + return [deserialize, serialize]; +} diff --git a/designer/client/src/components/graph/node-modal/aggregateParametersList.tsx b/designer/client/src/components/graph/node-modal/aggregateParametersList.tsx index 7c8145c6a6d..4b2fc02dc07 100644 --- a/designer/client/src/components/graph/node-modal/aggregateParametersList.tsx +++ b/designer/client/src/components/graph/node-modal/aggregateParametersList.tsx @@ -1,13 +1,13 @@ -import { ParametersList, ParametersListProps } from "./parametersList"; +import React from "react"; import { AggregateContextProvider } from "./aggregate/aggregateContext"; import { AggregateFieldOverrideWrapper } from "./customNodeParameters"; -import React from "react"; +import { ParametersList, ParametersListProps } from "./parametersList"; export const AggregateParametersList = (props: ParametersListProps) => { const { errors, node, setProperty } = props; return ( - ; + ); }; diff --git a/designer/client/src/components/graph/node-modal/customNodeParameters.tsx b/designer/client/src/components/graph/node-modal/customNodeParameters.tsx index 93f95160972..cc4f82c2402 100644 --- a/designer/client/src/components/graph/node-modal/customNodeParameters.tsx +++ b/designer/client/src/components/graph/node-modal/customNodeParameters.tsx @@ -1,17 +1,21 @@ -import { FieldWrapperProps } from "./ParameterExpressionField"; import React, { useContext } from "react"; -import { AggregatorField } from "./aggregate/aggregatorField"; import { AggregateContext } from "./aggregate/aggregateContext"; +import { AggregatorField } from "./aggregate/aggregatorField"; +import { GroupByField } from "./aggregate/groupBy/groupByField"; +import { FieldWrapperProps } from "./ParameterExpressionField"; export const AggregateFieldOverrideWrapper = function AggregateFieldOverrideWrapper({ children, ...props }: FieldWrapperProps) { - const { values } = useContext(AggregateContext); - if (values?.length) { - switch (props.parameter.name) { - case "aggregator": - return ; - case "aggregateBy": - return null; - } + const { aggregator, groupBy } = useContext(AggregateContext); + const defaultElement = <>{children}; + + switch (props.parameter.name) { + case "aggregator": + return aggregator.values?.length ? : defaultElement; + case "aggregateBy": + return aggregator.values?.length ? null : defaultElement; + case "groupBy": + return groupBy?.values ? {children} : defaultElement; + default: + return defaultElement; } - return <>{children}; }; diff --git a/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx b/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx index 9f5875fcd10..220e5c1a0e5 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx @@ -52,7 +52,7 @@ function splitElements(sortedElements: HTMLElement[], currentElement: HTMLElemen return [nextElements, prevElements]; } -function getTabindexedElements(root: Element, currentElement?: HTMLElement): [HTMLElement[], HTMLElement[]] { +export function getTabindexedElements(root: Element, currentElement?: HTMLElement): [HTMLElement[], HTMLElement[]] { const treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, (node: HTMLElement) => { if (currentElement === node) { return NodeFilter.FILTER_ACCEPT; diff --git a/designer/client/src/components/graph/node-modal/editors/expression/RawEditor.tsx b/designer/client/src/components/graph/node-modal/editors/expression/RawEditor.tsx index bb7eefb51a1..efa72ca358f 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/RawEditor.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/RawEditor.tsx @@ -1,20 +1,20 @@ import React, { ForwardedRef, forwardRef, useMemo } from "react"; import ReactAce from "react-ace/lib/ace"; -import { ExpressionSuggest, ExpressionSuggestProps } from "./ExpressionSuggest"; import { VariableTypes } from "../../../../../types"; -import { EditorMode, ExpressionObj } from "./types"; import { FieldError } from "../Validators"; +import { ExpressionSuggest, ExpressionSuggestProps } from "./ExpressionSuggest"; +import { EditorMode, ExpressionObj } from "./types"; export type RawEditorProps = { expressionObj: ExpressionObj; fieldErrors: FieldError[]; isMarked?: boolean; - showValidation: boolean; + showValidation?: boolean; readOnly?: boolean; onValueChange: (value: string) => void; rows?: number; cols?: number; - className: string; + className?: string; variableTypes: VariableTypes; validationLabelInfo?: string; editorMode?: EditorMode; diff --git a/designer/client/src/containers/theme/styles.ts b/designer/client/src/containers/theme/styles.ts index a272260a23e..11b34971502 100644 --- a/designer/client/src/containers/theme/styles.ts +++ b/designer/client/src/containers/theme/styles.ts @@ -1,5 +1,6 @@ import { Theme } from "@mui/material"; import "react-datetime/css/react-datetime.css"; +import { rowAceEditor } from "../../components/graph/node-modal/NodeDetailsContent/NodeTableStyled"; import { blendDarken, blendLighten, getBorderColor } from "./helpers"; import { nodeInput, rowAceEditor } from "../../components/graph/node-modal/NodeDetailsContent/NodeTableStyled"; @@ -27,10 +28,6 @@ const aceEditorStyles = (theme: Theme) => ({ ".ace-nussknacker": { backgroundColor: theme.palette.background.paper, color: theme.palette.text.secondary, - outline: `1px solid ${getBorderColor(theme)}`, - "&:focus-within": { - outline: `1px solid ${theme.palette.primary.main}`, - }, }, ".ace-nussknacker .ace_cursor": { color: "#F8F8F0", From 40ecbcb02f8d3ebd0f3bbfec3917cbe9f8ff6fdb Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 20 Aug 2024 12:19:42 +0200 Subject: [PATCH 11/27] fixed record parse --- .../components/graph/node-modal/aggregate/aggMapLikeParser.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx index 229639cd40c..793b26c7d9b 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggMapLikeParser.tsx @@ -77,7 +77,7 @@ export class AggMapLikeParser extends EmbeddedActionsParser { object = this.RULE("object", () => { const obj = {}; - this.CONSUME(MapOpen); + this.OR([{ ALT: () => this.CONSUME(MapOpen) }, { ALT: () => this.CONSUME(ListOpen) }]); this.MANY_SEP({ SEP: Comma, DEF: () => { From f6f8a78d95129962672f43ffd2d0a2beadc662ee Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 20 Aug 2024 15:01:51 +0200 Subject: [PATCH 12/27] cleanup --- designer/client/src/http/HttpService.ts | 134 +++++++++++--------- designer/client/src/http/parametersUtils.ts | 50 ++++++++ 2 files changed, 121 insertions(+), 63 deletions(-) create mode 100644 designer/client/src/http/parametersUtils.ts diff --git a/designer/client/src/http/HttpService.ts b/designer/client/src/http/HttpService.ts index 75ad9b0c7cd..fffa4e62187 100644 --- a/designer/client/src/http/HttpService.ts +++ b/designer/client/src/http/HttpService.ts @@ -4,8 +4,13 @@ import FileSaver from "file-saver"; import i18next from "i18next"; import { Moment } from "moment"; import { ProcessingType, SettingsData, ValidationData, ValidationRequest } from "../actions/nk"; +import { GenericValidationRequest } from "../actions/nk/genericAction"; import api from "../api"; import { UserData } from "../common/models/User"; +import { TestResults } from "../common/TestResultUtils"; +import { withoutHackOfEmptyEdges } from "../components/graph/GraphPartialsInTS/EdgeUtils"; +import { CaretPosition2d, ExpressionSuggestion } from "../components/graph/node-modal/editors/expression/ExpressionSuggester"; +import { AdditionalInfo } from "../components/graph/node-modal/NodeAdditionalInfoBox"; import { ActionName, PredefinedActionName, @@ -17,17 +22,13 @@ import { StatusDefinitionType, } from "../components/Process/types"; import { ToolbarsConfig } from "../components/toolbarSettings/types"; -import { AuthenticationSettings } from "../reducers/settings"; -import { Component, Expression, NodeType, ProcessAdditionalFields, ProcessDefinitionData, ScenarioGraph, VariableTypes } from "../types"; -import { Instant, WithId } from "../types/common"; +import { EventTrackingSelectorType, EventTrackingType } from "../containers/event-tracking"; import { BackendNotification } from "../containers/Notifications"; import { ProcessCounts } from "../reducers/graph"; -import { TestResults } from "../common/TestResultUtils"; -import { AdditionalInfo } from "../components/graph/node-modal/NodeAdditionalInfoBox"; -import { withoutHackOfEmptyEdges } from "../components/graph/GraphPartialsInTS/EdgeUtils"; -import { CaretPosition2d, ExpressionSuggestion } from "../components/graph/node-modal/editors/expression/ExpressionSuggester"; -import { GenericValidationRequest } from "../actions/nk/genericAction"; -import { EventTrackingSelectorType, EventTrackingType } from "../containers/event-tracking/use-register-tracking-events"; +import { AuthenticationSettings } from "../reducers/settings"; +import { Expression, NodeType, ProcessAdditionalFields, ProcessDefinitionData, ScenarioGraph, VariableTypes } from "../types"; +import { Instant, WithId } from "../types/common"; +import { fixAggregateParameters, fixBranchParametersTemplate } from "./parametersUtils"; type HealthCheckProcessDeploymentType = { status: string; @@ -91,7 +92,9 @@ export type ComponentType = { export type SourceWithParametersTest = { sourceId: string; - parameterExpressions: { [paramName: string]: Expression }; + parameterExpressions: { + [paramName: string]: Expression; + }; }; export type NodeUsageData = { @@ -156,48 +159,14 @@ export interface ScenarioParametersCombinations { engineSetupErrors: Record; } -export type ProcessDefinitionDataDictOption = { key: string; label: string }; -type DictOption = { id: string; label: string }; - -function fixBranchParametersTemplate({ node, branchParametersTemplate, ...component }: Component): Component { - // This is a walk-around for having part of node template (branch parameters) outside of itself. - // See note in DefinitionPreparer on backend side. // TODO remove it after API refactor - return { - ...component, - node: { - ...node, - branchParametersTemplate, - }, - branchParametersTemplate, - }; -} - -function fixAggregateParameters(component: Component): Component { - if (!["aggregate-session", "aggregate-sliding", "aggregate-tumbling"].includes(component.node.nodeType)) { - return component; - } - - const parameters = component.node.parameters.map((parameter) => { - switch (parameter.name) { - case "aggregator": - return { - ...parameter, - expression: { ...parameter.expression, expression: "#AGG.map({count: #AGG.sum})" }, - }; - case "aggregateBy": - return { - ...parameter, - expression: { ...parameter.expression, expression: "{count: 1}" }, - }; - } - return parameter; - }); - - return { - ...component, - node: { ...component.node, parameters }, - }; -} +export type ProcessDefinitionDataDictOption = { + key: string; + label: string; +}; +type DictOption = { + id: string; + label: string; +}; class HttpService { //TODO: Move show information about error to another place. HttpService should avoid only action (get / post / etc..) - handling errors should be in another place. @@ -219,7 +188,11 @@ class HttpService { .then(() => ({ state: HealthState.ok })) .catch((error) => { const { message, processes }: HealthCheckProcessDeploymentType = error.response?.data || {}; - return { state: HealthState.error, error: message, processes: processes }; + return { + state: HealthState.error, + error: message, + processes: processes, + }; }); } @@ -227,7 +200,11 @@ class HttpService { return api.get("/settings"); } - fetchSettingsWithAuth(): Promise { + fetchSettingsWithAuth(): Promise< + SettingsData & { + authentication: AuthenticationSettings; + } + > { return this.fetchSettings().then(({ data }) => { const { provider } = data.authentication; const settings = data; @@ -342,7 +319,12 @@ class HttpService { ); } - deploy(processName: string, comment?: string): Promise<{ isSuccess: boolean }> { + deploy( + processName: string, + comment?: string, + ): Promise<{ + isSuccess: boolean; + }> { return api .post(`/processManagement/deploy/${encodeURIComponent(processName)}`, comment) .then(() => { @@ -364,17 +346,27 @@ class HttpService { } customAction(processName: string, actionName: string, params: Record, comment?: string) { - const data = { actionName: actionName, comment: comment, params: params }; + const data = { + actionName: actionName, + comment: comment, + params: params, + }; return api .post(`/processManagement/customAction/${encodeURIComponent(processName)}`, data) .then((res) => { const msg = res.data.msg; this.#addInfo(msg); - return { isSuccess: res.data.isSuccess, msg: msg }; + return { + isSuccess: res.data.isSuccess, + msg: msg, + }; }) .catch((error) => { const msg = error.response.data.msg || error.response.data; - const result = { isSuccess: false, msg: msg }; + const result = { + isSuccess: false, + msg: msg, + }; if (error?.response?.status != 400) return this.#addError(msg, error, false).then(() => result); return result; }); @@ -621,7 +613,10 @@ class HttpService { //we use offset date time instead of timestamp to pass info about user time zone to BE const format = (date: Moment) => date?.format("YYYY-MM-DDTHH:mm:ssZ"); - const data = { dateFrom: format(dateFrom), dateTo: format(dateTo) }; + const data = { + dateFrom: format(dateFrom), + dateTo: format(dateTo), + }; const promise = api.get(`/processCounts/${encodeURIComponent(processName)}`, { params: data }); promise.catch((error) => @@ -632,7 +627,10 @@ class HttpService { //to prevent closing edit node modal and corrupting graph display saveProcess(processName: ProcessName, scenarioGraph: ScenarioGraph, comment: string) { - const data = { scenarioGraph: this.#sanitizeScenarioGraph(scenarioGraph), comment: comment }; + const data = { + scenarioGraph: this.#sanitizeScenarioGraph(scenarioGraph), + comment: comment, + }; return api.put(`/processes/${encodeURIComponent(processName)}`, data).catch((error) => { this.#addError(i18next.t("notification.error.failedToSave", "Failed to save"), error, true); return Promise.reject(error); @@ -780,7 +778,11 @@ class HttpService { return api .post(`/processDefinitionData/${processingType}/dicts`, { expectedType: { - value: { type: type, refClazzName, params: [] }, + value: { + type: type, + refClazzName, + params: [], + }, }, }) .catch((error) => @@ -794,10 +796,16 @@ class HttpService { } fetchStatisticUsage() { - return api.get<{ urls: string[] }>(`/statistic/usage`); + return api.get<{ + urls: string[]; + }>(`/statistic/usage`); } - sendStatistics(statistics: { name: `${EventTrackingType}_${EventTrackingSelectorType}` }[]) { + sendStatistics( + statistics: { + name: `${EventTrackingType}_${EventTrackingSelectorType}`; + }[], + ) { return api.post(`/statistic`, { statistics }); } diff --git a/designer/client/src/http/parametersUtils.ts b/designer/client/src/http/parametersUtils.ts new file mode 100644 index 00000000000..db65f575fbd --- /dev/null +++ b/designer/client/src/http/parametersUtils.ts @@ -0,0 +1,50 @@ +import { Component } from "../types"; + +export function fixBranchParametersTemplate({ node, branchParametersTemplate, ...component }: Component): Component { + // This is a walk-around for having part of node template (branch parameters) outside of itself. + // See note in DefinitionPreparer on backend side. // TODO remove it after API refactor + return { + ...component, + node: { + ...node, + branchParametersTemplate, + }, + branchParametersTemplate, + }; +} + +export function fixAggregateParameters(component: Component): Component { + if (!["aggregate-session", "aggregate-sliding", "aggregate-tumbling"].includes(component.node.nodeType)) { + return component; + } + + const parameters = component.node.parameters.map((parameter) => { + switch (parameter.name) { + case "aggregator": + return { + ...parameter, + expression: { + ...parameter.expression, + expression: "#AGG.map({count: #AGG.sum})", + }, + }; + case "aggregateBy": + return { + ...parameter, + expression: { + ...parameter.expression, + expression: "{count: 1}", + }, + }; + } + return parameter; + }); + + return { + ...component, + node: { + ...component.node, + parameters, + }, + }; +} From adf97dac23ae8de8b0c4bad9ccca33839322c5b4 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 20 Aug 2024 16:32:03 +0200 Subject: [PATCH 13/27] fixed types error --- designer/client/src/http/HttpService.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer/client/src/http/HttpService.ts b/designer/client/src/http/HttpService.ts index fffa4e62187..59f4d4bb23a 100644 --- a/designer/client/src/http/HttpService.ts +++ b/designer/client/src/http/HttpService.ts @@ -234,9 +234,8 @@ class HttpService { } fetchProcessDefinitionData(processingType: string, isFragment: boolean) { - const promise = api - .get(`/processDefinitionData/${processingType}?isFragment=${isFragment}`) - .then(({ data, ...response }) => ({ + const promise = api.get(`/processDefinitionData/${processingType}?isFragment=${isFragment}`).then( + ({ data, ...response }): AxiosResponse => ({ ...response, data: { ...data, @@ -245,7 +244,8 @@ class HttpService { components: components.map(fixBranchParametersTemplate).map(fixAggregateParameters), })), }, - })); + }), + ); promise.catch((error) => this.#addError(i18next.t("notification.error.cannotFindChosenVersions", "Cannot find chosen versions"), error, true), ); From 7e28c7a2b7964ae493e71d154ca9aa4801f62b8c Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 10 Sep 2024 11:50:29 +0200 Subject: [PATCH 14/27] minor things --- .../strategies/RemoteAuthStrategy/RemoteAuthStrategy.tsx | 9 ++++++--- designer/client/src/containers/theme/styles.ts | 3 +-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/designer/client/src/containers/Auth/strategies/RemoteAuthStrategy/RemoteAuthStrategy.tsx b/designer/client/src/containers/Auth/strategies/RemoteAuthStrategy/RemoteAuthStrategy.tsx index d5c708632a7..27f85b7f576 100644 --- a/designer/client/src/containers/Auth/strategies/RemoteAuthStrategy/RemoteAuthStrategy.tsx +++ b/designer/client/src/containers/Auth/strategies/RemoteAuthStrategy/RemoteAuthStrategy.tsx @@ -1,15 +1,18 @@ +import { ModuleString, ModuleUrl, splitUrl } from "@touk/federated-component"; import React, { FunctionComponent, PropsWithChildren } from "react"; import { PendingPromise } from "../../../../common/PendingPromise"; import SystemUtils from "../../../../common/SystemUtils"; import { ErrorBoundary } from "../../../../components/common/error-boundary"; +import { RemoteComponent } from "../../../../components/RemoteComponent"; import { RemoteAuthenticationSettings } from "../../../../reducers/settings"; -import { ModuleString, ModuleUrl, splitUrl } from "@touk/federated-component"; import { AuthErrorCodes } from "../../AuthErrorCodes"; import { Strategy, StrategyConstructor } from "../../Strategy"; import { AuthClient } from "./externalAuthModule"; -import { RemoteComponent } from "../../../../components/RemoteComponent"; type AuthLibCallback = (a: AuthClient) => void; +type RemoteAuthProviderProps = PropsWithChildren<{ + onInit: AuthLibCallback; +}>; function createAuthWrapper( { @@ -24,7 +27,7 @@ function createAuthWrapper( return function Wrapper({ children }: PropsWithChildren) { return ( - + url={url} scope={scope} onInit={onInit}> {children} diff --git a/designer/client/src/containers/theme/styles.ts b/designer/client/src/containers/theme/styles.ts index 11b34971502..b8dfd789e12 100644 --- a/designer/client/src/containers/theme/styles.ts +++ b/designer/client/src/containers/theme/styles.ts @@ -1,8 +1,7 @@ import { Theme } from "@mui/material"; import "react-datetime/css/react-datetime.css"; -import { rowAceEditor } from "../../components/graph/node-modal/NodeDetailsContent/NodeTableStyled"; -import { blendDarken, blendLighten, getBorderColor } from "./helpers"; import { nodeInput, rowAceEditor } from "../../components/graph/node-modal/NodeDetailsContent/NodeTableStyled"; +import { blendDarken, blendLighten, getBorderColor } from "./helpers"; const aceEditorStyles = (theme: Theme) => ({ ".ace-nussknacker .ace_gutter": { From 8231b25f95c3a8d19c7b1cf540c41242dcb50857 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 17 Sep 2024 12:06:21 +0200 Subject: [PATCH 15/27] json editor settings sync with aceWrapper --- .../editors/expression/AceWrapper.tsx | 5 +- .../editors/expression/JsonEditor.tsx | 83 ++++++++++++------- 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx b/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx index 220e5c1a0e5..965c87c9b86 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/AceWrapper.tsx @@ -27,13 +27,13 @@ export interface AceWrapperProps extends Pick void; className: string; - showValidation: boolean; + showValidation?: boolean; fieldErrors: FieldError[]; fieldName: string; + readOnly?: boolean; + isMarked?: boolean; }; -export const JsonEditor: SimpleEditor = ({ onValueChange, className, expressionObj, fieldErrors, showValidation }: Props) => { +export const JsonEditor: SimpleEditor = ({ + onValueChange, + className, + expressionObj, + fieldErrors, + showValidation, + readOnly, + isMarked, +}: Props) => { const [value, setValue] = useState(expressionObj.expression.replace(/^["'](.*)["']$/, "")); const onChange = (newValue: string) => { @@ -27,32 +41,39 @@ export const JsonEditor: SimpleEditor = ({ onValueChange, className, expr const THEME = "nussknacker"; return ( -
- + + + + {showValidation && } -
+ ); }; From 4b17cc8ff93e1be71c032ad6a75148450bef08cd Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 17 Sep 2024 13:57:29 +0200 Subject: [PATCH 16/27] test tweak --- designer/client/cypress/e2e/sqlEditor.cy.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/designer/client/cypress/e2e/sqlEditor.cy.ts b/designer/client/cypress/e2e/sqlEditor.cy.ts index eb402390418..9b8364e837b 100644 --- a/designer/client/cypress/e2e/sqlEditor.cy.ts +++ b/designer/client/cypress/e2e/sqlEditor.cy.ts @@ -15,7 +15,9 @@ describe("Sql editor", () => { cy.layoutScenario(); cy.get("[model-id=sql-source]").should("be.visible").trigger("dblclick"); cy.get("[data-testid=window]").should("be.visible"); - cy.get("#ace-editor").should("not.have.class", "tokenizer-working").parent().matchImage({ maxDiffThreshold }); + cy.get("#ace-editor").should("not.have.class", "tokenizer-working"); + cy.wait(500); + cy.get("#ace-editor").parent().matchImage({ maxDiffThreshold }); cy.get("[data-testid=window]").matchImage(); }); @@ -26,7 +28,9 @@ describe("Sql editor", () => { cy.wrap(["sql-source", "sql-source2", "sql-source3"]).each((name) => { cy.get(`[model-id=${name}]`).should("be.visible").trigger("dblclick"); - cy.get("#ace-editor").should("not.have.class", "tokenizer-working").parent().matchImage({ maxDiffThreshold }); + cy.get("#ace-editor").should("not.have.class", "tokenizer-working"); + cy.wait(500); + cy.get("#ace-editor").parent().matchImage({ maxDiffThreshold }); cy.get("[data-testid=window]") .contains(/^cancel$/i) .click(); From 1b9e7966a9302191aa49a588b5d57134297bc970 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Wed, 18 Sep 2024 10:39:56 +0200 Subject: [PATCH 17/27] test tweak --- designer/client/cypress/e2e/sqlEditor.cy.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer/client/cypress/e2e/sqlEditor.cy.ts b/designer/client/cypress/e2e/sqlEditor.cy.ts index 9b8364e837b..99b18b1f84d 100644 --- a/designer/client/cypress/e2e/sqlEditor.cy.ts +++ b/designer/client/cypress/e2e/sqlEditor.cy.ts @@ -16,7 +16,7 @@ describe("Sql editor", () => { cy.get("[model-id=sql-source]").should("be.visible").trigger("dblclick"); cy.get("[data-testid=window]").should("be.visible"); cy.get("#ace-editor").should("not.have.class", "tokenizer-working"); - cy.wait(500); + cy.wait(1000); cy.get("#ace-editor").parent().matchImage({ maxDiffThreshold }); cy.get("[data-testid=window]").matchImage(); }); @@ -29,7 +29,7 @@ describe("Sql editor", () => { cy.wrap(["sql-source", "sql-source2", "sql-source3"]).each((name) => { cy.get(`[model-id=${name}]`).should("be.visible").trigger("dblclick"); cy.get("#ace-editor").should("not.have.class", "tokenizer-working"); - cy.wait(500); + cy.wait(1000); cy.get("#ace-editor").parent().matchImage({ maxDiffThreshold }); cy.get("[data-testid=window]") .contains(/^cancel$/i) From 4178e1823c8859d2f12571900715a4e96d158fab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:42:00 +0200 Subject: [PATCH 18/27] Updated snapshots (#6834) Co-authored-by: JulianWielga --- ...ay colorfull and sorted completions #0.png | Bin 21960 -> 22074 bytes ...ay colorfull and sorted completions #1.png | Bin 16297 -> 16426 bytes ...ompletions for second line (bugfix) #0.png | Bin 36382 -> 36548 bytes ...display dead-ended fragment correct #0.png | Bin 30700 -> 30709 bytes ...ditor should display colorfull json #0.png | Bin 6895 -> 6005 bytes ...ditor should display colorfull json #1.png | Bin 13076 -> 11126 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/Expression suggester should display colorfull and sorted completions #0.png b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/Expression suggester should display colorfull and sorted completions #0.png index 1b4ac54c426a50a0c08dc0ba9800cd6abeb792f6..dc9a0bfbbeee62db7f45ef38913dcc39b08fb131 100644 GIT binary patch literal 22074 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 A5&!@I literal 21960 zcmbTe1yq#X`!@O-2m;dG-O`;RIdr!m9n#%MHwZ(g3<46;oze}`4bm+j-DmUu&RXYu z-}?Q}`qpvH=*&E|pS|z6uIs)Z!<7`I-XIbn{`1d2Zy?g*D*ycREFOGrM0f@M4niEn z2LIqVOK3Sus;DZetB6S$h$(5Ph#P49!@m&;Y@U*rS7ppkK+N?`qY=ZB+)B{5c&+1A-~%0yR?WyFUi#3<1$_WtwB zuwB!t!UeC)Ll@8N?IWkl^vB`N#2|TXgd3l>yz!e)>MupnUanH~BLt8kbWndm2Va9^ z$ta(`Ccl$J17Df_qsYKlz32E~Ptp39>|j%X{cDqd55(yE|9#+HI2GjIgS)>x2KBaH zUwW^qlK$t42}9X014Zxr|M~Y)Ip6-Dang$`t7HE=4z!4(qW>JO!b|(_PrN*@qbo}t zsQ*2v0_(wKWIp=ek$+EEM8tX^^)f^Tn>q}VlH1NdF;6eKEd@*d?|0}P*dH&auJBs3 zC_c)24Y>j#pqvv?vtF$#e4Er;1ih*0=IZuwu|L(;?)#Pyp++1YuI%kB*5l3Ivyg2Z z_u`3uei`<^(u&fe@l;#Hk!K1h>!`2l7b~IT^m2o%N~4e@RTtaWByF)4x>hsfvKZzQ zeB3{0@38C=B$6{jIv8RuYS0iv!GhdjmD(dQ^Bi6GLoI~ME6}y$c_-ewBzhk-x_H~% z+DdNYUhmhu5p+FTxK8iQ?%F&()zC=Slq?Yrxfs*$uu1`=CqOLbonDdAQXj*^5}MKY zu_b+EnW4{v`>Ea3ydf_Q8WzhnCOj`yP1#ZqUSCunl4Hr}q(DgE_j7bJA@0k230JmT z{&c={zHJKbxJyU*2&X~43kP3#xCw1qILFT1)YzbW z4Yr&>hTz!-_m-Y5XC6Mi_n-V>HIsZc!zys5K%zZDGkQl1%s!cF`|oyPVdX`CSp+WE z-nM`gM9{uPgC}(hBRKgu1#Kw$T}z_*LLDu-0p+H*wVAZ)^6$v@|soyFUF0 z4VUKB*3#CJaPlKeRjLb9d}2b+a!jr`SbYc$(ho`@J>=JPGNY6{)R>U? zl#0;_Az^7cA_|J`3~2{Xl9LL_=4T?gRhU}av}07gw3S8QBf<#xrgKx>=6Ts>ML7#* zqDAn?rZV~xY*0k6WUFizxH%VUZPqUq?6$p4M%HhNR7mC<<4BK$I^ZAg-H?YyPFUPl zBr`-~Y358e#+q!6-7f#RyxV}Z-tGwt+YeiDC*h*6qQ3Gt!c^qoZ zV^K*pgl5WmE%b7^y>vu>`Ls(_aLPHtZqWm&+p?cYqNqE_tY?*CKJEcsAv!7-!j127 zR=O~|B=l2A#3TNwwJ{b|uPP0!h`6`&DZf=E$JJdG%gIl>tj@2{>)tv$YKs5)o z`uY}MCeBG<$XEk*LQZ_um0vE)nGW0fy<=xylr2PY(g{pRQ%n4qn$ za<_34N~NABZOHLe3s(N7QbN{Xf=$eFIQd=sKWR$5a&$zJn24dTgF7>1XS75>R5Aa1 z)nWmHN=D?;y2(dRtmuh-8d|=GP+Le&VHup=&rmZH*MPl66<9aE(eW#9 zJ!BA?ShylV=ySLgv}o*krKLIjnPMLyM68SMl?lYm(IMm=U0ClCH4zFX0^G0f--9|B z47s9;-qR6nd3!%2?MdN%xysUCYqP+c4rbcn_OQ;08*y7XA!!KnHU=Z7hynHC!h>Sb zS0o?r#Y)q*YlNyQD;>YlIU-AqYlWKn+^(8gUR7RE0s;u^zXbYJUUnLCR#KsBsE_m< zUK&TR9k+Pd7VvVx1;Qvb%8pe&;i9(*dIyxXoth1dt6C7?nHr4#GfHen31bk*94K+F zRZGMG=>*;rUfXuM0n)QY1F4}>&4}w&@8%*p{6vn0;zW+~0fkwEj)+Ew3`@LB^%vfo ziq8>)`&)kBGazNE2*I6t$WA4%wd0>65ho--OAJ||j4-sf`FoGZkn0ya?mo@CpKtkk9R)Qoh)fyoLb#RUImap z>>lcdyLy^rxIOOhSkp0n^l=at@px>y>g;#*t=~r@P*0roZH!zY7Lwp}BkOZyqw_?L zAOSH7acFj1+j(wIt0B!<77;U&quEmJA(ZMFMj05nbbOaY+&gvkv|F9m#fC7CJ7G=+ zhQr*JuHH21Dk|kKNn+X>jreRh_Dto1z^W&-|bjp+=YY z(dRx@KwVIDTSE%@)wScI7v`VJH^8BSpYh?Ny{muw930J|LcTRhl9BaT&ju{hg&IyA zTszrz;k~IDf7(s6^;RYcn3XPEF=z!JG}BJQ_H--A;InsnKZ>FNfm@1u%7mBo84^ z334=KfS9iPGkT#?3MV|D2xrxl<;-BIw>)L*(~UCVE;y&JCD<|6=9E-EQ!^(Clopwa zS&~PT7#C()^FthT*q`!maAE)CmdRhcBOltjDb1X*evE7S@Qng0qnPM!6V@-;@zTCB z6qQst*VpaF-X;?|)5%z0pea8KZ0pmsTCz0fy?$wJ*r5m7(okUqlv+5 zdG`9Xu^bWbdFRTQykqzmatqtvhv;egO~}Vga(IPeIp%~EJ_)#-fz;q0A1 zCfo}JZcx*ft5G^d3Ld9#Uky!1->n6@RqULUADY0k)H&xs*zrB~9=yUYChsp{4Vz6O zoqtaLuI(xqIU{Db?CLN%R8&VRp8SUT{oFjwM+I>msZL+YyTm{DMee~7J{1d} zf0*Cw1>zIhIa>A+sCX4TQei24c@QZcHT3o`NU!T0x;%d)QJ1@6y`8mC;^xKiZbxNh zKE7E|h?($|hv|+failFg?W=_oxI6Lv@(blm)sDtWPeEVOf>3^kTQMdHF+;BW6fFww z1fH*!_Dj7m+ozH!~q3J9>%AtQ7m$p!-U6U9Bksso+PHJaI-=R zF>k8T<&#V>qRl|gc>=fJypC?a@tYs^=;H;F=`m@?BNQ{BUl(edQ0Grfx}{lw!|3?I zefyT0q=pxQl^a`Ji6Fb<^Sah;lXTjfq)#f!$$2&msD*@#EgXA*J^tiYvT90_7y#y2 zP88RLb8_=$d=tNh@aVV1fyw9QO|Y( zek%UDoWIf+lux8J9-DfF43&{7S{bHerc!7@GX;R9`44Wdo+;tVvK>{Av5$8rT3Pf& z^d5=Q(apGjI39>dz@xV0P|^tI;`hh;_@3nC6JD0-MkNDm>_EGnwsKed2ZB zK`_sq*zN1@@3E@EKq(eaPfaylpCaV-Jiy~lCl*CZ0%q;~s3~yW?Q|Xt!QZ;LiG$q>uXT*tmN?Be^|Su$@&Jymzx(UCO=@ zP8(QbYW@4W={x;kH$T@XrN~^*pL_)h0?mZuBZFJkBi|i1usKsLdCPvsgoV`i>NUl3 zLrom~N>w72tl--vO7C^r(TO<`g|7J<4B^uU-S2b*hPGqvstc$mT}PK_hEW{H-KdY) zGiAlpJzswaM;Ydzv;}){YFI# zjf;yJ-Ou~c0xjIN|P5 zH8oYDV26&0?p?uz!<97V=_!)T?}>mcI8@m5pE2r{FAP{&MW> z5Q;(L;(ywa-t)5j5$OJLDKaqX+ZIYHc=v1okt5uUb?5rw(TAlerusD4&m+xTU-*63 zk8}d}D}RBji?+5d;_NFFp-#-ZvtrT?Jo9(ZG?Oh_gN9gQc%6pp&XtW~5#N~D6)#F2 z>+jTSb|UVK=h$%GXQX~3LfQA|uUb0XTHRUD@#$aRU5v$^uC=NzdOqgf9b9@{wRe(! zEn$W7=z3_=t4>T1@w$hl&hcsdum%&7v-@XvwL96BRZy^FV*`t&wK@>jU|!VDjud@L zJ@H#Xfz!9b)EDrm#!->EIju1Wk=;W@>TjG~U8+tKXHqgUD9FkEE&kh{9Ek~7#%#J4 zM>}9Ch?589t0xmoaBy(=(v|4CRNgW%$H!*`foWD;#b`e5k@WWe2i5OUyTdTCb(KEi z@A&oc2i@7$Z7SjxW3^K>br-n}kAL1C*!YT6r`^U2w}5Kdm7ZQIs&m>2AQUK95;DxoOz0 z5`neMM3_06#RbxOYHJz{d%vN6OVC5wO12q(VHZd`w^~2br#Mn3?0Sgly6H^RWyw}A+ z=dNQ8-_m?f((nw7?g!AIC=OiVrP5;^m>nc3Nyx&g zgGk3&cXm3~R3=pbwcID(yx7;QfC*;jRA?i65@SnfV{PZ1Ms8o^6c+d8mI}tE^Gsvr zO!Ob{FZQIS>B94-kKZA;UJho8gTUt{@@Pz?Ra2*JI9(|QkMA$0!Cq0&y9=DGLnWa#Z5(YT0u zKK`o0dX0lr$yDWWS|ctER5wG;9>Y2T)>OHn(b3bk?+obwZF5*kcJ{WOGe0qZW{eVR zS03W40J?|(CfT4)h5#}q(qP$dMGV{He5?u%wgkod5q#6!@1jIU)wv`#O!IyT2=@Ca zug(!mU2l?JpbsCOJCUoYjpUKhCT4qY3O`&+`F*_2%3eQ*yBfh=5v$&sepcIjw69lJ zn)XRk^Y4LyUqpev;7}b{=|_oRb2p;RWWQM{&bpb=M9Iw#FiQ_F;9rM!iaRwdKEdki z|K%4ZbzY)Z>Jsr(%!y2cL7j#jhCm!lN*O;$`c6EWDA**HVsC ztR7u*Ba~>cw9uHr;b{83aVZeHb`JNetA|ef_UzVk~*(if@lK&=7-v?K)@l|FI{7U{q98@DeHfo4GJ! z7sPmpB-fq!A#!q5X$rKMhHkuHsKRGwwf?g`v@^W-kempmO0B49?edll4_S|)MKpHh z2*86)KwSzUW)Y4PbVCXf(B#zj%C-db5HrrliYk0nJ>j zyuvJw>Qt07BtDJO6*NiJ7v+c5F0)Z&UESL)6GI@R&@^z=n zb*0PEMW6(>ziaLf>Ni374~0TxWxK6oXvy0HdiKxR+1X_Pj$r3tXC;VENJ=WV zoRFk~yyp;Pf3Ks%uxXm7#bh=xI2gv09)9fE5)~Dt(guqeib9T(q|D2sww|v>hs4*T zAw_ZzZMici@(E{kOArEc7YROf-|^x37YDiDF<$0epV!{souWQ|9$a7lGb-3KBjUru z@~~i@s_T5xr)co|`a^HH#ePkEdTM|OTF^gd$nxXM=F~>N_&Y)3AV(FkhhOkL!{4$| z$nt0i-`2M=E7S+N&@A2ygT_Z|wkgJ`ekK!3Zo=pgb!)9@DERnNo166l+R0d2nxRNf30=pEA-cE>%#~oku$k1v_`Hm% z1l*f*mmRF&;9$74SYj!4bxzl&K;vFTB~4X%ZOhl|m{8tK1+@n$*-wm#*w~ztGdZdt z9OGCByAr9ZH=uEFaG02Un^>3`&6AdwH#Ks^c*20rM?TqV+a*h9sIlY-+Z2QBtM+)& zRFK8yb4i6P;bD*wlcAzz+aZLt|gbqS6a35dG{64onJX=O6DsrrDzz-x3LE;kN>7BjeEh+*y^l6{c zcdO+QGy9wGJzDeuyf^-ziY&|=(0*w!Dm!(6$nc^i!MF&5omh9U=WG3-x*~ty-h>o{ zxnFo?Zv-#VUQLmrC~0SO*OK}rh0S@uml4};>WX-w7Ys(`n{U_grQg&&5|fl=hc3Hu zpe{O55@fTyoB7TAcvDPFB)BXlZl*&4{9Zt-2^Q2KK|A_Ka6r+oj!<1a{9@!swBTKZ z+pnuXESSh4VHzMZ;0m8{PfsR(bn0@1K-~$t@puR4UdB& zlxvYIzG+ZmG4WIPd-04NytQ?MYdE09>y{O+(>|V&|GC?6+a*YOS2lAJY3Ci3^hbI5 zyzmH`o!If@sH^rVv{_4H)%(*L#_Thk3B1-Id>>1$V0l%(q>+hj+#O}!As+T+;l zdgvq-hrz>xAKFQ`oyc&13^~l>>7I>@C_c?_jxQ~B?oMmO$H!|mRFWv+6K0bcNql(A z#`Y>LHuJX%Kp5Y@GZg@v+uFiO$x2;y6mYD@*G_^c$`+JVr);tdadh5wP;73RIy<|P zKgle5WDrp2S%d{Pz`_3z%Jn`G7`0!Tw_=E>3`!|F^kBInp_lWc(U%j3!NKF7NZBC1@ zzB4p@7NHOdT(-a-CBDlq?n@XA1f;m_aS?V2GBhe$%G5vYubCxBf4$UH$IY25uZ#k) z5aE@Wc(dpCH-Y+!QKGS{M8}W1#jZF?DSAdmYLI4@Y_~TGarBsR(dV?aCnwbmf9~tUOp#RaEtzZ3h!QpjErK)iZ@&C`*wHN zQab*LMVnRq&jiMtfu6p{sP@;7yqz4aIO3a7YysErhTE-DntbwA&2Zk>he`P>LMFm;2 zW;&5V0^!?QzrH$%I?CFx+|%U-+ZYY$;80kpwj}a|y)F+}EM%WI;tm->p&r zVQZK@M2X=hU6%vE&YpJ+%b5BJPPMd{EpzRfA9LzP!>#i^=tau+1w%=sAhA~fb>)!Z-l7XADJb7^^q zp`&BOAUO?92n_cA;$SXxV)MOIV@>qi^fC!$o!74dpA?p^-t>QK(#&6|AQ_gUWh9ak z)WByeYDI<5rwl-~1O16eD!3w}vo-yun%|qJP;)$p{ zL4P?KAUvGju@nuYBENb8bc`x|((JFm?t+3|f}GFCH;0UjjE;^Rtb|3pKl7vAsFrNs z1mvsSTn*;rmyvMVNpsEDIuuk7;_<8m>*Wi?;z+Lo@sMBrCsQGWya(4XLPi_|>muy; z+2ZK_E>_FAKDCa|p}{A^(#SIogzD|_Y2!_fmAkj$W|WFPx9iSt6wuhX>ZBzjf-O$+ zwMunWheuw#y?P-EK1G`ym61wP4r1sVpta~rk)go=W3rbvb#_E47#y^#B{s3P^6zbP zBwe}Q9E_4@{+jxqq(DebPW~)*AzB3O=laR7vAJL>NJ4TVz`_HG;_+1aio96wlT1fw zun^gVg+*-@xWP;SA&rKHHk>szszi4}8u+SIZ!9KauvSf_KN46^G6&(JqRPjgqQED{ zKwf`x2PHb79e`>GivPQ?)e~)kBE&H1%9OrQnS3{kc#B-9Qe zFUjkrL3!`3`#KDVD>YI=4UMl8{o;CUr6Fy%eTU$VIn!q}P9`tJ79W1rHQf8#IogOIy@DQ(}C^PGLuWqRDxy#Ad@FwcbvtMg5U2r^Di?g6hOPW z#9_P6pww~gvvck_VrpWNkda~S=u`;=LRu_D^tg;HlSvsmtoJ~ltVi>0BW=+q zPh*l5pCv}2f>3aC;{Y1fx!MH;LI*E|(9VqhkF38>uhE~{9Y)r}&D~Cad)cl{%fFe_ z#6HesX$`GiRtC(y9u2<`2N-nUpbR-s3!6)@OtjampW?%0!bW*v1>!JLlOhPCSMy>= zG+>AGH>P)o@V2YwZ7YE^%+o*98jbX4eF6Zv1ON}v)8EI1`rKR^Fprx&N|OTWzkMsq z@-CJr(JtM06M=4yjZP_GR|G+>0+M3+S$;qrW_rI=n z>h9XBZ1m<;>)F^sMatSN04HKAS3+syc3fd(IEN`6|A^%0G;Ud z%lFNXvazSJq<*vuzISy)Ec}3_1>W6>T*9q$4Q2k7J4LPaTvYz`tOE@VO~nGSv$ON~tUERkX>xK5^Uck|r~fN& zgY{R+IXYq-5)*^gE#L8$OCOcYD%S}S!4R^H$bVxc5Pls_rwREyZaAS(Rq-a*^(hb> z4T%ZYe=zaThQeUaFGzWVK&eAu+8J%QP_;m-C?w<+r`w7PE`0-bA412zw6yd`p!Q2E z$aI*nt7z&1-NMY(HHM?c%~?fXKZ0qnSsjeR!-F1(b_fB-H&`!MUBHU>^z>@i6g>-U z|G5T>?v$4TDJR3y)|O;{mbZp$s=B)NL_Df;S@{Co5h-kP(PL!_?Ghbh98-&f@x%A+~a`v zB3OcAZB2gCPD{~9hru^CIV%aL#OH+tR!dg;!xnRz{w<{`qg4eJwXuQL*Uevsdam$k zZ+Pse>4o0N52sB{mS{(B9gk?HW~WI)GvX9Bi#&(I`>&cwBpbc(cXp^?wo5vH2W7)& zn`{I|BnZ**8yeK~YvTVv3%+a3y_3^p;xJyXCbFf#LWYge^A~B9QBd-rW-6H3dZxwX z_MX)1iK}7-ClZz!R{MSKk5h)>gD#jd8!8T#(9a@2l{9&LY!0R0N$Qg@mbHY4JZw8% z3F%Xm&U?R=w)egiUZw*g0%Yy6U}E=saWT07BNA5$J3GIOlsRru5k_2AlBA6d7XU_~ zo$b3x+&H+n4QK$ot7&Rt5Mp+AtWgvw)~z`=gh@jnfGIqW><(BtGPk!618ANz0%pJe zmd9bEPkCTK1|nVlv2KCSqX-VnJQ;!=N$P1I1JhTtVXH>PthJvP$qr1+uBGa)9( zgc)}Z^Q=1Z@*b}ZI%n}hWisP%u08~X}VRc_nX_#+c=Ym zw8zk98}>p+Sw*;_d(d!Y*OP|jkYg(^uW@%QgeA3oi19rd#LqHp4UcLMiI%S!wvD2A z;y$STEPMga*KkBepNfyAp@F7cVMPt0FC=Hj?_nCs$_k2hETJf*qN>2%!Q3(jpVE~U8kOflPudMRiHCcE zX`YjyHY7a9kfJdr`=hTFfxMrt03(mSm^eT_ zxkYFw!LQ*0#gX6xh4xCOcnr(SF)}h}_%viasB-T&ek39tOjEwnkv3VOF(X4o* z%&b3#eXHiAkTc_O;^3Iw+8V1Sv851Vfye%GW!JxJN#`ll{tnGY4q3P^J#6Ss&}hww z@5&MLI|Fl5=5np;Us)NvKY!rVP3xP|@BXsi%+JSt&RBcj%#6!{36*9dl~ArfoKBCU zdJW2EnVF^^?Gd7Z7n@1)m)$#{+SU;c0~_To(G}Cw6&>i0J*q(uAyx z3}Sb;M0Jf@Io4DnHYf^l@Nos_x3oY(iEdm)6);g6EM$k@zt91|B`BL2JUc@!q^Ez% zA!Gjwa{yA@vL52Lp@Q_+Z8fB^nC8C(=t*5vIQi!9)WcJ<(_r6fUjYRM0T6(f-o98Z z0aSzES6Rzw@sNRn_{nxQfR7D56DBrIA9apuPYz(B6|bE5&!bK>V=`D!i~ z0;&(>%zA12-_je_7vP3(Vk5qqYdZQTt-hYOsF<;^tZaR<5Qhl|Nxuy6DEY3tJ3(m- zv#M0U6)~91Ja6H{xOsS_939zZb0&6Kb(u=O7w46hCLw4iv86^?1mvJaz>M!3xwM9G zOfsVs3XFkmSAS#`7yn86P8k3=8X^=BdDF#K&%b9R7ZvH@B_bJerduvnre16rN1>u% zq6AyiZ&@*?4m`4p2o3*v^v*hKCK|7-np1Maq!em#CKiEoEly%hw?11$q20G@j2l}P zHlw8(`_90-h0E)4j5emGPEGOql7pL7+*cbP1Y-9{{7(iVgYs}0%(w&vgAxFa&sb|I zdU??jBvvV@f4L$B42CK^PgPx^uC@ZmFr3*lp*<$-mA3MfKWq+(h(#3Wu#Bb#05Pfm z+n*8YG$v`JgE+>Z$@P(4_ZKe?E<{F_Qb$DxnCF`(UDk>j5%7Cb#TGvmmmj0I|sylGi&>lJ+9(7)7R0)Vuz(H;54Qm7 z5J6L?C|IE}px*;p#Uw$8)v@V{Nov;t5V$?B18;`=A_-{!PTSZp@%9y=%+&xTJ%Y?9 z9Z6F-^>pWG=WBgq#L%4{$Y*LLCA0t~BTFSU*1**7R+ozxkmy(rb zwmI;M35NsB%w*Yj(@FjiP`jB};CW|jivkCC4dh@MSy^d_g4sv=Fa&S{fZ0Lw0;pmE zOlZfRv*T>x>FG(&%mAzZjs`XZpu)3Q4hQWI>e+Ne$0d}N^yGgPnAH*B&CWg^XYv}T z($* z-s78l-&r$LzM7Q&`o^c4hqQOykxfKM49vr1sX?HAnYpV`0R285O;vDM#Es_@5U^#3_tUtDbJ{Sl#TL4Ja< zOt~sQu7+p%GXV;lDRJ)ltiuSW4Y61O9f-mnl%N(tSlWgXJ+p7>Z4^*iN-0g$S zn;E^9XIw;Pll+oW=CtUMk~o>BAj44^N?o|lM7(EH_6sJN+#PFY(IpRF|INZT^* z1w9KUV7~KV%^7=p40;N*Z{OO~>oIeJZiQ+9S`7?B^_78c`=pS#L;sz*|2J|ze)WZl z8_d#;jsV_1={q2h3_Jg~vV;=aGHd=zB#A`qzRHfP-)P_&1V0q4AfBN{!dgHw`C7eD zLCOJbcG)lBR^L?Zi#&h|M@Kf{|H0!HUyseHmW>QMfABc`?k27$Mqy5_cgNISzD7Z5 zZH9KIYEw8yM1KF!6r!1ZO}tt@uwSTKmvr}6h2p|?A;xK}C$Y4)Hf;??!3iQj`jV)d zBI?8hhaNMiKU%k(cvAHA_VT&jQGsVauKy=o+mIosfD7PWVQMPV$Ph+cT4Mjf#!GN1 zl_!u=UW_Crhx`-+>*7;WwH4~B0R%|J-z~A!8-92ZT0Up3ha#LEyX18Nqi10hiwAS~ z_WjnVG##D^Nc;A5U7OrO+>%xrG-E1N?5VX19 zLtp>qMIvTgb#)LsK<)JT)1xEJE_BT?8SzE~`}?e2U6s57vfCBwv$#0nVUaw_ZH7YO zmW2RBdg|zuU%dIMeCBC;lipStl0HUjvJ7uQDIWMfOkV@d{~ zLzt223pR&}p{VEy$NF$3)-cI}o$op=5mAeR&ittjyOzLDfK%n9;%9&TT8WVfLqmKO zt|&(~ZDHbSlo7TO<;r?pWWz4K@`u_1fv}?w>z~KozNuk2jKu zj8r~D#u3_P~hS9 zy;DapX$vi_sfx=#TWr2L2b^jAY~YiH6#-#5@83OUSHWv!g{J6{b=ujJ4UPl%zxZ1P z`D1u%Mo(!ud{y~E`0+Uah;+qel$0#VVObMz50+{(!7^>?MV-)q5X|fHn+!k>Dr%0v zjsZjp28|z7^wf#QO_%oW+n@R>V*u}hl>02MX_?l1E!BzIk^m_^E1q32N&rON(x&_b? zK~N$o80=oYhu_)Rfz{TAWE@yi$V5caGtzIV4L;70cnkNskc5ytWLCYI4Ox;XdpYJs z{yN~BbU5t$AKui(D9&)RHPnYckKw7|cHYqNUJ`+Li+%<&=>RGOv=+C|-xu5}W`(w! zXL?gzrlSzzj4BeEM>%?a{v>;kpwH)rBBAWAV)Nr|LPCPQ*A6q!E4$U9(Sm{|Xvz3E z#{7Z~2!C6b2EN@rTR1*G1rEGK8&2Fej47*~?gl6Wo-@9f_r%=z8n5Kop5 zRD-`<2umWTwn@*uOCsM-50(>8JA2UBF68tgLGF-`zR>lG`bE;Nc+{^N-{! zTMFbC6IY`QL>|yJ(%-y= zu1bIc*6RJ`vZykan!2g2ZI(T6RAGK2VkaveVfH%&Q6`+;L)WoiO1)dtIQcz2o;0)t zb8~auoIqC9wfm4)T^)3INZcCTx%zvfU#Io%@29o!m-+DPn0gI&3>y2qY5C}{rLJ!F z3A->~%SFn{a&mG1zPz1XUMBx!<(U>3NS1#cETNFSC-I+I7KDQvijIlfzc?T5`+IX2 z1{m3M}E(Y|W`#F7zS^^ZGeN>c^QtQ&fH zh1#k9K8F=CB(t>1Bz2I2Q<@8pSwu~aq0`F9^0^ej15xbxthELJ_6?l!w2aV^k2N~r zVZTn+FI2m`+Sl9x#;?iU`2z}8&)j#K98>$7E@yT0yMMWOGPibcVBV$v{=;l=cUwkR zSo*CV7J!s#SH;aUI&_Sn?WK#lyCWiN>4N>$zPw5{X<|L+Xuy=_XxSLpwAjpU!xiEv z^c@*;V0)}cH!HFuwXuUfmHb3FEk?@P$;;~z@4Y>R%GL^h2tq5N#46-9IbJJ{7FQ65x=q zq7A;&@KDOGPV}`^ghKb{Vly78Snt%a<;Jw4-u+Z81#dwTDFji5M2buWRlH-UX@wTu zv1hnMu3)$YQwWT1V{;QdvOBzct;@&(1sV!$tFXR4EOUuCpdIZ!0;oz+K*l5U9HY7m z>G$S!=!**}Rt{keb?F0*{4pw_Dcm?X74s#|XP02T=!y$rr7h8U{gzo8R9N5sn!H{9 zOloKN**h6Yl^utAWfS(T5+l7+LEedyIuV-=Cz#30mxMVMH@P>kf7fySuY1Mz<_Q(n zPXjga-Ui`jU(#!4+`K9EZ}AXLdCHmP9-ORz=dL_F{fSW${ca6(g(Y2E<*E~l(hyU) z2nq7RtnARi_3q7+kB*It^@92!(4=6D;T3L>Peq^870G-pN%-4{X_6NY0b|}3bc-1; zV#u)NIVV2UyBqTY_1{R73N3s7%=!<^MMVsj-^+|$Y=|dr=J_>>6GviP^_XcvV-aY6 z0nAK%8Wi+xe*D0~#a(r6*xCI<;o{tNF~UqEp={rz2TlN3xkmAuy20Ru&G*V!Duq~| zKJ7cZxu|I9L`>{{%gM=_(QgWZ(WPL7zm$-W0Gj6Czkhf3_I}#d0qGG~7OzIkiM{EY z$ZpB~R1Q$Rc<<$f>~q1VLlX#@;I#F1%q&IPc0cbuf(pyA33+D^=b2_rFZSUHmFaJE zG#!1-i%n@37&4>~wRel%UA=YA5Q!W%Gk#nZbLHlC@Mt#Sa&uFin0%+PLYU04}!J76-VCsUA`l4fS?1TE?Arj~0FS^|pl#pPv#$0;|kQIya?Monhu{y^ejitzOr|E_aL z#fgJXTKewppDu7E#Nc`_JK(nY!QIpuBi_s(nm?ljoS(m0JK<$cMuNoa6K&>ZKgbbT z4^`GTg2$EP&)NoCaztB;QAMskcNCeafuE>$@xM#QQ$fZ#l;XhGZ{}Yqz>kp8cc29k z5})NC@wAW73+$&KJzs$}1ZP1mkzU#P`zaapprx>Vv$(5HjY3Z-Kc6$&6UQ1M)4Nz$m*J|`tLwZ2oBB|(K&h89yy>HfdFXZF;rl#nwtm?5_<45~ z-71ZsZ*bJy%OCWJ?ylmR9z8OG0(96hc7n*kK_(`q_`D*9Cy0}rY*?l9I^?~aoE*9$6>DN* z()jXp$K()`&D&vKB9vM;R}WV1|J=0@W1?|_n)>*%U&wCLCH~d9AKIH>zRPKBEOlze zO45yDgU43|z48VrWbl#gw2`J{aJu)@soK9)J zSR^IRE4_GGQ$yQlWn-CN&ieCLrk6LDeV{Xc=k7$y#(*1tVF{i2)dSsSh!h<&GwhGa z+b3HL9AMM&^hzPbH#Rp86lWR$I8I3|VsNlurfdD1D*d>WR96SON@(a#DkpH6lGIi7 z4tV&3k}?huLW*vnpq}3U%f(q<41v}8#fOPsT+t=No7h30Bjzzvu+;M^OOvJ=JoKxl zr*W43j)zrhHXks(-7~K@j52RBHVSgT6%i0oE#Kr?|Obob@az`8j zd^;Ix4-K!fYV?xXI;dPH$0cw7ZVz+-c*@J`c4(MIN%e!o^xhtUn3!9*WG)p31oRlv z)6xAjt2&{5Z|}G9Y*jjFsYQsJoBQPU9@w=Iss@Qzjn?s%Pxa;H7%)feqV9l+{Sf)A z6n`?t>L!4gs7H4vi;v=(#FOwB4EGIJt282R8UAIXr!b=B#8|T{P@KVw72z* z4z2@eNiM651v1n=Ya*ZLgsbFghV@1}l&dsHKf|?dgl7@!lv{qIr zDH$D9FMBb(Uy#3B4M!jk6Ndpqp-x7-g8=hkPKM?PTuM`6fb3JM*D&M|g!VK=EDW)R zJN*4xM9DL9-nzGPr$!G zUt03f#@4?LOI@8!!kF#(Gm!@HK5-`^e_5dw)!ZzYaeZxa?ISD);tUXCx*eK65E1A7 z2SpfF@P>wlnqcGNRy5WsP{jTGrt=g*^=T4~nWAD<7slV)eB!va#Wm%c(t8l`iyqux zwd8blS-tRlosjg)aSv-BNfv>;5BoJ-p`dmo&+lGcJhGKdikX1}CT!YIb0G1U2#yQ_ z=;^?p=`LuSmQFy=gk0X*>Tl^|LtH#1^PkxO1$%&*`=ktx;pr>nZT9p z+@|8d^Jw|;T~3X>tDk}T|u6F)FOAyZPyv>|rj|a`)M_#Ol zD7xX6wOues?Q&wOPFP#p#=F?L2LVXJ-0Jwu5U<3}nw?8XUc=JzH5h9A)a0bJsw(A} zMFLA30bo&qJfS-W7Tb5%zCniNEmeb{#;u);+5=J}$hn%l{QO3yriq~4c42ev_!tdj zHeC7ZodOX|c)}{CQro}H+BV$F54WgzSBJfT(g{WmG(tJgolm;k9uc3i;&nX_XP?{o zDmKsD5nu6eNZI!Q8UsYGvxa1OICV=}D29o;8 zoRNj~+q(UlUXjvvp-y!UNlewop`lU!3be?ME)H2;Sq>0a4>LcIL`CQB^T(=S1y}hLRLof~Hgg3T;(>0B|DLT<{#zQP zV`0h7DUI=OPuF^jv+TRiKu{_2n~~$|wtEbyAzrgJB4WeeOa%tU0sK~xh$Y*Cy1Mj6Xbosy`1^f1 zi#bDq7HAD1>T6#s&?aJUBCn8k+ty7iEXXhQ>ullTuw@EQMRwY5Zw)VKG2t{e2~=n? zMMW#3p-3IO3#Huoir^Gu8;Cw@S3&@qEfoQIal`*r$C<}Ny}o_?a5@?pOZKc`EX83g zIntDv7`u?3_C0&H#1yiG5l+W4mY6JK4V5C<#&-NL*-EzOnx5y6=Xw2l z{-2re%r*CYU7yeUy05z-F6W~a2qobaSD(9oc?T}C!JjsH^mJFLlbgM#S3K?Wg?~wr zKP~b%^f*8Fq%J7l^#-5SbMRhugDd^Y=;#Jc>xqj%qgyD);-hGy6M{U|VXl_R@k!MG zq8caO&pkOY(FmR!qGP(~=w4X*B4r%w*KMz~cS5XQV?ERZ)xP>!L{KpI+x~q+k>uQ( zVa{lr4l_<%=tu;HKX>Yq(HRgXWHJ^>KB=KW0Ar;l)G0~>G)XBMf#gSd^eF#NcXxt^ zT06LduuxIhOKU8$T^^0+FGXk`Ttay5#2=%0tNVWyy@2{rF=lrMI2g(3?jC!k4=bu( zP(x?#212V~nuhKuM2ex25fz3~5fg4?>dy+0hgx{otP}^WwxwFn6fXv8*#o5|Z!|*b zDN?>xc@=J0K_emU9t>Atk_v3hEHb)|GupOsNJRWWk&K*DprC!OB1H}tr^xaqO>G9~mL!2M21{xSmh@8Ejc6z?a)_Hr*D%Jf)+Dkf7bJKS zzNkQThojUs5HaPF08@($X`Y0R?%rN<4#6aIa)Hd9(4iPbKHg(s5Z7V5*l4VjQv|+L zS1la&F?&>x;??>2(zQD!GgM{_gGS!M_wJX?jqP|PO3tXlwCw5E7E{l@4r{A_-|gmM zjk;`+kzVqVYBY!oi{aZY8ya zdD1-pU)3n~K!p#kN$?}_>If$2nxi=5;5_#x7C*-?tL&||zOjTEO(wcj3@WVSv}}}+ zZEv;)9W};rhq;!=qXz~$rOdxZQ+%^^(Y|XJSSN)4%Kt|!h=clGdeq+(I7FS>5|@!J~z+zaOkxC$f%OWletbacH2!QXYT?R5LIZ6n&|5 z$45G7{&sF;boX0(U14Fm-oQQ$+8iOoMI>7BTK?hxus{ZJa1mknIh0_a5s;%iCNc8VOY($Wy=zSVPlturwvpTLWEG_N7c-zgw?j0M<$NPCF7^(wwPDABX2-yYS zXUM9{VsUScx_o3emp!M^57s+MucyWf3H5AdTUg3%lAg`eTH=0cjsCBvda-_iOV<3D0q=df3Eg^E6@tYGO)JnLhI#Y(pn!elnkyD_xV6^atXr%ci8?!~pvu2a z2F8SiX=+WQ!9}gv&PmEto!7h_B03uK#U0Z#2dBk4mn#Mas{KMD zwo^Ar^;G{pIMeNi-kbX+ggL%|MmR!GZ8~!b|F*x*a`fDI-zU*&o4^>bSVipYWlnBX zCyokRT&{j21lh**eputSDwD>+!$nPw^oi9cm95D&|L7|%A!U_oN2N#TT8JZ&%&K(`HSU{=HUs zlEdb3TGcP)P;wH*%jW%}8QT%(EWW#&4TF@f`@s(_EYtLEUxUGLye;Q%G+w6q%>$CX z_0D)}+e3KKNPl;Co|_oX zxO)HKHxoK=iXLFA`Fz-wjP8fX9<-?`K%{}%5V)w$?k*k9FVpm&saXXwirM%(L^bUE z)}ohBZj-Hgd>fb~rOe5&>Skm2*qA`r#ZVCFNoKeQCdM@+5-t;XObIC=bh67-y&u@a z^0HvIeCypfc+2+owv&si=7{h7{5+iK1AUesCisWb&mIPz-?Kt!*4{wbVr%Qu&K?WE zIHTqXFoVRF@+z)`$P?fCyQri*AA&|qre3Z3xxs^NHp1Q>-$O!aapfA4a5%1@cmixf z%ZQ#5ukU(U+W$Z zF6LBz%+65|6vniSXi01%?xw?;Xc{6wlVbXUEAjahNqWf zZ>Z)bdM^wBQ^|S!NXinbg}M2N9Js2$f=965_Eu{rLHh6}^mMQ+eEc}!a3?67u_|ko zXpEe&@pegoqBT0}05j07lVD7;Ke_Rx>PA-d#2@3$%B=U_WrH(zL?YYvHaj9pOE+!P zwp6IFxFNNJa;iOW*D(j_U1&!=U0&9iO6dB~FUC0}vwMBK&&1Ho`qrQ*a~RQSv6112 z1Sl3mfTx!8y65z{WkDg_s85CJx#F5f&O$r>4<>}f zk0;i&zU<$7je57WWxoXaVL4mH2s^6cVDx8v2U(br?j|5K^D4&Q1Y#jn!z1E^L4-*~TqrXOO zvvWkZ35I;F+k11OF-+Tn0_YpP)YvvM_VMF0=#Nz$Wg7C$D-nyF@+=sVktq&`2JuA`pZ=?&2?-WF;T=pH zO7>b_4t=_e;$+V6T#QhRUQ32P%95k|tkdgRPsW2^{>QGT6PJt3PQfg!8iI*gnWRFm2N?}#|2a2arsmIR^2%hP;ewZI711Nx&})9n;9LAL zPo8_Q6jGB8E_i8U#o&*zcVUsQ%7T($)oVTi{k@^LBZ*b@vD+=mRMO*$zP>LiK)`q8 zr5&W5)pqB3-t+MyR#xz1H?619In=)8EE*5b%xT(i;F7rTelVu&l8Qdw>I9KdfvqGx z$@_No!r99fJm%s85*e7H#%d953+9IzW;gx9Z*1>jfH=!1A59;b>zw;yJJ>5>iQ*T( zY^G)Ef5Pn+1IQXaNnr8dqX80g^D@!tSYcse$1{gW4h$+1}F;334{2VNZ<-a2@$Ca$(5pX^`5|0kBOW8iS@F=kHW8k-x#2rbvcjqUB9`}BJ z{aBQP!{e4c0mioPpD;rbTC#f^lZe?*r>L;K@aX6Yg_WMyIvD2v#nvf> z+}fJ7qgpoWOnW!J4+Y*h%nFfAHQFOk3oyNnIEhyLp znG@h1Dfjw+D^(Q5evW^6gQdQy`NqB7-y_98Oa^toZQcbMqi2@6K4cOi#ish_4}?%+ lL1z*g@PRr%q-eq+dq(?f{VNw$Rp?i*>S-HaB5K)${}(p}CVc<^ diff --git a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/Expression suggester should display colorfull and sorted completions #1.png b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/Expression suggester should display colorfull and sorted completions #1.png index d771df3366af9add5a01d2c4ff39918812dc9b43..061e72f62852fb8650d6a77d1221f2ab9d779084 100644 GIT binary patch literal 16426 zcma*O1z1$?+b(K?bT^Vi2uQbtG($HGEit6DbcmF62}p|wNDCuf(nFUBNJ)1i9sA|? z`|od`ea`n?*YQ$h!CLQn-_=@eC zQUm@Yc9YR_lhx2v)z*-bF_BW!(U3OLxyQrK&CUaU3;u`?L8T?MJnwI}qGlMLOZ+*X z_xW2?@1k3iIz(pA`RWzPuODmMd>JXG=0BV;?B0o+ z?r%?adAW?r=dxAlZXb%)85cOFEY2efD??lqCWqj~bqDbnJR1n#2+ ze&iEy+4edP4_pRM)6m~t)=0?Wf=h>>C~zmu3zQ=%4&`=19X{@VvXIX$g}I6F@J z*B1#74}YA_So_=89iE4OH{3gwRbgz88AWp&(fPVFN|P72&nX|fQ*CG=yJ@(gPpH{HZ=>leL7C_|=)4knvubkp^I*zU zfgGEESM!{E;!osxPZ5iD$jb60MhT^Z_S-Ar7jB+FjBz3GZH+z5Z2 zdDVaOw3ZDnn>=xTloHFc_xDJ}Dh`V`Wnz(?O(Fr}yKpbj?&u4*&F=RiIsq)p@r(@8 zKMtEEHjG&c342bb#um^;+pc6Qy_3=-9W-evd%N{N+dpYwe33LyCh`keLg_qq3KTLQ zLyXWJ<$9Dtb>*1OWp8mqba)aV2frtIͷ)^w>RyR#deq5{PDUP{5Zs71er?HN)s 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 literal 16297 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 literal 36382 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 z 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 literal 30700 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 D9>tBF literal 6895 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 diff --git a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/JSON editor should display colorfull json #1.png b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/JSON editor should display colorfull json #1.png index 1e47382e1ba0162619a5e53e00d8bd9c0b23c8ca..a54b2128ec1858ab8df870aa9f50fe619bc444c0 100644 GIT binary patch literal 11126 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 C1xJ(s literal 13076 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 RfB0`KG7<{n6{3a#{|9yy4c-6% From 3f73fe83e4632b0588aea50c9b5857ce4d2c122a Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 1 Oct 2024 13:26:25 +0200 Subject: [PATCH 19/27] minor types fixes --- designer/client/src/common/ProcessUtils.ts | 8 ++++---- .../src/components/graph/node-modal/customNode.tsx | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/designer/client/src/common/ProcessUtils.ts b/designer/client/src/common/ProcessUtils.ts index 081543af45a..063048b2f75 100644 --- a/designer/client/src/common/ProcessUtils.ts +++ b/designer/client/src/common/ProcessUtils.ts @@ -1,5 +1,8 @@ /* eslint-disable i18next/no-literal-string */ import { flatten, isEmpty, isEqual, omit, pickBy, transform } from "lodash"; +import { Scenario } from "src/components/Process/types"; +import { RootState } from "../reducers"; +import { isProcessRenamed } from "../reducers/selectors/graph"; import { ComponentDefinition, NodeId, @@ -13,9 +16,6 @@ import { ValidationResult, VariableTypes, } from "../types"; -import { RootState } from "../reducers"; -import { isProcessRenamed } from "../reducers/selectors/graph"; -import { Scenario } from "src/components/Process/types"; class ProcessUtils { nothingToSave = (state: RootState): boolean => { @@ -191,7 +191,7 @@ class ProcessUtils { } }; - extractComponentDefinition = (node: NodeType, components: Record): ComponentDefinition | null => { + extractComponentDefinition = (node: NodeType, components?: Record): ComponentDefinition | null => { return components?.[this.determineComponentId(node)]; }; diff --git a/designer/client/src/components/graph/node-modal/customNode.tsx b/designer/client/src/components/graph/node-modal/customNode.tsx index 2fcc80dc4ce..693ab2dd246 100644 --- a/designer/client/src/components/graph/node-modal/customNode.tsx +++ b/designer/client/src/components/graph/node-modal/customNode.tsx @@ -1,12 +1,12 @@ -import { NodeType, NodeValidationError, ProcessDefinitionData, UIParameter } from "../../../types"; -import ProcessUtils from "../../../common/ProcessUtils"; import React, { PropsWithChildren, useMemo } from "react"; +import ProcessUtils from "../../../common/ProcessUtils"; +import { NodeType, NodeValidationError, ProcessDefinitionData, UIParameter } from "../../../types"; +import { AggregateParametersList } from "./aggregateParametersList"; +import { DescriptionField } from "./DescriptionField"; +import { FieldType } from "./editors/field/Field"; import { IdField } from "./IdField"; import { NodeField } from "./NodeField"; -import { FieldType } from "./editors/field/Field"; -import { DescriptionField } from "./DescriptionField"; import { ParametersList } from "./parametersList"; -import { AggregateParametersList } from "./aggregateParametersList"; export type CustomNodeProps = { errors: NodeValidationError[]; @@ -14,7 +14,7 @@ export type CustomNodeProps = { isEditMode?: boolean; node: NodeType; parameterDefinitions: UIParameter[]; - processDefinitionData?: ProcessDefinitionData; + processDefinitionData: ProcessDefinitionData; renderFieldLabel: (paramName: string) => JSX.Element; setProperty: (property: K, newValue: NodeType[K], defaultValue?: NodeType[K]) => void; showSwitch?: boolean; From c1022f4526750f2f917cf33324b78a6dbe26af6f Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 1 Oct 2024 13:30:08 +0200 Subject: [PATCH 20/27] fields labels --- .../node-modal/aggregate/aggregatorField.tsx | 11 ++++++---- .../aggregate/aggregatorFieldsStack.tsx | 21 ++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx index 4a3c5329bbe..6f9b0da841c 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx @@ -1,5 +1,6 @@ import { cx } from "@emotion/css"; import { Box } from "@mui/material"; +import { get } from "lodash"; import React, { useCallback, useContext, useEffect, useMemo, useState } from "react"; import { useSelector } from "react-redux"; import { useArrayState } from "rooks"; @@ -30,7 +31,7 @@ export function appendUuid>(o: T): WithUuid { export type AggregateValue = WithUuid; -export function AggregatorField({ parameterDefinitions, node: { id }, isEditMode, showValidation }: FieldWrapperProps) { +export function AggregatorField({ parameterDefinitions, node, isEditMode, showValidation }: FieldWrapperProps) { const aggregators = useMemo(() => { const definition = findParamDefinitionByName(parameterDefinitions, "aggregator"); return definition.editor.simpleEditor.possibleValues; @@ -74,11 +75,12 @@ export function AggregatorField({ parameterDefinitions, node: { id }, isEditMode ); const findAvailableVariables = useSelector(getFindAvailableVariables); - const variableTypes = useMemo(() => findAvailableVariables?.(id), [findAvailableVariables, id]); + const variableTypes = useMemo(() => findAvailableVariables?.(node.id), [findAvailableVariables, node.id]); const errors = showValidation ? fieldErrors : []; const [hovered, setHovered] = useState(null); + const outputVariableName = useMemo(() => get(node, "outputVar"), [node]); const items = useMemo(() => { return data.map((item, index) => ({ @@ -91,11 +93,12 @@ export function AggregatorField({ parameterDefinitions, node: { id }, isEditMode aggregators={aggregators} variableTypes={variableTypes} hovered={hovered === 0} + outputVariableName={outputVariableName} /> ), })); - }, [data, onChangeItem, aggregators, variableTypes, hovered]); + }, [data, onChangeItem, aggregators, variableTypes, hovered, outputVariableName]); useEffect(() => { onChange?.(data); @@ -104,7 +107,7 @@ export function AggregatorField({ parameterDefinitions, node: { id }, isEditMode return ( 1 && onRemove} onFieldAdd={() => onAdd()} readOnly={!isEditMode} diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx index 888505ca816..ed44c4bcf9f 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx @@ -1,11 +1,12 @@ -import React, { useMemo } from "react"; -import { AggRow, WithUuid } from "./aggregatorField"; +import React, { ChangeEvent, useCallback, useMemo } from "react"; +import { VariableTypes } from "../../../../types"; +import { EditableEditor } from "../editors/EditableEditor"; +import { ExpressionLang, ExpressionObj } from "../editors/expression/types"; import Input from "../editors/field/Input"; +import { FieldError } from "../editors/Validators"; import { TypeSelect } from "../fragment-input-definition/TypeSelect"; -import { EditableEditor } from "../editors/EditableEditor"; -import { ExpressionLang } from "../editors/expression/types"; -import { VariableTypes } from "../../../../types"; import { useFieldsContext } from "../node-row-fields-provider"; +import { AggRow, WithUuid } from "./aggregatorField"; import { DynamicLabel } from "./dynamicLabel"; export type PossibleValue = { @@ -19,6 +20,7 @@ type AggregatorFieldsStackProps = { aggregators: PossibleValue[]; variableTypes: VariableTypes; hovered?: boolean; + outputVariableName?: string; }; const PRESETS = [ @@ -36,6 +38,7 @@ export function AggregatorFieldsStack({ aggregators, variableTypes, hovered, + outputVariableName, }: AggregatorFieldsStackProps) { const { readOnly } = useFieldsContext(); const options = useMemo<{ value: string; label: string; expression?: string }[]>(() => { @@ -48,7 +51,11 @@ export function AggregatorFieldsStack({ return ( <> - + { onChange(uuid, { name: e.target.value.replaceAll(/["]/g, "") }); @@ -71,7 +78,7 @@ export function AggregatorFieldsStack({ readOnly={readOnly} /> - + Date: Tue, 1 Oct 2024 13:33:44 +0200 Subject: [PATCH 21/27] required fields --- .../node-modal/aggregate/aggregateContext.tsx | 7 +- .../aggregate/aggregatorFieldsStack.tsx | 65 ++++++++++++++----- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx index d597dc4856b..18b2d83a40d 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregateContext.tsx @@ -41,10 +41,9 @@ export const AggregateContextProvider = ({ children, node, setProperty, errors } const onAggChange = useCallback( (values: AggregateValue[]) => { setAggValues(values); - const aggregator = Object.fromEntries(values.map(({ name, agg }) => (name && agg ? [name, agg] : null)).filter(Boolean)); - const aggregateBy = Object.fromEntries( - values.map(({ name, expression }) => (name && expression ? [name, expression] : null)).filter(Boolean), - ); + const validValues = values.filter(({ name, agg, expression }) => name && agg && expression); + const aggregator = Object.fromEntries(validValues.map(({ name, agg }) => [name, agg])); + const aggregateBy = Object.fromEntries(validValues.map(({ name, expression }) => [name, expression])); setProperty(aggregatorPath, serializeAggregate("aggregator", aggregator)); setProperty(aggregateByPath, serializeAggregate("aggregateBy", aggregateBy)); }, diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx index ed44c4bcf9f..2f46667441b 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx @@ -32,6 +32,16 @@ const PRESETS = [ }, ]; +function applyPreset(value: string) { + return PRESETS.find((p) => p.value === value) || { agg: value }; +} + +// use existing method to display only red border without any message +const EMPTY_REQUIRED_ERROR: FieldError = { + message: "", + description: "", +}; + export function AggregatorFieldsStack({ value: { agg, name, uuid, expression }, onChange, @@ -49,6 +59,35 @@ export function AggregatorFieldsStack({ return [...values, ...PRESETS]; }, [aggregators]); + const onChangeName = useCallback( + ({ target }: ChangeEvent) => { + onChange(uuid, { name: target.value.replaceAll(/["]/g, "") }); + }, + [onChange, uuid], + ); + + const onChangeType = useCallback( + (value: string) => { + onChange(uuid, applyPreset(value)); + }, + [onChange, uuid], + ); + + const expressionObj: ExpressionObj = useMemo( + () => ({ + expression, + language: ExpressionLang.SpEL, + }), + [expression], + ); + + const onChangeExpression = useCallback( + (value: string) => { + onChange(uuid, { expression: value }); + }, + [onChange, uuid], + ); + return ( <> { - onChange(uuid, { name: e.target.value.replaceAll(/["]/g, "") }); - }} + onChange={onChangeName} value={name} disabled={readOnly} + showValidation + fieldErrors={name ? [] : [EMPTY_REQUIRED_ERROR]} + autoFocus={!name} /> { - const preset = PRESETS.find((p) => p.value === value); - if (preset) { - return onChange(uuid, preset); - } - onChange(uuid, { agg: value }); - }} + onChange={onChangeType} value={options.find(({ value }) => value === agg)} options={options} readOnly={readOnly} @@ -81,14 +115,11 @@ export function AggregatorFieldsStack({ { - onChange(uuid, { expression: value }); - }} + expressionObj={expressionObj} + onValueChange={onChangeExpression} readOnly={readOnly} + showValidation + fieldErrors={expression ? [] : [EMPTY_REQUIRED_ERROR]} /> From ce7d43adce1d8b51f64672202f7ae02b8b0fa51d Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Thu, 3 Oct 2024 19:09:35 +0200 Subject: [PATCH 22/27] presets fixed --- .../node-modal/aggregate/aggregatorField.tsx | 55 ++++++------- .../aggregate/aggregatorFieldsStack.tsx | 80 +++++++++++++------ .../aggregate/useAggParamsSerializer.tsx | 2 - 3 files changed, 84 insertions(+), 53 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx index 6f9b0da841c..55060ee0e22 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx @@ -41,19 +41,15 @@ export function AggregatorField({ parameterDefinitions, node, isEditMode, showVa const { values, onChange, isMarked, fieldErrors = [] } = aggregator; const [data, dataControls] = useArrayState(() => values); - const onAdd = useCallback( - (value?: Partial) => { - dataControls.push( - appendUuid({ - name: "", - agg: aggregators[0].expression, - expression: "", - ...value, - }), - ); - }, - [aggregators, dataControls], - ); + const onAdd = useCallback(() => { + dataControls.push( + appendUuid({ + name: "", + agg: aggregators[0].expression, + expression: "", + }), + ); + }, [aggregators, dataControls]); const onRemove = useCallback( (_: string, uuid: string) => { @@ -82,23 +78,28 @@ export function AggregatorField({ parameterDefinitions, node, isEditMode, showVa const [hovered, setHovered] = useState(null); const outputVariableName = useMemo(() => get(node, "outputVar"), [node]); + const getFieldsRow = useCallback( + (item: WithUuid, index: number) => ( + + + + ), + [aggregators, hovered, onChangeItem, outputVariableName, variableTypes], + ); + const items = useMemo(() => { return data.map((item, index) => ({ item, - el: ( - - - - ), + el: getFieldsRow(item, index), })); - }, [data, onChangeItem, aggregators, variableTypes, hovered, outputVariableName]); + }, [data, getFieldsRow]); useEffect(() => { onChange?.(data); @@ -109,7 +110,7 @@ export function AggregatorField({ parameterDefinitions, node, isEditMode, showVa path={null} label="Aggregations" onFieldRemove={data.length > 1 && onRemove} - onFieldAdd={() => onAdd()} + onFieldAdd={onAdd} readOnly={!isEditMode} errors={errors} > diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx index 2f46667441b..5e1392bfe00 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx @@ -23,18 +23,25 @@ type AggregatorFieldsStackProps = { outputVariableName?: string; }; -const PRESETS = [ +type Preset = { + label: string; + agg: string; + expression: string; +}; + +const PRESETS: Preset[] = [ { - label: "(Count)", - value: "@COUNT", + label: "Count", agg: "#AGG.sum", expression: "1", }, ]; -function applyPreset(value: string) { - return PRESETS.find((p) => p.value === value) || { agg: value }; -} +type TypeOption = { + value: string; + label: string; + preset?: Preset; +}; // use existing method to display only red border without any message const EMPTY_REQUIRED_ERROR: FieldError = { @@ -51,12 +58,18 @@ export function AggregatorFieldsStack({ outputVariableName, }: AggregatorFieldsStackProps) { const { readOnly } = useFieldsContext(); - const options = useMemo<{ value: string; label: string; expression?: string }[]>(() => { + const options = useMemo(() => { const values = aggregators.map(({ expression: value, label }) => ({ value, label, })); - return [...values, ...PRESETS]; + const presets = PRESETS.map((preset) => ({ + value: preset.label, + label: preset.label, + preset, + })); + + return [...values, ...presets]; }, [aggregators]); const onChangeName = useCallback( @@ -66,11 +79,31 @@ export function AggregatorFieldsStack({ [onChange, uuid], ); + const selectedType = useMemo(() => { + return ( + options.find(({ preset }) => preset && preset.agg === agg && preset.expression === expression) || + options.find(({ value }) => value === agg) + ); + }, [options, agg, expression]); + const onChangeType = useCallback( (value: string) => { - onChange(uuid, applyPreset(value)); + const option = options.find((o) => o.value === value); + if (option.preset) { + return onChange(uuid, { + agg: option.preset.agg, + expression: option.preset.expression, + }); + } + if (selectedType.preset) { + return onChange(uuid, { + agg: option.value, + expression: "", + }); + } + return onChange(uuid, { agg: value }); }, - [onChange, uuid], + [onChange, options, selectedType.preset, uuid], ); const expressionObj: ExpressionObj = useMemo( @@ -105,22 +138,21 @@ export function AggregatorFieldsStack({ /> - value === agg)} - options={options} - readOnly={readOnly} - /> + - + {selectedType.preset ? ( + + ) : ( + + )} ); diff --git a/designer/client/src/components/graph/node-modal/aggregate/useAggParamsSerializer.tsx b/designer/client/src/components/graph/node-modal/aggregate/useAggParamsSerializer.tsx index e9b72827524..3a154e7b7aa 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/useAggParamsSerializer.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/useAggParamsSerializer.tsx @@ -26,8 +26,6 @@ export function useAggParamsSerializer(): [ const keyLength = entries.reduce((value, [key]) => Math.max(value, key.length), 0); const content = entries.map(([key, value]) => ` ${padStart(key, keyLength, " ")}: ${value}`).join(",\n"); - if (!content) return ""; - switch (paramName) { case "aggregator": return `#AGG.map({\n${content}\n})`; From 17c64fe2081225b71263a2b1dda6836459f8aec4 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Thu, 3 Oct 2024 20:11:35 +0200 Subject: [PATCH 23/27] sort type options --- .../graph/node-modal/aggregate/aggregatorFieldsStack.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx index 5e1392bfe00..23f4ab22abb 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorFieldsStack.tsx @@ -1,3 +1,4 @@ +import { sortBy } from "lodash"; import React, { ChangeEvent, useCallback, useMemo } from "react"; import { VariableTypes } from "../../../../types"; import { EditableEditor } from "../editors/EditableEditor"; @@ -69,7 +70,7 @@ export function AggregatorFieldsStack({ preset, })); - return [...values, ...presets]; + return sortBy([...values, ...presets], "label"); }, [aggregators]); const onChangeName = useCallback( From f6365508a49408da842493e4ed8aa8b386e67e15 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Mon, 28 Oct 2024 12:39:45 +0100 Subject: [PATCH 24/27] review fixes --- .../node-modal/aggregate/aggregatorField.tsx | 2 +- designer/client/src/http/HttpService.ts | 16 +++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx index 55060ee0e22..d8dcd824d44 100644 --- a/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx +++ b/designer/client/src/components/graph/node-modal/aggregate/aggregatorField.tsx @@ -87,7 +87,7 @@ export function AggregatorField({ parameterDefinitions, node, isEditMode, showVa aggregators={aggregators} variableTypes={variableTypes} hovered={hovered === 0} - // outputVariableName={outputVariableName} + outputVariableName={outputVariableName} /> ), diff --git a/designer/client/src/http/HttpService.ts b/designer/client/src/http/HttpService.ts index fe5abe88cd5..95135c5f126 100644 --- a/designer/client/src/http/HttpService.ts +++ b/designer/client/src/http/HttpService.ts @@ -22,21 +22,15 @@ import { Scenario, StatusDefinitionType, } from "../components/Process/types"; +import { ActivitiesResponse, ActivityMetadataResponse } from "../components/toolbars/activities/types"; import { ToolbarsConfig } from "../components/toolbarSettings/types"; -import { fixAggregateParameters, fixBranchParametersTemplate } from "./parametersUtils"; +import { EventTrackingSelectorType, EventTrackingType } from "../containers/event-tracking"; +import { BackendNotification } from "../containers/Notifications"; +import { ProcessCounts } from "../reducers/graph"; import { AuthenticationSettings } from "../reducers/settings"; import { Expression, NodeType, ProcessAdditionalFields, ProcessDefinitionData, ScenarioGraph, VariableTypes } from "../types"; import { Instant, WithId } from "../types/common"; -import { BackendNotification } from "../containers/Notifications"; -import { ProcessCounts } from "../reducers/graph"; -import { TestResults } from "../common/TestResultUtils"; -import { AdditionalInfo } from "../components/graph/node-modal/NodeAdditionalInfoBox"; -import { withoutHackOfEmptyEdges } from "../components/graph/GraphPartialsInTS/EdgeUtils"; -import { CaretPosition2d, ExpressionSuggestion } from "../components/graph/node-modal/editors/expression/ExpressionSuggester"; -import { GenericValidationRequest, TestAdhocValidationRequest } from "../actions/nk/adhocTesting"; -import { EventTrackingSelectorType, EventTrackingType } from "../containers/event-tracking"; -import { AvailableScenarioLabels, ScenarioLabelsValidationResponse } from "../components/Labels/types"; -import { ActivitiesResponse, ActivityMetadataResponse } from "../components/toolbars/activities/types"; +import { fixAggregateParameters, fixBranchParametersTemplate } from "./parametersUtils"; type HealthCheckProcessDeploymentType = { status: string; From 4d1d0c34ff767a0d5bff70d64f7c70271af51bb1 Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 29 Oct 2024 00:45:05 +0100 Subject: [PATCH 25/27] test fixes --- designer/client/cypress/e2e/jsonEditor.cy.ts | 2 +- designer/client/src/containers/event-tracking/helpers.ts | 3 ++- designer/client/src/containers/theme/nuTheme.tsx | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/designer/client/cypress/e2e/jsonEditor.cy.ts b/designer/client/cypress/e2e/jsonEditor.cy.ts index c3a2ebb9067..27abbafd147 100644 --- a/designer/client/cypress/e2e/jsonEditor.cy.ts +++ b/designer/client/cypress/e2e/jsonEditor.cy.ts @@ -15,7 +15,7 @@ describe("JSON editor", () => { .should("be.enabled") .click(); cy.get("[data-testid=window]").as("modal"); - cy.get("[title='Input schema']").next().find(".ace_editor").should("be.visible").as("editor"); + cy.get("[title='Input schema']").next().find(".ace_editor").should("be.visible").parent().as("editor"); cy.get("@editor").matchImage({ maxDiffThreshold: 0.0025, diff --git a/designer/client/src/containers/event-tracking/helpers.ts b/designer/client/src/containers/event-tracking/helpers.ts index 6f0af9e00e3..8e968a111f6 100644 --- a/designer/client/src/containers/event-tracking/helpers.ts +++ b/designer/client/src/containers/event-tracking/helpers.ts @@ -1,5 +1,6 @@ import { TrackEventParams } from "./use-event-tracking"; -import { BuiltinButtonTypes, CustomButtonTypes } from "../../components/toolbarSettings/buttons"; +import { BuiltinButtonTypes } from "../../components/toolbarSettings/buttons/BuiltinButtonTypes"; +import { CustomButtonTypes } from "../../components/toolbarSettings/buttons/CustomButtonTypes"; import { EventTrackingSelector, EventTrackingSelectorType, EventTrackingType } from "./use-register-tracking-events"; const selectorName = "data-selector"; diff --git a/designer/client/src/containers/theme/nuTheme.tsx b/designer/client/src/containers/theme/nuTheme.tsx index 61e41f43e23..16f375e49fc 100644 --- a/designer/client/src/containers/theme/nuTheme.tsx +++ b/designer/client/src/containers/theme/nuTheme.tsx @@ -4,7 +4,7 @@ import { blendDarken, blendLighten } from "./helpers"; import { deepmerge } from "@mui/utils"; import { lightModePalette } from "./lightModePalette"; import { darkModePalette } from "./darkModePalette"; -import { WindowKind } from "../../windowManager"; +import { WindowKind } from "../../windowManager/WindowKind"; import { EnvironmentTagColor } from "../EnvironmentTag"; import { NodeType } from "../../types"; import NodeUtils from "../../components/graph/NodeUtils"; From 9b056e3784064366a5de97836f256637728d365a Mon Sep 17 00:00:00 2001 From: Julian Wielga Date: Tue, 29 Oct 2024 03:47:53 +0100 Subject: [PATCH 26/27] add cypress test --- .../client/cypress/e2e/aggregations.cy.ts | 30 ++ .../client/cypress/fixtures/aggregations.json | 283 ++++++++++++++++++ 2 files changed, 313 insertions(+) create mode 100644 designer/client/cypress/e2e/aggregations.cy.ts create mode 100644 designer/client/cypress/fixtures/aggregations.json diff --git a/designer/client/cypress/e2e/aggregations.cy.ts b/designer/client/cypress/e2e/aggregations.cy.ts new file mode 100644 index 00000000000..c7190886ca9 --- /dev/null +++ b/designer/client/cypress/e2e/aggregations.cy.ts @@ -0,0 +1,30 @@ +describe("aggregations", () => { + const seed = "aggregations"; + + before(() => { + cy.deleteAllTestProcesses({ + filter: seed, + force: true, + }); + }); + + after(() => { + cy.deleteAllTestProcesses({ filter: seed }); + }); + + ["aggregate-sliding", "aggregate-tumbling", "aggregate-session"].forEach((component) => { + it(`should display updated UI for ${component}`, () => { + cy.visitNewProcess(seed, "aggregations", "Default"); + cy.getNode(component).dblclick(); + cy.get("[data-testid=window]").should("be.visible"); + cy.get("[title='Aggregations']") + .parent() + .should("be.visible") + .matchImage({ + screenshotConfig: { + padding: [80, 10, 10, 10], + }, + }); + }); + }); +}); diff --git a/designer/client/cypress/fixtures/aggregations.json b/designer/client/cypress/fixtures/aggregations.json new file mode 100644 index 00000000000..35edb84cae6 --- /dev/null +++ b/designer/client/cypress/fixtures/aggregations.json @@ -0,0 +1,283 @@ +{ + "metaData": { + "id": "test", + "additionalFields": { + "description": null, + "properties": { + "parallelism": "1", + "spillStateToDisk": "true", + "useAsyncInterpretation": "", + "checkpointIntervalInSeconds": "" + }, + "metaDataType": "StreamMetaData", + "showDescription": false + } + }, + "nodes": [ + { + "id": "periodic", + "ref": { + "typ": "periodic", + "parameters": [ + { + "name": "period", + "expression": { + "language": "spel", + "expression": "T(java.time.Duration).parse('PT1M')" + } + }, + { + "name": "count", + "expression": { + "language": "spel", + "expression": "1" + } + }, + { + "name": "value", + "expression": { + "language": "spel", + "expression": "1" + } + } + ] + }, + "additionalFields": { + "description": null, + "layoutData": { + "x": 360, + "y": 0 + } + }, + "type": "Source" + }, + { + "nexts": [ + [ + { + "id": "aggregate-session", + "outputVar": "outputVar", + "nodeType": "aggregate-session", + "parameters": [ + { + "name": "groupBy", + "expression": { + "language": "spel", + "expression": "{ #input.floatValue }.toString" + } + }, + { + "name": "aggregator", + "expression": { + "language": "spel", + "expression": "#AGG.map({\n count: #AGG.sum\n})" + } + }, + { + "name": "aggregateBy", + "expression": { + "language": "spel", + "expression": "{\n count: 1\n}" + } + }, + { + "name": "endSessionCondition", + "expression": { + "language": "spel", + "expression": "true" + } + }, + { + "name": "sessionTimeout", + "expression": { + "language": "spel", + "expression": "T(java.time.Duration).parse('PT1H')" + } + }, + { + "name": "emitWhen", + "expression": { + "language": "spel", + "expression": "T(pl.touk.nussknacker.engine.flink.util.transformer.aggregate.SessionWindowTrigger).OnEvent" + } + } + ], + "additionalFields": { + "description": null, + "layoutData": { + "x": 720, + "y": 360 + } + }, + "type": "CustomNode" + }, + { + "id": "dead-end", + "ref": { + "typ": "dead-end", + "parameters": [] + }, + "endResult": null, + "isDisabled": null, + "additionalFields": { + "description": null, + "layoutData": { + "x": 720, + "y": 540 + } + }, + "type": "Sink" + } + ], + [ + { + "id": "aggregate-sliding", + "outputVar": "outputVar", + "nodeType": "aggregate-sliding", + "parameters": [ + { + "name": "groupBy", + "expression": { + "language": "spel", + "expression": "{ #input.longValue }.toString" + } + }, + { + "name": "aggregator", + "expression": { + "language": "spel", + "expression": "#AGG.map({\n count: #AGG.sum\n})" + } + }, + { + "name": "aggregateBy", + "expression": { + "language": "spel", + "expression": "{\n count: 1\n}" + } + }, + { + "name": "windowLength", + "expression": { + "language": "spel", + "expression": "T(java.time.Duration).parse('PT1H')" + } + }, + { + "name": "emitWhenEventLeft", + "expression": { + "language": "spel", + "expression": "false" + } + } + ], + "additionalFields": { + "description": null, + "layoutData": { + "x": 0, + "y": 360 + } + }, + "type": "CustomNode" + }, + { + "id": "dead-end 1", + "ref": { + "typ": "dead-end", + "parameters": [] + }, + "endResult": null, + "isDisabled": null, + "additionalFields": { + "description": null, + "layoutData": { + "x": 0, + "y": 540 + } + }, + "type": "Sink" + } + ], + [ + { + "id": "aggregate-tumbling", + "outputVar": "outputVar", + "nodeType": "aggregate-tumbling", + "parameters": [ + { + "name": "groupBy", + "expression": { + "language": "spel", + "expression": "{ #input.longValue }.toString" + } + }, + { + "name": "aggregator", + "expression": { + "language": "spel", + "expression": "#AGG.map({\n count: #AGG.sum\n})" + } + }, + { + "name": "aggregateBy", + "expression": { + "language": "spel", + "expression": "{\n count: 1\n}" + } + }, + { + "name": "windowLength", + "expression": { + "language": "spel", + "expression": "T(java.time.Duration).parse('PT1H')" + } + }, + { + "name": "emitWhen", + "expression": { + "language": "spel", + "expression": "T(pl.touk.nussknacker.engine.flink.util.transformer.aggregate.TumblingWindowTrigger).OnEvent" + } + } + ], + "additionalFields": { + "description": null, + "layoutData": { + "x": 360, + "y": 360 + } + }, + "type": "CustomNode" + }, + { + "id": "dead-end 2", + "ref": { + "typ": "dead-end", + "parameters": [] + }, + "endResult": null, + "isDisabled": null, + "additionalFields": { + "description": null, + "layoutData": { + "x": 360, + "y": 540 + } + }, + "type": "Sink" + } + ] + ], + "id": "split", + "additionalFields": { + "description": null, + "layoutData": { + "x": 360, + "y": 180 + } + }, + "type": "Split" + } + ], + "additionalBranches": [] +} From 2368e2733a928e94ddf2a879ce6f43385d12ca86 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 04:48:02 +0100 Subject: [PATCH 27/27] Updated snapshots (#7100) Co-authored-by: JulianWielga <965924+JulianWielga@users.noreply.github.com> --- ...ditor should display colorfull json #0.png | Bin 6005 -> 6165 bytes ...ditor should display colorfull json #1.png | Bin 11126 -> 12323 bytes ...ay updated UI for aggregate-session #0.png | Bin 0 -> 13890 bytes ...ay updated UI for aggregate-sliding #0.png | Bin 0 -> 13816 bytes ...y updated UI for aggregate-tumbling #0.png | Bin 0 -> 13816 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 designer/client/cypress/e2e/__image_snapshots__/electron/Linux/aggregations should display updated UI for aggregate-session #0.png create mode 100644 designer/client/cypress/e2e/__image_snapshots__/electron/Linux/aggregations should display updated UI for aggregate-sliding #0.png create mode 100644 designer/client/cypress/e2e/__image_snapshots__/electron/Linux/aggregations should display updated UI for aggregate-tumbling #0.png diff --git a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/JSON editor should display colorfull json #0.png b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/JSON editor should display colorfull json #0.png index 1ac7221572bf9a5e2548e6fed705183a4967f326..8a58ac11c8648b6967b663451fc2632ab27a83d0 100644 GIT binary patch literal 6165 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 D9>tBF diff --git a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/JSON editor should display colorfull json #1.png b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/JSON editor should display colorfull json #1.png index a54b2128ec1858ab8df870aa9f50fe619bc444c0..bced673f77545b47d3d534cc056182138956cec0 100644 GIT binary patch literal 12323 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 literal 11126 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 C1xJ(s diff --git a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/aggregations should display updated UI for aggregate-session #0.png b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/aggregations should display updated UI for aggregate-session #0.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c6acec41ec6930e67e0712465df6ecdcbb0701 GIT binary patch literal 13890 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 literal 0 HcmV?d00001 diff --git a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/aggregations should display updated UI for aggregate-tumbling #0.png b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/aggregations should display updated UI for aggregate-tumbling #0.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4c0c118a605568c242134e6b94c4b7073b9cd4 GIT binary patch literal 13816 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 literal 0 HcmV?d00001