sf-i-events 1.0.895 → 1.0.897

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/dev/index.html CHANGED
@@ -25,7 +25,7 @@
25
25
  import { SfISubSelect } from 'https://esm.run/sf-i-sub-select@1.0.83/sf-i-sub-select.js';
26
26
  import { SfIForm } from 'https://esm.run/sf-i-form@1.0.185/sf-i-form.js';
27
27
  import { SfIElasticText } from 'https://esm.run/sf-i-elastic-text@1.0.17/sf-i-elastic-text.js';
28
- import { SfIUploader } from 'https://esm.run/sf-i-uploader@1.0.120/sf-i-uploader.js';
28
+ import { SfIUploader } from 'https://esm.run/sf-i-uploader@1.0.122/sf-i-uploader.js';
29
29
  import { SfIMultitextarea } from 'https://esm.run/sf-i-multitextarea@1.0.23/sf-i-multitextarea.js';
30
30
  // import { SfIReporting } from 'https://esm.run/sf-i-reporting@1.0.89/sf-i-reporting.js';
31
31
  import { SfIReporting } from '../../sf-i-reporting/sf-i-reporting.js';
@@ -786,7 +786,21 @@
786
786
  </div>
787
787
 
788
788
  </sf-i-events> -->
789
- <sf-i-events name="Calendar" apiid="dwqyez2puoxmu.cloudfront.net/event" mode="consumer"
789
+ <sf-i-events id="sf-i-events-next" name="Next Compliances" apiid="dwqyez2puoxmu.cloudfront.net/event"
790
+ apiidstatutes="dnytrdlrmxgsy.cloudfront.net/statute" apiidcompliances="dnytrdlrmxgsy.cloudfront.net/compliance"
791
+ apiidreportformats="dwqyez2puoxmu.cloudfront.net/reportformat"
792
+ apiiddefinitions="dwqyez2puoxmu.cloudfront.net/definition" mode="next" fill="solid" username="Local Reporter 1"
793
+ userprofileid="e9684b5d-ddbc-46d3-ae07-51706bf75410" projectid="41ab3c86-ccc0-4c0e-8e31-cd079a07a710"
794
+ projectname="ABC Global" myroles="[&quot;reporter&quot;]" eventpreviewfields="[&quot;obligation&quot;]"
795
+ eventhidefields="[&quot;comments&quot;,&quot;documents&quot;,&quot;lastupdated&quot;,&quot;approved&quot;,&quot;tags&quot;]"
796
+ blocksize="10" calendarstartdd="01" calendarstartmm="04" calendarstartyyyy="2025">
797
+ <div slot="uploader"><sf-i-uploader id="uploader" max="10" apiid="1peg5170d3"
798
+ allowedextensions="[&quot;jpg&quot;,&quot;png&quot;,&quot;pdf&quot;,&quot;xls&quot;,&quot;xlsx&quot;,&quot;doc&quot;,&quot;docx&quot;]"
799
+ extract="yes" projectid="41ab3c86-ccc0-4c0e-8e31-cd079a07a710" maxsize="31457280"
800
+ allowdownload="yes"></sf-i-uploader></div>
801
+ <div slot="reporting"><sf-i-reporting id="reporting-format" mode="view"></sf-i-reporting></div>
802
+ </sf-i-events>
803
+ <!-- <sf-i-events name="Calendar" apiid="dwqyez2puoxmu.cloudfront.net/event" mode="consumer"
790
804
  apiidtags="dnytrdlrmxgsy.cloudfront.net/tagging" apiidstatutes="dnytrdlrmxgsy.cloudfront.net/statute"
791
805
  apiiddefinitions="dwqyez2puoxmu.cloudfront.net/definition"
792
806
  apiidreportformats="dwqyez2puoxmu.cloudfront.net/reportformat"
@@ -813,7 +827,7 @@
813
827
  <sf-i-reporting id="reporting-format" mode="view"></sf-i-reporting>
814
828
  </div>
815
829
 
816
- </sf-i-events>
830
+ </sf-i-events> -->
817
831
  <!-- <sf-i-events name="Calendar" apiid="dwqyez2puoxmu.cloudfront.net/event" mode="consumer"
818
832
  apiidtags="dnytrdlrmxgsy.cloudfront.net/tagging" apiidstatutes="dnytrdlrmxgsy.cloudfront.net/statute"
819
833
  apiiddefinitions="dwqyez2puoxmu.cloudfront.net/definition"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sf-i-events",
3
3
  "private": false,
4
- "version": "1.0.895",
4
+ "version": "1.0.897",
5
5
  "description": "Superflows Navigation Component",
6
6
  "main": "sf-i-events.js",
7
7
  "module": "sf-i-events.js",
package/sf-i-events.d.ts CHANGED
@@ -684,6 +684,7 @@ export declare class SfIEvents extends LitElement {
684
684
  renderChartSettings: (container: HTMLDivElement, selectedTab: number | undefined, selectedSummary: number | undefined, ctx: any) => void;
685
685
  renderChartSummary: () => void;
686
686
  csvToHtmlTable: (strCsv: string) => string;
687
+ csvToHtmlTable1: (strCsv: string) => string;
687
688
  getFilteredString: () => string;
688
689
  getFilteredStringSummary: () => string;
689
690
  formatLabel: (str: string, maxwidth: number) => any;
package/sf-i-events.js CHANGED
@@ -8993,7 +8993,7 @@ let SfIEvents = class SfIEvents extends LitElement {
8993
8993
  this.renderCompletenessCsvForGraph = (dataBar, parameter) => {
8994
8994
  this.csvCompletenessStats = parameter + ",Not Started,In Progress,Complete,Rejected\n";
8995
8995
  for (var i = 0; i < dataBar['labels'].length; i++) {
8996
- this.csvCompletenessStats += dataBar['labels'][i].join(" ") + "," + dataBar['datasets'][3]['data'][i] + "," + dataBar['datasets'][1]['data'][i] + "," + dataBar['datasets'][0]['data'][i] + "," + dataBar['datasets'][2]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\n" : "");
8996
+ this.csvCompletenessStats += "\"" + dataBar['labels'][i].join(" ") + "\",\"" + dataBar['datasets'][3]['data'][i] + "\",\"" + dataBar['datasets'][1]['data'][i] + "\",\"" + dataBar['datasets'][0]['data'][i] + "\",\"" + dataBar['datasets'][2]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\"\n" : "");
8997
8997
  }
8998
8998
  console.log('rendering csv completeness', dataBar, this.csvCompletenessStats);
8999
8999
  };
@@ -9001,14 +9001,14 @@ let SfIEvents = class SfIEvents extends LitElement {
9001
9001
  //console.log('dataBar', dataBar);
9002
9002
  this.csvTimelinessStats = parameter + ",In Time,Past Due Date,Late Approved,Late Executed,Late Reported\n";
9003
9003
  for (var i = 0; i < dataBar['labels'].length; i++) {
9004
- this.csvTimelinessStats += dataBar['labels'][i].join(" ") + "," + dataBar['datasets'][0]['data'][i] + "," + dataBar['datasets'][1]['data'][i] + "," + dataBar['datasets'][3]['data'][i] + "," + dataBar['datasets'][2]['data'][i] + "," + dataBar['datasets'][4]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\n" : "");
9004
+ this.csvTimelinessStats += "\"" + dataBar['labels'][i].join(" ") + "\",\"" + dataBar['datasets'][0]['data'][i] + "\",\"" + dataBar['datasets'][1]['data'][i] + "\",\"" + dataBar['datasets'][3]['data'][i] + "\",\"" + dataBar['datasets'][2]['data'][i] + "\",\"" + dataBar['datasets'][4]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\"\n" : "");
9005
9005
  }
9006
9006
  //console.log('rendering csv csvTimelinessStats', this.csvTimelinessStats);
9007
9007
  };
9008
9008
  this.renderComplianceCsvForGraph = (dataBar, parameter) => {
9009
- this.csvComplianceStats = parameter + ",Scheduled,Not Complied,Partially Complied,Complied\n";
9009
+ this.csvComplianceStats = parameter + ",Scheduled,Not Complied,Partially Complied,Complied,Complied With Gaps,Reported Non Compliance\n";
9010
9010
  for (var i = 0; i < dataBar['labels'].length; i++) {
9011
- this.csvComplianceStats += dataBar['labels'][i].join(" ") + "," + dataBar['datasets'][0]['data'][i] + "," + dataBar['datasets'][1]['data'][i] + "," + dataBar['datasets'][3]['data'][i] + "," + dataBar['datasets'][2]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\n" : "");
9011
+ this.csvComplianceStats += "\"" + dataBar['labels'][i].join(" ") + "\",\"" + dataBar['datasets'][0]['data'][i] + "\",\"" + dataBar['datasets'][1]['data'][i] + "\",\"" + dataBar['datasets'][2]['data'][i] + "\",\"" + dataBar['datasets'][3]['data'][i] + "\",\"" + dataBar['datasets'][4]['data'][i] + "\",\"" + dataBar['datasets'][5]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\"\n" : "");
9012
9012
  }
9013
9013
  //console.log('rendering csv csvComplianceStats', this.csvComplianceStats);
9014
9014
  };
@@ -9160,7 +9160,7 @@ let SfIEvents = class SfIEvents extends LitElement {
9160
9160
  }]
9161
9161
  };
9162
9162
  this.csvGraphStats += 'Compliance,Scheduled,Not Complied,Partially Complied,Complied,Complied With Gaps,Reported Non Compliance,Total\n';
9163
- this.csvGraphStats += 'Count,' + parseInt(dataScheduled) + ',' + parseInt(dataNotComplied) + ',' + parseInt(dataPartiallyComplied) + ',' + parseInt(dataComplied) + ',' + parseInt(dataCompliedWithGaps) + ',' + parseInt(dataReportedNonComplaince) + ',' + parseInt(dataTotal) + '\n';
9163
+ this.csvGraphStats += 'Count,' + parseInt(dataScheduled) + ',' + parseInt(dataNotComplied) + ',' + parseInt(dataPartiallyComplied) + ',' + parseInt(dataCompliedWithGaps) + ',' + parseInt(dataComplied) + ',' + parseInt(dataReportedNonComplaince) + ',' + parseInt(dataTotal) + '\n';
9164
9164
  }
9165
9165
  //console.log('rendering timeliness graph', this.csvGraphStats);
9166
9166
  const itemsTimeliness = divContainer.querySelectorAll('.stat-timeliness');
@@ -9425,17 +9425,17 @@ let SfIEvents = class SfIEvents extends LitElement {
9425
9425
  return data;
9426
9426
  };
9427
9427
  this.renderPieCsv = (pieData, csv, param) => {
9428
- csv += param + ',';
9428
+ csv += '"' + param + '",';
9429
9429
  for (var i = 0; i < Object.keys(pieData).length; i++) {
9430
- csv += (Object.keys(pieData)[i]);
9430
+ csv += '"' + (Object.keys(pieData)[i]) + '"';
9431
9431
  if (i < (Object.keys(pieData).length - 1)) {
9432
9432
  csv += ',';
9433
9433
  }
9434
9434
  }
9435
9435
  csv += '\n';
9436
- csv += 'Count,';
9436
+ csv += '"Count",';
9437
9437
  for (var i = 0; i < Object.keys(pieData).length; i++) {
9438
- csv += (pieData[Object.keys(pieData)[i]]);
9438
+ csv += '"' + (pieData[Object.keys(pieData)[i]]) + '"';
9439
9439
  if (i < (Object.keys(pieData).length - 1)) {
9440
9440
  csv += ',';
9441
9441
  }
@@ -12952,7 +12952,7 @@ let SfIEvents = class SfIEvents extends LitElement {
12952
12952
  html += '<div part="detail-summary">';
12953
12953
  html += ('<div part="detail-summary-title" class="pl-20 pr-20"><h1>' + event['obligationtitle'] + '</h1></div>');
12954
12954
  html += ('<div part="detail-summary-subtitle" class="pl-20 pr-20"><h3>' + event['obligation'].replace(/\n/g, '<br />') + '</h3></div>');
12955
- html += ('<div part="detail-summary-content" class="pl-20 pr-20">' + ('<sf-i-elastic-text text="' + (event['internalcontrols'] + "").replace(/"/g, "").replace(/\n/g, '<br />') + '" minLength="80"></sf-i-elastic-text>') + '</div>');
12955
+ html += ('<div part="detail-summary-content" class="pl-20 pr-20 pt-20">' + ('<sf-i-elastic-text text="' + (event['internalcontrols'] + "").replace(/"/g, "").replace(/\n/g, '<br />') + '" minLength="80"></sf-i-elastic-text>') + '</div>');
12956
12956
  html += '</div>';
12957
12957
  html += '<br />';
12958
12958
  html += '<div class="accordian-section section-basic pl-20 pr-20" part="accordian-section">';
@@ -13068,7 +13068,13 @@ let SfIEvents = class SfIEvents extends LitElement {
13068
13068
  html += '<div class="m-20">';
13069
13069
  html += '<div part="detail-head"><strong>' + complianceFields[i] + '</strong></div>';
13070
13070
  for (let attachmentStr of event[complianceFields[i]]) {
13071
- let attachment = JSON.parse(attachmentStr + "");
13071
+ let attachment = {};
13072
+ if (typeof attachmentStr === "object") {
13073
+ attachment = attachmentStr;
13074
+ }
13075
+ else {
13076
+ attachment = JSON.parse(attachmentStr + "");
13077
+ }
13072
13078
  html += `<sf-i-uploader class="event-attachment" max="10" apiid="1peg5170d3" allowedextensions="[&quot;jpg&quot;,&quot;png&quot;,&quot;pdf&quot;,&quot;xls&quot;,&quot;xlsx&quot;,&quot;doc&quot;,&quot;docx&quot;]" prepopulatedInputArr="${JSON.stringify([{ "key": attachment.key, "ext": attachment.ext }]).replace(/"/g, '&quot;')}" projectid="${this.projectId} " extract="no" mode="view" maximize="yes" hidepreview="yes" displaydetail="yes"></sf-i-uploader>`;
13073
13079
  }
13074
13080
  html += '</div>';
@@ -17950,6 +17956,48 @@ let SfIEvents = class SfIEvents extends LitElement {
17950
17956
  }
17951
17957
  };
17952
17958
  this.csvToHtmlTable = (strCsv) => {
17959
+ const htmlRows = [];
17960
+ const lines = strCsv.trim().split(/\r?\n/);
17961
+ const parseCsvLine = (line) => {
17962
+ const result = [];
17963
+ let current = '';
17964
+ let inQuotes = false;
17965
+ for (let i = 0; i < line.length; i++) {
17966
+ const char = line[i];
17967
+ const nextChar = line[i + 1];
17968
+ if (char === '"' && inQuotes && nextChar === '"') {
17969
+ current += '"'; // escaped quote
17970
+ i++; // skip next quote
17971
+ }
17972
+ else if (char === '"') {
17973
+ inQuotes = !inQuotes;
17974
+ }
17975
+ else if (char === ',' && !inQuotes) {
17976
+ result.push(current);
17977
+ current = '';
17978
+ }
17979
+ else {
17980
+ current += char;
17981
+ }
17982
+ }
17983
+ result.push(current);
17984
+ return result;
17985
+ };
17986
+ htmlRows.push('<br />' + parseCsvLine(lines[0])[0] + '<br /><br />');
17987
+ htmlRows.push('<table>');
17988
+ lines.forEach((line, index) => {
17989
+ const cells = parseCsvLine(line);
17990
+ const tag = index === 0 ? 'th' : 'td';
17991
+ htmlRows.push('<tr>');
17992
+ cells.forEach(cell => {
17993
+ htmlRows.push(`<${tag} class="${tag === 'td' ? 'text-center' : ''}">${cell}</${tag}>`);
17994
+ });
17995
+ htmlRows.push('</tr>');
17996
+ });
17997
+ htmlRows.push('</table>');
17998
+ return htmlRows.join('');
17999
+ };
18000
+ this.csvToHtmlTable1 = (strCsv) => {
17953
18001
  var html = '';
17954
18002
  //console.log('csvToHtmlTable', strCsv);
17955
18003
  var strArr = strCsv.split("\n");
@@ -4635,16 +4635,16 @@ export class SfIEvents extends LitElement {
4635
4635
 
4636
4636
  var html = '';
4637
4637
  html += '<tr class="tablerow">'
4638
- html += '<td part="td-body" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head" class="pl-0-imp w-100 d-flex align-center">FILTER_CRITERIA_NAME</div><div part="td-head' + (isLocation ? '' : '-click') +'" id="filter-' + index + '">DASHBOARD_FILTER_NAME</div>'
4638
+ html += '<td part="td-body" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head" class="pl-0-imp w-100 d-flex align-center">FILTER_CRITERIA_NAME</div><div part="td-head' + (isLocation ? '' : '-click') + '" id="filter-' + index + '">DASHBOARD_FILTER_NAME</div>'
4639
4639
  if (filterUser) {
4640
4640
  html += '<div part="td-head" class="pl-0-imp w-100 d-flex align-center">Last Access</div><div>DASHBOARD_LAST_ACTIVE</div><div part="td-head" class="pl-0-imp w-100 d-flex align-center">Last Action</div><div>DASHBOARD_LAST_ACTION</div>'
4641
4641
  }
4642
4642
  html += '</div></td>'
4643
- html += '<td part="td-body" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') +'" id="filter-not-started-' + index + '" class="pl-0-imp w-100 d-flex align-center"><span class="small-icon material-icons color-not-started">schedule</span>&nbsp;&nbsp;Not Started</div><div>DASHBOARD_NOT_STARTED</div></div></td>'
4644
- html += '<td part="td-body" id="filter-pending-approval-' + index + '" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') +'" class="pl-0-imp w-100 d-flex align-center"><span class="small-icon material-symbols-outlined color-pending">pending</span>&nbsp;&nbsp;Pending Approval</div><div>DASHBOARD_PENDING_APPROVAL</div></div></td>'
4645
- html += '<td part="td-body" id="filter-rejected-' + index + '" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') +'" class="pl-0-imp w-100 d-flex align-center"><span class="small-icon material-symbols-outlined color-rejected">block</span>&nbsp;&nbsp;Rejected</div><div>DASHBOARD_REJECTED</div></div></td>'
4646
- html += '<td part="td-body" id="filter-approved-' + index + '" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') +'" class="pl-0-imp w-100 d-flex align-center"><span class="small-icon material-symbols-outlined color-done">check_circle</span>&nbsp;&nbsp;Approved</div><div>DASHBOARD_APPROVED</div></div></td>'
4647
- html += '<td part="td-body" id="filter-total-' + index + '" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') +'" class="pl-0-imp w-100 d-flex align-center">Total</div><div>DASHBOARD_TOTAL</div></div></td>'
4643
+ html += '<td part="td-body" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') + '" id="filter-not-started-' + index + '" class="pl-0-imp w-100 d-flex align-center"><span class="small-icon material-icons color-not-started">schedule</span>&nbsp;&nbsp;Not Started</div><div>DASHBOARD_NOT_STARTED</div></div></td>'
4644
+ html += '<td part="td-body" id="filter-pending-approval-' + index + '" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') + '" class="pl-0-imp w-100 d-flex align-center"><span class="small-icon material-symbols-outlined color-pending">pending</span>&nbsp;&nbsp;Pending Approval</div><div>DASHBOARD_PENDING_APPROVAL</div></div></td>'
4645
+ html += '<td part="td-body" id="filter-rejected-' + index + '" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') + '" class="pl-0-imp w-100 d-flex align-center"><span class="small-icon material-symbols-outlined color-rejected">block</span>&nbsp;&nbsp;Rejected</div><div>DASHBOARD_REJECTED</div></div></td>'
4646
+ html += '<td part="td-body" id="filter-approved-' + index + '" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') + '" class="pl-0-imp w-100 d-flex align-center"><span class="small-icon material-symbols-outlined color-done">check_circle</span>&nbsp;&nbsp;Approved</div><div>DASHBOARD_APPROVED</div></div></td>'
4647
+ html += '<td part="td-body" id="filter-total-' + index + '" class="td-body TD_BODY_CLASS"><div class="d-flex align-center flex-wrap"><div part="td-head' + (isLocation ? '' : '-click') + '" class="pl-0-imp w-100 d-flex align-center">Total</div><div>DASHBOARD_TOTAL</div></div></td>'
4648
4648
  html += '</tr>';
4649
4649
 
4650
4650
  return html;
@@ -6067,7 +6067,7 @@ export class SfIEvents extends LitElement {
6067
6067
  let ddmmyyyy = mmddyyyy.split('/')[1] + '/' + mmddyyyy.split('/')[0] + '/' + mmddyyyy.split('/')[2];
6068
6068
 
6069
6069
  let emailcontent = `<table border="0" cellspacing="0" style="color:#666666;border-radius:5px;border:solid 1px #efefef;width:100%; margin-top:20px"><tbody><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#fbfbfb;font-size:110%;font-weight:bold">Compliance ID</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#fbfbfb;font-size:110%">${event.id}</td></tr><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%;font-weight:bold">Country</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%">${event.countryname.replace(/ *\([^)]*\) */g, "")}</td></tr><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#fbfbfb;font-size:110%;font-weight:bold">Entity</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#fbfbfb;font-size:110%">${event.entityname.replace(/ *\([^)]*\) */g, "")}</td></tr><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%;font-weight:bold">Location</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%">${event.locationname.replace(/ *\([^)]*\) */g, "")}</td></tr><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#fbfbfb;font-size:110%;font-weight:bold">Statute</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#fbfbfb;font-size:110%">${(event.statute[0] ?? "")}</td></tr><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%;font-weight:bold">Subcategory</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%">${event.subcategory}</td></tr><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%;font-weight:bold">Reporter</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%">${event.reporters[0].split(';')[0]}</td></tr><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%;font-weight:bold">Approver</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%">${event.approvers[0].split(';')[0]}</td></tr><tr><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%;font-weight:bold">Due Date</td><td style="padding:10px;padding-top:10px;padding-bottom:10px;vertical-align:top;background-color:#f5f5f5;font-size:110%">${ddmmyyyy}</td></tr></tbody></table>`;
6070
-
6070
+
6071
6071
  let listReportingContainers = eventsContainer.querySelectorAll('.list-reporting-container') as NodeListOf<HTMLDivElement>
6072
6072
  for (let tempReportingContainer of listReportingContainers) {
6073
6073
  tempReportingContainer.style.display = 'none';
@@ -6097,7 +6097,7 @@ export class SfIEvents extends LitElement {
6097
6097
  }
6098
6098
  }
6099
6099
  listReportingContainer.innerHTML = html;
6100
- if(this._SfUploader[0] != null) {
6100
+ if (this._SfUploader[0] != null) {
6101
6101
  (this._SfUploader[0].querySelector('#uploader') as SfIUploader)!.emailcontent = emailcontent;
6102
6102
  }
6103
6103
  listReportingContainer.querySelector('.button-delete')?.addEventListener('click', async () => {
@@ -8040,15 +8040,15 @@ export class SfIEvents extends LitElement {
8040
8040
  this.csvDataRegisters += ('\n');
8041
8041
  }
8042
8042
  html += '<div class="w-100p scroll-x ' + (i != this.selectedRegisterIndex ? 'hide' : '') + ' register-body-' + i + '">';
8043
- html += '<table>';
8044
- let tablecols: string[] = []
8043
+ html += '<table>';
8044
+ let tablecols: string[] = []
8045
8045
  for (var j = 0; j < Object.keys(objCountry[statute]).length; j++) {
8046
8046
  const complianceId = Object.keys(objCountry[statute])[j];
8047
8047
  const compliance = objCountry[statute][complianceId];
8048
8048
  const data = JSON.parse(compliance.data);
8049
8049
  const cols = JSON.parse(compliance.cols);
8050
- for(let col of cols){
8051
- if(!tablecols.includes(col.toLowerCase()) && !this.EXCLUDE_COLS_FROM_REGS.includes(col.toLowerCase())){
8050
+ for (let col of cols) {
8051
+ if (!tablecols.includes(col.toLowerCase()) && !this.EXCLUDE_COLS_FROM_REGS.includes(col.toLowerCase())) {
8052
8052
  tablecols.push(col)
8053
8053
  }
8054
8054
  }
@@ -8065,23 +8065,23 @@ export class SfIEvents extends LitElement {
8065
8065
  // this.csvDataRegisters += ('",');
8066
8066
  }
8067
8067
  }
8068
- if(compliance['entities'] != null && Array.isArray(compliance['entities'])){
8068
+ if (compliance['entities'] != null && Array.isArray(compliance['entities'])) {
8069
8069
  let entities = '';
8070
- for(let entity of compliance['entities']){
8070
+ for (let entity of compliance['entities']) {
8071
8071
  entities += entity.split(';')[0].replace(/\([^)]*\)/g, "") + ','
8072
8072
  }
8073
8073
  entities = entities.slice(0, entities.length - 1)
8074
8074
  html += ('<td class="td-body" part="td-body-register"><span part="td-head" style="padding-left: 0px !important">entities</span><br /><sf-i-elastic-text text="' + entities + '" minLength="80" lineSize="4"></sf-i-elastic-text></td>');
8075
- // this.csvDataRegisters += ('"' + (data[k] + "").replace(/"/g, '') + '",');
8075
+ // this.csvDataRegisters += ('"' + (data[k] + "").replace(/"/g, '') + '",');
8076
8076
  }
8077
- if(compliance['locations'] != null && Array.isArray(compliance['locations'])){
8077
+ if (compliance['locations'] != null && Array.isArray(compliance['locations'])) {
8078
8078
  let locations = '';
8079
- for(let location of compliance['locations']){
8079
+ for (let location of compliance['locations']) {
8080
8080
  locations += location.split(';')[0].replace(/\([^)]*\)/g, "") + ','
8081
8081
  }
8082
8082
  locations = locations.slice(0, locations.length - 1)
8083
8083
  html += ('<td class="td-body" part="td-body-register"><span part="td-head" style="padding-left: 0px !important">locations</span><br /><sf-i-elastic-text text="' + locations + '" minLength="80" lineSize="4"></sf-i-elastic-text></td>');
8084
- // this.csvDataRegisters += ('"' + (data[k] + "").replace(/"/g, '') + '",');
8084
+ // this.csvDataRegisters += ('"' + (data[k] + "").replace(/"/g, '') + '",');
8085
8085
  }
8086
8086
  this.csvDataRegisters = this.csvDataRegisters.replace(/,\s*$/, "");
8087
8087
  this.csvDataRegisters += ('\n');
@@ -8091,7 +8091,7 @@ export class SfIEvents extends LitElement {
8091
8091
  // html += '</div>';
8092
8092
  }
8093
8093
  html += '</table>';
8094
- html += '</div>';
8094
+ html += '</div>';
8095
8095
 
8096
8096
  // html += '</table>';
8097
8097
  // html += '</div>';
@@ -12330,7 +12330,7 @@ export class SfIEvents extends LitElement {
12330
12330
 
12331
12331
  this.csvCompletenessStats = parameter + ",Not Started,In Progress,Complete,Rejected\n";
12332
12332
  for (var i = 0; i < dataBar['labels'].length; i++) {
12333
- this.csvCompletenessStats += dataBar['labels'][i].join(" ") + "," + dataBar['datasets'][3]['data'][i] + "," + dataBar['datasets'][1]['data'][i] + "," + dataBar['datasets'][0]['data'][i] + "," + dataBar['datasets'][2]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\n" : "");
12333
+ this.csvCompletenessStats += "\"" + dataBar['labels'][i].join(" ") + "\",\"" + dataBar['datasets'][3]['data'][i] + "\",\"" + dataBar['datasets'][1]['data'][i] + "\",\"" + dataBar['datasets'][0]['data'][i] + "\",\"" + dataBar['datasets'][2]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\"\n" : "");
12334
12334
  }
12335
12335
 
12336
12336
  console.log('rendering csv completeness', dataBar, this.csvCompletenessStats);
@@ -12343,7 +12343,7 @@ export class SfIEvents extends LitElement {
12343
12343
 
12344
12344
  this.csvTimelinessStats = parameter + ",In Time,Past Due Date,Late Approved,Late Executed,Late Reported\n";
12345
12345
  for (var i = 0; i < dataBar['labels'].length; i++) {
12346
- this.csvTimelinessStats += dataBar['labels'][i].join(" ") + "," + dataBar['datasets'][0]['data'][i] + "," + dataBar['datasets'][1]['data'][i] + "," + dataBar['datasets'][3]['data'][i] + "," + dataBar['datasets'][2]['data'][i] + "," + dataBar['datasets'][4]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\n" : "");
12346
+ this.csvTimelinessStats += "\"" + dataBar['labels'][i].join(" ") + "\",\"" + dataBar['datasets'][0]['data'][i] + "\",\"" + dataBar['datasets'][1]['data'][i] + "\",\"" + dataBar['datasets'][3]['data'][i] + "\",\"" + dataBar['datasets'][2]['data'][i] + "\",\"" + dataBar['datasets'][4]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\"\n" : "");
12347
12347
  }
12348
12348
 
12349
12349
  //console.log('rendering csv csvTimelinessStats', this.csvTimelinessStats);
@@ -12352,9 +12352,9 @@ export class SfIEvents extends LitElement {
12352
12352
 
12353
12353
  renderComplianceCsvForGraph = (dataBar: any, parameter: string) => {
12354
12354
 
12355
- this.csvComplianceStats = parameter + ",Scheduled,Not Complied,Partially Complied,Complied\n";
12355
+ this.csvComplianceStats = parameter + ",Scheduled,Not Complied,Partially Complied,Complied,Complied With Gaps,Reported Non Compliance\n";
12356
12356
  for (var i = 0; i < dataBar['labels'].length; i++) {
12357
- this.csvComplianceStats += dataBar['labels'][i].join(" ") + "," + dataBar['datasets'][0]['data'][i] + "," + dataBar['datasets'][1]['data'][i] + "," + dataBar['datasets'][3]['data'][i] + "," + dataBar['datasets'][2]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\n" : "");
12357
+ this.csvComplianceStats += "\"" + dataBar['labels'][i].join(" ") + "\",\"" + dataBar['datasets'][0]['data'][i] + "\",\"" + dataBar['datasets'][1]['data'][i] + "\",\"" + dataBar['datasets'][2]['data'][i] + "\",\"" + dataBar['datasets'][3]['data'][i] + "\",\"" + dataBar['datasets'][4]['data'][i] + "\",\"" + dataBar['datasets'][5]['data'][i] + (i < (dataBar['labels'].length - 1) ? "\"\n" : "");
12358
12358
  }
12359
12359
 
12360
12360
  //console.log('rendering csv csvComplianceStats', this.csvComplianceStats);
@@ -12529,7 +12529,7 @@ export class SfIEvents extends LitElement {
12529
12529
  }
12530
12530
 
12531
12531
  this.csvGraphStats += 'Compliance,Scheduled,Not Complied,Partially Complied,Complied,Complied With Gaps,Reported Non Compliance,Total\n';
12532
- this.csvGraphStats += 'Count,' + parseInt(dataScheduled) + ',' + parseInt(dataNotComplied) + ',' + parseInt(dataPartiallyComplied) + ',' + parseInt(dataComplied) + ',' + parseInt(dataCompliedWithGaps) + ',' + parseInt(dataReportedNonComplaince) + ',' + parseInt(dataTotal) + '\n';
12532
+ this.csvGraphStats += 'Count,' + parseInt(dataScheduled) + ',' + parseInt(dataNotComplied) + ',' + parseInt(dataPartiallyComplied) + ',' + parseInt(dataCompliedWithGaps) + ',' + parseInt(dataComplied) + ',' + parseInt(dataReportedNonComplaince) + ',' + parseInt(dataTotal) + '\n';
12533
12533
  }
12534
12534
 
12535
12535
  //console.log('rendering timeliness graph', this.csvGraphStats);
@@ -12868,18 +12868,18 @@ export class SfIEvents extends LitElement {
12868
12868
 
12869
12869
  renderPieCsv = (pieData: any, csv: string, param: string) => {
12870
12870
 
12871
- csv += param + ','
12871
+ csv += '"' + param + '",'
12872
12872
  for (var i = 0; i < Object.keys(pieData).length; i++) {
12873
- csv += (Object.keys(pieData)[i])
12873
+ csv += '"' + (Object.keys(pieData)[i]) + '"'
12874
12874
  if (i < (Object.keys(pieData).length - 1)) {
12875
12875
  csv += ','
12876
12876
  }
12877
12877
  }
12878
12878
  csv += '\n'
12879
12879
 
12880
- csv += 'Count,'
12880
+ csv += '"Count",'
12881
12881
  for (var i = 0; i < Object.keys(pieData).length; i++) {
12882
- csv += (pieData[Object.keys(pieData)[i]])
12882
+ csv += '"' + (pieData[Object.keys(pieData)[i]]) + '"'
12883
12883
  if (i < (Object.keys(pieData).length - 1)) {
12884
12884
  csv += ','
12885
12885
  }
@@ -12973,7 +12973,7 @@ export class SfIEvents extends LitElement {
12973
12973
  // let username = this.userName;
12974
12974
  let filterString = `countryid="${this.countryId}" locationid="${this.locationId}" entityid="${this.entityId}" tagid="${this.tagId}" selectedcriteria="${this.selectedCriteria}"`;
12975
12975
  let rolestr = "viewer"
12976
- ;
12976
+ ;
12977
12977
  if (filter == "reporter" || filter == "approver" || filter == "functionhead") {
12978
12978
  userid = filterid;
12979
12979
  // username = filtervalue;
@@ -13063,7 +13063,7 @@ export class SfIEvents extends LitElement {
13063
13063
  for (var i = 0; i < itemsCompliance.length; i++) {
13064
13064
  itemsCompliance[i].style.display = 'none';
13065
13065
  }
13066
- if(filterstatus != ""){
13066
+ if (filterstatus != "") {
13067
13067
  this.processGraphFilter(filterstatus, divContainer);
13068
13068
  }
13069
13069
  (this._SfDetailListContainer as HTMLDivElement).querySelector('#button-detail-close')?.addEventListener('click', () => {
@@ -16910,7 +16910,7 @@ export class SfIEvents extends LitElement {
16910
16910
  html += '<div part="detail-summary">';
16911
16911
  html += ('<div part="detail-summary-title" class="pl-20 pr-20"><h1>' + event['obligationtitle'] + '</h1></div>');
16912
16912
  html += ('<div part="detail-summary-subtitle" class="pl-20 pr-20"><h3>' + event['obligation'].replace(/\n/g, '<br />') + '</h3></div>');
16913
- html += ('<div part="detail-summary-content" class="pl-20 pr-20">' + ('<sf-i-elastic-text text="' + (event['internalcontrols'] + "").replace(/"/g, "").replace(/\n/g, '<br />') + '" minLength="80"></sf-i-elastic-text>') + '</div>');
16913
+ html += ('<div part="detail-summary-content" class="pl-20 pr-20 pt-20">' + ('<sf-i-elastic-text text="' + (event['internalcontrols'] + "").replace(/"/g, "").replace(/\n/g, '<br />') + '" minLength="80"></sf-i-elastic-text>') + '</div>');
16914
16914
  html += '</div>';
16915
16915
 
16916
16916
  html += '<br />';
@@ -17053,7 +17053,12 @@ export class SfIEvents extends LitElement {
17053
17053
  html += '<div class="m-20">';
17054
17054
  html += '<div part="detail-head"><strong>' + complianceFields[i] + '</strong></div>'
17055
17055
  for (let attachmentStr of event[complianceFields[i]]) {
17056
- let attachment = JSON.parse(attachmentStr + "");
17056
+ let attachment:any = {};
17057
+ if(typeof attachmentStr === "object"){
17058
+ attachment = attachmentStr;
17059
+ }else{
17060
+ attachment = JSON.parse(attachmentStr + "");
17061
+ }
17057
17062
  html += `<sf-i-uploader class="event-attachment" max="10" apiid="1peg5170d3" allowedextensions="[&quot;jpg&quot;,&quot;png&quot;,&quot;pdf&quot;,&quot;xls&quot;,&quot;xlsx&quot;,&quot;doc&quot;,&quot;docx&quot;]" prepopulatedInputArr="${JSON.stringify([{ "key": attachment.key, "ext": attachment.ext }]).replace(/"/g, '&quot;')}" projectid="${this.projectId} " extract="no" mode="view" maximize="yes" hidepreview="yes" displaydetail="yes"></sf-i-uploader>`
17058
17063
  }
17059
17064
  html += '</div>';
@@ -23259,6 +23264,53 @@ export class SfIEvents extends LitElement {
23259
23264
  }
23260
23265
 
23261
23266
  csvToHtmlTable = (strCsv: string) => {
23267
+ const htmlRows = [];
23268
+ const lines = strCsv.trim().split(/\r?\n/);
23269
+
23270
+ const parseCsvLine = (line: string): string[] => {
23271
+ const result = [];
23272
+ let current = '';
23273
+ let inQuotes = false;
23274
+
23275
+ for (let i = 0; i < line.length; i++) {
23276
+ const char = line[i];
23277
+ const nextChar = line[i + 1];
23278
+
23279
+ if (char === '"' && inQuotes && nextChar === '"') {
23280
+ current += '"'; // escaped quote
23281
+ i++; // skip next quote
23282
+ } else if (char === '"') {
23283
+ inQuotes = !inQuotes;
23284
+ } else if (char === ',' && !inQuotes) {
23285
+ result.push(current);
23286
+ current = '';
23287
+ } else {
23288
+ current += char;
23289
+ }
23290
+ }
23291
+ result.push(current);
23292
+ return result;
23293
+ };
23294
+
23295
+ htmlRows.push('<br />' + parseCsvLine(lines[0])[0] + '<br /><br />');
23296
+ htmlRows.push('<table>');
23297
+
23298
+ lines.forEach((line, index) => {
23299
+ const cells = parseCsvLine(line);
23300
+ const tag = index === 0 ? 'th' : 'td';
23301
+ htmlRows.push('<tr>');
23302
+ cells.forEach(cell => {
23303
+ htmlRows.push(`<${tag} class="${tag === 'td' ? 'text-center' : ''}">${cell}</${tag}>`);
23304
+ });
23305
+ htmlRows.push('</tr>');
23306
+ });
23307
+
23308
+ htmlRows.push('</table>');
23309
+ return htmlRows.join('');
23310
+ };
23311
+
23312
+
23313
+ csvToHtmlTable1 = (strCsv: string) => {
23262
23314
 
23263
23315
  var html = '';
23264
23316
 
@@ -24621,7 +24673,7 @@ export class SfIEvents extends LitElement {
24621
24673
  value: clickedValue
24622
24674
  };
24623
24675
  (streamEventFilters as HTMLDivElement).style.display = 'block';
24624
- (streamEventFilters as HTMLDivElement).innerHTML = '<div part="badge-dashboard" class="d-flex align-center justify-between mr-10 mb-10 no-shrink"><div><span>Filtered by</span>&nbsp;&nbsp;<span id="graph-total" part="badge-filter-name">' + clickedValue + '</span></div>' + (detailsListContainer == null ? '<button id="button-filter-cancel" part="button-icon"><span class="material-symbols-outlined">close</span></button>':'') + '</div>';
24676
+ (streamEventFilters as HTMLDivElement).innerHTML = '<div part="badge-dashboard" class="d-flex align-center justify-between mr-10 mb-10 no-shrink"><div><span>Filtered by</span>&nbsp;&nbsp;<span id="graph-total" part="badge-filter-name">' + clickedValue + '</span></div>' + (detailsListContainer == null ? '<button id="button-filter-cancel" part="button-icon"><span class="material-symbols-outlined">close</span></button>' : '') + '</div>';
24625
24677
  (streamEventFilters as HTMLDivElement).querySelector('#button-filter-cancel')?.addEventListener('click', () => {
24626
24678
  this.graphFilter = "";
24627
24679
  this.clearSelectedGraphParam();
@@ -28057,14 +28109,14 @@ export class SfIEvents extends LitElement {
28057
28109
  } else {
28058
28110
  view = "entity";
28059
28111
  }
28060
-
28112
+
28061
28113
  path = "getallcountryevents";
28062
28114
 
28063
28115
  let url = "https://" + this.apiId + "/" + path;
28064
28116
  let temptagid = tagid;
28065
- if(temptagid == "" && locationid != "") {
28117
+ if (temptagid == "" && locationid != "") {
28066
28118
  temptagid = locationid
28067
- }else if(temptagid == "" && userprofileid != this.userProfileId) {
28119
+ } else if (temptagid == "" && userprofileid != this.userProfileId) {
28068
28120
  temptagid = "allevents"
28069
28121
  }
28070
28122
  //console.log('fetch calendar url', url);