@aemforms/af-core 0.18.0 → 0.22.1

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/lib/BaseNode.d.ts CHANGED
@@ -53,6 +53,7 @@ export declare abstract class BaseNode<T extends BaseJson> implements BaseModel
53
53
  get ruleEngine(): import("./rules/RuleEngine").default;
54
54
  get label(): import("./types").Label | undefined;
55
55
  set label(l: import("./types").Label | undefined);
56
+ get uniqueItems(): boolean | undefined;
56
57
  /**
57
58
  * Transparent form fields are meant only for creation of view. They are also not part of data
58
59
  */
@@ -70,11 +71,11 @@ export declare abstract class BaseNode<T extends BaseJson> implements BaseModel
70
71
  /**
71
72
  * @private
72
73
  */
73
- addDependent(action: Action): void;
74
+ _addDependent(dependent: BaseModel): void;
74
75
  /**
75
76
  * @private
76
77
  */
77
- removeDependent(action: Action): void;
78
+ removeDependent(dependent: BaseModel): void;
78
79
  abstract validate(): Array<ValidationError>;
79
80
  abstract executeAction(action: Action): any;
80
81
  /**
package/lib/BaseNode.js CHANGED
@@ -185,6 +185,9 @@ class BaseNode {
185
185
  this.notifyDependents(changeAction);
186
186
  }
187
187
  }
188
+ get uniqueItems() {
189
+ return this._jsonModel.uniqueItems;
190
+ }
188
191
  /**
189
192
  * Transparent form fields are meant only for creation of view. They are also not part of data
190
193
  */
@@ -216,8 +219,8 @@ class BaseNode {
216
219
  /**
217
220
  * @private
218
221
  */
219
- addDependent(action) {
220
- if (this._dependents.find(({ node }) => node === action.payload) === undefined) {
222
+ _addDependent(dependent) {
223
+ if (this._dependents.find(({ node }) => node === dependent) === undefined) {
221
224
  const subscription = this.subscribe((change) => {
222
225
  const changes = change.payload.changes;
223
226
  const propsToLook = ['value', 'items'];
@@ -226,17 +229,17 @@ class BaseNode {
226
229
  return propsToLook.indexOf(x.propertyName) > -1;
227
230
  }) > -1;
228
231
  if (isPropChanged) {
229
- action.payload.dispatch(new controller_1.ExecuteRule());
232
+ dependent.dispatch(new controller_1.ExecuteRule());
230
233
  }
231
234
  });
232
- this._dependents.push({ node: action.payload, subscription });
235
+ this._dependents.push({ node: dependent, subscription });
233
236
  }
234
237
  }
235
238
  /**
236
239
  * @private
237
240
  */
238
- removeDependent(action) {
239
- const index = this._dependents.findIndex(({ node }) => node === action.payload);
241
+ removeDependent(dependent) {
242
+ const index = this._dependents.findIndex(({ node }) => node === dependent);
240
243
  if (index > -1) {
241
244
  this._dependents[index].subscription.unsubscribe();
242
245
  this._dependents.splice(index, 1);
package/lib/Checkbox.js CHANGED
@@ -17,7 +17,7 @@ const ValidationUtils_1 = require("./utils/ValidationUtils");
17
17
  * @private
18
18
  */
19
19
  const requiredConstraint = (offValue) => (constraint, value) => {
20
- const valid = ValidationUtils_1.Constraints.required(constraint, value) && (!constraint || value != offValue);
20
+ const valid = ValidationUtils_1.Constraints.required(constraint, value).valid && (!constraint || value != offValue);
21
21
  return { valid, value };
22
22
  };
23
23
  /**
@@ -56,6 +56,7 @@ declare abstract class Container<T extends ContainerJson & RulesJson> extends Sc
56
56
  step?: number | undefined;
57
57
  type?: string | undefined;
58
58
  validationExpression?: string | undefined;
59
+ uniqueItems?: boolean | undefined;
59
60
  dataRef?: string | null | undefined;
60
61
  ':type': string;
61
62
  label?: import("./types").Label | undefined;
@@ -98,6 +99,7 @@ declare abstract class Container<T extends ContainerJson & RulesJson> extends Sc
98
99
  step?: number | undefined;
99
100
  type?: "object" | "array" | undefined;
100
101
  validationExpression?: string | undefined;
102
+ uniqueItems?: boolean | undefined;
101
103
  dataRef?: string | null | undefined;
102
104
  ':type'?: string | undefined;
103
105
  label?: import("./types").Label | undefined;
@@ -133,6 +135,7 @@ declare abstract class Container<T extends ContainerJson & RulesJson> extends Sc
133
135
  step?: number | undefined;
134
136
  type?: string | undefined;
135
137
  validationExpression?: string | undefined;
138
+ uniqueItems?: boolean | undefined;
136
139
  } & {
137
140
  dataRef?: string | null | undefined;
138
141
  ':type'?: string | undefined;
@@ -180,6 +183,7 @@ declare abstract class Container<T extends ContainerJson & RulesJson> extends Sc
180
183
  step?: number | undefined;
181
184
  type?: string | undefined;
182
185
  validationExpression?: string | undefined;
186
+ uniqueItems?: boolean | undefined;
183
187
  } & {
184
188
  dataRef?: string | null | undefined;
185
189
  ':type'?: string | undefined;
@@ -221,6 +225,7 @@ declare abstract class Container<T extends ContainerJson & RulesJson> extends Sc
221
225
  step?: number | undefined;
222
226
  type?: string | undefined;
223
227
  validationExpression?: string | undefined;
228
+ uniqueItems?: boolean | undefined;
224
229
  } & {
225
230
  dataRef?: string | null | undefined;
226
231
  ':type'?: string | undefined;
@@ -268,6 +273,7 @@ declare abstract class Container<T extends ContainerJson & RulesJson> extends Sc
268
273
  step?: number | undefined;
269
274
  type?: string | undefined;
270
275
  validationExpression?: string | undefined;
276
+ uniqueItems?: boolean | undefined;
271
277
  } & {
272
278
  dataRef?: string | null | undefined;
273
279
  ':type'?: string | undefined;
package/lib/Container.js CHANGED
@@ -237,20 +237,15 @@ class Container extends Scriptable_1.default {
237
237
  * @private
238
238
  */
239
239
  dispatch(action) {
240
- var _a;
241
240
  super.dispatch(action);
242
- if ((_a = action.metadata) === null || _a === void 0 ? void 0 : _a.dispatch) {
243
- this.items.forEach(x => {
244
- x.dispatch(action);
245
- });
246
- }
247
241
  }
248
242
  /**
249
243
  * @private
250
244
  */
251
245
  importData(contextualDataModel) {
252
246
  this._bindToDataModel(contextualDataModel);
253
- this.syncDataAndFormModel(this.getDataNode());
247
+ const dataNode = this.getDataNode() || contextualDataModel;
248
+ this.syncDataAndFormModel(dataNode);
254
249
  }
255
250
  /**
256
251
  * prefill the form with data on the given element
package/lib/Field.d.ts CHANGED
@@ -79,12 +79,6 @@ declare class Field extends Scriptable<FieldJson> implements FieldModel {
79
79
  valid: boolean;
80
80
  value: number;
81
81
  };
82
- /**
83
- *
84
- * @param value
85
- * @param constraints
86
- * @private
87
- */
88
82
  maximum: (constraint: number, value: number) => {
89
83
  valid: boolean;
90
84
  value: number;
@@ -110,7 +104,9 @@ declare class Field extends Scriptable<FieldJson> implements FieldModel {
110
104
  value: T_2[];
111
105
  };
112
106
  minLength: (constraint: number, value: string) => {
113
- value: string;
107
+ value: string; /**
108
+ * returns the format constraint
109
+ */
114
110
  valid: boolean;
115
111
  };
116
112
  maxLength: (constraint: number, value: string) => {
package/lib/Field.js CHANGED
@@ -176,19 +176,24 @@ class Field extends Scriptable_1.default {
176
176
  const Constraints = this._getConstraintObject();
177
177
  const typeRes = Constraints.type(this._jsonModel.type || 'string', v);
178
178
  const changes = this._setProperty('value', typeRes.value, false);
179
+ let uniqueRes = { valid: true };
179
180
  if (changes.length > 0) {
180
181
  const dataNode = this.getDataNode();
181
182
  if (typeof dataNode !== 'undefined') {
182
183
  dataNode.setValue(this.isEmpty() ? this.emptyValue : this._jsonModel.value, this._jsonModel.value);
183
184
  }
185
+ if (this.parent.uniqueItems && this.parent.type === 'array') {
186
+ // @ts-ignore
187
+ uniqueRes = Constraints.uniqueItems(this.parent.uniqueItems, this.parent.getDataNode().$value);
188
+ }
184
189
  let updates;
185
- if (typeRes.valid) {
190
+ if (typeRes.valid && uniqueRes.valid) {
186
191
  updates = this.evaluateConstraints();
187
192
  }
188
193
  else {
189
194
  const changes = {
190
- 'valid': typeRes.valid,
191
- 'errorMessage': typeRes.valid ? '' : this.getErrorMessage('type')
195
+ 'valid': typeRes.valid && uniqueRes.valid,
196
+ 'errorMessage': typeRes.valid && uniqueRes.valid ? '' : this.getErrorMessage('type')
192
197
  };
193
198
  updates = this._applyUpdates(['valid', 'errorMessage'], changes);
194
199
  }
@@ -332,7 +337,12 @@ class Field extends Scriptable_1.default {
332
337
  // @ts-ignore
333
338
  const fn = Constraints[key];
334
339
  if (value instanceof Array && this.isArrayType()) {
335
- return value.some(x => !(fn(restriction, x).valid));
340
+ if (ValidationUtils_1.ValidConstraints.array.indexOf(key) !== -1) {
341
+ return !fn(restriction, value).valid;
342
+ }
343
+ else {
344
+ return value.some(x => !(fn(restriction, x).valid));
345
+ }
336
346
  }
337
347
  else if (typeof fn === 'function') {
338
348
  return !fn(restriction, value).valid;
package/lib/Fieldset.d.ts CHANGED
@@ -28,4 +28,5 @@ export declare class Fieldset extends Container<FieldsetJson> implements Fieldse
28
28
  protected _createChild(child: FieldsetJson | FieldJson, options: any): FieldModel | FieldsetModel;
29
29
  get items(): (FieldModel | FieldsetModel)[];
30
30
  get value(): null;
31
+ get fieldType(): string;
31
32
  }
package/lib/Fieldset.js CHANGED
@@ -74,6 +74,9 @@ class Fieldset extends Container_1.default {
74
74
  this._jsonModel[key] = value;
75
75
  }
76
76
  });
77
+ if (this._jsonModel.dataRef && this._jsonModel.type === undefined) {
78
+ this._jsonModel.type = 'object';
79
+ }
77
80
  }
78
81
  get type() {
79
82
  const ret = super.type;
@@ -93,5 +96,8 @@ class Fieldset extends Container_1.default {
93
96
  get value() {
94
97
  return null;
95
98
  }
99
+ get fieldType() {
100
+ return 'panel';
101
+ }
96
102
  }
97
103
  exports.Fieldset = Fieldset;
@@ -33,6 +33,11 @@ declare class FileUpload extends Field implements FieldModel {
33
33
  valid: boolean;
34
34
  value: any;
35
35
  };
36
+ checkFileType(type: any): boolean;
37
+ acceptCheck(value: any): {
38
+ valid: boolean;
39
+ value: any;
40
+ };
36
41
  get value(): any;
37
42
  set value(value: any);
38
43
  private _serialize;
package/lib/FileUpload.js CHANGED
@@ -177,6 +177,32 @@ class FileUpload extends Field_1.default {
177
177
  return ValidationUtils_1.Constraints.type(type, value);
178
178
  }
179
179
  }
180
+ checkFileType(type) {
181
+ let accepts = this.accept || '';
182
+ let validFileType = false;
183
+ if (!accepts || !type) {
184
+ return true;
185
+ }
186
+ accepts = Array.isArray(accepts) ? accepts : accepts.split(',');
187
+ accepts.forEach((accept) => {
188
+ const prefixAccept = accept.split('/')[0];
189
+ const suffixAccept = accept.split('.')[1];
190
+ if ((accept.includes('*') && type.startsWith(prefixAccept)) ||
191
+ (accept.includes('.') && type.endsWith(suffixAccept)) ||
192
+ (accept === type)) {
193
+ validFileType = true;
194
+ }
195
+ });
196
+ return validFileType;
197
+ }
198
+ acceptCheck(value) {
199
+ const tempValue = value instanceof Array ? value : [value];
200
+ const invalidFile = tempValue.some((file) => !this.checkFileType(file.type || file.mediaType));
201
+ return {
202
+ valid: !invalidFile,
203
+ value
204
+ };
205
+ }
180
206
  get value() {
181
207
  // @ts-ignore
182
208
  this.ruleEngine.trackDependency(this);
@@ -219,6 +245,7 @@ class FileUpload extends Field_1.default {
219
245
  if (value !== undefined) {
220
246
  // store file list here
221
247
  const typeRes = this.typeCheck(value);
248
+ const acceptRes = this.acceptCheck(value);
222
249
  const changes = this._setProperty('value', typeRes.value, false);
223
250
  let fileInfoPayload = FileUpload.extractFileInfo(value);
224
251
  fileInfoPayload = this.coerce(fileInfoPayload);
@@ -242,13 +269,13 @@ class FileUpload extends Field_1.default {
242
269
  }
243
270
  }
244
271
  let updates;
245
- if (typeRes.valid) {
272
+ if (typeRes.valid && acceptRes.valid) {
246
273
  updates = this.evaluateConstraints();
247
274
  }
248
275
  else {
249
276
  const changes = {
250
- 'valid': typeRes.valid,
251
- 'errorMessage': typeRes.valid ? '' : this.getErrorMessage('type')
277
+ 'valid': typeRes.valid && acceptRes.valid,
278
+ 'errorMessage': typeRes.valid && acceptRes.valid ? '' : this.getErrorMessage('type')
252
279
  };
253
280
  updates = this._applyUpdates(['valid', 'errorMessage'], changes);
254
281
  }
package/lib/Form.d.ts CHANGED
@@ -70,6 +70,9 @@ declare class Form extends Container<FormJson> implements FormModel {
70
70
  enum?: any[] | undefined;
71
71
  } & {
72
72
  accept?: string[] | undefined;
73
+ /**
74
+ * @private
75
+ */
73
76
  enforceEnum?: boolean | undefined;
74
77
  exclusiveMinimum?: number | undefined;
75
78
  exclusiveMaximum?: number | undefined;
@@ -86,6 +89,7 @@ declare class Form extends Container<FormJson> implements FormModel {
86
89
  step?: number | undefined;
87
90
  type?: string | undefined;
88
91
  validationExpression?: string | undefined;
92
+ uniqueItems?: boolean | undefined;
89
93
  } & {
90
94
  dataRef?: string | null | undefined;
91
95
  ':type'?: string | undefined;
@@ -117,6 +121,9 @@ declare class Form extends Container<FormJson> implements FormModel {
117
121
  enumNames?: string[] | undefined;
118
122
  enum?: any[] | undefined;
119
123
  accept?: string[] | undefined;
124
+ /**
125
+ * @private
126
+ */
120
127
  enforceEnum?: boolean | undefined;
121
128
  exclusiveMinimum?: number | undefined;
122
129
  exclusiveMaximum?: number | undefined;
@@ -133,6 +140,7 @@ declare class Form extends Container<FormJson> implements FormModel {
133
140
  step?: number | undefined;
134
141
  type?: string | undefined;
135
142
  validationExpression?: string | undefined;
143
+ uniqueItems?: boolean | undefined;
136
144
  dataRef?: string | null | undefined;
137
145
  ':type': string;
138
146
  label?: import("./types").Label | undefined;
@@ -159,6 +167,9 @@ declare class Form extends Container<FormJson> implements FormModel {
159
167
  enumNames?: string[] | undefined;
160
168
  enum?: any[] | undefined;
161
169
  accept?: string[] | undefined;
170
+ /**
171
+ * @private
172
+ */
162
173
  enforceEnum?: boolean | undefined;
163
174
  exclusiveMinimum?: number | undefined;
164
175
  exclusiveMaximum?: number | undefined;
@@ -175,6 +186,7 @@ declare class Form extends Container<FormJson> implements FormModel {
175
186
  step?: number | undefined;
176
187
  type?: "object" | "array" | undefined;
177
188
  validationExpression?: string | undefined;
189
+ uniqueItems?: boolean | undefined;
178
190
  dataRef?: string | null | undefined;
179
191
  ':type'?: string | undefined;
180
192
  label?: import("./types").Label | undefined;
@@ -194,6 +206,9 @@ declare class Form extends Container<FormJson> implements FormModel {
194
206
  enum?: any[] | undefined;
195
207
  } & {
196
208
  accept?: string[] | undefined;
209
+ /**
210
+ * @private
211
+ */
197
212
  enforceEnum?: boolean | undefined;
198
213
  exclusiveMinimum?: number | undefined;
199
214
  exclusiveMaximum?: number | undefined;
@@ -210,6 +225,7 @@ declare class Form extends Container<FormJson> implements FormModel {
210
225
  step?: number | undefined;
211
226
  type?: string | undefined;
212
227
  validationExpression?: string | undefined;
228
+ uniqueItems?: boolean | undefined;
213
229
  } & {
214
230
  dataRef?: string | null | undefined;
215
231
  ':type'?: string | undefined;
@@ -241,6 +257,9 @@ declare class Form extends Container<FormJson> implements FormModel {
241
257
  enum?: any[] | undefined;
242
258
  } & {
243
259
  accept?: string[] | undefined;
260
+ /**
261
+ * @private
262
+ */
244
263
  enforceEnum?: boolean | undefined;
245
264
  exclusiveMinimum?: number | undefined;
246
265
  exclusiveMaximum?: number | undefined;
@@ -257,6 +276,7 @@ declare class Form extends Container<FormJson> implements FormModel {
257
276
  step?: number | undefined;
258
277
  type?: string | undefined;
259
278
  validationExpression?: string | undefined;
279
+ uniqueItems?: boolean | undefined;
260
280
  } & {
261
281
  dataRef?: string | null | undefined;
262
282
  ':type'?: string | undefined;
@@ -282,6 +302,9 @@ declare class Form extends Container<FormJson> implements FormModel {
282
302
  enum?: any[] | undefined;
283
303
  } & {
284
304
  accept?: string[] | undefined;
305
+ /**
306
+ * @private
307
+ */
285
308
  enforceEnum?: boolean | undefined;
286
309
  exclusiveMinimum?: number | undefined;
287
310
  exclusiveMaximum?: number | undefined;
@@ -298,6 +321,7 @@ declare class Form extends Container<FormJson> implements FormModel {
298
321
  step?: number | undefined;
299
322
  type?: string | undefined;
300
323
  validationExpression?: string | undefined;
324
+ uniqueItems?: boolean | undefined;
301
325
  } & {
302
326
  dataRef?: string | null | undefined;
303
327
  ':type'?: string | undefined;
@@ -329,6 +353,9 @@ declare class Form extends Container<FormJson> implements FormModel {
329
353
  enum?: any[] | undefined;
330
354
  } & {
331
355
  accept?: string[] | undefined;
356
+ /**
357
+ * @private
358
+ */
332
359
  enforceEnum?: boolean | undefined;
333
360
  exclusiveMinimum?: number | undefined;
334
361
  exclusiveMaximum?: number | undefined;
@@ -345,6 +372,7 @@ declare class Form extends Container<FormJson> implements FormModel {
345
372
  step?: number | undefined;
346
373
  type?: string | undefined;
347
374
  validationExpression?: string | undefined;
375
+ uniqueItems?: boolean | undefined;
348
376
  } & {
349
377
  dataRef?: string | null | undefined;
350
378
  ':type'?: string | undefined;
package/lib/Form.js CHANGED
@@ -79,6 +79,7 @@ class Form extends Container_1.default {
79
79
  this._ids = (0, FormUtils_1.IdGenerator)();
80
80
  this._bindToDataModel(new DataGroup_1.default('$form', {}));
81
81
  this._initialize();
82
+ this.queueEvent(new controller_1.FormLoad());
82
83
  }
83
84
  get logger() {
84
85
  return this._logger;
@@ -14,9 +14,21 @@ export declare const createFormInstance: (formModel: any, callback?: ((f: FormMo
14
14
  * Validates Form model definition with the given data
15
15
  * @param formModel form model definition
16
16
  * @param data form data
17
+ * @deprecated use validateFormData
17
18
  * @returns `true`, if form is valid against the given form data, `false` otherwise
18
19
  */
19
20
  export declare const validateFormInstance: (formModel: any, data: any) => boolean;
21
+ /**
22
+ * Validates Form model definition with the given data
23
+ * @param formModel form model definition
24
+ * @param data form data
25
+ * @deprecated use validateFormData
26
+ * @returns {messages: [], valid: boolean}
27
+ */
28
+ export declare const validateFormData: (formModel: any, data: any) => {
29
+ messages: any[];
30
+ valid: boolean;
31
+ };
20
32
  /**
21
33
  * Helper API to fetch form model definition from an AEM instance
22
34
  * @param url URL of the instance
@@ -33,7 +33,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
33
33
  return (mod && mod.__esModule) ? mod : { "default": mod };
34
34
  };
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.fetchForm = exports.validateFormInstance = exports.createFormInstance = void 0;
36
+ exports.fetchForm = exports.validateFormData = exports.validateFormInstance = exports.createFormInstance = void 0;
37
37
  const Form_1 = __importStar(require("./Form"));
38
38
  const JsonUtils_1 = require("./utils/JsonUtils");
39
39
  const Fetch_1 = require("./utils/Fetch");
@@ -79,6 +79,7 @@ exports.createFormInstance = createFormInstance;
79
79
  * Validates Form model definition with the given data
80
80
  * @param formModel form model definition
81
81
  * @param data form data
82
+ * @deprecated use validateFormData
82
83
  * @returns `true`, if form is valid against the given form data, `false` otherwise
83
84
  */
84
85
  const validateFormInstance = (formModel, data) => {
@@ -94,6 +95,30 @@ const validateFormInstance = (formModel, data) => {
94
95
  }
95
96
  };
96
97
  exports.validateFormInstance = validateFormInstance;
98
+ /**
99
+ * Validates Form model definition with the given data
100
+ * @param formModel form model definition
101
+ * @param data form data
102
+ * @deprecated use validateFormData
103
+ * @returns {messages: [], valid: boolean}
104
+ */
105
+ const validateFormData = (formModel, data) => {
106
+ try {
107
+ const f = new Form_1.default(Object.assign({}, formModel), new RuleEngine_1.default());
108
+ if (data) {
109
+ f.importData(data);
110
+ }
111
+ const res = f.validate();
112
+ return {
113
+ messages: res,
114
+ valid: res.length === 0
115
+ };
116
+ }
117
+ catch (e) {
118
+ throw new Error(e);
119
+ }
120
+ };
121
+ exports.validateFormData = validateFormData;
97
122
  /**
98
123
  * Helper API to fetch form model definition from an AEM instance
99
124
  * @param url URL of the instance
@@ -109,6 +109,15 @@ export declare class Initialize extends ActionImpl {
109
109
  */
110
110
  constructor(payload?: any, dispatch?: boolean);
111
111
  }
112
+ /**
113
+ * Implementation of `load` event. The event is when the form initialization is complete
114
+ */
115
+ export declare class FormLoad extends ActionImpl {
116
+ /**
117
+ * @constructor
118
+ */
119
+ constructor();
120
+ }
112
121
  /**
113
122
  * Implementation of `click` event. The event is triggered when user clicks on an element.
114
123
  */
@@ -7,7 +7,7 @@
7
7
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ADOBE NOR ITS THIRD PARTY PROVIDERS AND PARTNERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.RemoveItem = exports.AddItem = exports.CustomEvent = exports.FieldChanged = exports.Submit = exports.ValidationComplete = exports.Blur = exports.Click = exports.Initialize = exports.propertyChange = exports.ExecuteRule = exports.Valid = exports.Invalid = exports.Change = exports.ActionImpl = void 0;
10
+ exports.RemoveItem = exports.AddItem = exports.CustomEvent = exports.FieldChanged = exports.Submit = exports.ValidationComplete = exports.Blur = exports.Click = exports.FormLoad = exports.Initialize = exports.propertyChange = exports.ExecuteRule = exports.Valid = exports.Invalid = exports.Change = exports.ActionImpl = void 0;
11
11
  /**
12
12
  * Implementation of generic event
13
13
  * @private
@@ -136,6 +136,18 @@ class Initialize extends ActionImpl {
136
136
  }
137
137
  }
138
138
  exports.Initialize = Initialize;
139
+ /**
140
+ * Implementation of `load` event. The event is when the form initialization is complete
141
+ */
142
+ class FormLoad extends ActionImpl {
143
+ /**
144
+ * @constructor
145
+ */
146
+ constructor() {
147
+ super({}, 'load', { dispatch: false });
148
+ }
149
+ }
150
+ exports.FormLoad = FormLoad;
139
151
  /**
140
152
  * Implementation of `click` event. The event is triggered when user clicks on an element.
141
153
  */
@@ -11,6 +11,7 @@ import { Logger } from '../Form';
11
11
  */
12
12
  declare class EventQueue {
13
13
  private logger;
14
+ static readonly MAX_EVENT_CYCLE_COUNT = 10;
14
15
  private _runningEventCount;
15
16
  private _isProcessing;
16
17
  private _pendingEvents;
@@ -66,7 +66,7 @@ class EventQueue {
66
66
  const evntNode = new EventNode(node, e);
67
67
  const counter = this._runningEventCount[evntNode.valueOf()] || 0;
68
68
  const alreadyExists = this.isQueued(node, e);
69
- if (!alreadyExists || counter < 10) {
69
+ if (!alreadyExists || counter < EventQueue.MAX_EVENT_CYCLE_COUNT) {
70
70
  this.logger.info(`Queued event : ${e.type} node: ${node.id} - ${node.name}`);
71
71
  //console.log(`Event Details ${e.toString()}`)
72
72
  if (priority) {
@@ -78,6 +78,9 @@ class EventQueue {
78
78
  }
79
79
  this._runningEventCount[evntNode.valueOf()] = counter + 1;
80
80
  }
81
+ else {
82
+ this.logger.info(`Skipped queueing event : ${e.type} node: ${node.id} - ${node.name} with count=${counter}`);
83
+ }
81
84
  });
82
85
  }
83
86
  runPendingQueue() {
@@ -96,4 +99,5 @@ class EventQueue {
96
99
  this._isProcessing = false;
97
100
  }
98
101
  }
102
+ EventQueue.MAX_EVENT_CYCLE_COUNT = 10;
99
103
  exports.default = EventQueue;
@@ -26,6 +26,14 @@ declare class FunctionRuntimeImpl {
26
26
  _func: (args: unknown, data: unknown, interpreter: any) => any;
27
27
  _signature: never[];
28
28
  };
29
+ exportData: {
30
+ _func: (args: unknown, data: unknown, interpreter: any) => any;
31
+ _signature: never[];
32
+ };
33
+ importData: {
34
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => {};
35
+ _signature: never[];
36
+ };
29
37
  submitForm: {
30
38
  _func: (args: Array<unknown>, data: unknown, interpreter: any) => {};
31
39
  _signature: never[];
@@ -210,10 +210,28 @@ class FunctionRuntimeImpl {
210
210
  },
211
211
  getData: {
212
212
  _func: (args, data, interpreter) => {
213
+ // deprecated. left for backward compatability.
214
+ interpreter.globals.form.logger.warn('The `getData` function is depricated. Use `exportData` instead.');
213
215
  return interpreter.globals.form.exportData();
214
216
  },
215
217
  _signature: []
216
218
  },
219
+ exportData: {
220
+ _func: (args, data, interpreter) => {
221
+ return interpreter.globals.form.exportData();
222
+ },
223
+ _signature: []
224
+ },
225
+ importData: {
226
+ _func: (args, data, interpreter) => {
227
+ const inputData = args[0];
228
+ if (typeof inputData === 'object' && inputData !== null) {
229
+ interpreter.globals.form.importData(inputData);
230
+ }
231
+ return {};
232
+ },
233
+ _signature: []
234
+ },
217
235
  submitForm: {
218
236
  _func: (args, data, interpreter) => {
219
237
  // success: string, error: string, submit_as: 'json' | 'multipart' = 'json', data: any = null
@@ -10,21 +10,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
10
10
  return (mod && mod.__esModule) ? mod : { "default": mod };
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- const Controller_1 = require("../controller/Controller");
14
13
  const json_formula_1 = require("@adobe/json-formula");
15
14
  const FunctionRuntime_1 = __importDefault(require("./FunctionRuntime"));
16
- /**
17
- * Implementation of AddDependant event
18
- * @private
19
- */
20
- class AddDependent extends Controller_1.ActionImpl {
21
- constructor(payload) {
22
- super(payload, 'addDependent');
23
- }
24
- payloadToJson() {
25
- return this.payload.getState();
26
- }
27
- }
28
15
  /**
29
16
  * Implementation of rule engine
30
17
  * @private
@@ -60,7 +47,7 @@ class RuleEngine {
60
47
  */
61
48
  trackDependency(subscriber) {
62
49
  if (this._context && this._context.field !== undefined && this._context.field !== subscriber) {
63
- subscriber.dispatch(new AddDependent(this._context.field));
50
+ subscriber._addDependent(this._context.field);
64
51
  }
65
52
  }
66
53
  }
@@ -37,6 +37,7 @@ export declare type ConstraintsJson = TranslationConstraintsJson & {
37
37
  step?: number;
38
38
  type?: string;
39
39
  validationExpression?: string;
40
+ uniqueItems?: boolean;
40
41
  };
41
42
  /** Type for `constraint messages` based on `adaptive form specification` */
42
43
  export declare type ConstraintsMessages = {
@@ -208,6 +208,10 @@ export interface BaseModel extends ConstraintsJson, WithController {
208
208
  * @private
209
209
  */
210
210
  _initialize(): any;
211
+ /**
212
+ * @private
213
+ */
214
+ _addDependent(dependent: BaseModel): any;
211
215
  }
212
216
  /**
213
217
  * Generic field model interface.
@@ -22,7 +22,7 @@ export declare const addTranslationId: (input: formElementJson, additionalTransl
22
22
  * @param key key to return from input object (key could be comma separated, example, label.value)
23
23
  * @param defaultValue default value
24
24
  */
25
- export declare const getOrElse: (input: any, key: string, defaultValue?: any) => any;
25
+ export declare const getOrElse: (input: any, key: string | string[], defaultValue?: any) => any;
26
26
  /**
27
27
  * @param input
28
28
  * @param additionalTranslationProps
@@ -131,7 +131,7 @@ const getOrElse = (input, key, defaultValue = null) => {
131
131
  if (!key) {
132
132
  return defaultValue;
133
133
  }
134
- const arr = key.split('.');
134
+ const arr = Array.isArray(key) ? key : key.split('.');
135
135
  let objValue = input, index = 0;
136
136
  while (index < arr.length && objValue.hasOwnProperty(arr[index])) {
137
137
  objValue = objValue[arr[index]];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aemforms/af-core",
3
- "version": "0.18.0",
3
+ "version": "0.22.1",
4
4
  "description": "Core Module for Forms Runtime",
5
5
  "author": "Adobe Systems",
6
6
  "license": "Adobe Proprietary",