@wavemaker/angular-codegen 11.2.0-next.140957 → 11.2.0-next.140960

Sign up to get free protection for your applications and to get access to all the features.
@@ -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', () => {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wavemaker/angular-codegen",
3
- "version": "11.2.0-next.140957",
3
+ "version": "11.2.0-next.140960",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {