{"version":3,"sources":["maps/js/js/Pendo.js","maps/js/js/PrintBirtReport.js","maps/js/utils/js/utils/Dwr.js","maps/js/js/utils.js","maps/js/utils/js/utils/MathUtils.js","maps/js/utils/js/utils/DateTimeUtils.js","maps/js/utils/js/utils/ExtUtils.js","maps/js/jwt-decode/js/jwt-decode/jwt-decode.js","maps/js/apiClient/js/apiClient/ApiClient.js","maps/js/utils/validator/js/utils/validator/email.js","maps/js/utils/validator/js/utils/validator/phone.js","maps/js/js/p2wqrcodescanner.js"],"names":["Pendo","apiKey","v","w","x","p","window","e","document","n","d","o","_q","length","m","concat","slice","call","arguments","y","createElement","async","src","z","getElementsByTagName","parentNode","insertBefore","PendoUtils","getTransformHostname","pendo","location","addTransforms","attr","action","data","CODE_CLIENT","getTransformScreen","getCurrentScreen","let","screen","tab","tabPanel","activeTab","panel","items","ot","codetravCodetravail","ecran","formPanelPack","panelPreparation","ctPath","codeEcranCT","valCode","codeCT","code","descrCT","descr","replace","otPropositionId","datas","taskType","workOrderProposalTask","cellarTask","taskDescr","description","taskCode","contrat","contratType","type","title","url","includes","formItems","form","find","item","name","getValue","ecranCT","hiddenName","lastSelectionText","mvtId","initialConfig","typeMvt","layout","container","identifier","re","match","screenURL","encodeURI","addLoadListener","event","func","f","addEventListener","attachEvent","print","Ext","isIE","fenetreCent","nom","largeur","hauteur","options","haut","height","Gauche","width","open","self","focus","PrintDocument","printRpt","printXmlReport","reportName","format","group","tabFilters","ReportActionDwr","printReportWithFilters","res","this","runReport","obj","fetchPrintXmlReport","Dwr","fetch","then","catch","console","error","component","extResult","mask","LoadMask","msg","d2e","trad","show","message","Msg","alert","undefined","hide","printXmlReportAvecPiecesJointes","callback","downloadReport","jsonFilters","_getReportURL","otId","displayReport","mailReportToUser","scope","fileName","setMasked","xtype","ReportAction","sendReportByMailToUser","resultStatut","ux","Utils","success","download","filename","reportTitle","COUNTRY_CODE","params","JSON","stringify","encodedParams","Object","entries","map","kv","encodeURIComponent","join","origin","printXmlReportFromBirtPopup","uid","idsSelect","Ajax","request","timeout","uniqueId","loadDatasMode","reportfFiltersBirtPopup","responseText","failure","printJasperXmlReport","escape","printExcelReport","tabUrlFormat","tabUrlReportName","body","clientHeight","indexOf","split","write","close","managerMethod","args","Promise","resolve","reject","response","errorHandler","exception","ExtUtils","showWarning","reload","isValidDate","dateStr","matchArray","month","day","year","isleap","GenComboDS","actionCombo","JsonStore","autoLoad","prefixVar","root","fields","isValidPlageDate","dateStrMin","dateStrMax","datePat","dateMin","Date","parse","getWindowHeight","windowHeight","innerHeight","documentElement","FormatNumber","val","i","nbreDecimales","substr","locale","getUserLanguage","decimals","minimumFractionDigits","maximumFractionDigits","num","Number","toLocaleString","cleanNumValue","toString","isNaN","parseFloat","getRatioEcart","v1","v2","Math","abs","setTextContent","id","Prototype","Browser","IE","$","innerText","Gecko","textContent","formatDate","sDate","sFormat","AccentToNoAccent","str","norm","Array","spec","translate","framework_translator","roundToDecimals","value","round","getMeasureInfos","su","SYSTEMUNIT","surface","small","unit","factor","large","limit","distance","convertMeasure","limits","printElement","elementId","cssString","element","append","clone","html","mywindow","documentStyles","values","styleSheets","props","href","transformDates","reduce","acc","key","moment","toDate","isArray","removeLocalStorageByQuery","query","localStorage","hasOwnProperty","removeItem","localDatabase","clearByKey","USER_LOCALE","navigator","language","MathUtils","_","toFixedDown","digits","number","toNumber","RegExp","getPrecision","string","NaN","getFloatRenderer","precision","getFloatWithLOCALEFormat","forceDecimals","customOptions","assign","Intl","NumberFormat","DateTimeUtils","getDateFormatter","date","isValid","formatDateLocale","DateTimeFormat","roundFloatTime","floatTime","roundUnit","hours","floor","timeRounded","utc","duration","asMilliseconds","asHours","getISOTimeString","timeString","localeData","longDateFormat","getHoursMinutesFromTimeString","localeDateFormat","filter","c","a","toLowerCase","localeTimeFormat","getDateColumn","header","dataIndex","columnProperties","editorProperties","renderer","editor","boxMinWidth","createDateActionPanel","menu","greaterThanFilterEntry","lowerThanFilterEntry","equalToFilterEntry","cancelFilterEntry","text","iconCls","handler","cancelFilter","dateFilterBuilder","filterSpec","currFilter","keys","forEach","setValue","setActive","add","isDate","parseDate","after","on","before","showPopupOK","config","icon","MessageBox","WARNING","buttons","OK","fn","showPopupOKCANCEL","rejectOnCancel","OKCANCEL","buttonSelected","showPopupYESNO","YESNO","showPopupYESNOCANCEL","YESNOCANCEL","cls","showError","ERROR","popUpNePlusAfficher","itemName","subItemName","UsrPrefsManager","get","dwrResult","decode","json","itemId","ui","Viewport","isIOS","buttonValue","inputText","showConfig","isChecked","getElementById","checked","save","QUESTION","lowerCaseWithoutSpecialChar","character","normalize","keepScrollState","grid","saveLastScroll","lockedScroller","g","view","scroller","lastScroll","getScroll","fireEvent","getStore","getView","ls","elem","scroll","s","direction","position","scrollTo","single","etapeRenderer","prefixedEtapeRenderer","prefix","meta","record","couleur","loadExtSubList","destination","actionPanel","containerId","xhr","eval","getCmp","findByType","factory","define","amd","InvalidCharacterError","prototype","Error","atob","bind","input","String","bs","buffer","bc","idx","output","charAt","fromCharCode","base64_url_decode","decodeURIComponent","charCodeAt","toUpperCase","err","InvalidTokenError","jwtDecode","token","pos","jwt_decode","ApiClient","updateJWT","refreshLock","jwt","fetchRefreshEndpoint","retry","createApiUrl","method","credentials","status","redirectToLogin","jws","path","queryParams","URL","searchParams","set","callEndPoint","await","abortControllerRef","isAfter","exp","abortController","AbortController","abortControllers","signal","headers","Authorization","Content-Type","log","isInitialized","abort","ref","abortAll","post","put","delete","initialize","setInterval","EmailValidator","validate","email","test","PhoneValidator","_getRegexps","phoneNumber","some","regexp","P2wQrCodescanner","getScanner","QrScanner","domElement","onSuccess","result","onDecodeError","highlightScanRegion","highlightCodeOutline","returnDetailedScanResult","preferredCamera","verifyUserCameraAvailability","mediaDevices","getUserMedia","video","facingMode","mediaStream","getVideoTracks","track","stop","removeTrack"],"mappings":"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","file":"../p2w-utils.js","sourcesContent":["/**\n * Snippet d'installation Pendo pour la version Premium et Start.\n *\n * Des metadata users doivent également être envoyées à Pendo.\n * Attention, les envoyer après chargement de ces données sur P2W.\n * On peut retrouver les metadata sur\n * webapp/touch/app/view/Main.js -- Pour la version Mobile\n * webapp/pages/portalv3/portal.jsp -- Pour la version Bureau\n *\n */\n\nconst Pendo = function (apiKey) {\n (function (p, e, n, d, o) {\n var v, w, x, y, z;\n o = p[d] = p[d] || {};\n o._q = [];\n v = ['initialize', 'identify', 'updateOptions', 'pageLoad', 'track'];\n for (w = 0, x = v.length; w < x; ++w) {\n (function (m) {\n o[m] = o[m] || function () {\n o._q[m === v[0] ? 'unshift' : 'push']([m].concat([].slice.call(arguments, 0)));\n };\n })(v[w]);\n }\n y = e.createElement(n);\n y.async = !0;\n y.src = 'https://content.insight.process2wine.com/agent/static/' + apiKey + '/pendo.js';\n z = e.getElementsByTagName(n)[0];\n z.parentNode.insertBefore(y, z);\n })(window, document, 'script', 'pendo');\n}('9dc0e4e1-d32e-48f5-6bc2-61781029d652');\n\n\n/**\n * Utilitaires pour les Transforms d'URL Pendo\n *\n * Transforms de Pendo\n * Ajout d'une URL (côté serveur uniquement) aux pages de la version Bureau\n *\n * Pour tester l'URL active sur une page : dans la console, à tout moment, lancer la commande\n * pendo.location.getHref()\n */\nclass PendoUtils {\n\n /*\n * Transform hostname (= *.process2wine.com de notre url)\n * Event possible sur hostname : Replace\n */\n static getTransformHostname() {\n\n // Modifier le https://account.process2wine.com/p2w/ en https://account/p2w/\n pendo && pendo.location && pendo.location.addTransforms([{\n attr: 'hostname',\n action: 'Replace',\n data: CODE_CLIENT\n }]);\n }\n\n /*\n * Transform Hash (= la partie après /p2w/ dans notre url)\n * Events possible sur hostname : Replace & Clear\n */\n static getTransformScreen() {\n\n // Récupérer l'écran actif\n function getCurrentScreen() {\n let screen = '';\n let tab = window.tabPanel.activeTab;\n\n // On a un onglet ouvert\n if (tab) {\n const panel = tab && tab.items && tab.items.items[0];\n if (tab.screen) {\n // Dans le cas d'une liste chargée par un JS, on récupère le header en clé de traduction\n screen = tab.screen\n } else if (tab.ot && tab.ot.codetravCodetravail && tab.ot.codetravCodetravail.ecran\n || tab.formPanelPack && tab.formPanelPack.ot // Tous les écrans associés (CT), sauf Planning OT et Sortie de vin\n || tab.panelPreparation && tab.panelPreparation.formPanelPack && tab.panelPreparation.formPanelPack.ot // écran Planning OT\n || tab.items && tab.items.items[0] && tab.items.items[0].ot) { // écran Sortie de Vin\n\n // Si on a un OT, on récupère le code écran du CT, la description du CT et le code du CT\n let ctPath = '';\n if(tab.ot && tab.ot.codetravCodetravail) {\n ctPath = tab.ot.codetravCodetravail;\n } else if (tab.formPanelPack && tab.formPanelPack.ot && tab.formPanelPack.ot.codetravCodetravail) {\n ctPath = tab.formPanelPack.ot.codetravCodetravail;\n } else if (tab.panelPreparation && tab.panelPreparation.formPanelPack && tab.panelPreparation.formPanelPack.ot && tab.panelPreparation.formPanelPack.ot.codetravCodetravail) {\n ctPath = tab.panelPreparation.formPanelPack.ot.codetravCodetravail;\n } else if (panel && panel.ot && panel.ot.codetravCodetravail) {\n ctPath = panel.ot.codetravCodetravail;\n }\n let codeEcranCT = ctPath.ecran && ctPath.ecran.valCode ? ctPath.ecran.valCode : '';\n let codeCT = ctPath.code ? ctPath.code : '';\n let descrCT = ctPath.descr ? ctPath.descr : '';\n\n // Ajoute au screen le code écran, la description et le code du CT pour le transform Pendo\n // Exemple d'URL : http://*/p2w/#OT/ecran=otCreationLot/descr=Entree_de_vin/code=Crea\n // Certains noms d'écrans ont des noms à chemin (ex: Sortie Vrac: pages/jsModules/formOTSortieLot.js), où on\n // remplace les '/' du chemin par des '_'.\n screen = \"OT/ecran=\" + codeEcranCT.replace(/\\//g, '_') + '/descr=' + descrCT + '/code=' + codeCT\n } else if (tab.otPropositionId && tab.datas != null) {\n // Si on a une Tâche planifiée au Chai, on récupère le type, la description et le code de la tâche\n let taskType = tab.datas.workOrderProposalTask.cellarTask.taskType;\n let taskDescr = tab.datas.workOrderProposalTask.description;\n let taskCode = tab.datas.workOrderProposalTask.taskCode\n // ex d'URL : http://*/p2w/#Tache/type=ADDITIVE/descr=Levurage/code=AJOUT_PROD\n screen = \"Tache/type=\" + taskType + \"/descr=\" + taskDescr + \"/code=\" + taskCode\n } else if (tab.contrat) {\n // Sur les contrats au Chai, on récupère le type de contrat en cours\n const contratType = tab.contrat.type ? tab.contrat.type : tab.title;\n screen = \"Contrat/type=\" + contratType\n } else {\n // URL spécifique aux CT (qui reprend le même schéma que pour les OTs)\n if (panel && panel.url && panel.url.includes(\"formCodeTravail\")) {\n const formItems = panel.form && panel.form.items || [];\n const descrCT = formItems.find(item => item.name === 'descr') && formItems.find(item => item.name === 'descr').getValue() ? formItems.find(item => item.name === 'descr').getValue() : '';\n const codeCT = formItems.find(item => item.name === 'Code') && formItems.find(item => item.name === 'Code').getValue() ? formItems.find(item => item.name === 'Code').getValue() : '';\n const ecranCT = formItems.find(item => item.hiddenName === 'Ecran') && formItems.find(item => item.hiddenName === 'Ecran').lastSelectionText ? formItems.find(item => item.hiddenName === 'Ecran').lastSelectionText : '';\n\n // URL du CT sous la forme http://*/p2w/#CT/ecran=Vigne_V2_Produit/descr=Butage/code=Tra\n screen = \"CT/ecran=\" + ecranCT + \"/descr=\" + descrCT + \"/code=\" + codeCT;\n }\n // Si on est dans un mouvement de stock, on indique le type de mouvement\n else if (tab.mvtId) {\n screen = 'MvtStock/mvtId=' + tab.initialConfig.typeMvt;\n }\n else {\n // Sinon, par défaut, on envoie en URL le titre de l'onglet tel qu'affiché sur P2W\n screen = tab.title;\n\n // Si on est dans un écran avec vue détaillée ou groupée, on l'indique\n if(panel && panel.layout && panel.layout.container) {\n // Modification de la vue après ouverture de l'écran\n if (panel.layout.container.identifier) {\n if (panel.layout.container.identifier.includes(\"Grouped\")) {\n screen = screen + \"/vue=grouped\"\n } else if (panel.layout.container.identifier.includes(\"Detailled\")) {\n screen = screen + \"/vue=detailled\"\n }\n } else {\n // Première ouverture de l'écran\n if (tab.identifier && tab.identifier.includes(\"Grouped\")) {\n screen = screen + \"/vue=grouped\"\n } else if (tab.identifier && tab.identifier.includes(\"Detailled\")) {\n screen = screen + \"/vue=detailled\"\n } else {\n screen = screen\n }\n }\n }\n\n // Quand on utilise le titre de l'onglet, ce dernier apparaît sous le format '\"[code ou ID] OT La description de mon OT\"'\n // qu'il faut retravailler pour obtenir une URL qui ne contient que le premier élément qui suit le [code ou ID].\n let re = /(\\[\\d*\\])(\\s*)(\\w*)?(.*)/; // Regex avec trois groupes distincts : l'[ID], le titre (ex. \"OT\") et la description\n if (screen.match(re)) {\n // On ne conserve que le deuxième groupe de la regex\n screen = tab.title.replace(re, '$3');\n }\n }\n }\n\n // On vérifie qu'il n'y a aucun espace en début ou fin de chaîne, on remplace les espaces par des _ et on renvoie la chaîne pour l'URL.\n let screenURL = screen.replace(/\\s+/g, '_') // remplace les espaces par des '_'\n .replace(/^(\\s*)([\\W\\w]*)(\\b\\s*$)/g, '$2'); // trim les espaces en début et fin de chaîne\n return encodeURI(screenURL);\n\n } else {\n // Aucun onglet ouvert, on renvoie une URL vide\n return encodeURI('');\n }\n }\n\n pendo && pendo.location && pendo.location.addTransforms([{\n attr: 'hash',\n action: 'Replace',\n data: function() {\n return getCurrentScreen();\n }\n }]);\n }\n}\n\n","function addLoadListener(event, func){\n\n if (f.addEventListener) {\n f.window.addEventListener(event, func, false);\n }\n else\n if (document.addEventListener) {\n f.document.addEventListener(event, func, false);\n }\n else\n if (window.attachEvent) {\n f.window.attachEvent(\"onload\", func);\n }\n}\n\nfunction print(){\n\n if (Ext.isIE) {\n\t\tf.document.title=\"Impression....\";\n f.print();\n }\n else {\n f.print();\n }\n}\n\nfunction fenetreCent(url, nom, largeur, hauteur, options){\n\n var haut = (screen.height - hauteur) / 2;\n var Gauche = (screen.width - largeur) / 2;\n\n if (Ext.isIE) {\n f = window.open(url, '_blank', \"\");\n }\n else { \t\n f = window.open(url, nom, \"menubar=no,status=no,scrollbars=no,top=\" + haut + \",left=\" + Gauche + \",width=\" + largeur + \",height=\" + hauteur ); \n }\n\n self.focus();\n return f;\n}\n\nfunction PrintDocument(type){\n\n var body;\n var iframe;\n\n if (type == \"pdf\") {\n\n }\n\n // fenetreCent(\"http://localhost:8080/birt/run?__report=test.rptdesign&sample=boulit&__format=html\", \"Impression..\", 400, 400, options)\n\n var f = fenetreCent(\"http://localhost/:8080/birt/run?__report=test.rptdesign&sample=boulit&__format=html\", \"Impression..\", 1000, 700,\"\");\n\n addLoadListener(\"load\", print);\n\n}\n\nfunction printRpt(url) {\n\n\tfenetreCent(url, \"Impression..\", 800, 600, \"\");\n}\n\n/***\n * Fonction permettant d'imprimer un rapport BIRT en fournissant des données au format XML\n * @param reportName: le nom du rapport (le nom du rptdesign sans l'extension et en respectant la casse).\n * @param format: pdf ou xls\n * @param group: les éventuels groupes (séparés par un ; s'il y en a plusieurs)\n * @param tabFilters: le tableau de filtres à prendre en compte\n */\nfunction printXmlReport(reportName, format, group, tabFilters){\n\t\n\tReportActionDwr.printReportWithFilters(reportName, group, format, tabFilters, function(res){\n\t\tthis.runReport(res.obj);\t\n\t});\n}\n\n/***\n * Fonction permettant d'imprimer un rapport BIRT en fournissant des données au format XML\n * @param reportName: le nom du rapport (le nom du rptdesign sans l'extension et en respectant la casse).\n * @param format: pdf ou xls\n * @param group: les éventuels groupes (séparés par un ; s'il y en a plusieurs)\n * @param tabFilters: le tableau de filtres à prendre en compte\n * @returns {Promise}\n */\nfunction fetchPrintXmlReport(reportName, format, group, tabFilters){\n return Dwr.fetch(ReportActionDwr.printReportWithFilters, reportName, group, format, tabFilters)\n .then((res)=> this.runReport(res.obj))\n .catch((e)=> console.error(e))\n}\n\n/***\n * Fonction permettant d'imprimer un rapport BIRT en fournissant des données au format XML\n * @param component: le composant sur lequel va s'afficher une popup de chargement.\n * @param reportName: le nom du rapport (le nom du rptdesign sans l'extension et en respectant la casse).\n * @param format: pdf ou xls\n * @param group: les éventuels groupes (séparés par un ; s'il y en a plusieurs)\n * @param tabFilters: le tableau de filtres à prendre en compte\n * @param extResult: extResult avec tous les filtres de la liste (en complément ou remplacement de tabFilters)\n */\nfunction printXmlReport(component, reportName, format, group, tabFilters, extResult){\n\tvar mask = null;\n\t\n\tif (component != null){\t\t\n\t\tmask = new Ext.LoadMask(component, {msg:d2e.trad('application.loading')});\n\t\tmask.show();\n\t}\n\t\n\tif (!extResult) {\n\t\textResult = null;\n\t}\n\t\n\tReportActionDwr.printReportWithFilters(reportName, group, format, tabFilters, extResult, function(res){\n\n\t\tif (res.obj != null){\t\n\t\t\tthis.runReport(res.obj);\n\t\t}\t\t\t\n\t\telse{\n\t\t\tif (res.message != null)\n\t\t\t\tExt.Msg.alert(d2e.trad('frm.info'), res.message);\n\t\t\telse if (res.error != null){\n\t\t\t\tExt.Msg.alert(d2e.trad('msg.error'), res.error);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (mask != undefined) {\n\t\t\tmask.hide();\n\t\t}\n\t});\n}\n/***\n * Fonction permettant d'imprimer un rapport BIRT depuis le popup Birt (P2w.win.birt.Window) en fournissant des données au format XML\n * \n * @param component: le composant sur lequel va s'afficher une popup de chargement.\n * @param reportName: le nom du rapport (le nom du rptdesign sans l'extension et en respectant la casse).\n * @param format: pdf ou xls\n * @param group: les éventuels groupes (séparés par un ; s'il y en a plusieurs)\n * @param tabFilters: le tableau de filtres à prendre en compte (en + des filtres LoadJS si l'on vient de LoadJS)\n */\nfunction printXmlReportAvecPiecesJointes(component, reportName, format, group, tabFilters, callback){\n\tvar mask = null;\n\t\n\tif (component != null){\t\t\n\t\tmask = new Ext.LoadMask(component, {msg:d2e.trad('application.loading')});\n\t\tmask.show();\n\t}\n\n\tReportActionDwr.printReportWithFilters(reportName, group, format, tabFilters, null, function(res){\n\n\t\tif (res.obj != null){\t\n\t\t\tthis.runReport(res.obj);\n\t\t\tif (callback) \n\t\t\t\tcallback.call();\n\t\t}\t\t\t\n\t\telse{\n\t\t\tif (res.message != null)\n\t\t\t\tExt.Msg.alert(d2e.trad('frm.info'), res.message);\n\t\t\telse if (res.error != null){\n\t\t\t\tExt.Msg.alert(d2e.trad('msg.error'), res.error);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (mask != undefined) {\n\t\t\tmask.hide();\n\t\t}\n\t});\n}\n\n/**\n * Lance le téléchargement d'un rapport\n *\n * @param reportName nom du rapport à générer\n * @param jsonFilters tableau d'objets JSON, chaque objet étant un filtre de la forme {column: string, value: string|int|bool}\n * @param otId ID de l'OT si il s'agit d'un rapport d'OT\n */\nfunction downloadReport(reportName, jsonFilters) {\n let url = _getReportURL(reportName, jsonFilters, otId, true);\n document.location = url;\n}\n\n/**\n * Affiche un rapport dans un nouvel onglet\n *\n * @param reportName nom du rapport à générer\n * @param jsonFilters tableau d'objets JSON, chaque objet étant un filtre de la forme {column: string, value: string|int|bool}\n * @param otId ID de l'OT si il s'agit d'un rapport d'OT\n */\nfunction displayReport(reportName, jsonFilters) {\n let url = _getReportURL(reportName, jsonFilters, false);\n window.open(url, 'NewDisplayingTabInformations');\n}\n\n/**\n * Envoie un rapport à l'utilisateur connecté\n *\n * @param reportName nom du rapport à générer\n * @param jsonFilters tableau d'objets JSON, chaque objet étant un filtre de la forme {column: string, value: string|int|bool}\n */\nfunction mailReportToUser(reportName, jsonFilters, scope, fileName) {\n if (scope && scope.setMasked) {\n scope.setMasked({ xtype: 'loadmask', message: d2e.trad('application.loading') });\n }\n\n ReportAction.sendReportByMailToUser(reportName, jsonFilters, fileName || reportName, (res) => {\n // Si retour error ou warn, affiche le popup correspondant\n if (res.resultStatut != 'info') {\n Ext.ux.Utils[res.resultStatut](res.message);\n }\n else {\n Ext.ux.Utils.success(d2e.trad('lbl.touch.mail.envoye'));\n }\n\n if (scope && scope.setMasked) {\n scope.setMasked(false);\n }\n });\n}\n\nfunction _getReportURL(reportName, jsonFilters, download, filename) {\n\n // Dans certains cas, on veut avoir un nom de fichier différent (serveurs US notamment) pour le rapport\n let reportTitle = reportName;\n if (reportName === \"TacheChai\" && COUNTRY_CODE !== 'FR') {\n reportTitle = \"CellarJob\";\n }\n else if (reportName === \"WeighmasterCertificate\" && COUNTRY_CODE === 'FR') {\n reportTitle = \"TicketApport\";\n }\n const params = {\n reportName: reportName,\n jsonFilters: JSON.stringify(jsonFilters),\n download: download,\n filename: reportTitle ? reportTitle : (filename !== undefined ? filename : '')\n };\n\n let encodedParams = Object.entries(params).map(kv => kv.map(encodeURIComponent).join(\"=\")).join(\"&\");\n\n return `${document.location.origin}/p2w/downloadReport.do?${encodedParams}`;\n}\n\n/***\n * Fonction permettant d'imprimer un rapport BIRT depuis le popup Birt (P2w.win.birt.Window) en fournissant des données au format XML\n * @param component: le composant sur lequel va s'afficher une popup de chargement.\n * @param reportName: le nom du rapport (le nom du rptdesign sans l'extension et en respectant la casse).\n * @param format: pdf ou xls\n * @param group: les éventuels groupes (séparés par un ; s'il y en a plusieurs)\n * @param tabFilters: le tableau de filtres à prendre en compte (en + des filtres LoadJS si l'on vient de LoadJS)\n */\nfunction printXmlReportFromBirtPopup(component, reportName, format, group, tabFilters, uid, idsSelect){\n\tif (component != null){\n\t\tvar mask = new Ext.LoadMask(component, {msg:d2e.trad('application.loading')});\n\t\tmask.show();\n\t}\n\t\n\tExt.Ajax.request({\n\t\turl: 'reportAction.do',\n\t\ttimeout: 900000,\n\t\tparams: {\n\t\t\tuniqueId:uid,\n\t\t\tloadDatasMode:1,\n\t\t\tidsSelect:idsSelect,\n\t\t\tformat:format,\n\t\t\tgroup:group,\n\t\t\treportName:reportName,\n\t\t\treportfFiltersBirtPopup:tabFilters.join()\n\t\t},\n\t\tsuccess: function(res){\t\n\t\t\tthis.runReport(res.responseText);\n\t\t\t\n\t\t\tif (mask != undefined)\n\t\t\t\tmask.hide();\t\t\n\t\t\t\n\t\t\t},\n\t\tfailure: function(res){ \n\t\t\t\tif (mask != undefined)\n\t\t\t\t\tmask.hide();\n\t\t\t\t\n\t\t\t\tif (res.message != null)\n\t\t\t\t\tExt.Msg.alert(d2e.trad('frm.info'), res.message);\n\t\t\t\telse if (res.error != null){\n\t\t\t\t\tExt.Msg.alert(d2e.trad('msg.error'), res.error);\n\t\t\t\t}\n\t\t\t}\n\t});\n}\n/***\n * Fonction permettant d'imprimer un rapport JASPER depuis le popup Birt (P2w.win.birt.Window) en fournissant des données au format XML\n * @param component: le composant sur lequel va s'afficher une popup de chargement.\n * @param reportName: le nom du rapport (le nom du rptdesign sans l'extension et en respectant la casse).\n * @param format: pdf ou xls\n * @param group: les éventuels groupes (séparés par un ; s'il y en a plusieurs)\n * @param tabFilters: le tableau de filtres à prendre en compte (en + des filtres LoadJS si l'on vient de LoadJS)\n */\nfunction printJasperXmlReport(component, reportName, format, group, tabFilters, uid, idsSelect){\n\t\n\tvar url = 'jasperAction.do?uniqueId='+uid+'&loadDatasMode=1&idsSelect='+idsSelect+'&format='+format+'&group='+group+\n\t\t'&reportName='+reportName+'&reportfFiltersBirtPopup='+escape(tabFilters.join());\n\tthis.runReport(url);\n\t\n}\n\nfunction printExcelReport(reportName, tabFilters){\n\tvar url = 'reportMobile.do?name='+reportName+'&reportfFiltersBirtPopup='+escape(tabFilters.join());\n\tthis.runReport(url);\n}\n\n/***\n * Fonction permettant lançant la fenêtre dans laquelle le rapport sera affiché\n * @param url : L'url à envoyer à BIRT \n */\nfunction runReport(url){\t\n\tif (url !=null){\n\t\tvar height = document.body.clientHeight || 700;\n\t\t\n\t\tif (url.indexOf(\"');\n\t\t\tf.document.write('');\n\t\t\tf.document.write('');\t\t\n\t\t\tf.document.write('\t');\t\t\n\t\t\tf.document.write('\t
');\n\t\t\tf.document.write('\t\t'+d2e.trad('print.loading'));\n\t\t\tf.document.write('
'+d2e.trad(\"cancel\")+'');\n\t\t\tf.document.write('\t
');\n\t\t\tf.document.write('\t
');\n\t\t\tf.document.write('\t\t
');\n\t\t\tf.document.write('\t\t '+d2e.trad('print.loaded')+'
'+d2e.trad('frm.close')+'');\n\t\t\tf.document.write('
');\n\t\t\tf.document.write('
');\n\t\t\t\n\t\t\tf.document.write('');\n\t\t\tf.document.write('');\n\t\t\tf.document.close();\n\t\t\t\n\t\t}else{\n\t\t\t// Ce n'est pas une URL mais un message d'erreur en html\n\t\t\tvar f;\n\t\t\t\n\t\t\tif (Ext.isIE) {\n\t\t f = window.open('', '_blank', 'height=700,width=700,top=0,left=0,scrollbars,resizable,menubar');\n\t\t }else{\n\t\t \tf = window.open('','','height='+height+',width=700,top=0,left=0,scrollbars,resizable,menubar');\n\t\t }\n\t\t\tf.document.write(url);\n\t\t\tf.document.close();\n\t\t}\n\t}\n}\n\n\n","/**\n * Méthodes relatives à DWR\n */\nclass Dwr {\n\n /**\n * Retourne l'invocation d'une méthode DWR sous forme de Promise. Utiliser {@link Promise#then} pour fournir le callback, et\n * {@link Promise#catch} pour gérer les erreurs.\n *\n * Si l'utilisateur n'est plus loggé au moment de l'appel, un message d'avertissement sera affiché et la page sera rafraîchie.\n *\n * Note : la promesse sera rejetée dans les cas suivants :\n * - Exception DWR\n * - Réponse de type DwrResult avec un resultStatut 'error' ou 'fatal'\n * - Erreur réseau ou autre\n *\n * @param {function} managerMethod la méthode DWR à appeler\n * @param {*} args la liste des arguments à fournir à la méthode DWR\n *\n * @return {Promise} la promesse encapsulant l'appel DWR. En cas de déconnexion de l'utilisateur, la promesse sera résolue\n * à la confirmation de l'utilisateur (ce qui entrainera le rechargement de la page)\n *\n * @throws Lève une exception si la méthode DWR n'existe pas\n */\n static fetch(managerMethod, ...args) {\n if (managerMethod === undefined) {\n throw \"Undefined DWR method\";\n }\n\n return new Promise((resolve, reject) => {\n try {\n managerMethod(...args, {\n callback: response => {\n if (response !== undefined && response !== null && ['error', 'fatal'].includes(response.resultStatut)) {\n return reject(response);\n }\n\n return resolve(response);\n },\n errorHandler: (error, exception) => {\n // Si on détecte que l'utilisateur est déconnecté, on le redirige sur le login\n if (exception && exception.message && exception.message === 'unlogged') {\n return ExtUtils.showWarning(\n d2e.trad('P2w.statut.warn'),\n d2e.trad('error.msg.session.invalid')\n ).then(() => location.reload());\n }\n\n if (exception !== undefined) {\n console.error(exception);\n }\n\n reject(error);\n }\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n}","\n\nfunction isValidDate(dateStr) {\n\t// Checks for the following valid date formats:\n\t// MM/DD/YY MM/DD/YYYY MM-DD-YY MM-DD-YYYY\n\t// Also separates date into month, day, and year variables\n\n\tif (dateStr == '') return false;\n\n\tvar datePat = /^(\\d{1,2})(\\/|-)(\\d{1,2})\\2(\\d{2}|\\d{4})$/;\n\n\t// To require a 4 digit year entry, use this line instead:\n\t// var datePat = /^(\\d{1,2})(\\/|-)(\\d{1,2})\\2(\\d{4})$/;\n\n\tvar matchArray = dateStr.match(datePat); // is the format ok?\n\tif (matchArray == null) {\n\talert(\"Le format date n'est pas valide.\");\n\treturn false;\n\t}\n\tmonth = matchArray[3]; // parse date into variables\n\tday = matchArray[1];\n\tyear = matchArray[4];\n\tif (month < 1 || month > 12) { // check month range\n\talert(\"Le mois doit �tre compris entre 1 et 12.\");\n\treturn false;\n\t}\n\tif (day < 1 || day > 31) {\n\talert(\"Le jour doit �tre compris entre 1 et 31.\");\n\treturn false;\n\t}\n\tif ((month==4 || month==6 || month==9 || month==11) && day==31) {\n\talert(\"Le mois \"+month+\" n'a pas 31 jours !\");\n\treturn false;\n\t}\n\tif (month == 2) { // check for february 29th\n\tvar isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\tif (day>29 || (day==29 && !isleap)) {\n\t\talert(\"Le mois de f�vrier \" + year + \" n'a pas \" + day + \" jours !\");\n\t\treturn false;\n\t \t}\n\t}\n\treturn true; // la date est valide\n}\n\n// Definition des datastore pour les listes\n// *****************************************\nfunction GenComboDS(actionCombo){\n return new Ext.data.JsonStore({\n autoLoad: false,\n url: prefixVar + 'getComboDs.do?actionCombo=' + actionCombo,\n root: 'combo',\n fields: [{\n name: 'id'\n }, {\n name: 'field'\n }]\n });\n}\n\nfunction isValidPlageDate(dateStrMin, dateStrMax) {\n// V�rifie que la plage de dates est coh�rente : dateStrMin doit �tre <= dateStrMax\n// Checks for the following valid date formats:\n// MM/DD/YY MM/DD/YYYY MM-DD-YY MM-DD-YYYY\n// Also separates date into month, day, and year variables\n\n\tif (dateStrMin!='' && dateStrMax!='') {\n\t // V�rifie les param�tres\n\t if (!isValidDate(dateStrMin)) {\n\t //alert(\"La premi�re date n'est pas valide.\")\n\t return false;\n\t }\n\n\t if (!isValidDate(dateStrMax)) {\n\t //alert(\"La deuxi�me date n'est pas valide.\")\n\t return false;\n\t }\n\n\t var datePat = /^(\\d{1,2})(\\/|-)(\\d{1,2})\\2(\\d{2}|\\d{4})$/;\n\n\t // To require a 4 digit year entry, use this line instead:\n\t // var datePat = /^(\\d{1,2})(\\/|-)(\\d{1,2})\\2(\\d{4})$/;\n\n\t // convertit en date\n\t var matchArray = dateStrMin.match(datePat);\n\t month = matchArray[3]; // parse date into variables\n\t day = matchArray[1];\n\t year = matchArray[4];\n\t // la date soit �tre sur 4 caract�res\n\t if (year.length == 2) {\n\t\tif (year[1]='0')\n\t\t year = '20' + year;\n\t\telse\n\t\t year = '19' + year;\n\t \t}\n\t var dateMin = Date.parse(month+'/'+day+'/'+year);\n\n\t var matchArray = dateStrMax.match(datePat);\n\t month = matchArray[3]; // parse date into variables\n\t day = matchArray[1];\n\t year = matchArray[4];\n\t if (year.length == 2) {\n\t\tif (year[1]='0')\n\t\t year = '20' + year;\n\t\telse\n\t\t year = '19' + year;\n\t\t}\n\n\t var dateMax = Date.parse(month+'/'+day+'/'+year);\n\n\t // Compare les dates\n\t// alert(dateMin+'-'+dateMax);\n\t if (dateMin>dateMax){\n\t alert(\"La date de fin doit �tre sup�rieure ou �gale � la date de d�but !\");\n\t return false;\n\t }\n\t}\nreturn true; // la plage de date est valide\n}\n\nfunction getWindowHeight() {\n\tvar windowHeight = 0;\n\tif (typeof(window.innerHeight) == 'number') {\n\t\twindowHeight = window.innerHeight;\n\t}\n\telse {\n\t\tif (document.documentElement && document.documentElement.clientHeight) {\n\t\t\twindowHeight = document.documentElement.clientHeight;\n\t\t}\n\t\telse {\n\t\t\tif (document.body && document.body.clientHeight) {\n\t\t\t\twindowHeight = document.body.clientHeight;\n\t\t\t}\n\t\t}\n\t}\n\treturn windowHeight;\n}\n\nfunction FormatNumber(val, format) {\n\n\t// Retourne la valeur val en fonction du format\n\tvar i;\n\tvar nbreDecimales;\n\tvar sepDec = \".\";\n\n\ti = 0;\n\tnbreDecimales = 0;\n\n\t// format par d�faut\n\tif (format == '')\n\t\tformat = '# ##.00';\n\n\t// nombre de d�cimales\n\ti = format.indexOf(sepDec, 0)+1;\n\twhile (i > 0 && i < format.length) {\n\t\tif (format.substr(i,1) == '0')\n\t\t\tnbreDecimales += 1;\n\t\ti += 1;\n\t}\n\n\t/*var nf = new NumberFormat(val);\n\tnf.setPlaces(nbreDecimales);\n\tnf.setSeparators(true, ' ', ',');\n\tvar num = nf.toFormatted();*/\n\n\tconst locale = getUserLanguage();\n\tconst decimals = {minimumFractionDigits: nbreDecimales, maximumFractionDigits: nbreDecimales}\n\tconst num = Number(val).toLocaleString(locale, decimals);\n\n\n\t// %\n\tif (format.substr(format.length-1,1) == '%')\n\t\tnum = num + '%';\n\n\treturn num;\n}\n\nfunction cleanNumValue(val){\n\t// nettoye la valeur pour �tre num�rique\n\tif (val){\n\t\t// nettoyage de la valeur\n\t\tval = val.toString().replace(',','.');\t// separateur d�cimal\n\t\t//val = val.toString().replace(' ','');\t\t// suppr espaces\n\t\tval = val.split(' ');\n\t\tval = val.join('');\n\t\tval = val.toString().replace('%','');\t\t// suppr\n\t\t// Met � 0 si pas un nombre\n\t\tif (isNaN(val))\n\t\t\tval = 0;\n\n\t\t// remplace null par 0\n\t\tif (val == '')\n\t\t\tval = 0;\n\n\t\t// convertit en num pour supprimer les �ventuels 0 � gauche\n\t\tval = parseFloat(val) ;\n\t}\n\telse\n\t\tval = 0;\n\n\treturn val;\n}\n\nfunction getRatioEcart(v1, v2){\n\t// calcule le ration del'�cart v1/v2\n\t// ex : v1 = montant des charges et v2 = CA\n\tif (v2!=0)\n\t\treturn (v1-v2)/Math.abs(v2)*100;\n\telse\n\t\treturn 0;\n}\n\nfunction setTextContent(id,val){\n\tif (this.Prototype.Browser.IE)\n\t\t$(id).innerText=val;\n\telse if (this.Prototype.Browser.Gecko)\n\t\t$(id).textContent=val;\n\telse\n\t\t$(id).textContent=val;\n}\n\nfunction formatDate(sDate, sFormat){\n\tvar dt = new Date(sDate);\n\treturn dt.format(sFormat);\n}\n\n/**\n * Remplace les caractères accentués\n *\n */\nfunction AccentToNoAccent(str) {\n\tvar norm = new Array('À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï', 'Ð','Ñ','Ò','Ó','Ô','Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß', 'à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ', 'ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ý','þ','ÿ');\n\tvar spec = new Array('A','A','A','A','A','A','A','C','E','E','E','E','I','I','I','I', 'D','N','O','O','O','0','O','O','U','U','U','U','Y','b','s', 'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','d','n', 'o','o','o','o','o','o','u','u','u','u','y','y','b','y');\n\tfor (var i = 0; i < spec.length; i++)\n\t\tstr = str.replace( norm[i], spec[i]);\n\treturn str;\n}\n/**\n * Traduit la chaine et remplace les caractères spéciaux\n */\nfunction translate(str){\n\tif (str != null)\n\t\treturn framework_translator[str].replace(\"'\",\"\\'\");\n\treturn \"\";\n}\n\n\n\n/**\n * Round numbers with decimals\n * @Param [Number] value [value to be rounded]\n * @Param [Number] decimals [Number of decimals]\n * @returns Number\n */\nfunction roundToDecimals(value, decimals) {\n return Number(Math.round(value+'e'+decimals)+'e-'+decimals);\n}\n\n/**\n * Get measure infos (unit, factor for calculation, limits) by SYSTEMUNIT param\n * @returns [Object]\n */\nfunction getMeasureInfos(){\n const su = SYSTEMUNIT;\n return {\n \t\tsurface: {\n small: {\n \t\tunit: (su == 1) ? 'sq yd' : 'm²',\n \t\tfactor: (su == 1) ? 1.19599 : 1,\n \t\tdecimals: (su == 1) ? 2 : 0\n },\n large: {\n \t\tunit: (su == 1) ? 'ac' : (su == 2) ? 'dunam' : 'ha',\n \t\tfactor: (su == 1) ? 4046.856422 : (su == 2) ? 1000 : 10000,\n decimals: 4\n },\n limit: (su == 1) ? 405 : (su == 2) ? 100 : 1000\n },\n distance: {\n small: {\n \t\tunit: (su == 1) ? 'yd' : 'm',\n \t\tfactor: (su == 1) ? 1.09361 : 1,\n \t\tdecimals: (su == 1) ? 2 : 0\n },\n large: {\n \t\tunit: (su == 1) ? 'mi.' : 'km',\n \t\tfactor: (su == 1) ? 1609.34 : 1000,\n decimals: 2\n },\n limit: (su == 1) ? 1610 : 1000\n }\n }\n}\n\n/*\n * Format measure output by SYSTEMUNIT param\n * @Param [String] type [\"distance\" || \"surface\"]\n * @Param [Number] length [Value (in meters / meters²) to be converted]\n * @Param [Boolean] limits [Set value with limits of small and large scales]\n * @Param [Boolean] unit [If should return a string with the respective unit]\n * @returns Number (value) || String (value + unit)\n */\nfunction convertMeasure(type, length, limits, unit) {\n let m = getMeasureInfos()[type];\n m = (!limits || length > m.limit) ? m.large : m.small;\n const value = roundToDecimals((length / m.factor), m.decimals) * 10000 / 10000 || 0;\n return unit ? [value, m.unit].join(\" \") : value;\n}\n/**\n * Print HTML element\n * - includes all css from document (watch for css heritage)\n * - opens popup and launch print (check for print configurations for background colors/imgs)\n *\n * @param {string} elementId - id of the element to print\n * @param {string} cssString - Additionnal inline css\n */\nfunction printElement(elementId, cssString = \"\") {\n const element = $(\"#\" + elementId);\n const data = $('
').append(element.clone()).html();\n const mywindow = window.open('', 'print', `height=${element.height()},width=${element.width()}`);\n // Link for every css file from document\n const documentStyles = Object.values(document.styleSheets).map((props)=>{\n return ``\n });\n // build dom page\n mywindow.document.write(`\n \n \n ${d2e.trad(\"frm.print\")}\n ${documentStyles.join(\"\")}\n \n \n ${data}\n \n `);\n mywindow.document.close();\n mywindow.print();\n}\n/**\n * Reads an object and convert dates from string to Date Object recursively\n * @param obj\n * @returns {{[p: string]: *}|{[p: string]: *}}\n */\nfunction transformDates(obj) {\n\treturn Object\n\t\t.entries(obj)\n\t\t.reduce((acc, [key, value]) => {\n return (key.match(/date/gi) || key.match(/heure/g)) && value ?\n\t\t\t\t({...acc, [key]: moment(value).toDate()}) :\n\t\t\t\t({\n\t\t\t\t\t...acc, [key]: value && typeof value === 'object' && !Array.isArray(value) ?\n\t\t\t\t\t\ttransformDates(value) :\n\t\t\t\t\t\tArray.isArray(value) ? [...value] : value\n\t\t\t\t});\n\t\t}, {});\n}\n\n/**\n * fonction de suppresion des données sauvées par mot clef\n * @param query nom du localStorage a supprimer\n */\nfunction removeLocalStorageByQuery(query) {\n for (let i in localStorage) {\n if (localStorage.hasOwnProperty(i)) {\n if (i.match(query) || (!query && typeof i === 'string')) {\n localStorage.removeItem(i);\n }\n }\n }\n //on retire aussi coté indexedDB\n return localDatabase.clearByKey(query);\n}\n\n/**\n * @return {string} User locale language\n */\nfunction getUserLanguage(){\n return USER_LOCALE || navigator.language || \"fr-FR\";\n}\n","class MathUtils {\n /**\n * Arrondie degressive de décimales\n * @param {number} num - number à arrondir\n * @param {number} [decimals] - le nombre maximal de décimale à afficher\n * @returns {number}\n */\n static round(num, decimals = 0){\n // lodash round\n return _.round(num, decimals);\n }\n\n /**\n * Troncature du nombre\n *\n * @param num nombre à tronquer, peut être un Number ou un String\n * @param digits nombre de décimales à conserver\n *\n * @returns {number}\n */\n static toFixedDown(num, digits) {\n let number = MathUtils.toNumber(num);\n var re = new RegExp(\"(\\\\d+\\\\.\\\\d{\" + digits + \"})(\\\\d)\"),\n m = number.toString().match(re);\n\n return m ? Number.parseFloat(m[1]) : num;\n }\n\n /**\n * Retourne la précision (nombre de décimales) d'un nombre\n *\n * @param number nombre (String ou Number)\n *\n * @returns {number}\n */\n static getPrecision(number) {\n number = MathUtils.toNumber(number);\n number = Math.abs(number).toString();\n\n if (number.indexOf('.') === -1) {\n return 0;\n }\n\n return number.length - (number.indexOf('.') + 1);\n }\n\n /**\n * Convertit une chaîne de caractère en Number. Accepte notamment :\n *\n * - les virgules, par ex \"3,53\" -> 3.53\n * - les espaces, par ex \"2 599\" -> 2599\n *\n * @param string chaîne de caractère représentant un nombre\n *\n * @returns {number} un nombre, ou NaN si l'argument fourni ne représente pas un nombre valide\n */\n static toNumber(string) {\n try {\n let value = string.toString()\n .replace(',', '.')\n .replace(' ', '');\n return Number(value);\n } catch(e) {\n return NaN;\n }\n }\n\n /**\n * Renvoie un renderer pour les colonnes numériques de type float qui respecte le format de la LOCALE\n * @param precision - précision de la valeur à renvoyer\n * @return la valeur formatée selon la locale et la précision OU une case vide\n */\n static getFloatRenderer(precision) {\n return (value) => {\n\n // C'est Ultra moche mais le pôle produit est tenace et dangeureux\n if (value === '-') {\n return value;\n }\n\n // Vérifie si la precision fournie est utilisable sinon on met 2 par defaut de maniere arbitraire\n precision = (precision === null || precision === 'undefined' || isNaN(precision)) ? 2 : precision;\n\n // Récupère la valeur formatée selon la LOCALE OU on affiche une case vide (à la place du NaN) si aucune valeur\n return value != null ? this.getFloatWithLOCALEFormat(value,precision) : \"\";\n }\n }\n\n\n /**\n * Renvoie\n * @param {number|string} value - valeur d'un float\n * @param {number} [precision] - le nombre maximal de décimale à afficher\n * @param {boolean} [forceDecimals = true] - force les décimales à afficher\n * @param {object} [customOptions] - options de formatage (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#:~:text=systems%20list.-,options,-Optional)\n * @returns {string|number} la valeur float formatée selon la LOCALE de l'utilisateur et les options de formatage\n */\n static getFloatWithLOCALEFormat (value, precision, forceDecimals = true, customOptions) {\n\n try {\n value = this.toNumber(value);\n\n // Si la valeur envoyée par le renderer n'est pas un nombre, on renvoie la valeur telle quelle\n if(isNaN(value)) {\n return value;\n }\n //Dans certains cas, le round renvoie un NaN, on le verifie a nouveau\n if(isNaN(MathUtils.round(value, precision))) {\n return value;\n }\n\n // si la precision n'est pas renseigné, on utilise la précision de la valeur\n precision = typeof precision !== \"number\" ? this.getPrecision(value) : precision;\n\n // precision d'arrondie\n value = MathUtils.round(value, precision);\n\n // Options pour l'affichage des décimales. On précise aussi le minimum en plus du maximum car la fonction\n // a tendance a ne pas mettre x décimales si ils ne sont pas significatif.\n // ex : 1,2 au lieu de 1,200 si on définie 3 décimales\n const options = Object.assign({\n minimumFractionDigits: (forceDecimals) ? precision : false,\n maximumFractionDigits: precision\n }, customOptions);\n\n // Retourne la valeur avec le bon formatage en fonction de la LOCALE et de la precision souhaitée\n return new Intl.NumberFormat(USER_LOCALE, options).format(value);\n\n }catch (error){\n console.error(error);\n return value;\n }\n }\n}\n","class DateTimeUtils {\n\n /**\n * Retourne une fonction de format de date prenant en paramètre un objet Date\n *\n * @param format le format (moment.js) à utiliser. Le format L sera utilisé sinon\n * @returns {function(*=): *}\n */\n static getDateFormatter(format) {\n return (value) => {\n if (value === null || value === undefined) {\n return '';\n }\n\n format = format !== undefined ? format : \"L\";\n try {\n let date = moment(value);\n if (date.isValid()) {\n return date.format(format);\n }\n } catch(e) {\n console.error(e)\n }\n }\n }\n\n /**\n * Get Date data with locale format\n * @param {Date} date - date to be formated\n * @param {Object} [options] [Intl.DateTimeFormat]{@link https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Intl/DateTimeFormat} options object\n * @returns {string} Date formatted by locale and options\n */\n static formatDateLocale(date, options = {year: \"numeric\", month: \"numeric\", day: \"numeric\"}){\n /** @var {String} USER_LOCALE - Connected user locale */\n const locale = getUserLanguage();\n return new Intl.DateTimeFormat(locale, options).format(date);\n }\n\n /**\n * Arrondie de temps pour temps en float\n * @param {number} floatTime - heurs en float\n * @param {number} precision - valeur du arrondie\n * @param {\"h\"|\"m\"|\"s\"|\"mm\"} roundUnit - unité à arrondir\n * @return {number} L'heure arrondie en format float\n */\n static roundFloatTime(floatTime, precision = 5, roundUnit = \"m\"){\n const hours = Math.floor(floatTime);\n // on utilise la valeur sans les heures pour qu'on puisse arrondir plus de 24 heures, car moment utilise les 24h d'une journée\n const timeRounded = moment.utc(moment.duration(floatTime - hours, 'h').asMilliseconds()).round(precision,roundUnit);\n return moment.duration(timeRounded).asHours() + hours;\n }\n\n /**\n * Convertit un horaire de la locale de l'utilisateur en horaire ISO au format H24\n * @param timeString \"13:42\" ou \"01:42 PM\"\n * @returns {string} Horaire formaté en HH:mm\n */\n static getISOTimeString(timeString) {\n return moment(timeString, moment.localeData().longDateFormat('LT')).format(\"HH:mm\");\n }\n\n /**\n * Parse un string horaire en différents formats pour renvoyer les heures et les minutes\n * @param timeString Heure au format \"05:42\" ou \"1:07 PM\"\n * @returns {number[]} Tableau avec les heures et les minutes\n */\n static getHoursMinutesFromTimeString(timeString) {\n return DateTimeUtils.getISOTimeString(timeString).split(':');\n }\n}\n","/**\n * Utilitaires pour la création/manipulation de composants ExtJS\n */\nclass ExtUtils {\n\n /**\n * @returns {String} {@link https://docs.sencha.com/touch/2.4/2.4.2-apidocs/#!/api/Ext.Date String format}\n * simple avec locale pour composants\n *\n * - locale EN = 'm/d/Y'\n * - locale FR = 'd/m/Y'\n */\n static get localeDateFormat(){\n return moment.localeData(getUserLanguage()).longDateFormat('L').split(\"\")\n .filter((c, i, a)=>(![\"D\",\"M\",\"Y\"].includes(c) || a.indexOf(c) === i))\n .map((c)=> (c === 'Y') ? c : c.toLowerCase())\n .join(\"\");\n }\n\n /**\n * @returns {String}\n * retourne le format JS pour les heures en fonction de la LOCALE\n *\n * - locale EN = 'H:i A'\n * - locale FR = 'H:i'\n */\n static get localeTimeFormat(){\n return moment.localeData(getUserLanguage()).longDateFormat('LT').split(\"\")\n .filter((c, i, a)=>(![\"m\", \"H\"].includes(c) || a.indexOf(c) === i))\n .map((c)=> c === \"m\" ? \"i\" : c)\n .join(\"\");\n }\n\n /**\n * Création des paramètres par défaut pour construire une colonne de type date dans une grille.\n *\n * @param header le header de la colonne\n * @param dataIndex le dataIndex de la colonne (pour lier la colonne à un des champs du store)\n * @param columnProperties les propriétés de la colonne que l'on souhaite surcharger par rapport aux valeurs par défaut\n * @param editorProperties les propriétés de l'éditeur de date que l'on souhaite surcharger par rapport aux valeurs par défaut\n *\n * @returns {Object} l'ensemble des propriétés nécessaires pour la création d'une colonne date dans une grid ExtJS\n */\n static getDateColumn(header, dataIndex, columnProperties, editorProperties) {\n\n return {\n header: header || d2e.trad('common.date'),\n dataIndex: dataIndex,\n width: 50,\n renderer: DateTimeUtils.getDateFormatter(\"L\"),\n ...columnProperties,\n editor: {\n xtype:'p2wdatefield',\n boxMinWidth: 0,\n ...editorProperties\n }\n }\n }\n\n /**\n * Création des éléments du menu contextuel de grille relatifs au filtrage des dates\n *\n * @param {Ext.ux.grid.filter.Filter} filter\n * @param {Date|string}value\n * @param {Ext.menu.Menu} menu\n */\n static createDateActionPanel(filter, value, menu) {\n const cancelFilterEntry = {\n text: translate('lbl.cancel_filter'),\n iconCls: 'icon-cancel-filter',\n handler: () => ExtUtils.cancelFilter(filter)\n };\n\n // On a cliqué sur une colonne vide, on ne propose donc pas de filtres\n if (value === \"\") {\n menu.add('-', cancelFilterEntry);\n return;\n }\n\n // On utilise Ext.Date pour parser et obtenir un Ext.Date car les surcharges ExtJS sur Date sont utilisées par le plugin de filtres\n value = Ext.isDate(value) ? value : Date.parseDate(value, 'Y-m-d');\n const date = ' ' + DateTimeUtils.getDateFormatter()(value);\n\n // Utilitaire pour générer une fonction de filtrage\n function dateFilterBuilder(filterSpec) {\n const currFilter = filter.getValue();\n Object.keys(filterSpec).forEach(key => {\n currFilter[key] = filterSpec[key];\n });\n filter.setValue(currFilter);\n filter.setActive(false);\n filter.setActive(true);\n }\n\n const greaterThanFilterEntry = {\n text:translate('lbl.show_more_than') + date,\n handler: () => dateFilterBuilder({after: value, on: undefined, before: undefined})\n };\n\n const lowerThanFilterEntry = {\n text:translate('lbl.show_less_than') + date,\n handler: () => dateFilterBuilder({after: undefined, on: undefined, before: value})\n };\n\n const equalToFilterEntry = {\n text:translate('lbl.show_equal_to') + date,\n handler: () => dateFilterBuilder({after: undefined, on: value, before: undefined})\n };\n\n menu.add('-', greaterThanFilterEntry, equalToFilterEntry, lowerThanFilterEntry, '-', cancelFilterEntry);\n }\n\n static cancelFilter(filter) {\n filter.setValue(filter.type == 'boolean' ? false : '');\n filter.setActive(false);\n }\n\n /**\n * Configuration de `Ext.MessageBox.show()`\n * @typedef MessageBoxConfig\n * @type Object\n * @property {string} title titre de la popup\n * @property {string} msg message de la popup\n */\n\n /**\n * Affichage d'un message dans une popup avec un bouton OK.\n * Par défaut, une icône d'avertissement est affichée.\n *\n * @see ExtUtils.alert\n *\n * @param {MessageBoxConfig} config à appliquer\n * @returns {Promise} promesse résolue lorsque l'utilisateur clique sur OK\n */\n static showPopupOK(config) {\n return new Promise(resolve => {\n Ext.Msg.show({\n icon: Ext.MessageBox.WARNING,\n ...config,\n buttons: Ext.Msg.OK,\n fn: function () {\n return resolve();\n },\n });\n });\n }\n\n /**\n * Affichage d'un message dans une popup avec un bouton OK et un bouton ANNULER.\n * Par défaut, une icône d'avertissement est affichée.\n *\n * @param {MessageBoxConfig} config à appliquer (cf `Ext.MessageBox.show()`)\n * @param {boolean} rejectOnCancel spécifier `true` pour rejeter la promesse lorsque l'utilisateur clique sur annuler\n * ou ferme la popup.\n *\n * @returns {Promise} promesse résolue lorsque l'utilisateur clique sur OK\n */\n static showPopupOKCANCEL(config, rejectOnCancel = false) {\n return new Promise((resolve, reject) => {\n Ext.Msg.show({\n icon: Ext.MessageBox.WARNING,\n buttons: Ext.Msg.OKCANCEL,\n ...config,\n fn: function (buttonSelected) {\n if (buttonSelected === 'ok') {\n return resolve('ok');\n }\n\n if (rejectOnCancel && buttonSelected === 'cancel') {\n return reject();\n }\n },\n });\n });\n }\n\n /**\n * Affichage d'un message dans une popup avec deux boutons OUI et NON.\n * Par défaut, une icône d'avertissement est affichée.\n *\n * @param {MessageBoxConfig} config à appliquer (cf `Ext.MessageBox.show()`)\n * @param {boolean} rejectOnCancel spécifier `true` pour rejeter la promesse lorsque l'utilisateur clique sur non\n * ou ferme la popup.\n *\n * @returns {Promise} promesse résolue lorsque l'utilisateur clique sur OK\n */\n static showPopupYESNO(config, rejectOnCancel = false) {\n return new Promise((resolve, reject) => {\n Ext.Msg.show({\n icon: Ext.MessageBox.WARNING,\n ...config,\n buttons: Ext.MessageBox.YESNO,\n fn: function (buttonSelected) {\n if (buttonSelected === 'yes') {\n return resolve();\n }\n\n if (rejectOnCancel && buttonSelected === 'no') {\n return reject();\n }\n },\n });\n });\n }\n\n /**\n * Affichage d'un message dans une popup avec les boutons OUI, NON et ANNULER.\n * Par défaut, une icône d'avertissement est affichée.\n *\n * @param {MessageBoxConfig} config à appliquer (cf `Ext.MessageBox.show()`)\n *\n * @returns {Promise} promesse résolue lorsque l'utilisateur clique sur OUI, rejetée quand il clique sur NON\n */\n static showPopupYESNOCANCEL(config) {\n return new Promise((resolve, reject) => {\n Ext.Msg.show({\n ...config,\n buttons: Ext.Msg.YESNOCANCEL,\n fn: function (buttonSelected) {\n if (buttonSelected === 'yes') {\n return resolve();\n }\n\n if (buttonSelected === 'no') {\n return reject();\n }\n }\n });\n });\n }\n\n /**\n * Affichage d'une popup simple (pas d'icône)\n *\n * @param {string} title titre de la popup\n * @param {string} message message de la popup\n *\n * @returns {Promise} Promise résolue à la fermeture de la popup\n */\n static alert(title, message) {\n return ExtUtils.showPopupOK({\n title: title,\n msg: message,\n message,\n icon: null\n });\n }\n\n /**\n * Affichage d'une popup d'avertissement (bouton OK et icône warning)\n *\n * @param {string} title titre de la popup\n * @param {string} message message\n *\n * @returns {Promise} Promise résolue à la fermeture de la popup\n */\n static showWarning(title, message) {\n return ExtUtils.showPopupOK({\n title: title,\n msg: message,\n message,\n icon: Ext.MessageBox.WARNING,\n cls: 'warning'\n });\n }\n\n /**\n * Affichage d'une popup d'erreur (bouton OK et icône error)\n *\n * @param {string} title titre de la popup\n * @param {string} message message\n *\n * @returns {Promise} Promise résolue à la fermeture de la popup\n */\n static showError(title, message) {\n return ExtUtils.showPopupOK({\n title: title,\n msg: message,\n message,\n icon: Ext.MessageBox.ERROR,\n cls: 'error'\n });\n }\n\n /**\n * Permet de créer une popup avec option : Ne plus afficher ce message.\n *\n * @param {MessageBoxConfig} config à appliquer (cf `Ext.MessageBox.show()`)\n * @param {string} message en-tête du message de la popup à afficher\n * @param {string} itemName nom de la page de la préférence\n * @param {string} subItemName la préférence qu'on veut utiliser\n *\n * @returns {Promise} Promise résolue à la fermeture de la popup\n */\n static popUpNePlusAfficher(config,message, itemName, subItemName) {\n // on récupère les préférences pour savoir si on affiche le message de prévention pour la suppression d'un produit déjà existant\n return Dwr.fetch(UsrPrefsManager.get, itemName, subItemName).then((dwrResult) => {\n return (dwrResult.obj ? Ext.decode(dwrResult.obj.data) : null);\n }).then((json) => {\n // si on a récupérer aucune préférence, on affiche le message de prévention.\n if (json) {\n return;\n }\n return new Promise((resolve) => {\n Ext.Msg.show({\n ...config,\n message: message + '

'+d2e.trad(\"msg.ne_plus_afficher\")+'
',\n buttons: [{\n text: d2e.trad('OK'),\n itemId: 'ok',\n ui: Ext.Viewport.isIOS() ? 'action' : 'normal'\n }],\n fn: function (buttonValue, inputText, showConfig) {\n const isChecked = document.getElementById('checkButton').checked ;\n if (buttonValue == \"ok\" && isChecked) {\n //On change les preferences\n UsrPrefsManager.save(itemName, subItemName, true);\n }\n return resolve();\n },\n icon: Ext.Msg.QUESTION\n });\n })\n });\n }\n\n /**\n * Remplace les caractères spéciaux d'une chaines par leur équivalent non spéciaux\n * @param {string} La chaine que l'on veux modifier\n * @returns {*}\n */\n static lowerCaseWithoutSpecialChar(character){\n character = character.toLowerCase();\n return character.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n }\n\n /**\n * Fix à utiliser sur Chrome (cf Zendesk #5152) : sauvegarde de l'état du scrolling de la grille et restauration à chaque reload du\n * store associé.\n *\n * @param {Ext.grid.EditorGridPanel} grid\n */\n static keepScrollState(grid) {\n const saveLastScroll= (g) => {\n const lockedScroller = g.view.lockedScroller;\n const scroller = g.view.scroller;\n grid.lastScroll = {\n lockedScroller: (lockedScroller && lockedScroller.getScroll) ? lockedScroller.getScroll() : null,\n scroller: (scroller && scroller.getScroll) ? scroller.getScroll() : null\n };\n };\n // watch cell edition and save last grid view scroll of scrollers (by double click or context menu)\n grid.on('celldblclick', (g) => saveLastScroll(g));\n grid.on('cellcontextmenu', (g) => saveLastScroll(g));\n // dispatch scrollback on grid reconfigure (Transfert grids)\n grid.on(\"reconfigure\", ()=>grid.fireEvent(\"scrollBack\"));\n // dispatch scrollback on dwrupdate (Mvt stock grids)\n grid.on(\"dwrupdate\", () => grid.fireEvent(\"scrollBack\"));\n\n // scrollback watcher\n grid.on(\"scrollBack\", function(){\n // if grid has lastScroll data, wait for store to load and set scroll\n (grid.lastScroll) && grid.getStore().on(\"load\", ()=> {\n // on prend la vue\n const view = grid.getView();\n // pour chaque element scroll enregistré (lockedScroller / scroller)\n Object.entries(grid.lastScroll).forEach( ls => {\n const elem = ls[0], scroll = ls[1];\n // pour chaque scroll direction (top / left)\n (scroll) && Object.entries(scroll).forEach( s => {\n const direction = s[0], position = s[1];\n // si l'element et la fonction de scroll existe, on scroll la dernière position\n (view[elem] && view[elem].scrollTo) && view[elem].scrollTo(direction, position);\n });\n });\n\n }, grid, {single: true});\n });\n\n }\n\n /**\n * renderer de la colonne étape\n */\n static etapeRenderer(){\n let prefix = '';\n return this.prefixedEtapeRenderer(prefix);\n }\n\n // cas où on a deux colonnes d'étapes différentes dans une même liste : dissociation des deux avec un prefix\n static prefixedEtapeRenderer(prefix){\n return function(val, meta, record) {\n let couleur = record.get(prefix + 'etape_couleur'),\n nom = record.get(prefix + 'etape_nom');\n\n //Si on a pas de couleur et de nom, on tente un fallback sur les colonnes sans prefix\n if (!nom && !couleur) {\n nom = record.get('etapeNom');\n couleur = record.get('etapeCouleur');\n }\n\n\n meta.attr = 'style=\"text-align:center; color: white; padding: 1px 1px; margin-top: 2px; margin-bottom: 2px;'\n + 'font-size: 11px; background-color: #' + couleur + '; border-radius: 15px \"';\n return nom;\n }\n }\n}\n\n/**\n * Insère une liste LoadJs dans le container spécifié.\n *\n * Note : il s'agit d'une fonction et non d'une méthode de {@link ExtUtils}.\n * Il semblerait que la définition d'une méthode pose un problème de scope de \"this\" et empêche son bon fonctionnement.\n *\n * @param action {string} action de la liste LoadJs à insérer\n * @param destination {string} id du contenant dans lequel insérer la liste\n * @param params {Object} paramètres supplémentaires à fournir pour générer la liste\n *\n * @returns {Promise|Promise|Promise} une promesse résolue avec la grille insérée\n * quand le code de génération de la liste a été exécuté, ou rejetée en cas d'erreur. Si l'erreur a été provoquée durant l'appel HTTP,\n * la réponse est fournie en paramètre\n */\nfunction loadExtSubList(action, destination, params) {\n return new Promise((resolve, reject) => {\n Ext.Ajax.request({\n url: prefixVar + 'loadListJs.do',\n params: {\n action: action,\n actionPanel: 'false',\n containerId: destination,\n ...params\n },\n success: function(xhr){\n try {\n eval(xhr.responseText);\n } catch (e) {\n reject(e);\n }\n\n const grid = Ext.getCmp(destination).findByType('editorgrid')[0];\n\n resolve(grid);\n },\n failure: function(response){\n ExtUtils.alert(d2e.trad(\"msg.error\"), d2e.trad(\"error.unintended\"));\n reject(response);\n }\n });\n });\n}","(function (factory) {\n typeof define === 'function' && define.amd ? define(factory) :\n factory();\n}((function () { 'use strict';\n\n /**\n * The code was extracted from:\n * https://github.com/davidchambers/Base64.js\n */\n\n var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n function InvalidCharacterError(message) {\n this.message = message;\n }\n\n InvalidCharacterError.prototype = new Error();\n InvalidCharacterError.prototype.name = \"InvalidCharacterError\";\n\n function polyfill(input) {\n var str = String(input).replace(/=+$/, \"\");\n if (str.length % 4 == 1) {\n throw new InvalidCharacterError(\n \"'atob' failed: The string to be decoded is not correctly encoded.\"\n );\n }\n for (\n // initialize result and counters\n var bc = 0, bs, buffer, idx = 0, output = \"\";\n // get next character\n (buffer = str.charAt(idx++));\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer &&\n ((bs = bc % 4 ? bs * 64 + buffer : buffer),\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4) ?\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) :\n 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n return output;\n }\n\n var atob = (typeof window !== \"undefined\" &&\n window.atob &&\n window.atob.bind(window)) ||\n polyfill;\n\n function b64DecodeUnicode(str) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, function(m, p) {\n var code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n })\n );\n }\n\n function base64_url_decode(str) {\n var output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw \"Illegal base64url string!\";\n }\n\n try {\n return b64DecodeUnicode(output);\n } catch (err) {\n return atob(output);\n }\n }\n\n function InvalidTokenError(message) {\n this.message = message;\n }\n\n InvalidTokenError.prototype = new Error();\n InvalidTokenError.prototype.name = \"InvalidTokenError\";\n\n function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified\");\n }\n\n options = options || {};\n var pos = options.header === true ? 0 : 1;\n try {\n return JSON.parse(base64_url_decode(token.split(\".\")[pos]));\n } catch (e) {\n throw new InvalidTokenError(\"Invalid token specified: \" + e.message);\n }\n }\n\n /*\n * Expose the function on the window object\n */\n\n //use amd or just through the window object.\n if (window) {\n if (typeof window.define == \"function\" && window.define.amd) {\n window.define(\"jwt_decode\", function() {\n return jwtDecode;\n });\n } else if (window) {\n window.jwt_decode = jwtDecode;\n }\n }\n\n})));\n//# sourceMappingURL=jwt-decode.js.map\n","/**\n * Définition des méthodes d'accès à l'API REST de P2W. Cette \"classe\" utilise la technique de closure pour masquer les méthodes\n * et variables privées (qui gèrent notamment le renouvellement du JWT).\n *\n * Le mécanisme d'authentification via JWT est le suivant :\n * - Au login de l'utilisateur, un cookie sécurisé contenant un refresh token (UUID) est enregistré sur son navigateur.\n * - Un appel initial au point d'entrée de mise à jour du JWT avec ce refresh token permet de récupérer un nouveau JWT (chaine de\n * caractère). Le refresh token est aussi renouvelé à ce moment, par sécurité.\n * - Ce JWT sera joint à chaque appel d'API dans le header \"Authorization\", pour authentifier l'utilisateur appelant auprès du serveur.\n * - Les JWTs expirent à interval régulier (question de sécurité). On met en place un appel récurrent pour récupérer un nouveau JWT avant\n * que le précédent n'arrive à expiration.\n * - Si malgré tout le JWT arrive à expiration avant d'avoir été renouvelé : une vérification de l'expiration est faite avant\n * chaque appel d'API, et le cas échéant un nouveau JWT est demandé avant d'effectuer l'appel.\n *\n * @see https://jwt.io/introduction\n * @type {{post: (function((string|URL), Object, Object): Promise), get: (function((string|URL), Object): Promise), delete: (function((string|URL), Object, Object): Promise), put: (function((string|URL), Object, Object): Promise)}}\n */\nconst ApiClient = (function() {\n\n /**\n * Appel pour l'obtention d'un nouveau JWT avec le refresh token. En cas de `retry + 1` erreurs, l'utilisateur est redirigé vers la page\n * de login de l'application.\n *\n * @param {number} retry nombre d'essais à effectuer en cas d'erreur\n * @returns {Promise} la réponse contenant le résultat de l'appel\n */\n function fetchRefreshEndpoint(retry = 2) {\n return fetch(createApiUrl('auth/refresh'), {\n method: 'POST',\n credentials: 'same-origin'\n }).then(response => {\n if(response.status === 401 && retry > 0) {\n return fetchRefreshEndpoint(retry - 1);\n }\n\n if (response.status === 401) {\n throw new Error('Expired refresh token');\n }\n\n return response;\n }).catch(redirectToLogin);\n }\n\n /**\n * Mise à jour du JWT. Utilise un système de \"lock\" pour empêcher plusieurs requêtes de mise à jour simultanées.\n *\n * @returns {Promise} promesse résolue lorsque le JWT a été mis à jour.\n */\n function updateJWT() {\n if (refreshLock != null) {\n return refreshLock;\n }\n\n jwt = fetchRefreshEndpoint().then(response => response.json()).then(json => json.jws);\n refreshLock = jwt.then(() => refreshLock = null);\n\n return refreshLock;\n }\n\n function isJwtExpired(token) {\n return moment().isAfter(new Date(jwt_decode(token).exp * 1000))\n }\n\n /**\n * Création d'un objet `URL` pour l'appel à l'API.\n * - Si `path` est un string, il est transformé en `URL` relatif au chemin d'API (typiquement, `/p2w/rest/`).\n * - Si `path` est un objet `URL` il est utilisé tel quel, en y ajoutant éventuellement les query params fournis\n *\n * @param {string|URL} path chemin relatif du point d'entrée, ou chemin absolu si il s'agit d'un objet `URL`\n * @param {object} queryParams paramètres d'URL à fournir (sous forme clef: valeur). Les valeurs de type `object` seront sérialisées\n * en JSON, et les tableaux seront fournis conformément à la spécification des URIs.\n *\n * @example `createApiUrl('fields', {foo: ['bar', 'mob']}) // https://test.process2wine.com/p2w/rest/fields&foo=bar&foo=mob`\n *\n * @returns {URL}\n */\n function createApiUrl(path, queryParams = {}) {\n if (typeof path == 'string' || path instanceof String) {\n if (path.indexOf('/') === 0) {\n path = path.slice(1);\n }\n\n path = new URL('rest/' + path, window.location.href);\n }\n\n if (!(path instanceof URL)) {\n throw new Error(\"Wrong url format\");\n }\n\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value instanceof Array) {\n value.forEach(e => path.searchParams.append(key, e));\n return;\n }\n\n if (value instanceof Object && !(value instanceof String)) {\n path.searchParams.set(key, JSON.stringify(value));\n return;\n }\n\n path.searchParams.set(key, value);\n });\n\n return path;\n }\n\n /**\n * Appel d'un point d'entrée de l'API avec le chemin, la méthode et le body donnés.\n *\n * @returns {Promise}\n */\n async function callEndPoint(path, method, body) {\n const url = createApiUrl(path);\n\n try {\n let token = await jwt;\n // Si le JWT est expiré, ou si un appel de mise à jour de celui-ci est en cours, on attends qu'il soit rafraîchi\n if (isJwtExpired(token) || refreshLock != null) {\n await updateJWT();\n token = await jwt;\n }\n\n // AbortController par path reference\n const abortControllerRef = path.toString();\n const abortController = new AbortController();\n Object.assign(abortControllers, {[abortControllerRef]: abortController});\n\n return fetch(url, {\n signal: abortController.signal,\n method: method,\n body: JSON.stringify(body),\n headers: {\n 'Authorization': 'Bearer ' + token,\n 'Content-Type': 'application/json'\n }\n }).then(res =>{\n delete abortControllers[abortControllerRef];\n return res;\n });\n } catch (e) {\n log.error(\"Échec à l'appel \" + method + \" \" + path.toString(), e);\n return Promise.reject(\"Failed to fetch endpoint\");\n }\n }\n\n /**\n * Redirection vers la page de login. Effectue un appel vers l'URL de logout pour s'assurer que l'utilisateur devra se ré-authentifier.\n *\n * @returns {Promise}\n */\n async function redirectToLogin() {\n await ExtUtils.showWarning(\n d2e.trad('P2w.statut.warn'),\n d2e.trad('error.msg.session.invalid')\n );\n\n await fetch(new URL('logout.do', window.location.href));\n location.reload();\n }\n\n /**\n * Lock utilisé pour la mise à jour du JWT. Si ce lock vaut null, alors aucune requête de mise à jour n'est en cours. Sinon, il contient\n * une promesse qui sera résolue lorsque le JWT aura été mis à jour.\n *\n * @see updateJWT\n * @type {null|Promise}\n */\n let refreshLock = null;\n\n /**\n * Variable contenant une promesse avec le JWT. On le stocke en mémoire car le LocalStorage n'est pas un moyen sécurisé pour stocker ce\n * token.\n *\n * @type {Promise}\n */\n let jwt;\n let isInitialized = false;\n\n /**\n * AbortControllers des promesses en cours\n * @type {Object}\n */\n const abortControllers = {};\n\n return {\n\n /**\n * Abort d'un fetch selon les params envoyées pour la requête\n * @param {string|URL} path chemin relatif vers le PE (ex: `farm/1234/fields`)\n * @param {object} queryParams objet littéral contenant query parameters à ajouter à l'URL, sous la forme `clef: valeur`.\n */\n abort: function(path, queryParams){\n const ref = createApiUrl(path, queryParams).toString();\n abortControllers[ref] && abortControllers[ref].abort(\"abort\");\n delete abortControllers[ref];\n },\n\n /**\n * Abort des toutes les requêtes en cours\n *
⚠ Utiliser avec parcimonie\n */\n abortAll: function(){\n Object.entries(abortControllers).forEach(([ref, abortController]) => {\n abortController.abort(\"abort\");\n delete abortControllers[ref];\n })\n },\n\n /**\n * GET sur un point d'entrée de l'API.\n *\n * @param {string|URL} path chemin relatif vers le PE (ex: `farm/1234/fields`)\n * @param {object} queryParams objet littéral contenant query parameters à ajouter à l'URL, sous la forme `clef: valeur`.\n * Les tableaux sont acceptés, et les objets littéraux également (ces derniers seront sérialisés en JSON)\n *\n * @returns {Promise} la réponse HTTP retournée par l'appel à l'API\n */\n get: function(path, queryParams) {\n return callEndPoint(createApiUrl(path, queryParams), 'GET');\n },\n\n /**\n * POST sur un point d'entrée de l'API.\n *\n * @param {string|URL} path chemin relatif vers le PE (ex: `farm/1234/fields`)\n * @param {object} body JSON (non sérialisé) à fournir en tant que corps de la requête\n * @param {object} queryParams objet littéral contenant query parameters à ajouter à l'URL, sous la forme `clef: valeur`.\n * Les tableaux sont acceptés, et les objets littéraux également (ces derniers seront sérialisés en JSON)\n *\n * @returns {Promise} la réponse HTTP retournée par l'appel à l'API\n */\n post: function(path, body, queryParams) {\n return callEndPoint(createApiUrl(path, queryParams), 'POST', body);\n },\n\n /**\n * PUT sur un point d'entrée de l'API.\n *\n * @param {string|URL} path chemin relatif vers le PE (ex: `farm/1234/fields`)\n * @param {object} body JSON (non sérialisé) à fournir en tant que corps de la requête\n * @param {object} queryParams objet littéral contenant query parameters à ajouter à l'URL, sous la forme `clef: valeur`.\n * Les tableaux sont acceptés, et les objets littéraux également (ces derniers seront sérialisés en JSON)\n *\n * @returns {Promise} la réponse HTTP retournée par l'appel à l'API\n */\n put: function(path, body, queryParams) {\n return callEndPoint(createApiUrl(path, queryParams), 'PUT', body);\n },\n\n /**\n * DELETE sur un point d'entrée de l'API.\n *\n * @param {string|URL} path chemin relatif vers le PE (ex: `farm/1234/fields`)\n * @param {object} body JSON (non sérialisé) à fournir en tant que corps de la requête\n * @param {object} queryParams objet littéral contenant query parameters à ajouter à l'URL, sous la forme `clef: valeur`.\n * Les tableaux sont acceptés, et les objets littéraux également (ces derniers seront sérialisés en JSON)\n *\n * @returns {Promise} la réponse HTTP retournée par l'appel à l'API\n */\n delete: function(path, body , queryParams) {\n return callEndPoint(createApiUrl(path, queryParams), 'DELETE', body);\n },\n\n initialize: function() {\n if (isInitialized) {\n return;\n }\n\n // Initialisation du JWT\n updateJWT();\n\n // Rafraîchissement régulier du JWT avant son expiration\n setInterval(() => updateJWT(), 60 * 10 * 1000);\n\n isInitialized = true;\n }\n }\n})();","class EmailValidator {\n static validate(email) {\n return /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(email);\n }\n}","class PhoneValidator {\n /**\n *\n * @returns {RegExp[]}\n * @private\n */\n static _getRegexps() {\n return [\n /\\+(9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\\d{1,14}$/, // international\n /1?\\W*([2-9][0-8][0-9])\\W*([2-9][0-9]{2})\\W*([0-9]{4})(\\se?x?t?(\\d*))?/, // Canada\n /^(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:\\(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\s*\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+))?$/, // US\n /^(?:(?:\\+|00)33|0)\\s*[1-9](?:[\\s.-]*\\d{2}){4}$/gmi // France\n ];\n }\n\n static validate(phoneNumber) {\n return PhoneValidator._getRegexps().some(regexp => regexp.test(phoneNumber));\n }\n}","/**\n * Fourni un ensemble de méthodes pour la gestion d'un lecteur de QR Code\n */\nclass P2wQrCodescanner {\n\n /**\n * Retourne un objet QrScanner\n * @param props\n * @returns {QrScanner}\n */\n static getScanner(props){\n return new QrScanner(\n props.domElement, // element dans lequel le scanneur sera intégré\n (result) => props.onSuccess(result), // Handler quand scan reussi\n {\n onDecodeError: () => {},\n highlightScanRegion: true,\n highlightCodeOutline: true,\n returnDetailedScanResult: true,\n preferredCamera: 'environment'\n }\n );\n }\n\n /**\n * @return {Promise} Promesse de vérification de disponibilité de la caméra de l'utilisateur\n */\n static verifyUserCameraAvailability(){\n return Promise.resolve()\n .then(()=> window.navigator.mediaDevices.getUserMedia({ video: { facingMode: \"environment\" } }))\n .then(mediaStream => {\n // on arrête/supprime le stream video après la vérification\n mediaStream && mediaStream.getVideoTracks && mediaStream.getVideoTracks().forEach(track => {\n track && track.stop();\n track && mediaStream.removeTrack(track);\n });\n return true;\n })\n .catch(error =>{\n console.error(error);\n return false;\n });\n }\n\n}"]}