@syncfusion/ej2-lists 32.2.6 → 33.1.44
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/dist/ej2-lists.min.js +2 -2
- package/dist/ej2-lists.umd.min.js +2 -2
- package/dist/ej2-lists.umd.min.js.map +1 -1
- package/dist/es6/ej2-lists.es2015.js +45 -45
- package/dist/es6/ej2-lists.es2015.js.map +1 -1
- package/dist/es6/ej2-lists.es5.js +45 -45
- package/dist/es6/ej2-lists.es5.js.map +1 -1
- package/dist/global/ej2-lists.min.js +2 -2
- package/dist/global/ej2-lists.min.js.map +1 -1
- package/dist/global/index.d.ts +1 -1
- package/package.json +5 -5
- package/src/common/list-base.d.ts +10 -0
- package/src/common/list-base.js +30 -34
- package/src/list-view/list-view-model.d.ts +13 -0
- package/src/list-view/list-view.d.ts +12 -0
- package/src/list-view/list-view.js +15 -11
- package/styles/list-view/_bigger.scss +1 -0
- package/styles/list-view/_layout.scss +1 -0
- package/styles/list-view/_theme.scss +1 -0
- package/styles/sortable/_layout.scss +1 -0
package/dist/global/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* filename: index.d.ts
|
|
3
|
-
* version :
|
|
3
|
+
* version : 33.1.44
|
|
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": "
|
|
3
|
+
"version": "33.1.44",
|
|
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",
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
"module": "./index.js",
|
|
9
9
|
"es2015": "./dist/es6/ej2-lists.es5.js",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@syncfusion/ej2-base": "~
|
|
12
|
-
"@syncfusion/ej2-buttons": "~
|
|
13
|
-
"@syncfusion/ej2-data": "~
|
|
14
|
-
"@syncfusion/ej2-popups": "~
|
|
11
|
+
"@syncfusion/ej2-base": "~33.1.44",
|
|
12
|
+
"@syncfusion/ej2-buttons": "~33.1.44",
|
|
13
|
+
"@syncfusion/ej2-data": "~33.1.44",
|
|
14
|
+
"@syncfusion/ej2-popups": "~33.1.44"
|
|
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
|
*/
|
package/src/common/list-base.js
CHANGED
|
@@ -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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
306
|
-
this.
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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
|
-
|
|
343
|
-
|
|
344
|
-
}
|
|
345
|
-
textEle.
|
|
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);
|