Skip to content

Instantly share code, notes, and snippets.

@psantos9
Last active October 6, 2024 11:46
Show Gist options
  • Select an option

  • Save psantos9/48d7e2fd1d3777d8d3d39a9a307a2bd6 to your computer and use it in GitHub Desktop.

Select an option

Save psantos9/48d7e2fd1d3777d8d3d39a9a307a2bd6 to your computer and use it in GitHub Desktop.
(()=>{"use strict";class e{getRelationDefinition(e,t){const s=e.relationMapping[t].persistedName;return s in e.relations?e.relations[s]:(console.warn(`Relation ${s} could not be found in enrichedDataModel.relations`),null)}isConstrainingRelation(e,t){const s=this.getRelationDefinition(e,t);return!!s&&s&&!!s.constrainingRelations&&s.constrainingRelations.length>0}}const t="_allMessages_";class s{constructor(){this.parentWindow=window.parent,this.parentOrigin="*",this.listeners={},window.addEventListener("message",this.messageListener.bind(this))}sendToParent(e,t){try{if(t){const t=e.id||String(Date.now()+Math.random()),s=this.listenOnce(t);return this.sendToParent(Object.assign(Object.assign({},e),{id:t})),s}return void this.parentWindow.postMessage(e,this.parentOrigin)}catch(t){throw console.error("Error while sending message to parent:",e.id,t),t}}registerListener(e=t,s,n=!1){this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push({listener:s,callOnError:n})}deRegisterListener(e=t,s){s?this.listeners[e]=this.listeners[e].filter((e=>e.listener===s)):delete this.listeners[e]}deRegisterAllListeners(){Object.keys(this.listeners).forEach((e=>{this.deRegisterListener(e)}))}listenOnce(e=t){return new Promise(((t,s)=>{const n=(r,i)=>{i?s(r):t(r),this.deRegisterListener(e,n)};this.registerListener(e,n,!0)}))}messageListener(e){if(e.source===this.parentWindow||window.isStorybookInstance){this.parentOrigin=e.origin;const s=e.data;this.callListeners(e.data.id,s),this.callListeners(t,s)}}callListeners(e,t){const s=this.listeners[e];s&&s.forEach((s=>{t.success?this.invokeCallback(e,(()=>s.listener(t.data))):s.callOnError?this.invokeCallback(e,(()=>s.listener(t.data,!0))):console.error(t.data)}))}invokeCallback(e,t){try{t()}catch(t){this.showError(t.toString(),"Internal report error while processing "+e)}}showError(e,t="errors.inReport"){this.sendToParent({action:"show-toastr",params:{type:"error",message:e,title:t}})}}function n(e,t,s=null){if(Object.hasOwnProperty.call(e,t))return e[t];const n=t.split(/[,[\].]+?/).filter(Boolean);return n.length>0?n.reduce(((e,t)=>e&&Object.hasOwnProperty.call(e,t)?e[t]:s),e):void 0}function r(e){return!(!e||"[object Function]"!=={}.toString.call(e))}function i(e,t){if(Object.hasOwnProperty.call(e,t))e[t]=void 0;else{const s=t.split(/[,[\].]+?/).filter(Boolean),r=s.pop(),i=n(e,s.join("."));i&&Object.hasOwnProperty.call(i,r)&&(i[r]=void 0)}}function o(e){if(Array.isArray(e)){const t=[...e];for(let e=0;e<t.length;e++)t[e]=o(t[e]);return t}if("object"==typeof e){const t=Object.assign({},e);return Object.keys(t).forEach((e=>{t[e]=o(t[e])})),t}return e}class a{constructor(){this.messenger=new s,this.facetsConfigs=[]}showPopover(e){if(!this.facetsConfigs.every((e=>this.attributesPresentInConfig(e,["id","type"]))))throw new Error("The attributes 'id' and 'type' are mandatory for displaying report popover dialogs.");return this.messenger.sendToParent({action:"table.show-popover",params:e})}hidePopover(){return this.messenger.sendToParent({action:"table.hide-popover"})}setFacetsConfig(e,t){this.facetsConfigs[t]=e}attributesPresentInConfig(e,t){var s;var n,r,i;return 0===(r=t,i=(n=(null!==(s=e.attributes)&&void 0!==s?s:[]).map((e=>{for(;/{/.test(e);)e=e.replace(/{[^{]*?}/g,"");return e.split(/ +/)})),(n||[]).reduce(((e,t)=>e.concat(t)),[])).filter(Boolean),[r||[],i||[]].reduce(((e,t)=>e.filter((e=>!t.includes(e)))))).length}}var l=function(e,t,s,n){return new(s||(s=Promise))((function(r,i){function o(e){try{l(n.next(e))}catch(e){i(e)}}function a(e){try{l(n.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,a)}l((n=n.apply(e,t||[])).next())}))};const c=new class{get latestPublishedState(){return this._latestPublishedState}constructor(){this.table=new a,this.dataModelHelpers=new e,this.messenger=new s,this.latestFacetsResults=[],this._latestPublishedState=null,this.customDropdownCallbacks={},this.latestMouseEvent={clientX:0,clientY:0},this.latestFocusedElement=null,document.addEventListener("mousemove",(e=>{this.latestMouseEvent=e}),!1),document.addEventListener("mousedown",(e=>{this.latestMouseEvent=e}),!1)}init(){const e=this.mountSetupCallback();return this.messenger.sendToParent({action:"INIT",params:{version:"$LX_REPORT_LIB_VERSION$"}}),this.mountDomEventPublishing(),this.mountErrorEventPublishing(),e}ready(e={}){this.translateHtmlTags();const t=this.createReportRequirements(e);this.messenger.sendToParent({action:"READY",params:{requirements:t}})}get currentSetup(){return this._currentSetup?this._currentSetup:(console.warn("No current setup available. Please make sure to call init() before accessing the current setup."),{})}updateConfiguration(e){this.messenger.deRegisterAllListeners();const t=this.createReportRequirements(e);this.messenger.sendToParent({action:"UPDATE_REQUIREMENTS",params:{requirements:t}})}updateTableConfig(e){this.messenger.sendToParent({action:"table-config",params:e})}executeGraphQL(e,t){return this.messenger.sendToParent({action:"executeGraphQL",params:{query:e,variables:t}},!0)}getProjections(e,t,s){return this.messenger.sendToParent({action:"getProjections",params:{attributes:e,filters:t,pointsOfView:s}},!0)}getAllFactSheets(e,t,s,n,r){return this.messenger.sendToParent({action:"getAllFactSheets",params:{factSheetType:e,attributes:t,facetSelection:s,pointsOfView:n,options:r}},!0)}getMetricsMeasurements(e=!1){return this.messenger.sendToParent({action:"getMetricsMeasurements",params:{nameOnly:e}},!0)}getMetricsRawSeries(e){return this.messenger.sendToParent({action:"getMetricsRawSeries",params:{query:e}},!0)}executeParentOriginXHR(e,t,s={},n="text",r=!1){const i={};return r&&(i["x-gateway-handle-request"]="EXTENDED"),this.messenger.sendToParent({action:"parentOriginXHR",params:{path:t,method:e,body:s,responseType:n,headers:i}},!0)}getFilterResult(){return this.latestFacetsResults}requestFactSheetSelection(e){return this.messenger.sendToParent({action:"fs-selection",params:e}),this.messenger.listenOnce("fs-selection.result").then((e=>e.results))}openFormModal(e,t,s){return"object"==typeof t?this.doOpenFormModal({fields:e,values:t},s):this.doOpenFormModal(e,t)}doOpenFormModal(e,t){return t&&this.mountFormModalUpdate(t),this.messenger.sendToParent({action:"form-modal",params:e}),this.messenger.listenOnce("form-modal.result")}openSidePane(e,t,s){t&&this.mountSidepaneFactSheetUpdate(t),s&&this.mountSidepaneClick(s),this.latestFocusedElement=document.activeElement,this.mountSidepaneClose(),this.messenger.sendToParent({action:"side-pane",params:{sidePaneElements:e,mouse:{clientX:this.latestMouseEvent.clientX,clientY:this.latestMouseEvent.clientY}}})}openLink(e,t){this.messenger.sendToParent({action:"open-link",params:{url:e,mouse:{clientX:this.latestMouseEvent.clientX,clientY:this.latestMouseEvent.clientY}}})}openRouterLink(e){this.messenger.sendToParent({action:"open-router-link",params:{url:e}})}navigateToInventory(e){this.messenger.sendToParent({action:"navigate-inventory",params:{filters:e}})}publishState(e){this._latestPublishedState=e,this.messenger.sendToParent({action:"state-changed",params:{state:e}})}openReportInNewTab(e,t,s){this.messenger.sendToParent({action:"open-in-new-tab",params:{state:e,facetSelection:t,name:s}})}showSpinner(){this.messenger.sendToParent({action:"change-spinner-state",params:{visible:!0}})}hasPermission(e){return this.messenger.sendToParent({action:"has-permission",params:{permissions:e}}),this.messenger.listenOnce("has-permission.result")}hideSpinner(){this.messenger.sendToParent({action:"change-spinner-state",params:{visible:!1}})}showEditToggle(){this.messenger.sendToParent({action:"change-edit-toggle-visibility",params:{visible:!0}})}hideEditToggle(){this.messenger.sendToParent({action:"change-edit-toggle-visibility",params:{visible:!1}})}sendExcludedFactSheets(e){this.messenger.sendToParent({action:"excluded-data-changed",params:{excludedData:e}})}showLegend(e){this.messenger.sendToParent({action:"show-legend",params:{items:e}})}showToastr(e,t,s){this.messenger.sendToParent({action:"show-toastr",params:{type:e,message:t,title:s}})}trackReportEvent(e){this.messenger.sendToParent({action:"track-event",params:e})}translateCustomKey(e,t={}){const s=this._currentSetup.settings.translations.custom;if(!s)return e;const r=n(s,e);return r?r&&"string"==typeof r?this.replaceInterpolations(r,t):r:(console.warn(`${e} not found in translations`),e)}translateFactSheetType(e,t="singular"){if(!this._currentSetup.settings.translations.factSheetTypes)return e;const s=e+"."+t;return this._currentSetup.settings.translations.factSheetTypes[s]||e}translateField(e,t){var s,n,r,i;return null!==(i=null===(r=null===(n=null===(s=this._currentSetup.settings.translations)||void 0===s?void 0:s.fields[e])||void 0===n?void 0:n[t])||void 0===r?void 0:r.label)&&void 0!==i?i:t}translateFieldValue(e,t,s){var n,r,i,o,a;const l=this._currentSetup.settings.translations;return null!==(a=null===(o=null===(i=null===(r=null===(n=null==l?void 0:l.fields[e])||void 0===n?void 0:n[t])||void 0===r?void 0:r.values)||void 0===i?void 0:i[s])||void 0===o?void 0:o.label)&&void 0!==a?a:s}translateRelation(e){var t,s,n;return null!==(n=null===(s=null===(t=this._currentSetup.settings.translations)||void 0===t?void 0:t.relations[e])||void 0===s?void 0:s.label)&&void 0!==n?n:e}translateRelationField(e,t){var s,n,r,i;return null!==(i=null===(r=null===(n=null===(s=this._currentSetup.settings.translations)||void 0===s?void 0:s.relations[e])||void 0===n?void 0:n.fields[t])||void 0===r?void 0:r.label)&&void 0!==i?i:t}translateRelationFieldValue(e,t,s){var n,r,i,o,a;return null!==(a=null===(o=null===(i=null===(r=null===(n=this._currentSetup.settings.translations)||void 0===n?void 0:n.relations[e])||void 0===r?void 0:r.fields[t])||void 0===i?void 0:i.values[s])||void 0===o?void 0:o.label)&&void 0!==a?a:s}isFeatureEnabled(e){const t=this._currentSetup.settings.features.find((t=>t.id===e));if(t){if("FUNCTIONAL"===t.type)return Promise.resolve("ENABLED"===t.status);if("QUOTA"===t.type)return Promise.resolve(0!==t.quota)}return Promise.resolve(!1)}formatCurrency(e,t=0,s,n){const r=this._currentSetup.settings.currency;try{let i={style:"currency",currency:r.code,minimumFractionDigits:t};return s&&(i=Object.assign(Object.assign({},i),{notation:"compact",compactDisplay:"short"})),new Intl.NumberFormat(n,i).format(e)}catch(t){return`${r.symbol}${e}`}}getFactSheetFieldMetaData(e,t){var s;const n=this._currentSetup.settings.viewModel.factSheets.find((t=>t.type===e));return null===(s=null==n?void 0:n.fieldMetaData)||void 0===s?void 0:s[t]}getFactSheetRelationFieldMetaData(e,t,s){var n;const r=this._currentSetup.settings.viewModel.factSheets.find((t=>t.type===e));return(null===(n=null==r?void 0:r.fieldMetaData)||void 0===n?void 0:n[t])[s]}createReportRequirements(e){const t=this.mountCallbacks(e);return Object.assign({},t,{showView:!!e.reportViewCallback})}mountCallbacks(e){let t=o(e);return t=this.mountCallback(t,"report-view-changed","reportViewCallback"),t=this.mountCallback(t,"configure","menuActions.configureCallback"),t=this.mountTableConfigCallback(t),t=this.mountExportDataCallback(t),t=this.mountCallback(t,"toggle-editing","toggleEditingCallback"),t=this.mountCustomDropdownSelectionCallbacks(t),t=this.mountUISelectionCallback(t),e&&e.facets&&(t.facets=e.facets.map(((e,t)=>this.mountFacetsCallbacks(e,t)))),this.validateConfig(t),t}mountUISelectionCallback(e){return e.ui&&(e=this.mountUISelectionUpdateCallback(e)).ui&&e.ui.elements&&(e.ui.elements.root.items=this.mountUIElementsButtonClickCallback(e.ui.elements.root.items)),e}mountUISelectionUpdateCallback(e){if(this.messenger.deRegisterListener("ui-selection.update"),!e.ui)return e;const t=e.ui.update;return this.messenger.registerListener("ui-selection.update",(e=>{const s={facets:e.facets,timeline:e.timeline,dropdowns:e.dropdowns,elements:e.elements};Promise.resolve(t(s)).then((t=>{t&&(t.elements&&(t.elements.root.items=this.mountUIElementsButtonClickCallback(t.elements.root.items)),this.messenger.sendToParent({action:"ui-configuration.update",params:{configuration:t,selectionId:e.selectionId}}))}))})),i(e,"ui.update"),e}mountUIElementsButtonClickCallback(e){for(const t of e)if("button"===t.type)this.mountUIButtonCallback(t);else if("buttonGroup"===t.type)for(const e of t.buttons)this.mountUIButtonCallback(e);else"container"===t.type&&(t.items=this.mountUIElementsButtonClickCallback(t.items));return e}mountUIButtonCallback(e){const t=`ui-button.click.${e.id}`;this.messenger.deRegisterListener(t);const s=e.click;s&&(this.messenger.registerListener(t,(()=>s())),i(e,"click"))}mountFacetsCallbacks(e,t){let s=e;if(e.callback){const t=this.mountFacetsResultCallback(e.key,e.callback);s=Object.assign(Object.assign({},e),{callback:t})}if(e.facetChangedCallback){const n="facet-changed."+t;this.messenger.registerListener(n,e.facetChangedCallback),s=Object.assign(Object.assign({},s),{facetChangedCallback:n})}if(e.facetFiltersChangedCallback){const n="facet-filters-changed."+t;this.messenger.registerListener(n,e.facetFiltersChangedCallback),s=Object.assign(Object.assign({},s),{facetFiltersChangedCallback:n})}return this.table.setFacetsConfig(e,t),s}mountFacetsResultCallback(e,t){const s="facets.callback."+e;return this.messenger.registerListener(s,(e=>{this.latestFacetsResults=e.facetsResults,t(e.facetsResults)})),s}validateConfig(e){Object.keys(e).filter((t=>"function"==typeof e[t])).forEach((e=>{console.error(`ERROR: '${e}' does not seem to belong in report config`)}))}mountSetupCallback(){return new Promise(((e,t)=>{this.messenger.listenOnce("setup").then((s=>{const n=this.getLocationQuery();location.search||console.error('No location query! location.search="'+location.search+'"');let r=n.reportId;if(window.isStorybookInstance&&(r=null!=r?r:s.reportId),s.reportId===r){this._currentSetup=s;const t={reportId:s.reportId,bookmarkName:s.bookmarkName,config:s.config,settings:{baseUrl:s.settings.baseUrl,environment:s.settings.environment,viewModel:s.settings.viewModel,dataModel:s.settings.dataModel,tagModel:s.settings.tagModel,factSheetPermissions:s.settings.factSheetPermissions,translations:s.settings.translations,impactConfiguration:s.settings.impactConfiguration,currency:s.settings.currency,currentUser:s.settings.currentUser,language:s.settings.language,workspace:s.settings.workspace,page:s.settings.page,mtmWorkspaceSettings:s.settings.mtmWorkspaceSettings},savedState:s.savedState};e(t)}else t(`Report ID mismatch: '${r}' != 'reportSetup.reportId' (${s.reportId})`)}))}))}mountCustomDropdownSelectionCallbacks(e){return e.menuActions&&e.menuActions.customDropdowns&&(e.menuActions.customDropdowns.forEach((e=>{const t={};e.entries.forEach((e=>{const s=e.callback;t[e.id]=()=>null==s?void 0:s(e),i(e,"callback")})),this.customDropdownCallbacks[e.id]=t})),this.messenger.registerListener("custom-dropdown-selection",(e=>{const t=this.customDropdownCallbacks[e.dropdownId];if(t){const s=t[e.entryId];s?s():console.warn("Callback for ",e," could not be found!")}else console.warn("Callback for ",e," could not be found!")}))),e}mountExportDataCallback(e){const t=o(e);return this.messenger.registerListener("request-export-data",(e=>{var s;t.export&&e&&(t.export.format=(null===(s=e.paperSize)||void 0===s?void 0:s.format)||t.export.format||"a4",t.export.orientation=e.orientation||"landscape",t.export.usage=e.usage||"thumbnail"),this.createReportExportData(t).then((e=>{e?this.messenger.sendToParent({action:"export-data",params:e}):console.error("[EXPORT ERROR]: Exportable element not found in the DOM.")}))})),i(e,"export.beforeExport"),e}mountTableConfigCallback(e){const t=e=>{this.messenger.sendToParent({action:"table-config",params:e})};if(e.tableConfigCallback){const s=e.tableConfigCallback;e.tableConfigCallback=()=>{const e=s();return t(e),e}}else e.tableConfigCallback=()=>{const e={factSheetType:"Default",attributes:[]};return t(e),e};return this.mountCallback(e,"request-table-config","tableConfigCallback")}mountFormModalUpdate(e){this.messenger.deRegisterListener("form-modal.update"),this.messenger.registerListener("form-modal.update",(t=>{const s=e(t);this.messenger.sendToParent({action:"form-modal",params:s})}))}mountSidepaneFactSheetUpdate(e){this.messenger.deRegisterListener("sidepane-fact-sheet.update"),this.messenger.registerListener("sidepane-fact-sheet.update",(t=>{e(t)}))}mountSidepaneClick(e){this.messenger.deRegisterListener("sidepane-fact-sheet.click"),this.messenger.registerListener("sidepane-fact-sheet.click",(t=>{e(t)}))}mountSidepaneClose(){this.messenger.deRegisterListener("sidepane-fact-sheet.close"),this.messenger.registerListener("sidepane-fact-sheet.close",(()=>{this.latestFocusedElement&&this.latestFocusedElement.focus&&this.latestFocusedElement.focus()}))}mountCallback(e,t,s){const r=n(e,s)||(()=>{});return this.messenger.deRegisterListener(t),this.messenger.registerListener(t,r),i(e,s),e}getLocationQuery(){return(location.search?location.search.slice(1).split("&"):[]).map((function(e){const t=e.split("=");return[t[0],decodeURI(t[1])]})).reduce(((e,t)=>{if(t[1]){const s={};return s[t[0]]=t[1],Object.assign(e,s)}return e}),{})}createReportExportData(e){return l(this,void 0,void 0,(function*(){const t=e.export||{};t.inputType=t.inputType||"HTML",t.exportElementSelector=t.exportElementSelector||("SVG"===t.inputType?"svg":"body");const s=t.exportElementSelector;let n=yield this.waitForElement(s);if(!n)return null;const r=n.getAttribute("class");n.setAttribute("class",`${r} forExport`);const i=t.orientation||"landscape";let o;yield this.encodeAllImages(n,t.inputType),e.export&&e.export.beforeExport&&(n=yield e.export.beforeExport(n,e.export)),o="svg"!==n.nodeName.toLowerCase()&&"SVG"!==t.inputType?n.outerHTML:(new XMLSerializer).serializeToString(n),o=o.replace(/<a.*?>(.*?)<\/a>/g,"$1");const a=yield this.getCurrentStyles(),l=!!t.fitVertically,c=void 0!==t.fitHorizontally?!!t.fitHorizontally:!!t.autoScale;return{data:o,styles:a,inputType:t.inputType,paperSize:{format:t.format||"a4"},orientation:i,fitHorizontally:c,fitVertically:l}}))}getCurrentStyles(){const e=Array.from(document.styleSheets).map((e=>{let t;try{t=e.cssRules}catch(e){if("SecurityError"!==e.name)throw e;console.warn(e)}if(t){const e=Array.from(t).map((e=>e.cssText)).join(" ");return Promise.resolve(e)}if(e.href&&0===e.href.indexOf(location.origin))return this.executeParentOriginXHR("GET",e.href).then((e=>e.body)).catch((e=>(console.error(e),"")))}));return Promise.all(e).then((e=>e.join(" ")))}encodeAllImages(e,t){const s=[];return Array.from(e.querySelectorAll("img")).forEach((e=>{this.encodeImage(e)})),"SVG"===t&&Array.from(e.querySelectorAll("image")).forEach((e=>{s.push(this.encodeSvgImage(e))})),Promise.all(s)}encodeImage(e){const t=document.createElement("canvas");t.width=e.width,t.height=e.height;const s=t.getContext("2d");s&&s.drawImage(e,0,0),e.src=t.toDataURL("image/png")}encodeSvgImage(e){const t=e.width.baseVal.value,s=e.height.baseVal.value,n=e.href.baseVal,r=document.createElement("img");return r.setAttribute("crossorigin","Anonymous"),r.setAttribute("width",t.toString()),r.setAttribute("height",s.toString()),r.setAttribute("src",n),new Promise((t=>{r.addEventListener("load",(()=>{this.encodeImage(r),e.setAttribute("href",r.src),t({baseVal:n,encodedVal:r.src})}))}))}translateHtmlTags(){Array.from(document.querySelectorAll("[data-lxtranslate]")).forEach((e=>{const t=e.getAttribute("data-lxtranslate");t&&(e.innerHTML=this.translateCustomKey(t))}))}replaceInterpolations(e,t={}){return e?e.replace(/{{[^}]+}}/g,(e=>{const s=e.slice(2,-2).trim();return s in t?t[s]:(console.warn(`The interpolation '${e}' is not supported`),e)})):e}mountDomEventPublishing(){["keyup","click","mousedown"].forEach((e=>{document.addEventListener(e,(e=>{const t=function(e={},t){const s={},n=r(t)?t:e=>null!==e&&!1!==e&&void 0!==e&&!Number.isNaN(e);for(const t in e)e&&n(e[t])&&(s[t]=e[t]);return s}(e,(e=>{return!(null!==(t=e)&&"object"==typeof t||r(e));var t}));this.messenger.sendToParent({action:"dom-event",params:t})}))}))}mountErrorEventPublishing(){window.addEventListener("error",(e=>{const t={message:e.message,error:e.error,filename:e.filename,colno:e.colno,lineno:e.lineno,timeStamp:e.timeStamp};this.messenger.sendToParent({action:"error-event",params:t})}))}waitForElement(e,t=0){return new Promise((s=>{setTimeout((()=>l(this,void 0,void 0,(function*(){const n=document.querySelector(e);s(n?n.cloneNode(!0):t<60?yield this.waitForElement(e,t+1):null)}))),1e3)}))}};window.lxHacked=c})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment