@syncfusion/ej2-lists 32.2.6 → 32.2.7

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.
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * filename: index.d.ts
3
- * version : 32.2.3
3
+ * version : 32.2.7
4
4
  * Copyright Syncfusion Inc. 2001 - 2025. All rights reserved.
5
5
  * Use of this code is subject to the terms of our license.
6
6
  * A copy of the current license can be obtained at any time by e-mailing
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syncfusion/ej2-lists",
3
- "version": "32.2.6",
3
+ "version": "32.2.7",
4
4
  "description": "The listview control allows you to select an item or multiple items from a list-like interface and represents the data in interactive hierarchical structure across different layouts or views.",
5
5
  "author": "Syncfusion Inc.",
6
6
  "license": "SEE LICENSE IN license",
@@ -9,9 +9,9 @@
9
9
  "es2015": "./dist/es6/ej2-lists.es5.js",
10
10
  "dependencies": {
11
11
  "@syncfusion/ej2-base": "~32.2.6",
12
- "@syncfusion/ej2-buttons": "~32.2.3",
12
+ "@syncfusion/ej2-buttons": "~32.2.7",
13
13
  "@syncfusion/ej2-data": "~32.2.3",
14
- "@syncfusion/ej2-popups": "~32.2.6"
14
+ "@syncfusion/ej2-popups": "~32.2.7"
15
15
  },
16
16
  "devDependencies": {},
17
17
  "keywords": [
@@ -258,6 +258,8 @@ export declare namespace ListBase {
258
258
  * @returns {HTMLElement} - The modified LI element.
259
259
  */
260
260
  function generateIcon(createElement: createElementParams, liElement: HTMLElement, className?: string, options?: ListBaseOptions): HTMLElement;
261
+ function getDomSetter(options: ListBaseOptions): 'textContent' | 'innerHTML';
262
+ function getSanitizedText(text: string, options: ListBaseOptions): string;
261
263
  }
262
264
  export declare type createElementParams = (tag: string, prop?: {
263
265
  id?: string;
@@ -393,8 +395,16 @@ export interface ListBaseOptions {
393
395
  isStringTemplate?: string;
394
396
  /**
395
397
  * Defines whether to allow the cross scripting site or not.
398
+ * **Note:** To correctly remove untrusted HTML values, `disableHtmlEncode` must also be set to true. When `enableHtmlSanitizer` is set to false, `disableHtmlEncode` must also be set to false.
396
399
  */
397
400
  enableHtmlSanitizer?: boolean;
401
+ /**
402
+ * Enables rendering of raw text content without HTML encoding.
403
+ * When set to true, the text will be displayed exactly as provided (including HTML tags or special characters).
404
+ *
405
+ * **Note:** To preserve and render raw HTML content correctly, `enableHtmlSanitizer` must also be set to false.
406
+ */
407
+ disableHtmlEncode?: boolean;
398
408
  /**
399
409
  * If set true to this property then the entire list will be navigate-able instead of text element
400
410
  */
@@ -67,6 +67,7 @@ export var ListBase;
67
67
  showCheckBox: false,
68
68
  showIcon: false,
69
69
  enableHtmlSanitizer: false,
70
+ disableHtmlEncode: false,
70
71
  expandCollapse: false,
71
72
  fields: ListBase.defaultMappedFields,
72
73
  ariaAttributes: defaultAriaAttributes,
@@ -261,14 +262,10 @@ export var ListBase;
261
262
  anchorElement = li.querySelector('.' + cssClass.anchorWrap);
262
263
  if (Object.prototype.hasOwnProperty.call(fieldData, fields.tooltip)) {
263
264
  var tooltipText = fieldData[fields.tooltip];
264
- if (options && options.enableHtmlSanitizer) {
265
- tooltipText = SanitizeHtmlHelper.sanitize(tooltipText);
266
- }
267
- else {
268
- var tooltipTextElement = createElement('span', { innerHTML: tooltipText });
269
- tooltipText = tooltipTextElement.innerText;
270
- tooltipTextElement = null;
271
- }
265
+ tooltipText = getSanitizedText(tooltipText, curOpt);
266
+ var tooltipTextElement = createElement('span', { innerHTML: tooltipText });
267
+ tooltipText = tooltipTextElement.innerText;
268
+ tooltipTextElement = null;
272
269
  li.setAttribute('title', tooltipText);
273
270
  }
274
271
  if (curOpt.itemNavigable && checkboxElement.length) {
@@ -285,14 +282,10 @@ export var ListBase;
285
282
  anchorElement = li.querySelector('.' + cssClass.anchorWrap);
286
283
  if (Object.prototype.hasOwnProperty.call(fieldData, fields.tooltip)) {
287
284
  var tooltipText = fieldData[fields.tooltip];
288
- if (options && options.enableHtmlSanitizer) {
289
- tooltipText = SanitizeHtmlHelper.sanitize(tooltipText);
290
- }
291
- else {
292
- var tooltipTextElement = createElement('span', { innerHTML: tooltipText });
293
- tooltipText = tooltipTextElement.innerText;
294
- tooltipTextElement = null;
295
- }
285
+ tooltipText = getSanitizedText(tooltipText, curOpt);
286
+ var tooltipTextElement = createElement('span', { innerHTML: tooltipText });
287
+ tooltipText = tooltipTextElement.innerText;
288
+ tooltipTextElement = null;
296
289
  li.setAttribute('title', tooltipText);
297
290
  }
298
291
  if (Object.prototype.hasOwnProperty.call(fieldData, fields.htmlAttributes) && fieldData[fields.htmlAttributes]) {
@@ -824,6 +817,7 @@ export var ListBase;
824
817
  fieldData[fields.text] : (fieldData[fields.text] || '');
825
818
  value = fieldData[fields.value];
826
819
  }
820
+ text = getSanitizedText(text, curOpt);
827
821
  var elementID;
828
822
  if (!isNullOrUndefined(dataSource) && !isNullOrUndefined(fieldData[fields.id])
829
823
  && fieldData[fields.id] !== '') {
@@ -840,11 +834,8 @@ export var ListBase;
840
834
  if (dataSource && Object.prototype.hasOwnProperty.call(fieldData, fields.enabled) && fieldData[fields.enabled].toString() === 'false') {
841
835
  li.classList.add(cssClass.disabled);
842
836
  }
843
- if (options && options.enableHtmlSanitizer) {
844
- text = SanitizeHtmlHelper.sanitize(text);
845
- }
846
837
  if (grpLI) {
847
- li.innerText = text;
838
+ li[getDomSetter(curOpt)] = text;
848
839
  }
849
840
  else {
850
841
  li.setAttribute('data-value', isNullOrUndefined(value) ? 'null' : value);
@@ -857,7 +848,7 @@ export var ListBase;
857
848
  }
858
849
  if (dataSource && (fieldData[fields.url] || (fieldData[fields.urlAttributes] &&
859
850
  fieldData[fields.urlAttributes].href))) {
860
- li.appendChild(anchorTag(createElement, dataSource, fields, text, innerElements, curOpt.itemNavigable));
851
+ li.appendChild(anchorTag(createElement, dataSource, fields, text, innerElements, curOpt.itemNavigable, curOpt));
861
852
  }
862
853
  else {
863
854
  if (innerElements.length && curOpt.itemNavigable) {
@@ -908,9 +899,10 @@ export var ListBase;
908
899
  * @param {string} text - The text content of the anchor tag.
909
900
  * @param {HTMLElement[]} innerElements - Optional array of inner elements to append to the anchor tag.
910
901
  * @param {boolean} isFullNavigation - Indicates whether the anchor tag should be for full navigation.
902
+ * @param {ListBaseOptions} [options] - Optional ListBase options.
911
903
  * @returns {HTMLElement} The created anchor tag element.
912
904
  */
913
- function anchorTag(createElement, dataSource, fields, text, innerElements, isFullNavigation) {
905
+ function anchorTag(createElement, dataSource, fields, text, innerElements, isFullNavigation, options) {
914
906
  var fieldData = getFieldValues(dataSource, fields);
915
907
  var attr = { href: fieldData[fields.url] };
916
908
  if (Object.prototype.hasOwnProperty.call(fieldData, fields.urlAttributes) && fieldData[fields.urlAttributes]) {
@@ -919,8 +911,11 @@ export var ListBase;
919
911
  fieldData[fields.urlAttributes].href;
920
912
  }
921
913
  var anchorTag;
914
+ var curOpt = extend({}, defaultListBaseOptions, options);
915
+ var safeText = getSanitizedText(text, curOpt);
922
916
  if (!isFullNavigation) {
923
- anchorTag = createElement('a', { className: cssClass.text + ' ' + cssClass.url, innerHTML: text });
917
+ anchorTag = createElement('a', { className: cssClass.text + ' ' + cssClass.url });
918
+ anchorTag[getDomSetter(curOpt)] = safeText;
924
919
  }
925
920
  else {
926
921
  anchorTag = createElement('a', { className: cssClass.text + ' ' + cssClass.url });
@@ -928,7 +923,7 @@ export var ListBase;
928
923
  if (innerElements && innerElements.length) {
929
924
  append(innerElements, anchorWrapper);
930
925
  }
931
- anchorWrapper.appendChild(document.createTextNode(text));
926
+ anchorWrapper.appendChild(document.createTextNode(safeText));
932
927
  append([anchorWrapper], anchorTag);
933
928
  }
934
929
  setAttribute(anchorTag, attr);
@@ -960,9 +955,7 @@ export var ListBase;
960
955
  grpLI = (Object.prototype.hasOwnProperty.call(item, 'isHeader') && item.isHeader)
961
956
  ? true : false;
962
957
  }
963
- if (options && options.enableHtmlSanitizer) {
964
- text = SanitizeHtmlHelper.sanitize(text);
965
- }
958
+ text = getSanitizedText(text, curOpt);
966
959
  var li = createElement('li', {
967
960
  className: (grpLI === true ? cssClass.group : cssClass.li) + ' ' + (isNullOrUndefined(className) ? '' : className),
968
961
  attrs: (ariaAttributes.groupItemRole !== '' && ariaAttributes.itemRole !== '' ?
@@ -1012,19 +1005,14 @@ export var ListBase;
1012
1005
  });
1013
1006
  if (dataSource && (fieldData[fields.url] || (fieldData[fields.urlAttributes] &&
1014
1007
  fieldData[fields.urlAttributes].href))) {
1015
- innerDiv.appendChild(anchorTag(createElement, dataSource, fields, text, null, curOpt.itemNavigable));
1008
+ innerDiv.appendChild(anchorTag(createElement, dataSource, fields, text, null, curOpt.itemNavigable, curOpt));
1016
1009
  }
1017
1010
  else {
1018
1011
  var element = createElement('span', {
1019
1012
  className: cssClass.text,
1020
1013
  attrs: (ariaAttributes.itemText !== '' ? { role: ariaAttributes.itemText } : {})
1021
1014
  });
1022
- if (options && options.enableHtmlSanitizer) {
1023
- element.innerText = text;
1024
- }
1025
- else {
1026
- element.innerHTML = text;
1027
- }
1015
+ element[getDomSetter(curOpt)] = text;
1028
1016
  innerDiv.appendChild(element);
1029
1017
  }
1030
1018
  li.appendChild(innerDiv);
@@ -1080,6 +1068,14 @@ export var ListBase;
1080
1068
  return liElement;
1081
1069
  }
1082
1070
  ListBase.generateIcon = generateIcon;
1071
+ function getDomSetter(options) {
1072
+ return options.disableHtmlEncode ? 'textContent' : 'innerHTML';
1073
+ }
1074
+ ListBase.getDomSetter = getDomSetter;
1075
+ function getSanitizedText(text, options) {
1076
+ return options.enableHtmlSanitizer ? SanitizeHtmlHelper.sanitize(text) : text;
1077
+ }
1078
+ ListBase.getSanitizedText = getSanitizedText;
1083
1079
  })(ListBase || (ListBase = {}));
1084
1080
  /**
1085
1081
  * Used to get dataSource item from complex data using fields.
@@ -237,10 +237,23 @@ export interface ListViewModel extends ComponentModel{
237
237
  *
238
238
  * {% codeBlock src='listview/enableHtmlSanitizer/index.md' %}{% endcodeBlock %}
239
239
  *
240
+ * **Note:** To correctly remove untrusted HTML values, `disableHtmlEncode` must also be set to true. When `enableHtmlSanitizer` is set to false, `disableHtmlEncode` must also be set to false.
241
+ *
240
242
  * @default true
241
243
  */
242
244
  enableHtmlSanitizer?: boolean;
243
245
 
246
+ /**
247
+ * Enables rendering of raw text content in the ListView component without HTML encoding.
248
+ * When set to true, the text will be displayed exactly as provided (including HTML tags or special characters),
249
+ * instead of being encoded or truncated (e.g., `hiiih<hihi` will be shown as-is).
250
+ *
251
+ * **Note:** To preserve and render raw HTML content correctly, `enableHtmlSanitizer` must also be set to false.
252
+ *
253
+ * @default true
254
+ */
255
+ disableHtmlEncode?: boolean
256
+
244
257
  /**
245
258
  * Defines the height of the ListView component which accepts both string and number values.
246
259
  *
@@ -317,9 +317,21 @@ export declare class ListView extends Component<HTMLElement> implements INotifyP
317
317
  *
318
318
  * {% codeBlock src='listview/enableHtmlSanitizer/index.md' %}{% endcodeBlock %}
319
319
  *
320
+ * **Note:** To correctly remove untrusted HTML values, `disableHtmlEncode` must also be set to true. When `enableHtmlSanitizer` is set to false, `disableHtmlEncode` must also be set to false.
321
+ *
320
322
  * @default true
321
323
  */
322
324
  enableHtmlSanitizer: boolean;
325
+ /**
326
+ * Enables rendering of raw text content in the ListView component without HTML encoding.
327
+ * When set to true, the text will be displayed exactly as provided (including HTML tags or special characters),
328
+ * instead of being encoded or truncated (e.g., `hiiih<hihi` will be shown as-is).
329
+ *
330
+ * **Note:** To preserve and render raw HTML content correctly, `enableHtmlSanitizer` must also be set to false.
331
+ *
332
+ * @default true
333
+ */
334
+ disableHtmlEncode: boolean;
323
335
  /**
324
336
  * Defines the height of the ListView component which accepts both string and number values.
325
337
  *
@@ -302,13 +302,13 @@ var ListView = /** @class */ (function (_super) {
302
302
  if (this.headerEle === undefined && this.showHeader) {
303
303
  this.headerEle = this.createElement('div', { className: classNames.header });
304
304
  var innerHeaderEle = this.createElement('span', { className: classNames.headerText });
305
- if (this.enableHtmlSanitizer) {
306
- this.setProperties({ headerTitle: SanitizeHtmlHelper.sanitize(this.headerTitle) }, true);
307
- innerHeaderEle.innerText = this.headerTitle;
308
- }
309
- else {
310
- innerHeaderEle.innerHTML = this.headerTitle;
305
+ var curOpt = this.listBaseOption || {
306
+ enableHtmlSanitizer: this.enableHtmlSanitizer, disableHtmlEncode: this.disableHtmlEncode
307
+ };
308
+ if (curOpt.enableHtmlSanitizer) {
309
+ this.setProperties({ headerTitle: ListBase.getSanitizedText(this.headerTitle, curOpt) }, true);
311
310
  }
311
+ innerHeaderEle[ListBase.getDomSetter(curOpt)] = ListBase.getSanitizedText(this.headerTitle, curOpt);
312
312
  var textEle = this.createElement('div', { className: classNames.text, innerHTML: innerHeaderEle.outerHTML });
313
313
  var hedBackButton = this.createElement('div', {
314
314
  className: classNames.icon + ' ' + classNames.backIcon + ' ' + classNames.backButton,
@@ -339,10 +339,10 @@ var ListView = /** @class */ (function (_super) {
339
339
  this.headerEle.style.display = '';
340
340
  var textEle = this.headerEle.querySelector('.' + classNames.headerText);
341
341
  var hedBackButton = this.headerEle.querySelector('.' + classNames.backIcon);
342
- if (this.enableHtmlSanitizer) {
343
- text = SanitizeHtmlHelper.sanitize(text);
344
- }
345
- textEle.innerHTML = text;
342
+ var curOpt = this.listBaseOption || {
343
+ enableHtmlSanitizer: this.enableHtmlSanitizer, disableHtmlEncode: this.disableHtmlEncode
344
+ };
345
+ textEle[ListBase.getDomSetter(curOpt)] = ListBase.getSanitizedText(text, curOpt);
346
346
  if (this.headerTemplate && showBack) {
347
347
  textEle.parentElement.classList.remove('header');
348
348
  this.headerEle.querySelector('.' + classNames.headerTemplateText).classList.add('nested-header');
@@ -432,7 +432,8 @@ var ListView = /** @class */ (function (_super) {
432
432
  itemCreated: this.renderCheckbox.bind(this),
433
433
  templateID: "" + this.element.id + LISTVIEW_TEMPLATE_PROPERTY,
434
434
  groupTemplateID: "" + this.element.id + LISTVIEW_GROUPTEMPLATE_PROPERTY,
435
- enableHtmlSanitizer: this.enableHtmlSanitizer
435
+ enableHtmlSanitizer: this.enableHtmlSanitizer,
436
+ disableHtmlEncode: this.disableHtmlEncode
436
437
  };
437
438
  this.initialization();
438
439
  };
@@ -2120,6 +2121,9 @@ var ListView = /** @class */ (function (_super) {
2120
2121
  __decorate([
2121
2122
  Property(true)
2122
2123
  ], ListView.prototype, "enableHtmlSanitizer", void 0);
2124
+ __decorate([
2125
+ Property(true)
2126
+ ], ListView.prototype, "disableHtmlEncode", void 0);
2123
2127
  __decorate([
2124
2128
  Property('')
2125
2129
  ], ListView.prototype, "height", void 0);