survey-analytics 2.5.39 → 2.5.41

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,5 +1,5 @@
1
1
  /*!
2
- surveyjs - SurveyJS Dashboard library v2.5.39
2
+ surveyjs - SurveyJS Dashboard library v2.5.41
3
3
  Copyright (c) 2015-2026 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  License: SEE LICENSE IN LICENSE
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"survey.analytics.mongo.js","sources":["../src/mongo/result-transformers.ts","../src/mongo/pipelines.ts","../src/mongo/index.ts"],"sourcesContent":["function choiceTransformationPipeline(result) {\n let res = {};\n let totalCount = 0;\n result.forEach(item => {\n res[item._id] = item.count;\n totalCount += item.count;\n });\n return { data: res, totalCount: totalCount };\n}\nfunction numberTransformationPipeline(result) {\n if(result.length == 0) return { value: 0, minValue: 0, maxValue: 0 };\n return { data: { value: result[0].average, minValue: result[0].min, maxValue: result[0].max } };\n}\nfunction histogramTransformationPipeline(result) {\n let res = [];\n let totalCount = 0;\n result.forEach(item => {\n res.push(item.count);\n totalCount += item.count;\n });\n return { data: res, intervals: result, totalCount: totalCount };\n}\n\nexport const transformers = {\n \"boolean\": choiceTransformationPipeline,\n \"radiogroup\": choiceTransformationPipeline,\n \"dropdown\": choiceTransformationPipeline,\n \"checkbox\": choiceTransformationPipeline,\n \"tagbox\": choiceTransformationPipeline,\n \"number\": numberTransformationPipeline,\n \"rating\": numberTransformationPipeline,\n \"histogram\": histogramTransformationPipeline\n};\n","export function createPipeline(surveyId: string, questionId: string, visualizerType: string, questionType: string): any[] {\n const singleChoicePipeline = [\n { $match: { postid: surveyId } },\n { $project: { value: \"$json.\" + questionId } },\n { $match: { value: { $exists: true } } },\n {\n $group: {\n _id: \"$value\",\n count: { $sum: 1 },\n }\n }\n ];\n const multipleChoicePipeline = [\n { $match: { postid: surveyId } },\n { $project: { value: \"$json.\" + questionId } },\n { $match: { value: { $exists: true } } },\n { $unwind: \"$value\" },\n {\n $group: {\n _id: \"$value\",\n count: { $sum: 1 },\n }\n }\n ];\n const numberPipeline = [\n { $match: { postid: surveyId } },\n { $project: { value: \"$json.\" + questionId } },\n { $match: { value: { $exists: true } } },\n {\n $group: {\n _id: null,\n count: { $sum: 1 },\n average: { $avg: \"$value\" },\n min: { $min: \"$value\" },\n max: { $max: \"$value\" },\n values: { $push: \"$value\" }\n }\n }\n ];\n const histogramPipeline = [\n { $match: { postid: surveyId } },\n { $project: { value: \"$json.\" + questionId } },\n { $match: { value: { $exists: true } } },\n {\n $bucketAuto: {\n groupBy: \"$value\",\n buckets: 10,\n output: {\n count: { $sum: 1 },\n minValue: { $min: \"$value\" },\n maxValue: { $max: \"$value\" }\n }\n }\n },\n {\n $project: {\n _id: 0,\n start: \"$minValue\",\n end: \"$maxValue\",\n label: {\n $concat: [\n { $toString: { $round: [\"$minValue\", 2] } },\n \" - \",\n { $toString: { $round: [\"$maxValue\", 2] } }\n ]\n },\n count: 1\n }\n }\n ];\n const mongoPipelines = {\n \"boolean\": singleChoicePipeline,\n \"radiogroup\": singleChoicePipeline,\n \"dropdown\": singleChoicePipeline,\n \"checkbox\": multipleChoicePipeline,\n \"tagbox\": multipleChoicePipeline,\n \"number\": numberPipeline,\n \"rating\": numberPipeline,\n \"histogram\": histogramPipeline\n };\n const pipeline = mongoPipelines[visualizerType] || mongoPipelines[questionType] || [];\n return pipeline;\n}\n","import { Db } from \"mongodb\";\nimport { transformers } from \"./result-transformers\";\nimport { createPipeline } from \"./pipelines\";\n\nexport interface IFilterItem { field: string, value: any }\n\nexport class MongoDbAdapter {\n constructor(private db: Db, private getId: () => string) {\n }\n\n create(collectionName: string, object) {\n object.id = object.id || this.getId();\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).insertOne(object)\n .then((results) => {\n resolve(object.id);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n\n retrieve(collectionName: string, filter: Array<IFilterItem>) {\n filter = filter || [];\n const query = {};\n filter.forEach(fi => query[fi.field] = fi.value);\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).find(query).toArray()\n .then((results) => {\n resolve(results);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n\n update(collectionName: string, object) {\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).updateOne({ id: object.id }, { $set: object })\n .then((results) => {\n resolve(results);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n\n delete(collectionName: string, id) {\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).deleteMany({ id: id })\n .then((results) => {\n resolve(results);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n\n retrievePaginated(collectionName: string, filter, order, offset: number, limit: number) {\n filter = filter || [];\n let query = {};\n filter.forEach(fi => {\n if(!!fi.value) {\n let val = fi.value;\n query[fi.field] = val;\n }\n });\n let sort = {};\n order.forEach(fi => {\n sort[fi.field] = fi.value == \"desc\" ? -1 : 1;\n });\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).count(query).then(count => {\n this.db.collection(collectionName).find(query).sort(sort).skip(offset).limit(limit).toArray()\n .then((results) => {\n const result = { data: results, totalCount: count };\n resolve(result);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n });\n }\n\n retrieveSummary(collectionName: string, surveyId: string, questionId: string, questionType: string, visualizerType: string, filter: Array<IFilterItem>) {\n const pipeline = createPipeline(surveyId, questionId, visualizerType, questionType);\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).aggregate(pipeline).toArray()\n .then((results) => {\n const transformer = transformers[visualizerType] || transformers[questionType] || (r => r);\n const result = transformer(results);\n resolve(result);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n}\n\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"survey.analytics.mongo.js","sources":["../src/mongo/result-transformers.ts","../src/mongo/pipelines.ts","../src/mongo/index.ts"],"sourcesContent":["function choiceTransformationPipeline(result) {\n let res = {};\n let totalCount = 0;\n result.forEach(item => {\n res[item._id] = item.count;\n totalCount += item.count;\n });\n return { data: res, totalCount: totalCount };\n}\nfunction numberTransformationPipeline(result) {\n if(result.length == 0) return { value: 0, minValue: 0, maxValue: 0 };\n return { data: { value: result[0].average, minValue: result[0].min, maxValue: result[0].max } };\n}\nfunction histogramTransformationPipeline(result) {\n let res = [];\n let totalCount = 0;\n result.forEach(item => {\n res.push(item.count);\n totalCount += item.count;\n });\n return { data: res, intervals: result, totalCount: totalCount };\n}\n\nexport const transformers = {\n \"boolean\": choiceTransformationPipeline,\n \"radiogroup\": choiceTransformationPipeline,\n \"dropdown\": choiceTransformationPipeline,\n \"checkbox\": choiceTransformationPipeline,\n \"tagbox\": choiceTransformationPipeline,\n \"number\": numberTransformationPipeline,\n \"rating\": numberTransformationPipeline,\n \"histogram\": histogramTransformationPipeline\n};\n","export function createPipeline(surveyId: string, questionId: string, visualizerType: string, questionType: string): any[] {\n const singleChoicePipeline = [\n { $match: { postid: surveyId } },\n { $project: { value: \"$json.\" + questionId } },\n { $match: { value: { $exists: true } } },\n {\n $group: {\n _id: \"$value\",\n count: { $sum: 1 },\n }\n }\n ];\n const multipleChoicePipeline = [\n { $match: { postid: surveyId } },\n { $project: { value: \"$json.\" + questionId } },\n { $match: { value: { $exists: true } } },\n { $unwind: \"$value\" },\n {\n $group: {\n _id: \"$value\",\n count: { $sum: 1 },\n }\n }\n ];\n const numberPipeline = [\n { $match: { postid: surveyId } },\n { $project: { value: \"$json.\" + questionId } },\n { $match: { value: { $exists: true } } },\n {\n $group: {\n _id: null,\n count: { $sum: 1 },\n average: { $avg: \"$value\" },\n min: { $min: \"$value\" },\n max: { $max: \"$value\" },\n values: { $push: \"$value\" }\n }\n }\n ];\n const histogramPipeline = [\n { $match: { postid: surveyId } },\n { $project: { value: \"$json.\" + questionId } },\n { $match: { value: { $exists: true } } },\n {\n $bucketAuto: {\n groupBy: \"$value\",\n buckets: 10,\n output: {\n count: { $sum: 1 },\n minValue: { $min: \"$value\" },\n maxValue: { $max: \"$value\" }\n }\n }\n },\n {\n $project: {\n _id: 0,\n start: \"$minValue\",\n end: \"$maxValue\",\n label: {\n $concat: [\n { $toString: { $round: [\"$minValue\", 2] } },\n \" - \",\n { $toString: { $round: [\"$maxValue\", 2] } }\n ]\n },\n count: 1\n }\n }\n ];\n const mongoPipelines = {\n \"boolean\": singleChoicePipeline,\n \"radiogroup\": singleChoicePipeline,\n \"dropdown\": singleChoicePipeline,\n \"checkbox\": multipleChoicePipeline,\n \"tagbox\": multipleChoicePipeline,\n \"number\": numberPipeline,\n \"rating\": numberPipeline,\n \"histogram\": histogramPipeline\n };\n const pipeline = mongoPipelines[visualizerType] || mongoPipelines[questionType] || [];\n return pipeline;\n}\n","import { Db } from \"mongodb\";\nimport { transformers } from \"./result-transformers\";\nimport { createPipeline } from \"./pipelines\";\n\nexport interface IFilterItem { field: string, value: any }\n\nexport class MongoDbAdapter {\n constructor(private db: Db, private getId: () => string) {\n }\n\n create(collectionName: string, object) {\n object.id = object.id || this.getId();\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).insertOne(object)\n .then((results) => {\n resolve(object.id);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n\n retrieve(collectionName: string, filter: Array<IFilterItem>) {\n filter = filter || [];\n const query = {};\n filter.forEach(fi => query[fi.field] = fi.value);\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).find(query).toArray()\n .then((results) => {\n resolve(results);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n\n update(collectionName: string, object) {\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).updateOne({ id: object.id }, { $set: object })\n .then((results) => {\n resolve(results);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n\n delete(collectionName: string, id) {\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).deleteMany({ id: id })\n .then((results) => {\n resolve(results);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n\n retrievePaginated(collectionName: string, filter, order, offset: number, limit: number) {\n filter = filter || [];\n let query = {};\n filter.forEach(fi => {\n if(!!fi.value) {\n let val = fi.value;\n query[fi.field] = val;\n }\n });\n let sort = {};\n order.forEach(fi => {\n sort[fi.field] = fi.value == \"desc\" ? -1 : 1;\n });\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).count(query).then(count => {\n this.db.collection(collectionName).find(query).sort(sort).skip(offset).limit(limit).toArray()\n .then((results) => {\n const result = { data: results, totalCount: count };\n resolve(result);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n });\n }\n\n retrieveSummary(collectionName: string, surveyId: string, questionId: string, questionType: string, visualizerType: string, filter: Array<IFilterItem>) {\n const pipeline = createPipeline(surveyId, questionId, visualizerType, questionType);\n return new Promise((resolve, reject) => {\n this.db.collection(collectionName).aggregate(pipeline).toArray()\n .then((results) => {\n const transformer = transformers[visualizerType] || transformers[questionType] || (r => r);\n const result = transformer(results);\n resolve(result);\n })\n .catch((e) => {\n reject(JSON.stringify(e));\n });\n });\n }\n}\n\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /*!
2
- surveyjs - SurveyJS Dashboard library v2.5.39
2
+ surveyjs - SurveyJS Dashboard library v2.5.41
3
3
  Copyright (c) 2015-2026 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  License: SEE LICENSE IN LICENSE
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["file:///azp/_work/30/s/survey-analytics/src/utils/utils.scss","file:///azp/_work/30/s/survey-analytics/src/tables/table.scss","file:///azp/_work/30/s/survey-analytics/src/tables/tabulator.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EATF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAfF;IAgBI;IACA;;;;ACyCN;EACE,WA7De;EA8Df,aAhEY;;AAkEZ;EACE;EACA;EACA;;AAGF;EACE;EAvDF;EACA;EACA;EACA;EACA;EACA;EACA,qBACE;EAEF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA,cAjDW;EAkDX;;AAEF;EACE;;AAmCF;EA9BA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,cAzES;EA0ET;;;AAwBJ;EACE,kBAzFgB;;;AA4FlB;EACE;EACA;EACA;EACA;;;AAGF;EACE;;AACA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA,WAnHe;EAoHf;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE,cAvJU;EAwJV,OAxJU;;AAyJV;EACE,kBApJQ;EAqJR,OAjJiB;;;AAqJrB;EACE,cAnKW;EAoKX,OApKW;;AAqKX;EACE,kBAtKS;EAuKT,OA1JiB;;;AA8JrB;EACE;EACA;EACA;EACA;;AACA;EACE,MA1KQ;;AA6KR;EACE,MA7KY;;AAgLhB;EACE;EACA;;;AAIJ;EACE;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAEF;EACE;EACA;;AACA;EACE,MA/MO;;AAiNT;EACE,MAlNO;;;AAuNb;AAAA;EAEE;EACA;EACA;EACA,qBACE;EAEF;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EAEA;EACA,qBACE;EAEF,iBACE;EAEF;EACA;EACA;EACA;;AACA;EACE;;;AAKJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,kBAtQgB;;;AAyQlB;EACE,kBA1QgB;;;AA6QlB;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;ACxRF;EACE;EACA,kBDPgB;ECQhB;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAIJ;EACE;;AACA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;;AACA;EACE;;;AAIF;EACE;;;AAMF;EACE;EACA;EACA;EACA,ODxEQ;ECyER;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAIJ;EDpEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EC6DE;EACA;;AAGF;ED1EA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ECmEE;EACA;EACA;;AAGF;EAvGA;EACA;EACA;EAEA;EACA;EACA,qBACE;EAEF;EACA;EACA;EACA;EACA;EA4FE;EACA;;AAGF;EA7GA;EACA;EACA;EAEA;EACA;EACA,qBACE;EAEF;EACA;EACA;EACA;EACA;EAkGE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA,kBDxHe;;AC0Hf;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA,kBDhKa;;ACmKf;EACE,kBD3JY;;AC8Jd;EACE,kBDxKa;;AC2Kf;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA,kBDjLS;;ACoLX;EACE,YD3LO;;;ACgMb;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE"}
1
+ {"version":3,"sourceRoot":"","sources":["file:///azp/_work/19/s/survey-analytics/src/utils/utils.scss","file:///azp/_work/19/s/survey-analytics/src/tables/table.scss","file:///azp/_work/19/s/survey-analytics/src/tables/tabulator.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EATF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAfF;IAgBI;IACA;;;;ACyCN;EACE,WA7De;EA8Df,aAhEY;;AAkEZ;EACE;EACA;EACA;;AAGF;EACE;EAvDF;EACA;EACA;EACA;EACA;EACA;EACA,qBACE;EAEF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA,cAjDW;EAkDX;;AAEF;EACE;;AAmCF;EA9BA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,cAzES;EA0ET;;;AAwBJ;EACE,kBAzFgB;;;AA4FlB;EACE;EACA;EACA;EACA;;;AAGF;EACE;;AACA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA,WAnHe;EAoHf;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE,cAvJU;EAwJV,OAxJU;;AAyJV;EACE,kBApJQ;EAqJR,OAjJiB;;;AAqJrB;EACE,cAnKW;EAoKX,OApKW;;AAqKX;EACE,kBAtKS;EAuKT,OA1JiB;;;AA8JrB;EACE;EACA;EACA;EACA;;AACA;EACE,MA1KQ;;AA6KR;EACE,MA7KY;;AAgLhB;EACE;EACA;;;AAIJ;EACE;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;EACA;EACA;;AAEF;EACE;EACA;;AACA;EACE,MA/MO;;AAiNT;EACE,MAlNO;;;AAuNb;AAAA;EAEE;EACA;EACA;EACA,qBACE;EAEF;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EAEA;EACA,qBACE;EAEF,iBACE;EAEF;EACA;EACA;EACA;;AACA;EACE;;;AAKJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,kBAtQgB;;;AAyQlB;EACE,kBA1QgB;;;AA6QlB;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;ACxRF;EACE;EACA,kBDPgB;ECQhB;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAIJ;EACE;;AACA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;;AACA;EACE;;;AAIF;EACE;;;AAMF;EACE;EACA;EACA;EACA,ODxEQ;ECyER;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAIJ;EDpEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EC6DE;EACA;;AAGF;ED1EA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ECmEE;EACA;EACA;;AAGF;EAvGA;EACA;EACA;EAEA;EACA;EACA,qBACE;EAEF;EACA;EACA;EACA;EACA;EA4FE;EACA;;AAGF;EA7GA;EACA;EACA;EAEA;EACA;EACA,qBACE;EAEF;EACA;EACA;EACA;EACA;EAkGE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA,kBDxHe;;AC0Hf;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA,kBDhKa;;ACmKf;EACE,kBD3JY;;AC8Jd;EACE,kBDxKa;;AC2Kf;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA,kBDjLS;;ACoLX;EACE,YD3LO;;;ACgMb;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE"}
@@ -1,5 +1,5 @@
1
1
  /*!
2
- surveyjs - SurveyJS Dashboard library v2.5.39
2
+ surveyjs - SurveyJS Dashboard library v2.5.41
3
3
  Copyright (c) 2015-2026 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  License: SEE LICENSE IN LICENSE
5
5
  */
@@ -2969,6 +2969,9 @@ License: SEE LICENSE IN LICENSE
2969
2969
  });
2970
2970
  return linksContainer;
2971
2971
  }
2972
+ function stripHtml(html) {
2973
+ return (html || "").replace(/(<([^>]+)>)/gi, "");
2974
+ }
2972
2975
 
2973
2976
  var TableExtensions = /** @class */ (function () {
2974
2977
  function TableExtensions(table) {
@@ -3504,6 +3507,10 @@ License: SEE LICENSE IN LICENSE
3504
3507
  if (!this.displayNameValue) {
3505
3508
  this.displayName = this.getDisplayName();
3506
3509
  }
3510
+ // guard against XSS in user-defined question titles
3511
+ if (!this.table || this.table.options.stripHtmlFromTitles !== false) {
3512
+ return stripHtml(this.displayNameValue);
3513
+ }
3507
3514
  return this.displayNameValue;
3508
3515
  },
3509
3516
  set: function (val) {
@@ -5120,7 +5127,10 @@ License: SEE LICENSE IN LICENSE
5120
5127
  minWidth: _this._options.columnMinWidth,
5121
5128
  download: _this.options.downloadHiddenColumns ? true : undefined,
5122
5129
  formatter: formatter,
5123
- headerTooltip: true,
5130
+ // render the tooltip as plain text: Tabulator injects string tooltips via innerHTML (XSS)
5131
+ headerTooltip: function () { return DocumentHelper.createElement("div", "", {
5132
+ textContent: column.displayName || column.name,
5133
+ }); },
5124
5134
  headerWordWrap: true,
5125
5135
  accessorDownload: _this.accessorDownload,
5126
5136
  titleFormatter: function (cell, formatterParams, onRendered) {