{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import { getJSONFromStr } from \"@web3r/flowerkit/json\";\r\nimport { getFromServer } from \"@web3r/flowerkit/net\";\r\nimport { isObjEmpty, isObjHasOwnProp } from \"@web3r/flowerkit/obj\";\r\nimport { isStrUrl } from \"@web3r/flowerkit/str\";\r\nimport { getDocument } from \"ssr-window\";\r\nimport { getSanitizedHTML } from \"../../../utils/getSanitizedHTML\";\r\nimport type { TLocales } from \"../config/locales\";\r\nimport type { TAsset, TAsyncCfg, TModalCfg } from \"../config/types\";\r\n\r\n/**\r\n * Получает асинхронный контент модального окна\r\n * @returns {Promise<string>}\r\n */\r\nconst getAsyncModalLayout = async ({\r\n  url, method, data, getFromServerProps,\r\n}: TAsyncCfg): Promise<string> => {\r\n\r\n  const prefix = \"Unable to load modal data from backend: \";\r\n\r\n  return await getFromServer<string>({\r\n    url,\r\n    method,\r\n    type: \"text\",\r\n    data,\r\n    ...getFromServerProps,\r\n  })\r\n    .then((data) => {\r\n      if (!!data) {\r\n        const json = getJSONFromStr<{\r\n          isSuccess?: boolean;\r\n          data?: {\r\n            html?: string;\r\n          };\r\n        }>(data);\r\n        if (isObjEmpty(json)) { // non-json\r\n          if (typeof data === \"string\" && data.length) {\r\n            return Promise.resolve(data);\r\n          } else {\r\n            return Promise.reject(prefix + \"response is empty\");\r\n          }\r\n        } else { // json response\r\n          if (json.isSuccess) {\r\n            const html = json?.data?.html;\r\n            if (typeof html === \"string\" && html.length) {\r\n              return Promise.resolve(html);\r\n            } else {\r\n              return Promise.reject(prefix + \"html prop is missing or empty\");\r\n            }\r\n          } else {\r\n            return Promise.reject(prefix + \"unsuccessful result\");\r\n          }\r\n        }\r\n      } else {\r\n        return Promise.reject(prefix + \"response is empty\");\r\n      }\r\n    })\r\n    .then((html) => {\r\n      return getSanitizedHTML(html);\r\n    })\r\n    .catch((reason: string | Response) => {\r\n      if (typeof reason === \"string\") {\r\n        return Promise.reject(reason);\r\n      } else {\r\n        return Promise.reject(prefix + \"network problem\");\r\n      }\r\n    });\r\n};\r\n\r\n/**\r\n * Получает HTML-разметку из тега `template`, преобразуя ее в блок `div`\r\n * @param el{HTMLTemplateElement=}\r\n * @returns {string}\r\n */\r\nconst getTemplateLayout = (el: HTMLTemplateElement): string => {\r\n  if (el) {\r\n    const content = el.innerHTML;\r\n    if (content.length) {\r\n      const wrapper = getDocument().createElement(\"div\");\r\n      const modal = getDocument().createElement(\"div\");\r\n      for (const attr of el.attributes) {\r\n        modal.setAttribute(attr.name, attr.value);\r\n      }\r\n      const html = getSanitizedHTML(content);\r\n      modal.insertAdjacentHTML(\"afterbegin\", html);\r\n      wrapper.appendChild(modal);\r\n      return wrapper.outerHTML;\r\n    } else {\r\n      return \"\";\r\n    }\r\n  } else {\r\n    return \"\";\r\n  }\r\n};\r\n\r\n/**\r\n * Получает значение пользовательского свойства из конфигурации модального окна\r\n * @param propName{String}\r\n * @param handlerNode{Element}\r\n * @param parsedCfg{TModalCfg}\r\n * @returns {string|null}\r\n */\r\nconst getCfgProp = (propName: \"src\" | \"id\" | \"type\", handlerNode: Element, parsedCfg: TModalCfg): string | null => {\r\n\r\n  switch (propName) {\r\n    case \"src\": {\r\n      switch (true) {\r\n        case isObjHasOwnProp(parsedCfg, \"src\"):\r\n          return parsedCfg?.src ?? null;\r\n        case handlerNode.hasAttribute(\"href\"):\r\n          return handlerNode.getAttribute(\"href\") || null;\r\n        default:\r\n          return null;\r\n      }\r\n    }\r\n    case \"id\": {\r\n      if (isObjHasOwnProp(parsedCfg, \"preset\")) {\r\n        switch (parsedCfg.preset) {\r\n          case \"success\":\r\n            return \"modalSuccess\";\r\n          case \"error\":\r\n            return \"modalError\";\r\n          case \"confirm\":\r\n            return \"modalConfirm\";\r\n          case \"assets\":\r\n            return \"modalAssets\";\r\n          default:\r\n            return null;\r\n        }\r\n      } else {\r\n        return parsedCfg?.id ?? null;\r\n      }\r\n    }\r\n    case \"type\": {\r\n      switch (true) {\r\n        case isObjHasOwnProp(parsedCfg, \"type\"): {\r\n          if (parsedCfg.type === \"inline\" || parsedCfg.type === \"async\" || parsedCfg.type === \"html\") {\r\n            return parsedCfg.type;\r\n          } else {\r\n            return null;\r\n          }\r\n        }\r\n        case handlerNode.hasAttribute(\"href\"): {\r\n          const href = handlerNode.getAttribute(\"href\") || null;\r\n          if (href) {\r\n            switch (true) {\r\n              case href.startsWith(\"#\"):\r\n                return \"inline\";\r\n              case isStrUrl(href):\r\n                return \"async\";\r\n              default:\r\n                return null;\r\n            }\r\n          } else {\r\n            return null;\r\n          }\r\n        }\r\n        default:\r\n          return null;\r\n      }\r\n    }\r\n    default:\r\n      return null;\r\n  }\r\n};\r\n\r\n/**\r\n * Получение указанного кластера локализации\r\n * @param locales{Object}\r\n * @param lang{String}\r\n * @param langList{Array}\r\n * @returns Object\r\n */\r\nconst getLocaleCluster = (locales: TLocales, lang: string, langList: string[]) => {\r\n  const currentLangIndex = langList.findIndex((item) => item === lang);\r\n  return Object.fromEntries(Object.entries(locales)\r\n    .map(([ name, items ]: [ string, string[] | string ]) => {\r\n      const val = Array.isArray(items) ? items[currentLangIndex] : items;\r\n      return [ name, val ];\r\n    }));\r\n};\r\n\r\n/**\r\n * Проверяет, валиден ли массив assets\r\n * @returns {boolean}\r\n */\r\nconst isAssetsValid = (assets: TAsset[]) => {\r\n  return Array.isArray(assets) && assets.length > 0 && assets.every((item) => {\r\n    return typeof item?.src === \"string\" && item.src.length > 0 && !!item.type;\r\n  });\r\n};\r\n\r\nexport {\r\n  getAsyncModalLayout,\r\n  getCfgProp,\r\n  getLocaleCluster,\r\n  getTemplateLayout,\r\n  isAssetsValid,\r\n};\r\n"],"names":["getAsyncModalLayout","async","url","method","data","getFromServerProps","prefix","getFromServer","type","then","json","getJSONFromStr","isObjEmpty","length","Promise","resolve","reject","isSuccess","html","getSanitizedHTML","catch","reason","getTemplateLayout","el","content","innerHTML","wrapper","getDocument","createElement","modal","attr","attributes","setAttribute","name","value","insertAdjacentHTML","appendChild","outerHTML","getCfgProp","propName","handlerNode","parsedCfg","isObjHasOwnProp","src","hasAttribute","getAttribute","preset","id","href","startsWith","isStrUrl","getLocaleCluster","locales","lang","langList","currentLangIndex","findIndex","item","Object","fromEntries","entries","map","items","val","Array","isArray","isAssetsValid","assets","every"],"mappings":";;;;GAaA,MAAMA,oBAAsBC,OAC1BC,QAAKC,cAAQC,UAAMC,0CAGnB,MAAMC,OAAS,2CAEf,aAAaC,cAAsB,CACjCL,QACAC,cACAK,KAAM,OACNJ,aACGC,qBAEFI,KAAML,OACL,KAAMA,KAAM,CACV,MAAMM,KAAOC,eAKVP,MACH,GAAIQ,WAAWF;;AACb,UAAWN,OAAS,UAAYA,KAAKS,OACnC,OAAOC,QAAQC,QAAQX,WAEvB,OAAOU,QAAQE,OAAOV,OAAS;;AAGjC,GAAII,KAAKO,UAAW,CAClB,MAAMC,KAAOR,MAAMN,MAAMc,KACzB,UAAWA,OAAS,UAAYA,KAAKL,OACnC,OAAOC,QAAQC,QAAQG,WAEvB,OAAOJ,QAAQE,OAAOV,OAAS,gCAEnC,MACE,OAAOQ,QAAQE,OAAOV,OAAS,sBAGrC,MACE,OAAOQ,QAAQE,OAAOV,OAAS,uBAGlCG,KAAMS,MACEC,iBAAiBD,OAEzBE,MAAOC,SACN,UAAWA,SAAW,SACpB,OAAOP,QAAQE,OAAOK,aAEtB,OAAOP,QAAQE,OAAOV,OAAS;;;;;GAUvC,MAAMgB,kBAAqBC,KACzB,GAAIA,GAAI,CACN,MAAMC,QAAUD,GAAGE,UACnB,GAAID,QAAQX,OAAQ,CAClB,MAAMa,QAAUC,cAAcC,cAAc,OAC5C,MAAMC,MAAQF,cAAcC,cAAc,OAC1C,IAAK,MAAME,QAAQP,GAAGQ,WACpBF,MAAMG,aAAaF,KAAKG,KAAMH,KAAKI,OAErC,MAAMhB,KAAOC,iBAAiBK,SAC9BK,MAAMM,mBAAmB,aAAcjB,MACvCQ,QAAQU,YAAYP,OACpB,OAAOH,QAAQW,SACjB,MACE,MAAO,EAEX,MACE,MAAO;;;;;;;GAWX,MAAMC,WAAa,CAACC,SAAiCC,YAAsBC,aAEzE,OAAQF,UACN,IAAK,MACH,OAAQ,MACN,KAAKG,gBAAgBD,UAAW,OAC9B,OAAOA,WAAWE,KAAO,KAC3B,KAAKH,YAAYI,aAAa,QAC5B,OAAOJ,YAAYK,aAAa,SAAW,KAC7C,QACE,OAAO,KAGb,IAAK,KACH,GAAIH,gBAAgBD,UAAW,UAC7B,OAAQA,UAAUK,QAChB,IAAK,UACH,MAAO,eACT,IAAK,QACH,MAAO,aACT,IAAK,UACH,MAAO,eACT,IAAK,SACH,MAAO,cACT,QACE,OAAO,UAGX,OAAOL,WAAWM,IAAM,KAG5B,IAAK,OACH,OAAQ,MACN,KAAKL,gBAAgBD,UAAW,QAC9B,GAAIA,UAAUjC,OAAS,UAAYiC,UAAUjC,OAAS,SAAWiC,UAAUjC,OAAS,OAClF,OAAOiC,UAAUjC,UAEjB,OAAO,KAGX,KAAKgC,YAAYI,aAAa,QAAS,CACrC,MAAMI,KAAOR,YAAYK,aAAa,SAAW,KACjD,GAAIG,KACF,OAAQ,MACN,KAAKA,KAAKC,WAAW,KACnB,MAAO,SACT,KAAKC,SAASF,MACZ,MAAO,QACT,QACE,OAAO,UAGX,OAAO,IAEX,CACA,QACE,OAAO,KAGb,QACE,OAAO;;;;;;;GAWb,MAAMG,iBAAmB,CAACC,QAAmBC,KAAcC,YACzD,MAAMC,iBAAmBD,SAASE,UAAWC,MAASA,OAASJ,MAC/D,OAAOK,OAAOC,YAAYD,OAAOE,QAAQR,SACtCS,IAAI,EAAG5B,KAAM6B,UACZ,MAAMC,IAAMC,MAAMC,QAAQH,OAASA,MAAMP,kBAAoBO,MAC7D,MAAO,CAAE7B,KAAM8B;;;;GAQrB,MAAMG,cAAiBC,QACdH,MAAMC,QAAQE,SAAWA,OAAOtD,OAAS,GAAKsD,OAAOC,MAAOX,aACnDA,MAAMd,MAAQ,UAAYc,KAAKd,IAAI9B,OAAS,KAAO4C,KAAKjD"}