{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import { isObjEmpty } from \"@web3r/flowerkit/obj\";\r\nimport { createElement } from \"react\";\r\nimport { IMask } from \"react-imask\";\r\nimport { presets, setPresets } from \"./config\";\r\nimport type { TMaskPresets } from \"./config\";\r\nimport { MaskedInput as MaskedInputComponent } from \"../../components/maskedInput\";\r\nimport type { TMaskedRef } from \"../../components/maskedInput\";\r\nimport { constants } from \"../../constants\";\r\nimport { Collection } from \"../collection\";\r\nimport type { TCollectionElement, TCollectionItemDefaultCfg } from \"../collection\";\r\nimport { CollectionReactItem } from \"../collectionReactItem\";\r\nimport type { TValidationEvent } from \"../forms/validation\";\r\n\r\ntype TCollectionArgs = [ string, typeof MaskedInput, boolean? ];\r\ntype TCollectionPreset = [ { presets?: TMaskPresets; } ];\r\n\r\nconst isValidationEvent = (event: Event): event is TValidationEvent => {\r\n  return event instanceof CustomEvent && typeof event.detail === \"object\" && event.detail !== null;\r\n};\r\n\r\n/**\r\n * Класс для рендеринга элемента коллекции поля с маской для статичной верстки\r\n */\r\nexport class MaskedInput extends CollectionReactItem<TCollectionItemDefaultCfg, TMaskedRef> {\r\n\r\n  constructor(el: TCollectionElement, params?: TCollectionItemDefaultCfg) {\r\n    if (!(el instanceof HTMLElement)) {\r\n      throw new TypeError(`[MaskedInput] HTMLElement is expected, but got \"${el?.constructor?.name || typeof el}\"`);\r\n    }\r\n    super(el, MaskedInputCollection.selector);\r\n    this.render();\r\n    this.#bindEvents();\r\n  }\r\n\r\n  render() {\r\n    this.onBeforeMount();\r\n    this.root.render(createElement(MaskedInputComponent, {\r\n      onUnmount: this.onUnmount.bind(this),\r\n      onMount: this.onMount.bind(this),\r\n      ref: this.ref,\r\n      ...this.cfg,\r\n    }));\r\n  }\r\n\r\n  #onValidation(event: Event) {\r\n    if (isValidationEvent(event)) {\r\n      event.detail.updateValidationUI?.();\r\n    }\r\n  }\r\n\r\n  #bindEvents() {\r\n    this.instance.addEventListener(constants.formBubbles.inputInvalid, (e) => this.#onValidation(e));\r\n    this.instance.addEventListener(constants.formBubbles.inputValid, (e) => this.#onValidation(e));\r\n  }\r\n\r\n}\r\n\r\n/**\r\n * Плагин для автоматического рендера полей с маской. Является коллекцией.\r\n * @module MapCollection\r\n * @memberof Collection\r\n * @example\r\n * // <div data-js-masked-input='{}'><div>\r\n */\r\nexport class MaskedInputCollection extends Collection<MaskedInput> {\n\n  /**\n   * Экспорт конструктора `IMask`, который используется в текущей реализации коллекции.\n   * Поле позволяет переиспользовать библиотеку масок в пользовательском коде.\n   * @type {typeof IMask}\n   */\n  static iMask = IMask;\n\n  /**\n   * Признак регистрации коллекции в глобальном namespace Core.\n   * @type {boolean}\n   */\n  static isApp = true;\n\n  /**\n   * CSS-селектор контейнеров MaskedInput для автоподключения коллекции.\n   * @type {string}\n   */\n  static selector = \"[data-js-masked-input]\";\n\r\n  /**\r\n   * Получает пресеты готовых масок\r\n   * @returns {{email: {mask: (function(*): boolean)}, phone: {mask: string, unmask: boolean}, digits: {mask: RegExp}, number: {mask: NumberConstructor, thousandsSeparator: string, unmask: boolean}, date: {mask: DateConstructor, lazy: boolean, autofix: boolean, pattern: string}, rub: {mask: string, unmask: boolean, prepare: ((function(*, *): (string|*))|*), blocks: {num: {unmask: boolean, mask: NumberConstructor, thousandsSeparator: string, radix: string, scale: number, padFractionalZeros: boolean, normalizeZeros: boolean, signed: boolean}}}, letters: {mask: RegExp}}}\r\n   */\r\n  static get presets() {\r\n    return presets;\r\n  }\r\n\r\n  /**\r\n   * Добавляет новые пресеты к существующим маскам или изменяет текущие\r\n   * @param value{Object=} группа пресетов в виде обеъкта\r\n   * @example\r\n   * // В поле `MaskedInputCollection.iMask` доступен конструктор `react-imask`\r\n   * MaskedInputCollection.preset = {\r\n   *   // добавление нового пресета\r\n   *   \"myMask\": {\r\n   *     mask: \"000\"\r\n   *   },\r\n   *   // перезапись существующего пресета\r\n   *   \"email\": {\r\n   *     // ...\r\n   *   }\r\n   * };\r\n   */\r\n  static set presets (value: TMaskPresets) {\r\n    if (typeof value === \"object\" && !!value && !isObjEmpty(value)) {\r\n      setPresets(value);\r\n    } else {\r\n      console.error(`[MaskedInputCollection] Can't apply new presets, it must be non-empty object `, value);\r\n    }\r\n  }\r\n\r\n  constructor(...args: TCollectionArgs | TCollectionPreset) {\r\n    const defaultSelector = MaskedInputCollection.selector;\r\n    const defaultPlugin = MaskedInput;\r\n    const defaultIsInit = true;\r\n\r\n    // if user custom presets\r\n    if (args.length === 1 && typeof args[0] === \"object\" && args[0] !== null && !!args[0].presets) {\r\n      console.error(`[MaskedInputCollection] Please use \"MaskedInputCollection.presets = { /* presets */ }\" directly before plugin call`);\r\n      MaskedInputCollection.presets = args[0].presets;\r\n      super(defaultSelector, defaultPlugin, defaultIsInit);\r\n      return;\r\n    }\r\n\r\n    if (args.length && typeof args[0] === \"string\" && typeof args[1] === \"function\") {\r\n      const selector = args[0];\r\n      const plugin = args[1];\r\n      const isInit = typeof args[2] === \"boolean\" ? args[2] : defaultIsInit;\r\n      super(selector, plugin, isInit);\r\n      return;\r\n    }\r\n\r\n    super(defaultSelector, defaultPlugin, defaultIsInit);\r\n  }\r\n\r\n}\r\n"],"names":["isValidationEvent","event","CustomEvent","detail","MaskedInput","CollectionReactItem","constructor","el","params","HTMLElement","TypeError","name","super","MaskedInputCollection","selector","this","render","bindEvents","onBeforeMount","root","createElement","MaskedInputComponent","onUnmount","bind","onMount","ref","cfg","onValidation","updateValidationUI","instance","addEventListener","constants","formBubbles","inputInvalid","e","inputValid","Collection","static","IMask","presets","value","isObjEmpty","setPresets","console","error","args","defaultSelector","defaultPlugin","defaultIsInit","length","plugin","isInit"],"mappings":"oZAgBA,MAAMA,kBAAqBC,OAClBA,iBAAiBC,oBAAsBD,MAAME,SAAW,UAAYF,MAAME,SAAW;;;GAMvF,MAAMC,oBAAoBC,oBAE/B,WAAAC,CAAYC,GAAwBC,QAClC,KAAMD,cAAcE,aAClB,MAAM,IAAIC,UAAU,mDAAmDH,IAAID,aAAaK,aAAeJ,OAEzGK,MAAML,GAAIM,sBAAsBC,UAChCC,KAAKC,SACLD,MAAKE,YACP,CAEA,MAAAD,GACED,KAAKG,gBACLH,KAAKI,KAAKH,OAAOI,cAAcC,cAAsB,CACnDC,UAAWP,KAAKO,UAAUC,KAAKR,MAC/BS,QAAST,KAAKS,QAAQD,KAAKR,MAC3BU,IAAKV,KAAKU,OACPV,KAAKW,MAEZ,CAEA,aAAAC,CAAc1B,OACZ,GAAID,kBAAkBC,OACpBA,MAAME,OAAOyB,sBAEjB,CAEA,WAAAX,GACEF,KAAKc,SAASC,iBAAiBC,UAAUC,YAAYC,aAAeC,GAAMnB,MAAKY,aAAcO,IAC7FnB,KAAKc,SAASC,iBAAiBC,UAAUC,YAAYG,WAAaD,GAAMnB,MAAKY,aAAcO,GAC7F;;;;;;;GAWK,MAAMrB,8BAA8BuB;;;;;;AAOzCC,aAAeC;;;;;AAMfD,aAAe;;;;;AAMfA,gBAAkB;;;;;AAMlB,kBAAWE,GACT,OAAOA,OACT;;;;;;;;;;;;;;;;KAkBA,kBAAWA,CAASC,OAClB,UAAWA,QAAU,YAAcA,QAAUC,WAAWD,OACtDE,WAAWF,YAEXG,QAAQC,MAAM,gFAAiFJ,MAEnG,CAEA,WAAAlC,IAAeuC,MACb,MAAMC,gBAAkBjC,sBAAsBC,SAC9C,MAAMiC,cAAgB3C,YACtB,MAAM4C,cAAgB;yBAGtB;GAAIH,KAAKI,SAAW,UAAYJ,KAAK,KAAO,UAAYA,KAAK,KAAO,QAAUA,KAAK,GAAGN,QAAS,CAC7FI,QAAQC,MAAM,sHACd/B,sBAAsB0B,QAAUM,KAAK,GAAGN,QACxC3B,MAAMkC,gBAAiBC,cAAeC,eACtC,MACF,CAEA,GAAIH,KAAKI,eAAiBJ,KAAK,KAAO,iBAAmBA,KAAK,KAAO,WAAY,CAC/E,MAAM/B,SAAW+B,KAAK,GACtB,MAAMK,OAASL,KAAK,GACpB,MAAMM,cAAgBN,KAAK,KAAO,UAAYA,KAAK,GAAKG,cACxDpC,MAAME,SAAUoC,OAAQC,QACxB,MACF,CAEAvC,MAAMkC,gBAAiBC,cAAeC,cACxC"}