@wavemaker/angular-codegen 11.2.0-next.140956 → 11.2.0-next.140958

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.
@@ -37,6 +37,9 @@
37
37
  "@wm/core": [
38
38
  "node_modules/@wavemaker/app-ng-runtime/core"
39
39
  ],
40
+ "@wavemaker/variables": [
41
+ "node_modules/@wavemaker/variables/"
42
+ ],
40
43
  "@wm/components/base": [
41
44
  "node_modules/@wavemaker/app-ng-runtime/components/base"
42
45
  ],
@@ -98938,41 +98938,42 @@ const validateDataSourceCtx$1 = (ds, ctx) => {
98938
98938
  * @param name name of the variable
98939
98939
  * @param context scope of the variable
98940
98940
  */
98941
- const processFilterExpBindNode$1 = (context, filterExpressions) => {
98941
+ const processFilterExpBindNode$1 = (context, filterExpressions, variable) => {
98942
98942
  const destroyFn = context.registerDestroyListener ? context.registerDestroyListener.bind(context) : _.noop;
98943
98943
  const filter$ = new Subject();
98944
98944
  const bindFilExpObj = (obj, targetNodeKey) => {
98945
+ const listener = (newVal, oldVal) => {
98946
+ if ((newVal === oldVal && _.isUndefined(newVal)) || (_.isUndefined(newVal) && !_.isUndefined(oldVal))) {
98947
+ return;
98948
+ }
98949
+ // Skip cloning for blob column
98950
+ if (!_.includes(['blob', 'file'], obj.type)) {
98951
+ newVal = getClonedObject$1(newVal);
98952
+ }
98953
+ // backward compatibility: where we are allowing the user to bind complete object
98954
+ if (obj.target === 'dataBinding') {
98955
+ // remove the existing databinding element
98956
+ filterExpressions.rules = [];
98957
+ // now add all the returned values
98958
+ _.forEach(newVal, function (value, target) {
98959
+ filterExpressions.rules.push({
98960
+ 'target': target,
98961
+ 'value': value,
98962
+ 'matchMode': obj.matchMode || 'startignorecase',
98963
+ 'required': false,
98964
+ 'type': ''
98965
+ });
98966
+ });
98967
+ }
98968
+ else {
98969
+ // setting value to the root node
98970
+ obj[targetNodeKey] = newVal;
98971
+ }
98972
+ filter$.next({ filterExpressions, newVal });
98973
+ };
98945
98974
  if (stringStartsWith$1(obj[targetNodeKey], 'bind:')) {
98946
98975
  // [Todo-CSP]: needs a check, where is this used
98947
- destroyFn($watch$1(obj[targetNodeKey].replace('bind:', ''), context, {}, (newVal, oldVal) => {
98948
- if ((newVal === oldVal && _.isUndefined(newVal)) || (_.isUndefined(newVal) && !_.isUndefined(oldVal))) {
98949
- return;
98950
- }
98951
- // Skip cloning for blob column
98952
- if (!_.includes(['blob', 'file'], obj.type)) {
98953
- newVal = getClonedObject$1(newVal);
98954
- }
98955
- // backward compatibility: where we are allowing the user to bind complete object
98956
- if (obj.target === 'dataBinding') {
98957
- // remove the existing databinding element
98958
- filterExpressions.rules = [];
98959
- // now add all the returned values
98960
- _.forEach(newVal, function (value, target) {
98961
- filterExpressions.rules.push({
98962
- 'target': target,
98963
- 'value': value,
98964
- 'matchMode': obj.matchMode || 'startignorecase',
98965
- 'required': false,
98966
- 'type': ''
98967
- });
98968
- });
98969
- }
98970
- else {
98971
- // setting value to the root node
98972
- obj[targetNodeKey] = newVal;
98973
- }
98974
- filter$.next({ filterExpressions, newVal });
98975
- }, undefined, false, { arrayType: _.includes(['in', 'notin'], obj.matchMode) }));
98976
+ destroyFn($watch$1(obj[targetNodeKey].replace('bind:', ''), context, {}, variable ? variable.invokeOnFiltertExpressionChange.bind(variable, obj, targetNodeKey) : listener, undefined, false, { arrayType: _.includes(['in', 'notin'], obj.matchMode) }));
98976
98977
  }
98977
98978
  };
98978
98979
  const traverseFilterExpressions = expressions => {
@@ -99081,6 +99082,13 @@ const addForIdAttributes$1 = (element) => {
99081
99082
  setAttr$1(labelEl[0], 'for', widgetId);
99082
99083
  }
99083
99084
  }
99085
+ /*Adding aria-labelledby to radioset, checkboxset widgets*/
99086
+ const ulEl = element.querySelectorAll('ul');
99087
+ if (labelEl.length && ulEl.length && (ulEl[0].getAttribute('role') === 'radiogroup' || ulEl[0].getAttribute('role') === 'group')) {
99088
+ const widgetId = 'wm-group-label-' + generateGUId$1();
99089
+ setAttr$1(ulEl[0], 'aria-labelledby', widgetId);
99090
+ setAttr$1(labelEl[0], 'id', widgetId);
99091
+ }
99084
99092
  };
99085
99093
  /**
99086
99094
  * This method is used to adjust the container position
@@ -100473,6 +100481,12 @@ let PaginationService$1 = class PaginationService {
100473
100481
  fetchNextDatasetOnScroll(dataNavigator, parent) {
100474
100482
  // Load next set of data only after the success of current call
100475
100483
  if (!parent.variableInflight) {
100484
+ // Fix for [WMS-23263]: set 'isNextPageData' flag to true & 'isDataUpdatedByUser' to false as next page data is being rendered on Scroll
100485
+ if (parent.widgetType === 'wm-table') {
100486
+ // set isNextPageData flag to true as next page data is being rendered
100487
+ parent.gridOptions.setIsNextPageData(true);
100488
+ parent.gridOptions.setIsDataUpdatedByUser(false);
100489
+ }
100476
100490
  dataNavigator.navigatePage('next');
100477
100491
  }
100478
100492
  }
@@ -125713,41 +125727,42 @@ const validateDataSourceCtx = (ds, ctx) => {
125713
125727
  * @param name name of the variable
125714
125728
  * @param context scope of the variable
125715
125729
  */
125716
- const processFilterExpBindNode = (context, filterExpressions) => {
125730
+ const processFilterExpBindNode = (context, filterExpressions, variable) => {
125717
125731
  const destroyFn = context.registerDestroyListener ? context.registerDestroyListener.bind(context) : _.noop;
125718
125732
  const filter$ = new Subject$1();
125719
125733
  const bindFilExpObj = (obj, targetNodeKey) => {
125734
+ const listener = (newVal, oldVal) => {
125735
+ if ((newVal === oldVal && _.isUndefined(newVal)) || (_.isUndefined(newVal) && !_.isUndefined(oldVal))) {
125736
+ return;
125737
+ }
125738
+ // Skip cloning for blob column
125739
+ if (!_.includes(['blob', 'file'], obj.type)) {
125740
+ newVal = getClonedObject(newVal);
125741
+ }
125742
+ // backward compatibility: where we are allowing the user to bind complete object
125743
+ if (obj.target === 'dataBinding') {
125744
+ // remove the existing databinding element
125745
+ filterExpressions.rules = [];
125746
+ // now add all the returned values
125747
+ _.forEach(newVal, function (value, target) {
125748
+ filterExpressions.rules.push({
125749
+ 'target': target,
125750
+ 'value': value,
125751
+ 'matchMode': obj.matchMode || 'startignorecase',
125752
+ 'required': false,
125753
+ 'type': ''
125754
+ });
125755
+ });
125756
+ }
125757
+ else {
125758
+ // setting value to the root node
125759
+ obj[targetNodeKey] = newVal;
125760
+ }
125761
+ filter$.next({ filterExpressions, newVal });
125762
+ };
125720
125763
  if (stringStartsWith(obj[targetNodeKey], 'bind:')) {
125721
125764
  // [Todo-CSP]: needs a check, where is this used
125722
- destroyFn($watch(obj[targetNodeKey].replace('bind:', ''), context, {}, (newVal, oldVal) => {
125723
- if ((newVal === oldVal && _.isUndefined(newVal)) || (_.isUndefined(newVal) && !_.isUndefined(oldVal))) {
125724
- return;
125725
- }
125726
- // Skip cloning for blob column
125727
- if (!_.includes(['blob', 'file'], obj.type)) {
125728
- newVal = getClonedObject(newVal);
125729
- }
125730
- // backward compatibility: where we are allowing the user to bind complete object
125731
- if (obj.target === 'dataBinding') {
125732
- // remove the existing databinding element
125733
- filterExpressions.rules = [];
125734
- // now add all the returned values
125735
- _.forEach(newVal, function (value, target) {
125736
- filterExpressions.rules.push({
125737
- 'target': target,
125738
- 'value': value,
125739
- 'matchMode': obj.matchMode || 'startignorecase',
125740
- 'required': false,
125741
- 'type': ''
125742
- });
125743
- });
125744
- }
125745
- else {
125746
- // setting value to the root node
125747
- obj[targetNodeKey] = newVal;
125748
- }
125749
- filter$.next({ filterExpressions, newVal });
125750
- }, undefined, false, { arrayType: _.includes(['in', 'notin'], obj.matchMode) }));
125765
+ destroyFn($watch(obj[targetNodeKey].replace('bind:', ''), context, {}, variable ? variable.invokeOnFiltertExpressionChange.bind(variable, obj, targetNodeKey) : listener, undefined, false, { arrayType: _.includes(['in', 'notin'], obj.matchMode) }));
125751
125766
  }
125752
125767
  };
125753
125768
  const traverseFilterExpressions = expressions => {
@@ -125856,6 +125871,13 @@ const addForIdAttributes = (element) => {
125856
125871
  setAttr(labelEl[0], 'for', widgetId);
125857
125872
  }
125858
125873
  }
125874
+ /*Adding aria-labelledby to radioset, checkboxset widgets*/
125875
+ const ulEl = element.querySelectorAll('ul');
125876
+ if (labelEl.length && ulEl.length && (ulEl[0].getAttribute('role') === 'radiogroup' || ulEl[0].getAttribute('role') === 'group')) {
125877
+ const widgetId = 'wm-group-label-' + generateGUId();
125878
+ setAttr(ulEl[0], 'aria-labelledby', widgetId);
125879
+ setAttr(labelEl[0], 'id', widgetId);
125880
+ }
125859
125881
  };
125860
125882
  /**
125861
125883
  * This method is used to adjust the container position
@@ -127264,6 +127286,12 @@ class PaginationService {
127264
127286
  fetchNextDatasetOnScroll(dataNavigator, parent) {
127265
127287
  // Load next set of data only after the success of current call
127266
127288
  if (!parent.variableInflight) {
127289
+ // Fix for [WMS-23263]: set 'isNextPageData' flag to true & 'isDataUpdatedByUser' to false as next page data is being rendered on Scroll
127290
+ if (parent.widgetType === 'wm-table') {
127291
+ // set isNextPageData flag to true as next page data is being rendered
127292
+ parent.gridOptions.setIsNextPageData(true);
127293
+ parent.gridOptions.setIsDataUpdatedByUser(false);
127294
+ }
127267
127295
  dataNavigator.navigatePage('next');
127268
127296
  }
127269
127297
  }
@@ -58685,7 +58685,7 @@ const getFormWidgetTemplate = (widgetType, innerTmpl, attrs, options = {}) => {
58685
58685
  tmpl = `<div wmCheckbox ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''}></div>`;
58686
58686
  break;
58687
58687
  case FormWidgetType.CHECKBOXSET:
58688
- tmpl = `<ul wmCheckboxset ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''}></ul>`;
58688
+ tmpl = `<ul role="group" wmCheckboxset ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''}></ul>`;
58689
58689
  break;
58690
58690
  case FormWidgetType.CHIPS:
58691
58691
  tmpl = `<ul wmChips role="input" debouncetime="${attrs.get('debouncetime')}" ${innerTmpl}></ul>`;
@@ -58709,7 +58709,7 @@ const getFormWidgetTemplate = (widgetType, innerTmpl, attrs, options = {}) => {
58709
58709
  tmpl = `<wm-input ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''} type="password" aria-label="Enter password" ${updateOnTmpl}></wm-input>`;
58710
58710
  break;
58711
58711
  case FormWidgetType.RADIOSET:
58712
- tmpl = `<ul wmRadioset ${innerTmpl}></ul>`;
58712
+ tmpl = `<ul role="radiogroup" wmRadioset ${innerTmpl}></ul>`;
58713
58713
  break;
58714
58714
  case FormWidgetType.RATING:
58715
58715
  tmpl = `<div wmRating ${innerTmpl}></div>`;
@@ -58731,10 +58731,10 @@ const getFormWidgetTemplate = (widgetType, innerTmpl, attrs, options = {}) => {
58731
58731
  break;
58732
58732
  case FormWidgetType.TEXT:
58733
58733
  const inputType = options.inputType || 'inputtype';
58734
- tmpl = `<wm-input ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''} type="${attrs.get(inputType) || 'text'}" aria-describedby="Enter text" ${updateOnTmpl}></wm-input>`;
58734
+ tmpl = `<wm-input ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''} type="${attrs.get(inputType) || 'text'}" ${updateOnTmpl}></wm-input>`;
58735
58735
  break;
58736
58736
  case FormWidgetType.TEXTAREA:
58737
- tmpl = `<wm-textarea ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''} role="textbox" aria-describedby="Place your text" ${updateOnTmpl}></wm-textarea>`;
58737
+ tmpl = `<wm-textarea ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''} role="textbox" ${updateOnTmpl}></wm-textarea>`;
58738
58738
  break;
58739
58739
  case FormWidgetType.TIME:
58740
58740
  tmpl = `<div wmTime ${attrs.get('required') === 'true' ? 'required=true' : ''} dataentrymode="${attrs.get('dataentrymode')}" ${innerTmpl}></div>`;
@@ -58763,7 +58763,7 @@ const getFormWidgetTemplate = (widgetType, innerTmpl, attrs, options = {}) => {
58763
58763
  }
58764
58764
  break;
58765
58765
  default:
58766
- tmpl = `<wm-input ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''} aria-describedby="Enter text" type="text" ${updateOnTmpl}></wm-input>`;
58766
+ tmpl = `<wm-input ${innerTmpl} ${attrs.get('required') === 'true' ? 'required=true' : ''} type="text" ${updateOnTmpl}></wm-input>`;
58767
58767
  break;
58768
58768
  }
58769
58769
  return tmpl;
@@ -60572,41 +60572,42 @@ const validateDataSourceCtx = (ds, ctx) => {
60572
60572
  * @param name name of the variable
60573
60573
  * @param context scope of the variable
60574
60574
  */
60575
- const processFilterExpBindNode = (context, filterExpressions) => {
60575
+ const processFilterExpBindNode = (context, filterExpressions, variable) => {
60576
60576
  const destroyFn = context.registerDestroyListener ? context.registerDestroyListener.bind(context) : _.noop;
60577
60577
  const filter$ = new Subject();
60578
60578
  const bindFilExpObj = (obj, targetNodeKey) => {
60579
+ const listener = (newVal, oldVal) => {
60580
+ if ((newVal === oldVal && _.isUndefined(newVal)) || (_.isUndefined(newVal) && !_.isUndefined(oldVal))) {
60581
+ return;
60582
+ }
60583
+ // Skip cloning for blob column
60584
+ if (!_.includes(['blob', 'file'], obj.type)) {
60585
+ newVal = getClonedObject(newVal);
60586
+ }
60587
+ // backward compatibility: where we are allowing the user to bind complete object
60588
+ if (obj.target === 'dataBinding') {
60589
+ // remove the existing databinding element
60590
+ filterExpressions.rules = [];
60591
+ // now add all the returned values
60592
+ _.forEach(newVal, function (value, target) {
60593
+ filterExpressions.rules.push({
60594
+ 'target': target,
60595
+ 'value': value,
60596
+ 'matchMode': obj.matchMode || 'startignorecase',
60597
+ 'required': false,
60598
+ 'type': ''
60599
+ });
60600
+ });
60601
+ }
60602
+ else {
60603
+ // setting value to the root node
60604
+ obj[targetNodeKey] = newVal;
60605
+ }
60606
+ filter$.next({ filterExpressions, newVal });
60607
+ };
60579
60608
  if (stringStartsWith(obj[targetNodeKey], 'bind:')) {
60580
60609
  // [Todo-CSP]: needs a check, where is this used
60581
- destroyFn($watch(obj[targetNodeKey].replace('bind:', ''), context, {}, (newVal, oldVal) => {
60582
- if ((newVal === oldVal && _.isUndefined(newVal)) || (_.isUndefined(newVal) && !_.isUndefined(oldVal))) {
60583
- return;
60584
- }
60585
- // Skip cloning for blob column
60586
- if (!_.includes(['blob', 'file'], obj.type)) {
60587
- newVal = getClonedObject(newVal);
60588
- }
60589
- // backward compatibility: where we are allowing the user to bind complete object
60590
- if (obj.target === 'dataBinding') {
60591
- // remove the existing databinding element
60592
- filterExpressions.rules = [];
60593
- // now add all the returned values
60594
- _.forEach(newVal, function (value, target) {
60595
- filterExpressions.rules.push({
60596
- 'target': target,
60597
- 'value': value,
60598
- 'matchMode': obj.matchMode || 'startignorecase',
60599
- 'required': false,
60600
- 'type': ''
60601
- });
60602
- });
60603
- }
60604
- else {
60605
- // setting value to the root node
60606
- obj[targetNodeKey] = newVal;
60607
- }
60608
- filter$.next({ filterExpressions, newVal });
60609
- }, undefined, false, { arrayType: _.includes(['in', 'notin'], obj.matchMode) }));
60610
+ destroyFn($watch(obj[targetNodeKey].replace('bind:', ''), context, {}, variable ? variable.invokeOnFiltertExpressionChange.bind(variable, obj, targetNodeKey) : listener, undefined, false, { arrayType: _.includes(['in', 'notin'], obj.matchMode) }));
60610
60611
  }
60611
60612
  };
60612
60613
  const traverseFilterExpressions = expressions => {
@@ -60715,6 +60716,13 @@ const addForIdAttributes = (element) => {
60715
60716
  setAttr(labelEl[0], 'for', widgetId);
60716
60717
  }
60717
60718
  }
60719
+ /*Adding aria-labelledby to radioset, checkboxset widgets*/
60720
+ const ulEl = element.querySelectorAll('ul');
60721
+ if (labelEl.length && ulEl.length && (ulEl[0].getAttribute('role') === 'radiogroup' || ulEl[0].getAttribute('role') === 'group')) {
60722
+ const widgetId = 'wm-group-label-' + generateGUId();
60723
+ setAttr(ulEl[0], 'aria-labelledby', widgetId);
60724
+ setAttr(labelEl[0], 'id', widgetId);
60725
+ }
60718
60726
  };
60719
60727
  /**
60720
60728
  * This method is used to adjust the container position
@@ -62107,6 +62115,12 @@ class PaginationService {
62107
62115
  fetchNextDatasetOnScroll(dataNavigator, parent) {
62108
62116
  // Load next set of data only after the success of current call
62109
62117
  if (!parent.variableInflight) {
62118
+ // Fix for [WMS-23263]: set 'isNextPageData' flag to true & 'isDataUpdatedByUser' to false as next page data is being rendered on Scroll
62119
+ if (parent.widgetType === 'wm-table') {
62120
+ // set isNextPageData flag to true as next page data is being rendered
62121
+ parent.gridOptions.setIsNextPageData(true);
62122
+ parent.gridOptions.setIsDataUpdatedByUser(false);
62123
+ }
62110
62124
  dataNavigator.navigatePage('next');
62111
62125
  }
62112
62126
  }
@@ -62841,13 +62855,13 @@ const scopeComponentStyles = (componentName, componentType, styles = '') => {
62841
62855
 
62842
62856
  const carouselTagName = 'carousel';
62843
62857
  const dataSetKey$5 = 'dataset';
62844
- const idGen$r = new IDGenerator('wm_carousel_ref_');
62858
+ const idGen$s = new IDGenerator('wm_carousel_ref_');
62845
62859
  const isDynamicCarousel = node => node.attrs.find(attr => attr.name === 'type' && attr.value === 'dynamic');
62846
62860
  register('wm-carousel', () => {
62847
62861
  return {
62848
62862
  pre: (attrs, shared) => {
62849
62863
  // generating unique Id for the carousel
62850
- const counter = idGen$r.nextUid();
62864
+ const counter = idGen$s.nextUid();
62851
62865
  shared.set('carousel_ref', counter);
62852
62866
  return `<div class="app-carousel carousel"><${carouselTagName} wmCarousel #${counter}="wmCarousel" ${getAttrMarkup(attrs)} interval="0" [ngClass]="${counter}.navigationClass">`;
62853
62867
  },
@@ -62947,12 +62961,12 @@ var marquee_build$1 = /*#__PURE__*/Object.freeze({
62947
62961
  });
62948
62962
 
62949
62963
  const tagName$1A = 'a';
62950
- const idGen$q = new IDGenerator('wm_anchor');
62964
+ const idGen$r = new IDGenerator('wm_anchor');
62951
62965
  register('wm-anchor', () => {
62952
62966
  return {
62953
62967
  pre: (attrs) => {
62954
- const counter = idGen$q.nextUid();
62955
- return `<${tagName$1A} wmAnchor #${counter}="wmAnchor" role="link" data-identifier="anchor" [attr.aria-label]="${counter}.hint || ${counter}.caption || 'Link'" ${getAttrMarkup(attrs)}>`;
62968
+ const counter = idGen$r.nextUid();
62969
+ return `<${tagName$1A} wmAnchor #${counter}="wmAnchor" role="link" data-identifier="anchor" [attr.aria-label]="${counter}.hint || ${counter}.caption" ${getAttrMarkup(attrs)}>`;
62956
62970
  },
62957
62971
  post: () => `</${tagName$1A}>`
62958
62972
  };
@@ -62979,11 +62993,11 @@ var audio_build$1 = /*#__PURE__*/Object.freeze({
62979
62993
  });
62980
62994
 
62981
62995
  const tagName$1y = 'div';
62982
- const idGen$p = new IDGenerator('wm_html');
62996
+ const idGen$q = new IDGenerator('wm_html');
62983
62997
  register('wm-html', () => {
62984
62998
  return {
62985
62999
  pre: (attrs) => {
62986
- const counter = idGen$p.nextUid();
63000
+ const counter = idGen$q.nextUid();
62987
63001
  return `<${tagName$1y} wmHtml #${counter}="wmHtml" [attr.aria-label]="${counter}.hint || 'HTML content'" ${getAttrMarkup(attrs)}>`;
62988
63002
  },
62989
63003
  post: () => `</${tagName$1y}>`
@@ -63025,12 +63039,12 @@ var iframe_build$1 = /*#__PURE__*/Object.freeze({
63025
63039
  });
63026
63040
 
63027
63041
  const tagName$1v = 'label';
63028
- const idGen$o = new IDGenerator('wm_label');
63042
+ const idGen$p = new IDGenerator('wm_label');
63029
63043
  register('wm-label', () => {
63030
63044
  return {
63031
63045
  pre: (attrs) => {
63032
- const counter = idGen$o.nextUid();
63033
- return `<${tagName$1v} wmLabel #${counter}="wmLabel" [attr.aria-label]="${counter}.hint || 'Label text'" ${getAttrMarkup(attrs)}>`;
63046
+ const counter = idGen$p.nextUid();
63047
+ return `<${tagName$1v} wmLabel #${counter}="wmLabel" [attr.aria-label]="${counter}.hint" ${getAttrMarkup(attrs)}>`;
63034
63048
  },
63035
63049
  post: () => `</${tagName$1v}>`
63036
63050
  };
@@ -63043,11 +63057,11 @@ var label_build$1 = /*#__PURE__*/Object.freeze({
63043
63057
  });
63044
63058
 
63045
63059
  const tagName$1u = 'img';
63046
- const idGen$n = new IDGenerator('wm_picture');
63060
+ const idGen$o = new IDGenerator('wm_picture');
63047
63061
  register('wm-picture', () => {
63048
63062
  return {
63049
63063
  pre: (attrs) => {
63050
- const counter = idGen$n.nextUid();
63064
+ const counter = idGen$o.nextUid();
63051
63065
  return `<${tagName$1u} wmPicture #${counter}="wmPicture" alt="image" wmImageCache="${attrs.get('offline') || 'true'}" [attr.aria-label]="${counter}.hint || 'Image'" ${getAttrMarkup(attrs)}>`;
63052
63066
  }
63053
63067
  };
@@ -63060,11 +63074,11 @@ var picture_build$1 = /*#__PURE__*/Object.freeze({
63060
63074
  });
63061
63075
 
63062
63076
  const tagName$1t = 'div';
63063
- const idGen$m = new IDGenerator('wm_spinner');
63077
+ const idGen$n = new IDGenerator('wm_spinner');
63064
63078
  register('wm-spinner', () => {
63065
63079
  return {
63066
63080
  pre: (attrs) => {
63067
- const counter = idGen$m.nextUid();
63081
+ const counter = idGen$n.nextUid();
63068
63082
  return `<${tagName$1t} wmSpinner #${counter}="wmSpinner" role="alert" [attr.aria-label]="${counter}.hint || 'Loading...'" aria-live="assertive" aria-busy="true" ${getAttrMarkup(attrs)}>`;
63069
63083
  },
63070
63084
  post: () => `</${tagName$1t}>`
@@ -63131,11 +63145,11 @@ var progressCircle_build$1 = /*#__PURE__*/Object.freeze({
63131
63145
  });
63132
63146
 
63133
63147
  const tagName$1q = 'div';
63134
- const idGen$l = new IDGenerator('wm_richtexteditor');
63148
+ const idGen$m = new IDGenerator('wm_richtexteditor');
63135
63149
  register('wm-richtexteditor', () => {
63136
63150
  return {
63137
63151
  pre: (attrs) => {
63138
- const counter = idGen$l.nextUid();
63152
+ const counter = idGen$m.nextUid();
63139
63153
  return `<${tagName$1q} wmRichTextEditor #${counter}="wmRichTextEditor" role="textbox" [attr.aria-label]="${counter}.hint || 'Richtext editor'" ${getFormMarkupAttr(attrs)}>`;
63140
63154
  },
63141
63155
  post: () => `</${tagName$1q}>`
@@ -63248,13 +63262,13 @@ var chart_build$1 = /*#__PURE__*/Object.freeze({
63248
63262
 
63249
63263
  const tagName$1i = 'div';
63250
63264
  const dataSetKey$4 = 'dataset';
63251
- const idGen$k = new IDGenerator('wm_accordion_ref_');
63265
+ const idGen$l = new IDGenerator('wm_accordion_ref_');
63252
63266
  const isDynamicAccordion = node => node.attrs.find(attr => attr.name === 'type' && attr.value === 'dynamic');
63253
63267
  register('wm-accordion', () => {
63254
63268
  return {
63255
63269
  pre: (attrs, shared) => {
63256
63270
  // generating unique Id for the accordion
63257
- const counter = idGen$k.nextUid();
63271
+ const counter = idGen$l.nextUid();
63258
63272
  shared.set('accordion_ref', counter);
63259
63273
  return `<${tagName$1i} wmAccordion #${counter}="wmAccordion" role="tablist" aria-multiselectable="true" ${getAttrMarkup(attrs)}>`;
63260
63274
  },
@@ -63290,9 +63304,13 @@ var accordion_build$1 = /*#__PURE__*/Object.freeze({
63290
63304
  });
63291
63305
 
63292
63306
  const tagName$1h = 'div';
63307
+ const idGen$k = new IDGenerator('wm_accordionpane');
63293
63308
  register('wm-accordionpane', () => {
63294
63309
  return {
63295
- pre: attrs => `<${tagName$1h} wmAccordionPane partialContainer wm-navigable-element="true" role="tab" ${getAttrMarkup(attrs)}>`,
63310
+ pre: (attrs) => {
63311
+ const counter = idGen$k.nextUid();
63312
+ return `<${tagName$1h} #${counter}="wmAccordionPane" [attr.aria-expanded]="${counter}.isActive" wmAccordionPane partialContainer wm-navigable-element="true" role="tab" ${getAttrMarkup(attrs)}>`;
63313
+ },
63296
63314
  post: () => `</${tagName$1h}>`
63297
63315
  };
63298
63316
  });
@@ -63365,7 +63383,7 @@ register('wm-panel', () => {
63365
63383
  return {
63366
63384
  pre: (attrs) => {
63367
63385
  const counter = idGen$j.nextUid();
63368
- return `<${tagName$1c} wmPanel #${counter}="wmPanel" partialContainer [attr.aria-label]="${counter}.hint || 'Panel'" wm-navigable-element="true" ${getAttrMarkup(attrs)}>`;
63386
+ return `<${tagName$1c} wmPanel #${counter}="wmPanel" partialContainer wm-navigable-element="true" ${getAttrMarkup(attrs)}>`;
63369
63387
  },
63370
63388
  post: () => `</${tagName$1c}>`
63371
63389
  };
@@ -63886,12 +63904,14 @@ const registerFormField = (isFormField) => {
63886
63904
  const pCounter = (parent && parent.get('form_reference')) || 'form';
63887
63905
  const widgetType = attrs.get('widget') || FormWidgetType.TEXT;
63888
63906
  const dataRole = isFormField ? 'form-field' : 'filter-field';
63907
+ const formFieldErrorMsgId = 'wmform-field-error-' + generateGUId();
63889
63908
  const validationMsg = isFormField ? `<p *ngIf="${counter}._control?.invalid && ${counter}._control?.touched && ${pCounter}.isUpdateMode"
63890
- class="help-block text-danger" aria-hidden="false" [attr.aria-label]="${counter}.validationmessage" role="alert"
63891
- aria-live="assertive" [textContent]="${counter}.validationmessage"></p>` : '';
63909
+ class="help-block text-danger" aria-hidden="false" role="alert"
63910
+ aria-live="assertive" [attr.aria-label]="${counter}.validationmessage" id="${formFieldErrorMsgId}"><span aria-hidden="true" [textContent]="${counter}.validationmessage"></span></p>` : '';
63892
63911
  const eventsTmpl = widgetType === FormWidgetType.UPLOAD ? '' : getEventsTemplate(attrs);
63893
63912
  const controlLayout = isMobileApp() ? 'col-xs-12' : 'col-sm-12';
63894
63913
  const isInList = pCounter === (parentList && parentList.get('parent_form_reference'));
63914
+ attrs.set('__errormsg', formFieldErrorMsgId);
63895
63915
  attrs.set('__widgetType', widgetType);
63896
63916
  attrs.delete('widget');
63897
63917
  shared.set('counter', counter);
@@ -63908,7 +63928,7 @@ const registerFormField = (isFormField) => {
63908
63928
  [ngStyle]="{width: ${pCounter}.captionsize}" [ngClass]="{'text-danger': ${counter}._control?.invalid && ${counter}._control?.touched && ${pCounter}.isUpdateMode,
63909
63929
  required: ${pCounter}.isUpdateMode && ${counter}.required}" [textContent]="${counter}.displayname"> </label>
63910
63930
  <div [ngClass]="${counter}.displayname ? ${pCounter}._widgetClass : '${controlLayout}'">
63911
- <label class="form-control-static app-label"
63931
+ <label class="form-control-static app-label" *ngIf="!(${pCounter}.isUpdateMode || ${counter}.viewmodewidget === 'default' || ${counter}.widgettype === 'upload')"
63912
63932
  [hidden]="${pCounter}.isUpdateMode || ${counter}.viewmodewidget === 'default' || ${counter}.widgettype === 'upload'" [innerHTML]="${getCaptionByWidget(attrs, widgetType, counter)}"></label>
63913
63933
  ${getTemplate(attrs, widgetType, eventsTmpl, counter, pCounter, isInList)}
63914
63934
  <span aria-hidden="true" *ngIf="${counter}.showPendingSpinner" class="form-field-spinner fa fa-circle-o-notch fa-spin form-control-feedback"></span>
@@ -64179,7 +64199,7 @@ register('wm-button', () => {
64179
64199
  return {
64180
64200
  pre: (attrs) => {
64181
64201
  const counter = idGen$c.nextUid();
64182
- return `<${tagName$P} wmButton #${counter}="wmButton" [attr.aria-label]="${counter}.hint || ${counter}.caption || 'Button'" ${getAttrMarkup(attrs)}>`;
64202
+ return `<${tagName$P} wmButton #${counter}="wmButton" [attr.aria-label]="${counter}.hint || ${counter}.caption" ${getAttrMarkup(attrs)}>`;
64183
64203
  },
64184
64204
  post: () => `</${tagName$P}>`
64185
64205
  };
@@ -64208,7 +64228,7 @@ var checkbox_build$1 = /*#__PURE__*/Object.freeze({
64208
64228
  const tagName$N = 'ul';
64209
64229
  register('wm-checkboxset', () => {
64210
64230
  return {
64211
- pre: attrs => `<${tagName$N} wmCheckboxset ${getFormMarkupAttr(attrs)} ${getChildAttrs(attrs)} ${getNgModelAttr(attrs)}>`,
64231
+ pre: attrs => `<${tagName$N} role="group" wmCheckboxset ${getFormMarkupAttr(attrs)} ${getChildAttrs(attrs)} ${getNgModelAttr(attrs)}>`,
64212
64232
  post: () => `</${tagName$N}>`
64213
64233
  };
64214
64234
  });
@@ -64250,7 +64270,7 @@ var number_build$1 = /*#__PURE__*/Object.freeze({
64250
64270
  const tagName$K = 'ul';
64251
64271
  register('wm-radioset', () => {
64252
64272
  return {
64253
- pre: attrs => `<${tagName$K} wmRadioset ${getFormMarkupAttr(attrs)} ${getChildAttrs(attrs)} ${getNgModelAttr(attrs)}>`,
64273
+ pre: attrs => `<${tagName$K} role="radiogroup" wmRadioset ${getFormMarkupAttr(attrs)} ${getChildAttrs(attrs)} ${getNgModelAttr(attrs)}>`,
64254
64274
  post: () => `</${tagName$K}>`
64255
64275
  };
64256
64276
  });
@@ -64771,7 +64791,7 @@ register('wm-page', () => {
64771
64791
  },
64772
64792
  pre: (attrs) => {
64773
64793
  const counter = idGen$8.nextUid();
64774
- return `<${tagName$p} wmPage #${counter}="wmPage" data-role="pageContainer" [attr.aria-label]="${counter}.hint || 'Main page content'" ${getAttrMarkup(attrs)}>`;
64794
+ return `<${tagName$p} wmPage #${counter}="wmPage" data-role="pageContainer" [attr.aria-label]="${counter}.hint" ${getAttrMarkup(attrs)}>`;
64775
64795
  },
64776
64796
  post: () => `</${tagName$p}>`
64777
64797
  };
@@ -64885,7 +64905,7 @@ register('wm-left-panel', () => {
64885
64905
  return {
64886
64906
  pre: (attrs) => {
64887
64907
  const counter = idGen$4.nextUid();
64888
- return `<${tagName$i} wmLeftPanel #${counter}="wmLeftPanel" partialContainer data-role="page-left-panel" role="navigation" [attr.aria-label]="${counter}.hint || 'Left navigation panel'" wmSmoothscroll="${attrs.get('smoothscroll') || 'false'}" ${getAttrMarkup(attrs)}>`;
64908
+ return `<${tagName$i} wmLeftPanel #${counter}="wmLeftPanel" partialContainer data-role="page-left-panel" [attr.aria-label]="${counter}.hint || 'Left navigation panel'" wmSmoothscroll="${attrs.get('smoothscroll') || 'false'}" ${getAttrMarkup(attrs)}>`;
64889
64909
  },
64890
64910
  post: () => `</${tagName$i}>`
64891
64911
  };
@@ -65393,12 +65413,13 @@ const tagName$5 = 'div';
65393
65413
  const getRowExpansionActionTmpl = (attrs) => {
65394
65414
  const tag = attrs.get('widget-type') === 'anchor' ? 'a' : 'button';
65395
65415
  const directive = attrs.get('widget-type') === 'anchor' ? 'wmAnchor' : 'wmButton';
65416
+ const title = attrs.get('display-name') || attrs.get('title') || 'Collapse/Expand';
65396
65417
  return `<ng-template #rowExpansionActionTmpl let-row="row">
65397
65418
  <${tag} ${directive}
65398
65419
  ${getRowActionAttrs(attrs)}
65399
65420
  class="${attrs.get('class')} row-expansion-button"
65400
65421
  iconclass="${attrs.get('collapseicon')}"
65401
- type="button"></${tag}>
65422
+ type="button" aria-label="${title}"></${tag}>
65402
65423
  </ng-template>`;
65403
65424
  };
65404
65425
  register('wm-table-row', () => {