@aemforms/af-core 0.22.126 → 0.22.128

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.
@@ -1673,6 +1673,13 @@ class BaseNode {
1673
1673
  }
1674
1674
  return nonTransparentParent;
1675
1675
  }
1676
+ _isAncestorRepeatable() {
1677
+ let parent = this.parent;
1678
+ while (parent && !parent.repeatable) {
1679
+ parent = parent.parent;
1680
+ }
1681
+ return Boolean(parent);
1682
+ }
1676
1683
  _initialize(mode) {
1677
1684
  if (typeof this._data === 'undefined') {
1678
1685
  let dataNode, parent = this.parent;
@@ -1701,13 +1708,17 @@ class BaseNode {
1701
1708
  return this[qualifiedName];
1702
1709
  }
1703
1710
  const parent = this.getNonTransparentParent();
1711
+ let qn;
1704
1712
  if (parent && parent.type === 'array') {
1705
- this[qualifiedName] = `${parent.qualifiedName}[${this.index}]`;
1713
+ qn = `${parent.qualifiedName}[${this.index}]`;
1706
1714
  }
1707
1715
  else {
1708
- this[qualifiedName] = `${parent.qualifiedName}.${this.name}`;
1716
+ qn = `${parent.qualifiedName}.${this.name}`;
1717
+ }
1718
+ if (!this._isAncestorRepeatable()) {
1719
+ this[qualifiedName] = qn;
1709
1720
  }
1710
- return this[qualifiedName];
1721
+ return qn;
1711
1722
  }
1712
1723
  focus() {
1713
1724
  if (this.parent) {
@@ -3234,7 +3245,7 @@ class FunctionRuntimeImpl {
3234
3245
  addInstance: {
3235
3246
  _func: (args, data, interpreter) => {
3236
3247
  const element = args[0];
3237
- const payload = args.length > 2 ? valueOf(args[2]) : undefined;
3248
+ const payload = args.length > 1 ? valueOf(args[1]) : undefined;
3238
3249
  try {
3239
3250
  const formElement = interpreter.globals.form.getElement(element.$id);
3240
3251
  const action = createAction('addInstance', payload);
@@ -3249,7 +3260,7 @@ class FunctionRuntimeImpl {
3249
3260
  removeInstance: {
3250
3261
  _func: (args, data, interpreter) => {
3251
3262
  const element = args[0];
3252
- const payload = args.length > 2 ? valueOf(args[2]) : undefined;
3263
+ const payload = args.length > 1 ? valueOf(args[1]) : undefined;
3253
3264
  try {
3254
3265
  const formElement = interpreter.globals.form.getElement(element.$id);
3255
3266
  const action = createAction('removeInstance', payload);
@@ -3318,6 +3329,90 @@ class FunctionRuntimeImpl {
3318
3329
  return encData;
3319
3330
  },
3320
3331
  _signature: []
3332
+ },
3333
+ getQueryParameter: {
3334
+ _func: (args, data, interpreter) => {
3335
+ const param = toString(args[0]);
3336
+ if (!param) {
3337
+ interpreter.globals.form.logger.error('Argument is missing in getQueryParameter. A parameter is expected');
3338
+ return '';
3339
+ }
3340
+ if (interpreter.globals.form?.properties?.queryParams?.[param]) {
3341
+ return interpreter.globals.form.properties.queryParams[param];
3342
+ }
3343
+ try {
3344
+ const urlParams = new URLSearchParams(window?.location?.search || '');
3345
+ return urlParams.get(param);
3346
+ }
3347
+ catch (e) {
3348
+ interpreter.globals.form.logger.warn('Error reading URL parameters:', e);
3349
+ }
3350
+ return '';
3351
+ },
3352
+ _signature: []
3353
+ },
3354
+ getBrowserDetail: {
3355
+ _func: (args, data, interpreter) => {
3356
+ const param = toString(args[0]);
3357
+ if (!param) {
3358
+ interpreter.globals.form.logger.error('Argument is missing in getBrowserDetail. A parameter is expected');
3359
+ return '';
3360
+ }
3361
+ if (interpreter.globals.form?.properties?.browserDetails?.[param]) {
3362
+ return interpreter.globals.form.properties.browserDetails[param];
3363
+ }
3364
+ if (typeof navigator !== 'undefined' && param in navigator) {
3365
+ return navigator[param] || '';
3366
+ }
3367
+ else {
3368
+ interpreter.globals.form.logger.warn(`Invalid or unsupported browser detail requested: "${param}"`);
3369
+ return '';
3370
+ }
3371
+ },
3372
+ _signature: []
3373
+ },
3374
+ getURLDetail: {
3375
+ _func: (args, data, interpreter) => {
3376
+ const param = toString(args[0]);
3377
+ if (!param) {
3378
+ interpreter.globals.form.logger.error('Argument is missing in getURLDetail. A parameter is expected');
3379
+ return '';
3380
+ }
3381
+ if (interpreter.globals.form?.properties?.urlDetails?.[param]) {
3382
+ return interpreter.globals.form.properties.urlDetails[param];
3383
+ }
3384
+ if (typeof window !== 'undefined' && typeof window.location !== 'undefined' && param in window.location) {
3385
+ return window.location[param] || '';
3386
+ }
3387
+ else {
3388
+ interpreter.globals.form.logger.warn(`Invalid or unsupported url parameter requested: "${param}"`);
3389
+ return '';
3390
+ }
3391
+ },
3392
+ _signature: []
3393
+ },
3394
+ getRelativeInstanceIndex: {
3395
+ _func: (args, data, interpreter) => {
3396
+ if (!Array.isArray(args[0]) || args[0].length === 0) {
3397
+ return -1;
3398
+ }
3399
+ const instanceManager = valueOf(args[0])[0].$parent;
3400
+ const field = interpreter.globals.$field;
3401
+ const baseName = instanceManager.$qualifiedName;
3402
+ const qn = field.$qualifiedName;
3403
+ if (qn.startsWith(baseName + '[')) {
3404
+ const startBracket = baseName.length + 1;
3405
+ const endBracket = qn.indexOf(']', startBracket);
3406
+ if (endBracket !== -1) {
3407
+ const idx = Number(qn.slice(startBracket, endBracket));
3408
+ if (!Number.isNaN(idx)) {
3409
+ return idx;
3410
+ }
3411
+ }
3412
+ }
3413
+ return instanceManager.length - 1;
3414
+ },
3415
+ _signature: []
3321
3416
  }
3322
3417
  };
3323
3418
  return { ...defaultFunctions, ...FunctionRuntimeImpl.getInstance().customFunctions };
@@ -3495,11 +3590,23 @@ class Form extends Container {
3495
3590
  captchaInfoObj[field.qualifiedName] = field.value;
3496
3591
  }
3497
3592
  });
3593
+ const additionalMeta = {};
3498
3594
  const draftId = this.properties['fd:draftId'] || '';
3499
3595
  if (draftId) {
3500
- this.setAdditionalSubmitMetadata({
3501
- 'fd:draftId': draftId
3502
- });
3596
+ additionalMeta['fd:draftId'] = draftId;
3597
+ }
3598
+ const dorProps = this.properties['fd:dor'];
3599
+ if (dorProps && dorProps.dorType !== 'none') {
3600
+ const excludeFromDoRIfHidden = dorProps.excludeFromDoRIfHidden;
3601
+ const excludeFromDoR = Object.values(this._fields)
3602
+ .filter(field => field.enabled === false || (excludeFromDoRIfHidden && field.visible === false))
3603
+ .map(field => field.qualifiedName);
3604
+ if (excludeFromDoR && excludeFromDoR.length > 0) {
3605
+ additionalMeta.excludeFromDoR = excludeFromDoR;
3606
+ }
3607
+ }
3608
+ if (Object.keys(additionalMeta).length > 0) {
3609
+ this.setAdditionalSubmitMetadata(additionalMeta);
3503
3610
  }
3504
3611
  const options = {
3505
3612
  lang: this.lang,
@@ -98,6 +98,7 @@ export declare abstract class BaseNode<T extends BaseJson> implements BaseModel
98
98
  abstract defaultDataModel(name: string | number): DataValue | undefined;
99
99
  abstract syncDataAndFormModel(a?: DataValue | DataGroup): any;
100
100
  getNonTransparentParent(): ContainerModel;
101
+ _isAncestorRepeatable(): boolean;
101
102
  _initialize(mode?: FormCreationMode): void;
102
103
  protected _applyUpdates(propNames: string[], updates: any): any;
103
104
  get qualifiedName(): any;
@@ -83,6 +83,22 @@ declare class FunctionRuntimeImpl {
83
83
  _func: (args: Array<unknown>, data: unknown, interpreter: any) => Promise<any>;
84
84
  _signature: never[];
85
85
  };
86
+ getQueryParameter: {
87
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => any;
88
+ _signature: never[];
89
+ };
90
+ getBrowserDetail: {
91
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => any;
92
+ _signature: never[];
93
+ };
94
+ getURLDetail: {
95
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => any;
96
+ _signature: never[];
97
+ };
98
+ getRelativeInstanceIndex: {
99
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => number;
100
+ _signature: never[];
101
+ };
86
102
  };
87
103
  }
88
104
  export declare const FunctionRuntime: FunctionRuntimeImpl;
package/lib/BaseNode.d.ts CHANGED
@@ -98,6 +98,7 @@ export declare abstract class BaseNode<T extends BaseJson> implements BaseModel
98
98
  abstract defaultDataModel(name: string | number): DataValue | undefined;
99
99
  abstract syncDataAndFormModel(a?: DataValue | DataGroup): any;
100
100
  getNonTransparentParent(): ContainerModel;
101
+ _isAncestorRepeatable(): boolean;
101
102
  _initialize(mode?: FormCreationMode): void;
102
103
  protected _applyUpdates(propNames: string[], updates: any): any;
103
104
  get qualifiedName(): any;
package/lib/BaseNode.js CHANGED
@@ -468,6 +468,13 @@ class BaseNode {
468
468
  }
469
469
  return nonTransparentParent;
470
470
  }
471
+ _isAncestorRepeatable() {
472
+ let parent = this.parent;
473
+ while (parent && !parent.repeatable) {
474
+ parent = parent.parent;
475
+ }
476
+ return Boolean(parent);
477
+ }
471
478
  _initialize(mode) {
472
479
  if (typeof this._data === 'undefined') {
473
480
  let dataNode, parent = this.parent;
@@ -496,13 +503,17 @@ class BaseNode {
496
503
  return this[exports.qualifiedName];
497
504
  }
498
505
  const parent = this.getNonTransparentParent();
506
+ let qn;
499
507
  if (parent && parent.type === 'array') {
500
- this[exports.qualifiedName] = `${parent.qualifiedName}[${this.index}]`;
508
+ qn = `${parent.qualifiedName}[${this.index}]`;
501
509
  }
502
510
  else {
503
- this[exports.qualifiedName] = `${parent.qualifiedName}.${this.name}`;
511
+ qn = `${parent.qualifiedName}.${this.name}`;
512
+ }
513
+ if (!this._isAncestorRepeatable()) {
514
+ this[exports.qualifiedName] = qn;
504
515
  }
505
- return this[exports.qualifiedName];
516
+ return qn;
506
517
  }
507
518
  focus() {
508
519
  if (this.parent) {
package/lib/Form.js CHANGED
@@ -156,11 +156,23 @@ class Form extends Container_1.default {
156
156
  captchaInfoObj[field.qualifiedName] = field.value;
157
157
  }
158
158
  });
159
+ const additionalMeta = {};
159
160
  const draftId = this.properties['fd:draftId'] || '';
160
161
  if (draftId) {
161
- this.setAdditionalSubmitMetadata({
162
- 'fd:draftId': draftId
163
- });
162
+ additionalMeta['fd:draftId'] = draftId;
163
+ }
164
+ const dorProps = this.properties['fd:dor'];
165
+ if (dorProps && dorProps.dorType !== 'none') {
166
+ const excludeFromDoRIfHidden = dorProps.excludeFromDoRIfHidden;
167
+ const excludeFromDoR = Object.values(this._fields)
168
+ .filter(field => field.enabled === false || (excludeFromDoRIfHidden && field.visible === false))
169
+ .map(field => field.qualifiedName);
170
+ if (excludeFromDoR && excludeFromDoR.length > 0) {
171
+ additionalMeta.excludeFromDoR = excludeFromDoR;
172
+ }
173
+ }
174
+ if (Object.keys(additionalMeta).length > 0) {
175
+ this.setAdditionalSubmitMetadata(additionalMeta);
164
176
  }
165
177
  const options = Object.assign({ lang: this.lang, captchaInfo: captchaInfoObj }, this.additionalSubmitMetadata);
166
178
  return new SubmitMetaData_1.default(options);
@@ -83,6 +83,22 @@ declare class FunctionRuntimeImpl {
83
83
  _func: (args: Array<unknown>, data: unknown, interpreter: any) => Promise<any>;
84
84
  _signature: never[];
85
85
  };
86
+ getQueryParameter: {
87
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => any;
88
+ _signature: never[];
89
+ };
90
+ getBrowserDetail: {
91
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => any;
92
+ _signature: never[];
93
+ };
94
+ getURLDetail: {
95
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => any;
96
+ _signature: never[];
97
+ };
98
+ getRelativeInstanceIndex: {
99
+ _func: (args: Array<unknown>, data: unknown, interpreter: any) => number;
100
+ _signature: never[];
101
+ };
86
102
  };
87
103
  }
88
104
  export declare const FunctionRuntime: FunctionRuntimeImpl;
@@ -584,7 +584,7 @@ class FunctionRuntimeImpl {
584
584
  addInstance: {
585
585
  _func: (args, data, interpreter) => {
586
586
  const element = args[0];
587
- const payload = args.length > 2 ? valueOf(args[2]) : undefined;
587
+ const payload = args.length > 1 ? valueOf(args[1]) : undefined;
588
588
  try {
589
589
  const formElement = interpreter.globals.form.getElement(element.$id);
590
590
  const action = createAction('addInstance', payload);
@@ -599,7 +599,7 @@ class FunctionRuntimeImpl {
599
599
  removeInstance: {
600
600
  _func: (args, data, interpreter) => {
601
601
  const element = args[0];
602
- const payload = args.length > 2 ? valueOf(args[2]) : undefined;
602
+ const payload = args.length > 1 ? valueOf(args[1]) : undefined;
603
603
  try {
604
604
  const formElement = interpreter.globals.form.getElement(element.$id);
605
605
  const action = createAction('removeInstance', payload);
@@ -668,6 +668,93 @@ class FunctionRuntimeImpl {
668
668
  return encData;
669
669
  }),
670
670
  _signature: []
671
+ },
672
+ getQueryParameter: {
673
+ _func: (args, data, interpreter) => {
674
+ var _a, _b, _c, _d;
675
+ const param = toString(args[0]);
676
+ if (!param) {
677
+ interpreter.globals.form.logger.error('Argument is missing in getQueryParameter. A parameter is expected');
678
+ return '';
679
+ }
680
+ if ((_c = (_b = (_a = interpreter.globals.form) === null || _a === void 0 ? void 0 : _a.properties) === null || _b === void 0 ? void 0 : _b.queryParams) === null || _c === void 0 ? void 0 : _c[param]) {
681
+ return interpreter.globals.form.properties.queryParams[param];
682
+ }
683
+ try {
684
+ const urlParams = new URLSearchParams(((_d = window === null || window === void 0 ? void 0 : window.location) === null || _d === void 0 ? void 0 : _d.search) || '');
685
+ return urlParams.get(param);
686
+ }
687
+ catch (e) {
688
+ interpreter.globals.form.logger.warn('Error reading URL parameters:', e);
689
+ }
690
+ return '';
691
+ },
692
+ _signature: []
693
+ },
694
+ getBrowserDetail: {
695
+ _func: (args, data, interpreter) => {
696
+ var _a, _b, _c;
697
+ const param = toString(args[0]);
698
+ if (!param) {
699
+ interpreter.globals.form.logger.error('Argument is missing in getBrowserDetail. A parameter is expected');
700
+ return '';
701
+ }
702
+ if ((_c = (_b = (_a = interpreter.globals.form) === null || _a === void 0 ? void 0 : _a.properties) === null || _b === void 0 ? void 0 : _b.browserDetails) === null || _c === void 0 ? void 0 : _c[param]) {
703
+ return interpreter.globals.form.properties.browserDetails[param];
704
+ }
705
+ if (typeof navigator !== 'undefined' && param in navigator) {
706
+ return navigator[param] || '';
707
+ }
708
+ else {
709
+ interpreter.globals.form.logger.warn(`Invalid or unsupported browser detail requested: "${param}"`);
710
+ return '';
711
+ }
712
+ },
713
+ _signature: []
714
+ },
715
+ getURLDetail: {
716
+ _func: (args, data, interpreter) => {
717
+ var _a, _b, _c;
718
+ const param = toString(args[0]);
719
+ if (!param) {
720
+ interpreter.globals.form.logger.error('Argument is missing in getURLDetail. A parameter is expected');
721
+ return '';
722
+ }
723
+ if ((_c = (_b = (_a = interpreter.globals.form) === null || _a === void 0 ? void 0 : _a.properties) === null || _b === void 0 ? void 0 : _b.urlDetails) === null || _c === void 0 ? void 0 : _c[param]) {
724
+ return interpreter.globals.form.properties.urlDetails[param];
725
+ }
726
+ if (typeof window !== 'undefined' && typeof window.location !== 'undefined' && param in window.location) {
727
+ return window.location[param] || '';
728
+ }
729
+ else {
730
+ interpreter.globals.form.logger.warn(`Invalid or unsupported url parameter requested: "${param}"`);
731
+ return '';
732
+ }
733
+ },
734
+ _signature: []
735
+ },
736
+ getRelativeInstanceIndex: {
737
+ _func: (args, data, interpreter) => {
738
+ if (!Array.isArray(args[0]) || args[0].length === 0) {
739
+ return -1;
740
+ }
741
+ const instanceManager = valueOf(args[0])[0].$parent;
742
+ const field = interpreter.globals.$field;
743
+ const baseName = instanceManager.$qualifiedName;
744
+ const qn = field.$qualifiedName;
745
+ if (qn.startsWith(baseName + '[')) {
746
+ const startBracket = baseName.length + 1;
747
+ const endBracket = qn.indexOf(']', startBracket);
748
+ if (endBracket !== -1) {
749
+ const idx = Number(qn.slice(startBracket, endBracket));
750
+ if (!Number.isNaN(idx)) {
751
+ return idx;
752
+ }
753
+ }
754
+ }
755
+ return instanceManager.length - 1;
756
+ },
757
+ _signature: []
671
758
  }
672
759
  };
673
760
  return Object.assign(Object.assign({}, defaultFunctions), FunctionRuntimeImpl.getInstance().customFunctions);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aemforms/af-core",
3
- "version": "0.22.126",
3
+ "version": "0.22.128",
4
4
  "description": "Core Module for Forms Runtime",
5
5
  "author": "Adobe Systems",
6
6
  "license": "Adobe Proprietary",
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@adobe/json-formula": "0.1.50",
40
- "@aemforms/af-formatters": "^0.22.126"
40
+ "@aemforms/af-formatters": "^0.22.128"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@babel/preset-env": "^7.20.2",