@flowerforce/flower-core 3.1.2-beta.4 → 3.1.2-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -438,14 +438,13 @@ const FlowerStateUtils = {
438
438
  };
439
439
  const createFormData = (form) => {
440
440
  const validationErrors = form && form.errors;
441
- const customErrors = form && form.customErrors;
442
- const allErrors = { ...(validationErrors || {}), ...(customErrors || {}) };
441
+ const allErrors = Object.values(validationErrors || {});
443
442
  return {
444
443
  touched: form?.touched || false,
445
444
  errors: form?.errors,
446
445
  customErrors: form?.customErrors,
447
446
  isValidating: form?.isValidating,
448
- isValid: allErrors ? Object.values(allErrors).flat().length === 0 : true
447
+ isValid: allErrors.flat().length === 0
449
448
  };
450
449
  };
451
450
 
@@ -620,18 +619,33 @@ const FlowerCoreReducers = {
620
619
  'errors',
621
620
  payload.id
622
621
  ]);
622
+ _unset(state, [
623
+ payload.name,
624
+ 'form',
625
+ payload.currentNode,
626
+ 'customErrors',
627
+ payload.id
628
+ ]);
623
629
  _unset(state, [payload.name, 'form', payload.currentNode, 'isValidating']);
624
630
  },
625
631
  formFieldTouch: (state, { payload }) => {
626
632
  _set(state, [payload.name, 'form', payload.currentNode, 'touches', payload.id], payload.touched);
627
633
  },
634
+ formFieldDirty: (state, { payload }) => {
635
+ _set(state, [payload.name, 'form', payload.currentNode, 'dirty', payload.id], payload.dirty);
636
+ },
628
637
  addData: (state, { payload }) => {
629
638
  const prevData = _get(state, [payload.flowName, 'data']);
630
639
  _set(state, [payload.flowName, 'data'], { ...prevData, ...payload.value });
631
640
  },
632
641
  addDataByPath: (state, { payload }) => {
642
+ const { path: newpath } = getPath(payload.id);
643
+ const currentNode = FlowerStateUtils.makeSelectCurrentNodeId(payload.flowName)(state);
633
644
  if (payload.id && payload.id.length) {
634
- _set(state, [payload.flowName, 'data', ...payload.id], payload.value);
645
+ _set(state, [payload.flowName, 'data', ...newpath], payload.value);
646
+ if (payload?.dirty) {
647
+ _set(state, [payload.flowName, 'form', currentNode, 'dirty', payload.id], payload.dirty);
648
+ }
635
649
  }
636
650
  },
637
651
  // TODO usato al momento solo il devtool
@@ -646,12 +660,14 @@ const FlowerCoreReducers = {
646
660
  _set(state, [payload.name, 'form', payload.currentNode, 'isValidating'], payload.isValidating);
647
661
  },
648
662
  resetForm: (state, { payload }) => {
649
- const touchedFields = _get(state, [payload.flowName, 'form', payload.id, 'touches'], {});
663
+ const touchedFields = _get(state, [payload.flowName, 'form', payload.id, 'errors'], {});
650
664
  Object.keys(touchedFields).forEach((key) => {
651
665
  const { flowNameFromPath = payload.flowName, path } = getPath(key);
652
666
  _unset(state, [flowNameFromPath, 'data', ...path]);
653
667
  });
654
- _unset(state, [payload.flowName, 'form', payload.id]);
668
+ _unset(state, [payload.flowName, 'form', payload.id, 'touches']);
669
+ _unset(state, [payload.flowName, 'form', payload.id, 'dirty']);
670
+ _unset(state, [payload.flowName, 'form', payload.id, 'touched']);
655
671
  },
656
672
  node: (state, { payload }) => {
657
673
  const { name, history } = payload;
@@ -763,6 +779,7 @@ const FlowerCoreStateSelectors = {
763
779
  getDataFromState: (id) => (data) => (id === '*' ? data : _get(data, id)),
764
780
  makeSelectNodeFormTouched: (form) => form && form.touched,
765
781
  makeSelectNodeFormFieldTouched: (id) => (form) => form && form.touches && form.touches[id],
782
+ makeSelectNodeFormFieldDirty: (id) => (form) => form && form.dirty && form.dirty[id],
766
783
  makeSelectCurrentNodeId: (flower, startNodeId) => _get(flower, ['current']) || startNodeId,
767
784
  makeSelectCurrentNodeDisabled: (nodes, current) => !!_get(nodes, [current, 'disabled']),
768
785
  makeSelectPrevNodeRetain: (nodes, history, current) => {
@@ -780,7 +797,9 @@ const FlowerCoreStateSelectors = {
780
797
  if (nodes[prevFlowerNode] && nodes[prevFlowerNode].disabled)
781
798
  return;
782
799
  // eslint-disable-next-line consistent-return
783
- return (nodes[prevFlowerNode] && nodes[prevFlowerNode].retain && prevFlowerNode);
800
+ return nodes[prevFlowerNode] && nodes[prevFlowerNode].retain
801
+ ? prevFlowerNode
802
+ : undefined;
784
803
  },
785
804
  makeSelectNodeErrors: createFormData,
786
805
  makeSelectFieldError: (name, id, validate) => (data, form) => {
package/dist/index.esm.js CHANGED
@@ -436,14 +436,13 @@ const FlowerStateUtils = {
436
436
  };
437
437
  const createFormData = (form) => {
438
438
  const validationErrors = form && form.errors;
439
- const customErrors = form && form.customErrors;
440
- const allErrors = { ...(validationErrors || {}), ...(customErrors || {}) };
439
+ const allErrors = Object.values(validationErrors || {});
441
440
  return {
442
441
  touched: form?.touched || false,
443
442
  errors: form?.errors,
444
443
  customErrors: form?.customErrors,
445
444
  isValidating: form?.isValidating,
446
- isValid: allErrors ? Object.values(allErrors).flat().length === 0 : true
445
+ isValid: allErrors.flat().length === 0
447
446
  };
448
447
  };
449
448
 
@@ -618,18 +617,33 @@ const FlowerCoreReducers = {
618
617
  'errors',
619
618
  payload.id
620
619
  ]);
620
+ _unset(state, [
621
+ payload.name,
622
+ 'form',
623
+ payload.currentNode,
624
+ 'customErrors',
625
+ payload.id
626
+ ]);
621
627
  _unset(state, [payload.name, 'form', payload.currentNode, 'isValidating']);
622
628
  },
623
629
  formFieldTouch: (state, { payload }) => {
624
630
  _set(state, [payload.name, 'form', payload.currentNode, 'touches', payload.id], payload.touched);
625
631
  },
632
+ formFieldDirty: (state, { payload }) => {
633
+ _set(state, [payload.name, 'form', payload.currentNode, 'dirty', payload.id], payload.dirty);
634
+ },
626
635
  addData: (state, { payload }) => {
627
636
  const prevData = _get(state, [payload.flowName, 'data']);
628
637
  _set(state, [payload.flowName, 'data'], { ...prevData, ...payload.value });
629
638
  },
630
639
  addDataByPath: (state, { payload }) => {
640
+ const { path: newpath } = getPath(payload.id);
641
+ const currentNode = FlowerStateUtils.makeSelectCurrentNodeId(payload.flowName)(state);
631
642
  if (payload.id && payload.id.length) {
632
- _set(state, [payload.flowName, 'data', ...payload.id], payload.value);
643
+ _set(state, [payload.flowName, 'data', ...newpath], payload.value);
644
+ if (payload?.dirty) {
645
+ _set(state, [payload.flowName, 'form', currentNode, 'dirty', payload.id], payload.dirty);
646
+ }
633
647
  }
634
648
  },
635
649
  // TODO usato al momento solo il devtool
@@ -644,12 +658,14 @@ const FlowerCoreReducers = {
644
658
  _set(state, [payload.name, 'form', payload.currentNode, 'isValidating'], payload.isValidating);
645
659
  },
646
660
  resetForm: (state, { payload }) => {
647
- const touchedFields = _get(state, [payload.flowName, 'form', payload.id, 'touches'], {});
661
+ const touchedFields = _get(state, [payload.flowName, 'form', payload.id, 'errors'], {});
648
662
  Object.keys(touchedFields).forEach((key) => {
649
663
  const { flowNameFromPath = payload.flowName, path } = getPath(key);
650
664
  _unset(state, [flowNameFromPath, 'data', ...path]);
651
665
  });
652
- _unset(state, [payload.flowName, 'form', payload.id]);
666
+ _unset(state, [payload.flowName, 'form', payload.id, 'touches']);
667
+ _unset(state, [payload.flowName, 'form', payload.id, 'dirty']);
668
+ _unset(state, [payload.flowName, 'form', payload.id, 'touched']);
653
669
  },
654
670
  node: (state, { payload }) => {
655
671
  const { name, history } = payload;
@@ -761,6 +777,7 @@ const FlowerCoreStateSelectors = {
761
777
  getDataFromState: (id) => (data) => (id === '*' ? data : _get(data, id)),
762
778
  makeSelectNodeFormTouched: (form) => form && form.touched,
763
779
  makeSelectNodeFormFieldTouched: (id) => (form) => form && form.touches && form.touches[id],
780
+ makeSelectNodeFormFieldDirty: (id) => (form) => form && form.dirty && form.dirty[id],
764
781
  makeSelectCurrentNodeId: (flower, startNodeId) => _get(flower, ['current']) || startNodeId,
765
782
  makeSelectCurrentNodeDisabled: (nodes, current) => !!_get(nodes, [current, 'disabled']),
766
783
  makeSelectPrevNodeRetain: (nodes, history, current) => {
@@ -778,7 +795,9 @@ const FlowerCoreStateSelectors = {
778
795
  if (nodes[prevFlowerNode] && nodes[prevFlowerNode].disabled)
779
796
  return;
780
797
  // eslint-disable-next-line consistent-return
781
- return (nodes[prevFlowerNode] && nodes[prevFlowerNode].retain && prevFlowerNode);
798
+ return nodes[prevFlowerNode] && nodes[prevFlowerNode].retain
799
+ ? prevFlowerNode
800
+ : undefined;
782
801
  },
783
802
  makeSelectNodeErrors: createFormData,
784
803
  makeSelectFieldError: (name, id, validate) => (data, form) => {
@@ -5,7 +5,7 @@ export type ActionWithPayload<T> = {
5
5
  payload: T;
6
6
  };
7
7
  type ReducerFunctionSign<T extends object, R> = (state: Record<string, Flower<T>>, action: ActionWithPayload<R>) => Record<string, Flower<T>> | void;
8
- export type ActionsTypes = 'historyAdd' | 'historyPrevToNode' | 'setFormTouched' | 'forceAddHistory' | 'historyPop' | 'restoreHistory' | 'replaceNode' | 'initializeFromNode' | 'forceResetHistory' | 'destroy' | 'initNodes' | 'setCurrentNode' | 'formAddErrors' | 'formRemoveErrors' | 'addData' | 'addDataByPath' | 'replaceData' | 'unsetData' | 'setFormIsValidating' | 'resetForm' | 'formFieldTouch' | 'node' | 'prevToNode' | 'next' | 'prev' | 'reset';
8
+ export type ActionsTypes = 'historyAdd' | 'historyPrevToNode' | 'setFormTouched' | 'forceAddHistory' | 'historyPop' | 'restoreHistory' | 'replaceNode' | 'initializeFromNode' | 'forceResetHistory' | 'destroy' | 'initNodes' | 'setCurrentNode' | 'formAddErrors' | 'formRemoveErrors' | 'addData' | 'addDataByPath' | 'replaceData' | 'unsetData' | 'setFormIsValidating' | 'resetForm' | 'formFieldTouch' | 'formFieldDirty' | 'node' | 'prevToNode' | 'next' | 'prev' | 'reset';
9
9
  /**
10
10
  * These functions are Redux reducers used in a Flux architecture for managing state transitions and updates in a Flower application.
11
11
  */
@@ -192,6 +192,20 @@ export type ReducersFunctions<T extends Record<string, any> = Record<string, Flo
192
192
  [x: string]: string[];
193
193
  } | string[];
194
194
  }>;
195
+ /**
196
+ * @param state
197
+ * @param action
198
+ *
199
+ * Set touch form single field
200
+ *
201
+ * @returns state
202
+ */
203
+ formFieldDirty: ReducerFunctionSign<T, {
204
+ name: string;
205
+ currentNode: string;
206
+ id: string;
207
+ dirty?: boolean;
208
+ }>;
195
209
  /**
196
210
  * @param state
197
211
  * @param action
@@ -240,9 +254,10 @@ export type ReducersFunctions<T extends Record<string, any> = Record<string, Flo
240
254
  * @returns state
241
255
  */
242
256
  addDataByPath: ReducerFunctionSign<T, {
243
- id: string[];
257
+ id: string;
244
258
  flowName: string;
245
259
  value: T | string;
260
+ dirty?: boolean;
246
261
  }>;
247
262
  /**
248
263
  * @param state
@@ -51,7 +51,7 @@ export interface ISelectors {
51
51
  * @param current
52
52
  * @returns
53
53
  */
54
- makeSelectPrevNodeRetain<T extends Record<string, any>>(nodes: Flower<T>['nodes'], history: Flower<T>['history'], current: Flower<T>['current']): boolean | string | undefined;
54
+ makeSelectPrevNodeRetain<T extends Record<string, any>>(nodes: Flower<T>['nodes'], history: Flower<T>['history'], current: Flower<T>['current']): string | undefined;
55
55
  /**
56
56
  * @param nodes
57
57
  * @param current
@@ -76,6 +76,11 @@ export interface ISelectors {
76
76
  * @returns
77
77
  */
78
78
  makeSelectNodeFormFieldTouched<T extends Record<string, any>>(id: string): (form: Form<T> | undefined) => boolean | undefined;
79
+ /**
80
+ * @param form
81
+ * @returns
82
+ */
83
+ makeSelectNodeFormFieldDirty<T extends Record<string, any>>(id: string): (form: Form<T> | undefined) => boolean | undefined;
79
84
  /**
80
85
  * @param flower
81
86
  * @returns
@@ -52,6 +52,9 @@ export type Form<T> = {
52
52
  customErrors?: {
53
53
  [K in keyof T]: Array<string>;
54
54
  };
55
+ dirty?: {
56
+ [K in keyof T]: boolean;
57
+ };
55
58
  touches?: {
56
59
  [K in keyof T]: boolean;
57
60
  };
@@ -43,6 +43,7 @@ export interface CoreStateUtils {
43
43
  makeSelectNodeErrors<T extends object>(name: string, currentNodeId: string): (state: T) => {
44
44
  touched: boolean;
45
45
  errors: any;
46
+ customErrors: any;
46
47
  isValid: boolean;
47
48
  isValidating?: boolean;
48
49
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowerforce/flower-core",
3
- "version": "3.1.2-beta.4",
3
+ "version": "3.1.2-beta.5",
4
4
  "description": "Core functions for flowerJS",
5
5
  "repository": {
6
6
  "type": "git",