{"version":3,"file":"wb3Api.umd.cjs","sources":["../src/lib/api/index.js","../src/lib/gouv/colors.js","../src/lib/gouv/gouv_api.js","../src/lib/utils/chunks.js","../src/lib/utils/updateEvent.js","../src/lib/plateform/main/3dexperience_api.js","../src/lib/plateform/Compass/index.js","../src/lib/plateform/main/3dcompass_api.js","../src/lib/plateform/Usersgroup/index.js","../src/lib/plateform/main/getCSRFToken.js","../node_modules/querystring/decode.js","../node_modules/querystring/encode.js","../node_modules/querystring/index.js","../src/lib/plateform/main/3dspace_api.js","../src/lib/plateform/main/getCTX.js","../src/lib/plateform/main/getDataFrom3DSpace.js","../src/lib/plateform/main/getDownloadDocument.js","../src/lib/plateform/main/pushDataIn3DSpace.js","../src/lib/plateform/main/loadDatas.js","../src/lib/plateform/Tag/index.js","../src/lib/plateform/Swym/3dswym_api.js","../src/lib/plateform/Swym/communauty/index.js","../src/lib/plateform/Swym/idea/index.js","../src/lib/plateform/Swym/user/index.js","../src/lib/plateform/Swym/comment/index.js","../src/lib/plateform/main/iterop_apiv2.js","../src/lib/add/index.js","../src/lib/plateform/Search/index.js"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\r\n/**\r\n * @description La fonction UUID génère un UUID (Universally Unique Identifier) aléatoire.\r\n * @returns La fonction UUID renvoie un UUID (Universally Unique Identifier) généré aléatoirement à l'aide de la fonction uuid.\r\n *\r\n */\r\nexport function UUID() {\r\n  return uuid();\r\n}\r\n","// pour les charts Piveteau\r\nexport const couleurs = {\r\n  b3M3Yellow: \"#FFB300\",\r\n  b3AboutageBlue: \"#42A5F5\",\r\n  b3UsinageGreen: \"#689F38\",\r\n  b3PanneauOrange: \"#ff8000\",\r\n  b3M350percent: \"#fafa6e\",\r\n  b3M380percent: \"#aae479\",\r\n  b3M390percent: \"#64c987\",\r\n  b3M3100percent: \"#23aa8f\",\r\n  b3M3105percent: \"#00898a\",\r\n  b3M3110percent: \"#176877\",\r\n  b3M3120percent: \"#2a4858\",\r\n  b3Aboutage50percent: \"#fafa6e\",\r\n  b3Aboutage80percent: \"#aae479\",\r\n  b3Aboutage90percent: \"#64c987\",\r\n  b3Aboutage100percent: \"#23aa8f\",\r\n  b3Aboutage105percent: \"#00898a\",\r\n  b3Aboutage110percent: \"#176877\",\r\n  b3Aboutage120percent: \"#2a4858\",\r\n  b3Warning: \"#FF0000\",\r\n  b3Edit1: \"#AD1457\",\r\n  b3Edit2: \"#F4511E\",\r\n  b3Edit3: \"#009688\",\r\n  b3Edit4: \"#D50000\",\r\n  b3Edit5: \"#039BE5\",\r\n  b3Edit6: \"#9E69AF\",\r\n  b3Edit7: \"#A79B8E\",\r\n  b3Edit8: \"#616161\",\r\n  b3Edit9: \"#795548\",\r\n};\r\n","import { DateTime } from \"luxon\";\r\nimport { couleurs } from \"./colors\";\r\n/**\r\n * Cette fonction récupère une liste de communes en fonction d'un code postal donné à l'aide d'une API\r\n * d'IGN France.\r\n * @param {String} cp - Le paramètre `cp` est une chaîne représentant un code postal français. Il est converti\r\n * en entier à l'aide de `parseInt()` avant d'être utilisé dans la requête API.\r\n * @param { Function } - onDone est une fonction de rappel qui sera exécutée lorsque l'appel API réussit et\r\n * renvoie une réponse. Il prend les données de réponse comme argument et peut être utilisé pour gérer\r\n * les données dans la fonction appelante.\r\n * @param { Function } - Le paramètre `onError` est une fonction de rappel qui sera exécutée s'il y a une\r\n * erreur lors de la requête de récupération. Il permet une gestion personnalisée des erreurs et peut\r\n * être utilisé pour afficher des messages d'erreur ou effectuer d'autres actions en réponse à une\r\n * erreur.\r\n */\r\nexport async function getCommunes(cp, onDone = undefined, onError = undefined) {\r\n  const codePostal = parseInt(cp);\r\n  await fetch(\r\n    \"https://apicarto.ign.fr/api/codes-postaux/communes/\" + codePostal,\r\n    {\r\n      method: \"GET\",\r\n      headers: {\r\n        Accept: \"application/json\",\r\n      },\r\n    },\r\n  )\r\n    .then((response) => response.json())\r\n    .then((json) => {\r\n      if (onDone) onDone(json);\r\n    })\r\n    .catch((error) => {\r\n      if (onError) onError(error);\r\n      console.error(\"Erreur : \" + error);\r\n    });\r\n}\r\n\r\n/**\r\n * Il s'agit d'une fonction JavaScript qui utilise l'API-adresse.data.gouv.fr pour rechercher des\r\n * adresses à partir d'une requête et renvoie les résultats au format JSON.\r\n * @param { String } query - L'adresse ou la requête d'emplacement à rechercher dans l'API.\r\n * @param { Function } - onDone est une fonction de rappel qui sera exécutée lorsque l'appel API réussit et\r\n * renvoie une réponse. Il prend la réponse JSON comme paramètre.\r\n * @param { Function } - Le paramètre `onError` est une fonction de rappel qui sera exécutée s'il y a une\r\n * erreur lors de l'appel de l'API. C'est un paramètre optionnel qui peut être passé à la fonction\r\n * `findAdresse`. S'il est fourni, il recevra l'objet d'erreur comme argument.\r\n */\r\nexport async function findAdresse(\r\n  query,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  // https://api-adresse.data.gouv.fr/search/?q=\r\n  query = encodeURIComponent(query);\r\n  await fetch(\r\n    \"https://api-adresse.data.gouv.fr/search/?q=\" + query + \"&limit=15\",\r\n    {\r\n      method: \"GET\",\r\n      headers: {\r\n        Accept: \"application/json\",\r\n      },\r\n    },\r\n  )\r\n    .then((response) => response.json())\r\n    .then((json) => {\r\n      if (onDone) onDone(json);\r\n    })\r\n    .catch((error) => {\r\n      if (onError) onError(error);\r\n      console.error(\"Erreur : \" + error);\r\n    });\r\n}\r\n\r\n/**\r\n * @description La fonction `getDataFromGouvFr` récupère les données de l'API du gouvernement français pour les\r\n * jours fériés et les formate dans une structure de données spécifique.\r\n * @param events - Le paramètre `events` est un tableau d'objets représentant des événements. (store.loadedEvents)\r\n * @param colors - Le paramètre `colors` est un objets représentant des couleurs. (Piveteau)\r\n * @returns les données formatées, qui incluent les événements récupérés depuis le point de terminaison\r\n * API \"https://calendrier.api.gouv.fr/jours-feries/metropole/\". Les événements sont formatés dans une\r\n * structure spécifique et renvoyés sous forme d'objet.\r\n */\r\nexport async function getDataFromGouvFr(events, colors = couleurs) {\r\n  let year = DateTime.now().year;\r\n  const loadedEvents = events;\r\n  const sortedData = [];\r\n\r\n  const formatData = (json) => {\r\n    for (let date in json) sortedData.push({ date, comment: json[date] });\r\n  };\r\n\r\n  for (let i = year; i <= year + 1; i++) {\r\n    await fetch(\r\n      \"https://calendrier.api.gouv.fr/jours-feries/metropole/\" + i + \".json\",\r\n      {\r\n        method: \"GET\",\r\n        headers: {\r\n          Accept: \"application/json\",\r\n        },\r\n      },\r\n    )\r\n      .then((response) => response.json())\r\n      .then((json) => {\r\n        formatData(json);\r\n      })\r\n      .catch((error) => console.error(\"Erreur : \" + error));\r\n  }\r\n\r\n  const formatedData = () => {\r\n    const data =\r\n      loadedEvents.length === 0\r\n        ? {\r\n            events: [],\r\n          }\r\n        : loadedEvents;\r\n    for (let each of sortedData) {\r\n      const index = data.events.findIndex(\r\n        (event) =>\r\n          event.start === DateTime.fromISO(each.date).toISODate() &&\r\n          event.name === \"Férié : \" + each.comment,\r\n      );\r\n\r\n      if (index === -1)\r\n        data.events.push({\r\n          name: \"Férié : \" + each.comment,\r\n          start: DateTime.fromISO(each.date).toISODate(),\r\n          end: DateTime.fromISO(each.date).toISODate(),\r\n          color: colors.b3BusinnessDays,\r\n          timed: false,\r\n        });\r\n    }\r\n    return data;\r\n  };\r\n\r\n  return formatedData();\r\n}\r\n","/**\r\n * @description `chunkArray` Divise un tableau en plus petits blocs et appelle une fonction fournie sur chaque bloc.\r\n *\r\n * @param {Object} obj - Un objet contenant le tableau à diviser, la taille de chaque bloc,et la fonction à appeler sur chaque bloc.\r\n * @param {Array} obj.credentials - les données de base pour la fonction à appeler sur chaque bloc.(space, token...)\r\n * @param {Array} obj.myArray - Le tableau à diviser.\r\n * @param {number} obj.chunk - La taille voulue de chaque bloc.\r\n * @param {Function} obj.fn_to_call - La fonction à appeler sur chaque bloc.\r\n * @return {void} Cette fonction ne renvoie rien.\r\n */\r\nexport function chunkArray(obj, getResponse, getError) {\r\n  const { credentials, myArray, chunk, fn_to_call } = obj;\r\n\r\n  const chunks = [];\r\n  for (let i = 0; i < myArray.length; i += chunk) {\r\n    const arrayChunks = myArray.slice(i, i + chunk);\r\n    chunks.push(arrayChunks);\r\n  }\r\n\r\n  loopingChunk(\r\n    { credentials, chunks, initLoop: 0, fn: fn_to_call },\r\n    (rep) => {\r\n      if (getResponse) getResponse(rep);\r\n    },\r\n    (err) => {\r\n      if (getError) getError(err);\r\n    }\r\n  );\r\n}\r\n\r\n/**\r\n * @description `loopingChunk` Exécute une boucle sur un tableau de chunks, en appelant une fonction fournie sur chaque chunk.\r\n *\r\n * @param {Object} obj - Un objet contenant le tableau de chunks, l'index de démarrage de la boucle et la fonction à appeler sur chaque chunk.\r\n * @param {Array} obj.credentials - les données de base pour la fonction à appeler.\r\n * @param {Array} obj.chunks - Le tableau de chunks sur lequel effectuer la boucle.\r\n * @param {number} obj.initLoop - L'index de démarrage de la boucle.\r\n * @param {Function} obj.fn - La fonction à appeler sur chaque chunk. La fonction doit prendre trois arguments : le chunk actuel, une fonction de rappel, et deux fonctions de rappel facultatives pour gérer les réponses de succès et d'erreur.\r\n * @return {void} Cette fonction ne renvoie rien.\r\n */\r\nfunction loopingChunk(obj, onDone, onError) {\r\n  const { credentials, chunks, initLoop, fn } = obj;\r\n  const loop = (i) => {\r\n    fn(\r\n      credentials,\r\n      chunks[i],\r\n      () => {\r\n        i++;\r\n        if (i < chunks.length) {\r\n          loop(i);\r\n        }\r\n      },\r\n      (response) => {\r\n        if (onDone) {\r\n          onDone(response);\r\n        }\r\n      },\r\n      (error) => {\r\n        if (onError) {\r\n          onError(error);\r\n        }\r\n      }\r\n    );\r\n  };\r\n  loop(initLoop);\r\n}\r\n","/**\r\n * @description La fonction `updateEvent` met à jour un tableau d'événements en ajoutant ou en supprimant un\r\n * événement en fonction d'une condition donnée.\r\n * @param {Array} events - (store.loadedEvents)Une panoplie d'événements. Chaque événement est un objet avec des propriétés telles que uuid, start, end, etc.\r\n *\r\n * @param {Object} data - Le paramètre `data` est un objet qui représente l'événement à mettre à jour.\r\n * @param {String}[data.uuid] - L'identifiant unique de l'événement.\r\n * @param {Boolean} [add=true] - Le paramètre \"add\" est une valeur booléenne qui détermine s'il faut ajouter ou\r\n * mettre à jour un événement dans le tableau des événements. Si add est vrai, la fonction ajoutera\r\n * l'événement au tableau s'il n'existe pas déjà. Si add est faux, la fonction mettra à jour\r\n * l'événement existant dans le tableau\r\n * @returns le tableau `db` (store.loadedEvents) mis à jour.\r\n */\r\nexport async function updateEvent(events, data, add = true) {\r\n  const index = events.events.findIndex((val) => val.uuid === data.uuid);\r\n\r\n  if (index === -1) {\r\n    events.events.push(data);\r\n  } else {\r\n    if (add) events.events[index] = data;\r\n    else events.events.splice(index, 1);\r\n  }\r\n\r\n  if (events.length > 0) events.sort((a, b) => a.start - b.start);\r\n\r\n  return events;\r\n}\r\n","import { widget, requirejs } from \"@widget-lab/3ddashboard-utils\";\r\n\r\n/**\r\n * @description Cette fonction effectue un appel HTTP authentifié à l'aide de la bibliothèque WAFData en de la plateforme.\r\n * @param {String} url - L'URL du point de terminaison de l'API que la fonction appellera.\r\n * @param {object} options - Le paramètre `options` est un objet qui contient diverses options pour la requête\r\n * HTTP, telles que la méthode de requête (GET, POST, etc.), les en-têtes, le corps, etc. Ces options\r\n * sont généralement transmises à l'API `fetch` ou `XMLHttpRequest` pour effectuer la requête HTTP\r\n * réelle.\r\n */\r\nexport function _httpCallAuthenticated(url, options) {\r\n  requirejs([\"DS/WAFData/WAFData\"], (WAFData) => {\r\n    WAFData.authenticatedRequest(url, options);\r\n  });\r\n}\r\n\r\n/**\r\n * @description Cette fonction définit un élément comme étant déplaçable et transmet des données et une fonction de\r\n * rappel à exécuter lorsque le glissement commence (drag and drop).\r\n * @param elem - L'élément HTML qui doit être rendu déplaçable.\r\n * @param strData - strData est une chaîne qui représente les données associées à l'élément déplaçable.\r\n * Ces données sont accessibles lors des opérations de glisser-déposer pour fournir des informations\r\n * supplémentaires sur l'élément déplacé.\r\n * @param onDrag - onDrag est une fonction de rappel qui sera exécutée au début de l'opération de\r\n * glissement. Il peut être utilisé pour effectuer toutes les actions nécessaires avant le début de\r\n * l'opération de glissement, telles que la configuration des données à transférer ou la mise à jour de\r\n * l'apparence de l'élément déplaçable.\r\n */\r\nexport function _setDraggable(elem, strData, onDrag) {\r\n  requirejs([\"DS/DataDragAndDrop/DataDragAndDrop\"], (DataDragAndDrop) => {\r\n    DataDragAndDrop.draggable(elem, {\r\n      data: strData,\r\n      start: onDrag,\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * @description Cette fonction configure un proxy de navigateur de balises avec des balises spécifiées et un événement de filtre facultatif.\r\n *\r\n * @param tags - Le paramètre tags est un tableau de chaînes représentant les balises qui seront\r\n * utilisées pour filtrer les sujets dans le widget TagNavigatorProxy.\r\n * @param [onTaggerFilter] - Le paramètre onTaggerFilter est une fonction de rappel qui sera exécutée\r\n * lorsque l'utilisateur filtrera les sujets dans le tagger. Il recevra les sujets filtrés en argument.\r\n */\r\nexport function _setupTagger(tags, onTaggerFilter = undefined) {\r\n  requirejs([\"DS/TagNavigatorProxy/TagNavigatorProxy\"], (TagNavigatorProxy) => {\r\n    let taggerProxy;\r\n    if (taggerProxy === undefined) {\r\n      taggerProxy = TagNavigatorProxy.createProxy({\r\n        widgetId: widget.id,\r\n        filteringMode: \"WithFilteringServices\",\r\n      });\r\n\r\n      if (onTaggerFilter !== undefined)\r\n        taggerProxy.addEvent(\"onFilterSubjectsChange\", onTaggerFilter);\r\n    }\r\n    taggerProxy.setSubjectsTags(tags);\r\n  });\r\n}\r\n\r\n/**\r\n * Cette fonction définit un élément comme pouvant être déposé à l'aide de la bibliothèque\r\n * DataDragAndDrop.\r\n * @param elem - L'élément HTML qui doit être rendu déposable.\r\n * @param drop - Le paramètre `drop` est une fonction qui sera appelée lorsqu'un élément déplaçable est\r\n * déposé sur l'élément déplaçable. Il prend généralement l'élément supprimé comme argument et exécute\r\n * une action basée sur celui-ci.\r\n */\r\nexport function _setDroppable(elem, drop) {\r\n  requirejs([\"DS/DataDragAndDrop/DataDragAndDrop\"], (DataDragAndDrop) => {\r\n    DataDragAndDrop.droppable(elem, {\r\n      drop,\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * @description Cette fonction asynchrone obtient les services de la plateforme à l'aide de la bibliothèque i3DXCompassServices et appelle les fonctions onComplete ou onFailure en fonction du résultat.\r\n *\r\n * @param platformId - ID de la plate-forme pour laquelle les services sont demandés. Si aucun ID de\r\n * plate-forme n'est fourni, la fonction tentera de récupérer l'ID à partir d'une valeur de widget. Si\r\n * aucun ID n'est trouvé, il sera défini sur `undefined`.\r\n * @param onComplete - Une fonction de rappel qui sera exécutée lorsque les services de la plateforme\r\n * seront récupérés avec succès. Il prend les services de plateforme récupérés comme argument.\r\n * @param onFailure - Le paramètre onFailure est une fonction de rappel qui sera exécutée en cas\r\n * d'erreur ou d'échec dans l'exécution de la fonction getPlatformServices. Il permet de gérer les\r\n * erreurs et de fournir un retour d'information approprié à l'utilisateur.\r\n */\r\nexport async function _getPlatformServices(\r\n  platformId,\r\n  onComplete = undefined,\r\n  onFailure = undefined\r\n) {\r\n  await requirejs(\r\n    [\"DS/i3DXCompassServices/i3DXCompassServices\"],\r\n    (i3DXCompassServices) => {\r\n      if (!platformId || platformId === \"\") {\r\n        platformId = widget.getValue(\"PlatFormInstanceId\");\r\n      }\r\n      if (!platformId || platformId === \"\") {\r\n        platformId = undefined;\r\n      }\r\n      if (onComplete) {\r\n        onComplete(\r\n          i3DXCompassServices.getPlatformServices({\r\n            platformId,\r\n            onComplete,\r\n            onFailure,\r\n          })\r\n        );\r\n      }\r\n    }\r\n  );\r\n}\r\n\r\n/**\r\n * @description\r\n *  La fonction `_getPlateformInfos` récupère les informations sur la plateforme à l'aide du module\r\n * PlatformAPI et renvoie les informations dans un objet.\r\n * @returns un objet appelé \"retourAPI\" qui contient les propriétés suivantes :\r\n * - {String} tenant, Le tenant de la plateforme sur lequel on travaille.\r\n * - {Object} user, L'utilisateur connecté à la plateforme...\r\n * - {ArrayOfObject} appsConfiguration, liste d'app auquel on accès.\r\n * - {String} appConf\r\n *\r\n */\r\nexport function _getPlateformInfos() {\r\n  let retourAPI = {};\r\n\r\n  requirejs([\"DS/PlatformAPI/PlatformAPI\"], (plAPI) => {\r\n    const tenant = plAPI.getTenant();\r\n    const user = plAPI.getUser();\r\n    const appsConfiguration = plAPI.getAllApplicationConfigurations();\r\n    const appConf = plAPI.getApplicationConfiguration(\r\n      \"com.3ds.wp.passport.cors\"\r\n    );\r\n    retourAPI = {\r\n      tenant,\r\n      user,\r\n      appsConfiguration,\r\n      appConf,\r\n    };\r\n  });\r\n  console.log(\"%cRETOUR API :\", \"color:blue\", retourAPI);\r\n  return retourAPI;\r\n}\r\n\r\nexport function _getLoginTicket(credentials) {\r\n  if (credentials.tenant) {\r\n    const urlService = `https://${credentials.tenant}-eu1-apps.3dexperience.3ds.com/enovia/resources/AppsMngt/api/v1/services?tenant=${credentials.tenant}&cors=true&xrequestedwith=xmlhttprequest`;\r\n    _httpCallAuthenticated(urlService, {\r\n      onComplete(response) {\r\n        const oResponse =\r\n          typeof response === \"string\" ? JSON.parse(response) : response;\r\n        if (oResponse && \"platforms\" in oResponse) {\r\n          const listServiceUrl = oResponse.platforms.find(\r\n            (platform) => platform.id === credentials.tenant.toUpperCase()\r\n          );\r\n          if (onDone && listServiceUrl) onDone(listServiceUrl);\r\n          else if (onError)\r\n            onError(\"_getLoginTicket return listServiceUrl = undefined\");\r\n        } else {\r\n          if (onError) onError(\"_getLoginTicket return oResponse = undefined\");\r\n        }\r\n      },\r\n      onFailure(response) {\r\n        if (onError) onError(response);\r\n      },\r\n    });\r\n  }\r\n}\r\nexport function _getMe(credentials, onDone = undefined, onError = undefined) {\r\n  if (credentials.tenant) {\r\n    const urlService = `https://${credentials.tenant}-eu1.iam.3dexperience.3ds.com/api/authenticated/user/me?xrequestedwith=xmlhttprequest`;\r\n    _httpCallAuthenticated(urlService, {\r\n      onComplete(response) {\r\n        const oResponse =\r\n          typeof response === \"string\" ? JSON.parse(response) : response;\r\n        if (oResponse && \"fields\" in oResponse) {\r\n          if (onDone) onDone(oResponse.fields);\r\n        } else {\r\n          if (onError) onError(\"_getMe return not find properties fields\");\r\n        }\r\n      },\r\n      onFailure(response) {\r\n        if (onError) onError(\"_getMe return error\",response);\r\n      },\r\n    });\r\n  }\r\n}\r\n\r\nexport function _getServiceUrl(credentials, onDone = undefined, onError = undefined) {\r\n  console.log(\"_getServiceUrl\");\r\n  if (credentials.tenant) {\r\n      const urlService = `https://${credentials.tenant.toLowerCase()}-eu1-compass.3dexperience.3ds.com/enovia/resources/AppsMngt/api/v1/services?platform=${credentials.tenant.toUpperCase()}&cors=true&xrequestedwith=xmlhttprequest`;\r\n      _httpCallAuthenticated(urlService, {\r\n          onComplete(response) {\r\n              const oResponse = typeof response === \"string\" ? JSON.parse(response) : response;\r\n              if (oResponse && \"platforms\" in oResponse) {\r\n                  const listServiceUrl = oResponse.platforms.find(platform => platform.id === credentials.tenant.toUpperCase());\r\n                  if (onDone && listServiceUrl) onDone(listServiceUrl);\r\n                  else if (onError) onError(\"_getServiceUrl return listServiceUrl = undefined\");\r\n              } else {\r\n                  if (onError) onError(\"_getServiceUrl return oResponse = undefined\");\r\n              }\r\n          },\r\n          onFailure(response) {\r\n              if (onError) onError(response);\r\n          }\r\n      });\r\n  }\r\n}\r\n\r\nexport function _getServiceUrl_3DPassport(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const urlService = `https://${credentials.tenant}-eu1-registry.3dexperience.3ds.com/api/v1/platform/service/instance?serviceId=3dpassport&platformId=${credentials.tenant}`;\r\n    _httpCallAuthenticated(urlService, {\r\n      onComplete(response) {\r\n        const oResponse = JSON.parse(response);\r\n        console.log(\"serviceId=3dpassport\", oResponse);\r\n        if (Array.isArray(oResponse) && oResponse.length > 0) {\r\n          const urlServicePassport = `${oResponse[0].services[0].url}`;\r\n          if (onDone) onDone(urlServicePassport);\r\n        }\r\n      },\r\n      onFailure(response) {\r\n        if (onError) onError(response);\r\n      },\r\n    });\r\n  }\r\n}\r\n\r\nexport function _Registry_getServicesUrl(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const urlService = `https://eu1-registry.3dexperience.3ds.com/api/v1/platform/instance?id=${credentials.tenant.toLowerCase()}`;\r\n    _httpCallAuthenticated(urlService, {\r\n      type:\"json\",\r\n      onComplete(response) {\r\n          if (onDone) onDone(response);\r\n      },\r\n      onFailure(response) {\r\n        if (onError) onError(response);\r\n      },\r\n    });\r\n  }\r\n}\r\n","import { _httpCallAuthenticated } from \"../main/3dexperience_api\";\r\n/**\r\n * @description La fonction `compass_getListAdditionalApps` effectue une requête HTTP GET authentifiée pour\r\n * récupérer une liste d'applications supplémentaires en fonction des informations d'identification\r\n * fournies.\r\n * @param {Object} credentials Un objet contenant les informations d'identification nécessaires à\r\n * l'authentification. Il doit avoir les propriétés suivantes : space, token\r\n * @property {String} space - (_3DCompass)L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace, 3DSwym, 3DCompass...)\r\n * @property {String} tenant - le tenant courant (ex: R1132100968447)\r\n * @param onDone - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque l'appel\r\n * d'API réussit et que les données de réponse sont formatées. Il prend deux arguments :\r\n * `formatedInfos` et `info`. `formatedInfos` est un tableau d'objets contenant le nom et l'identifiant\r\n * de chaque application,\r\n * @param onError - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de la requête HTTP. Il prend un paramètre, « info », qui est un objet contenant des\r\n * informations sur l'erreur.\r\n */\r\n\r\nexport function compass_getListAdditionalApps(credentials, onDone, onError) {\r\n  const URL = {\r\n    base: `${credentials.space}`,\r\n    uri: \"/resources/AppsMngt/api/custom/applications\",\r\n    option: `?filter=${credentials.tenant}`, // facultatif\r\n  };\r\n  const url = `${URL.base}${URL.uri}${URL.option}`;\r\n\r\n  _httpCallAuthenticated(url, {\r\n    method: \"GET\",\r\n    headers: {\r\n      \"Content-Type\": \"application/json\",\r\n      Accept: \"application/json\",\r\n    },\r\n    onComplete(response, headers, xhr) {\r\n      const info = JSON.parse(response);\r\n      const formatedInfos = info.data.map((app) => {\r\n        const name = app.attributes.name;\r\n        const id = app.id;\r\n        return { name, id };\r\n      });\r\n\r\n      if (onDone) onDone(formatedInfos, info);\r\n    },\r\n    onFailure(response, headers) {\r\n      const info = response;\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n","import { _httpCallAuthenticated } from \"./3dexperience_api.js\";\r\n\r\n/**\r\n * @description La fonction `_AppMngt_get_users` effectue un appel HTTP authentifié pour récupérer une liste\r\n * d'utilisateurs d'une plateforme spécifiée.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space -  L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex:1132100968447)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque l'appel\r\n * API sera terminé avec succès. Il prend un argument, « info », qui correspond aux données de réponse\r\n * de l'API.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de la requête HTTP. Il est facultatif et peut être indéfini. S'il est fourni, il sera\r\n * appelé avec l'objet de réponse comme argument.\r\n */\r\nexport function _AppMngt_get_users(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  let url = `${credentials.space}/resources/AppsMngt/user?platform=${credentials.tenant}&limit=-1`;\r\n\r\n  _httpCallAuthenticated(url, {\r\n    onComplete(response, headers, xhr) {\r\n      const info = JSON.parse(response);\r\n      console.log(\"_AppMngt_get_users => \", info);\r\n      if (onDone) onDone(info);\r\n    },\r\n    onFailure(response, headers) {\r\n      const info = response;\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_AppMngt_get_info_user` effectue un appel HTTP authentifié pour récupérer des\r\n * informations sur un utilisateur à partir d'une plateforme spécifique.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} id - Le paramètre `id` est l'identifiant unique de l'utilisateur pour lequel vous souhaitez\r\n * récupérer des informations.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * requête sera terminée avec succès. Il prend un argument, «info», qui correspond aux données de réponse du serveur.\r\n *\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de la requête HTTP. Il est facultatif et peut être indéfini. S'il est fourni, il sera\r\n * appelé avec le paramètre `response`, qui contient la réponse d'erreur du serveur.\r\n */\r\nexport function _AppMngt_get_info_user(\r\n  credentials,\r\n  id,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  let url = `${credentials.space}/resources/AppsMngt/user?platform=${credentials.tenant}&id=${id}`;\r\n\r\n  _httpCallAuthenticated(url, {\r\n    onComplete(response, headers, xhr) {\r\n      const info = JSON.parse(response);\r\n      //console.log(\"_AppMngt_get_info_user => \", info);\r\n      if (onDone) onDone(info);\r\n    },\r\n\r\n    onFailure(response, headers) {\r\n      const info = response;\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n","import { _httpCallAuthenticated } from \"../main/3dexperience_api\";\r\n\r\n//LINK - https://media.3ds.com/support/documentation/developer/Cloud/en/English/CAAi3DXUGREST/UsersGroup_v1.htm#\r\n//!SECTION, Pour faire des modification de UG il faut être OWNER\r\n\r\n// URI de test sur le tenant PIVETEAU_TEST:\r\nconst _uri = \"uuid:3fcb61f2-6417-476d-8a9c-a16fb888771e\";\r\n\r\nconst topHeader = {\r\n  \"Content-Type\": \"application/json\",\r\n  Accept: \"application/json,text/javascript,*/*\",\r\n};\r\n\r\n/**\r\n * @description La fonction `createUserGroups` crée un nouveau groupe d'utilisateurs avec les détails et les membres\r\n * spécifiés. Attention, l'indexation du UserGroup met du temps.\r\n\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {Object} credentials.currentUser.email - Le paramètre `currentUser` est un qui contient les informations de l'utilisateur qui envoie le message(appeler depuis la fonction `_3DSwym_get_currentuser`).\r\n * \r\n * @param {Object} datas - Les informations du groupe d'utilisateurs.\r\n * @param {String} datas.title - Le titre du groupe d'utilisateurs. Entre 3 et 128 caractères, obligatoire.\r\n * @param {String} datas.description - La description du groupe d'utilisateurs. 512 caractères max.\r\n * @param {Array} datas.members - Un tableau d'emails des membres du groupe d'utilisateurs. 100 max email par groupe.\r\n * @param {String} datas.sharing - Le droit de partage du groupe d'utilisateurs. owner/manager/viewer\r\n * @param {String} datas.visibility - La visibilité du groupe d'utilisateurs. public/private\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque l'appel d'API réussit et que les\r\n * groupes d'utilisateurs sont créés. Il recevra les données de réponse comme argument.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `createUserGroups`. Il vous permet de gérer et de traiter\r\n * l'erreur de manière personnalisée.\r\n */\r\nexport function createUserGroups(\r\n  credentials,\r\n  datas,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { space, currentUser } = credentials;\r\n  const URL = {\r\n    URIUGr: \"/3drdfpersist/resources/v1/usersgroup\",\r\n  };\r\n  const url = `${space}${URL.URIUGr}`;\r\n\r\n  const templateData = {\r\n    groups: [\r\n      {\r\n        title: datas.title,\r\n        description: datas.description,\r\n        members: datas.members || [currentUser.email, \"samuel.mureau@beam3.fr\"],\r\n        pending_members: [],\r\n        sharing: datas.sharing,\r\n        visibility: datas.visibility,\r\n      },\r\n    ],\r\n  };\r\n\r\n  _httpCallAuthenticated(url, {\r\n    method: \"POST\",\r\n    headers: topHeader,\r\n    data: JSON.stringify(templateData),\r\n    onComplete(response) {\r\n      if (onDone) onDone(JSON.parse(response));\r\n    },\r\n    onFailure(err, headers) {\r\n      console.log(err);\r\n      const info = err;\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n      console.log(\"❌ sendDirectMessage => \", info);\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `getComplementUG` effectue une requête GET vers un URI spécifié avec les informations\r\n * d'authentification et renvoie la réponse.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)\r\n * @param {String} [uri] - Le paramètre `uri` est l'identifiant de la ressource dont vous souhaitez récupérer le\r\n * complément. (ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * requête HTTP sera terminée avec succès. Il prend un argument, qui correspond aux données de réponse\r\n * de la requête.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `getComplementUG`. Il vous permet de gérer et de traiter\r\n * les informations d'erreur.\r\n */\r\nexport function getComplementUG(\r\n  credentials,\r\n  uri,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { space, tenant } = credentials;\r\n  const baseURL = space;\r\n  const URI = `/3drdfpersist/v1/resources/${uri}`;\r\n  const OPTs = `?$mask=dsaccess:Mask.GroupUI.Properties&tenant=dstenant:${tenant}`;\r\n  const URL = `${baseURL}${URI}${OPTs}`;\r\n\r\n  const headers = {\r\n    \"Content-Type\": \"application/json\",\r\n    Accept: \"application/json,text/javascript,*/*\",\r\n  };\r\n  const opts = {\r\n    method: \"GET\",\r\n    headers: headers,\r\n  };\r\n\r\n  _httpCallAuthenticated(URL, {\r\n    opts,\r\n    onComplete(response) {\r\n      if (onDone) onDone(JSON.parse(response));\r\n    },\r\n    onFailure(err, headers) {\r\n      const info = err;\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `getUsersGroupRules` effectue une requête HTTP GET pour récupérer une liste de\r\n * responsabilités de groupe pour un groupe d'utilisateurs.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * requête HTTP sera terminée avec succès. Il faut un argument, qui correspond aux données de réponse\r\n * analysées au format JSON.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `getUsersGroupRules`. C'est un paramètre facultatif, donc\r\n * s'il n'est pas fourni, la fonction ne fera rien en cas d'erreur.\r\n */\r\nexport function getUsersGroupRules(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { _usersgroup, tenant } = credentials;\r\n  const baseURL = _usersgroup;\r\n  const URI =\r\n    \"/3drdfpersist/resources/v1/option-sets/dsusergroup:ListOfGroupResponsibilities/options\";\r\n  const OPTS = `?tenant=dstenant:${tenant}`;\r\n  const OPTsH = {\r\n    method: \"GET\",\r\n    Accept: \"application/json,*/*,test/javascript\",\r\n  };\r\n  const URL = `${baseURL}${URI}${OPTS}`;\r\n\r\n  _httpCallAuthenticated(URL, {\r\n    OPTsH,\r\n    onComplete(response) {\r\n      if (onDone) onDone(JSON.parse(response));\r\n    },\r\n    onFailure(err, headers) {\r\n      const info = err;\r\n      info[\"function\"] = \"getUsersGroupRules()\";\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction « getUserGroupsList » récupère une liste de groupes d'utilisateurs d'un serveur en\r\n * utilisant les informations d'identification fournies et appelle la fonction de rappel « onDone »\r\n * avec la réponse.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)\r\n * @param {String} credentials._usersgroup - l'url de la plateforme concernant les usergroups (comme le credentials.space).\r\n * @param {Number} credentials.numMax - nombre maximum de groupes d'utilisateurs par page, par défaut 50.\r\n * @param {Object} credentials.currentUser.email - Le paramètre `currentUser` est un objet qui contient les informations de l'utilisateur qui envoie le message(appeler depuis la fonction `_3DSwym_get_currentuser`)\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque l'opération sera terminée avec\r\n * succès. Il recevra la réponse en paramètre.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `getUserGroupsList`. Il vous permet de gérer et de\r\n * répondre à toute erreur qui se produit.\r\n */\r\nexport function getUserGroupsList(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { _usersgroup, currentUser, numMax } = credentials;\r\n\r\n  if (!numMax) numMax = 50;\r\n  const URI = \"/3drdfpersist/resources/v1/usersgroup\";\r\n  const opt = \"?select=uri,title,owner,members\";\r\n  const opt2 = `&top=${numMax}`; // max à 100\r\n  const url = `${_usersgroup}${URI}${opt}${opt2}`;\r\n  const header = {\r\n    \"Content-Type\": \"application/json\",\r\n    Accept: \"application/json,text/javascript,*/*\",\r\n  };\r\n  const opts = { method: \"GET\", headers: header };\r\n  try {\r\n    _httpCallAuthenticated(url, {\r\n      opts,\r\n      onComplete(response) {\r\n        const repUG = JSON.parse(response);\r\n        const reponse = {};\r\n        const UG = repUG.groups.filter((element) => {\r\n          return element.uri.startsWith(\"uuid:\");\r\n        });\r\n\r\n        if (currentUser && Object.keys(currentUser).length > 0) {\r\n          const iamOwner = UG.filter((element) => {\r\n            return element.owner === currentUser.email;\r\n          });\r\n          const iamMember = UG.filter((element) => {\r\n            return element.members.includes(currentUser.email);\r\n          });\r\n          const iam = iamOwner.concat(iamMember);\r\n          reponse[\"iam\"] = iam;\r\n          reponse[\"UG\"] = UG;\r\n          reponse[\"iamMember\"] = iamMember;\r\n\r\n          getUsersGroupRules(\r\n            credentials,\r\n            (rules) => {\r\n              reponse[\"rules\"] = rules;\r\n              if (onDone) onDone(reponse);\r\n            },\r\n            (err) => {\r\n              err.function += \", getUserGroupsList()\";\r\n\r\n              if (onError) onError(err);\r\n            },\r\n          );\r\n        }\r\n      },\r\n      onFailure(err, headers) {\r\n        const info = err;\r\n        info[\"function\"] = \"getUserGroupsList()\";\r\n        info[\"msg\"] = headers.errormsg;\r\n        info[\"errCode\"] = headers.errorcode;\r\n\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  } catch (error) {\r\n    console.log(error);\r\n    const infoError = {\r\n      infoError: error,\r\n      fonction: \"getUserGroupsList()\",\r\n      catch: new Error(\"Erreur sur la fonction getUserGroupsList()\", {\r\n        cause: error,\r\n      }),\r\n    };\r\n    onError(infoError);\r\n  }\r\n}\r\n\r\n/**\r\n * @description La fonction `getUserGroupsByURIList` est utilisée pour récupérer\r\n * la liste des groupes d'utilisateurs en fonction d'une liste d'uri fournie.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification\r\n * requises pour authentifier la demande. Il inclut généralement des propriétés\r\n * telles que `token`, `space`, `tenant` et `ctx`.\r\n * @param {String} credentials._usersgroup - L'URL du serveur 3DExperience sur lequel l'API est déployée.\r\n * @param {String} credentials.list_uris - Un tableau d'objet qui représente les uris des groupes d'utilisateurs que vous souhaitez récupérer.\r\n *  @example [{uri:'uuid:8cedf28e-88e7-48e6-96fe-077z55bc07f3'}, {uri:'uuid:8cedf288-889z-4806-96fe-0z78z5bc07f3'}]\r\n *\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque la\r\n * requête HTTP sera terminée avec succès. Elle reçoit la réponse en paramètre.\r\n * @param {Function} [onError] - Une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `getUserGroupsByURIList`. Elle reçoit\r\n * un objet en paramètre qui contient des informations sur l'erreur.\r\n */\r\nexport function getUserGroupsByURIList(credentials, onDone, onError) {\r\n  const { _usersgroup, list_uris } = credentials;\r\n\r\n  if (!list_uris || list_uris.length === 0) {\r\n    onError({ msg: \"getUserGroupsByURIList: lists_uri is empty or undefined\" });\r\n    return;\r\n  }\r\n\r\n  const URLElements = {\r\n    baseUrl: _usersgroup,\r\n    uri: \"/3drdfpersist/resources/v1/usersgroup/groups\",\r\n    opt: \"?select=uri,title,owner,members\",\r\n  };\r\n\r\n  const url = `${URLElements.baseUrl}${URLElements.uri}${URLElements.opt}`;\r\n\r\n  const options = {\r\n    method: \"POST\",\r\n    headers: topHeader,\r\n    data: JSON.stringify({ groups: list_uris }),\r\n  };\r\n  /*\r\nex :\r\ngroups:[\r\n{uri:'uuid:351d1s61s616ds1vdsvgsv'}, {uri:'uuid:351d1s61s616ds1vdsvgsv'}\r\n]\r\n*/\r\n\r\n  try {\r\n    _httpCallAuthenticated(url, {\r\n      ...options,\r\n      onComplete(response) {\r\n        if (onDone) {\r\n          onDone(JSON.parse(response));\r\n        }\r\n      },\r\n      onFailure(err, h) {\r\n        const infoError = {\r\n          sendOptions: options,\r\n          error: new Error(`Erreur sur la fonction getUserGroupsByURIList()`, {\r\n            cause: err,\r\n          }),\r\n          msg: h,\r\n          fonction: \"getUserGroupsByURIList()\",\r\n        };\r\n        if (onError) onError(infoError);\r\n      },\r\n    });\r\n  } catch (error) {\r\n    const infoError = {\r\n      sendOptions: options,\r\n      infoError: error,\r\n      fonction: \"getUserGroupsByURIList()\",\r\n      error: new Error(\"Erreur sur la fonction getUserGroupsByURIList()\", {\r\n        cause: error,\r\n      }),\r\n    };\r\n    if (onError) onError(infoError);\r\n  }\r\n}\r\n\r\n/**\r\n * @description La fonction `getUserGroupsByEmailList` est utilisée pour récupérer\r\n * les groupes d'utilisateurs qui ont un utilisateur avec une adresse email\r\n * correspondante.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification\r\n * requises pour authentifier la demande. Il inclut généralement des propriétés\r\n * telles que `token`, `space`, `tenant` et `ctx`.\r\n * @param {String} credentials._usersgroup - L'URL du serveur 3DExperience sur lequel l'API est déployée.\r\n * @param {String[]} credentials.list_emails - Un tableau de String qui représente les\r\n * adresses email des utilisateurs que vous souhaitez récupérer.\r\n *  @example [\"user1@domain.com\", \"user2@domain.com\"]\r\n *\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque la\r\n * requête HTTP sera terminée avec succès. Elle reçoit la réponse en paramètre.\r\n * @param {Function} [onError] - Une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `getUserGroupsByEmailList`. Elle reçoit\r\n * un objet en paramètre qui contient des informations sur l'erreur.\r\n */\r\nexport function getUserGroupsByEmailList(credentials, onDone, onError) {\r\n  const { _usersgroup, list_emails } = credentials;\r\n  if (!list_emails || list_emails.length === 0) {\r\n    onError({\r\n      msg: \"getUserGroupsByEmailList: lists_email is empty or undefined\",\r\n    });\r\n    return;\r\n  }\r\n  const URLElements = {\r\n    baseUrl: _usersgroup,\r\n    uri: \"/3drdfpersist/resources/v1/usersgroup/users/locate\",\r\n    opt: \"?person_ident=email\",\r\n  };\r\n\r\n  const url = `${URLElements.baseUrl}${URLElements.uri}${URLElements.opt}`;\r\n  const options = {\r\n    method: \"POST\",\r\n    headers: topHeader,\r\n    data: JSON.stringify({ users: list_emails }),\r\n  };\r\n  try {\r\n    _httpCallAuthenticated(url, {\r\n      ...options,\r\n      onComplete(response) {\r\n        if (onDone) {\r\n          const parseResp = JSON.parse(response);\r\n          onDone({ groupes: parseResp.users[0].groups, reponse: parseResp });\r\n        }\r\n      },\r\n      onFailure(err, h) {\r\n        const infoError = {\r\n          sendOptions: options,\r\n          error: new Error(\r\n            `Erreur sur la fonction getUserGroupsByEmailList()`,\r\n            {\r\n              cause: err,\r\n            },\r\n          ),\r\n          msg: h,\r\n          fonction: \"getUserGroupsByEmailList()\",\r\n        };\r\n        if (onError) onError(infoError);\r\n      },\r\n    });\r\n  } catch (error) {\r\n    const infoError = {\r\n      sendOptions: options,\r\n      infoError: error,\r\n      fonction: \"getUserGroupsByEmailList()\",\r\n      error: new Error(\"Erreur sur la fonction getUserGroupsByEmailList()\", {\r\n        cause: error,\r\n      }),\r\n    };\r\n    if (onError) onError(infoError);\r\n  }\r\n}\r\n\r\n/**\r\n * @description La fonction deleteUserGroups est utilisée pour supprimer des groupes d'utilisateurs à l'aide des\r\n * informations d'identification et de l'URI fournis.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} [uri] - Le paramètre `uri` est l'identifiant du groupe d'utilisateurs que vous souhaitez\r\n * supprimer. Il est utilisé pour construire l'URL de la requête DELETE.(ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)\r\n */\r\n\r\nexport function deleteUserGroups(credentials, uri) {\r\n  const { space } = credentials;\r\n  const URI = \"/3drdfpersist/resources/v1/usersgroup\";\r\n  const url = `${space}${URI}/${uri}`;\r\n\r\n  const opts = {\r\n    method: \"DELETE\",\r\n  };\r\n  _httpCallAuthenticated(url, opts);\r\n}\r\n\r\n/**\r\n * @description La fonction `patchUserGroups` est utilisée pour mettre à jour les groupes d'utilisateurs en envoyant\r\n * une requête PATCH à un URI spécifié avec les données fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)\r\n * @param uri - Le paramètre `uri` est une chaîne qui représente l'identifiant du groupe d'utilisateurs\r\n * que vous souhaitez corriger. Il est utilisé pour construire l'URL de la requête PATCH.(ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)\r\n * @param {ArrayOfObjects} datas - Le paramètre `datas` est un tableau d'objets qui spécifient les modifications à\r\n * apporter aux groupes d'utilisateurs.(ex: datas[0].op, datas[0].field, datas[0].value)\r\n * @param {String} datas[0].op - l'opération à réaliser. (ex: \"add\", \"remove\", \"replace\")\r\n * @param {String} datas[0].field - Ce sur quoi agir (ex: members[], title, description, owner, visibility)\r\n * @param {StringOrArray} datas[0].value - La nouvelle valeur impactée. Si ce sont des membres value sera un Tableau de String.\r\n \r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque la requête PATCH sera terminée\r\n * avec succès. Il recevra la réponse en paramètre.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `patchUserGroups`. Il vous permet de gérer toutes les\r\n * erreurs qui se produisent et d’effectuer toute gestion ou journalisation des erreurs nécessaire.\r\n */\r\nexport function patchUserGroups(\r\n  credentials,\r\n  uri,\r\n  datas,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { space, tenant } = credentials;\r\n  const URL = {\r\n    URITI: \"/3drdfpersist/resources/v1/template-instances\",\r\n    URIUGr: \"/3drdfpersist/resources/v1/usersgroup\",\r\n    nextURICh: \"/characteristics\",\r\n    nextURIGr: \"/group\",\r\n    nexURImem: \"/members\",\r\n    OPTsTI: `?$mask=dsaccess:Mask.GroupUI.Properties`,\r\n    OPTsTenant: `tenant=dstenant:${tenant}`,\r\n  };\r\n\r\n  // Le format des datas est obligatoire : [{}]\r\n  // op : add, replace, remove\r\n  // field : members[], pending_members[], title, description, owner, visibility\r\n  // value : string ou array\r\n\r\n  const dataMembers = datas;\r\n  //  [\r\n  //   {\r\n  //     op: \"add\",\r\n  //     field: \"members\",\r\n  //     value: [\"samuel.mureau@beam3.fr\"],\r\n  //   },\r\n  //   {\r\n  //     op: \"replace\",\r\n  //     field: \"title\",\r\n  //     value: \"BEAM³ R&D - DEV\",\r\n  //   },\r\n  // ];\r\n\r\n  const baseURL = `${space}${URL.URIUGr}/${uri}`; // route de base pour le PATCH (DOC)\r\n\r\n  const dataMembersSTR = JSON.stringify(dataMembers);\r\n\r\n  _httpCallAuthenticated(baseURL, {\r\n    headers: topHeader,\r\n    method: \"PATCH\",\r\n    data: dataMembersSTR,\r\n    type: \"json\",\r\n    onComplete(response) {\r\n      if (onDone) onDone(response);\r\n    },\r\n    onFailure(err) {\r\n      if (onError) onError(err);\r\n    },\r\n  });\r\n}\r\n\r\n//ANCHOR -  CONTROL (Gestion des propriétaires du groupe)\r\n\r\n/**\r\n * @description La fonction `patchUserGroupsControl` est utilisée pour mettre à jour le contrôle des groupes\r\n * d'utilisateurs en envoyant une requête PATCH à un URI spécifié avec les informations\r\n * d'identification et les données fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} uri - Le paramètre `uri` est une chaîne qui représente l'identifiant du groupe d'utilisateurs\r\n * que vous souhaitez corriger. Il est utilisé pour construire l'URL de la requête PATCH.(ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)\r\n * @param {ArrayOfObject} _datas - Le paramètre `datas` est un tableau d'objets qui contient les informations\r\n * nécessaires pour patcher le contrôle des groupes d'utilisateurs. (ex : datas[0].op,  datas[0].value)\r\n * @param {String}   op - L'opération de correctif. Il peut être 'add', 'replace', 'remove'.\r\n * @param {Object}   value -\r\n * @param {Array}   value.agents - Un tableau d’utilisateurs. Le 1er index doit être à vide. (ex : [\"\",\"Bob.Dylan@beam3.fr\"]). 100 utilisateurs maximums.\r\n * @param {Array} value.responsibilities - Un tableau de responsibilités. (ex: [\"dsaccess:Responsibility.Group.MainOwner\", \"dsaccess:Responsibility.Group.Owner\", \"dsaccess:Responsibility.Group.Viewer\", \"dsaccess:Responsibility.Group.Author\", \"dsaccess:Responsibility.GroupService.Administrator\"])\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque\r\n * l'opération de patch sera terminée avec succès. Il faut un argument, qui est la réponse du serveur.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `patchUserGroupsControl`. Il vous permet de gérer toutes\r\n * les erreurs qui se produisent et d’effectuer toute gestion ou journalisation des erreurs nécessaire.\r\n */\r\nexport function patchUserGroupsControl(\r\n  credentials,\r\n  uri,\r\n  _datas,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { space } = credentials;\r\n  const URI = \"/3drdfpersist/resources/v1/usersgroup\";\r\n\r\n  const url = `${space}${URI}/${uri}/sharing`;\r\n  //liste des responsabilités : [\"dsaccess:Responsibility.Group.MainOwner\", \"dsaccess:Responsibility.Group.Owner\", \"dsaccess:Responsibility.Group.Viewer\", \"dsaccess:Responsibility.Group.Author\", \"dsaccess:Responsibility.GroupService.Administrator\"]\r\n  const datas = _datas;\r\n  // [\r\n  //   {\r\n  //     op: \"add\", // add, replace, remove\r\n  //     path: \"/sharing\",\r\n  //     value: {\r\n  //       agents: [\"\", \"samuel.mureau@beam3.fr\", \"yan.coquoz@beam3.fr\"],\r\n  //       responsibilities: [\"dsaccess:Responsibility.Group.Owner\"],\r\n  //     },\r\n  //   },\r\n  // ];\r\n\r\n  _httpCallAuthenticated(url, {\r\n    method: \"PATCH\",\r\n    headers: topHeader,\r\n    data: JSON.stringify(datas),\r\n    type: \"json\",\r\n    onComplete(response) {\r\n      if (onDone) onDone(response);\r\n    },\r\n    onFailure(err) {\r\n      if (onError) onError(err);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction « readUserGroupControl » est utilisée pour récupérer les informations de contrôle de\r\n * groupe d'utilisateurs à partir d'un URI spécifié à l'aide d'une requête HTTP GET.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, usersgroup, 3DCompass...)\r\n * @param {String} uri - Le paramètre `uri` est une chaîne qui représente l'identifiant du groupe d'utilisateurs\r\n * pour lequel vous souhaitez récupérer les informations de contrôle. (ex: uuid:dcad14cc-5bcd-45fd-a54d-246b95047d45)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * requête HTTP sera terminée avec succès. Il prend un argument, qui correspond aux données de réponse\r\n * de la requête.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `readUserGroupControl`. Il vous permet de gérer et de\r\n * répondre à toute erreur qui se produit.\r\n */\r\nexport function readUserGroupControl(\r\n  credentials,\r\n  uri,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { space } = credentials;\r\n  const URI = \"/3drdfpersist/resources/v1/usersgroup\";\r\n\r\n  const url = `${space}${URI}/${uri}/sharing`;\r\n\r\n  const header = {\r\n    \"Content-Type\": \"application/json\",\r\n    Accept: \"application/json,text/javascript,*/*\",\r\n  };\r\n  const opts = {\r\n    method: \"GET\",\r\n    headers: header,\r\n  };\r\n  _httpCallAuthenticated(url, {\r\n    opts,\r\n    onComplete(_rep) {\r\n      if (onDone) onDone(JSON.parse(_rep));\r\n    },\r\n    onFailure(err) {\r\n      if (onError) onError(err);\r\n    },\r\n  });\r\n}\r\n","import { _httpCallAuthenticated } from \"./3dexperience_api\";\r\n/**\r\n * @description La fonction `getCSRFToken` est une fonction asynchrone qui récupère un jeton CSRF à partir d'une URL\r\n * spécifiée et appelle le rappel `onDone` avec le jeton en cas de succès, ou le rappel `onError` avec\r\n * une erreur en cas d'échec.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space » et « ctx ».\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n *\r\n * @param {Function} onDone - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le jeton\r\n * CSRF sera récupéré avec succès. Il faut un argument, qui est la valeur du jeton CSRF.\r\n * @param {Function} onError - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une erreur lors de la requête HTTP. Il est facultatif et peut être utilisé pour gérer les erreurs qui se produisent lors de la demande.\r\n *\r\n */\r\nexport async function getCSRFToken(credentials, onDone, onError) {\r\n  if (credentials.space) {\r\n    const url = `${credentials.space}/resources/v1/application/CSRF`;\r\n    _httpCallAuthenticated(url, {\r\n      onComplete(response) {\r\n        response = JSON.parse(response);\r\n        // console.log(\"getCSRFToken() / response => \", response);\r\n        if (onDone) onDone(response.csrf);\r\n      },\r\n      onFailure(error, headers, xhr) {\r\n        const infos = { error, headers, xhr };\r\n        if (onError) onError(infos);\r\n      },\r\n    });\r\n  }\r\n}\r\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n  sep = sep || '&';\n  eq = eq || '=';\n  var obj = {};\n\n  if (typeof qs !== 'string' || qs.length === 0) {\n    return obj;\n  }\n\n  var regexp = /\\+/g;\n  qs = qs.split(sep);\n\n  var maxKeys = 1000;\n  if (options && typeof options.maxKeys === 'number') {\n    maxKeys = options.maxKeys;\n  }\n\n  var len = qs.length;\n  // maxKeys <= 0 means that we should not limit keys count\n  if (maxKeys > 0 && len > maxKeys) {\n    len = maxKeys;\n  }\n\n  for (var i = 0; i < len; ++i) {\n    var x = qs[i].replace(regexp, '%20'),\n        idx = x.indexOf(eq),\n        kstr, vstr, k, v;\n\n    if (idx >= 0) {\n      kstr = x.substr(0, idx);\n      vstr = x.substr(idx + 1);\n    } else {\n      kstr = x;\n      vstr = '';\n    }\n\n    k = decodeURIComponent(kstr);\n    v = decodeURIComponent(vstr);\n\n    if (!hasOwnProperty(obj, k)) {\n      obj[k] = v;\n    } else if (Array.isArray(obj[k])) {\n      obj[k].push(v);\n    } else {\n      obj[k] = [obj[k], v];\n    }\n  }\n\n  return obj;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n  switch (typeof v) {\n    case 'string':\n      return v;\n\n    case 'boolean':\n      return v ? 'true' : 'false';\n\n    case 'number':\n      return isFinite(v) ? v : '';\n\n    default:\n      return '';\n  }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n  sep = sep || '&';\n  eq = eq || '=';\n  if (obj === null) {\n    obj = undefined;\n  }\n\n  if (typeof obj === 'object') {\n    return Object.keys(obj).map(function(k) {\n      var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n      if (Array.isArray(obj[k])) {\n        return obj[k].map(function(v) {\n          return ks + encodeURIComponent(stringifyPrimitive(v));\n        }).join(sep);\n      } else {\n        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n      }\n    }).filter(Boolean).join(sep);\n\n  }\n\n  if (!name) return '';\n  return encodeURIComponent(stringifyPrimitive(name)) + eq +\n         encodeURIComponent(stringifyPrimitive(obj));\n};\n","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n","import {\r\n  _httpCallAuthenticated,\r\n  _getPlatformServices,\r\n  _getPlateformInfos,\r\n} from \"./3dexperience_api\";\r\nimport { chunkArray } from \"../../utils/chunks\";\r\nimport { UUID } from \"../../api/index\";\r\nimport { getCSRFToken } from \"./getCSRFToken\";\r\nimport { DateTime } from \"luxon\";\r\n\r\nimport qs from \"querystring\";\r\n\r\n/**\r\n * @description La fonction `_3dSpace_get_docInfo` récupère des informations sur un document dans un espace 3D.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSapce) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n\r\n * @param {String} [docid] - Le paramètre `docid` est l'ID du document pour lequel vous souhaitez récupérer des\r\n * informations. C'est un paramètre obligatoire et doit être fourni.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque les\r\n * informations du document seront récupérées avec succès. Il prend un argument, qui est l'objet\r\n * d'informations du document.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'appel HTTP. Il prend un paramètre, qui est la réponse d'erreur.\r\n * @returns La fonction ne renvoie explicitement rien.\r\n */\r\nexport async function _3DSpace_get_docInfo(\r\n  credentials,\r\n  docid = undefined,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const _3DSpace = credentials.space;\r\n  if (docid === undefined) {\r\n    console.log(\"Le paramètre docid est obligatoire\");\r\n    return;\r\n  }\r\n  const url = _3DSpace + `/resources/v1/modeler/documents/${docid}`;\r\n  _httpCallAuthenticated(url, {\r\n    onComplete(response, headers, xhr) {\r\n      const info = JSON.parse(response);\r\n      if (onDone) onDone(info);\r\n    },\r\n\r\n    onFailure(response) {\r\n      if (onError) onError(response);\r\n    },\r\n  });\r\n}\r\n\r\nexport async function _3DSpace_get_multiDocInfo(\r\n  credentials,\r\n  docids = undefined,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const _3DSpace = credentials.space;\r\n  if (docids === undefined) {\r\n    console.log(\"Le paramètre docids est obligatoire\");\r\n    return;\r\n  }\r\n  // const url = _3DSpace + `/resources/v1/modeler/documents/ids?$fields=revision&$include=!files,!ownerInfo,!originatorInfo,versions`;\r\n\r\n  let url =\r\n    `${_3DSpace}/resources/v1/modeler/documents/ids` +\r\n    \"?$include=!files,!ownerInfo,!originatorInfo,!relOwnerInfo'\";\r\n  let data = qs.stringify({\r\n    $ids: docids.toString().replace('\"', \"\").replace(\"[\", \"\").replace(\"]\", \"\"),\r\n  });\r\n  _httpCallAuthenticated(url, {\r\n    method: \"POST\",\r\n    headers: {\r\n      \"Content-Type\": \"application/x-www-form-urlencoded\",\r\n    },\r\n    data,\r\n    onComplete(response, headers, xhr) {\r\n      const info = JSON.parse(response);\r\n      if (onDone) onDone(info);\r\n    },\r\n\r\n    onFailure(response) {\r\n      if (onError) onError(response);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description Cette fonction effectue un appel HTTP authentifié pour récupérer le jeton CSRF pour un document de\r\n * modélisation 3D.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.objID - ID du document pour lequel le jeton CSRF est demandé.\r\n * @param {Function} [onDone] - Le paramètre onDone est une fonction de rappel qui sera exécutée lorsque la\r\n * requête HTTP sera terminée avec succès. Il prend un argument, qui correspond aux données de réponse\r\n * renvoyées par le serveur.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera exécutée si la requête\r\n * HTTP échoue ou rencontre une erreur. Il prend un argument, qui est la réponse d'erreur.\r\n */\r\nexport function _3DSpace_get_csrf(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.objID && credentials.objID !== \"\") {\r\n    let url = `${credentials.space}/resources/v1/modeler/documents/${credentials.objID}`;\r\n\r\n    _httpCallAuthenticated(url, {\r\n      onComplete(response, headers, xhr) {\r\n        const info = JSON.parse(response);\r\n        credentials[\"success\"] = true;\r\n        credentials[\"token\"] = info?.csrf?.value;\r\n        credentials[\"datas\"] = info?.data[0];\r\n        if (onDone) {\r\n          onDone(credentials);\r\n        }\r\n      },\r\n\r\n      onFailure(response) {\r\n        if (onError) onError(response);\r\n      },\r\n    });\r\n  } else {\r\n    _3DSpace_csrf(\r\n      credentials,\r\n      (rep) => {\r\n        console.log(\"_3DSpace_get_csrf / _3DSpace_csrf\", rep);\r\n\r\n        credentials[\"token\"] = rep;\r\n        if (onDone) onDone(credentials);\r\n      },\r\n      (err) => {\r\n        if (onError) onError(err);\r\n      }\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * @description Cette fonction JavaScript récupère le TOKEN CSRF d'une application 3DSpace.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSapce) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {Function} onDone - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le jeton\r\n * CSRF sera récupéré avec succès. Il faut un argument, qui est la valeur du jeton CSRF.\r\n * @param {Function} onError - Le paramètre `onError` est une fonction de rappel qui sera appelée si une erreur\r\n * survient lors de l'exécution de la fonction `_3DSpace_csrf`. Il est utilisé pour gérer et afficher\r\n * les messages d’erreur ou exécuter toute logique de gestion des erreurs nécessaire.\r\n * @returns la valeur du jeton CSRF, qui est obtenue à partir de la réponse de l'appel HTTP.\r\n */\r\nexport function _3DSpace_csrf(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.space) {\r\n    const url = credentials.space + \"/resources/v1/application/CSRF\";\r\n    _httpCallAuthenticated(url, {\r\n      onComplete(response, headers, xhr) {\r\n        const info = JSON.parse(response);\r\n\r\n        if (onDone) onDone(info.csrf.value);\r\n      },\r\n      onFailure(response, headers, xhr) {\r\n        if (onError)\r\n          onError({\r\n            response,\r\n            headers,\r\n            xhr,\r\n          });\r\n      },\r\n    });\r\n  } else {\r\n    const msgError = \"ERROR : url du 3DSpace non défini.\";\r\n    if (onError) onError(msgError);\r\n  }\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSpace_get_ticket` récupère un ticket d’accès pour un document\r\n * \r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n\r\n * @param {String} credentials.objID - ID du document pour lequel l'URL du fichier est demandée.\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque l'URL du fichier sera récupérée\r\n * avec succès. Il prend un paramètre, qui est l'URL du fichier.\r\n * @param {Function} [onError] - Le paramètre onError est une fonction qui sera appelée s'il y a une erreur lors\r\n * de l'exécution de la fonction. Il s'agit d'un paramètre facultatif et peut être laissé indéfini s'il\r\n * n'est pas nécessaire.\r\n */\r\nexport function _3DSpace_get_ticket(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  let url =\r\n    credentials.space +\r\n    `/resources/v1/modeler/documents/${credentials.objID}/files/DownloadTicket`;\r\n  _3DSpace_get_csrf(\r\n    credentials,\r\n    (token) => {\r\n      _httpCallAuthenticated(url, {\r\n        method: \"PUT\",\r\n        headers: {\r\n          ENO_CSRF_TOKEN: credentials.token,\r\n        },\r\n\r\n        onComplete(response, headers) {\r\n          let info = JSON.parse(response);\r\n\r\n          const file_url = info.data[0].dataelements.ticketURL;\r\n\r\n          if (onDone) onDone(file_url, headers);\r\n        },\r\n\r\n        onFailure(response, head) {\r\n          console.warn(\"☠️ error => \", response, head);\r\n          if (onError) onError(response, head);\r\n        },\r\n      });\r\n    },\r\n    (err) => {\r\n      console.warn(\"_3DSpace_get_ticket / error => \", err);\r\n      if (onError) onError(err);\r\n    }\r\n  );\r\n}\r\n\r\n/**\r\n * @description Cette fonction envoie une requête PUT à une URL spécifiée avec des en-têtes d'authentification et\r\n * renvoie une URL de fichier en cas de succès.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} [docid] - L'ID du document pour lequel le ticket de téléchargement de fichier est demandé.\r\n * @param {String} [csr] - Le paramètre \"csr\" est un jeton CSRF utilisé à des fins d'authentification et de\r\n * sécurité. Il est transmis en tant qu'en-tête dans la requête HTTP à l'URL spécifiée.\r\n * @param {Function} [onDone] - Le paramètre onDone est une fonction de rappel qui sera exécutée lorsque la\r\n * requête HTTP aboutira et que l'URL du fichier sera obtenue. Il prend un argument, qui est l'URL du\r\n * fichier.\r\n * @param {Function} [onError] - Le paramètre onError est une fonction de rappel qui sera exécutée s'il y a une\r\n * erreur lors de la requête HTTP. Il est facultatif et peut être laissé indéfini s'il n'est pas\r\n * nécessaire.\r\n */\r\nexport function _3DSpace_file_url_csr(\r\n  credentials,\r\n  docid,\r\n  csr = undefined,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const url = `${credentials.space}/resources/v1/modeler/documents/${docid}/files/DownloadTicket`;\r\n  if (!csr) {\r\n    csr = credentials.token;\r\n  }\r\n  _httpCallAuthenticated(url, {\r\n    method: \"PUT\",\r\n    headers: {\r\n      ENO_CSRF_TOKEN: csr,\r\n    },\r\n\r\n    onComplete(response) {\r\n      let info = JSON.parse(response);\r\n      console.log(\"☠️ info => \", info);\r\n      if (info.success === true) {\r\n        try {\r\n          const file_url = info.data[0].dataelements.ticketURL;\r\n          if (onDone) onDone(file_url);\r\n        } catch (err) {\r\n          if (onError) onError(err);\r\n        }\r\n      }\r\n    },\r\n\r\n    onFailure(response) {\r\n      if (onError) onError(response);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description Cette fonction met à jour un fichier dans un espace 3D avec les données et le nom de fichier donnés,\r\n * en utilisant la protection CSRF.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} [docId] - ID de document du fichier d'espace 3D en cours de mise à jour.\r\n * @param {String} [fileId] - Le paramètre fileid est l'identifiant unique du fichier qui doit être mis à jour.\r\n * @param {String} [data] - Ce paramètre représente les données du fichier qui doivent être mises à jour. Il peut\r\n * se présenter sous la forme d'un format binaire ou texte.\r\n * @param {String} [filename] - Nom du fichier mis à jour.\r\n * @param {Function} [onDone] - Le paramètre onDone est une fonction de rappel qui sera exécutée lorsque\r\n * l'opération de mise à jour du fichier sera terminée avec succès.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera exécutée si une erreur\r\n * survient lors de l'exécution de la fonction `_3dspace_file_update`. Il permet de gérer les erreurs\r\n * de manière personnalisée, plutôt que de s'appuyer sur le comportement de gestion des erreurs par\r\n * défaut.\r\n */\r\nexport function _3DSpace_file_update(\r\n  credentials,\r\n  docId,\r\n  fileId,\r\n  data,\r\n  filename,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const runFunction = () =>\r\n    _3DSpace_file_update_csr(\r\n      credentials,\r\n      docId,\r\n      fileId,\r\n      data,\r\n      filename,\r\n      credentials.token,\r\n      onDone,\r\n      onError\r\n    );\r\n\r\n  if (credentials.token) {\r\n    runFunction();\r\n  } else {\r\n    _3DSpace_get_csrf(\r\n      credentials,\r\n      docId,\r\n      (result) => {\r\n        console.log(\r\n          \"_3DSpace_file_update | _3DSpace_get_csrf| onDone | result\",\r\n          result\r\n        );\r\n        credentials[\"token\"] = result;\r\n        runFunction();\r\n      },\r\n      () => {\r\n        if (onError) onError();\r\n      }\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * @description Cette fonction met à jour un fichier dans le document du 3DSpace à l'aide d'un jeton CheckinTicket et CSRF.\r\n *\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} docId - ID du document en cours de mise à jour.\r\n * @param {String} fileId - ID du fichier mis à jour dans le document.\r\n * @param {String} data - Les données binaires du fichier en cours de mise à jour.\r\n * @param {String} filename - Nom du fichier mis à jour.\r\n * @param {String} csr - csr signifie Cross-Site Request Forgery token, qui est une mesure de sécurité utilisée\r\n * pour empêcher l'accès non autorisé aux applications Web. Il s'agit d'un jeton unique généré par le\r\n * serveur et envoyé au client, qui est ensuite inclus dans les requêtes ultérieures pour vérifier\r\n * l'authenticité de la requête. Dans cette fonction, le\r\n * @param {Function} [onDone] - Le paramètre onDone est une fonction de rappel qui sera exécutée lorsque la\r\n * fonction se terminera avec succès. Il prend la réponse comme argument.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de la requête HTTP. Il est facultatif et s'il n'est pas fourni, l'erreur sera traitée en\r\n * interne.\r\n */\r\nexport function _3DSpace_file_update_csr(\r\n  credentials,\r\n  docId,\r\n  fileId,\r\n  data,\r\n  filename,\r\n  csr,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const url =\r\n    credentials.space +\r\n    `/resources/v1/modeler/documents/files/CheckinTicket?tenant=${credentials.tenant.toUpperCase()}&e6w-lang=fr&e6w-timezone=-60&xrequestedwith=xmlhttprequest`;\r\n\r\n  _httpCallAuthenticated(url, {\r\n    method: \"PUT\",\r\n    headers: {\r\n      SecurityContext: encodeURIComponent(\"ctx::\" + credentials.ctx),\r\n      //ENO_CSRF_TOKEN: credentials.token,\r\n    },\r\n    data: JSON.stringify({\r\n      csrf: {\r\n        name: \"ENO_CSRF_TOKEN\",\r\n        value: credentials.token,\r\n      },\r\n    }),\r\n    type: \"json\",\r\n    onComplete(response, headers, xhr) {\r\n      const csrf = response.csrf;\r\n      const info = response.data[0].dataelements;\r\n\r\n      const formData = new FormData();\r\n\r\n      let blobData;\r\n      if (data instanceof Blob) {\r\n        blobData = data;\r\n      } else {\r\n        blobData = new Blob([data], {\r\n          type: \"text/plain\",\r\n        });\r\n      }\r\n\r\n      formData.append(info.ticketparamname, info.ticket);\r\n      formData.append(\"file_0\", blobData, filename);\r\n\r\n      const opts = {};\r\n      opts.method = \"POST\";\r\n      opts.data = formData;\r\n\r\n      opts.onComplete = function (response) {\r\n        //Update the FCS file receipt\r\n        let tempId = \"temp_\" + Date.now();\r\n        let options = {\r\n          method: \"PUT\",\r\n          headers: {\r\n            SecurityContext: \"ctx::\" + credentials.ctx,\r\n          },\r\n          data: JSON.stringify({\r\n            csrf,\r\n            data: [\r\n              {\r\n                relateddata: {\r\n                  files: [\r\n                    {\r\n                      dataelements: {\r\n                        title: filename,\r\n                        receipt: response,\r\n                      },\r\n                      updateAction: \"REVISE\",\r\n                    },\r\n                  ],\r\n                },\r\n                id: docId,\r\n                updateAction: \"NONE\",\r\n              },\r\n            ],\r\n          }),\r\n          type: \"json\",\r\n          onComplete(response) {\r\n            if (onDone) onDone(response);\r\n          },\r\n\r\n          onFailure(response) {\r\n            if (onError) onError(response);\r\n          },\r\n        };\r\n\r\n        let upperTenant = credentials.tenant.toUpperCase();\r\n\r\n        _httpCallAuthenticated(\r\n          credentials.space +\r\n            `/resources/v1/modeler/documents/?$include=versions&tenant=${credentials.tenant.toUpperCase()}&e6w-lang=fr&e6w-timezone=-60&xrequestedwith=xmlhttprequest`,\r\n          options\r\n        );\r\n        // _httpCallAuthenticated(\r\n        //   credentials.space +\r\n        //     `/resources/v1/modeler/documents/?$include=versions&tenant=${upperTenant}&e6w-lang=en&e6w-timezone=-120&xrequestedwith=xmlhttprequest`,\r\n        //   options\r\n        // );\r\n      };\r\n\r\n      opts.onFailure = function (err) {\r\n        if (onError) onError(err);\r\n      };\r\n\r\n      opts.timeout = 0;\r\n\r\n      _httpCallAuthenticated(info.ticketURL, opts);\r\n    },\r\n  });\r\n}\r\n\r\nexport async function _3DSpace_put_docInfo(\r\n  credentials,\r\n  docId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const _space = credentials.space;\r\n  const csr = credentials.token;\r\n  const ctx = credentials.ctx;\r\n  const description = credentials?.description;\r\n  const title = credentials?.title;\r\n\r\n  if (!docId) {\r\n    console.warn(\"Error: docId undefined\");\r\n    if (onError) onError(\"Error: docId undefined\");\r\n    return;\r\n  }\r\n\r\n  let url = `${credentials.space}/resources/v1/modeler/documents/${docId}`;\r\n  const data = JSON.stringify({\r\n    data: [\r\n      {\r\n        dataelements: {\r\n          description,\r\n          title,\r\n        },\r\n      },\r\n    ],\r\n  });\r\n  _httpCallAuthenticated(url, {\r\n    method: \"PUT\",\r\n    headers: {\r\n      ENO_CSRF_TOKEN: credentials.token,\r\n    },\r\n    data,\r\n    type: \"json\",\r\n    onComplete(response) {\r\n      if (onDone) onDone(response);\r\n    },\r\n    onFailure(err) {\r\n      if (onError) onError(err);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * Uploads a file to the 3DSpace platform.\r\n *\r\n * @param {Object} credentials - The credentials object.\r\n * @param {string} credentials.tenant - The tenant name.\r\n * @param {string} credentials.cs_name - The collaboration space name.\r\n * @param {string} [fileName=undefined] - The name of the file to upload.\r\n * @param {Blob} [blobFile=undefined] - The file blob to upload.\r\n * @param {function} [onDone=undefined] - Callback function to execute on successful upload.\r\n * @param {function} [onError=undefined] - Callback function to execute on error.\r\n * @param {function} [onProgress=undefined] - Callback function to execute on upload progress.\r\n * @returns {Promise<void>} - A promise that resolves when the upload is complete.\r\n */\r\nexport async function _3DSpace_Upload_File(\r\n  credentials, // { tenant, cs_name }\r\n  fileName = undefined,\r\n  blobFile = undefined,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n  onProgress = undefined\r\n) {\r\n  let { tenant, cs_name } = credentials;\r\n  if (!tenant && !cs_name) {\r\n    if (onError) onError(\"Credentials undefined\");\r\n    return;\r\n  }\r\n  if (!fileName && !blobFile) {\r\n    if (onError) onError(\"Définition du fichier undefined\");\r\n    return;\r\n  }\r\n  //cs_name = encodeURIComponent(cs_name);\r\n  const timeStamp = DateTime.now().ts;\r\n\r\n  //NOTE - Get Ticket\r\n  let url = `https://${tenant.toLowerCase()}-eu1-space.3dexperience.3ds.com/enovia/resources/enocsmrest/collabspaces/${encodeURIComponent(\r\n    cs_name\r\n  )}/ticket?id=${timeStamp}&tenant=${tenant.toUpperCase()}&xrequestedwith=xmlhttprequest`;\r\n\r\n  _httpCallAuthenticated(\r\n    `https://${tenant.toLowerCase()}-eu1-space.3dexperience.3ds.com/enovia/resources/enocsmrest/session?tenant=${tenant.toUpperCase()}&xrequestedwith=xmlhttprequest`,\r\n    {\r\n      method: \"GET\",\r\n      onComplete(response) {\r\n        try {\r\n          response = JSON.parse(response);\r\n          const { csrftoken, isadmin } = response;\r\n          if (csrftoken)\r\n            _httpCallAuthenticated(url, {\r\n              method: \"GET\",\r\n              headers: {\r\n                //\"x-ds-csrftoken\": csrftoken,\r\n                Accept: \"application/json\",\r\n              },\r\n\r\n              onComplete(response, headers, xhr) {\r\n                try {\r\n                  response = JSON.parse(response);\r\n                  if (response?.ticket) {\r\n                    const { ticket, actionurl, jobticket } = response;\r\n\r\n                    pushFileInFcs(\r\n                      { dataelements: { ticket, ticketURL: actionurl } },\r\n                      blobFile,\r\n                      fileName,\r\n                      (response) => {\r\n                        let doc = new DOMParser().parseFromString(\r\n                          response,\r\n                          \"text/html\"\r\n                        );\r\n                        const receipt = doc.body.firstChild\r\n                          .querySelector(\"input\")\r\n                          .getAttributeNode(\"value\").value;\r\n\r\n                        const urlRelatedFile = `https://${tenant.toLowerCase()}-eu1-space.3dexperience.3ds.com/enovia/resources/enocsmrest/collabspaces/${encodeURIComponent(cs_name)}/contents?receipt=${encodeURIComponent(receipt)}`;\r\n\r\n                        let re = /(?:\\.([^.]+))?$/;\r\n                        let ext = re.exec(fileName)[1];\r\n\r\n                        const bodyRequest = JSON.stringify({\r\n                          actions: [],\r\n                          businessobj: {\r\n                            description: credentials?.description ? credentials?.description : \"\",\r\n                            file: fileName,\r\n                            fullnameowner: \"\",\r\n                            icon: \"\",\r\n                            maturity: \"\",\r\n                            modified: \"\",\r\n                            owner: {},\r\n                            thumbnail: \"\",\r\n                            title: ext\r\n                              ? fileName.split(\".\").slice(0, -1).join(\".\")\r\n                              : fileName,\r\n                            type: {},\r\n                          },\r\n                          collabspace: cs_name,\r\n                        });\r\n                        _httpCallAuthenticated(urlRelatedFile, {\r\n                          method: \"POST\",\r\n                          headers: {\r\n                            Accept: \"application/json\",\r\n                            \"Content-Type\": \"application/json;charset=UTF-8\",\r\n                            \"X-DS-CSRFTOKEN\": csrftoken,\r\n                          },\r\n                          data: bodyRequest,\r\n                          type: \"json\",\r\n                          onComplete(response, headers, xhr) {\r\n                            // console.log(\"_3DSpace_Upload_Doc | pushFileInFcs | onComplete\", response);\r\n                            if (onDone) onDone(response);\r\n                          },\r\n                          onFailure(err) {\r\n                            console.warn(\r\n                              \"_3DSpace_Upload_Doc | pushFileInFcs | onFailure\",\r\n                              { url: urlRelatedFile, bodyRequest, err }\r\n                            );\r\n                            if (onError) onError(err);\r\n                          },\r\n                        });\r\n                      },\r\n                      (err) => {\r\n                        console.warn(\"pushFileInFcs\", err);\r\n                        if (onError) onError(err);\r\n                      },\r\n                      (progress) => {\r\n                        if (onProgress) onProgress({ fileName, progress });\r\n                      }\r\n                    );\r\n                  }\r\n                } catch (error) {\r\n                  if (onError) onError(error);\r\n                }\r\n              },\r\n              onFailure(response) {\r\n                console.warn(\"_3DSpace_Upload_Doc | onFailure\");\r\n                if (onError) onError(response);\r\n              },\r\n            });\r\n        } catch {\r\n          if (onError) onError();\r\n        }\r\n      },\r\n      onFailure(err) {\r\n        if (onError) onError(err);\r\n      },\r\n    }\r\n  );\r\n}\r\n\r\nexport async function _3DSpace_Update_Doc(\r\n  credentials,\r\n  objectId,\r\n  data,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const _space = credentials.space;\r\n  const csr = credentials.token;\r\n  const ctx = credentials.ctx;\r\n\r\n  //TEST de la Typo de Data (si Object, Blod, String)\r\n\r\n  _3DSpace_get_docInfo(\r\n    credentials,\r\n    objectId,\r\n    (info) => {\r\n      const fileId = info.data[0].relateddata.files[0].id;\r\n      const filename = info.data[0].relateddata.files[0].dataelements.title;\r\n\r\n      _3DSpace_file_update(\r\n        credentials,\r\n        objectId,\r\n        fileId,\r\n        data,\r\n        filename,\r\n        (result) => {\r\n          if (onDone) onDone(result);\r\n        },\r\n        (error) => {\r\n          if (onError) onError(error);\r\n        }\r\n      );\r\n    },\r\n    (error) => {\r\n      if (onError) onError(error);\r\n    }\r\n  );\r\n}\r\n\r\n/**\r\n * @description Cette fonction crée un document dans le 3Dspace à partir des données fournies au format JSON.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token », « space » et « ctx ».(ex: credentials.space, credentials.tenant, credentials.token)\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {String} credentials.ctx - L'ID du contexte de travail.\r\n * @param {String}[data] - Le paramètre data correspond aux données JSON qui doivent être chargées dans le 3Dspace.\r\n *\r\n * @param {String}[filename] - Le nom du fichier à créer.\r\n * @param {String}[desc] - desc est un paramètre de chaîne qui représente la description du document en cours de création dans le 3Dspace.\r\n *\r\n * @param {Function}[onDone] - Le paramètre onDone est une fonction de rappel qui sera appelée lorsque la requête HTTP sera terminée avec succès. Il prend la réponse comme argument.\r\n *\r\n * @param {Function}[onError] - Le paramètre onError est une fonction de rappel qui sera appelée s'il y a une erreur lors de l'exécution de la fonction _3dSpace_Create_Doc. Il prend l'objet de réponse comme argument.\r\n *\r\n */\r\nexport async function _3DSpace_Create_Doc(\r\n  credentials,\r\n  data, // data\r\n  filename, //ref coclico\r\n  descriptionDoc, // ref name\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  checkinTicket(\r\n    credentials,\r\n    (resultCheckinTicket) => {\r\n      if (resultCheckinTicket?.items >= 1) {\r\n        resultCheckinTicket.data.forEach((fcs__jobTicket) => {\r\n          \r\n          pushFileInFcs(\r\n            fcs__jobTicket,\r\n            data,\r\n            filename,\r\n            (receipt) => {\r\n              relatedDocAndFile(\r\n                credentials,\r\n                receipt,\r\n                filename,\r\n                descriptionDoc,\r\n                (response) => {\r\n                  if (response?.data.length) {\r\n                    if (onDone) onDone(response);\r\n                  } else {\r\n                    if (onError)\r\n                      onError({\r\n                        success: false,\r\n                        msg: \"Erreur lors de la mise en ralation entre la document et le fichier\",\r\n                      });\r\n                  }\r\n                },\r\n                (err) => console.warn(err)\r\n              );\r\n            },\r\n            (err) => console.warn(err)\r\n          );\r\n        });\r\n      }\r\n    },\r\n    (err) => console.warn(err)\r\n  );\r\n}\r\n\r\nfunction checkinTicket(credentials, onDone = undefined, onError = undefined) {\r\n  if (credentials?.space && credentials.token && credentials.ctx) {\r\n    let url = `${credentials.space}/resources/v1/modeler/documents/files/CheckinTicket`;\r\n\r\n    _httpCallAuthenticated(url, {\r\n      method: \"PUT\",\r\n      headers: {\r\n        ENO_CSRF_TOKEN: credentials.token,\r\n        Accept: \"application/json\",\r\n        \"Content-Type\": \"application/json\",\r\n        SecurityContext: credentials.ctx,\r\n      },\r\n\r\n      onComplete(response, headers, xhr) {\r\n        try {\r\n          response = JSON.parse(response);\r\n        } catch (error) {\r\n          //\r\n        }\r\n        if (onDone) onDone(response);\r\n      },\r\n      onFailure(err) {\r\n        if (onError) onError(err);\r\n      },\r\n    });\r\n  } else {\r\n    console.log(\"Error de credentials\", credentials);\r\n  }\r\n}\r\n\r\nfunction pushFileInFcs(fcs__jobTicket, fileData, fileName, onDone = undefined, onError = undefined, onProgress = undefined) {\r\n  console.log(\"pushFileInFcs\", { fcs__jobTicket, fileData, fileName });\r\n  let formData = new FormData();\r\n  if (!(fileData instanceof Blob)) {\r\n      fileData = new Blob([fileData], {\r\n          type: \"text/plain\"\r\n      });\r\n  }\r\n  formData.append(\"__fcs__jobTicket\", fcs__jobTicket.dataelements.ticket);\r\n  formData.append(\"file-name\", fileName);\r\n  formData.append(\"file_0\", fileData, fileName);\r\n  formData.append(\"file-title\", fileName);\r\n  formData.append(\"file-description\", fileName);\r\n\r\n  let url = fcs__jobTicket.dataelements.ticketURL;\r\n\r\n  const xhr = new XMLHttpRequest();\r\n  xhr.open(\"POST\", url, true);\r\n  xhr.upload.onprogress = function (event) {\r\n      if (event.lengthComputable) {\r\n          const percentComplete = (event.loaded / event.total) * 100;\r\n          if (onProgress) onProgress(percentComplete);\r\n      }\r\n  };\r\n  xhr.onload = function () {\r\n      if (xhr.status === 200) {\r\n          if (onDone) onDone(xhr.responseText.replace(/[\\n\\r]/g, \"\"));\r\n      } else {\r\n          if (onError) onError(xhr.statusText);\r\n      }\r\n  };\r\n  xhr.onerror = function () {\r\n      if (onError) onError(xhr.statusText);\r\n  };\r\n  xhr.send(formData);\r\n}\r\n\r\nfunction relatedDocAndFile(\r\n  credentials,\r\n  receipt,\r\n  filename,\r\n  descriptionDoc = undefined,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  console.log(\"relatedDocAndFile\", { credentials, receipt, filename });\r\n  const trimExt = (name) =>\r\n    name.indexOf(\".\") === -1 ? name : name.split(\".\").slice(0, -1).join(\".\");\r\n  let tempId = \"temp_\" + DateTime.now().ts;\r\n  let url =\r\n    credentials.space +\r\n    \"/resources/v1/modeler/documents/?e6w-lang=fr&e6w-timezone=-120&xrequestedwith=xmlhttprequest\";\r\n  _httpCallAuthenticated(url, {\r\n    method: \"POST\",\r\n    headers: {\r\n      ENO_CSRF_TOKEN: credentials.token,\r\n      SecurityContext: encodeURIComponent(\"ctx::\") + credentials.ctx,\r\n      \"Content-Type\": \"application/json\",\r\n    },\r\n    data: JSON.stringify({\r\n      csrf: { name: \"ENO_CSRF_TOKEN\", value: credentials.token },\r\n      data: [\r\n        {\r\n          type: \"Document\",\r\n          dataelements: {\r\n            title: trimExt(filename),\r\n            description: descriptionDoc,\r\n          },\r\n          relateddata: {\r\n            files: [\r\n              {\r\n                dataelements: {\r\n                  title: filename,\r\n                  receipt: `${receipt}\\n`,\r\n                },\r\n              },\r\n            ],\r\n          },\r\n          tempId,\r\n        },\r\n      ],\r\n    }),\r\n    onComplete(response) {\r\n      try {\r\n        response = JSON.parse(response);\r\n      } catch (error) {\r\n        //\r\n      }\r\n      if (onDone) onDone(response);\r\n    },\r\n    onFailure(err) {\r\n      if (onError) onError(err);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description Cette fonction récupère les contextes de sécurité basés sur des paramètres spécifiés à partir d'un\r\n * hôte donné.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n *@param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} [cs] - Le titre d'un espace de collaboration.\r\n * @param {String} [role] - Le paramètre de rôle est un paramètre facultatif qui spécifie le rôle de\r\n * l'utilisateur dans l'espace de collaboration. Si fourni, la fonction filtrera les espaces de\r\n * collaboration pour trouver celui où l'utilisateur a le rôle spécifié. S'il n'est pas fourni, la\r\n * fonction utilisera le premier espace de collaboration trouvé.\r\n * @param {String} [organization] - Nom de l'organisation pour laquelle le contexte de sécurité est récupéré.\r\n * @param {Function} [onDone] - La fonction à appeler lorsque le contexte de sécurité a été récupéré avec succès.\r\n * Il prend le contexte comme paramètre.\r\n * @param {Function} [onError] - Le paramètre onError est une fonction de rappel qui est appelée si une erreur se\r\n * produit lors de l'exécution de la fonction. Il prend un argument, qui est le message d'erreur ou\r\n * l'objet.\r\n */\r\nexport function _3DSpace_get_securityContexts(\r\n  credentials,\r\n  cs = undefined,\r\n  role = undefined,\r\n  organization = undefined,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n  withPreferredCredentials = false\r\n) {\r\n  const url =\r\n    `${credentials.space}/resources/modeler/pno/person?` +\r\n    \"current=true\" +\r\n    \"&select=preferredcredentials\" +\r\n    \"&select=collabspaces\";\r\n\r\n  _httpCallAuthenticated(url, {\r\n    method: \"GET\",\r\n    onComplete(response) {\r\n      // role.company.cs\r\n      const contexts = JSON.parse(response);\r\n      let context = \"\";\r\n      let finalCs,\r\n        finalOrg,\r\n        finalRole = undefined;\r\n      if (cs) {\r\n        let oCS = contexts.collabspaces.find((e) => e.title === cs);\r\n        if (oCS) {\r\n          finalCs = cs;\r\n          let couples = oCS.couples;\r\n          couples = couples.filter(\r\n            (value, index, self) =>\r\n              index ===\r\n              self.findIndex(\r\n                (t) =>\r\n                  t.organization.pid === value.organization.pid &&\r\n                  t.role.pid === value.role.pid\r\n              )\r\n          );\r\n          if (role) {\r\n            if (Array.isArray(role)) {\r\n              role.forEach((r) => {\r\n                if (!finalRole)\r\n                  couples.forEach((e) => {\r\n                    if (\r\n                      r === e.role.name &&\r\n                      organization === e.organization.title\r\n                    ) {\r\n                      finalRole = r;\r\n                      finalOrg = organization;\r\n                    } else if (r === e.role.name) {\r\n                      let defineSingleItem = couples.filter(\r\n                        (couple) => couple.role.name === r\r\n                      );\r\n                      if (defineSingleItem.length === 1) {\r\n                        finalRole = defineSingleItem[0].role.name;\r\n                        finalOrg = defineSingleItem[0].organization.title;\r\n                      } else {\r\n                        onError(defineSingleItem);\r\n                      }\r\n                    }\r\n                  });\r\n              });\r\n            } else {\r\n              couples.forEach((e) => {\r\n                if (\r\n                  role === e.role.name &&\r\n                  organization === e.organization.title\r\n                ) {\r\n                  finalRole = role;\r\n                  finalOrg = organization;\r\n                } else if (role === e.role.name) {\r\n                  let defineSingleItem = couples.filter(\r\n                    (couple) => couple.role.name === role\r\n                  );\r\n                  if (defineSingleItem.length === 1) {\r\n                    finalRole = defineSingleItem[0].role.name;\r\n                    finalOrg = defineSingleItem[0].organization.title;\r\n                  } else {\r\n                    onError(defineSingleItem);\r\n                  }\r\n                }\r\n              });\r\n            }\r\n          }\r\n        }\r\n      }\r\n      if (finalCs && finalOrg && finalRole) {\r\n        context = finalRole + \".\" + finalOrg + \".\" + finalCs;\r\n        onDone(context);\r\n        // onDone(encodeURI(context));\r\n      } else {\r\n        if (contexts.preferredcredentials && withPreferredCredentials) {\r\n          context =\r\n            contexts.preferredcredentials.role.name +\r\n            \".\" +\r\n            contexts.preferredcredentials.organization.title +\r\n            \".\" +\r\n            contexts.preferredcredentials.collabspace.title;\r\n          onDone(context);\r\n        } else {\r\n          if (onError) {\r\n            context = finalRole + \".\" + finalOrg + \".\" + finalCs;\r\n            onError(context);\r\n          }\r\n        }\r\n      }\r\n    },\r\n    onFailure(err, headers) {\r\n      console.warn(\"Erreur de récupération du contexte de sécurité. => \", {\r\n        err,\r\n        headers,\r\n      });\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_3dspace_download_doc` est une fonction asynchrone qui télécharge un document à partir d'un espace 3D, avec des rappels facultatifs pour le succès et la gestion des erreurs.\r\n * @param {Object} credentials Un objet contenant les informations d'identification nécessaires à\r\n * l'authentification. Il doit avoir les propriétés suivantes: space, token\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n\r\n * @param  {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {String} credentials.objID - Le paramètre objectId est l'identifiant unique du document que vous souhaitez\r\n * télécharger depuis le 3DSpace.\r\n * @param {String} credentials.returnType -  \"blob\" - type d'object à retourner.\r\n * @param {Function} onDone - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le\r\n * téléchargement sera terminé avec succès. Il prend un argument, qui est les données de réponse du\r\n * téléchargement.\r\n * @param {Function} onError - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3dspace_download_doc`. Il vous permet de gérer et de\r\n * répondre à toutes les erreurs qui se produisent.\r\n \r\n * @returns {Promise}\r\n */\r\nexport async function _3DSpace_download_doc(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (!credentials.objID || credentials.objID === \"\") {\r\n    console.warn(\r\n      \"_3DSpace_download_doc() / Le paramètre objectId est obligatoire\"\r\n    );\r\n    if (onError)\r\n      onError(\r\n        \"_3DSpace_download_doc() / Le paramètre objectId est obligatoire\"\r\n      );\r\n  }\r\n\r\n  if (credentials.space === \"\" || !credentials.space) {\r\n    console.warn(\r\n      \"_3DSpace_download_doc() / Le paramètre space est obligatoire\"\r\n    );\r\n    if (onError)\r\n      onError(\"_3DSpace_download_doc() / Le paramètre space est obligatoire\");\r\n  }\r\n  if (credentials.token === \"\" || !credentials.token) {\r\n    getCSRFToken(\r\n      credentials,\r\n      (rep) => {\r\n        credentials[\"token\"] = rep;\r\n      },\r\n      (err) => {\r\n        console.log(\"☠️ error => \", err);\r\n      }\r\n    );\r\n    // console.warn(\r\n    //   \"_3DSpace_download_doc() / Le paramètre token est obligatoire\",\r\n    // );\r\n  }\r\n\r\n  return new Promise((resolve, reject) => {\r\n    _3DSpace_get_ticket(\r\n      credentials,\r\n      (ticketURL) => {\r\n        if (credentials?.returnType === \"blob\") {\r\n          console.log(\"ticketURL blob\", ticketURL);\r\n          fetch(ticketURL)\r\n            .then((response) => response.blob())\r\n            .then((blob) => {\r\n              if (onDone) onDone(blob);\r\n            })\r\n            .catch((err) => {\r\n              if (onError) onError(err);\r\n            });\r\n        } else {\r\n          _httpCallAuthenticated(ticketURL, {\r\n            onComplete(response) {\r\n              let tryParse;\r\n              try {\r\n                tryParse = JSON.parse(response);\r\n              } catch (error) {\r\n                tryParse = response;\r\n              }\r\n\r\n              if (onDone && typeof onDone === \"function\") onDone(tryParse);\r\n              resolve(tryParse);\r\n            },\r\n            onFailure(error, headers, xhr) {\r\n              if (onError) {\r\n                console.log(\"error http\", error);\r\n                onError({\r\n                  msg: JSON.parse(error),\r\n                  headers,\r\n                  xhr,\r\n                });\r\n                reject({\r\n                  msg: JSON.parse(error),\r\n                  headers,\r\n                  xhr,\r\n                });\r\n              }\r\n            },\r\n          });\r\n        }\r\n      },\r\n      (error) => {\r\n        if (onError) onError(error);\r\n        console.log(\"*_3dspace_download_doc / error file URL *\", error);\r\n        reject(error);\r\n      }\r\n    );\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSpace_download_multidoc` télécharge plusieurs documents à partir d'un espace 3D en\r\n * utilisant un token et des objectID donnés.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification nécessaires à\r\n * l'authentification dans une fonction interne(_3DSpace_get_downloadTicket_multidoc). Il doit avoir les propriétés suivantes: space, token, tenant\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant \r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {String} [credentials.token] - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n\r\n * @param {String} [objectIds] - Un tableau d'ID d'objet qui doivent être téléchargés à partir du 3DSpace.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le\r\n * processus de téléchargement sera terminé avec succès. Il faut un argument, qui est le résultat du\r\n * processus de téléchargement.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur pendant le processus de téléchargement. Il vous permet de gérer les erreurs qui surviennent\r\n * lors du téléchargement.\r\n\r\n */\r\nexport async function _3DSpace_download_multidoc(\r\n  credentials,\r\n  objectIds,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (\r\n    typeof objectIds !== \"undefined\" &&\r\n    Array.isArray(objectIds) &&\r\n    objectIds?.length > 0\r\n  ) {\r\n    const datas = {\r\n      credentials,\r\n      myArray: objectIds,\r\n      chunk: 80,\r\n      fn_to_call: _3DSpace_get_downloadTicket_multidoc,\r\n    };\r\n\r\n    chunkArray(datas, (rep) => {\r\n      if (onDone) onDone(rep);\r\n    });\r\n  } else {\r\n    console.warn(\r\n      \"La liste d'objects dans la fonction _3DSpace_download_multidoc est vide ou non défini.\"\r\n    );\r\n    if (onError)\r\n      onError(\r\n        \"La liste d'objects dans la fonction _3DSpace_download_multidoc est vide ou non défini.\"\r\n      );\r\n  }\r\n}\r\n\r\n/**\r\n * @description La fonction `_3dspace_get_downloadTicket_multidoc` permet de récupérer un ticket de téléchargement\r\n * de plusieurs documents dans un espace 3D.\r\n * @param {Object} [credentials] - Un objet contenant les informations d'identification nécessaires à\r\n * l'authentification. Il doit avoir les propriétés suivantes: space, token, tenant\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant\r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {String} [credentials.token] - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {String} [objectIds] - Tableau d'ID d'objet pour lesquels le ticket de téléchargement doit être généré.\r\n * @param {Function} [onNext] - Une fonction de rappel qui sera appelée après chaque demande de ticket de\r\n * téléchargement réussie pour chaque objectId.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le\r\n * processus de téléchargement de chaque objet sera terminé avec succès. Il lui sera transmis un objet\r\n * contenant « objectId », « fileName » et « data » du fichier téléchargé.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction. Il est facultatif et peut être utilisé pour gérer les\r\n * erreurs qui surviennent.\r\n */\r\nexport function _3DSpace_get_downloadTicket_multidoc(\r\n  credentials,\r\n  objectIds,\r\n  onNext = undefined,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const compilData = [];\r\n  objectIds.forEach((objectId) => {\r\n    compilData.push({\r\n      id: objectId,\r\n    });\r\n  });\r\n  let data = JSON.stringify({\r\n    csrf: {\r\n      name: \"ENO_CSRF_TOKEN\",\r\n      value: credentials.token,\r\n    },\r\n    data: compilData,\r\n  });\r\n\r\n  const url = `${credentials.space}/resources/v1/modeler/documents/DownloadTicket?tenant=${credentials.tenant}&e6w-lang=fr&e6w-timezone=-120`;\r\n  _httpCallAuthenticated(url, {\r\n    method: \"PUT\",\r\n    data,\r\n    type: \"json\",\r\n    onComplete(response) {\r\n      const datas = response.data;\r\n      if (response.success === true) {\r\n        if (onNext) onNext();\r\n        datas.forEach((data) => {\r\n          try {\r\n            const fileName = data.dataelements.fileName;\r\n            const fileUrl = data.dataelements.ticketURL;\r\n\r\n            _httpCallAuthenticated(fileUrl, {\r\n              onComplete: (response, headers) => {\r\n                let tryParse;\r\n                try {\r\n                  tryParse = JSON.parse(response);\r\n                } catch (error) {\r\n                  tryParse = response.blob();\r\n                }\r\n                if (onDone)\r\n                  onDone({\r\n                    objectId: data.id,\r\n                    headers,\r\n                    fileName,\r\n                    data: tryParse,\r\n                  });\r\n              },\r\n              onFailure: (error) => {\r\n                console.log(\"error http\", error);\r\n              },\r\n            });\r\n          } catch (err) {\r\n            console.log(err);\r\n            if (onError) onError(err);\r\n          }\r\n        });\r\n      }\r\n    },\r\n    onFailure(response) {\r\n      console.log(response);\r\n      if (onError) onError(response);\r\n    },\r\n  });\r\n}\r\n\r\n// MATURITY\r\n/**\r\n * @description Cette fonction JavaScript récupère les prochains états possibles pour un objet donné dans un espace\r\n * 3D.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space » et « ctx ».\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {String} credentials.ctx - L'ID du contexte de travail.\r\n * @param {String} objectId - Le paramètre `objectId` est l'identifiant de l'objet dont vous souhaitez récupérer\r\n * les prochains états. Il est utilisé pour spécifier l'objet pour lequel vous souhaitez obtenir les\r\n * états suivants dans l'espace 3D.\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque la demande sera terminée avec\r\n * succès. Il recevra la réponse en paramètre.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction. Il s'agit d'un paramètre facultatif, donc s'il n'est pas\r\n * fourni, il sera par défaut «non défini».\r\n * @return {Promise}\r\n */\r\nexport function _3DSpace_lifecycle_getNextStates(\r\n  credentials,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  return new Promise((result) => {\r\n    if (credentials.token === \"\") {\r\n      _3DSpace_csrf(credentials);\r\n    }\r\n    if (objectId !== undefined && objectId !== \"\" && objectId !== null) {\r\n      const url = `${credentials.space}/resources/v1/modeler/dslc/maturity/getNextStates`;\r\n\r\n      let options = {\r\n        method: \"POST\",\r\n        headers: {\r\n          SecurityContext: \"ctx::\" + credentials.ctx,\r\n          ENO_CSRF_TOKEN: credentials.token,\r\n          Accept: \"application/json\",\r\n          \"Content-Type\": \"application/json\",\r\n        },\r\n        data: JSON.stringify({\r\n          data: [\r\n            {\r\n              id: objectId,\r\n            },\r\n          ],\r\n        }),\r\n        type: \"json\",\r\n        onComplete(response) {\r\n          if (onDone) onDone(response);\r\n        },\r\n        onFailure(response) {\r\n          if (onError) onError(response);\r\n        },\r\n      };\r\n      _httpCallAuthenticated(url, options);\r\n    }\r\n  });\r\n}\r\n/**\r\n * @description Cette fonction permet de changer l'état d'un objet dans un espace 3D.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space » et « ctx ».\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {String} credentials.ctx - L'ID du contexte de travail.\r\n * @param {String} objectId - Le paramètre objectId est l'identifiant de l'objet dont l'état doit être modifié.\r\n * Il s'agit d'un identifiant unique qui représente un objet spécifique dans le système.\r\n * @param {Function} [nextState] - Le paramètre `nextState` est l'état souhaité vers lequel vous souhaitez modifier\r\n * l'objet. Il représente l'état suivant du cycle de vie de l'objet.\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque l'opération de changement d'état\r\n * sera terminée avec succès. Il prend la réponse comme argument.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3dspace_lifecyle_changeState`. C'est un paramètre\r\n * facultatif, donc s'il n'est pas fourni, la fonction ne fera rien en cas de problème.\r\n * @returns une promesse.\r\n */\r\nexport function _3DSpace_lifecycle_changeState(\r\n  credentials,\r\n  objectId,\r\n  nextState,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  return new Promise((result) => {\r\n    if (credentials.token === \"\") {\r\n      _3DSpace_csrf(credentials);\r\n    }\r\n    if (objectId !== undefined && objectId !== \"\" && objectId !== null) {\r\n      const url = `${credentials.space}/resources/v1/modeler/dslc/maturity/changeState`;\r\n\r\n      let options = {\r\n        method: \"POST\",\r\n        headers: {\r\n          SecurityContext: \"ctx::\" + credentials.ctx,\r\n          ENO_CSRF_TOKEN: credentials.token,\r\n          Accept: \"application/json\",\r\n          \"Content-Type\": \"application/json\",\r\n        },\r\n        data: JSON.stringify({\r\n          data: [\r\n            {\r\n              id: objectId,\r\n              nextState,\r\n            },\r\n          ],\r\n        }),\r\n        type: \"json\",\r\n        onComplete(response) {\r\n          if (onDone) onDone(response);\r\n        },\r\n        onFailure(response) {\r\n          if (onError) onError(response);\r\n        },\r\n      };\r\n      _httpCallAuthenticated(url, options);\r\n    }\r\n  });\r\n}\r\n// RESERVATION\r\n//TODO -\r\nfunction _3DSpace_lifecyle_reserve(\r\n  host,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  // ...\r\n}\r\n//TODO -\r\nfunction _3DSpace_lifecyle_unreserve(\r\n  host,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  // ...\r\n}\r\n// SHARING\r\n//TODO -\r\nfunction _3DSpace_lifecyle_getSharing(\r\n  host,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  // ...\r\n}\r\n//TODO -\r\nfunction _3DSpace_lifecyle_setSharing(\r\n  host,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  // ...\r\n}\r\n// VERSIONING\r\n/**\r\n * @description La fonction `_3DSpace_lifecycle_getGraph` récupère un graphique du cycle de vie d'un objet spatial\r\n * 3D à l'aide des informations d'identification et de l'ID d'objet fournis.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier la demande.\r\n *  Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant\r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {String} credentials.ctx - L'ID du contexte de travail.\r\n * @param {String} objectId - Le paramètre objectId est l'identifiant de l'objet pour lequel vous souhaitez\r\n * récupérer le graphique. Il est utilisé pour spécifier l'objet pour lequel vous souhaitez obtenir le\r\n * graphique de version.\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque la récupération du graphique sera\r\n * réussie. Il prend la réponse comme argument.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSpace_lifecycle_getGraph`. C'est un paramètre\r\n * facultatif, donc s'il n'est pas fourni, la fonction ne fera rien en cas d'erreur.\r\n * @returns une promesse.\r\n */\r\nexport function _3DSpace_lifecycle_getGraph(\r\n  credentials,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  // A VALIDER\r\n  return new Promise((result) => {\r\n    if (credentials.token === \"\") {\r\n      _3DSpace_csrf(credentials);\r\n    }\r\n    if (objectId !== undefined && objectId !== \"\" && objectId !== null) {\r\n      const url = `${credentials.space}/resources/v1/dslc/versiongraph?withThumbnail=0&withIsLastVersion=0&withAttributes=0&withCopyFrom=0&tenant=${credentials.tenant}`;\r\n\r\n      _3DSpace_get_securityContexts(\r\n        credentials.space,\r\n        \"ESPACE COMMUN\",\r\n        [\"VPLMProjectLeader\", \"VPLMCreator\"],\r\n        undefined,\r\n        (ctx) => (credentials[\"ctx\"] = ctx),\r\n        (err) => {\r\n          console.log(\"onError =>\", err);\r\n        }\r\n      );\r\n      let options = {\r\n        method: \"POST\",\r\n        headers: {\r\n          securitycontext: \"ctx::\" + credentials.ctx,\r\n          ENO_CSRF_TOKEN: credentials.token,\r\n          Accept: \"application/json\",\r\n          \"Content-Type\": \"application/json\",\r\n        },\r\n        data: JSON.stringify({\r\n          graphRequests: [\r\n            {\r\n              id: objectId,\r\n            },\r\n          ],\r\n        }),\r\n        type: \"json\",\r\n        onComplete(response) {\r\n          if (onDone) onDone(response);\r\n        },\r\n        onFailure(response) {\r\n          if (onError) onError(response);\r\n        },\r\n      };\r\n      _httpCallAuthenticated(url, options);\r\n    }\r\n  });\r\n}\r\n// REVISION\r\n/**\r\n * @description La fonction `_3DSpace_lifecycle_getNextRevision` permet de récupérer la prochaine révision d'un\r\n * document dans un espace 3D.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant\r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {String} credentials.ctx - L'ID du contexte de travail.\r\n * @param {String} objectId - Le paramètre `objectId` est l'identifiant unique de l'objet pour lequel vous\r\n * souhaitez obtenir la prochaine révision. Il est utilisé pour spécifier l'objet qui doit être révisé.\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque l'opération sera terminée avec\r\n * succès. Il prend la réponse comme argument.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSpace_lifecycle_getNextRevision`. Il s'agit d'un\r\n * paramètre facultatif, donc s'il n'est pas fourni, il sera par défaut «non défini».\r\n * @returns Une promesse est renvoyée.\r\n */\r\nexport function _3DSpace_lifecycle_getNextRevision(\r\n  credentials,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  return new Promise((result) => {\r\n    if (credentials.token === \"\") {\r\n      _3DSpace_csrf(credentials);\r\n    }\r\n    if (objectId !== undefined && objectId !== \"\" && objectId !== null) {\r\n      const url = `${credentials.space}/resources/lifecycle/revise/prepare_revise_maskattributes?tenant=${credentials.tenant}`;\r\n\r\n      _3DSpace_get_securityContexts(\r\n        credentials.space,\r\n        \"ESPACE COMMUN\",\r\n        [\"VPLMProjectLeader\", \"VPLMCreator\"],\r\n        undefined,\r\n        (ctx) => (credentials[\"ctx\"] = ctx),\r\n        (err) => {\r\n          console.log(\"onError =>\", err);\r\n        }\r\n      );\r\n      let options = {\r\n        method: \"POST\",\r\n        headers: {\r\n          SecurityContext: \"ctx::\" + credentials.ctx,\r\n          ENO_CSRF_TOKEN: credentials.token,\r\n          Accept: \"application/json\",\r\n          \"Content-Type\": \"application/json\",\r\n        },\r\n        data: JSON.stringify({\r\n          data: [\r\n            {\r\n              \"attribute[PLMReference.V_versionComment]\": null,\r\n              physicalid: objectId,\r\n              type: \"Document\",\r\n              tenant: credentials.tenant,\r\n              objectId,\r\n              policy: \"Document Release\",\r\n              availableSemantic: [\"E\", \"LAST\", \"NEW\", \"DUP\"],\r\n            },\r\n          ],\r\n        }),\r\n        type: \"json\",\r\n        onComplete(response) {\r\n          if (onDone) onDone(response);\r\n        },\r\n        onFailure(response) {\r\n          if (onError) onError(response);\r\n        },\r\n      };\r\n      _httpCallAuthenticated(url, options);\r\n    }\r\n  });\r\n}\r\n/**\r\n * @description La fonction `_3DSpace_lifecycle_changeRevision` est utilisée pour changer la révision d'un objet\r\n * dans un espace 3D.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant\r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {String} credentials.ctx - L'ID du contexte de travail.\r\n * @param {String} objectId - Le paramètre objectId représente l'identifiant unique de l'objet dans l'espace 3D.\r\n * Il est utilisé pour spécifier quelle révision de l'objet doit être modifiée.\r\n * @param {Function} nextRevision - Le paramètre `nextRevision` est le numéro de révision qui sera attribué à\r\n * l'objet après le changement de révision.\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque l'opération sera terminée avec\r\n * succès. Il prend la réponse comme argument.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSpace_lifecycle_changeRevision`. Il vous permet de\r\n * gérer toutes les erreurs qui se produisent et d’effectuer toute gestion ou journalisation des\r\n * erreurs nécessaire.\r\n * @returns une promesse.\r\n */\r\nexport function _3DSpace_lifecycle_changeRevision(\r\n  credentials,\r\n  objectId,\r\n  nextRevision,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  return new Promise((result) => {\r\n    if (credentials.token === \"\") {\r\n      _3DSpace_csrf(credentials);\r\n    }\r\n    if (objectId !== undefined && objectId !== \"\" && objectId !== null) {\r\n      const url = `${credentials.space}/resources/lifecycle/revise/major?tenant=${credentials.tenant}`;\r\n\r\n      _3DSpace_get_securityContexts(\r\n        credentials.space,\r\n        \"ESPACE COMMUN\",\r\n        [\"VPLMProjectLeader\", \"VPLMCreator\"],\r\n        undefined,\r\n        (ctx) => (credentials[\"ctx\"] = ctx),\r\n        (err) => {\r\n          console.log(\"onError =>\", err);\r\n        }\r\n      );\r\n      let options = {\r\n        method: \"POST\",\r\n        headers: {\r\n          securitycontext: \"ctx::\" + credentials.ctx,\r\n          ENO_CSRF_TOKEN: credentials.token,\r\n          Accept: \"application/json\",\r\n          \"Content-Type\": \"application/json\",\r\n        },\r\n        data: JSON.stringify({\r\n          data: [\r\n            {\r\n              physicalid: objectId,\r\n              proposedRevision: nextRevision,\r\n              modifiedAttributes: {\r\n                revision: nextRevision,\r\n              },\r\n            },\r\n          ],\r\n          folderid: null,\r\n          notificationTimeout: 600,\r\n        }),\r\n        type: \"json\",\r\n        onComplete(response) {\r\n          if (onDone) onDone(response);\r\n        },\r\n        onFailure(response) {\r\n          if (onError) onError(response);\r\n        },\r\n      };\r\n      _httpCallAuthenticated(url, options);\r\n    }\r\n  });\r\n}\r\n\r\nexport function _3DSpace_get_currentSecurityContext(credentials) {\r\n  return new Promise((resolve, reject) => {\r\n    const url = `${\r\n      credentials.space\r\n    }/resources/pno/person/getsecuritycontext&tenant=${credentials.tenant.toUpperCase()}&xrequestedwith=xmlhttprequest`;\r\n\r\n    let options = {\r\n      method: \"GET\",\r\n      onComplete(response) {\r\n        resolve(response);\r\n      },\r\n      onFailure(response) {\r\n        reject(response);\r\n      },\r\n    };\r\n\r\n    _httpCallAuthenticated(url, options);\r\n  });\r\n}\r\n\r\nexport function _3DSpace_lifecycle_getRevisions(\r\n  credentials,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  return new Promise(async (resolve, reject) => {\r\n    const { tenant, ctx, space } = credentials;\r\n    if (!tenant || !ctx || !space) {\r\n      reject({ error: \"Erreur de credentials\", tenant, ctx, space });\r\n    }\r\n    const url = `${\r\n      credentials.space\r\n    }/resources/v1/dslc/versiongraph?withThumbnail=0&withIsLastVersion=1&withAttributes=1&withCopyFrom=1&tenant=${credentials.tenant.toUpperCase()}&xrequestedwith=xmlhttprequest`;\r\n    let SecurityContext;\r\n    await _3DSpace_get_currentSecurityContext(credentials).then(\r\n      (result) => (SecurityContext = result?.SecurityContext)\r\n    );\r\n\r\n    let options = {\r\n      method: \"POST\",\r\n      headers: {\r\n        securitycontext: \"ctx::\" + SecurityContext,\r\n        Accept: \"application/json\",\r\n        \"Content-Type\": \"application/json\",\r\n      },\r\n      data: JSON.stringify({\r\n        graphRequests: [\r\n          {\r\n            id: objectId,\r\n            attributes: [\"revision\", \"policy\"],\r\n          },\r\n        ],\r\n      }),\r\n      type: \"json\",\r\n      onComplete(response) {\r\n        if (onDone) onDone(response);\r\n        resolve(response);\r\n      },\r\n      onFailure(response) {\r\n        if (onError) onError(response);\r\n        reject(response);\r\n      },\r\n    };\r\n\r\n    _httpCallAuthenticated(url, options);\r\n  });\r\n}\r\n// SECTION: BOOKMARKS\r\n// ANCHOR: _3dspace_bookmark_getChildren\r\n// TODO : A finir , manque la FN _3dspace_get_multiDocInfo()\r\n// function _3DSpace_bookmark_getChildren(\r\n//   credentials,\r\n//   objIdBookmark,\r\n//   onDone = undefined,\r\n//   onError = undefined,\r\n// ) {\r\n//   return new Promise((resolve, reject) => {\r\n//     // const store = mainStore();\r\n\r\n//     const url = `${credentials.space}/resources/v1/modeler/dsbks/dsbks:Bookmark/${objIdBookmark}?$mask=dsbks:BksMask.Items`;\r\n//     _httpCallAuthenticated(url, {\r\n//       headers: {\r\n//         SecurityContext: `ctx::${credentials.ctx}`,\r\n//       },\r\n//       onComplete: (response) => {\r\n//         let tryParse;\r\n//         try {\r\n//           tryParse = JSON.parse(response);\r\n//         } catch (error) {\r\n//           tryParse = response;\r\n//         }\r\n//         if (typeof tryParse === \"object\") {\r\n//           let items = tryParse?.member[0]?.items?.member;\r\n//           if (items) {\r\n//             const listObjIds = items.map((e) => {\r\n//               if (e?.referencedObject?.identifier) {\r\n//                 return e.referencedObject.identifier;\r\n//               }\r\n//             });\r\n//             if (listObjIds.length) {\r\n//               _3DSpace_get_multiDocInfo(host, listObjIds, (res) => {\r\n//                 console.log(\"_3dspace_get_multiDocInfo Response : \", {\r\n//                   ...res,\r\n//                 });\r\n//                 if (res?.data.length) {\r\n//                   const listResponses = res.data;\r\n//                   listResponses.forEach((r) => {\r\n//                     let currentObject = items.find(\r\n//                       (o) => o.referencedObject.identifier === r.identifier,\r\n//                     );\r\n//                     if (currentObject) {\r\n//                       currentObject.referencedObject[\"dataelements\"] =\r\n//                         r.dataelements;\r\n//                     }\r\n//                   });\r\n//                 }\r\n//               });\r\n//             }\r\n//           }\r\n//         }\r\n\r\n//         if (onDone) onDone(tryParse);\r\n//         resolve = tryParse;\r\n//         return resolve;\r\n//       },\r\n//       onFailure(response) {\r\n//         if (onError) onError(response);\r\n//         reject = response;\r\n//         return reject;\r\n//       },\r\n//     });\r\n//   });\r\n// }\r\nexport function _3DSpace_bookmark_newWorkspace(\r\n  credentials,\r\n  parentId,\r\n  title,\r\n  description,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  return new Promise((result) => {\r\n    const url = `${credentials.space}/resources/v1/modeler/dsbks/dsbks:Bookmark`;\r\n    let item = {\r\n      attributes: {\r\n        title,\r\n        description,\r\n        inheritedAccess: \"no\",\r\n      },\r\n    };\r\n    let bodyRequest = {\r\n      items: [],\r\n    };\r\n    if (parentId) bodyRequest[\"parentId\"] = parentId;\r\n    bodyRequest.items.push(item);\r\n\r\n    let options = {\r\n      method: \"POST\",\r\n      headers: {\r\n        Accept: \"application/json\",\r\n        \"Content-Type\": \"application/json\",\r\n        SecurityContext: credentials.ctx,\r\n        ENO_CSRF_TOKEN: credentials.token,\r\n      },\r\n      data: JSON.stringify(bodyRequest),\r\n      type: \"json\",\r\n      onComplete(response) {\r\n        if (onDone) onDone(response);\r\n      },\r\n      onFailure(response) {\r\n        if (onError) onError(response);\r\n      },\r\n    };\r\n    _httpCallAuthenticated(url, options);\r\n  });\r\n}\r\n/**\r\n * @description `_3DSpace_bookmark_addSubsciptions`\r\n * @param {Object} credentials\r\n * @param {String} objectId\r\n * @param {String} personList \"<uuid:5ca25b8e-98d0-46c3-ac43-3faa83c4295a>\"\r\n * @param {Array} eventsList \"NXFolderCreated,NXFolderDeleted,NXContentAdded,NXContentRemoved\"\r\n * @param {Function} onDone\r\n * @param {Function} onError\r\n * @returns {Promise}\r\n */\r\nexport function _3DSpace_bookmark_addSubsciptions(\r\n  credentials,\r\n  objectId,\r\n  personList,\r\n  eventsList,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  console.log(\"credentials\", credentials);\r\n  return new Promise((result) => {\r\n    const url = `${credentials.space}/resources/v1/modeler/subscriptions/createPushSubscription?xrequestedwith=xmlhttprequest`;\r\n\r\n    let options = {\r\n      method: \"POST\",\r\n      headers: {\r\n        Accept: \"application/json\",\r\n        \"Content-Type\": \"application/json\",\r\n      },\r\n      data: JSON.stringify({\r\n        csrf: {\r\n          name: \"ENO_CSRF_TOKEN\",\r\n          value: credentials.token,\r\n        },\r\n        data: [\r\n          {\r\n            type: \"Workspace\",\r\n            cestamp: \"businessobject\",\r\n            relId: objectId,\r\n            id: objectId,\r\n            dataelements: {\r\n              personList,\r\n              eventsList,\r\n            },\r\n            tenant: credentials.tenant,\r\n          },\r\n        ],\r\n      }),\r\n      type: \"json\",\r\n      onComplete(response) {\r\n        if (onDone) onDone(response);\r\n      },\r\n      onFailure(response) {\r\n        if (onError) onError(response);\r\n      },\r\n    };\r\n  });\r\n}\r\n\r\n//!SECTION\r\n\r\n// module.exports = {\r\n\r\n//   _3DSpace_bookmark_getChildren,\r\n// };\r\n","import { _httpCallAuthenticated } from \"./3dexperience_api\";\r\n\r\n/**\r\n * @description La fonction `getAllContextSecurity` effectue une requête HTTP GET authentifiée pour récupérer toutes\r\n * les ressources de sécurité du contexte.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier la demande.\r\n *  Il inclut généralement des propriétés telles qu'ici « space » et « tenant ».(ex: credentials.space, credentials.tenant).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant\r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque la requête HTTP sera terminée avec\r\n * succès. Il prend deux paramètres: \"rep\" (la réponse JSON analysée) et \"headers\" (les en-têtes de\r\n * réponse).\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de la requête HTTP. Il faut trois arguments : « réponse », « en-têtes » et « xhr ».\r\n * L'argument `response` contient le corps de la réponse d'erreur, l'argument `headers` contient les en-têtes de réponse,\r\n *\r\n */\r\nexport function getAllContextSecurity(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const URL = {\r\n    base: `${credentials.space}`,\r\n    uri: \"/resources/bps/cspaces\",\r\n    optTenant: `tenant=${credentials.tenant}`,\r\n  };\r\n\r\n  const url = `${URL.base}${URL.uri}?${URL.optTenant}`;\r\n\r\n  _httpCallAuthenticated(url, {\r\n    method: \"GET\",\r\n    headers: {\r\n      Accept: \"application/json,text/javascript,*/*\",\r\n      \"Content-Type\": \"application/ds-json\",\r\n    },\r\n    onComplete(response, headers) {\r\n      const rep = JSON.parse(response);\r\n\r\n      if (onDone) onDone(rep, headers);\r\n    },\r\n    onFailure(response, headers, xhr) {\r\n      if (onError) onError({ response, headers, xhr });\r\n    },\r\n  });\r\n}\r\n","import { _httpCallAuthenticated } from \"./3dexperience_api\";\r\nimport { _3DSpace_get_ticket } from \"./3dspace_api\";\r\n/**\r\n * @description La fonction `getDataFrom3DSpace` récupère les données d'un espace 3D en utilisant les informations\r\n * d'identification fournies et les préférences du widget, et appelle le rappel `onDone` avec la\r\n * réponse ou le rappel `onError` avec toutes les erreurs rencontrées.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token » et « space ».(ex: credentials.token, credentials.space, credentials.tenant, credentials.ctx)\r\n * @property space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace, 3DSwym, 3DCompass...)\r\n * @property token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n *\r\n * @param widgetPreference - Le paramètre `widgetPreference` est un objet qui contient les préférences\r\n * du widget. Il peut inclure des propriétés telles que la taille, la couleur, la position du widget ou\r\n * toute autre personnalisation spécifique au widget.\r\n * @param onDone - Une fonction de rappel qui sera appelée lorsque la récupération des données sera\r\n * réussie. Il prend la réponse comme paramètre.\r\n * @param onError - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `getDataFrom3DSpace`. Il est utilisé pour gérer et traiter\r\n * les erreurs qui surviennent.\r\n */\r\nexport function getDataFrom3DSpace(\r\n  credentials,\r\n  widgetPreference,\r\n  onDone,\r\n  onError,\r\n) {\r\n  _3DSpace_get_ticket(\r\n    credentials.space,\r\n    widgetPreference,\r\n    (response) => {\r\n      _httpCallAuthenticated(response, {\r\n        header: { ENO_CSRF_TOKEN: credentials.token },\r\n        onComplete: (response) => {\r\n          if (onDone) onDone(response);\r\n        },\r\n        onFailure: (error) => {\r\n          console.log(\"error http\", error);\r\n          if (onError) onError(error);\r\n        },\r\n      });\r\n    },\r\n    (error) => {\r\n      console.log(\"error file URL\", error);\r\n      if (onError) onError(error);\r\n    },\r\n  );\r\n}\r\n","import { _3DSpace_get_ticket } from \"./3dspace_api\";\r\nimport { _httpCallAuthenticated } from \"./3dexperience_api\";\r\n/**\r\n * @description La fonction `getDownloadDocument` est une fonction asynchrone qui récupère un document à télécharger\r\n * à partir d'un espace et d'un ID de document spécifiés.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace, 3DSwym, 3DCompass...)\r\n * @param {String} docId - L'ID du document du fichier que vous souhaitez télécharger.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée une fois le\r\n * téléchargement terminé et réussi. Les données de réponse seront transmises comme argument. Il prend trois arguments : « reponse », « headers » et « xhr ».\r\n *\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur pendant le processus de téléchargement. Il prend trois arguments : « error », « headers » et « xhr ».\r\n *\r\n * @returns un objet Promesse.\r\n */\r\nexport async function getDownloadDocument(\r\n  credentials,\r\n  docId,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  return new Promise((result) => {\r\n    //TODO - a test ? manque l'URL\r\n    _3DSpace_get_ticket(credentials, docId, (reponse) => {\r\n      _httpCallAuthenticated(reponse, {\r\n        onComplete: (reponse, headers, xhr) => {\r\n          result(JSON.parse(reponse));\r\n          if (onDone) onDone(JSON.parse(reponse), headers, xhr);\r\n          return result;\r\n        },\r\n        onFailure: (error, headers, xhr) => {\r\n          if (onError) onError(error, headers, xhr);\r\n          console.log(error, headers?.errormsg);\r\n        },\r\n      });\r\n    });\r\n  });\r\n}\r\n","import { _3DSpace_get_csrf, _3DSpace_file_update } from \"./3dspace_api\";\r\n\r\n/**\r\n * @description La fonction « pushDataIn3DSpace » est utilisée pour pousser les données dans le 3DSpace à l'aide\r\n * des informations d'identification et de l'ID d'objet fournis.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification nécessaires à\r\n * l'authentification dans une fonction interne(_3DSpace_get_downloadTicket_multidoc). Il doit avoir les propriétés suivantes: space, token, tenant\r\n * @param {String} [credentials.space] - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace :(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia) , 3DSwym, 3DCompass...)\r\n \r\n * @param {Object} dataBase - Le paramètre `dataBase` est un objet qui contient les données que vous souhaitez\r\n * transférer dans l'espace 3D. Il sera converti au format JSON et enregistré sous forme de fichier\r\n * dans l'espace 3D.\r\n * @param {String} objectId - Le paramètre objectId est l'identifiant unique de l'objet dans l'espace 3D où les\r\n * données seront poussées.\r\n * @param {Function} [onDone] - Le paramètre onDone est une fonction de rappel qui sera appelée lorsque les\r\n * données seront correctement poussées vers l'espace 3D. Il faut un argument, qui est le résultat de\r\n * l'opération.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée si une erreur\r\n * survient lors de l'exécution de la fonction `pushDataIn3DSpace`. Il vous permet de gérer et de\r\n * répondre à toute erreur pouvant survenir.\r\n */\r\nexport function pushDataIn3DSpace(\r\n  credentials,\r\n  dataBase,\r\n  objectId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const jsonFile = new Blob([JSON.stringify(dataBase)], { type: \"text/plain\" });\r\n\r\n  credentials = { ...credentials, objID: objectId };\r\n  _3DSpace_get_csrf(\r\n    credentials,\r\n    (data) => {\r\n      console.log(\"_3DSpace_get_csrf | onDone | data\", data);\r\n      const fileId = data.datas.relateddata.files[0].id;\r\n      const fileName = data.datas.relateddata.files[0].dataelements.title;\r\n\r\n      _3DSpace_file_update(\r\n        credentials,\r\n        objectId,\r\n        fileId,\r\n        jsonFile,\r\n        fileName,\r\n        (result) => {\r\n          if (onDone) onDone(result);\r\n        },\r\n        (err) => {\r\n          if (onError) onError(err);\r\n        }\r\n      );\r\n    },\r\n    (error) => {\r\n      console.log(\"En cas d'erreur nous avons :\", error);\r\n      alert(\"Erreur lors de la sauvegarde, Veuillez réessayez\");\r\n      if (onError) onError(error);\r\n    }\r\n  );\r\n}\r\n","import {\r\n  _3DSpace_download_doc,\r\n  _3DSpace_download_multidoc,\r\n  _3DSpace_get_csrf,\r\n  _3DSpace_csrf,\r\n} from \"./3dspace_api\";\r\n\r\nlet listObjectId, datas;\r\n\r\nconst mixedDatas = [];\r\n\r\n/**\r\n * @description La fonction `get_3DSpace_csrf` récupère un jeton CSRF du 3DSpace en utilisant les  informations d'identification fournies.(Anciennement loadDatas()) avec ou sans objID\r\n *\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici' « objID », « space ».\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.objID - Le paramètre objID correspond à un object ID contant les objets Id des bases de données)(se base sur un tenant).\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le jeton\r\n * CSRF sera récupéré avec succès. Il faut un argument, qui est la valeur du jeton CSRF.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée si une erreur\r\n * survient lors de l'exécution de la fonction `get_3DSpace_csrf`. C'est un paramètre facultatif, donc\r\n * s'il n'est pas fourni, la fonction ne fera rien en cas d'erreur.\r\n */\r\nexport async function get_3DSpace_csrf(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  if (credentials.objID && credentials.objID !== \"\") {\r\n    _3DSpace_get_csrf(\r\n      credentials,\r\n      (response) => {\r\n        if (onDone) onDone(response);\r\n      },\r\n      (err) => {\r\n        if (onError) onError(err);\r\n      },\r\n    );\r\n  } else if (credentials.objID === null || credentials.objID === \"\") {\r\n    _3DSpace_csrf(\r\n      credentials,\r\n      (rep) => {\r\n        const msg = \"Pas d'objID, ou invalide\";\r\n        const info = { rep, msg };\r\n        if (onDone) onDone(info);\r\n      },\r\n      (err) => {\r\n        const msg = \"Pas d'objID et erreur sur le Space\";\r\n        const infos = { msg, err };\r\n        if (onError) onError(infos);\r\n      },\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * @description La fonction `getDatasByTenant` est une fonction asynchrone qui télécharge une liste de documents à partir du 3DSpace à l'aide des informations d'identification fournies (un ObjectId) et appelle le rappel `onDone`\r\n * avec les données téléchargées ou le rappel `onError` avec une erreur le cas échéant. (anciennement getDocuments())\r\n\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant \r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token) (get_3DSpace_csrf())\r\n * @param {String} credentials.objID - object Id contenant une liste d'object IDs.\r\n * @param {Function} [onDone] - Le paramètre onDone est une fonction de rappel qui sera appelée lorsque les\r\n * données seront téléchargées avec succès. Il faut un argument, qui correspond aux données\r\n * téléchargées.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée si une erreur\r\n * survient lors de l'exécution de la fonction `_3DSpace_download_doc`. Il vous permet de gérer et de\r\n * répondre à toute erreur pouvant survenir.\r\n */\r\nexport async function getDatasByTenant(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  console.log(\"getDatasByTenant (getDocuments)\", credentials);\r\n\r\n  await _3DSpace_download_doc(\r\n    credentials,\r\n    (data) => {\r\n      const _datas = {};\r\n      _datas[\"obj\"] = data;\r\n      console.log(\"getDatasByTenant (getDocuments) _datas\", _datas);\r\n      onDone && onDone?.(_datas);\r\n\r\n      // getDatasFrom3DSpace(\r\n      //   credentials,\r\n      //   (reponse) => {\r\n\r\n      //     _datas[\"datas\"] = reponse;\r\n\r\n      //     if (onDone) onDone(_datas);\r\n      //   },\r\n      //   (err) => {\r\n      //     if (onError) onError(err);\r\n      //   },\r\n      // );\r\n    },\r\n    (err) => {\r\n      onError && onError?.(err);\r\n    },\r\n  );\r\n}\r\n\r\n/**\r\n * @description La fonction `getDatasFrom3DSpace` récupère les données d'un espace 3D en utilisant les informations\r\n * d'identification fournies et appelle le rappel `onDone` avec les données récupérées ou le rappel\r\n * `onError` avec une erreur le cas échéant.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant\r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param {ArrayOfObject} credentials.objIds - Tableau d'objets des objets Id des bases de données et leur nom.(ex: credentials.objIds=[{objID:\"xxx\",name:\"xxx\"},{objID:\"xxx\",name:\"xxx\"}] ) (name disponible dans le module :\r\n * - dbClients,\r\n * - dbCatalogs,\r\n * - dbProjets )\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque toutes\r\n * les données auront été téléchargées avec succès depuis l'espace 3D. Il faut un argument, qui est un\r\n * tableau d’objets. Chaque objet du tableau représente un document téléchargé et possède deux\r\n * propriétés: le nom du document\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSpace_download_doc`. Il vous permet de gérer et de\r\n * répondre à toute erreur qui se produit.\r\n */\r\nexport function getDatasFrom3DSpace(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const bbds = [];\r\n  if (\r\n    !credentials.objIds &&\r\n    !Array.isArray(credentials.objIds) &&\r\n    credentials.objIds.length === 0\r\n  ) {\r\n    console.warn(\"la liste est vide ou n'est pas un tableau\");\r\n    return;\r\n  }\r\n  credentials.objIds.forEach((obj, i) => {\r\n    _3DSpace_download_doc(\r\n      credentials,\r\n      obj.objID,\r\n      (data) => {\r\n        bbds.push({ [obj.name]: data });\r\n        if (obj.name === \"dbProjets\") {\r\n          listObjectId = data.affaires.map((aff) => {\r\n            return aff.objectID;\r\n          });\r\n          dataMixing(credentials, datas);\r\n        }\r\n        if (i === credentials.objIds.length - 1) {\r\n          if (onDone) onDone(bbds);\r\n\r\n          delete credentials.objIds;\r\n          delete credentials.datas;\r\n        }\r\n      },\r\n      (err) => {\r\n        if (onError) onError(err);\r\n      },\r\n    );\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `dataMixing` prend en compte les informations d'identification, les données et les\r\n * rappels facultatifs, télécharge les données à partir d'un espace 3D, les mélange avec les données\r\n * d'entrée et renvoie les données mélangées.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).\r\n@param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant \r\n * @example {tenant:\"R1132100968447\"}\r\n * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)\r\n * @param _datas - Le paramètre `_datas` est un tableau d'objets ID d'Affaires\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le\r\n * processus de mélange des données sera terminé avec succès. Il prend un argument, `mixedDatas`, qui\r\n * est un tableau contenant les données mixtes.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée en cas\r\n * d'erreur lors du processus de mélange des données. Il faut un argument, qui est l'objet d'erreur.\r\n */\r\nexport function dataMixing(\r\n  credentials,\r\n  _datas,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  _3DSpace_download_multidoc(\r\n    credentials,\r\n    listObjectId,\r\n    (result) => {\r\n      const copyData = [..._datas];\r\n      copyData.find((e) => e.objectID === result.objectId)[\"data\"] =\r\n        result.data;\r\n      datas = copyData;\r\n\r\n      mixedDatas.push(result.data);\r\n      if (onDone) onDone(mixedDatas);\r\n    },\r\n    (err) => {\r\n      if (onError) onError(err), console.log(err);\r\n    },\r\n  );\r\n}\r\n","import { _httpCallAuthenticated } from \"../main/3dexperience_api\";\r\nimport { _3DSpace_get_docInfo } from \"../main/3dspace_api\";\r\nimport { UUID } from \"../../api/index\";\r\n\r\n// LINK - https://media.3ds.com/support/documentation/developer/Cloud/en/English/CAA3DSpaceREST/CAA6WRestServicePrinciples.htm\r\n// Doc de test sur tenant BEAM3 PROD\r\nconst objIDTEST = \"B70C12CDAE0415006579A93200061A14\";\r\n// Doc de test sur tenant Pivetau TEST\r\nconst objIDTEST2 = \"FA35FB9B177A28006580190400193C20\";\r\nconst objIDTEST3 = \"FA35FB9B177A280065800EA0000F599C\";\r\n\r\nconst sourcesSearching = [\r\n  \"swym\",\r\n  \"3dspace\",\r\n  \"drive\",\r\n  \"usersgroup\",\r\n  \"3dplan\",\r\n  \"dashboard\",\r\n];\r\n\r\nconst listPredicates = {\r\n  how: \"ds6w:how\",\r\n  what: \"ds6w:what\",\r\n  when: \"ds6w:when\",\r\n  where: \"ds6w:where\",\r\n  who: \"ds6w:who\",\r\n  why: \"ds6w:why\",\r\n};\r\nconst objToTag = {\r\n  objId: objIDTEST3,\r\n  pred: \"who\",\r\n  order_by: \"desc\",\r\n  tag: \"testTag\",\r\n};\r\n\r\n/**\r\n * @description La fonction `addTagToDoc` est utilisée pour ajouter une balise à un document dans un espace 3D en\r\n * utilisant les informations d'identification et les informations sur l'objet fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {Object} credentials.currentUser.username - Le paramètre `currentUser` est un qui contient les informations de l'utilisateur qui envoie le message(appeler depuis la fonction `_3DSwym_get_currentuser`), une chaîne de caractère contenant le nom d'utilisateur.\r\n *\r\n * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)\r\n * @param {Object} obj - Le paramètre `obj` est un objet qui contient les propriétés suivantes :\r\n * @param {String} obj.info.name - L'identifiant de l'objet que vous souhaitez marquer. (ex: B70C12CDAE0415006579A93200061A14)\r\n * @param {String} obj.pred - La propriété de l'objet que vous souhaitez marquer. (ex: how, what, when, where, who, why)\r\n * @param {String} obj.tag - Le tag que vous souhaitez ajouter à l'objet.\r\n * @param {String} obj.order_by - L'ordre de la balise que vous souhaitez ajouter à l'objet. (ex: asc, desc)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque\r\n * l'opération de marquage sera terminée avec succès. La réponse du serveur lui sera transmise en\r\n * argument.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `addTagToDoc`. Il vous permet de gérer et de traiter\r\n * l'erreur de manière personnalisée.\r\n * @example credentials={space: \"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\", currentUser: { username: \"Yan\" }, tenant: \"R1132100968447\"}\r\n * @example obj={objId: \"B70C12CDAE0415006579A93200061A14\", pred: \"what\", tag: \"testTag\"}\r\n *\r\n */\r\nexport function addTagToDoc(\r\n  credentials,\r\n  obj,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { space, tenant } = credentials;\r\n  const { objId, pred, tag } = obj;\r\n\r\n  const URL = {\r\n    uri: \"/resources/6w/tags\",\r\n    otpCTX: \"SecurityContext=preferred\",\r\n    optTenant: `tenant=${tenant}`,\r\n  };\r\n  const url = `${space}${URL.uri}?${URL.otpCTX}&${URL.optTenant}`;\r\n  const dataTest = {\r\n    tag: [\r\n      {\r\n        subject: [\r\n          {\r\n            uri: `pid://${objId}`,\r\n          },\r\n        ],\r\n        predicate: listPredicates[pred],\r\n        object: {\r\n          literal: tag,\r\n        },\r\n      },\r\n    ],\r\n  };\r\n\r\n  _httpCallAuthenticated(url, {\r\n    method: \"PUT\",\r\n    headers: {\r\n      \"Content-Type\": \"application/json\",\r\n      Accept: \"application/json\",\r\n    },\r\n    data: JSON.stringify(dataTest),\r\n    onComplete(response) {\r\n      const resp = JSON.parse(response);\r\n      const info = {};\r\n      setTimeout(() => {\r\n        _3DSpace_get_docInfo(\r\n          credentials,\r\n          objId,\r\n          (rep) => {\r\n            const docName = rep.data[0].dataelements.title;\r\n            const docExt =\r\n              rep.data[0].dataelements.fileExtension !== undefined\r\n                ? rep.data[0].dataelements.fileExtension\r\n                : \"\";\r\n            const createBy =\r\n              rep.data[0].relateddata.ownerInfo[0].dataelements.name;\r\n            info[\"name\"] = docName;\r\n            info[\"ext\"] = docExt;\r\n            info[\"createBy\"] = createBy;\r\n            obj.info = { ...info };\r\n            getActualTagsOnDoc(\r\n              credentials,\r\n              obj,\r\n              (rep) => {\r\n                if (onDone) onDone(rep);\r\n              },\r\n              (err) => {\r\n                if (onError) onError(err);\r\n              },\r\n            );\r\n          },\r\n          (response, headers) => {\r\n            const info = response;\r\n            info[\"msg\"] = headers.errormsg;\r\n            info[\"errCode\"] = headers.errorcode;\r\n            console.log(\"❌ sendDirectMessage => \", info);\r\n            if (onError) onError(info);\r\n          },\r\n        );\r\n      }, 2000);\r\n    },\r\n    onFailure(response, headers) {\r\n      const info = response;\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n      console.log(\"❌ sendDirectMessage => \", info);\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n/**\r\n * @description La fonction `getActualTagsOnDoc` récupère les balises réelles d'un document en utilisant les\r\n * informations d'identification et les informations sur l'objet fournies. Appeler depuis `addTagToDoc()`\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)\r\n * @param {Object} credentials.currentUser.username - Le paramètre `currentUser` est un qui contient les informations de l'utilisateur qui envoie le message(appeler depuis la fonction `_3DSwym_get_currentuser`).\r\n * @param {Object} credentials.ctx  - L'ID du contexte de travail.\r\n * @param obj - Le paramètre `obj` est un objet qui contient des informations sur le document. Il\r\n * possède les propriétés suivantes :\r\n * @param {String} obj.info.name - Le nom du document.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque\r\n * l'opération de marquage sera terminée avec succès. La réponse du serveur lui sera transmise en\r\n * argument.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `addTagToDoc`. Il vous permet de gérer et de traiter\r\n * l'erreur de manière personnalisée.\r\n */\r\nexport function getActualTagsOnDoc(\r\n  credentials,\r\n  obj,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  // const nomFichier = \"beam_cube_TEST_BDD\";\r\n  console.log(\"obj \", obj);\r\n  const nomFichier = obj.info.name;\r\n  const URL = {\r\n    baseUrl: `https://${credentials.tenant.toLowerCase()}-eu1-fedsearch.3dexperience.3ds.com`,\r\n    uri: \"/federated/search\",\r\n  };\r\n  const url = `${URL.baseUrl}${URL.uri}`;\r\n  const headers = {\r\n    \"Content-Type\": \"application/json\",\r\n    Accept: \"application/json,text/javascript,*/*\",\r\n  };\r\n  const uuid = UUID();\r\n  const dataPattern = {\r\n    with_indexing_date: true,\r\n    with_synthesis: true,\r\n    with_nls: false,\r\n    label: `3DSearch-${credentials.currentUser.username}-AjoutDeTagBeam-${uuid}`,\r\n    locale: \"fr\",\r\n    select_predicate: [\r\n      \"ds6w:label\",\r\n      \"ds6w:type\",\r\n      \"ds6w:description\",\r\n      \"ds6w:identifier\",\r\n      \"ds6w:modified\",\r\n      \"ds6w:created\",\r\n      \"ds6wg:revision\",\r\n      \"ds6w:status\",\r\n      \"ds6w:responsible\",\r\n      \"owner\",\r\n      \"ds6w:responsibleUid\",\r\n      \"ds6wg:filesize\",\r\n      \"ds6w:project\",\r\n      \"ds6w:dataSource\",\r\n      \"ds6w:community\",\r\n      \"ds6w:originator\",\r\n      \"dsgeo:referential\",\r\n      \"ds6w:lastModifiedBy\",\r\n      \"ds6w:repository\",\r\n      \"dcterms:title\",\r\n      \"dcterms:description\",\r\n      \"ds6w:containerUid\",\r\n    ],\r\n    with_synthesis_hierarchical: true,\r\n    select_file: [\"icon\", \"thumbnail_2d\"],\r\n    query: nomFichier,\r\n    specific_source_parameter: {\r\n      \"3dspace\": {\r\n        additional_query:\r\n          ' AND NOT (owner:\"ENOVIA_CLOUD\" OR owner:\"Service Creator\" OR owner:\"Corporate\" OR owner:\"User Agent\" OR owner:\"SLMInstallerAdmin\" OR owner:\"Creator\" OR owner:\"VPLMAdminUser\") AND (ds6w_58_islastrevisionperstate:true OR NOT listoffields:ds6w_58_islastrevisionperstate)',\r\n      },\r\n      drive: {\r\n        additional_query:\r\n          ' AND NOT ([flattenedtaxonomies]:\"types/DriveNode\" AND ( [current]:\"Trashed\" OR [policy]:\"Drive File Iteration\") )',\r\n      },\r\n    },\r\n    select_exclude_synthesis: [\"ds6w:what/ds6w:topic\"],\r\n    order_by: objToTag.order_by,\r\n    order_field: \"relevance\",\r\n    select_snippets: [\r\n      \"ds6w:snippet\",\r\n      \"ds6w:label:snippet\",\r\n      \"ds6w:responsible:snippet\",\r\n      \"ds6w:community:snippet\",\r\n      \"swym:message_text:snippet\",\r\n    ],\r\n    nresults: 40,\r\n    start: \"0\",\r\n    source: sourcesSearching,\r\n    tenant: credentials.tenant,\r\n    login: {\r\n      \"3dspace\": {\r\n        SecurityContext: credentials.ctx,\r\n      },\r\n    },\r\n  };\r\n  console.log(\"dataPattern => \", dataPattern);\r\n  _httpCallAuthenticated(url, {\r\n    method: \"POST\",\r\n    headers: headers,\r\n    data: JSON.stringify(dataPattern),\r\n    onComplete(response) {\r\n      const info = JSON.parse(response);\r\n      onDone(info);\r\n    },\r\n    onFailure(err, headers) {\r\n      const info = err;\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n      console.log(\"❌ sendDirectMessage => \", info);\r\n      if (onError) onError(info);\r\n      console.log(\"Erreur de recuperation d'id du doc et des tags\", err);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `removeTagToDoc` est utilisée pour supprimer une balise spécifique d'un document en\r\n * utilisant les informations d'identification et les informations sur l'objet fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {String} credentials.tenant - L'identifiant du tenant sur lequel l'API est déployée.(ex: R1132100968447)\r\n *\r\n * @param {Object} obj - Le paramètre `obj` est un objet qui contient les propriétés suivantes :\r\n * @param {String} obj.objId - L'identifiant unique de l'objet pour lequel vous souhaitez supprimer la balise.\r\n * @param {String} obj.pred - L'identifiant de la relation entre l'objet et la balise. (ex: how, what, when, where, who, why).\r\n * @param {String} obj.tag - Le nom du tag à supprimer.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * suppression de la balise du document sera terminée avec succès. Il faut un argument, qui est la\r\n * réponse du serveur.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `removeTagToDoc`. Il vous permet de gérer et de traiter\r\n * l'erreur de manière personnalisée.\r\n */\r\nexport function removeTagToDoc(\r\n  credentials,\r\n  obj,\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { objId, pred, tag } = obj;\r\n\r\n  const URL = {\r\n    uri: \"/resources/6w/tags\",\r\n    otpCTX: \"SecurityContext=preferred\",\r\n    optTenant: `tenant=${credentials.tenant}`,\r\n  };\r\n  const url = `${credentials.space}${URL.uri}?${URL.otpCTX}&${URL.optTenant}`;\r\n  const dataTest = {\r\n    tag: [\r\n      {\r\n        subject: [\r\n          {\r\n            uri: `pid://${objId}`,\r\n          },\r\n        ],\r\n        predicate: listPredicates[pred],\r\n        object: {\r\n          literal: tag,\r\n        },\r\n      },\r\n    ],\r\n  };\r\n  _httpCallAuthenticated(url, {\r\n    method: \"DELETE\",\r\n    data: JSON.stringify(dataTest),\r\n    headers: {\r\n      \"Content-Type\": \"application/json\",\r\n      Accept: \"application/json,text/javascript,*/*\",\r\n    },\r\n    onComplete(response) {\r\n      if (onDone) onDone(response);\r\n    },\r\n    onFailure(err, headers) {\r\n      const info = err;\r\n      info[\"msg\"] = headers.errormsg;\r\n      info[\"errCode\"] = headers.errorcode;\r\n      console.log(\"❌ sendDirectMessage => \", info);\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction « getInfoDocTags » effectue un appel HTTP pour récupérer des informations sur les\r\n * documents en fonction des informations d'identification et des identifiants de document fournis.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {String} str - Le paramètre `str` est une chaîne qui représente l'ID du documents pour lesquels\r\n * vous souhaitez récupérer des informations.\r\n * @param {Function} onDone - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * requête HTTP sera terminée avec succès. Il prend un argument, qui correspond aux données de réponse\r\n * de la requête.\r\n * @param {Function} onError - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `getInfoDocTags`. Il vous permet de gérer et de traiter\r\n * les informations d'erreur.\r\n * @returns La fonction ne renvoie explicitement rien.\r\n */\r\nexport function getInfoDocTags(\r\n  credentials,\r\n  str = \"\",\r\n  onDone = undefined,\r\n  onError = undefined,\r\n) {\r\n  const { space } = credentials;\r\n  if (str === \"\") return;\r\n\r\n  const URL = {\r\n    uri: \"/resources/v1/modeler/documents\",\r\n  };\r\n\r\n  const headers = {\r\n    \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\r\n    Accept: \"application/json,text/javascript,*/*\",\r\n  };\r\n  const url = `${space}${URL.uri}`;\r\n\r\n  const dataTest = `$include=none,lockerInfo,ownerInfo,originatorInfo,files,ownerInfo,originatorInfo&$fields=none,title,name,typeNLS,collabSpaceTitle,revision,isLatestRevision,files,lockStatus,lockerInfo.name,lockerInfo.firstname,lockerInfo.lastname,owner,ownerInfo.name,ownerInfo.firstname,ownerInfo.lastname,stateNLS,modified,policy,state,organizationTitle,originator,originatorInfo.name,originatorInfo.firstname,originatorInfo.lastname,hasModifyAccess,fileExtension,files.name,files.title,files.revision,files.locker,ownerInfo,ownerInfo.name,ownerInfo.firstname,ownerInfo.lastname,originatorInfo,originatorInfo.name,originatorInfo.firstname,originatorInfo.lastname&$ids=${str}`;\r\n\r\n  _httpCallAuthenticated(url, {\r\n    method: \"POST\",\r\n    headers: headers,\r\n    data: dataTest,\r\n    onComplete(response) {\r\n      if (onDone) onDone(JSON.parse(response));\r\n    },\r\n    onFailure(err, header) {\r\n      const info = err;\r\n      info[\"msg\"] = header.error;\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n","import { _httpCallAuthenticated } from \"../main/3dexperience_api\";\r\n\r\n/**\r\n * @description La fonction `_3DSwym_get_Token` récupère le token du 3DSwym et effectue des actions supplémentaires si nécessaire. Obligatoire pour chaque appel d'API du Swym.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque les\r\n * informations de version seront récupérées avec succès. Il prend un argument, `tokenInfo`, qui est la\r\n * réponse contenant les informations de version. Le token est aussi envoyé dans une nouvelle propriété : `credentials.token`\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de la requête HTTP. Il est facultatif et peut être indéfini.\r\n */\r\nexport async function _3DSwym_get_Token(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const url = credentials._3DSwym + \"/api/index/tk\";\r\n\r\n  return _httpCallAuthenticated(url, {\r\n    onComplete(response, headers, xhr) {\r\n      const tokenInfo = JSON.parse(response);\r\n\r\n      if (onDone) {\r\n        onDone(tokenInfo);\r\n        return (credentials[\"token\"] = tokenInfo?.result?.ServerToken);\r\n      }\r\n    },\r\n\r\n    onFailure(response) {\r\n      if (onError) onError(response);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * La fonction `_3DSwym_getAllNews` récupère toutes les actualités d'une plateforme 3DExperience en\r\n * utilisant les informations d'identification fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * requête sera terminée avec succès. Il prend deux arguments : « réponse » et « en-têtes ». L'argument\r\n * `response` contient les données de réponse du serveur et l'argument `headers` contient les en-têtes\r\n * de réponse.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_getAllNews`. Il prend deux paramètres : « réponse\r\n * » et « en-têtes ». Le paramètre `response` contient les données de réponse à l'erreur et le\r\n */\r\nexport function _3DSwym_getAllNews(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  // ! Attention beaucoup d'infos à trier et checker\r\n  // voir aussi les possibilités des params\r\n\r\n  const url = `${credentials._3DSwym}/api/exalead/whatsnew`;\r\n  const data = {\r\n    params: {\r\n      community_id: null,\r\n      hash_key: null,\r\n      legacyFormat: false,\r\n      nresults: 1,\r\n      query: \"#all\",\r\n      start: 0,\r\n    },\r\n  };\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    _httpCallAuthenticated(url, {\r\n      method: \"POST\",\r\n      headers: {\r\n        \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n        \"Content-type\": \"application/json;charset=UTF-8\",\r\n        Accept: \"application/json\",\r\n      },\r\n      data: JSON.stringify(data),\r\n      type: \"json\",\r\n      onComplete(response, headers) {\r\n        if (onDone) onDone(response, headers);\r\n      },\r\n      onFailure(response, headers) {\r\n        if (onError) onError(response, headers);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * La fonction `_3DSwym_getFamiliarPeople` récupère une liste de personnes familières en fonction du\r\n * profil de l'utilisateur actuel.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque l'appel\r\n * d'API réussit et que les données sont récupérées. Il faut deux arguments : `myContacts` et\r\n * `response`. `myContacts` est un tableau d'objets contenant le login et le nom complet des personnes\r\n * familières. `réponse\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_getFamiliarPeople`. Il prend deux paramètres : «\r\n * réponse » et « en-têtes ». Le paramètre `response` contient la réponse d'erreur du serveur\r\n */\r\nexport function _3DSwym_getFamiliarPeople(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const url = `${credentials._3DSwym}/api/Recommendation/getpeoplefamiliartocurrentuser`;\r\n  const _data = {\r\n    params: {\r\n      idsToFilterArr: [],\r\n      mode: \"offline\",\r\n      limit: 30,\r\n      itemType: \"User\",\r\n      maxNbOfCommonElements: \"5\",\r\n    },\r\n  };\r\n\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    _httpCallAuthenticated(url, {\r\n      method: \"POST\",\r\n      headers: {\r\n        \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n        \"Content-type\": \"application/json;charset=UTF-8\",\r\n        Accept: \"application/json\",\r\n      },\r\n      data: JSON.stringify(_data),\r\n      type: \"json\",\r\n      onComplete(response, headers) {\r\n        const myContacts = response.result.hits.map((contact) => {\r\n          return { login: contact.login, fullName: contact.name };\r\n        });\r\n\r\n        if (onDone) onDone(myContacts, response);\r\n      },\r\n      onFailure(response, headers) {\r\n        if (onError) onError(response, headers);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n\r\n","import { _httpCallAuthenticated } from \"../../main/3dexperience_api\";\r\nimport { _3DSwym_get_Token } from \"../3dswym_api\";\r\n\r\n/**\r\n * @description La fonction `_3dSwym_getAllCommunities` récupère une liste de communautés à partir d'une plateforme\r\n * 3D Swym en utilisant les informations d'identification fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {Number} credentials.limit - Le paramètre `limit` est un nombre entier qui indique le nombre maximum de communautés à recevoir. Par défaut, il est de 10, mais vous pouvez le changer jusqu'à 128, au delà on change de page.\r\n * @param {Number} credentials.page - Le paramètre `page` est un nombre entier qui indique la page courante. Par défaut, il est à 1.\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée une fois l'opération terminée. Il prend la\r\n * liste des communautés comme paramètre.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3dSwym_getAllCommunities`. Il vous permet de gérer et de\r\n * répondre à toute erreur qui se produit.\r\n */\r\nexport function _3DSwym_getAllCommunities(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const URL = {\r\n    base: credentials._3DSwym,\r\n    uri: \"/api/community/listmycommunities\",\r\n    limit: `/limit/${credentials.limit ? credentials.limit : 500}`,\r\n    page: `/page/${credentials.page ? credentials.page : \"1\"}`,\r\n  };\r\n\r\n  const url = `${URL.base}${URL.uri}${URL.limit}${URL.page}`;\r\n  const communautes = [];\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    _httpCallAuthenticated(url, {\r\n      method: \"GET\",\r\n      headers: {\r\n        \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n      },\r\n      onComplete(response, headers, xhr) {\r\n        const info = JSON.parse(response);\r\n        const _communitiesInfo = info.result;\r\n        let count = 0;\r\n\r\n        _communitiesInfo.forEach((commu) => {\r\n          const _communaute = {\r\n            description: commu.description,\r\n            id: commu.id,\r\n            title: commu.title,\r\n            owner: commu.owner,\r\n            role: commu.role,\r\n            access: commu.access,\r\n          };\r\n          _3DSwym_getMembersCommunity(\r\n            credentials,\r\n            commu.id,\r\n            (data) => {\r\n              count++;\r\n              _communaute[\"members\"] = data;\r\n              communautes.push(_communaute);\r\n              if (count === _communitiesInfo.length && onDone) {\r\n                onDone(communautes);\r\n              }\r\n            },\r\n            (err) => onError(err)\r\n          );\r\n        });\r\n      },\r\n      onFailure(response, headers) {\r\n        const info = response;\r\n        info[\"status\"] = headers.status;\r\n        info[\"response\"] = headers.errormsg;\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSwym_getMembersCommunity` récupère une liste des membres d'une communauté en utilisant les informations d'identification et l'ID de communauté fournis.\r\n *\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {Number} credentials.limit - Le paramètre `limit` est un nombre entier qui indique le nombre maximum de communautés à recevoir. Par défaut, il est de 50, mais vous pouvez le changer jusqu'à 128, au delà on change de page.\r\n * @param {Number} credentials.page - Le paramètre `page` est un nombre entier qui indique la page courante. Par défaut, il est à 1.\r\n * @param {String} idCommu - L'identifiant de la communauté dont vous souhaitez récupérer les membres. (ex: \"YXdA5x4DSUKtlAi2wmnyTA\")\r\n * @param {Function} onDone - Une fonction de rappel qui sera appelée lorsque l'appel d'API réussit et renvoie les\r\n * données de réponse. Les données de réponse seront transmises en argument à cette fonction.\r\n * @param {Function} onError - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_getMembersCommunity`. Il est utilisé pour gérer\r\n * toutes les erreurs qui se produisent et fournir une gestion des erreurs ou des messages d'erreur\r\n * appropriés à l'appelant de la fonction.\r\n */\r\nexport function _3DSwym_getMembersCommunity(\r\n  credentials,\r\n  idCommu,\r\n  onDone,\r\n  onError\r\n) {\r\n  const URL = `${credentials._3DSwym}/api/community/listmembers`;\r\n\r\n  const datas = {\r\n    params: {\r\n      page: credentials.page ? credentials.page : 1,\r\n      limit: credentials.limit ? credentials.limit : 50,\r\n      community_id: idCommu,\r\n    },\r\n  };\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    _httpCallAuthenticated(URL, {\r\n      method: \"POST\",\r\n      headers: {\r\n        \"Content-type\": \"application/json;charset=UTF-8\",\r\n        Accept: \"application/json\",\r\n        \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n      },\r\n      data: JSON.stringify(datas),\r\n      type: \"json\",\r\n      onComplete(response, headers, xhr) {\r\n        const info = response;\r\n        if (onDone) onDone(info);\r\n      },\r\n      onFailure(response, headers) {\r\n        const info = response;\r\n        info[\"status\"] = headers.status;\r\n        info[\"response\"] = headers.errormsg;\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSwym_getIdeaStatusMaturity` récupère le statut et la maturité d'une idée d'une\r\n * communauté 3DExperience à l'aide des informations d'identification fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials._3DSwym - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {String} credentials.commu_id - L'ID de communauté 3DExperience (ex:\"YXdA5x4DSUKtlAi2wmnyTA\")\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * requête API sera terminée avec succès. Il prend un argument, « info », qui correspond aux données de\r\n * réponse de l'API.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_getIdeaStatusMaturity`. Il vous permet de gérer\r\n * et de traiter l'erreur de manière personnalisée.\r\n */\r\nexport function _3DSwym_getIdeaStatusMaturity(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const commuID = \"YXdA5x4DSUKtlAi2wmnyTA\";\r\n  if (!credentials.commu_id) credentials.commu_id = commuID;\r\n  const URL = `${credentials._3DSwym}/api/v2/communities/${credentials.commu_id}/ideas/statuses`;\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    _httpCallAuthenticated(URL, {\r\n      method: \"GET\",\r\n      headers: {\r\n        \"Content-type\": \"application/json;charset=UTF-8\",\r\n        Accept: \"application/json\",\r\n        \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n      },\r\n\r\n      onComplete(response) {\r\n        const info = JSON.parse(response);\r\n\r\n        if (onDone) onDone(info);\r\n      },\r\n      onFailure(response, headers) {\r\n        const info = response;\r\n        info[\"status\"] = headers.status;\r\n        info[\"response\"] = headers.errormsg;\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n// TEST\r\nconst contentMSG = {\r\n  receipt: [\"c00005701637\"], // Liste des personnes à qui envoyer le message\r\n  msg: \"TESTS Beam ³ DEV, Happy new year ! ヾ(⌐■_■)ノ♪\", // Message à envoyer\r\n};\r\n\r\n// CREATION DE MESSAGES DIRECT OU INSTANTANÉ\r\n\r\n/**\r\n * @description La fonction `_3DSwym_buildDirectMessage` permet d'envoyer un message direct à un ou plusieurs utilisateurs dans un espace plateforme 3DExperience.\r\n *\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials._3DSwym - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {Object} [credentials.currentUser] - Le paramètre `currentUser` est un qui contient les informations de l'utilisateur qui envoie le message(appeler depuis la fonction `_3DSwym_get_currentuser`).\r\n * @param {string} [credentials.currentUser.login] - Le paramètre `login` est l'identifiant d'envois du message\r\n * @param {string} [credentials.currentUser.first_name] - Le paramètre `first_name` est l'identifiant d'envois du message\r\n * @param {string} [credentials.currentUser.last_name] - Le paramètre `last_name` est l'identifiant d'envois du message.\r\n *\r\n * @param {Object} [datas] - Le paramètre `datas` est un objet qui contient les données du messages.\r\n * @param {String} [datas.msg] - Le paramètre `msg` est une chaîne de caractères qui contient le message à envoyer.\r\n *\r\n * @param {Array} [datas.receipt] - La liste des utilisateurs à qui envoyer le message (login). La liste des personnes accessible est générer par la fonction _3DSwym_getFamiliarPeople. (ex: [\"bem3_yan.coquoz\",\"bem_bob_Dylan\"])\r\n *\r\n * @param {Function} [onDone] - Une fonction de rappel qui sera appelée lorsque le message direct sera envoyé avec\r\n * succès. Il prend un argument, qui est un objet contenant des informations sur la réponse du serveur.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_buildDirectMessage`. Il est facultatif et peut\r\n * être indéfini.\r\n */\r\nexport function _3DSwym_buildDirectMessage(\r\n  credentials,\r\n  datas,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const { listAllContacts, currentUser, _3DSwym } = credentials;\r\n  console.log(\"__listAllContacts\", listAllContacts.hits);\r\n  const _URL = `${_3DSwym}/api/directmessages`;\r\n\r\n  const _data = {\r\n    users: [currentUser.login].concat(datas.receipt),\r\n  };\r\n\r\n  const MSGData = {\r\n    id_msg: \"\",\r\n    senderId: credentials.currentUser.login,\r\n    senderName: `${credentials.currentUser.first_name} ${credentials.currentUser.last_name}`,\r\n    msg: formatedMessage(datas.msg),\r\n  };\r\n  let otherCommunity = false;\r\n  _3DSwym_findCommunityToInstantMSG(\r\n    _data.users,\r\n    (rep) => {\r\n      if (rep !== undefined) {\r\n        MSGData[\"id_msg\"] = rep.id;\r\n        otherCommunity = true;\r\n        _3DSwym_sendMessageData(credentials, MSGData);\r\n      }\r\n    },\r\n    (err) => {\r\n      otherCommunity = false;\r\n      console.log(\"_3dSwym_findCommunityToInstantMSG callback\", err);\r\n      if (onError) onError(err);\r\n      MSGData[\"id_msg\"] = \"\";\r\n    }\r\n  );\r\n\r\n  if (otherCommunity === false) {\r\n    setTimeout(() => {\r\n      if (otherCommunity === false) {\r\n        _3DSwym_get_Token(credentials, (token) => {\r\n          _httpCallAuthenticated(_URL, {\r\n            method: \"POST\",\r\n            headers: {\r\n              \"Content-Type\": \"application/json\",\r\n              Accept: \"application/json\",\r\n              \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n            },\r\n            data: JSON.stringify(_data),\r\n            type: \"json\",\r\n            onComplete(response, headers, xhr) {\r\n              const info = response;\r\n              info[\"reponse\"] = JSON.parse(xhr.response);\r\n              info[\"status\"] = xhr.status;\r\n              if (onDone) onDone(info);\r\n              MSGData[\"id_msg\"] = info.result.id;\r\n              _3DSwym_sendMessageData(credentials, MSGData);\r\n            },\r\n            onFailure(response, headers, xhr) {\r\n              const info = response;\r\n              info[\"msg\"] = headers.errormsg;\r\n              info[\"status\"] = headers.status;\r\n\r\n              if (onError) onError(info);\r\n            },\r\n          });\r\n        });\r\n      }\r\n    }, 500);\r\n  }\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSwym_findCommunityToInstantMSG` est utilisée pour rechercher une communauté dans une\r\n * plateforme 3DExperience pour la messagerie instantanée en fonction des informations d'identification\r\n * et des données fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {Array} datas - Le paramètre `datas` est un tableau qui contient les données à utiliser pour trouver une communauté pour envoyer un message instantané.\r\n * @param {Function} onDone - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque\r\n * l'opération sera terminée avec succès. Il faut un argument, qui est le résultat de l'opération.\r\n * @param {Function} onError - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_findCommunityToInstantMSG`. Il est facultatif et\r\n * peut être omis s’il n’est pas nécessaire.\r\n */\r\nexport function _3DSwym_findCommunityToInstantMSG(\r\n  credentials,\r\n  datas,\r\n  onDone,\r\n  onError\r\n) {\r\n  const URL = `${credentials._3DSwym}/api/directmessages/lite?with_favorites=false`;\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    _httpCallAuthenticated(URL, {\r\n      method: \"GET\",\r\n      headers: {\r\n        Accept: \"application/json,text/javascript,*/*\",\r\n        \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n      },\r\n      onComplete(response) {\r\n        const info = JSON.parse(response);\r\n        const infoSortedByLengths = [];\r\n        info.result.forEach((com) => {\r\n          com.users = com.users.sort((a, b) => {\r\n            return a.login.localeCompare(b.login);\r\n          });\r\n          if (com.users.length === datas.length) {\r\n            infoSortedByLengths.push(com);\r\n          }\r\n        });\r\n        const sortedDatas = datas.sort();\r\n\r\n        const _datas = infoSortedByLengths.find((com) => {\r\n          const logins = [];\r\n          com.users.forEach((user) => {\r\n            logins.push(user.login);\r\n          });\r\n          return JSON.stringify(logins) === JSON.stringify(sortedDatas);\r\n        });\r\n\r\n        if (onDone && _datas !== undefined) {\r\n          onDone(_datas);\r\n        } else if (onError || _datas === undefined) {\r\n          onError(_datas);\r\n        }\r\n      },\r\n      onFailure(response) {\r\n        const info = response;\r\n        info[\"msg\"] = headers.errormsg;\r\n        info[\"errCode\"] = headers.errorcode;\r\n        console.log(\"❌ sendDirectMessageLite => \", info);\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSwym_sendMessageData` envoie un message direct avec les informations\r\n * d'identification et le contenu donnés, et appelle les rappels `onDone` ou `onError` en fonction du\r\n * succès ou de l'échec de la requête.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param content - Le paramètre `content` est un objet qui contient les propriétés suivantes :\r\n * @param {String} content.id_msg - L'identifiant du message à envoyer.\r\n * @param {String} content.senderId - L'identifiant de l'utilisateur qui envoie le message.\r\n * @param {String} content.senderName - Le nom de l'utilisateur qui envoie le message.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque l'envoi\r\n * du message sera terminé avec succès. Il prend un argument, qui est un objet contenant des\r\n * informations sur la réponse du serveur.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_sendMessageData`. Il vous permet de gérer et de\r\n * traiter les informations d'erreur.\r\n */\r\nexport function _3DSwym_sendMessageData(\r\n  credentials,\r\n  content,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const URL = {\r\n    base: credentials._3DSwym,\r\n    uri: \"/api/community\",\r\n    id_msg: `${content.id_msg}`,\r\n    endUri: \"/instantmessages\",\r\n  };\r\n\r\n  const url = `${URL.base}${URL.uri}/${URL.id_msg}${URL.endUri}`;\r\n\r\n  const datas = {\r\n    author: { login: content.senderId, displayName: content.senderName },\r\n    accessState: null,\r\n    commentUri: null,\r\n    comments: null,\r\n    endorsements: null,\r\n    moderationState: null,\r\n    parentCommentUri: null,\r\n    richMessage: content.msg,\r\n  };\r\n  console.log(\"_3dSwym_sendDirectMessageData url \", url);\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    _httpCallAuthenticated(url, {\r\n      method: \"POST\",\r\n      headers: {\r\n        \"Content-Type\": \"application/json\",\r\n        Accept: \"application/json\",\r\n        \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n      },\r\n      data: JSON.stringify(datas),\r\n      type: \"json\",\r\n      onComplete(response, headers, xhr) {\r\n        const info = response;\r\n        info[\"status\"] = xhr.status;\r\n        info[\"response\"] = JSON.parse(xhr.response);\r\n        console.log(\"✅ _3dSwym_sendDirectMessageData => \", info);\r\n        if (onDone) onDone(info);\r\n      },\r\n      onFailure(response, headers) {\r\n        const info = response;\r\n        info[\"msg\"] = headers.errormsg;\r\n        info[\"errCode\"] = headers.errorcode;\r\n        console.log(\"❌ sendDirectMessage => \", info);\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `formatedMessage` renvoie un message formaté avec la date et l'heure actuelles.\r\n * @param {String} message - Le paramètre `message` est une chaîne qui représente le contenu du message que vous souhaitez envoyer.\r\n *\r\n * @returns un message formaté avec la date et l'heure actuelles. Le message est enveloppé dans une balise de paragraphe, suivie d'un saut de ligne et d'une règle horizontale.\r\n *   En dessous, il comprend une phrase indiquant quand le message a été envoyé, y compris la date et l'heure.\r\n *\r\n */\r\nfunction formatedMessage(message) {\r\n  const _dates = new Date().toLocaleDateString();\r\n  const time = new Date().toLocaleTimeString();\r\n  return `<p>${message} </p>\r\n  <br/>\r\n  <hr/>\r\n  <p><u>envoyer :</u>Le <b>${_dates} à ${time}</b></p>`;\r\n}\r\n\r\nexport default {\r\n  _3DSwym_getAllCommunities,\r\n  _3DSwym_getMembersCommunity,\r\n  _3DSwym_getIdeaStatusMaturity,\r\n  _3DSwym_buildDirectMessage,\r\n  _3DSwym_findCommunityToInstantMSG,\r\n  _3DSwym_sendMessageData,\r\n};\r\n","import { chunkArray } from \"../../../utils/chunks\";\r\nimport { _httpCallAuthenticated } from \"../../main/3dexperience_api\";\r\nimport { _3DSwym_get_Token } from \"../3dswym_api\";\r\n\r\n/*\r\n * @exemple dataTest\r\n */\r\nconst dataTest = {\r\n  title: \"TEST DEV COMMUNITY IDEA\", // titre du post\r\n  community_id: \"YXdA5x4DSUKtlAi2wmnyTA\", // STATUT PROJETS - Phase commerciale,  tenant PIVETEAU TEST\r\n  community_title: \"TEST DEV COMMUNITY\", // Possibilité de recherche par titre de la communauté (option)\r\n  idee_id: \"THhRI8rlQNWKRxpv3Xqqug\", // id de l'idee qui est créer au post (_3dSwym_postIdea)\r\n};\r\n\r\n/**\r\n * @description La fonction `_3DSwym_postIdeaTemplate` est utilisée pour publier une idée sur une communauté 3DSwym en utilisant les informations d'identification et les données fournies.\r\n *\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n\r\n * @param {Array} credentials.swymCommunities tableau des communautés issue de la fonction `_3DSwym_getAllCommunities`\r\n * @param {Object} data - Le paramètre `data` est un objet qui contient les propriétés suivantes: `title`, `community_id` et `community_title` Ce dernier est optionnel.\r\n * @param {String} data.title - Le titre de l'idée.\r\n * @param {String} data.community_id - L'ID de la communauté sur laquelle l'idée doit être publiee.(ex: \"YXdA5x4DSUKtlAi2wmnyTA\")\r\n * @param {String} data.community_title - Le titre de la communauté sur laquelle l'idée doit être publiee.(optionnel, ex: TEST DEV COMMUNITY)\r\n * @param {String} [data.text_html] - Le message HTML de l'idée (Optionnel sur les tenants Piveteau Prod et test)\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la fonction `_3DSwym_postIdeaTemplate` terminera avec succès son exécution. Il prend un argument, « info », qui contient les données de réponse de l'appel API.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une erreur lors de l'exécution de la fonction `_3DSwym_postIdeaTemplate`. Il s'agit d'un paramètre facultatif, donc s'il n'est pas fourni, il sera par défaut « non défini ».\r\n *\r\n */\r\nexport function _3DSwym_postIdeaTemplate(\r\n  credentials,\r\n  data,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const URL = `${credentials.space}/api/idea/add`;\r\n\r\n  const findByID = credentials.swymCommunities.find(\r\n    (commu) => commu.id === data.community_id\r\n  );\r\n  const findByTitle = credentials.swymCommunities.find(\r\n    (commu) => commu.title.toLowerCase() === data.community_title.toLowerCase()\r\n  );\r\n\r\n  const formatedData = {\r\n    params: {\r\n      title: data.title, // String, le nom de l'affaire\r\n      community_id: findByID?.id !== undefined ? findByID.id : findByTitle.id, // String, l'id de la communauté\r\n      message: templateAffaireMessage(data.text_html), // STRING =>  le contenue du message doit être au format HTML\r\n      published: 1, // 1 publier, 0 non publier\r\n    },\r\n  };\r\n\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    const headers = {\r\n      \"Content-type\": \"application/json;charset=UTF-8\",\r\n      Accept: \"application/json\",\r\n      \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n    };\r\n\r\n    _httpCallAuthenticated(URL, {\r\n      method: \"POST\",\r\n      headers: headers,\r\n      data: JSON.stringify(formatedData),\r\n      type: \"json\",\r\n      onComplete(response, headers, xhr) {\r\n        const info = JSON.parse(response);\r\n        info[\"status\"] = xhr.status;\r\n        info[\"response\"] = xhr.response;\r\n        if (onDone) onDone(info);\r\n      },\r\n      onFailure(response, headers, xhr) {\r\n        const info = response;\r\n        info[\"status\"] = headers.status;\r\n        info[\"response\"] = headers.errormsg;\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_3dswym_postIdea` est utilisée pour publier une idée dans une communauté 3DExperience.\r\n *\r\n * @param {Object} credentials - Le paramètre `credentials` est un objet\r\n * @param {String} credentials.community_id - Le paramètre `credentials.community_id` est un String qui contient l'id de la communauté dans laquelle on souhaite publier l'idée.\r\n * @param {String} credentials.message - Le paramètre `credentials.message` est un String en format HTML.\r\n * @param {String} credentials.title - Le paramètre `credentials.title` est un String qui l'entête de l'idée.\r\n * @param {String} credentials.space - Le paramètre `credentials.space` est la racine du 3DSwym (tenant compris).\r\n * @param {Array} credentials.swymCommunities - Le paramètre `credentials.swymCommunities` est la racine du 3DSwym (tenant compris).\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque l'idée\r\n * sera publiée avec succès. Il prend un argument, «info», qui contient les données de réponse du\r\n * serveur.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3dswym_postIdea`. Il vous permet de gérer toutes les\r\n * erreurs qui surviennent et d'effectuer toutes les actions nécessaires.\r\n */\r\nexport function _3DSwym_postIdea(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const URL = { base: credentials.space, uri: \"/api/idea/add\" };\r\n\r\n  if (!Array.isArray(credentials.swymCommunities)) {\r\n    const message =\r\n      \"☠️ swymCommunities doit être un tableau d'objets de communautés\";\r\n    throw new Error(`Erreur sur cette requête : ${URL.base + URL.uri}`, {\r\n      cause: message,\r\n    });\r\n  }\r\n\r\n  const findByID = credentials.swymCommunities.findIndex(\r\n    (commu) => commu.id === credentials.community_id\r\n  );\r\n\r\n  if (findByID === -1) {\r\n    const message =\r\n      \"la communauté n'existe pas dans la liste des communautés du Swym\";\r\n    throw new Error(`Erreur sur cette requête : ${URL.base + URL.uri}`, {\r\n      cause: message,\r\n    });\r\n  }\r\n  if (credentials.community_id && credentials.community_id === \"\") {\r\n    const message =\r\n      \"☠️ community_id doit être un String qui contient l'id de la communauté dans laquelle on souhaite publier l'idée.\";\r\n    throw new Error(`Erreur sur cette requête : ${URL.base + URL.uri}`, {\r\n      cause: message,\r\n    });\r\n  }\r\n  if (credentials.title && credentials.title === \"\") {\r\n    const message = \"☠️ title doit être un String.\";\r\n    throw new Error(`Erreur sur cette requête : ${URL.base + URL.uri}`, {\r\n      cause: message,\r\n    });\r\n  }\r\n\r\n  const body = {\r\n    params: {\r\n      title: credentials.title, // String, le nom de l'affaire\r\n      community_id: credentials.community_id, // String, l'id de la communauté\r\n      message: credentials.message, // templateAffaireMessage(), // STRING =>  le contenu du message doit être au format HTML\r\n      published: 1, // 1 publier, 0 brouillon\r\n    },\r\n  };\r\n\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    if (!token) {\r\n      throw new Error(\r\n        `☠️ token n'est pas disponible pour cette requête : ${\r\n          URL.base + URL.uri\r\n        }`,\r\n        {\r\n          cause: token,\r\n        }\r\n      );\r\n    }\r\n\r\n    const headerOptions = {\r\n      headers: {\r\n        \"Content-type\": \"application/json;charset=UTF-8\",\r\n        Accept: \"application/json\",\r\n        \"X-DS-SWYM-CSRFTOKEN\": token?.result?.ServerToken,\r\n      },\r\n      method: \"POST\",\r\n      data: JSON.stringify(body),\r\n      onComplete(response, headers, xhr) {\r\n        const info = { response };\r\n        if (typeof info.response === \"string\") {\r\n          info[\"response\"] = JSON.parse(info.response);\r\n        }\r\n        info[\"status\"] = xhr.status;\r\n\r\n        if (onDone) onDone(info);\r\n      },\r\n      onFailure(response, headers, xhr) {\r\n        const head = JSON.parse(headers);\r\n        const rep = JSON.parse(response);\r\n        const ERR = new Error(\r\n          `Erreur sur cette requête : ${URL.base + URL.uri}`,\r\n          {\r\n            cause: { head, rep },\r\n          }\r\n        );\r\n        if (onError) onError(ERR);\r\n      },\r\n    };\r\n\r\n    _httpCallAuthenticated(URL.base + URL.uri, headerOptions);\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSwym_deleteIdea` est utilisée pour supprimer une idée dans une communauté 3DExperience en utilisant les informations d'identification et les données fournies.\r\n *\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n \r\n * @param data - Le paramètre `data` est un objet qui contient les propriétés suivantes:\r\n * `community_id` et 'idee_id'\r\n * @param {String} data.community_id - L'ID de la communauté sur laquelle l'idée doit être supprimée.(ex: \"YXdA5x4DSUKtlAi2wmnyTA\")\r\n * @param {String} data.idee_id - L'ID de l'idée que vous souhaitez supprimer (ex: \"THhRI8rlQNWKRxpv3Xqqug\")\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la\r\n * suppression de l'idée sera terminée avec succès. Il prend un argument, «info», qui contient des\r\n * informations sur la réponse du serveur.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_deleteIdea`. Il vous permet de gérer et de\r\n * traiter les informations d'erreur.\r\n */\r\nexport function _3DSwym_deleteIdea(\r\n  credentials,\r\n  data,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const URL = `${credentials.space}/api/idea/delete`;\r\n  const formatedData = {\r\n    params: {\r\n      community_id: data.community_id,\r\n      ideationIds: [data.idee_id],\r\n    },\r\n  };\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    _httpCallAuthenticated(URL, {\r\n      method: \"POST\",\r\n      headers: {\r\n        \"Content-type\": \"application/json;charset=UTF-8\",\r\n        Accept: \"application/json\",\r\n        \"X-DS-SWYM-CSRFTOKEN\": token?.result?.ServerToken,\r\n      },\r\n      data: JSON.stringify(formatedData),\r\n      type: \"json\",\r\n      onComplete(response, headers, xhr) {\r\n        const info = response;\r\n        if (onDone) onDone(info);\r\n      },\r\n      onFailure(response, headers, xhr) {\r\n        const info = response;\r\n        info[\"status\"] = headers.status;\r\n        info[\"response\"] = headers.errormsg;\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\n/**\r\n * @description Cette fonction JavaScript récupère une idée SWYM à l'aide des informations d'identification et de l'ID de publication fournis.\r\n *\r\n * @param {Object} [credentials] - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n * @param {String} [credentials.space] - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n \r\n * @param {String} [credentials.idPost] - L'identifiant de la publication ou de l'idée que vous souhaitez récupérer. Si aucun identifiant n'est fourni, il s'agira par défaut de l'identifiant de l'idée de modèle. (actuellement => Piveteau prod :\"tFtz0G4MR6qNtKgJjNfTog\", Piveteau test :\"Qpv3HN-tTDOsU-7_c5DnDg\").\r\n *\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la requête API sera terminée avec succès. Il prend un argument, « info », qui contient les données de réponse de l'appel API. (info.msg : template récupérer lors de la création d'une Affaire et utiliser dans la fonction `_3DSwym_postIdeaTemplate()`).\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_getOneIdea`. Il vous permet de gérer et de\r\n * traiter l'erreur de manière personnalisée.\r\n */\r\nexport function _3DSwym_getOneIdea(\r\n  credentials,\r\n\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const { _3DSwym, _3DSwym_token } = credentials;\r\n  const URL = `${_3DSwym}/api/idea/get`;\r\n  if (credentials.idPost === \"\") {\r\n    const message =\r\n      \"☠️ idPost est vide, vous devez renseigner un identifiant de post\";\r\n    throw new Error(`Erreur sur cette requête : ${URL}`, { cause: message });\r\n  }\r\n\r\n  const datas = {\r\n    params: {\r\n      id: credentials.idPost,\r\n    },\r\n  };\r\n  _httpCallAuthenticated(URL, {\r\n    method: \"POST\",\r\n    headers: {\r\n      \"Content-type\": \"application/json;charset=UTF-8\",\r\n      Accept: \"application/json\",\r\n      \"X-DS-SWYM-CSRFTOKEN\": _3DSwym_token,\r\n    },\r\n    data: JSON.stringify(datas),\r\n\r\n    onComplete(response) {\r\n      response = typeof response === \"string\" ? JSON.parse(response) : response;\r\n      if (onDone) onDone({response});\r\n    },\r\n    onFailure(response) {\r\n      const info = response;\r\n      info[\"status\"] = headers.status;\r\n      info[\"response\"] = headers.errormsg;\r\n      if (onError) onError(info);\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * @description `_3DSwym_editIdea` edit une idée dans 3DSwym.\r\n *\r\n * @param   {Object}  credentials  Objet contenant les informations du besoin de la requête.\r\n * @param   {String}  credentials.space  - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param   {String}  credentials.post_id  Id du post à rééditer\r\n * @param   {String}  credentials.title  titre de l'idée\r\n * @param   {String}  credentials.message Message de l'idée en format HTML (texte balisé)\r\n * @param   {String}  credentials.status_id Id du status(visible dans les devtools au niveau de l'id du balisage, dans les paramètres de l'id du post)\r\n * @param   {String}  credentials.status_comment nomination du statut.\r\n * @param   {Function}  [onDone]       [onDone description]\r\n * @param   {Function}  [onError]      [onError description]\r\n *\r\n * @return  {Void}\r\n */\r\nexport function _3DSwym_editIdea(credentials, onDone, onError) {\r\n  const {\r\n    _3DSwym,\r\n    _3DSwym_token,\r\n    idPost,\r\n    title,\r\n    community_id,\r\n    status_comment,\r\n    status_id,\r\n    message,\r\n  } = credentials;\r\n  const URL = {\r\n    base: `${_3DSwym}`,\r\n    uri: \"/api/idea/edit\",\r\n  };\r\n\r\n  const body = {\r\n    params: {\r\n      out: \"false\",\r\n      id: idPost,\r\n      title: title,\r\n      community_id: community_id,\r\n      status_comment: status_comment,\r\n      status_id: status_id,\r\n      message: message,\r\n      published: \"1\",\r\n    },\r\n  };\r\n  const headerOptions = {\r\n    method: \"POST\",\r\n    headers: {\r\n      \"Content-type\": \"application/json;charset=UTF-8\",\r\n      Accept: \"application/json\",\r\n      \"X-DS-SWYM-CSRFTOKEN\": _3DSwym_token,\r\n    },\r\n    data: JSON.stringify(body),\r\n    type: \"json\",\r\n    onComplete(response, head, xhr) {\r\n      const info = {\r\n        response:\r\n          typeof response === \"string\" ? JSON.parse(response) : response,\r\n      };\r\n      info[\"status\"] = xhr.status;\r\n      if (onDone) onDone(info);\r\n    },\r\n    onFailure(response) {\r\n      if (onError) onError(response);\r\n    },\r\n  };\r\n  _httpCallAuthenticated(URL.base + URL.uri, headerOptions);\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSwym_getAllListIdeas` récupère toutes les idées SWYM en utilisant les informations d'identification fournies et les paramètres facultatifs.\r\n *\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier\r\n * la demande. Il possède les propriétés suivantes :\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)\r\n * @example pour le 3DSpace {space:\"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia\"}\r\n * @param {String} credentials.tenant - le tenant courant.\r\n * @example {tenant:\"R1132100968447\"}.\r\n *\r\n * @param {Object} data - Le paramètre `data` est un objet qui contient des données supplémentaires pour la requête API. Il possède les propriétés suivantes :\r\n * @param {String} data.community_id - L'ID de la communauté sur laquelle l'idée doit être recherchée.(ex: \"YXdA5x4DSUKtlAi2wmnyTA\")\r\n * @param {Number} [data.limit] - (optionnelle) Le nombre d'idées à renvoyer (optionnel, par défaut 100 (100 premières idées))\r\n * @param {Number} [data.page] - (optionnelle) Le numéro de page à renvoyer (optionnel, par défaut 1 (1 page))\r\n * @param {String} [data.search] - (optionnelle) l'élément recherché dans le titre de l'idée.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque la requête API sera terminée avec succès.\r\n *\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'exécution de la fonction `_3DSwym_getAllListIdeas`. Il est facultatif et peut être\r\n * indéfini.\r\n */\r\nexport function _3DSwym_getAllListIdeas(\r\n  credentials,\r\n  data,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const { _3DSwym } = credentials;\r\n  let { community_id, limit, page, search } = data;\r\n  // Pagination\r\n  const allIdeas = [];\r\n  const startPage = 1; //\r\n\r\n  let isEndOfPages = false,\r\n    maxPages = 2; // en attendant la premiere requête qui fournis la longueur total du tableau.\r\n\r\n  if (!page) page = startPage;\r\n  if (!limit) limit = 100;\r\n\r\n  const URL = {\r\n    uri: \"/api/idea/list\",\r\n    comId: `/community_id/${community_id}`,\r\n    limit: `/limit/${limit}`,\r\n    page: `/page/${page}`,\r\n  };\r\n\r\n  let url = `${_3DSwym}${URL.uri}${URL.comId}${URL.limit}${URL.page}`;\r\n\r\n  _3DSwym_get_Token(credentials, (token) => {\r\n    const getAllIdeas = (url) => {\r\n      _httpCallAuthenticated(url, {\r\n        method: \"GET\",\r\n        headers: {\r\n          \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n        },\r\n\r\n        onComplete(response) {\r\n          const info = { response: JSON.parse(response) };\r\n\r\n          maxPages = Math.ceil(Number(info.response.nb_result) / 100);\r\n\r\n          if (response && maxPages >= page) {\r\n            page++;\r\n\r\n            URL.page = `/page/${page}`;\r\n            url = `${_3DSwym}${URL.uri}${URL.comId}${URL.limit}${URL.page}`;\r\n\r\n            // En cas de recherche spécifique.\r\n            if (!search) {\r\n              allIdeas.push(info.response.result);\r\n            } else {\r\n              const idea = info.response.result.find((idee) =>\r\n                idee.title.includes(search)\r\n              );\r\n              if (idea) {\r\n                onDone(idea);\r\n                return;\r\n              }\r\n            }\r\n            if (onDone && maxPages < page && !search) {\r\n              isEndOfPages = true;\r\n              onDone(allIdeas);\r\n              return;\r\n            }\r\n            getAllIdeas(url);\r\n          }\r\n        },\r\n        onFailure(response, headers) {\r\n          const info = response;\r\n          info[\"status\"] = headers.status;\r\n          info[\"response\"] = headers.errormsg;\r\n          if (onError) onError(info);\r\n        },\r\n      });\r\n    };\r\n    if (isEndOfPages) return;\r\n    getAllIdeas(url);\r\n  });\r\n}\r\n\r\nfunction templateAffaireMessage(txt) {\r\n  // TEMPLATE AFFAIRES\r\n  if (!txt || txt === \"\") {\r\n    const message = `<h2><u>INFORMATIONS AFFAIRE :</u></h2>\r\n  <p><u>|⚠️<em> Merci de respecter l&#39;écriture des tags, en MAJUSCULES, nom complet, pas de caractères</em></u></p>\r\n  <p><u><em>|spéciaux, séparation par &#34;_&#34; si besoin !</em></u></p>\r\n  <p><strong>Référence client </strong>:  <em>\r\n  <a data-predicate=\"ds6w:who\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">CLIENT</a> \r\n  </em></p>\r\n  <p><strong>Référence projet </strong>: <em>\r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">NOM AFFAIRE</a> \r\n  <a data-predicate=\"ds6w:where\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">VILLE</a> \r\n  <a data-predicate=\"ds6w:where\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">DPT</a> \r\n  </em></p>\r\n  <p>&#x1f4dd; <strong>Base documentaire</strong> : LIEN projet</p>\r\n  <p>&#x1f4dd; <strong>Fiche COCLICO</strong> : LIEN projet<em><strong></strong>\r\n  </em></p>\r\n  <p><br /></p>\r\n  <table border=\"1\">\r\n  <tbody>\r\n  <tr><td><strong>Description projet </strong>:\r\n  <br /><br /></td></tr>\r\n  </tbody>\r\n  </table>\r\n  <p><br /></p>\r\n  <p><br /></p>\r\n  <p><strong>Produit :<em> </em></strong><em>\r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Hexapli Usiné</a>\r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Hexapli MP</a>\r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Lamwood</a>\r\n  </em></p>\r\n  <p><strong>Type de Bâtiment :</strong><em>\r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Logements</a> \r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">BUP</a> \r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">ERP</a> \r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Plateforme Logistique</a> \r\n  </em></p>\r\n  <p><strong>Essence :</strong> <em>\r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">DOUGLAS</a> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">PIN</a> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">MIXTE</a> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">EPICEA</a> \r\n  </em></p>\r\n  <p><strong>Qualité : </strong><em>\r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">NVI</a> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">VI1F</a> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">VI2F</a> \r\n  </em><strong></strong></p>\r\n  <p><strong>Traitement : </strong><em>\r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">PARKA</a> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">CT2</a> \r\n  </em></p>\r\n  <p><strong>Type de Paroi : </strong><em>\r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Murs Intérieurs</a> \r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Murs Extérieurs</a> \r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Planchers</a> \r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Couverture</a> \r\n  </em></p>\r\n  <p><em>\r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Etanchéité Accessible</a> \r\n  <a data-predicate=\"ds6w:what\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Etanchéité Non-Accessible</a> \r\n  </em></p>\r\n  <p><strong>Hauteur Dernier Plancher :</strong><em><strong> </strong> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">Hauteur &lt;8m</a> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">8m&lt; Hauteur &lt;28m</a> \r\n  <a data-predicate=\"ds6w:how\" data-type=\"internal\" class=\"s6m-tag-link s6m-link\">28m&lt; Hauteur &lt;50m</a> \r\n  </em></p>\r\n  <h2><br /></h2>\r\n  <h2><u>EQUIPE PIVETEAU :</u></h2>\r\n  <table border=\"1\">\r\n  <tbody>\r\n  <tr><td><strong>Chargé d&#39;Affaires</strong></td><td><br /></td></tr>\r\n  <tr><td><strong>Service études de prix</strong></td><td><br /></td></tr>\r\n  </tbody></table>\r\n  <p>\r\n  </p>`;\r\n    return message;\r\n  } else {\r\n    return txt;\r\n  }\r\n}\r\n\r\nexport function _3DSwym_ForwardIdea(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const { tenant, _3DSwym, _3DSwym_token, community_id, idea_id } = credentials;\r\n  if (tenant && _3DSwym && _3DSwym_token && community_id && idea_id) {\r\n    const url = `${_3DSwym}/api/idea/forward`;\r\n    _httpCallAuthenticated(url, {\r\n      method: \"POST\",\r\n      headers: {\r\n        \"Content-type\": \"application/json;charset=UTF-8\",\r\n        Accept: \"application/json\",\r\n        \"X-DS-SWYM-CSRFTOKEN\": _3DSwym_token,\r\n      },\r\n      data: JSON.stringify({\r\n        community_uri: `swym:prd:${tenant.toUpperCase()}:community:${community_id}`,\r\n        content_uri: `swym:prd:${tenant.toUpperCase()}:idea:${idea_id}`,\r\n        timeout: 30000,\r\n      }),\r\n      type: \"json\",\r\n      onComplete(response) {\r\n        if (onDone) onDone(response);\r\n      },\r\n      onFailure(response, headers) {\r\n        const info = response;\r\n        info[\"status\"] = headers.status;\r\n        info[\"response\"] = headers.errormsg;\r\n        if (onError) onError(info);\r\n      },\r\n    });\r\n  } else {\r\n    if (onError)\r\n      onError({\r\n        status: \"error\",\r\n        msg: \"Credentials incomplet !\",\r\n        attend: \"tenant, _3DSwym , _3DSwym_token, community_id, idea_id\",\r\n        credentials,\r\n      });\r\n  }\r\n}\r\n","import { _httpCallAuthenticated } from \"../../main/3dexperience_api\";\r\nimport { _3DSwym_get_Token } from \"../3dswym_api.js\";\r\n/**\r\n * @description La fonction `_3DSwym_get_currentUser` est utilisée pour récupérer des informations sur l'utilisateur actuel dans une plateforme 3DExperience.\r\n *\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n *\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...), Attention ici le space prend bien le 3DSwym\r\n *\r\n * @param {Function} onDone - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque l'appel\r\n * API réussit et que les informations utilisateur sont récupérées. Il prend un argument, qui est\r\n * l'objet d'informations utilisateur.\r\n * @param {Function} onError - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'appel de l'API. Il prend un paramètre, qui est la réponse d'erreur de l'API.\r\n */\r\nexport function _3DSwym_get_currentUser(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  return new Promise((resolve, reject) => {\r\n    // Simulate an asynchronous operation\r\n    try {\r\n      let CURRENT_USER = undefined;\r\n      // if (_3DSwym) {\r\n      //   const url = credentials._3DSwym + \"/api/user/getcurrent/\";\r\n      //   _3DSwym_get_Token(credentials, (token) => {\r\n      //     _httpCallAuthenticated(url, {\r\n      //       method: \"GET\",\r\n      //       headers: {\r\n      //         \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken,\r\n      //       },\r\n      //       onComplete(response, headers, xhr) {\r\n      //         const info = JSON.parse(response);\r\n      //         CURRENT_USER = info.result;\r\n      //       }\r\n      //     });\r\n      //   });\r\n      // } \r\n      if(credentials._3DDashboard) {\r\n        const url = credentials._3DDashboard + \"/api/users/current\";\r\n        console.log(\"_3DSwym_get_currentUser | url\", url);\r\n          _httpCallAuthenticated(url, {\r\n            method: \"GET\",\r\n            onComplete(response, headers, xhr) {\r\n              let result = response.replace(/\\\"\\[/g, \"[\").replace(/\\]\\\"/g, \"]\").replace(/\\\"{/g, \"{\").replace(/}\\\"/g, \"}\").replace(/\\\\/g, \"\");\r\n              result = result.replace(/\\\"\\[/g, \"[\").replace(/\\]\\\"/g, \"]\").replace(/\\\"{/g, \"{\").replace(/}\\\"/g, \"}\").replace(/\\\\/g, \"\");\r\n              console.log(\"result\", result);\r\n              let info = {};\r\n              try {\r\n                info = JSON.parse(result);\r\n              } catch (error) {\r\n                reject(\"ERROR | _3DSwym_get_currentUser => JSON.Parse()\", error);\r\n              }\r\n              console.log(info);\r\n              info[\"first_name\"] = info?.firstName ? info.firstName : \"\";\r\n              info[\"last_name\"] = info?.lastName ? info.lastName : \"\";\r\n              console.log(\"_3DSwym_get_currentUser | info\", info);\r\n              CURRENT_USER = info;\r\n              resolve(info);\r\n            },\r\n            onFailure(error) {\r\n              reject(\"ERROR | _3DSwym_get_currentUser => _3DDashboard + /api/users/current\", error);\r\n            },\r\n        });\r\n      }\r\n      if (CURRENT_USER) {\r\n        resolve(CURRENT_USER);\r\n      } else {\r\n        reject(\"ERROR | _3DSwym_get_currentUser => CURRENT_USER is null\");\r\n      }\r\n    } catch (error) {\r\n      reject(\"ERROR | _3DSwym_get_currentUser => \", error);\r\n    }\r\n  });\r\n}\r\n\r\n/**\r\n * @description La fonction `_3DSwym_get_findUser` est utilisée pour rechercher un utilisateur par son identifiant\r\n * dans un espace 3DSwym en utilisant les informations d'identification fournies.\r\n * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier la demande. Il inclut généralement des propriétés telles que « token », « space », « tenant » et « ctx ».\r\n *\r\n * @param {String} credentials.space - (3DSwym) L'URL du serveur sur lequel l'API est déployée.(ex: 3DSpace =>(https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia), 3DSwym, 3DCompass...)\r\n * @param {String} userLogin - Le paramètre userLogin est le nom de login de l'utilisateur que vous souhaitez\r\n * retrouver dans la plateforme 3DSwym.\r\n * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque l'appel\r\n * API sera terminé avec succès. Il prend un argument, « info », qui correspond aux données de réponse\r\n * renvoyées par l'API.\r\n * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une\r\n * erreur lors de l'appel de l'API. Il prend un paramètre, qui est la réponse d'erreur de l'API.\r\n */\r\nexport function _3DSwym_get_findUser(\r\n  credentials,\r\n  userLogin,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const url = credentials.space + \"/api/user/find/login/\" + userLogin;\r\n  _3DSwym_get_Token(\r\n    credentials,\r\n    (token) => {\r\n      _httpCallAuthenticated(url, {\r\n        method: \"GET\",\r\n        headers: { \"X-DS-SWYM-CSRFTOKEN\": token.result.ServerToken },\r\n        onComplete(response, headers, xhr) {\r\n          const info = JSON.parse(response);\r\n\r\n          if (onDone) onDone(info);\r\n        },\r\n\r\n        onFailure(response) {\r\n          if (onError) onError(response);\r\n        },\r\n      });\r\n    },\r\n    onError\r\n  );\r\n}\r\n\r\nexport default {\r\n  _3DSwym_get_currentUser,\r\n  _3DSwym_get_findUser,\r\n};\r\n","import { _httpCallAuthenticated } from \"../../main/3dexperience_api\";\r\n\r\nexport function _3DSwym_addComment(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  const {\r\n    _3DSwym,\r\n    _3DSwym_token,\r\n    subjectUri,\r\n    richMessage\r\n  } = credentials;\r\n  const url = `${_3DSwym}/commentproxy/subjects/${subjectUri}/comments`;\r\n  const body = { richMessage };\r\n  const headerOptions = {\r\n    method: \"POST\",\r\n    headers: {\r\n      \"Content-type\": \"application/json;charset=UTF-8\",\r\n      Accept: \"application/json\",\r\n      \"X-DS-SWYM-CSRFTOKEN\": _3DSwym_token,\r\n    },\r\n    data: JSON.stringify(body),\r\n    type: \"json\",\r\n    onComplete(response, head, xhr) {\r\n      const info = {\r\n        response:\r\n          typeof response === \"string\" ? JSON.parse(response) : response,\r\n      };\r\n      info[\"status\"] = xhr.status;\r\n      if (onDone) onDone(info);\r\n    },\r\n    onFailure(response) {\r\n      if (onError) onError(response);\r\n    },\r\n  };\r\n  _httpCallAuthenticated(url, headerOptions);\r\n}\r\n","import {\r\n  _httpCallAuthenticated,\r\n  _getServiceUrl_3DPassport,\r\n  _getServiceUrl,\r\n} from \"./3dexperience_api\";\r\n\r\nexport function _getServiceUrl_Iterop(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    _getServiceUrl(credentials, (serviceUrls) => {\r\n      // console.log(\"serviceUrls\", serviceUrls);\r\n      const urlAPIV2Iterop =\r\n        serviceUrls.services.find((service) => service.id === \"businessprocess\")\r\n          ?.url + \"/api/v2\";\r\n      if (onDone) onDone(urlAPIV2Iterop);\r\n      return urlAPIV2Iterop;\r\n    });\r\n  }\r\n}\r\n\r\nexport function _Iterop_Auth_CAS(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  console.log(\"_Iterop_Auth_CAS\");\r\n  if (credentials.tenant) {\r\n    _getServiceUrl(credentials, (serviceUrls) => {\r\n      console.log(\"serviceUrls\", serviceUrls);\r\n      const urlService3DPassport = serviceUrls.services.find(\r\n        (service) => service.id === \"3dpassport\"\r\n      )?.url;\r\n      const urlAPIV2Iterop =\r\n        serviceUrls.services.find((service) => service.id === \"businessprocess\")\r\n          ?.url + \"/api/v2\";\r\n      const urlService = `${urlService3DPassport}/login/?cors=false&service=${urlAPIV2Iterop}/auth/cas`;\r\n\r\n      _httpCallAuthenticated(urlService, {\r\n        async onComplete(response) {\r\n          console.log(\"response\", response);\r\n          const x3ds_service_redirect_url =\r\n            typeof response === \"string\"\r\n              ? JSON.parse(response)?.x3ds_service_redirect_url\r\n              : response?.x3ds_service_redirect_url;\r\n          await fetch(x3ds_service_redirect_url, {\r\n            method: \"POST\",\r\n          })\r\n            .then((response) => response.json())\r\n            .then(async (data) => {\r\n              if (onDone) onDone(data?.token);\r\n            });\r\n        },\r\n        onFailure(response) {\r\n          if (onError) onError(response);\r\n        },\r\n      });\r\n    });\r\n  } else {\r\n    if (onError) onError(\"No tenant\");\r\n  }\r\n}\r\n/**\r\n * @description _Iterop_jwtUser appel sur l'api et demande un Token lié à l'utilisateur et au tenant.\r\n *\r\n * @return  {Function}  callback retournant la réponse de l'api\r\n */\r\nexport function _Iterop_jwtUser(\r\n  credentials,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const lowerTenant = credentials.tenant.toLowerCase();\r\n\r\n    fetch(`https://api.uixhome.fr/${lowerTenant}/iterop/jwtuser`, {\r\n      method: \"POST\",\r\n    })\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n\r\n/**\r\n * Retrieves all business tables.\r\n *\r\n * @param {Object} credentials - credentials.\r\n * @param {String} credentials.tenant - Tenant credentials.\r\n * @param {String} token - token iterop.\r\n * @param {Function} [onDone] - Callback function for successful response.\r\n * @param {Function} [onError] - Callback function for error response.\r\n * @return {Promise} Resolves with the result of the API call.\r\n */\r\nexport async function _Iterop_getAllBusinessTables(\r\n  credentials,\r\n  token,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/repository/data/tables?t=${token}`,\r\n      {\r\n        method: \"GET\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n\r\n/**\r\n * Retrieves data for a specific Business Table.\r\n *\r\n * @param {Object} credentials - Credentials for authentication.\r\n * @param {String} token - CSRF token for authentication.\r\n * @param {String} tableId - ID of the Business Table to retrieve data from.\r\n * @param {Function} [onDone] - Callback function to execute upon successful data retrieval.\r\n * @param {Function} [onError] - Callback function to execute if an error occurs during retrieval.\r\n */\r\nexport function _Iterop_getOneBusinessTable(\r\n  credentials,\r\n  token,\r\n  tableId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/businesstable/one/${tableId}?t=${token}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n/**\r\n * Retrieves rows from a specific Business Table based on the table ID.\r\n *\r\n * @param {Object} credentials - Credentials for authentication.\r\n * @param {String} token - CSRF token for authentication.\r\n * @param {String} tableId - ID of the Business Table to retrieve rows from.\r\n * @param {Function} [onDone] - Callback function to execute upon successful retrieval.\r\n * @param {Function} [onError] - Callback function to execute if an error occurs during retrieval.\r\n */\r\nexport async function _Iterop_getOneBusinessTableRows(\r\n  credentials,\r\n  token,\r\n  tableId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/businesstable/rows/${tableId}/?t=${token}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n\r\n/**\r\n * @description `_Iterop_AddOrRemoveRows` Met a jour les lignes d'une table Business.\r\n *\r\n * @param {Object} credentials - credentials.\r\n * @param {String} credentials.tenant - credentials.tenant @exemple \"r1132480937497\"\r\n * @param {String} token - token iterop.\r\n * @param {String} tableId - ID of the Business Table.\r\n * @param {String} body - JSON string of the rows to add or remove, e.g. {\"rowsToAdd\": [{\"uuid\": \"...\"}, ...], \"rowsToRemove\": [\"...\", ...]}.\r\n * @param {Function} [onDone] - Callback function for successful response.\r\n * @param {Function} [onError] - Callback function for error response.\r\n * @return {Promise} Resolves with the result of the API call.\r\n */\r\nexport async function _Iterop_AddOrRemoveRows(\r\n  credentials,\r\n  token,\r\n  tableId,\r\n  body,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/businesstable/patch/rows/${tableId}/?t=${token}&b=${body}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => {\r\n        //console.log(\"_Iterop_AddOrRemoveRows\", response);\r\n        return response.json();\r\n      })\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error, tableId, body);\r\n      });\r\n  }\r\n}\r\n\r\n/**\r\n * @description _Iterop_businessTableSearchInRows rows in a Business Table.\r\n *\r\n * @param {Object} credentials - credentials.\r\n * @param {String} credentials.tenant - credentials.tenant @exemple \"r1132480937497\"\r\n * @param {String} token - token iterop.\r\n * @param {String} tableId - ID of the Business Table.\r\n * @param {String} columnsName - List of columns to search on, separated by '+'.\r\n * @param {String} body - JSON string of the filters to apply.\r\n * @param {Function} [onDone] - Callback function for successful response.\r\n * @param {Function} [onError] - Callback function for error response.\r\n * @return {Promise} Resolves with the result of the API call.\r\n\r\n */\r\nexport async function _Iterop_businessTableSearchInRows(\r\n  credentials,\r\n  token,\r\n  tableId,\r\n  columnsName,\r\n  body,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  // Exemple : columns = uuid+name\r\n  // Exemple : body(String) = {\"filters\": [{\"uuid\": \"e56fd041-a9c0-4f1c-91ff-643a826a84d9\",\"isactive\": true}]}\r\n  if (credentials.tenant) {\r\n    const url = `https://api.uixhome.fr/${credentials.tenant.toLowerCase()}/iterop/businesstable/search/rows/${tableId}?t=${token}&c=${encodeURIComponent(\r\n      columnsName\r\n    )}&b=${encodeURIComponent(body)}`;\r\n    fetch(url, {\r\n      method: \"POST\",\r\n    })\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        result[\"url\"] = url;\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError)\r\n          onError({\r\n            error,\r\n            tableId,\r\n            columns: columnsName,\r\n            body,\r\n          });\r\n      });\r\n  }\r\n}\r\n\r\n/**\r\n * @description Updates a business table with the provided data.\r\n *\r\n * @param {Object} credentials - Credentials for authentication.\r\n * @param {String} token - CSRF token for authentication.\r\n * @param {String} tableId - ID of the table to update.\r\n * @param {String} body - Data to update the table with.\r\n * @param {Function} [onDone] - Callback function to execute upon successful update.\r\n * @param {Function} [onError] - Callback function to execute if an error occurs during the update.\r\n */\r\nexport async function _Iterop_updateBusinessTable(\r\n  credentials,\r\n  token,\r\n  tableId,\r\n  body,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const url = `https://api.uixhome.fr/${credentials.tenant.toLowerCase()}/iterop/businesstable/post/update/${tableId}?t=${token}&b=${encodeURIComponent(\r\n      body\r\n    )}`;\r\n    fetch(url, {\r\n      method: \"POST\",\r\n    })\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        //console.log(\"_Iterop_updateBusinessTable | _Iterop_businessTableSearchInRows | fetch | onDone\", body);\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError)\r\n          onError({\r\n            error,\r\n            url,\r\n          });\r\n      });\r\n  }\r\n}\r\n\r\nexport async function _Iterop_createBusinessTable(\r\n  credentials,\r\n  token,\r\n  body,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const url = `https://api.uixhome.fr/${credentials.tenant.toLowerCase()}/iterop/businesstable/post/create/?t=${token}&b=${encodeURIComponent(\r\n      body\r\n    )}`;\r\n    fetch(url, {\r\n      method: \"POST\",\r\n    })\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        //console.log(\"_Iterop_updateBusinessTable | _Iterop_businessTableSearchInRows | fetch | onDone\", body);\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError)\r\n          onError({\r\n            error,\r\n            url,\r\n          });\r\n      });\r\n  }\r\n}\r\n\r\n/**\r\n * @description Fonction asynchrone, `_Iterop_runProcess` permet de lancer un processus ITEROP\r\n * @param   {Object} credentials  Informations d'identification du tenant.\r\n * @param   {String} credentials.tenant  Le tenant.\r\n * @param   {String} token  Le jeton CSRF.\r\n * @param   {String} processKey - le nom du processus ITEROP.\r\n * @param   {String} body - le body de la requête, doit être au format String et encodé. @exemple encodeURIComponent(JSON.stringify(body)).\r\n * @return  {Function}  Callback contenant le message de retour de l'api\r\n */\r\nexport async function _Iterop_runProcess(\r\n  credentials,\r\n  token,\r\n  processKey,\r\n  body,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/runtime/processes/${processKey}?t=${token}&b=${body}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        console.log(\"_Iterop_runProcess : OK\");\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n\r\n//SECTION - Table de dépendances\r\n/**\r\n * Récupère toutes les tables de dépendances.\r\n *\r\n * @param {Object} credentials - credentials.\r\n * @param {String} credentials.tenant - Tenant credentials.\r\n * @param {String} token - token iterop.\r\n * @param {Function} [onDone] - Callback function for successful response.\r\n * @param {Function} [onError] - Callback function for error response.\r\n * @return {Promise} Resolves with the result of the API call.\r\n */\r\nexport async function _Iterop_GetAllDependencyTable(\r\n  credentials,\r\n  token,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/dependencytable/all/?t=${token}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n\r\nexport async function _Iterop_GetOneDependencyTable(\r\n  credentials,\r\n  token,\r\n  tableId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  console.log(\"_Iterop_GetOneDependencyTable | Run\");\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/dependencytable/one/${tableId}/?t=${token}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n\r\n/**\r\n * (cli) => Create List Items\r\n */\r\nexport async function _Iterop_PatchDependencyTable(\r\n  credentials,\r\n  token,\r\n  tableId,\r\n  cli,\r\n  body,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/dependencytable/patch/${tableId}/?t=${token}&cli=${cli}&b=${body}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n\r\nexport async function _Iterop_PutDependencyTable(\r\n  credentials,\r\n  token,\r\n  tableId,\r\n  body,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/dependencytable/put/${tableId}/?t=${token}&b=${body}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n//!SECTION\r\n\r\n//SECTION - LISTS\r\n\r\nexport async function _Iterop_GetOneList(\r\n  credentials,\r\n  token,\r\n  listId,\r\n  onDone = undefined,\r\n  onError = undefined\r\n) {\r\n  if (credentials.tenant) {\r\n    const tenant = credentials.tenant.toLowerCase();\r\n    fetch(\r\n      `https://api.uixhome.fr/${tenant}/iterop/list/one/${listId}/?t=${token}`,\r\n      {\r\n        method: \"POST\",\r\n      }\r\n    )\r\n      .then((response) => response.json())\r\n      .then((result) => {\r\n        if (onDone) onDone(result);\r\n      })\r\n      .catch((error) => {\r\n        if (onError) onError(error);\r\n      });\r\n  }\r\n}\r\n//!SECTION\r\n","/**\r\n * @description Fonction Test permettant de tester l'installation de la librairie\r\n *\r\n * @param   {String}  _name  une simple chaine\r\n *\r\n * @return  {String}\r\n */\r\nexport function sayHello(_name) {\r\n  const name = \"Hello \" + _name;\r\n  console.log(name);\r\n  return name;\r\n}\r\n","import {\r\n    _httpCallAuthenticated,\r\n    _getPlatformServices,\r\n    _getPlateformInfos\r\n} from \"../main/3dexperience_api\";\r\nimport {\r\n    _3DSpace_csrf,\r\n    _3DSpace_get_securityContexts\r\n} from \"../main/3dspace_api\"\r\nimport {\r\n    DateTime\r\n} from \"luxon\";\r\n\r\nexport function _3DSearch_usersGroup(\r\n    credentials,\r\n    onDone = undefined,\r\n    onError = undefined,\r\n) {\r\n    console.log(\"credentials\", credentials);\r\n    return new Promise((result) => {\r\n        if (credentials.token === \"\") {\r\n            _3DSpace_csrf(credentials);\r\n        }\r\n        if (!credentials.space || credentials.space === \"\") {\r\n            const platformeInfo = _getPlateformInfos();\r\n            console.log(\"platformeInfo\", platformeInfo);\r\n        }\r\n        _3DSpace_get_securityContexts(\r\n            credentials,\r\n            \"Common space\",\r\n            [\"VPLMProjectLeader\", \"VPLMCreator\"],\r\n            undefined,\r\n            (ctx) => (credentials[\"ctx\"] = ctx),\r\n            (err) => {\r\n                console.log(\"onError =>\", err);\r\n            },\r\n            true\r\n        );\r\n        const ts = DateTime.now().ts;\r\n\r\n        const urlService = `https://${credentials.tenant}-eu1-registry.3dexperience.3ds.com/api/v1/platform/service/instance?serviceId=3dsearch&platformId=${credentials.tenant}`\r\n        _httpCallAuthenticated(urlService, {\r\n            onComplete(response) {\r\n                if (Array.isArray(JSON.parse(response))) {\r\n                    const oResponse = JSON.parse(response);\r\n                    console.log(\"serviceId=3dsearch\", oResponse);\r\n                    const urlFedSearch = `${oResponse[0].services[0].url}/search?xrequestedwith=xmlhttprequest`\r\n\r\n                    _httpCallAuthenticated(urlFedSearch, {\r\n                        method: \"POST\",\r\n                        headers: {\r\n                            Accept: \"application/json\",\r\n                            \"Content-Type\": \"application/json\",\r\n                        },\r\n                        data: JSON.stringify({\r\n                            with_indexing_date: true,\r\n                            with_nls: false,\r\n                            label: `3DSearch-${ts}`,\r\n                            locale: \"en\",\r\n                            select_predicate: [\r\n                                \"ds6w:label\",\r\n                                \"ds6w:type\",\r\n                                \"ds6w:description\",\r\n                                \"ds6w:identifier\",\r\n                                \"ds6w:responsible\",\r\n                                \"ds6wg:fullname\"\r\n                            ],\r\n                            select_file: [\r\n                                \"icon\",\r\n                                \"thumbnail_2d\"\r\n                            ],\r\n                            query: \"([ds6w:type]:(Group) AND [ds6w:status]:(Public)) OR (flattenedtaxonomies:\\\"types/Person\\\" AND current:\\\"active\\\")\",\r\n                            order_by: \"desc\",\r\n                            order_field: \"relevance\",\r\n                            nresults: 1000,\r\n                            start: \"0\",\r\n                            source: [\r\n                                \"3dspace\",\r\n                                \"usersgroup\"\r\n                            ],\r\n                            tenant: credentials.tenant,\r\n                            login: {\r\n                                \"3dspace\": {\r\n                                    SecurityContext: `ctx::${credentials.ctx}`\r\n                                }\r\n                            }\r\n                        }),\r\n                        type: \"json\",\r\n                        onComplete(response) {\r\n                            if (onDone) onDone(response);\r\n                        },\r\n                        onFailure(response) {\r\n                            if (onError) onError(response);\r\n                        },\r\n                    });\r\n\r\n                }\r\n            },\r\n            onFailure(response) {\r\n                if (onError) onError(response);\r\n            },\r\n        })\r\n    });\r\n}"],"names":["UUID","uuid","couleurs","getCommunes","cp","onDone","onError","codePostal","response","json","error","findAdresse","query","getDataFromGouvFr","events","colors","year","DateTime","loadedEvents","sortedData","formatData","date","i","data","each","event","chunkArray","obj","getResponse","getError","credentials","myArray","chunk","fn_to_call","chunks","arrayChunks","loopingChunk","rep","err","initLoop","fn","loop","updateEvent","add","index","val","a","b","_httpCallAuthenticated","url","options","requirejs","WAFData","_setDraggable","elem","strData","onDrag","DataDragAndDrop","_setupTagger","tags","onTaggerFilter","TagNavigatorProxy","taggerProxy","widget","_setDroppable","drop","_getPlatformServices","platformId","onComplete","onFailure","i3DXCompassServices","_getPlateformInfos","retourAPI","plAPI","tenant","user","appsConfiguration","appConf","_getMe","urlService","oResponse","_getServiceUrl","listServiceUrl","platform","_getServiceUrl_3DPassport","urlServicePassport","_Registry_getServicesUrl","compass_getListAdditionalApps","URL","headers","xhr","info","formatedInfos","app","name","id","_AppMngt_get_users","_AppMngt_get_info_user","topHeader","createUserGroups","datas","space","currentUser","templateData","getComplementUG","uri","baseURL","URI","OPTs","getUsersGroupRules","_usersgroup","OPTS","OPTsH","getUserGroupsList","numMax","opt","opt2","opts","repUG","reponse","UG","element","iamOwner","iamMember","iam","rules","infoError","getUserGroupsByURIList","list_uris","URLElements","h","getUserGroupsByEmailList","list_emails","parseResp","deleteUserGroups","patchUserGroups","dataMembers","dataMembersSTR","patchUserGroupsControl","_datas","readUserGroupControl","_rep","getCSRFToken","hasOwnProperty","prop","decode","qs","sep","eq","regexp","maxKeys","len","x","idx","kstr","vstr","k","v","stringifyPrimitive","encode","ks","querystring","require$$0","require$$1","_3DSpace_get_docInfo","docid","_3DSpace","_3DSpace_get_multiDocInfo","docids","_3DSpace_get_csrf","_3DSpace_csrf","_3DSpace_get_ticket","token","file_url","head","_3DSpace_file_url_csr","csr","_3DSpace_file_update","docId","fileId","filename","runFunction","_3DSpace_file_update_csr","result","csrf","formData","blobData","_3DSpace_put_docInfo","description","title","_3DSpace_Upload_File","fileName","blobFile","onProgress","cs_name","timeStamp","csrftoken","isadmin","ticket","actionurl","jobticket","pushFileInFcs","receipt","urlRelatedFile","ext","bodyRequest","progress","_3DSpace_Update_Doc","objectId","_3DSpace_Create_Doc","descriptionDoc","checkinTicket","resultCheckinTicket","fcs__jobTicket","relatedDocAndFile","fileData","percentComplete","trimExt","tempId","_3DSpace_get_securityContexts","cs","role","organization","withPreferredCredentials","contexts","context","finalCs","finalOrg","finalRole","oCS","e","couples","value","self","t","r","defineSingleItem","couple","_3DSpace_download_doc","resolve","reject","ticketURL","blob","tryParse","_3DSpace_download_multidoc","objectIds","_3DSpace_get_downloadTicket_multidoc","onNext","compilData","fileUrl","_3DSpace_lifecycle_getNextStates","_3DSpace_lifecycle_changeState","nextState","_3DSpace_lifecycle_getGraph","ctx","_3DSpace_lifecycle_getNextRevision","_3DSpace_lifecycle_changeRevision","nextRevision","_3DSpace_get_currentSecurityContext","_3DSpace_lifecycle_getRevisions","SecurityContext","_3DSpace_bookmark_newWorkspace","parentId","item","_3DSpace_bookmark_addSubsciptions","personList","eventsList","getAllContextSecurity","getDataFrom3DSpace","widgetPreference","getDownloadDocument","pushDataIn3DSpace","dataBase","jsonFile","listObjectId","mixedDatas","get_3DSpace_csrf","getDatasByTenant","getDatasFrom3DSpace","bbds","aff","dataMixing","copyData","objIDTEST3","sourcesSearching","listPredicates","objToTag","addTagToDoc","objId","pred","tag","dataTest","docName","docExt","createBy","getActualTagsOnDoc","nomFichier","dataPattern","removeTagToDoc","getInfoDocTags","str","header","_3DSwym_get_Token","tokenInfo","_3DSwym_getAllNews","_3DSwym_getFamiliarPeople","_data","myContacts","contact","_3DSwym_getAllCommunities","communautes","_communitiesInfo","count","commu","_communaute","_3DSwym_getMembersCommunity","idCommu","_3DSwym_getIdeaStatusMaturity","commuID","_3DSwym_buildDirectMessage","listAllContacts","_3DSwym","_URL","MSGData","formatedMessage","otherCommunity","_3DSwym_findCommunityToInstantMSG","_3DSwym_sendMessageData","infoSortedByLengths","com","sortedDatas","logins","content","message","_dates","time","_3DSwym_postIdeaTemplate","findByID","findByTitle","formatedData","templateAffaireMessage","_3DSwym_postIdea","body","headerOptions","ERR","_3DSwym_deleteIdea","_3DSwym_getOneIdea","_3DSwym_token","_3DSwym_editIdea","idPost","community_id","status_comment","status_id","_3DSwym_getAllListIdeas","limit","page","search","allIdeas","startPage","isEndOfPages","maxPages","getAllIdeas","idea","idee","txt","_3DSwym_ForwardIdea","idea_id","_3DSwym_get_currentUser","CURRENT_USER","_3DSwym_get_findUser","userLogin","_3DSwym_addComment","subjectUri","richMessage","_getServiceUrl_Iterop","serviceUrls","urlAPIV2Iterop","service","_Iterop_Auth_CAS","urlService3DPassport","x3ds_service_redirect_url","_Iterop_jwtUser","lowerTenant","_Iterop_getAllBusinessTables","_Iterop_getOneBusinessTable","tableId","_Iterop_getOneBusinessTableRows","_Iterop_AddOrRemoveRows","_Iterop_businessTableSearchInRows","columnsName","_Iterop_updateBusinessTable","_Iterop_createBusinessTable","_Iterop_runProcess","processKey","_Iterop_GetOneDependencyTable","_Iterop_PatchDependencyTable","cli","_Iterop_PutDependencyTable","_Iterop_GetOneList","listId","sayHello","_name","_3DSearch_usersGroup","platformeInfo","ts","urlFedSearch"],"mappings":"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","x_google_ignoreList":[10,11,12]}