@verdocs/web-sdk 1.0.25 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (656) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/Auth-0146ddd8.js +161 -0
  3. package/dist/cjs/Token-b86e5335.js +2463 -0
  4. package/dist/cjs/app-globals-3a1e7e63.js +5 -0
  5. package/dist/cjs/buffer-es6-b2c1c885.js +1987 -0
  6. package/dist/cjs/css-shim-e9231523.js +6 -0
  7. package/dist/cjs/dom-7fb93981.js +75 -0
  8. package/dist/cjs/index-9c6e5f50.js +1976 -0
  9. package/dist/cjs/index-a24f3b6a.js +3096 -0
  10. package/dist/cjs/index-b5a86b04.js +4 -0
  11. package/dist/cjs/index-c4be37e1.js +54 -0
  12. package/dist/cjs/loader.cjs.js +19 -3
  13. package/dist/cjs/shadow-css-abc19485.js +389 -0
  14. package/dist/cjs/verdocs-auth.cjs.entry.js +306 -0
  15. package/dist/cjs/verdocs-button.cjs.entry.js +49 -0
  16. package/dist/cjs/verdocs-dropdown.cjs.entry.js +80 -0
  17. package/dist/cjs/verdocs-field-attachment.cjs.entry.js +59 -0
  18. package/dist/cjs/verdocs-field-checkbox.cjs.entry.js +39 -0
  19. package/dist/cjs/verdocs-field-date.cjs.entry.js +2968 -0
  20. package/dist/cjs/verdocs-field-dropdown.cjs.entry.js +59 -0
  21. package/dist/cjs/verdocs-field-initial.cjs.entry.js +52 -0
  22. package/dist/cjs/verdocs-field-payment.cjs.entry.js +86 -0
  23. package/dist/cjs/verdocs-field-radio-button.cjs.entry.js +48 -0
  24. package/dist/cjs/verdocs-field-signature.cjs.entry.js +52 -0
  25. package/dist/cjs/verdocs-field-textarea.cjs.entry.js +63 -0
  26. package/dist/cjs/verdocs-field-textbox.cjs.entry.js +63 -0
  27. package/dist/cjs/verdocs-initial-dialog.cjs.entry.js +243 -0
  28. package/dist/cjs/verdocs-kba-dialog.cjs.entry.js +81 -0
  29. package/dist/cjs/verdocs-loader.cjs.entry.js +19 -0
  30. package/dist/cjs/verdocs-ok-dialog.cjs.entry.js +48 -0
  31. package/dist/cjs/verdocs-organization-card.cjs.entry.js +22 -0
  32. package/dist/cjs/verdocs-quick-functions.cjs.entry.js +31 -0
  33. package/dist/cjs/verdocs-search-activity.cjs.entry.js +263 -0
  34. package/dist/cjs/{search-box.cjs.entry.js → verdocs-search-box.cjs.entry.js} +6 -6
  35. package/dist/cjs/verdocs-search-tabs.cjs.entry.js +20 -0
  36. package/dist/cjs/verdocs-search.cjs.entry.js +19 -0
  37. package/dist/cjs/verdocs-sign.cjs.entry.js +1999 -0
  38. package/dist/cjs/verdocs-signature-dialog.cjs.entry.js +239 -0
  39. package/dist/cjs/verdocs-status-indicator.cjs.entry.js +7615 -0
  40. package/dist/cjs/verdocs-template-card.cjs.entry.js +38 -0
  41. package/dist/cjs/verdocs-template-tags.cjs.entry.js +20 -0
  42. package/dist/cjs/verdocs-text-input.cjs.entry.js +62 -0
  43. package/dist/cjs/verdocs-toggle.cjs.entry.js +36 -0
  44. package/dist/cjs/verdocs-upload-dialog.cjs.entry.js +123 -0
  45. package/dist/cjs/verdocs-view.cjs.entry.js +16122 -0
  46. package/dist/cjs/verdocs-web-sdk.cjs.js +117 -5
  47. package/dist/collection/collection-manifest.json +34 -16
  48. package/dist/collection/components/controls/verdocs-button/verdocs-button.css +140 -0
  49. package/dist/collection/components/controls/verdocs-button/verdocs-button.js +205 -0
  50. package/dist/collection/components/controls/verdocs-button/verdocs-button.stories.js +59 -0
  51. package/dist/collection/components/controls/{dropdown-menu → verdocs-dropdown}/down-arrow.svg +0 -0
  52. package/dist/collection/components/controls/verdocs-dropdown/verdocs-dropdown.css +62 -0
  53. package/dist/collection/components/controls/{dropdown-menu/dropdown-menu.js → verdocs-dropdown/verdocs-dropdown.js} +26 -47
  54. package/dist/collection/components/controls/{dropdown-menu/dropdown-menu.stories.js → verdocs-dropdown/verdocs-dropdown.stories.js} +5 -9
  55. package/dist/collection/components/controls/verdocs-loader/verdocs-loader.css +45 -0
  56. package/dist/collection/components/controls/verdocs-loader/verdocs-loader.js +16 -0
  57. package/dist/collection/components/controls/verdocs-loader/verdocs-loader.stories.js +8 -0
  58. package/dist/collection/components/{elements/org-popup → controls/verdocs-organization-card}/user-group.svg +0 -0
  59. package/dist/collection/components/{elements/org-popup/org-popup.css → controls/verdocs-organization-card/verdocs-organization-card.css} +16 -40
  60. package/dist/collection/components/controls/verdocs-organization-card/verdocs-organization-card.js +60 -0
  61. package/dist/collection/components/controls/verdocs-organization-card/verdocs-organization-card.stories.js +22 -0
  62. package/dist/collection/components/controls/verdocs-status-indicator/accepted-dark.svg +4 -0
  63. package/dist/collection/components/controls/verdocs-status-indicator/accepted-light.svg +4 -0
  64. package/dist/collection/components/controls/verdocs-status-indicator/arrowright.svg +3 -0
  65. package/dist/collection/components/controls/verdocs-status-indicator/canceled-dark.svg +3 -0
  66. package/dist/collection/components/controls/verdocs-status-indicator/canceled-light.svg +3 -0
  67. package/dist/collection/components/controls/verdocs-status-indicator/complete-dark.svg +3 -0
  68. package/dist/collection/components/controls/verdocs-status-indicator/complete-light.svg +3 -0
  69. package/dist/collection/components/controls/verdocs-status-indicator/declined-dark.svg +3 -0
  70. package/dist/collection/components/controls/verdocs-status-indicator/declined-light.svg +3 -0
  71. package/dist/collection/components/controls/verdocs-status-indicator/in-progress-dark.svg +3 -0
  72. package/dist/collection/components/controls/verdocs-status-indicator/in-progress-light.svg +3 -0
  73. package/dist/collection/components/controls/verdocs-status-indicator/opened-dark.svg +4 -0
  74. package/dist/collection/components/controls/verdocs-status-indicator/opened-light.svg +4 -0
  75. package/dist/collection/components/controls/verdocs-status-indicator/pending-dark.svg +3 -0
  76. package/dist/collection/components/controls/verdocs-status-indicator/pending-light.svg +3 -0
  77. package/dist/collection/components/controls/verdocs-status-indicator/recipient-flow.js +218 -0
  78. package/dist/collection/components/controls/verdocs-status-indicator/signed-dark.svg +4 -0
  79. package/dist/collection/components/controls/verdocs-status-indicator/signed-light.svg +4 -0
  80. package/dist/collection/components/controls/verdocs-status-indicator/some-signed-dark.svg +3 -0
  81. package/dist/collection/components/controls/verdocs-status-indicator/some-signed-light.svg +3 -0
  82. package/dist/collection/components/controls/verdocs-status-indicator/submitted-dark.svg +3 -0
  83. package/dist/collection/components/controls/verdocs-status-indicator/submitted-light.svg +3 -0
  84. package/dist/collection/components/controls/verdocs-status-indicator/verdocs-status-indicator.css +48 -0
  85. package/dist/collection/components/controls/verdocs-status-indicator/verdocs-status-indicator.js +344 -0
  86. package/dist/collection/components/controls/verdocs-status-indicator/verdocs-status-indicator.stories.js +69 -0
  87. package/dist/collection/components/{elements/template-card/actions-icon.svg → controls/verdocs-template-card/actions.svg} +0 -0
  88. package/dist/collection/components/{elements/template-card/email-icon.svg → controls/verdocs-template-card/email.svg} +0 -0
  89. package/dist/collection/components/{elements/template-card/pages-icon.svg → controls/verdocs-template-card/pages.svg} +0 -0
  90. package/dist/collection/components/controls/verdocs-template-card/star.svg +10 -0
  91. package/dist/collection/components/controls/verdocs-template-card/verdocs-template-card.css +62 -0
  92. package/dist/collection/components/controls/verdocs-template-card/verdocs-template-card.js +58 -0
  93. package/dist/collection/components/controls/verdocs-template-card/verdocs-template-card.stories.js +49 -0
  94. package/dist/collection/components/controls/verdocs-template-tags/verdocs-template-tags.css +17 -0
  95. package/dist/collection/components/controls/verdocs-template-tags/verdocs-template-tags.js +34 -0
  96. package/dist/collection/components/controls/verdocs-template-tags/verdocs-template-tags.stories.js +10 -0
  97. package/dist/collection/components/controls/verdocs-text-input/test/verdocs-text-input.js +8 -0
  98. package/dist/collection/components/controls/verdocs-text-input/verdocs-text-input.css +28 -0
  99. package/dist/collection/components/controls/verdocs-text-input/verdocs-text-input.js +224 -0
  100. package/dist/collection/components/controls/verdocs-text-input/verdocs-text-input.stories.js +31 -0
  101. package/dist/collection/components/controls/{toggle-icon-buttons/grid-view.svg → verdocs-toggle/grid.svg} +0 -0
  102. package/dist/collection/components/controls/{toggle-icon-buttons/list-view.svg → verdocs-toggle/list.svg} +0 -0
  103. package/dist/collection/components/controls/verdocs-toggle/verdocs-toggle.css +52 -0
  104. package/dist/collection/components/controls/{toggle-icon-buttons/toggle-icon-buttons.js → verdocs-toggle/verdocs-toggle.js} +11 -7
  105. package/dist/collection/components/controls/{toggle-icon-buttons/toggle-icon-buttons.stories.js → verdocs-toggle/verdocs-toggle.stories.js} +12 -12
  106. package/dist/collection/components/dialogs/verdocs-initial-dialog/verdocs-initial-dialog.css +85 -0
  107. package/dist/collection/components/dialogs/verdocs-initial-dialog/verdocs-initial-dialog.js +329 -0
  108. package/dist/collection/components/dialogs/verdocs-initial-dialog/verdocs-initial-dialog.stories.js +18 -0
  109. package/dist/collection/components/dialogs/verdocs-kba-dialog/question.svg +4 -0
  110. package/dist/collection/components/dialogs/verdocs-kba-dialog/verdocs-kba-dialog.css +95 -0
  111. package/dist/collection/components/dialogs/verdocs-kba-dialog/verdocs-kba-dialog.js +292 -0
  112. package/dist/collection/components/dialogs/verdocs-kba-dialog/verdocs-kba-dialog.stories.js +36 -0
  113. package/dist/collection/components/dialogs/verdocs-ok-dialog/verdocs-ok-dialog.css +47 -0
  114. package/dist/collection/components/dialogs/verdocs-ok-dialog/verdocs-ok-dialog.js +146 -0
  115. package/dist/collection/components/dialogs/verdocs-ok-dialog/verdocs-ok-dialog.stories.js +20 -0
  116. package/dist/collection/components/dialogs/verdocs-signature-dialog/verdocs-signature-dialog.css +85 -0
  117. package/dist/collection/components/dialogs/verdocs-signature-dialog/verdocs-signature-dialog.js +325 -0
  118. package/dist/collection/components/dialogs/verdocs-signature-dialog/verdocs-signature-dialog.stories.js +18 -0
  119. package/dist/collection/components/dialogs/verdocs-upload-dialog/paperclip.svg +3 -0
  120. package/dist/collection/components/dialogs/verdocs-upload-dialog/trash.svg +3 -0
  121. package/dist/collection/components/dialogs/verdocs-upload-dialog/verdocs-upload-dialog.css +98 -0
  122. package/dist/collection/components/dialogs/verdocs-upload-dialog/verdocs-upload-dialog.js +163 -0
  123. package/dist/collection/components/dialogs/verdocs-upload-dialog/verdocs-upload-dialog.stories.js +18 -0
  124. package/dist/collection/components/elements/verdocs-field-attachment/paperclip.svg +3 -0
  125. package/dist/collection/components/elements/verdocs-field-attachment/verdocs-field-attachment.css +21 -0
  126. package/dist/collection/components/elements/verdocs-field-attachment/verdocs-field-attachment.js +163 -0
  127. package/dist/collection/components/elements/verdocs-field-attachment/verdocs-field-attachment.stories.js +8 -0
  128. package/dist/collection/components/elements/verdocs-field-checkbox-group/verdocs-field-checkbox.css +41 -0
  129. package/dist/collection/components/elements/verdocs-field-checkbox-group/verdocs-field-checkbox.js +131 -0
  130. package/dist/collection/components/elements/verdocs-field-checkbox-group/verdocs-field-checkbox.stories.js +11 -0
  131. package/dist/collection/components/elements/verdocs-field-date/verdocs-field-date.css +294 -0
  132. package/dist/collection/components/elements/verdocs-field-date/verdocs-field-date.js +245 -0
  133. package/dist/collection/components/elements/verdocs-field-date/verdocs-field-date.stories.js +31 -0
  134. package/dist/collection/components/elements/verdocs-field-dropdown/verdocs-field-dropdown.css +40 -0
  135. package/dist/collection/components/elements/verdocs-field-dropdown/verdocs-field-dropdown.js +216 -0
  136. package/dist/collection/components/elements/verdocs-field-dropdown/verdocs-field-dropdown.stories.js +14 -0
  137. package/dist/collection/components/elements/verdocs-field-initial/verdocs-field-initial.css +38 -0
  138. package/dist/collection/components/elements/verdocs-field-initial/verdocs-field-initial.js +155 -0
  139. package/dist/collection/components/elements/verdocs-field-initial/verdocs-field-initial.stories.js +10 -0
  140. package/dist/collection/components/elements/verdocs-field-payment/verdocs-field-payment.css +56 -0
  141. package/dist/collection/components/elements/verdocs-field-payment/verdocs-field-payment.js +363 -0
  142. package/dist/collection/components/elements/verdocs-field-payment/verdocs-field-payment.stories.js +8 -0
  143. package/dist/collection/components/elements/verdocs-field-radio-button-group/verdocs-field-radio-button.css +58 -0
  144. package/dist/collection/components/elements/verdocs-field-radio-button-group/verdocs-field-radio-button.js +174 -0
  145. package/dist/collection/components/elements/verdocs-field-radio-button-group/verdocs-field-radio-button.stories.js +13 -0
  146. package/dist/collection/components/elements/verdocs-field-signature/verdocs-field-signature.css +39 -0
  147. package/dist/collection/components/elements/verdocs-field-signature/verdocs-field-signature.js +155 -0
  148. package/dist/collection/components/elements/verdocs-field-signature/verdocs-field-signature.stories.js +10 -0
  149. package/dist/collection/components/elements/verdocs-field-textarea/verdocs-field-textarea.css +32 -0
  150. package/dist/collection/components/elements/verdocs-field-textarea/verdocs-field-textarea.js +233 -0
  151. package/dist/collection/components/elements/verdocs-field-textarea/verdocs-field-textarea.stories.js +14 -0
  152. package/dist/collection/components/elements/verdocs-field-textbox/verdocs-field-textbox.css +32 -0
  153. package/dist/collection/components/elements/verdocs-field-textbox/verdocs-field-textbox.js +233 -0
  154. package/dist/collection/components/elements/verdocs-field-textbox/verdocs-field-textbox.stories.js +14 -0
  155. package/dist/collection/components/elements/{search-quick-functions → verdocs-quick-functions}/document-icon.svg +0 -0
  156. package/dist/collection/components/elements/{search-quick-functions → verdocs-quick-functions}/template-icon.svg +0 -0
  157. package/dist/collection/components/elements/{search-quick-functions/search-quick-functions.css → verdocs-quick-functions/verdocs-quick-functions.css} +5 -5
  158. package/dist/collection/components/elements/{search-quick-functions/search-quick-functions.js → verdocs-quick-functions/verdocs-quick-functions.js} +12 -10
  159. package/dist/collection/components/elements/verdocs-quick-functions/verdocs-quick-functions.stories.js +15 -0
  160. package/dist/collection/components/elements/{search-starred → verdocs-search-activity}/document-icon.svg +0 -0
  161. package/dist/collection/components/elements/{search-starred/search-starred.css → verdocs-search-activity/verdocs-search-activity.css} +12 -12
  162. package/dist/collection/components/elements/verdocs-search-activity/verdocs-search-activity.js +168 -0
  163. package/dist/collection/components/elements/verdocs-search-activity/verdocs-search-activity.stories.js +14 -0
  164. package/dist/collection/components/elements/{search-box → verdocs-search-box}/close.svg +0 -0
  165. package/dist/collection/components/elements/{search-box → verdocs-search-box}/search.svg +0 -0
  166. package/dist/collection/components/elements/{search-box/search-box.css → verdocs-search-box/verdocs-search-box.css} +9 -9
  167. package/dist/collection/components/elements/{search-box/search-box.js → verdocs-search-box/verdocs-search-box.js} +17 -15
  168. package/dist/collection/components/elements/{search-box/search-box.stories.js → verdocs-search-box/verdocs-search-box.stories.js} +3 -3
  169. package/dist/collection/components/elements/verdocs-search-tabs/verdocs-search-tabs.css +3 -0
  170. package/dist/collection/components/elements/verdocs-search-tabs/verdocs-search-tabs.js +19 -0
  171. package/dist/collection/components/elements/{search-tabs/search-tabs.stories.js → verdocs-search-tabs/verdocs-search-tabs.stories.js} +3 -3
  172. package/dist/collection/components/embeds/verdocs-auth/verdocs-auth.css +58 -0
  173. package/dist/collection/components/embeds/verdocs-auth/verdocs-auth.js +241 -0
  174. package/dist/collection/components/embeds/verdocs-auth/verdocs-auth.stories.js +19 -0
  175. package/dist/collection/components/embeds/verdocs-search/verdocs-search.css +23 -0
  176. package/dist/collection/components/embeds/verdocs-search/verdocs-search.js +19 -0
  177. package/dist/collection/components/embeds/{search-embed/search-embed.stories.js → verdocs-search/verdocs-search.stories.js} +2 -2
  178. package/dist/collection/components/embeds/verdocs-sign/verdocs-sign.css +124 -0
  179. package/dist/collection/components/embeds/verdocs-sign/verdocs-sign.js +405 -0
  180. package/dist/collection/components/embeds/verdocs-sign/verdocs-sign.stories.js +19 -0
  181. package/dist/collection/components/embeds/verdocs-view/verdocs-view.css +51 -0
  182. package/dist/collection/components/embeds/verdocs-view/verdocs-view.js +297 -0
  183. package/dist/collection/components/embeds/verdocs-view/verdocs-view.stories.js +21 -0
  184. package/dist/components/Auth.js +157 -0
  185. package/dist/components/Token.js +2458 -0
  186. package/dist/components/buffer-es6.js +1985 -0
  187. package/dist/components/index.d.ts +53 -0
  188. package/dist/components/index.js +37 -0
  189. package/dist/components/index2.js +1 -0
  190. package/dist/{cjs/dropdown-menu.cjs.entry.js → components/index3.js} +307 -140
  191. package/dist/components/index4.js +47 -0
  192. package/dist/components/verdocs-auth.d.ts +11 -0
  193. package/dist/components/verdocs-auth.js +347 -0
  194. package/dist/components/verdocs-button.d.ts +11 -0
  195. package/dist/components/verdocs-button.js +6 -0
  196. package/dist/components/verdocs-button2.js +68 -0
  197. package/dist/components/verdocs-dropdown.d.ts +11 -0
  198. package/dist/components/verdocs-dropdown.js +6 -0
  199. package/dist/components/verdocs-dropdown2.js +94 -0
  200. package/dist/components/verdocs-field-attachment.d.ts +11 -0
  201. package/dist/components/verdocs-field-attachment.js +6 -0
  202. package/dist/components/verdocs-field-attachment2.js +88 -0
  203. package/dist/components/verdocs-field-checkbox.d.ts +11 -0
  204. package/dist/components/verdocs-field-checkbox.js +6 -0
  205. package/dist/components/verdocs-field-checkbox2.js +55 -0
  206. package/dist/components/verdocs-field-date.d.ts +11 -0
  207. package/dist/components/verdocs-field-date.js +6 -0
  208. package/dist/components/verdocs-field-date2.js +2987 -0
  209. package/dist/components/verdocs-field-dropdown.d.ts +11 -0
  210. package/dist/components/verdocs-field-dropdown.js +6 -0
  211. package/dist/components/verdocs-field-dropdown2.js +78 -0
  212. package/dist/components/verdocs-field-initial.d.ts +11 -0
  213. package/dist/components/verdocs-field-initial.js +6 -0
  214. package/dist/components/verdocs-field-initial2.js +86 -0
  215. package/dist/components/verdocs-field-payment.d.ts +11 -0
  216. package/dist/components/verdocs-field-payment.js +6 -0
  217. package/dist/components/verdocs-field-payment2.js +114 -0
  218. package/dist/components/verdocs-field-radio-button.d.ts +11 -0
  219. package/dist/components/verdocs-field-radio-button.js +6 -0
  220. package/dist/components/verdocs-field-radio-button2.js +66 -0
  221. package/dist/components/verdocs-field-signature.d.ts +11 -0
  222. package/dist/components/verdocs-field-signature.js +6 -0
  223. package/dist/components/verdocs-field-signature2.js +86 -0
  224. package/dist/components/verdocs-field-textarea.d.ts +11 -0
  225. package/dist/components/verdocs-field-textarea.js +6 -0
  226. package/dist/components/verdocs-field-textarea2.js +82 -0
  227. package/dist/components/verdocs-field-textbox.d.ts +11 -0
  228. package/dist/components/verdocs-field-textbox.js +6 -0
  229. package/dist/components/verdocs-field-textbox2.js +82 -0
  230. package/dist/components/verdocs-initial-dialog.d.ts +11 -0
  231. package/dist/components/verdocs-initial-dialog.js +6 -0
  232. package/dist/components/verdocs-initial-dialog2.js +272 -0
  233. package/dist/components/verdocs-kba-dialog.d.ts +11 -0
  234. package/dist/components/verdocs-kba-dialog.js +112 -0
  235. package/dist/components/verdocs-loader.d.ts +11 -0
  236. package/dist/components/verdocs-loader.js +6 -0
  237. package/dist/components/verdocs-loader2.js +30 -0
  238. package/dist/components/verdocs-ok-dialog.d.ts +11 -0
  239. package/dist/components/verdocs-ok-dialog.js +6 -0
  240. package/dist/components/verdocs-ok-dialog2.js +70 -0
  241. package/dist/components/verdocs-organization-card.d.ts +11 -0
  242. package/dist/components/verdocs-organization-card.js +38 -0
  243. package/dist/components/verdocs-quick-functions.d.ts +11 -0
  244. package/dist/components/verdocs-quick-functions.js +45 -0
  245. package/dist/components/verdocs-search-activity.d.ts +11 -0
  246. package/dist/components/verdocs-search-activity.js +6 -0
  247. package/dist/components/verdocs-search-activity2.js +281 -0
  248. package/dist/components/verdocs-search-box.d.ts +11 -0
  249. package/dist/components/verdocs-search-box.js +6 -0
  250. package/dist/components/verdocs-search-box2.js +75 -0
  251. package/dist/components/verdocs-search-tabs.d.ts +11 -0
  252. package/dist/components/verdocs-search-tabs.js +36 -0
  253. package/dist/components/verdocs-search.d.ts +11 -0
  254. package/dist/components/verdocs-search.js +45 -0
  255. package/dist/components/verdocs-sign.d.ts +11 -0
  256. package/dist/components/verdocs-sign.js +2135 -0
  257. package/dist/components/verdocs-signature-dialog.d.ts +11 -0
  258. package/dist/components/verdocs-signature-dialog.js +6 -0
  259. package/dist/components/verdocs-signature-dialog2.js +268 -0
  260. package/dist/components/verdocs-status-indicator.d.ts +11 -0
  261. package/dist/components/verdocs-status-indicator.js +7635 -0
  262. package/dist/components/verdocs-template-card.d.ts +11 -0
  263. package/dist/components/verdocs-template-card.js +54 -0
  264. package/dist/components/verdocs-template-tags.d.ts +11 -0
  265. package/dist/components/verdocs-template-tags.js +36 -0
  266. package/dist/components/verdocs-text-input.d.ts +11 -0
  267. package/dist/components/verdocs-text-input.js +6 -0
  268. package/dist/components/verdocs-text-input2.js +81 -0
  269. package/dist/components/verdocs-toggle.d.ts +11 -0
  270. package/dist/components/verdocs-toggle.js +53 -0
  271. package/dist/components/verdocs-upload-dialog.d.ts +11 -0
  272. package/dist/components/verdocs-upload-dialog.js +6 -0
  273. package/dist/components/verdocs-upload-dialog2.js +144 -0
  274. package/dist/components/verdocs-view.d.ts +11 -0
  275. package/dist/components/verdocs-view.js +6 -0
  276. package/dist/components/verdocs-view2.js +16144 -0
  277. package/dist/custom-elements.json +830 -0
  278. package/dist/docs.d.ts +3 -0
  279. package/dist/docs.json +3026 -334
  280. package/dist/esm/Auth-4b21fced.js +157 -0
  281. package/dist/{cjs/Content-e1c04dfa.js → esm/Token-29eea56d.js} +912 -406
  282. package/dist/esm/app-globals-0f993ce5.js +3 -0
  283. package/dist/esm/buffer-es6-5cef4368.js +1985 -0
  284. package/dist/esm/css-shim-60f618b9.js +4 -0
  285. package/dist/esm/dom-4eeb3fee.js +73 -0
  286. package/dist/esm/{dropdown-menu.entry.js → index-432c65a6.js} +307 -136
  287. package/dist/esm/index-97ec070b.js +47 -0
  288. package/dist/esm/index-ddbd60b5.js +3059 -0
  289. package/dist/esm/index-ef172650.js +1 -0
  290. package/dist/esm/loader.js +19 -3
  291. package/dist/esm/polyfills/css-shim.js +1 -1
  292. package/dist/esm/shadow-css-02866686.js +387 -0
  293. package/dist/esm/verdocs-auth.entry.js +302 -0
  294. package/dist/esm/verdocs-button.entry.js +45 -0
  295. package/dist/esm/verdocs-dropdown.entry.js +76 -0
  296. package/dist/esm/verdocs-field-attachment.entry.js +55 -0
  297. package/dist/esm/verdocs-field-checkbox.entry.js +35 -0
  298. package/dist/esm/verdocs-field-date.entry.js +2964 -0
  299. package/dist/esm/verdocs-field-dropdown.entry.js +55 -0
  300. package/dist/esm/verdocs-field-initial.entry.js +48 -0
  301. package/dist/esm/verdocs-field-payment.entry.js +82 -0
  302. package/dist/esm/verdocs-field-radio-button.entry.js +44 -0
  303. package/dist/esm/verdocs-field-signature.entry.js +48 -0
  304. package/dist/esm/verdocs-field-textarea.entry.js +59 -0
  305. package/dist/esm/verdocs-field-textbox.entry.js +59 -0
  306. package/dist/esm/verdocs-initial-dialog.entry.js +239 -0
  307. package/dist/esm/verdocs-kba-dialog.entry.js +77 -0
  308. package/dist/esm/verdocs-loader.entry.js +15 -0
  309. package/dist/esm/verdocs-ok-dialog.entry.js +44 -0
  310. package/dist/esm/verdocs-organization-card.entry.js +18 -0
  311. package/dist/esm/verdocs-quick-functions.entry.js +27 -0
  312. package/dist/esm/verdocs-search-activity.entry.js +259 -0
  313. package/dist/esm/{search-box.entry.js → verdocs-search-box.entry.js} +6 -6
  314. package/dist/esm/verdocs-search-tabs.entry.js +16 -0
  315. package/dist/esm/verdocs-search.entry.js +15 -0
  316. package/dist/esm/verdocs-sign.entry.js +1995 -0
  317. package/dist/esm/verdocs-signature-dialog.entry.js +235 -0
  318. package/dist/esm/verdocs-status-indicator.entry.js +7611 -0
  319. package/dist/esm/verdocs-template-card.entry.js +34 -0
  320. package/dist/esm/verdocs-template-tags.entry.js +16 -0
  321. package/dist/esm/verdocs-text-input.entry.js +58 -0
  322. package/dist/esm/verdocs-toggle.entry.js +32 -0
  323. package/dist/esm/verdocs-upload-dialog.entry.js +119 -0
  324. package/dist/esm/verdocs-view.entry.js +16118 -0
  325. package/dist/esm/verdocs-web-sdk.js +117 -5
  326. package/dist/esm-es5/Auth-4b21fced.js +1 -0
  327. package/dist/esm-es5/Token-29eea56d.js +1 -0
  328. package/dist/esm-es5/app-globals-0f993ce5.js +1 -0
  329. package/dist/esm-es5/buffer-es6-5cef4368.js +7 -0
  330. package/dist/esm-es5/css-shim-60f618b9.js +1 -0
  331. package/dist/esm-es5/dom-4eeb3fee.js +21 -0
  332. package/dist/esm-es5/index-432c65a6.js +1 -0
  333. package/dist/esm-es5/index-97ec070b.js +1 -0
  334. package/dist/esm-es5/index-ddbd60b5.js +2 -0
  335. package/dist/esm-es5/index-ef172650.js +1 -0
  336. package/dist/esm-es5/loader.js +1 -1
  337. package/dist/esm-es5/shadow-css-02866686.js +12 -0
  338. package/dist/esm-es5/verdocs-auth.entry.js +1 -0
  339. package/dist/esm-es5/verdocs-button.entry.js +1 -0
  340. package/dist/esm-es5/verdocs-dropdown.entry.js +1 -0
  341. package/dist/esm-es5/verdocs-field-attachment.entry.js +1 -0
  342. package/dist/esm-es5/verdocs-field-checkbox.entry.js +1 -0
  343. package/dist/esm-es5/verdocs-field-date.entry.js +1 -0
  344. package/dist/esm-es5/verdocs-field-dropdown.entry.js +1 -0
  345. package/dist/esm-es5/verdocs-field-initial.entry.js +1 -0
  346. package/dist/esm-es5/verdocs-field-payment.entry.js +1 -0
  347. package/dist/esm-es5/verdocs-field-radio-button.entry.js +1 -0
  348. package/dist/esm-es5/verdocs-field-signature.entry.js +1 -0
  349. package/dist/esm-es5/verdocs-field-textarea.entry.js +1 -0
  350. package/dist/esm-es5/verdocs-field-textbox.entry.js +1 -0
  351. package/dist/esm-es5/verdocs-initial-dialog.entry.js +1 -0
  352. package/dist/esm-es5/verdocs-kba-dialog.entry.js +1 -0
  353. package/dist/esm-es5/verdocs-loader.entry.js +1 -0
  354. package/dist/esm-es5/verdocs-ok-dialog.entry.js +1 -0
  355. package/dist/esm-es5/verdocs-organization-card.entry.js +1 -0
  356. package/dist/esm-es5/verdocs-quick-functions.entry.js +1 -0
  357. package/dist/esm-es5/verdocs-search-activity.entry.js +1 -0
  358. package/dist/esm-es5/verdocs-search-box.entry.js +1 -0
  359. package/dist/esm-es5/verdocs-search-tabs.entry.js +1 -0
  360. package/dist/esm-es5/verdocs-search.entry.js +1 -0
  361. package/dist/esm-es5/verdocs-sign.entry.js +1 -0
  362. package/dist/esm-es5/verdocs-signature-dialog.entry.js +1 -0
  363. package/dist/esm-es5/verdocs-status-indicator.entry.js +11 -0
  364. package/dist/esm-es5/verdocs-template-card.entry.js +1 -0
  365. package/dist/esm-es5/verdocs-template-tags.entry.js +1 -0
  366. package/dist/esm-es5/verdocs-text-input.entry.js +1 -0
  367. package/dist/esm-es5/verdocs-toggle.entry.js +1 -0
  368. package/dist/esm-es5/verdocs-upload-dialog.entry.js +1 -0
  369. package/dist/esm-es5/verdocs-view.entry.js +23 -0
  370. package/dist/esm-es5/verdocs-web-sdk.js +1 -1
  371. package/dist/types/components/controls/verdocs-button/verdocs-button.d.ts +52 -0
  372. package/dist/types/components/controls/verdocs-button/verdocs-button.stories.d.ts +12 -0
  373. package/dist/types/components/controls/{dropdown-menu/dropdown-menu.d.ts → verdocs-dropdown/verdocs-dropdown.d.ts} +3 -20
  374. package/dist/types/components/{elements/search-recent/search-recent.stories.d.ts → controls/verdocs-dropdown/verdocs-dropdown.stories.d.ts} +3 -3
  375. package/dist/types/components/controls/verdocs-loader/verdocs-loader.d.ts +6 -0
  376. package/dist/types/components/controls/verdocs-loader/verdocs-loader.stories.d.ts +4 -0
  377. package/dist/types/components/controls/verdocs-organization-card/verdocs-organization-card.d.ts +11 -0
  378. package/dist/types/components/controls/verdocs-organization-card/verdocs-organization-card.stories.d.ts +6 -0
  379. package/dist/types/components/controls/verdocs-status-indicator/recipient-flow.d.ts +4 -0
  380. package/dist/types/components/controls/verdocs-status-indicator/verdocs-status-indicator.d.ts +42 -0
  381. package/dist/types/components/controls/verdocs-status-indicator/verdocs-status-indicator.stories.d.ts +9 -0
  382. package/dist/types/components/controls/verdocs-template-card/verdocs-template-card.d.ts +11 -0
  383. package/dist/types/components/{elements/template-card/template-card.stories.d.ts → controls/verdocs-template-card/verdocs-template-card.stories.d.ts} +1 -2
  384. package/dist/types/components/controls/verdocs-template-tags/verdocs-template-tags.d.ts +10 -0
  385. package/dist/types/components/controls/{tags-indicator/tags-indicator.stories.d.ts → verdocs-template-tags/verdocs-template-tags.stories.d.ts} +1 -1
  386. package/dist/types/components/controls/verdocs-text-input/test/verdocs-text-input.d.ts +1 -0
  387. package/dist/types/components/controls/verdocs-text-input/verdocs-text-input.d.ts +54 -0
  388. package/dist/types/components/controls/verdocs-text-input/verdocs-text-input.stories.d.ts +13 -0
  389. package/dist/types/components/controls/{toggle-icon-buttons/toggle-icon-buttons.d.ts → verdocs-toggle/verdocs-toggle.d.ts} +2 -2
  390. package/dist/types/components/controls/{toggle-icon-buttons/toggle-icon-buttons.stories.d.ts → verdocs-toggle/verdocs-toggle.stories.d.ts} +1 -1
  391. package/dist/types/components/dialogs/verdocs-initial-dialog/verdocs-initial-dialog.d.ts +36 -0
  392. package/dist/types/components/dialogs/verdocs-initial-dialog/verdocs-initial-dialog.stories.d.ts +8 -0
  393. package/dist/types/components/dialogs/verdocs-kba-dialog/verdocs-kba-dialog.d.ts +57 -0
  394. package/dist/types/components/dialogs/verdocs-kba-dialog/verdocs-kba-dialog.stories.d.ts +15 -0
  395. package/dist/types/components/dialogs/verdocs-ok-dialog/verdocs-ok-dialog.d.ts +32 -0
  396. package/dist/types/components/dialogs/verdocs-ok-dialog/verdocs-ok-dialog.stories.d.ts +10 -0
  397. package/dist/types/components/dialogs/verdocs-signature-dialog/verdocs-signature-dialog.d.ts +36 -0
  398. package/dist/types/components/dialogs/verdocs-signature-dialog/verdocs-signature-dialog.stories.d.ts +8 -0
  399. package/dist/types/components/dialogs/verdocs-upload-dialog/verdocs-upload-dialog.d.ts +34 -0
  400. package/dist/types/components/dialogs/verdocs-upload-dialog/verdocs-upload-dialog.stories.d.ts +8 -0
  401. package/dist/types/components/elements/verdocs-field-attachment/verdocs-field-attachment.d.ts +33 -0
  402. package/dist/types/components/elements/verdocs-field-attachment/verdocs-field-attachment.stories.d.ts +4 -0
  403. package/dist/types/components/elements/verdocs-field-checkbox-group/verdocs-field-checkbox.d.ts +31 -0
  404. package/dist/types/components/elements/verdocs-field-checkbox-group/verdocs-field-checkbox.stories.d.ts +7 -0
  405. package/dist/types/components/elements/verdocs-field-date/verdocs-field-date.d.ts +53 -0
  406. package/dist/types/components/elements/verdocs-field-date/verdocs-field-date.stories.d.ts +10 -0
  407. package/dist/types/components/elements/verdocs-field-dropdown/verdocs-field-dropdown.d.ts +48 -0
  408. package/dist/types/components/elements/verdocs-field-dropdown/verdocs-field-dropdown.stories.d.ts +10 -0
  409. package/dist/types/components/elements/verdocs-field-initial/verdocs-field-initial.d.ts +31 -0
  410. package/dist/types/components/elements/verdocs-field-initial/verdocs-field-initial.stories.d.ts +6 -0
  411. package/dist/types/components/elements/verdocs-field-payment/verdocs-field-payment.d.ts +53 -0
  412. package/dist/types/components/elements/verdocs-field-payment/verdocs-field-payment.stories.d.ts +4 -0
  413. package/dist/types/components/elements/verdocs-field-radio-button-group/verdocs-field-radio-button.d.ts +38 -0
  414. package/dist/types/components/elements/verdocs-field-radio-button-group/verdocs-field-radio-button.stories.d.ts +9 -0
  415. package/dist/types/components/elements/verdocs-field-signature/verdocs-field-signature.d.ts +31 -0
  416. package/dist/types/components/elements/verdocs-field-signature/verdocs-field-signature.stories.d.ts +6 -0
  417. package/dist/types/components/elements/verdocs-field-textarea/verdocs-field-textarea.d.ts +52 -0
  418. package/dist/types/components/elements/verdocs-field-textarea/verdocs-field-textarea.stories.d.ts +10 -0
  419. package/dist/types/components/elements/verdocs-field-textbox/verdocs-field-textbox.d.ts +52 -0
  420. package/dist/types/components/elements/{org-popup/org-popup.stories.d.ts → verdocs-field-textbox/verdocs-field-textbox.stories.d.ts} +6 -4
  421. package/dist/types/components/elements/{search-quick-functions/search-quick-functions.d.ts → verdocs-quick-functions/verdocs-quick-functions.d.ts} +4 -1
  422. package/dist/types/components/elements/{search-quick-functions/search-quick-functions.stories.d.ts → verdocs-quick-functions/verdocs-quick-functions.stories.d.ts} +1 -1
  423. package/dist/types/components/elements/verdocs-search-activity/verdocs-search-activity.d.ts +28 -0
  424. package/dist/types/components/elements/{search-starred/search-starred.stories.d.ts → verdocs-search-activity/verdocs-search-activity.stories.d.ts} +2 -2
  425. package/dist/types/components/elements/{search-box/search-box.d.ts → verdocs-search-box/verdocs-search-box.d.ts} +4 -1
  426. package/dist/types/components/elements/{search-box/search-box.stories.d.ts → verdocs-search-box/verdocs-search-box.stories.d.ts} +1 -1
  427. package/dist/types/components/elements/{search-tabs/search-tabs.d.ts → verdocs-search-tabs/verdocs-search-tabs.d.ts} +1 -1
  428. package/dist/types/components/elements/{search-tabs/search-tabs.stories.d.ts → verdocs-search-tabs/verdocs-search-tabs.stories.d.ts} +1 -1
  429. package/dist/types/components/embeds/verdocs-auth/verdocs-auth.d.ts +69 -0
  430. package/dist/types/components/embeds/verdocs-auth/verdocs-auth.stories.d.ts +9 -0
  431. package/dist/types/components/embeds/verdocs-search/verdocs-search.d.ts +3 -0
  432. package/dist/types/components/embeds/{search-embed/search-embed.stories.d.ts → verdocs-search/verdocs-search.stories.d.ts} +1 -1
  433. package/dist/types/components/embeds/verdocs-sign/verdocs-sign.d.ts +46 -0
  434. package/dist/types/components/embeds/verdocs-sign/verdocs-sign.stories.d.ts +9 -0
  435. package/dist/types/components/embeds/verdocs-view/verdocs-view.d.ts +77 -0
  436. package/dist/types/components/{controls/document-status-indicator/document-status-indicator.stories.d.ts → embeds/verdocs-view/verdocs-view.stories.d.ts} +2 -2
  437. package/dist/types/components.d.ts +1387 -253
  438. package/dist/types/stencil-public-runtime.d.ts +6 -4
  439. package/dist/verdocs-web-sdk/Auth-4b21fced.js +157 -0
  440. package/dist/verdocs-web-sdk/Auth-82e38539.system.js +1 -0
  441. package/dist/{esm/Content-97cad4ea.js → verdocs-web-sdk/Token-29eea56d.js} +914 -406
  442. package/dist/verdocs-web-sdk/Token-c1cf309e.system.js +1 -0
  443. package/dist/verdocs-web-sdk/app-globals-0f993ce5.js +3 -0
  444. package/dist/verdocs-web-sdk/app-globals-497eb362.system.js +1 -0
  445. package/dist/verdocs-web-sdk/buffer-es6-5cef4368.js +1985 -0
  446. package/dist/verdocs-web-sdk/buffer-es6-aa11181b.system.js +7 -0
  447. package/dist/verdocs-web-sdk/css-shim-60f618b9.js +4 -0
  448. package/dist/verdocs-web-sdk/css-shim-e41ceccc.system.js +1 -0
  449. package/dist/verdocs-web-sdk/dom-4eeb3fee.js +73 -0
  450. package/dist/verdocs-web-sdk/dom-89b5deb7.system.js +21 -0
  451. package/dist/verdocs-web-sdk/index-027b383e.system.js +1 -0
  452. package/dist/verdocs-web-sdk/index-06e036a1.system.js +1 -0
  453. package/dist/verdocs-web-sdk/index-432c65a6.js +1974 -0
  454. package/dist/verdocs-web-sdk/index-5d49316f.system.js +1 -0
  455. package/dist/verdocs-web-sdk/index-6465280a.system.js +2 -0
  456. package/dist/verdocs-web-sdk/index-97ec070b.js +47 -0
  457. package/dist/verdocs-web-sdk/index-ddbd60b5.js +3059 -0
  458. package/dist/verdocs-web-sdk/index-ef172650.js +1 -0
  459. package/dist/verdocs-web-sdk/index.esm.js +1 -0
  460. package/dist/verdocs-web-sdk/{p-50ea2036.system.js → index.system.js} +0 -0
  461. package/dist/verdocs-web-sdk/shadow-css-02866686.js +387 -0
  462. package/dist/verdocs-web-sdk/shadow-css-6207e159.system.js +13 -0
  463. package/dist/verdocs-web-sdk/verdocs-auth.entry.js +302 -0
  464. package/dist/verdocs-web-sdk/verdocs-auth.system.entry.js +1 -0
  465. package/dist/verdocs-web-sdk/verdocs-button.entry.js +45 -0
  466. package/dist/verdocs-web-sdk/verdocs-button.system.entry.js +1 -0
  467. package/dist/verdocs-web-sdk/verdocs-dropdown.entry.js +76 -0
  468. package/dist/verdocs-web-sdk/verdocs-dropdown.system.entry.js +1 -0
  469. package/dist/verdocs-web-sdk/verdocs-field-attachment.entry.js +55 -0
  470. package/dist/verdocs-web-sdk/verdocs-field-attachment.system.entry.js +1 -0
  471. package/dist/verdocs-web-sdk/verdocs-field-checkbox.entry.js +35 -0
  472. package/dist/verdocs-web-sdk/verdocs-field-checkbox.system.entry.js +1 -0
  473. package/dist/verdocs-web-sdk/verdocs-field-date.entry.js +2964 -0
  474. package/dist/verdocs-web-sdk/verdocs-field-date.system.entry.js +1 -0
  475. package/dist/verdocs-web-sdk/verdocs-field-dropdown.entry.js +55 -0
  476. package/dist/verdocs-web-sdk/verdocs-field-dropdown.system.entry.js +1 -0
  477. package/dist/verdocs-web-sdk/verdocs-field-initial.entry.js +48 -0
  478. package/dist/verdocs-web-sdk/verdocs-field-initial.system.entry.js +1 -0
  479. package/dist/verdocs-web-sdk/verdocs-field-payment.entry.js +82 -0
  480. package/dist/verdocs-web-sdk/verdocs-field-payment.system.entry.js +1 -0
  481. package/dist/verdocs-web-sdk/verdocs-field-radio-button.entry.js +44 -0
  482. package/dist/verdocs-web-sdk/verdocs-field-radio-button.system.entry.js +1 -0
  483. package/dist/verdocs-web-sdk/verdocs-field-signature.entry.js +48 -0
  484. package/dist/verdocs-web-sdk/verdocs-field-signature.system.entry.js +1 -0
  485. package/dist/verdocs-web-sdk/verdocs-field-textarea.entry.js +59 -0
  486. package/dist/verdocs-web-sdk/verdocs-field-textarea.system.entry.js +1 -0
  487. package/dist/verdocs-web-sdk/verdocs-field-textbox.entry.js +59 -0
  488. package/dist/verdocs-web-sdk/verdocs-field-textbox.system.entry.js +1 -0
  489. package/dist/verdocs-web-sdk/verdocs-initial-dialog.entry.js +239 -0
  490. package/dist/verdocs-web-sdk/verdocs-initial-dialog.system.entry.js +1 -0
  491. package/dist/verdocs-web-sdk/verdocs-kba-dialog.entry.js +77 -0
  492. package/dist/verdocs-web-sdk/verdocs-kba-dialog.system.entry.js +1 -0
  493. package/dist/verdocs-web-sdk/verdocs-loader.entry.js +15 -0
  494. package/dist/verdocs-web-sdk/verdocs-loader.system.entry.js +1 -0
  495. package/dist/verdocs-web-sdk/verdocs-ok-dialog.entry.js +44 -0
  496. package/dist/verdocs-web-sdk/verdocs-ok-dialog.system.entry.js +1 -0
  497. package/dist/verdocs-web-sdk/verdocs-organization-card.entry.js +18 -0
  498. package/dist/verdocs-web-sdk/verdocs-organization-card.system.entry.js +1 -0
  499. package/dist/verdocs-web-sdk/verdocs-quick-functions.entry.js +27 -0
  500. package/dist/verdocs-web-sdk/verdocs-quick-functions.system.entry.js +1 -0
  501. package/dist/verdocs-web-sdk/verdocs-search-activity.entry.js +259 -0
  502. package/dist/verdocs-web-sdk/verdocs-search-activity.system.entry.js +1 -0
  503. package/dist/verdocs-web-sdk/verdocs-search-box.entry.js +56 -0
  504. package/dist/verdocs-web-sdk/verdocs-search-box.system.entry.js +1 -0
  505. package/dist/verdocs-web-sdk/verdocs-search-tabs.entry.js +16 -0
  506. package/dist/verdocs-web-sdk/verdocs-search-tabs.system.entry.js +1 -0
  507. package/dist/verdocs-web-sdk/verdocs-search.entry.js +15 -0
  508. package/dist/verdocs-web-sdk/verdocs-search.system.entry.js +1 -0
  509. package/dist/verdocs-web-sdk/verdocs-sign.entry.js +1995 -0
  510. package/dist/verdocs-web-sdk/verdocs-sign.system.entry.js +1 -0
  511. package/dist/verdocs-web-sdk/verdocs-signature-dialog.entry.js +235 -0
  512. package/dist/verdocs-web-sdk/verdocs-signature-dialog.system.entry.js +1 -0
  513. package/dist/verdocs-web-sdk/verdocs-status-indicator.entry.js +7611 -0
  514. package/dist/verdocs-web-sdk/verdocs-status-indicator.system.entry.js +1 -0
  515. package/dist/verdocs-web-sdk/verdocs-template-card.entry.js +34 -0
  516. package/dist/verdocs-web-sdk/verdocs-template-card.system.entry.js +1 -0
  517. package/dist/verdocs-web-sdk/verdocs-template-tags.entry.js +16 -0
  518. package/dist/verdocs-web-sdk/verdocs-template-tags.system.entry.js +1 -0
  519. package/dist/verdocs-web-sdk/verdocs-text-input.entry.js +58 -0
  520. package/dist/verdocs-web-sdk/verdocs-text-input.system.entry.js +1 -0
  521. package/dist/verdocs-web-sdk/verdocs-toggle.entry.js +32 -0
  522. package/dist/verdocs-web-sdk/verdocs-toggle.system.entry.js +1 -0
  523. package/dist/verdocs-web-sdk/verdocs-upload-dialog.entry.js +119 -0
  524. package/dist/verdocs-web-sdk/verdocs-upload-dialog.system.entry.js +1 -0
  525. package/dist/verdocs-web-sdk/verdocs-view.entry.js +16118 -0
  526. package/dist/verdocs-web-sdk/verdocs-view.system.entry.js +23 -0
  527. package/dist/verdocs-web-sdk/verdocs-web-sdk.css +57 -1
  528. package/dist/verdocs-web-sdk/verdocs-web-sdk.esm.js +129 -1
  529. package/dist/verdocs-web-sdk/verdocs-web-sdk.js +1 -1
  530. package/dist/verdocs-web-sdk/verdocs-web-sdk.system.js +1 -0
  531. package/package.json +42 -35
  532. package/dist/cjs/document-status-indicator.cjs.entry.js +0 -51
  533. package/dist/cjs/index-83ab34ef.js +0 -1640
  534. package/dist/cjs/org-popup.cjs.entry.js +0 -25
  535. package/dist/cjs/pdf-viewer.cjs.entry.js +0 -13677
  536. package/dist/cjs/search-embed.cjs.entry.js +0 -19
  537. package/dist/cjs/search-quick-functions.cjs.entry.js +0 -31
  538. package/dist/cjs/search-recent.cjs.entry.js +0 -39
  539. package/dist/cjs/search-saved.cjs.entry.js +0 -39
  540. package/dist/cjs/search-starred.cjs.entry.js +0 -46
  541. package/dist/cjs/search-tabs.cjs.entry.js +0 -20
  542. package/dist/cjs/tags-indicator.cjs.entry.js +0 -20
  543. package/dist/cjs/template-card.cjs.entry.js +0 -28
  544. package/dist/cjs/toggle-icon-buttons.cjs.entry.js +0 -32
  545. package/dist/collection/api/endpoint.js +0 -1
  546. package/dist/collection/components/controls/document-status-indicator/cancelled-icon.svg +0 -1
  547. package/dist/collection/components/controls/document-status-indicator/declined-icon.svg +0 -1
  548. package/dist/collection/components/controls/document-status-indicator/document-status-indicator.css +0 -23
  549. package/dist/collection/components/controls/document-status-indicator/document-status-indicator.js +0 -70
  550. package/dist/collection/components/controls/document-status-indicator/document-status-indicator.stories.js +0 -12
  551. package/dist/collection/components/controls/document-status-indicator/finished-icon.svg +0 -1
  552. package/dist/collection/components/controls/document-status-indicator/pending-icon.svg +0 -1
  553. package/dist/collection/components/controls/dropdown-menu/dropdown-menu.css +0 -80
  554. package/dist/collection/components/controls/tags-indicator/tags-indicator.css +0 -34
  555. package/dist/collection/components/controls/tags-indicator/tags-indicator.js +0 -55
  556. package/dist/collection/components/controls/tags-indicator/tags-indicator.stories.js +0 -13
  557. package/dist/collection/components/controls/toggle-icon-buttons/toggle-icon-buttons.css +0 -64
  558. package/dist/collection/components/elements/org-popup/org-popup.js +0 -80
  559. package/dist/collection/components/elements/org-popup/org-popup.stories.js +0 -20
  560. package/dist/collection/components/elements/search-quick-functions/search-quick-functions.stories.js +0 -15
  561. package/dist/collection/components/elements/search-recent/search-icon.svg +0 -1
  562. package/dist/collection/components/elements/search-recent/search-recent.css +0 -65
  563. package/dist/collection/components/elements/search-recent/search-recent.js +0 -86
  564. package/dist/collection/components/elements/search-recent/search-recent.stories.js +0 -12
  565. package/dist/collection/components/elements/search-saved/search-icon.svg +0 -1
  566. package/dist/collection/components/elements/search-saved/search-saved.css +0 -56
  567. package/dist/collection/components/elements/search-saved/search-saved.js +0 -86
  568. package/dist/collection/components/elements/search-saved/search-saved.stories.js +0 -12
  569. package/dist/collection/components/elements/search-starred/search-starred.js +0 -91
  570. package/dist/collection/components/elements/search-starred/search-starred.stories.js +0 -35
  571. package/dist/collection/components/elements/search-tabs/search-tabs.css +0 -3
  572. package/dist/collection/components/elements/search-tabs/search-tabs.js +0 -20
  573. package/dist/collection/components/elements/template-card/star-icon.svg +0 -1
  574. package/dist/collection/components/elements/template-card/template-card.css +0 -90
  575. package/dist/collection/components/elements/template-card/template-card.js +0 -74
  576. package/dist/collection/components/elements/template-card/template-card.stories.js +0 -21
  577. package/dist/collection/components/embeds/search-embed/search-embed.css +0 -3
  578. package/dist/collection/components/embeds/search-embed/search-embed.js +0 -15
  579. package/dist/collection/components/pdf-viewer/pdf-viewer.css +0 -20
  580. package/dist/collection/components/pdf-viewer/pdf-viewer.js +0 -278
  581. package/dist/custom-elements/index.d.ts +0 -123
  582. package/dist/custom-elements/index.js +0 -17801
  583. package/dist/esm/document-status-indicator.entry.js +0 -47
  584. package/dist/esm/index-792f07a6.js +0 -1611
  585. package/dist/esm/org-popup.entry.js +0 -21
  586. package/dist/esm/pdf-viewer.entry.js +0 -13673
  587. package/dist/esm/search-embed.entry.js +0 -15
  588. package/dist/esm/search-quick-functions.entry.js +0 -27
  589. package/dist/esm/search-recent.entry.js +0 -35
  590. package/dist/esm/search-saved.entry.js +0 -35
  591. package/dist/esm/search-starred.entry.js +0 -42
  592. package/dist/esm/search-tabs.entry.js +0 -16
  593. package/dist/esm/tags-indicator.entry.js +0 -16
  594. package/dist/esm/template-card.entry.js +0 -24
  595. package/dist/esm/toggle-icon-buttons.entry.js +0 -28
  596. package/dist/esm-es5/Content-97cad4ea.js +0 -1
  597. package/dist/esm-es5/document-status-indicator.entry.js +0 -1
  598. package/dist/esm-es5/dropdown-menu.entry.js +0 -1
  599. package/dist/esm-es5/index-792f07a6.js +0 -1
  600. package/dist/esm-es5/org-popup.entry.js +0 -1
  601. package/dist/esm-es5/pdf-viewer.entry.js +0 -23
  602. package/dist/esm-es5/search-box.entry.js +0 -1
  603. package/dist/esm-es5/search-embed.entry.js +0 -1
  604. package/dist/esm-es5/search-quick-functions.entry.js +0 -1
  605. package/dist/esm-es5/search-recent.entry.js +0 -1
  606. package/dist/esm-es5/search-saved.entry.js +0 -1
  607. package/dist/esm-es5/search-starred.entry.js +0 -1
  608. package/dist/esm-es5/search-tabs.entry.js +0 -1
  609. package/dist/esm-es5/tags-indicator.entry.js +0 -1
  610. package/dist/esm-es5/template-card.entry.js +0 -1
  611. package/dist/esm-es5/toggle-icon-buttons.entry.js +0 -1
  612. package/dist/types/api/endpoint.d.ts +0 -1
  613. package/dist/types/components/controls/document-status-indicator/document-status-indicator.d.ts +0 -11
  614. package/dist/types/components/controls/dropdown-menu/dropdown-menu.stories.d.ts +0 -11
  615. package/dist/types/components/controls/tags-indicator/tags-indicator.d.ts +0 -18
  616. package/dist/types/components/elements/org-popup/org-popup.d.ts +0 -18
  617. package/dist/types/components/elements/search-recent/search-recent.d.ts +0 -21
  618. package/dist/types/components/elements/search-saved/search-saved.d.ts +0 -21
  619. package/dist/types/components/elements/search-saved/search-saved.stories.d.ts +0 -7
  620. package/dist/types/components/elements/search-starred/search-starred.d.ts +0 -16
  621. package/dist/types/components/elements/template-card/template-card.d.ts +0 -18
  622. package/dist/types/components/embeds/search-embed/search-embed.d.ts +0 -3
  623. package/dist/types/components/pdf-viewer/pdf-viewer.d.ts +0 -36
  624. package/dist/verdocs-web-sdk/p-010729d1.system.entry.js +0 -1
  625. package/dist/verdocs-web-sdk/p-082ac880.system.entry.js +0 -1
  626. package/dist/verdocs-web-sdk/p-299fe046.system.entry.js +0 -1
  627. package/dist/verdocs-web-sdk/p-2a5b073f.entry.js +0 -1
  628. package/dist/verdocs-web-sdk/p-2e3b87aa.entry.js +0 -1
  629. package/dist/verdocs-web-sdk/p-2e3de14e.entry.js +0 -1
  630. package/dist/verdocs-web-sdk/p-4455e25e.entry.js +0 -1
  631. package/dist/verdocs-web-sdk/p-46e67698.system.entry.js +0 -1
  632. package/dist/verdocs-web-sdk/p-4d53801c.entry.js +0 -1
  633. package/dist/verdocs-web-sdk/p-4f6c5df8.entry.js +0 -1
  634. package/dist/verdocs-web-sdk/p-4f726e43.system.entry.js +0 -1
  635. package/dist/verdocs-web-sdk/p-52a0475a.system.entry.js +0 -1
  636. package/dist/verdocs-web-sdk/p-598e9062.entry.js +0 -1
  637. package/dist/verdocs-web-sdk/p-5f583dee.entry.js +0 -1
  638. package/dist/verdocs-web-sdk/p-6b117db2.entry.js +0 -1
  639. package/dist/verdocs-web-sdk/p-6ecfe697.entry.js +0 -1
  640. package/dist/verdocs-web-sdk/p-7cd7db96.system.entry.js +0 -1
  641. package/dist/verdocs-web-sdk/p-826ce4d6.entry.js +0 -1
  642. package/dist/verdocs-web-sdk/p-852fb42b.system.entry.js +0 -1
  643. package/dist/verdocs-web-sdk/p-8fb7a85d.system.entry.js +0 -1
  644. package/dist/verdocs-web-sdk/p-92c467d9.system.entry.js +0 -1
  645. package/dist/verdocs-web-sdk/p-a8ac52f9.entry.js +0 -1
  646. package/dist/verdocs-web-sdk/p-be074c7d.entry.js +0 -23
  647. package/dist/verdocs-web-sdk/p-c7794fd6.system.entry.js +0 -23
  648. package/dist/verdocs-web-sdk/p-c8740fbb.js +0 -1
  649. package/dist/verdocs-web-sdk/p-d0b756a0.system.js +0 -1
  650. package/dist/verdocs-web-sdk/p-df83ddb8.system.entry.js +0 -1
  651. package/dist/verdocs-web-sdk/p-e724fc95.system.js +0 -1
  652. package/dist/verdocs-web-sdk/p-e7f1e5e6.js +0 -1
  653. package/dist/verdocs-web-sdk/p-e7f803f7.system.js +0 -1
  654. package/dist/verdocs-web-sdk/p-e9754f6b.entry.js +0 -1
  655. package/dist/verdocs-web-sdk/p-fe3ceb31.system.entry.js +0 -1
  656. package/dist/verdocs-web-sdk/p-feb2f9c2.system.entry.js +0 -1
@@ -0,0 +1,2964 @@
1
+ import { r as registerInstance, e as createEvent, h, f as Host } from './index-ddbd60b5.js';
2
+
3
+ function hasProperty(obj, prop) {
4
+ return Object.prototype.hasOwnProperty.call(obj, prop);
5
+ }
6
+
7
+ function lastItemOf(arr) {
8
+ return arr[arr.length - 1];
9
+ }
10
+
11
+ // push only the items not included in the array
12
+ function pushUnique(arr, ...items) {
13
+ items.forEach((item) => {
14
+ if (arr.includes(item)) {
15
+ return;
16
+ }
17
+ arr.push(item);
18
+ });
19
+ return arr;
20
+ }
21
+
22
+ function stringToArray(str, separator) {
23
+ // convert empty string to an empty array
24
+ return str ? str.split(separator) : [];
25
+ }
26
+
27
+ function isInRange(testVal, min, max) {
28
+ const minOK = min === undefined || testVal >= min;
29
+ const maxOK = max === undefined || testVal <= max;
30
+ return minOK && maxOK;
31
+ }
32
+
33
+ function limitToRange(val, min, max) {
34
+ if (val < min) {
35
+ return min;
36
+ }
37
+ if (val > max) {
38
+ return max;
39
+ }
40
+ return val;
41
+ }
42
+
43
+ function createTagRepeat(tagName, repeat, attributes = {}, index = 0, html = '') {
44
+ const openTagSrc = Object.keys(attributes).reduce((src, attr) => {
45
+ let val = attributes[attr];
46
+ if (typeof val === 'function') {
47
+ val = val(index);
48
+ }
49
+ return `${src} ${attr}="${val}"`;
50
+ }, tagName);
51
+ html += `<${openTagSrc}></${tagName}>`;
52
+
53
+ const next = index + 1;
54
+ return next < repeat
55
+ ? createTagRepeat(tagName, repeat, attributes, next, html)
56
+ : html;
57
+ }
58
+
59
+ // Remove the spacing surrounding tags for HTML parser not to create text nodes
60
+ // before/after elements
61
+ function optimizeTemplateHTML(html) {
62
+ return html.replace(/>\s+/g, '>').replace(/\s+</, '<');
63
+ }
64
+
65
+ function stripTime(timeValue) {
66
+ return new Date(timeValue).setHours(0, 0, 0, 0);
67
+ }
68
+
69
+ function today() {
70
+ return new Date().setHours(0, 0, 0, 0);
71
+ }
72
+
73
+ // Get the time value of the start of given date or year, month and day
74
+ function dateValue(...args) {
75
+ switch (args.length) {
76
+ case 0:
77
+ return today();
78
+ case 1:
79
+ return stripTime(args[0]);
80
+ }
81
+
82
+ // use setFullYear() to keep 2-digit year from being mapped to 1900-1999
83
+ const newDate = new Date(0);
84
+ newDate.setFullYear(...args);
85
+ return newDate.setHours(0, 0, 0, 0);
86
+ }
87
+
88
+ function addDays(date, amount) {
89
+ const newDate = new Date(date);
90
+ return newDate.setDate(newDate.getDate() + amount);
91
+ }
92
+
93
+ function addWeeks(date, amount) {
94
+ return addDays(date, amount * 7);
95
+ }
96
+
97
+ function addMonths(date, amount) {
98
+ // If the day of the date is not in the new month, the last day of the new
99
+ // month will be returned. e.g. Jan 31 + 1 month → Feb 28 (not Mar 03)
100
+ const newDate = new Date(date);
101
+ const monthsToSet = newDate.getMonth() + amount;
102
+ let expectedMonth = monthsToSet % 12;
103
+ if (expectedMonth < 0) {
104
+ expectedMonth += 12;
105
+ }
106
+
107
+ const time = newDate.setMonth(monthsToSet);
108
+ return newDate.getMonth() !== expectedMonth ? newDate.setDate(0) : time;
109
+ }
110
+
111
+ function addYears(date, amount) {
112
+ // If the date is Feb 29 and the new year is not a leap year, Feb 28 of the
113
+ // new year will be returned.
114
+ const newDate = new Date(date);
115
+ const expectedMonth = newDate.getMonth();
116
+ const time = newDate.setFullYear(newDate.getFullYear() + amount);
117
+ return expectedMonth === 1 && newDate.getMonth() === 2 ? newDate.setDate(0) : time;
118
+ }
119
+
120
+ // Calculate the distance bettwen 2 days of the week
121
+ function dayDiff(day, from) {
122
+ return (day - from + 7) % 7;
123
+ }
124
+
125
+ // Get the date of the specified day of the week of given base date
126
+ function dayOfTheWeekOf(baseDate, dayOfWeek, weekStart = 0) {
127
+ const baseDay = new Date(baseDate).getDay();
128
+ return addDays(baseDate, dayDiff(dayOfWeek, weekStart) - dayDiff(baseDay, weekStart));
129
+ }
130
+
131
+ // Get the ISO week of a date
132
+ function getWeek(date) {
133
+ // start of ISO week is Monday
134
+ const thuOfTheWeek = dayOfTheWeekOf(date, 4, 1);
135
+ // 1st week == the week where the 4th of January is in
136
+ const firstThu = dayOfTheWeekOf(new Date(thuOfTheWeek).setMonth(0, 4), 4, 1);
137
+ return Math.round((thuOfTheWeek - firstThu) / 604800000) + 1;
138
+ }
139
+
140
+ // Get the start year of the period of years that includes given date
141
+ // years: length of the year period
142
+ function startOfYearPeriod(date, years) {
143
+ /* @see https://en.wikipedia.org/wiki/Year_zero#ISO_8601 */
144
+ const year = new Date(date).getFullYear();
145
+ return Math.floor(year / years) * years;
146
+ }
147
+
148
+ // Convert date to the first/last date of the month/year of the date
149
+ function regularizeDate(date, timeSpan, useLastDate) {
150
+ if (timeSpan !== 1 && timeSpan !== 2) {
151
+ return date;
152
+ }
153
+ const newDate = new Date(date);
154
+ if (timeSpan === 1) {
155
+ useLastDate
156
+ ? newDate.setMonth(newDate.getMonth() + 1, 0)
157
+ : newDate.setDate(1);
158
+ } else {
159
+ useLastDate
160
+ ? newDate.setFullYear(newDate.getFullYear() + 1, 0, 0)
161
+ : newDate.setMonth(0, 1);
162
+ }
163
+ return newDate.setHours(0, 0, 0, 0);
164
+ }
165
+
166
+ // pattern for format parts
167
+ const reFormatTokens = /dd?|DD?|mm?|MM?|yy?(?:yy)?/;
168
+ // pattern for non date parts
169
+ const reNonDateParts = /[\s!-/:-@[-`{-~年月日]+/;
170
+ // cache for persed formats
171
+ let knownFormats = {};
172
+ // parse funtions for date parts
173
+ const parseFns = {
174
+ y(date, year) {
175
+ return new Date(date).setFullYear(parseInt(year, 10));
176
+ },
177
+ m(date, month, locale) {
178
+ const newDate = new Date(date);
179
+ let monthIndex = parseInt(month, 10) - 1;
180
+
181
+ if (isNaN(monthIndex)) {
182
+ if (!month) {
183
+ return NaN;
184
+ }
185
+
186
+ const monthName = month.toLowerCase();
187
+ const compareNames = name => name.toLowerCase().startsWith(monthName);
188
+ // compare with both short and full names because some locales have periods
189
+ // in the short names (not equal to the first X letters of the full names)
190
+ monthIndex = locale.monthsShort.findIndex(compareNames);
191
+ if (monthIndex < 0) {
192
+ monthIndex = locale.months.findIndex(compareNames);
193
+ }
194
+ if (monthIndex < 0) {
195
+ return NaN;
196
+ }
197
+ }
198
+
199
+ newDate.setMonth(monthIndex);
200
+ return newDate.getMonth() !== normalizeMonth(monthIndex)
201
+ ? newDate.setDate(0)
202
+ : newDate.getTime();
203
+ },
204
+ d(date, day) {
205
+ return new Date(date).setDate(parseInt(day, 10));
206
+ },
207
+ };
208
+ // format functions for date parts
209
+ const formatFns = {
210
+ d(date) {
211
+ return date.getDate();
212
+ },
213
+ dd(date) {
214
+ return padZero(date.getDate(), 2);
215
+ },
216
+ D(date, locale) {
217
+ return locale.daysShort[date.getDay()];
218
+ },
219
+ DD(date, locale) {
220
+ return locale.days[date.getDay()];
221
+ },
222
+ m(date) {
223
+ return date.getMonth() + 1;
224
+ },
225
+ mm(date) {
226
+ return padZero(date.getMonth() + 1, 2);
227
+ },
228
+ M(date, locale) {
229
+ return locale.monthsShort[date.getMonth()];
230
+ },
231
+ MM(date, locale) {
232
+ return locale.months[date.getMonth()];
233
+ },
234
+ y(date) {
235
+ return date.getFullYear();
236
+ },
237
+ yy(date) {
238
+ return padZero(date.getFullYear(), 2).slice(-2);
239
+ },
240
+ yyyy(date) {
241
+ return padZero(date.getFullYear(), 4);
242
+ },
243
+ };
244
+
245
+ // get month index in normal range (0 - 11) from any number
246
+ function normalizeMonth(monthIndex) {
247
+ return monthIndex > -1 ? monthIndex % 12 : normalizeMonth(monthIndex + 12);
248
+ }
249
+
250
+ function padZero(num, length) {
251
+ return num.toString().padStart(length, '0');
252
+ }
253
+
254
+ function parseFormatString(format) {
255
+ if (typeof format !== 'string') {
256
+ throw new Error("Invalid date format.");
257
+ }
258
+ if (format in knownFormats) {
259
+ return knownFormats[format];
260
+ }
261
+
262
+ // sprit the format string into parts and seprators
263
+ const separators = format.split(reFormatTokens);
264
+ const parts = format.match(new RegExp(reFormatTokens, 'g'));
265
+ if (separators.length === 0 || !parts) {
266
+ throw new Error("Invalid date format.");
267
+ }
268
+
269
+ // collect format functions used in the format
270
+ const partFormatters = parts.map(token => formatFns[token]);
271
+
272
+ // collect parse function keys used in the format
273
+ // iterate over parseFns' keys in order to keep the order of the keys.
274
+ const partParserKeys = Object.keys(parseFns).reduce((keys, key) => {
275
+ const token = parts.find(part => part[0] !== 'D' && part[0].toLowerCase() === key);
276
+ if (token) {
277
+ keys.push(key);
278
+ }
279
+ return keys;
280
+ }, []);
281
+
282
+ return knownFormats[format] = {
283
+ parser(dateStr, locale) {
284
+ const dateParts = dateStr.split(reNonDateParts).reduce((dtParts, part, index) => {
285
+ if (part.length > 0 && parts[index]) {
286
+ const token = parts[index][0];
287
+ if (token === 'M') {
288
+ dtParts.m = part;
289
+ } else if (token !== 'D') {
290
+ dtParts[token] = part;
291
+ }
292
+ }
293
+ return dtParts;
294
+ }, {});
295
+
296
+ // iterate over partParserkeys so that the parsing is made in the oder
297
+ // of year, month and day to prevent the day parser from correcting last
298
+ // day of month wrongly
299
+ return partParserKeys.reduce((origDate, key) => {
300
+ const newDate = parseFns[key](origDate, dateParts[key], locale);
301
+ // ingnore the part failed to parse
302
+ return isNaN(newDate) ? origDate : newDate;
303
+ }, today());
304
+ },
305
+ formatter(date, locale) {
306
+ let dateStr = partFormatters.reduce((str, fn, index) => {
307
+ return str += `${separators[index]}${fn(date, locale)}`;
308
+ }, '');
309
+ // separators' length is always parts' length + 1,
310
+ return dateStr += lastItemOf(separators);
311
+ },
312
+ };
313
+ }
314
+
315
+ function parseDate(dateStr, format, locale) {
316
+ if (dateStr instanceof Date || typeof dateStr === 'number') {
317
+ const date = stripTime(dateStr);
318
+ return isNaN(date) ? undefined : date;
319
+ }
320
+ if (!dateStr) {
321
+ return undefined;
322
+ }
323
+ if (dateStr === 'today') {
324
+ return today();
325
+ }
326
+
327
+ if (format && format.toValue) {
328
+ const date = format.toValue(dateStr, format, locale);
329
+ return isNaN(date) ? undefined : stripTime(date);
330
+ }
331
+
332
+ return parseFormatString(format).parser(dateStr, locale);
333
+ }
334
+
335
+ function formatDate(date, format, locale) {
336
+ if (isNaN(date) || (!date && date !== 0)) {
337
+ return '';
338
+ }
339
+
340
+ const dateObj = typeof date === 'number' ? new Date(date) : date;
341
+
342
+ if (format.toDisplay) {
343
+ return format.toDisplay(dateObj, format, locale);
344
+ }
345
+
346
+ return parseFormatString(format).formatter(dateObj, locale);
347
+ }
348
+
349
+ const range = document.createRange();
350
+
351
+ function parseHTML(html) {
352
+ return range.createContextualFragment(html);
353
+ }
354
+
355
+ function getParent(el) {
356
+ return el.parentElement
357
+ || (el.parentNode instanceof ShadowRoot ? el.parentNode.host : undefined);
358
+ }
359
+
360
+ function isActiveElement(el) {
361
+ return el.getRootNode().activeElement === el;
362
+ }
363
+
364
+ // equivalent to jQuery's :visble
365
+ function isVisible(el) {
366
+ return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);
367
+ }
368
+
369
+ function hideElement(el) {
370
+ if (el.style.display === 'none') {
371
+ return;
372
+ }
373
+ // back up the existing display setting in data-style-display
374
+ if (el.style.display) {
375
+ el.dataset.styleDisplay = el.style.display;
376
+ }
377
+ el.style.display = 'none';
378
+ }
379
+
380
+ function showElement(el) {
381
+ if (el.style.display !== 'none') {
382
+ return;
383
+ }
384
+ if (el.dataset.styleDisplay) {
385
+ // restore backed-up dispay property
386
+ el.style.display = el.dataset.styleDisplay;
387
+ delete el.dataset.styleDisplay;
388
+ } else {
389
+ el.style.display = '';
390
+ }
391
+ }
392
+
393
+ function emptyChildNodes(el) {
394
+ if (el.firstChild) {
395
+ el.removeChild(el.firstChild);
396
+ emptyChildNodes(el);
397
+ }
398
+ }
399
+
400
+ function replaceChildNodes(el, newChildNodes) {
401
+ emptyChildNodes(el);
402
+ if (newChildNodes instanceof DocumentFragment) {
403
+ el.appendChild(newChildNodes);
404
+ } else if (typeof newChildNodes === 'string') {
405
+ el.appendChild(parseHTML(newChildNodes));
406
+ } else if (typeof newChildNodes.forEach === 'function') {
407
+ newChildNodes.forEach((node) => {
408
+ el.appendChild(node);
409
+ });
410
+ }
411
+ }
412
+
413
+ const listenerRegistry = new WeakMap();
414
+ const {addEventListener, removeEventListener} = EventTarget.prototype;
415
+
416
+ // Register event listeners to a key object
417
+ // listeners: array of listener definitions;
418
+ // - each definition must be a flat array of event target and the arguments
419
+ // used to call addEventListener() on the target
420
+ function registerListeners(keyObj, listeners) {
421
+ let registered = listenerRegistry.get(keyObj);
422
+ if (!registered) {
423
+ registered = [];
424
+ listenerRegistry.set(keyObj, registered);
425
+ }
426
+ listeners.forEach((listener) => {
427
+ addEventListener.call(...listener);
428
+ registered.push(listener);
429
+ });
430
+ }
431
+
432
+ function unregisterListeners(keyObj) {
433
+ let listeners = listenerRegistry.get(keyObj);
434
+ if (!listeners) {
435
+ return;
436
+ }
437
+ listeners.forEach((listener) => {
438
+ removeEventListener.call(...listener);
439
+ });
440
+ listenerRegistry.delete(keyObj);
441
+ }
442
+
443
+ // Event.composedPath() polyfill for Edge
444
+ // based on https://gist.github.com/kleinfreund/e9787d73776c0e3750dcfcdc89f100ec
445
+ if (!Event.prototype.composedPath) {
446
+ const getComposedPath = (node, path = []) => {
447
+ path.push(node);
448
+
449
+ let parent;
450
+ if (node.parentNode) {
451
+ parent = node.parentNode;
452
+ } else if (node.host) { // ShadowRoot
453
+ parent = node.host;
454
+ } else if (node.defaultView) { // Document
455
+ parent = node.defaultView;
456
+ }
457
+ return parent ? getComposedPath(parent, path) : path;
458
+ };
459
+
460
+ Event.prototype.composedPath = function () {
461
+ return getComposedPath(this.target);
462
+ };
463
+ }
464
+
465
+ function findFromPath(path, criteria, currentTarget) {
466
+ const [node, ...rest] = path;
467
+ if (criteria(node)) {
468
+ return node;
469
+ }
470
+ if (node === currentTarget || node.tagName === 'HTML' || rest.length === 0) {
471
+ // stop when reaching currentTarget or <html>
472
+ return;
473
+ }
474
+ return findFromPath(rest, criteria, currentTarget);
475
+ }
476
+
477
+ // Search for the actual target of a delegated event
478
+ function findElementInEventPath(ev, selector) {
479
+ const criteria = typeof selector === 'function'
480
+ ? selector
481
+ : el => el instanceof Element && el.matches(selector);
482
+ return findFromPath(ev.composedPath(), criteria, ev.currentTarget);
483
+ }
484
+
485
+ // default locales
486
+ const locales = {
487
+ en: {
488
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
489
+ daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
490
+ daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
491
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
492
+ monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
493
+ today: "Today",
494
+ clear: "Clear",
495
+ titleFormat: "MM y"
496
+ }
497
+ };
498
+
499
+ // config options updatable by setOptions() and their default values
500
+ const defaultOptions = {
501
+ autohide: false,
502
+ beforeShowDay: null,
503
+ beforeShowDecade: null,
504
+ beforeShowMonth: null,
505
+ beforeShowYear: null,
506
+ calendarWeeks: false,
507
+ clearBtn: false,
508
+ dateDelimiter: ',',
509
+ datesDisabled: [],
510
+ daysOfWeekDisabled: [],
511
+ daysOfWeekHighlighted: [],
512
+ defaultViewDate: undefined, // placeholder, defaults to today() by the program
513
+ disableTouchKeyboard: false,
514
+ format: 'mm/dd/yyyy',
515
+ language: 'en',
516
+ maxDate: null,
517
+ maxNumberOfDates: 1,
518
+ maxView: 3,
519
+ minDate: null,
520
+ nextArrow: '»',
521
+ orientation: 'auto',
522
+ pickLevel: 0,
523
+ prevArrow: '«',
524
+ showDaysOfWeek: true,
525
+ showOnClick: true,
526
+ showOnFocus: true,
527
+ startView: 0,
528
+ title: '',
529
+ todayBtn: false,
530
+ todayBtnMode: 0,
531
+ todayHighlight: false,
532
+ updateOnBlur: true,
533
+ weekStart: 0,
534
+ };
535
+
536
+ const {
537
+ language: defaultLang,
538
+ format: defaultFormat,
539
+ weekStart: defaultWeekStart,
540
+ } = defaultOptions;
541
+
542
+ // Reducer function to filter out invalid day-of-week from the input
543
+ function sanitizeDOW(dow, day) {
544
+ return dow.length < 6 && day >= 0 && day < 7
545
+ ? pushUnique(dow, day)
546
+ : dow;
547
+ }
548
+
549
+ function calcEndOfWeek(startOfWeek) {
550
+ return (startOfWeek + 6) % 7;
551
+ }
552
+
553
+ // validate input date. if invalid, fallback to the original value
554
+ function validateDate(value, format, locale, origValue) {
555
+ const date = parseDate(value, format, locale);
556
+ return date !== undefined ? date : origValue;
557
+ }
558
+
559
+ // Validate viewId. if invalid, fallback to the original value
560
+ function validateViewId(value, origValue, max = 3) {
561
+ const viewId = parseInt(value, 10);
562
+ return viewId >= 0 && viewId <= max ? viewId : origValue;
563
+ }
564
+
565
+ // Create Datepicker configuration to set
566
+ function processOptions(options, datepicker) {
567
+ const inOpts = Object.assign({}, options);
568
+ const config = {};
569
+ const locales = datepicker.constructor.locales;
570
+ const rangeSideIndex = datepicker.rangeSideIndex;
571
+ let {
572
+ format,
573
+ language,
574
+ locale,
575
+ maxDate,
576
+ maxView,
577
+ minDate,
578
+ pickLevel,
579
+ startView,
580
+ weekStart,
581
+ } = datepicker.config || {};
582
+
583
+ if (inOpts.language) {
584
+ let lang;
585
+ if (inOpts.language !== language) {
586
+ if (locales[inOpts.language]) {
587
+ lang = inOpts.language;
588
+ } else {
589
+ // Check if langauge + region tag can fallback to the one without
590
+ // region (e.g. fr-CA → fr)
591
+ lang = inOpts.language.split('-')[0];
592
+ if (locales[lang] === undefined) {
593
+ lang = false;
594
+ }
595
+ }
596
+ }
597
+ delete inOpts.language;
598
+ if (lang) {
599
+ language = config.language = lang;
600
+
601
+ // update locale as well when updating language
602
+ const origLocale = locale || locales[defaultLang];
603
+ // use default language's properties for the fallback
604
+ locale = Object.assign({
605
+ format: defaultFormat,
606
+ weekStart: defaultWeekStart
607
+ }, locales[defaultLang]);
608
+ if (language !== defaultLang) {
609
+ Object.assign(locale, locales[language]);
610
+ }
611
+ config.locale = locale;
612
+ // if format and/or weekStart are the same as old locale's defaults,
613
+ // update them to new locale's defaults
614
+ if (format === origLocale.format) {
615
+ format = config.format = locale.format;
616
+ }
617
+ if (weekStart === origLocale.weekStart) {
618
+ weekStart = config.weekStart = locale.weekStart;
619
+ config.weekEnd = calcEndOfWeek(locale.weekStart);
620
+ }
621
+ }
622
+ }
623
+
624
+ if (inOpts.format) {
625
+ const hasToDisplay = typeof inOpts.format.toDisplay === 'function';
626
+ const hasToValue = typeof inOpts.format.toValue === 'function';
627
+ const validFormatString = reFormatTokens.test(inOpts.format);
628
+ if ((hasToDisplay && hasToValue) || validFormatString) {
629
+ format = config.format = inOpts.format;
630
+ }
631
+ delete inOpts.format;
632
+ }
633
+
634
+ //*** pick level ***//
635
+ let newPickLevel = pickLevel;
636
+ if (inOpts.pickLevel !== undefined) {
637
+ newPickLevel = validateViewId(inOpts.pickLevel, 2);
638
+ delete inOpts.pickLevel;
639
+ }
640
+ if (newPickLevel !== pickLevel) {
641
+ if (newPickLevel > pickLevel) {
642
+ // complement current minDate/madDate so that the existing range will be
643
+ // expanded to fit the new level later
644
+ if (inOpts.minDate === undefined) {
645
+ inOpts.minDate = minDate;
646
+ }
647
+ if (inOpts.maxDate === undefined) {
648
+ inOpts.maxDate = maxDate;
649
+ }
650
+ }
651
+ // complement datesDisabled so that it will be reset later
652
+ if (!inOpts.datesDisabled) {
653
+ inOpts.datesDisabled = [];
654
+ }
655
+ pickLevel = config.pickLevel = newPickLevel;
656
+ }
657
+
658
+ //*** dates ***//
659
+ // while min and maxDate for "no limit" in the options are better to be null
660
+ // (especially when updating), the ones in the config have to be undefined
661
+ // because null is treated as 0 (= unix epoch) when comparing with time value
662
+ let minDt = minDate;
663
+ let maxDt = maxDate;
664
+ if (inOpts.minDate !== undefined) {
665
+ const defaultMinDt = dateValue(0, 0, 1);
666
+ minDt = inOpts.minDate === null
667
+ ? defaultMinDt // set 0000-01-01 to prevent negative values for year
668
+ : validateDate(inOpts.minDate, format, locale, minDt);
669
+ if (minDt !== defaultMinDt) {
670
+ minDt = regularizeDate(minDt, pickLevel, false);
671
+ }
672
+ delete inOpts.minDate;
673
+ }
674
+ if (inOpts.maxDate !== undefined) {
675
+ maxDt = inOpts.maxDate === null
676
+ ? undefined
677
+ : validateDate(inOpts.maxDate, format, locale, maxDt);
678
+ if (maxDt !== undefined) {
679
+ maxDt = regularizeDate(maxDt, pickLevel, true);
680
+ }
681
+ delete inOpts.maxDate;
682
+ }
683
+ if (maxDt < minDt) {
684
+ minDate = config.minDate = maxDt;
685
+ maxDate = config.maxDate = minDt;
686
+ } else {
687
+ if (minDate !== minDt) {
688
+ minDate = config.minDate = minDt;
689
+ }
690
+ if (maxDate !== maxDt) {
691
+ maxDate = config.maxDate = maxDt;
692
+ }
693
+ }
694
+
695
+ if (inOpts.datesDisabled) {
696
+ config.datesDisabled = inOpts.datesDisabled.reduce((dates, dt) => {
697
+ const date = parseDate(dt, format, locale);
698
+ return date !== undefined
699
+ ? pushUnique(dates, regularizeDate(date, pickLevel, rangeSideIndex))
700
+ : dates;
701
+ }, []);
702
+ delete inOpts.datesDisabled;
703
+ }
704
+ if (inOpts.defaultViewDate !== undefined) {
705
+ const viewDate = parseDate(inOpts.defaultViewDate, format, locale);
706
+ if (viewDate !== undefined) {
707
+ config.defaultViewDate = viewDate;
708
+ }
709
+ delete inOpts.defaultViewDate;
710
+ }
711
+
712
+ //*** days of week ***//
713
+ if (inOpts.weekStart !== undefined) {
714
+ const wkStart = Number(inOpts.weekStart) % 7;
715
+ if (!isNaN(wkStart)) {
716
+ weekStart = config.weekStart = wkStart;
717
+ config.weekEnd = calcEndOfWeek(wkStart);
718
+ }
719
+ delete inOpts.weekStart;
720
+ }
721
+ if (inOpts.daysOfWeekDisabled) {
722
+ config.daysOfWeekDisabled = inOpts.daysOfWeekDisabled.reduce(sanitizeDOW, []);
723
+ delete inOpts.daysOfWeekDisabled;
724
+ }
725
+ if (inOpts.daysOfWeekHighlighted) {
726
+ config.daysOfWeekHighlighted = inOpts.daysOfWeekHighlighted.reduce(sanitizeDOW, []);
727
+ delete inOpts.daysOfWeekHighlighted;
728
+ }
729
+
730
+ //*** multi date ***//
731
+ if (inOpts.maxNumberOfDates !== undefined) {
732
+ const maxNumberOfDates = parseInt(inOpts.maxNumberOfDates, 10);
733
+ if (maxNumberOfDates >= 0) {
734
+ config.maxNumberOfDates = maxNumberOfDates;
735
+ config.multidate = maxNumberOfDates !== 1;
736
+ }
737
+ delete inOpts.maxNumberOfDates;
738
+ }
739
+ if (inOpts.dateDelimiter) {
740
+ config.dateDelimiter = String(inOpts.dateDelimiter);
741
+ delete inOpts.dateDelimiter;
742
+ }
743
+
744
+ //*** view ***//
745
+ let newMaxView = maxView;
746
+ if (inOpts.maxView !== undefined) {
747
+ newMaxView = validateViewId(inOpts.maxView, maxView);
748
+ delete inOpts.maxView;
749
+ }
750
+ // ensure max view >= pick level
751
+ newMaxView = pickLevel > newMaxView ? pickLevel : newMaxView;
752
+ if (newMaxView !== maxView) {
753
+ maxView = config.maxView = newMaxView;
754
+ }
755
+
756
+ let newStartView = startView;
757
+ if (inOpts.startView !== undefined) {
758
+ newStartView = validateViewId(inOpts.startView, newStartView);
759
+ delete inOpts.startView;
760
+ }
761
+ // ensure pick level <= start view <= max view
762
+ if (newStartView < pickLevel) {
763
+ newStartView = pickLevel;
764
+ } else if (newStartView > maxView) {
765
+ newStartView = maxView;
766
+ }
767
+ if (newStartView !== startView) {
768
+ config.startView = newStartView;
769
+ }
770
+
771
+ //*** template ***//
772
+ if (inOpts.prevArrow) {
773
+ const prevArrow = parseHTML(inOpts.prevArrow);
774
+ if (prevArrow.childNodes.length > 0) {
775
+ config.prevArrow = prevArrow.childNodes;
776
+ }
777
+ delete inOpts.prevArrow;
778
+ }
779
+ if (inOpts.nextArrow) {
780
+ const nextArrow = parseHTML(inOpts.nextArrow);
781
+ if (nextArrow.childNodes.length > 0) {
782
+ config.nextArrow = nextArrow.childNodes;
783
+ }
784
+ delete inOpts.nextArrow;
785
+ }
786
+
787
+ //*** misc ***//
788
+ if (inOpts.disableTouchKeyboard !== undefined) {
789
+ config.disableTouchKeyboard = 'ontouchstart' in document && !!inOpts.disableTouchKeyboard;
790
+ delete inOpts.disableTouchKeyboard;
791
+ }
792
+ if (inOpts.orientation) {
793
+ const orientation = inOpts.orientation.toLowerCase().split(/\s+/g);
794
+ config.orientation = {
795
+ x: orientation.find(x => (x === 'left' || x === 'right')) || 'auto',
796
+ y: orientation.find(y => (y === 'top' || y === 'bottom')) || 'auto',
797
+ };
798
+ delete inOpts.orientation;
799
+ }
800
+ if (inOpts.todayBtnMode !== undefined) {
801
+ switch(inOpts.todayBtnMode) {
802
+ case 0:
803
+ case 1:
804
+ config.todayBtnMode = inOpts.todayBtnMode;
805
+ }
806
+ delete inOpts.todayBtnMode;
807
+ }
808
+
809
+ //*** copy the rest ***//
810
+ Object.keys(inOpts).forEach((key) => {
811
+ if (inOpts[key] !== undefined && hasProperty(defaultOptions, key)) {
812
+ config[key] = inOpts[key];
813
+ }
814
+ });
815
+
816
+ return config;
817
+ }
818
+
819
+ const pickerTemplate = optimizeTemplateHTML(`<div class="datepicker">
820
+ <div class="datepicker-picker">
821
+ <div class="datepicker-header">
822
+ <div class="datepicker-title"></div>
823
+ <div class="datepicker-controls">
824
+ <button type="button" class="%buttonClass% prev-btn"></button>
825
+ <button type="button" class="%buttonClass% view-switch"></button>
826
+ <button type="button" class="%buttonClass% next-btn"></button>
827
+ </div>
828
+ </div>
829
+ <div class="datepicker-main"></div>
830
+ <div class="datepicker-footer">
831
+ <div class="datepicker-controls">
832
+ <button type="button" class="%buttonClass% today-btn"></button>
833
+ <button type="button" class="%buttonClass% clear-btn"></button>
834
+ </div>
835
+ </div>
836
+ </div>
837
+ </div>`);
838
+
839
+ const daysTemplate = optimizeTemplateHTML(`<div class="days">
840
+ <div class="days-of-week">${createTagRepeat('span', 7, {class: 'dow'})}</div>
841
+ <div class="datepicker-grid">${createTagRepeat('span', 42)}</div>
842
+ </div>`);
843
+
844
+ const calendarWeeksTemplate = optimizeTemplateHTML(`<div class="calendar-weeks">
845
+ <div class="days-of-week"><span class="dow"></span></div>
846
+ <div class="weeks">${createTagRepeat('span', 6, {class: 'week'})}</div>
847
+ </div>`);
848
+
849
+ // Base class of the view classes
850
+ class View {
851
+ constructor(picker, config) {
852
+ Object.assign(this, config, {
853
+ picker,
854
+ element: parseHTML(`<div class="datepicker-view"></div>`).firstChild,
855
+ selected: [],
856
+ });
857
+ this.init(this.picker.datepicker.config);
858
+ }
859
+
860
+ init(options) {
861
+ if (options.pickLevel !== undefined) {
862
+ this.isMinView = this.id === options.pickLevel;
863
+ }
864
+ this.setOptions(options);
865
+ this.updateFocus();
866
+ this.updateSelection();
867
+ }
868
+
869
+ // Execute beforeShow() callback and apply the result to the element
870
+ // args:
871
+ // - current - current value on the iteration on view rendering
872
+ // - timeValue - time value of the date to pass to beforeShow()
873
+ performBeforeHook(el, current, timeValue) {
874
+ let result = this.beforeShow(new Date(timeValue));
875
+ switch (typeof result) {
876
+ case 'boolean':
877
+ result = {enabled: result};
878
+ break;
879
+ case 'string':
880
+ result = {classes: result};
881
+ }
882
+
883
+ if (result) {
884
+ if (result.enabled === false) {
885
+ el.classList.add('disabled');
886
+ pushUnique(this.disabled, current);
887
+ }
888
+ if (result.classes) {
889
+ const extraClasses = result.classes.split(/\s+/);
890
+ el.classList.add(...extraClasses);
891
+ if (extraClasses.includes('disabled')) {
892
+ pushUnique(this.disabled, current);
893
+ }
894
+ }
895
+ if (result.content) {
896
+ replaceChildNodes(el, result.content);
897
+ }
898
+ }
899
+ }
900
+ }
901
+
902
+ class DaysView extends View {
903
+ constructor(picker) {
904
+ super(picker, {
905
+ id: 0,
906
+ name: 'days',
907
+ cellClass: 'day',
908
+ });
909
+ }
910
+
911
+ init(options, onConstruction = true) {
912
+ if (onConstruction) {
913
+ const inner = parseHTML(daysTemplate).firstChild;
914
+ this.dow = inner.firstChild;
915
+ this.grid = inner.lastChild;
916
+ this.element.appendChild(inner);
917
+ }
918
+ super.init(options);
919
+ }
920
+
921
+ setOptions(options) {
922
+ let updateDOW;
923
+
924
+ if (hasProperty(options, 'minDate')) {
925
+ this.minDate = options.minDate;
926
+ }
927
+ if (hasProperty(options, 'maxDate')) {
928
+ this.maxDate = options.maxDate;
929
+ }
930
+ if (options.datesDisabled) {
931
+ this.datesDisabled = options.datesDisabled;
932
+ }
933
+ if (options.daysOfWeekDisabled) {
934
+ this.daysOfWeekDisabled = options.daysOfWeekDisabled;
935
+ updateDOW = true;
936
+ }
937
+ if (options.daysOfWeekHighlighted) {
938
+ this.daysOfWeekHighlighted = options.daysOfWeekHighlighted;
939
+ }
940
+ if (options.todayHighlight !== undefined) {
941
+ this.todayHighlight = options.todayHighlight;
942
+ }
943
+ if (options.weekStart !== undefined) {
944
+ this.weekStart = options.weekStart;
945
+ this.weekEnd = options.weekEnd;
946
+ updateDOW = true;
947
+ }
948
+ if (options.locale) {
949
+ const locale = this.locale = options.locale;
950
+ this.dayNames = locale.daysMin;
951
+ this.switchLabelFormat = locale.titleFormat;
952
+ updateDOW = true;
953
+ }
954
+ if (options.beforeShowDay !== undefined) {
955
+ this.beforeShow = typeof options.beforeShowDay === 'function'
956
+ ? options.beforeShowDay
957
+ : undefined;
958
+ }
959
+
960
+ if (options.calendarWeeks !== undefined) {
961
+ if (options.calendarWeeks && !this.calendarWeeks) {
962
+ const weeksElem = parseHTML(calendarWeeksTemplate).firstChild;
963
+ this.calendarWeeks = {
964
+ element: weeksElem,
965
+ dow: weeksElem.firstChild,
966
+ weeks: weeksElem.lastChild,
967
+ };
968
+ this.element.insertBefore(weeksElem, this.element.firstChild);
969
+ } else if (this.calendarWeeks && !options.calendarWeeks) {
970
+ this.element.removeChild(this.calendarWeeks.element);
971
+ this.calendarWeeks = null;
972
+ }
973
+ }
974
+ if (options.showDaysOfWeek !== undefined) {
975
+ if (options.showDaysOfWeek) {
976
+ showElement(this.dow);
977
+ if (this.calendarWeeks) {
978
+ showElement(this.calendarWeeks.dow);
979
+ }
980
+ } else {
981
+ hideElement(this.dow);
982
+ if (this.calendarWeeks) {
983
+ hideElement(this.calendarWeeks.dow);
984
+ }
985
+ }
986
+ }
987
+
988
+ // update days-of-week when locale, daysOfweekDisabled or weekStart is changed
989
+ if (updateDOW) {
990
+ Array.from(this.dow.children).forEach((el, index) => {
991
+ const dow = (this.weekStart + index) % 7;
992
+ el.textContent = this.dayNames[dow];
993
+ el.className = this.daysOfWeekDisabled.includes(dow) ? 'dow disabled' : 'dow';
994
+ });
995
+ }
996
+ }
997
+
998
+ // Apply update on the focused date to view's settings
999
+ updateFocus() {
1000
+ const viewDate = new Date(this.picker.viewDate);
1001
+ const viewYear = viewDate.getFullYear();
1002
+ const viewMonth = viewDate.getMonth();
1003
+ const firstOfMonth = dateValue(viewYear, viewMonth, 1);
1004
+ const start = dayOfTheWeekOf(firstOfMonth, this.weekStart, this.weekStart);
1005
+
1006
+ this.first = firstOfMonth;
1007
+ this.last = dateValue(viewYear, viewMonth + 1, 0);
1008
+ this.start = start;
1009
+ this.focused = this.picker.viewDate;
1010
+ }
1011
+
1012
+ // Apply update on the selected dates to view's settings
1013
+ updateSelection() {
1014
+ const {dates, rangepicker} = this.picker.datepicker;
1015
+ this.selected = dates;
1016
+ if (rangepicker) {
1017
+ this.range = rangepicker.dates;
1018
+ }
1019
+ }
1020
+
1021
+ // Update the entire view UI
1022
+ render() {
1023
+ // update today marker on ever render
1024
+ this.today = this.todayHighlight ? today() : undefined;
1025
+ // refresh disabled dates on every render in order to clear the ones added
1026
+ // by beforeShow hook at previous render
1027
+ this.disabled = [...this.datesDisabled];
1028
+
1029
+ const switchLabel = formatDate(this.focused, this.switchLabelFormat, this.locale);
1030
+ this.picker.setViewSwitchLabel(switchLabel);
1031
+ this.picker.setPrevBtnDisabled(this.first <= this.minDate);
1032
+ this.picker.setNextBtnDisabled(this.last >= this.maxDate);
1033
+
1034
+ if (this.calendarWeeks) {
1035
+ // start of the UTC week (Monday) of the 1st of the month
1036
+ const startOfWeek = dayOfTheWeekOf(this.first, 1, 1);
1037
+ Array.from(this.calendarWeeks.weeks.children).forEach((el, index) => {
1038
+ el.textContent = getWeek(addWeeks(startOfWeek, index));
1039
+ });
1040
+ }
1041
+ Array.from(this.grid.children).forEach((el, index) => {
1042
+ const classList = el.classList;
1043
+ const current = addDays(this.start, index);
1044
+ const date = new Date(current);
1045
+ const day = date.getDay();
1046
+
1047
+ el.className = `datepicker-cell ${this.cellClass}`;
1048
+ el.dataset.date = current;
1049
+ el.textContent = date.getDate();
1050
+
1051
+ if (current < this.first) {
1052
+ classList.add('prev');
1053
+ } else if (current > this.last) {
1054
+ classList.add('next');
1055
+ }
1056
+ if (this.today === current) {
1057
+ classList.add('today');
1058
+ }
1059
+ if (current < this.minDate || current > this.maxDate || this.disabled.includes(current)) {
1060
+ classList.add('disabled');
1061
+ }
1062
+ if (this.daysOfWeekDisabled.includes(day)) {
1063
+ classList.add('disabled');
1064
+ pushUnique(this.disabled, current);
1065
+ }
1066
+ if (this.daysOfWeekHighlighted.includes(day)) {
1067
+ classList.add('highlighted');
1068
+ }
1069
+ if (this.range) {
1070
+ const [rangeStart, rangeEnd] = this.range;
1071
+ if (current > rangeStart && current < rangeEnd) {
1072
+ classList.add('range');
1073
+ }
1074
+ if (current === rangeStart) {
1075
+ classList.add('range-start');
1076
+ }
1077
+ if (current === rangeEnd) {
1078
+ classList.add('range-end');
1079
+ }
1080
+ }
1081
+ if (this.selected.includes(current)) {
1082
+ classList.add('selected');
1083
+ }
1084
+ if (current === this.focused) {
1085
+ classList.add('focused');
1086
+ }
1087
+
1088
+ if (this.beforeShow) {
1089
+ this.performBeforeHook(el, current, current);
1090
+ }
1091
+ });
1092
+ }
1093
+
1094
+ // Update the view UI by applying the changes of selected and focused items
1095
+ refresh() {
1096
+ const [rangeStart, rangeEnd] = this.range || [];
1097
+ this.grid
1098
+ .querySelectorAll('.range, .range-start, .range-end, .selected, .focused')
1099
+ .forEach((el) => {
1100
+ el.classList.remove('range', 'range-start', 'range-end', 'selected', 'focused');
1101
+ });
1102
+ Array.from(this.grid.children).forEach((el) => {
1103
+ const current = Number(el.dataset.date);
1104
+ const classList = el.classList;
1105
+ if (current > rangeStart && current < rangeEnd) {
1106
+ classList.add('range');
1107
+ }
1108
+ if (current === rangeStart) {
1109
+ classList.add('range-start');
1110
+ }
1111
+ if (current === rangeEnd) {
1112
+ classList.add('range-end');
1113
+ }
1114
+ if (this.selected.includes(current)) {
1115
+ classList.add('selected');
1116
+ }
1117
+ if (current === this.focused) {
1118
+ classList.add('focused');
1119
+ }
1120
+ });
1121
+ }
1122
+
1123
+ // Update the view UI by applying the change of focused item
1124
+ refreshFocus() {
1125
+ const index = Math.round((this.focused - this.start) / 86400000);
1126
+ this.grid.querySelectorAll('.focused').forEach((el) => {
1127
+ el.classList.remove('focused');
1128
+ });
1129
+ this.grid.children[index].classList.add('focused');
1130
+ }
1131
+ }
1132
+
1133
+ function computeMonthRange(range, thisYear) {
1134
+ if (!range || !range[0] || !range[1]) {
1135
+ return;
1136
+ }
1137
+
1138
+ const [[startY, startM], [endY, endM]] = range;
1139
+ if (startY > thisYear || endY < thisYear) {
1140
+ return;
1141
+ }
1142
+ return [
1143
+ startY === thisYear ? startM : -1,
1144
+ endY === thisYear ? endM : 12,
1145
+ ];
1146
+ }
1147
+
1148
+ class MonthsView extends View {
1149
+ constructor(picker) {
1150
+ super(picker, {
1151
+ id: 1,
1152
+ name: 'months',
1153
+ cellClass: 'month',
1154
+ });
1155
+ }
1156
+
1157
+ init(options, onConstruction = true) {
1158
+ if (onConstruction) {
1159
+ this.grid = this.element;
1160
+ this.element.classList.add('months', 'datepicker-grid');
1161
+ this.grid.appendChild(parseHTML(createTagRepeat('span', 12, {'data-month': ix => ix})));
1162
+ }
1163
+ super.init(options);
1164
+ }
1165
+
1166
+ setOptions(options) {
1167
+ if (options.locale) {
1168
+ this.monthNames = options.locale.monthsShort;
1169
+ }
1170
+ if (hasProperty(options, 'minDate')) {
1171
+ if (options.minDate === undefined) {
1172
+ this.minYear = this.minMonth = this.minDate = undefined;
1173
+ } else {
1174
+ const minDateObj = new Date(options.minDate);
1175
+ this.minYear = minDateObj.getFullYear();
1176
+ this.minMonth = minDateObj.getMonth();
1177
+ this.minDate = minDateObj.setDate(1);
1178
+ }
1179
+ }
1180
+ if (hasProperty(options, 'maxDate')) {
1181
+ if (options.maxDate === undefined) {
1182
+ this.maxYear = this.maxMonth = this.maxDate = undefined;
1183
+ } else {
1184
+ const maxDateObj = new Date(options.maxDate);
1185
+ this.maxYear = maxDateObj.getFullYear();
1186
+ this.maxMonth = maxDateObj.getMonth();
1187
+ this.maxDate = dateValue(this.maxYear, this.maxMonth + 1, 0);
1188
+ }
1189
+ }
1190
+ if (this.isMinView) {
1191
+ if (options.datesDisabled) {
1192
+ this.datesDisabled = options.datesDisabled;
1193
+ }
1194
+ } else {
1195
+ this.datesDisabled = [];
1196
+ }
1197
+ if (options.beforeShowMonth !== undefined) {
1198
+ this.beforeShow = typeof options.beforeShowMonth === 'function'
1199
+ ? options.beforeShowMonth
1200
+ : undefined;
1201
+ }
1202
+ }
1203
+
1204
+ // Update view's settings to reflect the viewDate set on the picker
1205
+ updateFocus() {
1206
+ const viewDate = new Date(this.picker.viewDate);
1207
+ this.year = viewDate.getFullYear();
1208
+ this.focused = viewDate.getMonth();
1209
+ }
1210
+
1211
+ // Update view's settings to reflect the selected dates
1212
+ updateSelection() {
1213
+ const {dates, rangepicker} = this.picker.datepicker;
1214
+ this.selected = dates.reduce((selected, timeValue) => {
1215
+ const date = new Date(timeValue);
1216
+ const year = date.getFullYear();
1217
+ const month = date.getMonth();
1218
+ if (selected[year] === undefined) {
1219
+ selected[year] = [month];
1220
+ } else {
1221
+ pushUnique(selected[year], month);
1222
+ }
1223
+ return selected;
1224
+ }, {});
1225
+ if (rangepicker && rangepicker.dates) {
1226
+ this.range = rangepicker.dates.map(timeValue => {
1227
+ const date = new Date(timeValue);
1228
+ return isNaN(date) ? undefined : [date.getFullYear(), date.getMonth()];
1229
+ });
1230
+ }
1231
+ }
1232
+
1233
+ // Update the entire view UI
1234
+ render() {
1235
+ // refresh disabled months on every render in order to clear the ones added
1236
+ // by beforeShow hook at previous render
1237
+ // this.disabled = [...this.datesDisabled];
1238
+ this.disabled = this.datesDisabled.reduce((arr, disabled) => {
1239
+ const dt = new Date(disabled);
1240
+ if (this.year === dt.getFullYear()) {
1241
+ arr.push(dt.getMonth());
1242
+ }
1243
+ return arr;
1244
+ }, []);
1245
+
1246
+ this.picker.setViewSwitchLabel(this.year);
1247
+ this.picker.setPrevBtnDisabled(this.year <= this.minYear);
1248
+ this.picker.setNextBtnDisabled(this.year >= this.maxYear);
1249
+
1250
+ const selected = this.selected[this.year] || [];
1251
+ const yrOutOfRange = this.year < this.minYear || this.year > this.maxYear;
1252
+ const isMinYear = this.year === this.minYear;
1253
+ const isMaxYear = this.year === this.maxYear;
1254
+ const range = computeMonthRange(this.range, this.year);
1255
+
1256
+ Array.from(this.grid.children).forEach((el, index) => {
1257
+ const classList = el.classList;
1258
+ const date = dateValue(this.year, index, 1);
1259
+
1260
+ el.className = `datepicker-cell ${this.cellClass}`;
1261
+ if (this.isMinView) {
1262
+ el.dataset.date = date;
1263
+ }
1264
+ // reset text on every render to clear the custom content set
1265
+ // by beforeShow hook at previous render
1266
+ el.textContent = this.monthNames[index];
1267
+
1268
+ if (
1269
+ yrOutOfRange
1270
+ || isMinYear && index < this.minMonth
1271
+ || isMaxYear && index > this.maxMonth
1272
+ || this.disabled.includes(index)
1273
+ ) {
1274
+ classList.add('disabled');
1275
+ }
1276
+ if (range) {
1277
+ const [rangeStart, rangeEnd] = range;
1278
+ if (index > rangeStart && index < rangeEnd) {
1279
+ classList.add('range');
1280
+ }
1281
+ if (index === rangeStart) {
1282
+ classList.add('range-start');
1283
+ }
1284
+ if (index === rangeEnd) {
1285
+ classList.add('range-end');
1286
+ }
1287
+ }
1288
+ if (selected.includes(index)) {
1289
+ classList.add('selected');
1290
+ }
1291
+ if (index === this.focused) {
1292
+ classList.add('focused');
1293
+ }
1294
+
1295
+ if (this.beforeShow) {
1296
+ this.performBeforeHook(el, index, date);
1297
+ }
1298
+ });
1299
+ }
1300
+
1301
+ // Update the view UI by applying the changes of selected and focused items
1302
+ refresh() {
1303
+ const selected = this.selected[this.year] || [];
1304
+ const [rangeStart, rangeEnd] = computeMonthRange(this.range, this.year) || [];
1305
+ this.grid
1306
+ .querySelectorAll('.range, .range-start, .range-end, .selected, .focused')
1307
+ .forEach((el) => {
1308
+ el.classList.remove('range', 'range-start', 'range-end', 'selected', 'focused');
1309
+ });
1310
+ Array.from(this.grid.children).forEach((el, index) => {
1311
+ const classList = el.classList;
1312
+ if (index > rangeStart && index < rangeEnd) {
1313
+ classList.add('range');
1314
+ }
1315
+ if (index === rangeStart) {
1316
+ classList.add('range-start');
1317
+ }
1318
+ if (index === rangeEnd) {
1319
+ classList.add('range-end');
1320
+ }
1321
+ if (selected.includes(index)) {
1322
+ classList.add('selected');
1323
+ }
1324
+ if (index === this.focused) {
1325
+ classList.add('focused');
1326
+ }
1327
+ });
1328
+ }
1329
+
1330
+ // Update the view UI by applying the change of focused item
1331
+ refreshFocus() {
1332
+ this.grid.querySelectorAll('.focused').forEach((el) => {
1333
+ el.classList.remove('focused');
1334
+ });
1335
+ this.grid.children[this.focused].classList.add('focused');
1336
+ }
1337
+ }
1338
+
1339
+ function toTitleCase(word) {
1340
+ return [...word].reduce((str, ch, ix) => str += ix ? ch : ch.toUpperCase(), '');
1341
+ }
1342
+
1343
+ // Class representing the years and decades view elements
1344
+ class YearsView extends View {
1345
+ constructor(picker, config) {
1346
+ super(picker, config);
1347
+ }
1348
+
1349
+ init(options, onConstruction = true) {
1350
+ if (onConstruction) {
1351
+ this.navStep = this.step * 10;
1352
+ this.beforeShowOption = `beforeShow${toTitleCase(this.cellClass)}`;
1353
+ this.grid = this.element;
1354
+ this.element.classList.add(this.name, 'datepicker-grid');
1355
+ this.grid.appendChild(parseHTML(createTagRepeat('span', 12)));
1356
+ }
1357
+ super.init(options);
1358
+ }
1359
+
1360
+ setOptions(options) {
1361
+ if (hasProperty(options, 'minDate')) {
1362
+ if (options.minDate === undefined) {
1363
+ this.minYear = this.minDate = undefined;
1364
+ } else {
1365
+ this.minYear = startOfYearPeriod(options.minDate, this.step);
1366
+ this.minDate = dateValue(this.minYear, 0, 1);
1367
+ }
1368
+ }
1369
+ if (hasProperty(options, 'maxDate')) {
1370
+ if (options.maxDate === undefined) {
1371
+ this.maxYear = this.maxDate = undefined;
1372
+ } else {
1373
+ this.maxYear = startOfYearPeriod(options.maxDate, this.step);
1374
+ this.maxDate = dateValue(this.maxYear, 11, 31);
1375
+ }
1376
+ }
1377
+ if (this.isMinView) {
1378
+ if (options.datesDisabled) {
1379
+ this.datesDisabled = options.datesDisabled;
1380
+ }
1381
+ } else {
1382
+ this.datesDisabled = [];
1383
+ }
1384
+ if (options[this.beforeShowOption] !== undefined) {
1385
+ const beforeShow = options[this.beforeShowOption];
1386
+ this.beforeShow = typeof beforeShow === 'function' ? beforeShow : undefined;
1387
+ }
1388
+ }
1389
+
1390
+ // Update view's settings to reflect the viewDate set on the picker
1391
+ updateFocus() {
1392
+ const viewDate = new Date(this.picker.viewDate);
1393
+ const first = startOfYearPeriod(viewDate, this.navStep);
1394
+ const last = first + 9 * this.step;
1395
+
1396
+ this.first = first;
1397
+ this.last = last;
1398
+ this.start = first - this.step;
1399
+ this.focused = startOfYearPeriod(viewDate, this.step);
1400
+ }
1401
+
1402
+ // Update view's settings to reflect the selected dates
1403
+ updateSelection() {
1404
+ const {dates, rangepicker} = this.picker.datepicker;
1405
+ this.selected = dates.reduce((years, timeValue) => {
1406
+ return pushUnique(years, startOfYearPeriod(timeValue, this.step));
1407
+ }, []);
1408
+ if (rangepicker && rangepicker.dates) {
1409
+ this.range = rangepicker.dates.map(timeValue => {
1410
+ if (timeValue !== undefined) {
1411
+ return startOfYearPeriod(timeValue, this.step);
1412
+ }
1413
+ });
1414
+ }
1415
+ }
1416
+
1417
+ // Update the entire view UI
1418
+ render() {
1419
+ // refresh disabled years on every render in order to clear the ones added
1420
+ // by beforeShow hook at previous render
1421
+ // this.disabled = [...this.datesDisabled];
1422
+ this.disabled = this.datesDisabled.map(disabled => new Date(disabled).getFullYear());
1423
+
1424
+ this.picker.setViewSwitchLabel(`${this.first}-${this.last}`);
1425
+ this.picker.setPrevBtnDisabled(this.first <= this.minYear);
1426
+ this.picker.setNextBtnDisabled(this.last >= this.maxYear);
1427
+
1428
+ Array.from(this.grid.children).forEach((el, index) => {
1429
+ const classList = el.classList;
1430
+ const current = this.start + (index * this.step);
1431
+ const date = dateValue(current, 0, 1);
1432
+
1433
+ el.className = `datepicker-cell ${this.cellClass}`;
1434
+ if (this.isMinView) {
1435
+ el.dataset.date = date;
1436
+ }
1437
+ el.textContent = el.dataset.year = current;
1438
+
1439
+ if (index === 0) {
1440
+ classList.add('prev');
1441
+ } else if (index === 11) {
1442
+ classList.add('next');
1443
+ }
1444
+ if (current < this.minYear || current > this.maxYear || this.disabled.includes(current)) {
1445
+ classList.add('disabled');
1446
+ }
1447
+ if (this.range) {
1448
+ const [rangeStart, rangeEnd] = this.range;
1449
+ if (current > rangeStart && current < rangeEnd) {
1450
+ classList.add('range');
1451
+ }
1452
+ if (current === rangeStart) {
1453
+ classList.add('range-start');
1454
+ }
1455
+ if (current === rangeEnd) {
1456
+ classList.add('range-end');
1457
+ }
1458
+ }
1459
+ if (this.selected.includes(current)) {
1460
+ classList.add('selected');
1461
+ }
1462
+ if (current === this.focused) {
1463
+ classList.add('focused');
1464
+ }
1465
+
1466
+ if (this.beforeShow) {
1467
+ this.performBeforeHook(el, current, date);
1468
+ }
1469
+ });
1470
+ }
1471
+
1472
+ // Update the view UI by applying the changes of selected and focused items
1473
+ refresh() {
1474
+ const [rangeStart, rangeEnd] = this.range || [];
1475
+ this.grid
1476
+ .querySelectorAll('.range, .range-start, .range-end, .selected, .focused')
1477
+ .forEach((el) => {
1478
+ el.classList.remove('range', 'range-start', 'range-end', 'selected', 'focused');
1479
+ });
1480
+ Array.from(this.grid.children).forEach((el) => {
1481
+ const current = Number(el.textContent);
1482
+ const classList = el.classList;
1483
+ if (current > rangeStart && current < rangeEnd) {
1484
+ classList.add('range');
1485
+ }
1486
+ if (current === rangeStart) {
1487
+ classList.add('range-start');
1488
+ }
1489
+ if (current === rangeEnd) {
1490
+ classList.add('range-end');
1491
+ }
1492
+ if (this.selected.includes(current)) {
1493
+ classList.add('selected');
1494
+ }
1495
+ if (current === this.focused) {
1496
+ classList.add('focused');
1497
+ }
1498
+ });
1499
+ }
1500
+
1501
+ // Update the view UI by applying the change of focused item
1502
+ refreshFocus() {
1503
+ const index = Math.round((this.focused - this.start) / this.step);
1504
+ this.grid.querySelectorAll('.focused').forEach((el) => {
1505
+ el.classList.remove('focused');
1506
+ });
1507
+ this.grid.children[index].classList.add('focused');
1508
+ }
1509
+ }
1510
+
1511
+ function triggerDatepickerEvent(datepicker, type) {
1512
+ const detail = {
1513
+ date: datepicker.getDate(),
1514
+ viewDate: new Date(datepicker.picker.viewDate),
1515
+ viewId: datepicker.picker.currentView.id,
1516
+ datepicker,
1517
+ };
1518
+ datepicker.element.dispatchEvent(new CustomEvent(type, {detail}));
1519
+ }
1520
+
1521
+ // direction: -1 (to previous), 1 (to next)
1522
+ function goToPrevOrNext(datepicker, direction) {
1523
+ const {minDate, maxDate} = datepicker.config;
1524
+ const {currentView, viewDate} = datepicker.picker;
1525
+ let newViewDate;
1526
+ switch (currentView.id) {
1527
+ case 0:
1528
+ newViewDate = addMonths(viewDate, direction);
1529
+ break;
1530
+ case 1:
1531
+ newViewDate = addYears(viewDate, direction);
1532
+ break;
1533
+ default:
1534
+ newViewDate = addYears(viewDate, direction * currentView.navStep);
1535
+ }
1536
+ newViewDate = limitToRange(newViewDate, minDate, maxDate);
1537
+ datepicker.picker.changeFocus(newViewDate).render();
1538
+ }
1539
+
1540
+ function switchView(datepicker) {
1541
+ const viewId = datepicker.picker.currentView.id;
1542
+ if (viewId === datepicker.config.maxView) {
1543
+ return;
1544
+ }
1545
+ datepicker.picker.changeView(viewId + 1).render();
1546
+ }
1547
+
1548
+ function unfocus(datepicker) {
1549
+ if (datepicker.config.updateOnBlur) {
1550
+ datepicker.update({revert: true});
1551
+ } else {
1552
+ datepicker.refresh('input');
1553
+ }
1554
+ datepicker.hide();
1555
+ }
1556
+
1557
+ function goToSelectedMonthOrYear(datepicker, selection) {
1558
+ const picker = datepicker.picker;
1559
+ const viewDate = new Date(picker.viewDate);
1560
+ const viewId = picker.currentView.id;
1561
+ const newDate = viewId === 1
1562
+ ? addMonths(viewDate, selection - viewDate.getMonth())
1563
+ : addYears(viewDate, selection - viewDate.getFullYear());
1564
+
1565
+ picker.changeFocus(newDate).changeView(viewId - 1).render();
1566
+ }
1567
+
1568
+ function onClickTodayBtn(datepicker) {
1569
+ const picker = datepicker.picker;
1570
+ const currentDate = today();
1571
+ if (datepicker.config.todayBtnMode === 1) {
1572
+ if (datepicker.config.autohide) {
1573
+ datepicker.setDate(currentDate);
1574
+ return;
1575
+ }
1576
+ datepicker.setDate(currentDate, {render: false});
1577
+ picker.update();
1578
+ }
1579
+ if (picker.viewDate !== currentDate) {
1580
+ picker.changeFocus(currentDate);
1581
+ }
1582
+ picker.changeView(0).render();
1583
+ }
1584
+
1585
+ function onClickClearBtn(datepicker) {
1586
+ datepicker.setDate({clear: true});
1587
+ }
1588
+
1589
+ function onClickViewSwitch(datepicker) {
1590
+ switchView(datepicker);
1591
+ }
1592
+
1593
+ function onClickPrevBtn(datepicker) {
1594
+ goToPrevOrNext(datepicker, -1);
1595
+ }
1596
+
1597
+ function onClickNextBtn(datepicker) {
1598
+ goToPrevOrNext(datepicker, 1);
1599
+ }
1600
+
1601
+ // For the picker's main block to delegete the events from `datepicker-cell`s
1602
+ function onClickView(datepicker, ev) {
1603
+ const target = findElementInEventPath(ev, '.datepicker-cell');
1604
+ if (!target || target.classList.contains('disabled')) {
1605
+ return;
1606
+ }
1607
+
1608
+ const {id, isMinView} = datepicker.picker.currentView;
1609
+ if (isMinView) {
1610
+ datepicker.setDate(Number(target.dataset.date));
1611
+ } else if (id === 1) {
1612
+ goToSelectedMonthOrYear(datepicker, Number(target.dataset.month));
1613
+ } else {
1614
+ goToSelectedMonthOrYear(datepicker, Number(target.dataset.year));
1615
+ }
1616
+ }
1617
+
1618
+ function onMousedownPicker(ev) {
1619
+ ev.preventDefault();
1620
+ }
1621
+
1622
+ const orientClasses = ['left', 'top', 'right', 'bottom'].reduce((obj, key) => {
1623
+ obj[key] = `datepicker-orient-${key}`;
1624
+ return obj;
1625
+ }, {});
1626
+ const toPx = num => num ? `${num}px` : num;
1627
+
1628
+ function processPickerOptions(picker, options) {
1629
+ if (options.title !== undefined) {
1630
+ if (options.title) {
1631
+ picker.controls.title.textContent = options.title;
1632
+ showElement(picker.controls.title);
1633
+ } else {
1634
+ picker.controls.title.textContent = '';
1635
+ hideElement(picker.controls.title);
1636
+ }
1637
+ }
1638
+ if (options.prevArrow) {
1639
+ const prevBtn = picker.controls.prevBtn;
1640
+ emptyChildNodes(prevBtn);
1641
+ options.prevArrow.forEach((node) => {
1642
+ prevBtn.appendChild(node.cloneNode(true));
1643
+ });
1644
+ }
1645
+ if (options.nextArrow) {
1646
+ const nextBtn = picker.controls.nextBtn;
1647
+ emptyChildNodes(nextBtn);
1648
+ options.nextArrow.forEach((node) => {
1649
+ nextBtn.appendChild(node.cloneNode(true));
1650
+ });
1651
+ }
1652
+ if (options.locale) {
1653
+ picker.controls.todayBtn.textContent = options.locale.today;
1654
+ picker.controls.clearBtn.textContent = options.locale.clear;
1655
+ }
1656
+ if (options.todayBtn !== undefined) {
1657
+ if (options.todayBtn) {
1658
+ showElement(picker.controls.todayBtn);
1659
+ } else {
1660
+ hideElement(picker.controls.todayBtn);
1661
+ }
1662
+ }
1663
+ if (hasProperty(options, 'minDate') || hasProperty(options, 'maxDate')) {
1664
+ const {minDate, maxDate} = picker.datepicker.config;
1665
+ picker.controls.todayBtn.disabled = !isInRange(today(), minDate, maxDate);
1666
+ }
1667
+ if (options.clearBtn !== undefined) {
1668
+ if (options.clearBtn) {
1669
+ showElement(picker.controls.clearBtn);
1670
+ } else {
1671
+ hideElement(picker.controls.clearBtn);
1672
+ }
1673
+ }
1674
+ }
1675
+
1676
+ // Compute view date to reset, which will be...
1677
+ // - the last item of the selected dates or defaultViewDate if no selection
1678
+ // - limitted to minDate or maxDate if it exceeds the range
1679
+ function computeResetViewDate(datepicker) {
1680
+ const {dates, config} = datepicker;
1681
+ const viewDate = dates.length > 0 ? lastItemOf(dates) : config.defaultViewDate;
1682
+ return limitToRange(viewDate, config.minDate, config.maxDate);
1683
+ }
1684
+
1685
+ // Change current view's view date
1686
+ function setViewDate(picker, newDate) {
1687
+ const oldViewDate = new Date(picker.viewDate);
1688
+ const newViewDate = new Date(newDate);
1689
+ const {id, year, first, last} = picker.currentView;
1690
+ const viewYear = newViewDate.getFullYear();
1691
+
1692
+ picker.viewDate = newDate;
1693
+ if (viewYear !== oldViewDate.getFullYear()) {
1694
+ triggerDatepickerEvent(picker.datepicker, 'changeYear');
1695
+ }
1696
+ if (newViewDate.getMonth() !== oldViewDate.getMonth()) {
1697
+ triggerDatepickerEvent(picker.datepicker, 'changeMonth');
1698
+ }
1699
+
1700
+ // return whether the new date is in different period on time from the one
1701
+ // displayed in the current view
1702
+ // when true, the view needs to be re-rendered on the next UI refresh.
1703
+ switch (id) {
1704
+ case 0:
1705
+ return newDate < first || newDate > last;
1706
+ case 1:
1707
+ return viewYear !== year;
1708
+ default:
1709
+ return viewYear < first || viewYear > last;
1710
+ }
1711
+ }
1712
+
1713
+ function getTextDirection(el) {
1714
+ return window.getComputedStyle(el).direction;
1715
+ }
1716
+
1717
+ // find the closet scrollable ancestor elemnt under the body
1718
+ function findScrollParents(el) {
1719
+ const parent = getParent(el);
1720
+ if (parent === document.body || !parent) {
1721
+ return;
1722
+ }
1723
+
1724
+ // checking overflow only is enough because computed overflow cannot be
1725
+ // visible or a combination of visible and other when either axis is set
1726
+ // to other than visible.
1727
+ // (Setting one axis to other than 'visible' while the other is 'visible'
1728
+ // results in the other axis turning to 'auto')
1729
+ return window.getComputedStyle(parent).overflow !== 'visible'
1730
+ ? parent
1731
+ : findScrollParents(parent);
1732
+ }
1733
+
1734
+ // Class representing the picker UI
1735
+ class Picker {
1736
+ constructor(datepicker) {
1737
+ const {config} = this.datepicker = datepicker;
1738
+
1739
+ const template = pickerTemplate.replace(/%buttonClass%/g, config.buttonClass);
1740
+ const element = this.element = parseHTML(template).firstChild;
1741
+ const [header, main, footer] = element.firstChild.children;
1742
+ const title = header.firstElementChild;
1743
+ const [prevBtn, viewSwitch, nextBtn] = header.lastElementChild.children;
1744
+ const [todayBtn, clearBtn] = footer.firstChild.children;
1745
+ const controls = {
1746
+ title,
1747
+ prevBtn,
1748
+ viewSwitch,
1749
+ nextBtn,
1750
+ todayBtn,
1751
+ clearBtn,
1752
+ };
1753
+ this.main = main;
1754
+ this.controls = controls;
1755
+
1756
+ const elementClass = datepicker.inline ? 'inline' : 'dropdown';
1757
+ element.classList.add(`datepicker-${elementClass}`);
1758
+
1759
+ processPickerOptions(this, config);
1760
+ this.viewDate = computeResetViewDate(datepicker);
1761
+
1762
+ // set up event listeners
1763
+ registerListeners(datepicker, [
1764
+ [element, 'mousedown', onMousedownPicker],
1765
+ [main, 'click', onClickView.bind(null, datepicker)],
1766
+ [controls.viewSwitch, 'click', onClickViewSwitch.bind(null, datepicker)],
1767
+ [controls.prevBtn, 'click', onClickPrevBtn.bind(null, datepicker)],
1768
+ [controls.nextBtn, 'click', onClickNextBtn.bind(null, datepicker)],
1769
+ [controls.todayBtn, 'click', onClickTodayBtn.bind(null, datepicker)],
1770
+ [controls.clearBtn, 'click', onClickClearBtn.bind(null, datepicker)],
1771
+ ]);
1772
+
1773
+ // set up views
1774
+ this.views = [
1775
+ new DaysView(this),
1776
+ new MonthsView(this),
1777
+ new YearsView(this, {id: 2, name: 'years', cellClass: 'year', step: 1}),
1778
+ new YearsView(this, {id: 3, name: 'decades', cellClass: 'decade', step: 10}),
1779
+ ];
1780
+ this.currentView = this.views[config.startView];
1781
+
1782
+ this.currentView.render();
1783
+ this.main.appendChild(this.currentView.element);
1784
+ if (config.container) {
1785
+ config.container.appendChild(this.element);
1786
+ } else {
1787
+ datepicker.inputField.after(this.element);
1788
+ }
1789
+ }
1790
+
1791
+ setOptions(options) {
1792
+ processPickerOptions(this, options);
1793
+ this.views.forEach((view) => {
1794
+ view.init(options, false);
1795
+ });
1796
+ this.currentView.render();
1797
+ }
1798
+
1799
+ detach() {
1800
+ this.element.remove();
1801
+ }
1802
+
1803
+ show() {
1804
+ if (this.active) {
1805
+ return;
1806
+ }
1807
+
1808
+ const {datepicker, element} = this;
1809
+ if (datepicker.inline) {
1810
+ element.classList.add('active');
1811
+ } else {
1812
+ // ensure picker's direction matches input's
1813
+ const inputDirection = getTextDirection(datepicker.inputField);
1814
+ if (inputDirection !== getTextDirection(getParent(element))) {
1815
+ element.dir = inputDirection;
1816
+ } else if (element.dir) {
1817
+ element.removeAttribute('dir');
1818
+ }
1819
+
1820
+ element.style.visiblity = 'hidden';
1821
+ element.classList.add('active');
1822
+ this.place();
1823
+ element.style.visiblity = '';
1824
+
1825
+ if (datepicker.config.disableTouchKeyboard) {
1826
+ datepicker.inputField.blur();
1827
+ }
1828
+ }
1829
+ this.active = true;
1830
+ triggerDatepickerEvent(datepicker, 'show');
1831
+ }
1832
+
1833
+ hide() {
1834
+ if (!this.active) {
1835
+ return;
1836
+ }
1837
+ this.datepicker.exitEditMode();
1838
+ this.element.classList.remove('active');
1839
+ this.active = false;
1840
+ triggerDatepickerEvent(this.datepicker, 'hide');
1841
+ }
1842
+
1843
+ place() {
1844
+ const {classList, offsetParent, style} = this.element;
1845
+ const {config, inputField} = this.datepicker;
1846
+ const {
1847
+ width: calendarWidth,
1848
+ height: calendarHeight,
1849
+ } = this.element.getBoundingClientRect();
1850
+ const {
1851
+ left: inputLeft,
1852
+ top: inputTop,
1853
+ right: inputRight,
1854
+ bottom: inputBottom,
1855
+ width: inputWidth,
1856
+ height: inputHeight
1857
+ } = inputField.getBoundingClientRect();
1858
+ let {x: orientX, y: orientY} = config.orientation;
1859
+ let left = inputLeft;
1860
+ let top = inputTop;
1861
+
1862
+ // caliculate offsetLeft/Top of inputField
1863
+ if (offsetParent === document.body || !offsetParent) {
1864
+ left += window.scrollX;
1865
+ top += window.scrollY;
1866
+ } else {
1867
+ const offsetParentRect = offsetParent.getBoundingClientRect();
1868
+ left -= offsetParentRect.left - offsetParent.scrollLeft;
1869
+ top -= offsetParentRect.top - offsetParent.scrollTop;
1870
+ }
1871
+
1872
+ // caliculate the boundaries of the visible area that contains inputField
1873
+ const scrollParent = findScrollParents(inputField);
1874
+ let scrollAreaLeft = 0;
1875
+ let scrollAreaTop = 0;
1876
+ let {
1877
+ clientWidth: scrollAreaRight,
1878
+ clientHeight: scrollAreaBottom,
1879
+ } = document.documentElement;
1880
+
1881
+ if (scrollParent) {
1882
+ const scrollParentRect = scrollParent.getBoundingClientRect();
1883
+ if (scrollParentRect.top > 0) {
1884
+ scrollAreaTop = scrollParentRect.top;
1885
+ }
1886
+ if (scrollParentRect.left > 0) {
1887
+ scrollAreaLeft = scrollParentRect.left;
1888
+ }
1889
+ if (scrollParentRect.right < scrollAreaRight) {
1890
+ scrollAreaRight = scrollParentRect.right;
1891
+ }
1892
+ if (scrollParentRect.bottom < scrollAreaBottom) {
1893
+ scrollAreaBottom = scrollParentRect.bottom;
1894
+ }
1895
+ }
1896
+
1897
+ // determine the horizontal orientation and left position
1898
+ let adjustment = 0;
1899
+ if (orientX === 'auto') {
1900
+ if (inputLeft < scrollAreaLeft) {
1901
+ orientX = 'left';
1902
+ adjustment = scrollAreaLeft - inputLeft;
1903
+ } else if (inputLeft + calendarWidth > scrollAreaRight) {
1904
+ orientX = 'right';
1905
+ if (scrollAreaRight < inputRight) {
1906
+ adjustment = scrollAreaRight - inputRight;
1907
+ }
1908
+ } else if (getTextDirection(inputField) === 'rtl') {
1909
+ orientX = inputRight - calendarWidth < scrollAreaLeft ? 'left' : 'right';
1910
+ } else {
1911
+ orientX = 'left';
1912
+ }
1913
+ }
1914
+ if (orientX === 'right') {
1915
+ left += inputWidth - calendarWidth;
1916
+ }
1917
+ left += adjustment;
1918
+
1919
+ // determine the vertical orientation and top position
1920
+ if (orientY === 'auto') {
1921
+ if (inputTop - calendarHeight > scrollAreaTop) {
1922
+ orientY = inputBottom + calendarHeight > scrollAreaBottom ? 'top' : 'bottom';
1923
+ } else {
1924
+ orientY = 'bottom';
1925
+ }
1926
+ }
1927
+ if (orientY === 'top') {
1928
+ top -= calendarHeight;
1929
+ } else {
1930
+ top += inputHeight;
1931
+ }
1932
+
1933
+ classList.remove(...Object.values(orientClasses));
1934
+ classList.add(orientClasses[orientX], orientClasses[orientY]);
1935
+
1936
+ style.left = toPx(left);
1937
+ style.top = toPx(top);
1938
+ }
1939
+
1940
+ setViewSwitchLabel(labelText) {
1941
+ this.controls.viewSwitch.textContent = labelText;
1942
+ }
1943
+
1944
+ setPrevBtnDisabled(disabled) {
1945
+ this.controls.prevBtn.disabled = disabled;
1946
+ }
1947
+
1948
+ setNextBtnDisabled(disabled) {
1949
+ this.controls.nextBtn.disabled = disabled;
1950
+ }
1951
+
1952
+ changeView(viewId) {
1953
+ const oldView = this.currentView;
1954
+ const newView = this.views[viewId];
1955
+ if (newView.id !== oldView.id) {
1956
+ this.currentView = newView;
1957
+ this._renderMethod = 'render';
1958
+ triggerDatepickerEvent(this.datepicker, 'changeView');
1959
+ this.main.replaceChild(newView.element, oldView.element);
1960
+ }
1961
+ return this;
1962
+ }
1963
+
1964
+ // Change the focused date (view date)
1965
+ changeFocus(newViewDate) {
1966
+ this._renderMethod = setViewDate(this, newViewDate) ? 'render' : 'refreshFocus';
1967
+ this.views.forEach((view) => {
1968
+ view.updateFocus();
1969
+ });
1970
+ return this;
1971
+ }
1972
+
1973
+ // Apply the change of the selected dates
1974
+ update() {
1975
+ const newViewDate = computeResetViewDate(this.datepicker);
1976
+ this._renderMethod = setViewDate(this, newViewDate) ? 'render' : 'refresh';
1977
+ this.views.forEach((view) => {
1978
+ view.updateFocus();
1979
+ view.updateSelection();
1980
+ });
1981
+ return this;
1982
+ }
1983
+
1984
+ // Refresh the picker UI
1985
+ render(quickRender = true) {
1986
+ const renderMethod = (quickRender && this._renderMethod) || 'render';
1987
+ delete this._renderMethod;
1988
+
1989
+ this.currentView[renderMethod]();
1990
+ }
1991
+ }
1992
+
1993
+ // Find the closest date that doesn't meet the condition for unavailable date
1994
+ // Returns undefined if no available date is found
1995
+ // addFn: function to calculate the next date
1996
+ // - args: time value, amount
1997
+ // increase: amount to pass to addFn
1998
+ // testFn: function to test the unavailablity of the date
1999
+ // - args: time value; retun: true if unavailable
2000
+ function findNextAvailableOne(date, addFn, increase, testFn, min, max) {
2001
+ if (!isInRange(date, min, max)) {
2002
+ return;
2003
+ }
2004
+ if (testFn(date)) {
2005
+ const newDate = addFn(date, increase);
2006
+ return findNextAvailableOne(newDate, addFn, increase, testFn, min, max);
2007
+ }
2008
+ return date;
2009
+ }
2010
+
2011
+ // direction: -1 (left/up), 1 (right/down)
2012
+ // vertical: true for up/down, false for left/right
2013
+ function moveByArrowKey(datepicker, ev, direction, vertical) {
2014
+ const picker = datepicker.picker;
2015
+ const currentView = picker.currentView;
2016
+ const step = currentView.step || 1;
2017
+ let viewDate = picker.viewDate;
2018
+ let addFn;
2019
+ let testFn;
2020
+ switch (currentView.id) {
2021
+ case 0:
2022
+ if (vertical) {
2023
+ viewDate = addDays(viewDate, direction * 7);
2024
+ } else if (ev.ctrlKey || ev.metaKey) {
2025
+ viewDate = addYears(viewDate, direction);
2026
+ } else {
2027
+ viewDate = addDays(viewDate, direction);
2028
+ }
2029
+ addFn = addDays;
2030
+ testFn = (date) => currentView.disabled.includes(date);
2031
+ break;
2032
+ case 1:
2033
+ viewDate = addMonths(viewDate, vertical ? direction * 4 : direction);
2034
+ addFn = addMonths;
2035
+ testFn = (date) => {
2036
+ const dt = new Date(date);
2037
+ const {year, disabled} = currentView;
2038
+ return dt.getFullYear() === year && disabled.includes(dt.getMonth());
2039
+ };
2040
+ break;
2041
+ default:
2042
+ viewDate = addYears(viewDate, direction * (vertical ? 4 : 1) * step);
2043
+ addFn = addYears;
2044
+ testFn = date => currentView.disabled.includes(startOfYearPeriod(date, step));
2045
+ }
2046
+ viewDate = findNextAvailableOne(
2047
+ viewDate,
2048
+ addFn,
2049
+ direction < 0 ? -step : step,
2050
+ testFn,
2051
+ currentView.minDate,
2052
+ currentView.maxDate
2053
+ );
2054
+ if (viewDate !== undefined) {
2055
+ picker.changeFocus(viewDate).render();
2056
+ }
2057
+ }
2058
+
2059
+ function onKeydown(datepicker, ev) {
2060
+ const key = ev.key;
2061
+ if (key === 'Tab') {
2062
+ unfocus(datepicker);
2063
+ return;
2064
+ }
2065
+
2066
+ const picker = datepicker.picker;
2067
+ const {id, isMinView} = picker.currentView;
2068
+ if (!picker.active) {
2069
+ if (key === 'ArrowDown') {
2070
+ picker.show();
2071
+ } else {
2072
+ if (key === 'Enter') {
2073
+ datepicker.update();
2074
+ } else if (key === 'Escape') {
2075
+ picker.show();
2076
+ }
2077
+ return;
2078
+ }
2079
+ } else if (datepicker.editMode) {
2080
+ if (key === 'Enter') {
2081
+ datepicker.exitEditMode({update: true, autohide: datepicker.config.autohide});
2082
+ } else if (key === 'Escape') {
2083
+ picker.hide();
2084
+ }
2085
+ return;
2086
+ } else {
2087
+ if (key === 'ArrowLeft') {
2088
+ if (ev.ctrlKey || ev.metaKey) {
2089
+ goToPrevOrNext(datepicker, -1);
2090
+ } else if (ev.shiftKey) {
2091
+ datepicker.enterEditMode();
2092
+ return;
2093
+ } else {
2094
+ moveByArrowKey(datepicker, ev, -1, false);
2095
+ }
2096
+ } else if (key === 'ArrowRight') {
2097
+ if (ev.ctrlKey || ev.metaKey) {
2098
+ goToPrevOrNext(datepicker, 1);
2099
+ } else if (ev.shiftKey) {
2100
+ datepicker.enterEditMode();
2101
+ return;
2102
+ } else {
2103
+ moveByArrowKey(datepicker, ev, 1, false);
2104
+ }
2105
+ } else if (key === 'ArrowUp') {
2106
+ if (ev.ctrlKey || ev.metaKey) {
2107
+ switchView(datepicker);
2108
+ } else if (ev.shiftKey) {
2109
+ datepicker.enterEditMode();
2110
+ return;
2111
+ } else {
2112
+ moveByArrowKey(datepicker, ev, -1, true);
2113
+ }
2114
+ } else if (key === 'ArrowDown') {
2115
+ if (ev.shiftKey && !ev.ctrlKey && !ev.metaKey) {
2116
+ datepicker.enterEditMode();
2117
+ return;
2118
+ }
2119
+ moveByArrowKey(datepicker, ev, 1, true);
2120
+ } else if (key === 'Enter') {
2121
+ if (isMinView) {
2122
+ datepicker.setDate(picker.viewDate);
2123
+ return;
2124
+ }
2125
+ picker.changeView(id - 1).render();
2126
+ } else {
2127
+ if (key === 'Escape') {
2128
+ picker.hide();
2129
+ } else if (
2130
+ key === 'Backspace'
2131
+ || key === 'Delete'
2132
+ || (key.length === 1 && !ev.ctrlKey && !ev.metaKey)
2133
+ ) {
2134
+ datepicker.enterEditMode();
2135
+ }
2136
+ return;
2137
+ }
2138
+ }
2139
+ ev.preventDefault();
2140
+ }
2141
+
2142
+ function onFocus(datepicker) {
2143
+ if (datepicker.config.showOnFocus && !datepicker._showing) {
2144
+ datepicker.show();
2145
+ }
2146
+ }
2147
+
2148
+ // for the prevention for entering edit mode while getting focus on click
2149
+ function onMousedown(datepicker, ev) {
2150
+ const el = ev.target;
2151
+ if (datepicker.picker.active || datepicker.config.showOnClick) {
2152
+ el._active = isActiveElement(el);
2153
+ el._clicking = setTimeout(() => {
2154
+ delete el._active;
2155
+ delete el._clicking;
2156
+ }, 2000);
2157
+ }
2158
+ }
2159
+
2160
+ function onClickInput(datepicker, ev) {
2161
+ const el = ev.target;
2162
+ if (!el._clicking) {
2163
+ return;
2164
+ }
2165
+ clearTimeout(el._clicking);
2166
+ delete el._clicking;
2167
+
2168
+ if (el._active) {
2169
+ datepicker.enterEditMode();
2170
+ }
2171
+ delete el._active;
2172
+
2173
+ if (datepicker.config.showOnClick) {
2174
+ datepicker.show();
2175
+ }
2176
+ }
2177
+
2178
+ function onPaste(datepicker, ev) {
2179
+ if (ev.clipboardData.types.includes('text/plain')) {
2180
+ datepicker.enterEditMode();
2181
+ }
2182
+ }
2183
+
2184
+ // for the `document` to delegate the events from outside the picker/input field
2185
+ function onClickOutside(datepicker, ev) {
2186
+ const {element, picker} = datepicker;
2187
+ // check both picker's and input's activeness to make updateOnBlur work in
2188
+ // the cases where...
2189
+ // - picker is hidden by ESC key press → input stays focused
2190
+ // - input is unfocused by closing mobile keyboard → piker is kept shown
2191
+ if (!picker.active && !isActiveElement(element)) {
2192
+ return;
2193
+ }
2194
+ const pickerElem = picker.element;
2195
+ if (findElementInEventPath(ev, el => el === element || el === pickerElem)) {
2196
+ return;
2197
+ }
2198
+ unfocus(datepicker);
2199
+ }
2200
+
2201
+ function stringifyDates(dates, config) {
2202
+ return dates
2203
+ .map(dt => formatDate(dt, config.format, config.locale))
2204
+ .join(config.dateDelimiter);
2205
+ }
2206
+
2207
+ // parse input dates and create an array of time values for selection
2208
+ // returns undefined if there are no valid dates in inputDates
2209
+ // when origDates (current selection) is passed, the function works to mix
2210
+ // the input dates into the current selection
2211
+ function processInputDates(datepicker, inputDates, clear = false) {
2212
+ // const {config, dates: origDates, rangepicker} = datepicker;
2213
+ const {config, dates: origDates, rangeSideIndex} = datepicker;
2214
+ if (inputDates.length === 0) {
2215
+ // empty input is considered valid unless origiDates is passed
2216
+ return clear ? [] : undefined;
2217
+ }
2218
+
2219
+ // const rangeEnd = rangepicker && datepicker === rangepicker.datepickers[1];
2220
+ let newDates = inputDates.reduce((dates, dt) => {
2221
+ let date = parseDate(dt, config.format, config.locale);
2222
+ if (date === undefined) {
2223
+ return dates;
2224
+ }
2225
+ // adjust to 1st of the month/Jan 1st of the year
2226
+ // or to the last day of the monh/Dec 31st of the year if the datepicker
2227
+ // is the range-end picker of a rangepicker
2228
+ date = regularizeDate(date, config.pickLevel, rangeSideIndex);
2229
+ if (
2230
+ isInRange(date, config.minDate, config.maxDate)
2231
+ && !dates.includes(date)
2232
+ && !config.datesDisabled.includes(date)
2233
+ && (config.pickLevel > 0 || !config.daysOfWeekDisabled.includes(new Date(date).getDay()))
2234
+ ) {
2235
+ dates.push(date);
2236
+ }
2237
+ return dates;
2238
+ }, []);
2239
+ if (newDates.length === 0) {
2240
+ return;
2241
+ }
2242
+ if (config.multidate && !clear) {
2243
+ // get the synmetric difference between origDates and newDates
2244
+ newDates = newDates.reduce((dates, date) => {
2245
+ if (!origDates.includes(date)) {
2246
+ dates.push(date);
2247
+ }
2248
+ return dates;
2249
+ }, origDates.filter(date => !newDates.includes(date)));
2250
+ }
2251
+ // do length check always because user can input multiple dates regardless of the mode
2252
+ return config.maxNumberOfDates && newDates.length > config.maxNumberOfDates
2253
+ ? newDates.slice(config.maxNumberOfDates * -1)
2254
+ : newDates;
2255
+ }
2256
+
2257
+ // refresh the UI elements
2258
+ // modes: 1: input only, 2, picker only, 3 both
2259
+ function refreshUI(datepicker, mode = 3, quickRender = true) {
2260
+ const {config, picker, inputField} = datepicker;
2261
+ if (mode & 2) {
2262
+ const newView = picker.active ? config.pickLevel : config.startView;
2263
+ picker.update().changeView(newView).render(quickRender);
2264
+ }
2265
+ if (mode & 1 && inputField) {
2266
+ inputField.value = stringifyDates(datepicker.dates, config);
2267
+ }
2268
+ }
2269
+
2270
+ function setDate(datepicker, inputDates, options) {
2271
+ let {clear, render, autohide, revert} = options;
2272
+ if (render === undefined) {
2273
+ render = true;
2274
+ }
2275
+ if (!render) {
2276
+ autohide = false;
2277
+ } else if (autohide === undefined) {
2278
+ autohide = datepicker.config.autohide;
2279
+ }
2280
+
2281
+ const newDates = processInputDates(datepicker, inputDates, clear);
2282
+ if (!newDates && !revert) {
2283
+ return;
2284
+ }
2285
+ if (newDates && newDates.toString() !== datepicker.dates.toString()) {
2286
+ datepicker.dates = newDates;
2287
+ refreshUI(datepicker, render ? 3 : 1);
2288
+ triggerDatepickerEvent(datepicker, 'changeDate');
2289
+ } else {
2290
+ refreshUI(datepicker, 1);
2291
+ }
2292
+
2293
+ if (autohide) {
2294
+ datepicker.hide();
2295
+ }
2296
+ }
2297
+
2298
+ /**
2299
+ * Class representing a date picker
2300
+ */
2301
+ class Datepicker {
2302
+ /**
2303
+ * Create a date picker
2304
+ * @param {Element} element - element to bind a date picker
2305
+ * @param {Object} [options] - config options
2306
+ * @param {DateRangePicker} [rangepicker] - DateRangePicker instance the
2307
+ * date picker belongs to. Use this only when creating date picker as a part
2308
+ * of date range picker
2309
+ */
2310
+ constructor(element, options = {}, rangepicker = undefined) {
2311
+ element.datepicker = this;
2312
+ this.element = element;
2313
+
2314
+ const config = this.config = Object.assign({
2315
+ buttonClass: (options.buttonClass && String(options.buttonClass)) || 'button',
2316
+ container: null,
2317
+ defaultViewDate: today(),
2318
+ maxDate: undefined,
2319
+ minDate: undefined,
2320
+ }, processOptions(defaultOptions, this));
2321
+ // configure by type
2322
+ const inline = this.inline = element.tagName !== 'INPUT';
2323
+ let inputField;
2324
+ if (inline) {
2325
+ config.container = element;
2326
+ } else {
2327
+ if (options.container) {
2328
+ // omit string type check because it doesn't guarantee to avoid errors
2329
+ // (invalid selector string causes abend with sytax error)
2330
+ config.container = options.container instanceof HTMLElement
2331
+ ? options.container
2332
+ : document.querySelector(options.container);
2333
+ }
2334
+ inputField = this.inputField = element;
2335
+ inputField.classList.add('datepicker-input');
2336
+ }
2337
+ if (rangepicker) {
2338
+ // check validiry
2339
+ const index = rangepicker.inputs.indexOf(inputField);
2340
+ const datepickers = rangepicker.datepickers;
2341
+ if (index < 0 || index > 1 || !Array.isArray(datepickers)) {
2342
+ throw Error('Invalid rangepicker object.');
2343
+ }
2344
+ // attach itaelf to the rangepicker here so that processInputDates() can
2345
+ // determine if this is the range-end picker of the rangepicker while
2346
+ // setting inital values when pickLevel > 0
2347
+ datepickers[index] = this;
2348
+ // add getter for rangepicker
2349
+ Object.defineProperty(this, 'rangepicker', {
2350
+ get() {
2351
+ return rangepicker;
2352
+ },
2353
+ });
2354
+ Object.defineProperty(this, 'rangeSideIndex', {
2355
+ get() {
2356
+ return index;
2357
+ },
2358
+ });
2359
+ }
2360
+
2361
+ // set up config
2362
+ this._options = options;
2363
+ Object.assign(config, processOptions(options, this));
2364
+
2365
+ // set initial dates
2366
+ let initialDates;
2367
+ if (inline) {
2368
+ initialDates = stringToArray(element.dataset.date, config.dateDelimiter);
2369
+ delete element.dataset.date;
2370
+ } else {
2371
+ initialDates = stringToArray(inputField.value, config.dateDelimiter);
2372
+ }
2373
+ this.dates = [];
2374
+ // process initial value
2375
+ const inputDateValues = processInputDates(this, initialDates);
2376
+ if (inputDateValues && inputDateValues.length > 0) {
2377
+ this.dates = inputDateValues;
2378
+ }
2379
+ if (inputField) {
2380
+ inputField.value = stringifyDates(this.dates, config);
2381
+ }
2382
+
2383
+ const picker = this.picker = new Picker(this);
2384
+
2385
+ if (inline) {
2386
+ this.show();
2387
+ } else {
2388
+ // set up event listeners in other modes
2389
+ const onMousedownDocument = onClickOutside.bind(null, this);
2390
+ const listeners = [
2391
+ [inputField, 'keydown', onKeydown.bind(null, this)],
2392
+ [inputField, 'focus', onFocus.bind(null, this)],
2393
+ [inputField, 'mousedown', onMousedown.bind(null, this)],
2394
+ [inputField, 'click', onClickInput.bind(null, this)],
2395
+ [inputField, 'paste', onPaste.bind(null, this)],
2396
+ [document, 'mousedown', onMousedownDocument],
2397
+ [document, 'touchstart', onMousedownDocument],
2398
+ [window, 'resize', picker.place.bind(picker)]
2399
+ ];
2400
+ registerListeners(this, listeners);
2401
+ }
2402
+ }
2403
+
2404
+ /**
2405
+ * Format Date object or time value in given format and language
2406
+ * @param {Date|Number} date - date or time value to format
2407
+ * @param {String|Object} format - format string or object that contains
2408
+ * toDisplay() custom formatter, whose signature is
2409
+ * - args:
2410
+ * - date: {Date} - Date instance of the date passed to the method
2411
+ * - format: {Object} - the format object passed to the method
2412
+ * - locale: {Object} - locale for the language specified by `lang`
2413
+ * - return:
2414
+ * {String} formatted date
2415
+ * @param {String} [lang=en] - language code for the locale to use
2416
+ * @return {String} formatted date
2417
+ */
2418
+ static formatDate(date, format, lang) {
2419
+ return formatDate(date, format, lang && locales[lang] || locales.en);
2420
+ }
2421
+
2422
+ /**
2423
+ * Parse date string
2424
+ * @param {String|Date|Number} dateStr - date string, Date object or time
2425
+ * value to parse
2426
+ * @param {String|Object} format - format string or object that contains
2427
+ * toValue() custom parser, whose signature is
2428
+ * - args:
2429
+ * - dateStr: {String|Date|Number} - the dateStr passed to the method
2430
+ * - format: {Object} - the format object passed to the method
2431
+ * - locale: {Object} - locale for the language specified by `lang`
2432
+ * - return:
2433
+ * {Date|Number} parsed date or its time value
2434
+ * @param {String} [lang=en] - language code for the locale to use
2435
+ * @return {Number} time value of parsed date
2436
+ */
2437
+ static parseDate(dateStr, format, lang) {
2438
+ return parseDate(dateStr, format, lang && locales[lang] || locales.en);
2439
+ }
2440
+
2441
+ /**
2442
+ * @type {Object} - Installed locales in `[languageCode]: localeObject` format
2443
+ * en`:_English (US)_ is pre-installed.
2444
+ */
2445
+ static get locales() {
2446
+ return locales;
2447
+ }
2448
+
2449
+ /**
2450
+ * @type {Boolean} - Whether the picker element is shown. `true` whne shown
2451
+ */
2452
+ get active() {
2453
+ return !!(this.picker && this.picker.active);
2454
+ }
2455
+
2456
+ /**
2457
+ * @type {HTMLDivElement} - DOM object of picker element
2458
+ */
2459
+ get pickerElement() {
2460
+ return this.picker ? this.picker.element : undefined;
2461
+ }
2462
+
2463
+ /**
2464
+ * Set new values to the config options
2465
+ * @param {Object} options - config options to update
2466
+ */
2467
+ setOptions(options) {
2468
+ const picker = this.picker;
2469
+ const newOptions = processOptions(options, this);
2470
+ Object.assign(this._options, options);
2471
+ Object.assign(this.config, newOptions);
2472
+ picker.setOptions(newOptions);
2473
+
2474
+ refreshUI(this, 3);
2475
+ }
2476
+
2477
+ /**
2478
+ * Show the picker element
2479
+ */
2480
+ show() {
2481
+ if (this.inputField) {
2482
+ if (this.inputField.disabled) {
2483
+ return;
2484
+ }
2485
+ if (!isActiveElement(this.inputField) && !this.config.disableTouchKeyboard) {
2486
+ this._showing = true;
2487
+ this.inputField.focus();
2488
+ delete this._showing;
2489
+ }
2490
+ }
2491
+ this.picker.show();
2492
+ }
2493
+
2494
+ /**
2495
+ * Hide the picker element
2496
+ * Not available on inline picker
2497
+ */
2498
+ hide() {
2499
+ if (this.inline) {
2500
+ return;
2501
+ }
2502
+ this.picker.hide();
2503
+ this.picker.update().changeView(this.config.startView).render();
2504
+ }
2505
+
2506
+ /**
2507
+ * Destroy the Datepicker instance
2508
+ * @return {Detepicker} - the instance destroyed
2509
+ */
2510
+ destroy() {
2511
+ this.hide();
2512
+ unregisterListeners(this);
2513
+ this.picker.detach();
2514
+ if (!this.inline) {
2515
+ this.inputField.classList.remove('datepicker-input');
2516
+ }
2517
+ delete this.element.datepicker;
2518
+ return this;
2519
+ }
2520
+
2521
+ /**
2522
+ * Get the selected date(s)
2523
+ *
2524
+ * The method returns a Date object of selected date by default, and returns
2525
+ * an array of selected dates in multidate mode. If format string is passed,
2526
+ * it returns date string(s) formatted in given format.
2527
+ *
2528
+ * @param {String} [format] - Format string to stringify the date(s)
2529
+ * @return {Date|String|Date[]|String[]} - selected date(s), or if none is
2530
+ * selected, empty array in multidate mode and untitled in sigledate mode
2531
+ */
2532
+ getDate(format = undefined) {
2533
+ const callback = format
2534
+ ? date => formatDate(date, format, this.config.locale)
2535
+ : date => new Date(date);
2536
+
2537
+ if (this.config.multidate) {
2538
+ return this.dates.map(callback);
2539
+ }
2540
+ if (this.dates.length > 0) {
2541
+ return callback(this.dates[0]);
2542
+ }
2543
+ }
2544
+
2545
+ /**
2546
+ * Set selected date(s)
2547
+ *
2548
+ * In multidate mode, you can pass multiple dates as a series of arguments
2549
+ * or an array. (Since each date is parsed individually, the type of the
2550
+ * dates doesn't have to be the same.)
2551
+ * The given dates are used to toggle the select status of each date. The
2552
+ * number of selected dates is kept from exceeding the length set to
2553
+ * maxNumberOfDates.
2554
+ *
2555
+ * With clear: true option, the method can be used to clear the selection
2556
+ * and to replace the selection instead of toggling in multidate mode.
2557
+ * If the option is passed with no date arguments or an empty dates array,
2558
+ * it works as "clear" (clear the selection then set nothing), and if the
2559
+ * option is passed with new dates to select, it works as "replace" (clear
2560
+ * the selection then set the given dates)
2561
+ *
2562
+ * When render: false option is used, the method omits re-rendering the
2563
+ * picker element. In this case, you need to call refresh() method later in
2564
+ * order for the picker element to reflect the changes. The input field is
2565
+ * refreshed always regardless of this option.
2566
+ *
2567
+ * When invalid (unparsable, repeated, disabled or out-of-range) dates are
2568
+ * passed, the method ignores them and applies only valid ones. In the case
2569
+ * that all the given dates are invalid, which is distinguished from passing
2570
+ * no dates, the method considers it as an error and leaves the selection
2571
+ * untouched. (The input field also remains untouched unless revert: true
2572
+ * option is used.)
2573
+ *
2574
+ * @param {...(Date|Number|String)|Array} [dates] - Date strings, Date
2575
+ * objects, time values or mix of those for new selection
2576
+ * @param {Object} [options] - function options
2577
+ * - clear: {boolean} - Whether to clear the existing selection
2578
+ * defualt: false
2579
+ * - render: {boolean} - Whether to re-render the picker element
2580
+ * default: true
2581
+ * - autohide: {boolean} - Whether to hide the picker element after re-render
2582
+ * Ignored when used with render: false
2583
+ * default: config.autohide
2584
+ * - revert: {boolean} - Whether to refresh the input field when all the
2585
+ * passed dates are invalid
2586
+ * default: false
2587
+ */
2588
+ setDate(...args) {
2589
+ const dates = [...args];
2590
+ const opts = {};
2591
+ const lastArg = lastItemOf(args);
2592
+ if (
2593
+ typeof lastArg === 'object'
2594
+ && !Array.isArray(lastArg)
2595
+ && !(lastArg instanceof Date)
2596
+ && lastArg
2597
+ ) {
2598
+ Object.assign(opts, dates.pop());
2599
+ }
2600
+
2601
+ const inputDates = Array.isArray(dates[0]) ? dates[0] : dates;
2602
+ setDate(this, inputDates, opts);
2603
+ }
2604
+
2605
+ /**
2606
+ * Update the selected date(s) with input field's value
2607
+ * Not available on inline picker
2608
+ *
2609
+ * The input field will be refreshed with properly formatted date string.
2610
+ *
2611
+ * In the case that all the entered dates are invalid (unparsable, repeated,
2612
+ * disabled or out-of-range), whixh is distinguished from empty input field,
2613
+ * the method leaves the input field untouched as well as the selection by
2614
+ * default. If revert: true option is used in this case, the input field is
2615
+ * refreshed with the existing selection.
2616
+ *
2617
+ * @param {Object} [options] - function options
2618
+ * - autohide: {boolean} - whether to hide the picker element after refresh
2619
+ * default: false
2620
+ * - revert: {boolean} - Whether to refresh the input field when all the
2621
+ * passed dates are invalid
2622
+ * default: false
2623
+ */
2624
+ update(options = undefined) {
2625
+ if (this.inline) {
2626
+ return;
2627
+ }
2628
+
2629
+ const opts = Object.assign(options || {}, {clear: true, render: true});
2630
+ const inputDates = stringToArray(this.inputField.value, this.config.dateDelimiter);
2631
+ setDate(this, inputDates, opts);
2632
+ }
2633
+
2634
+ /**
2635
+ * Refresh the picker element and the associated input field
2636
+ * @param {String} [target] - target item when refreshing one item only
2637
+ * 'picker' or 'input'
2638
+ * @param {Boolean} [forceRender] - whether to re-render the picker element
2639
+ * regardless of its state instead of optimized refresh
2640
+ */
2641
+ refresh(target = undefined, forceRender = false) {
2642
+ if (target && typeof target !== 'string') {
2643
+ forceRender = target;
2644
+ target = undefined;
2645
+ }
2646
+
2647
+ let mode;
2648
+ if (target === 'picker') {
2649
+ mode = 2;
2650
+ } else if (target === 'input') {
2651
+ mode = 1;
2652
+ } else {
2653
+ mode = 3;
2654
+ }
2655
+ refreshUI(this, mode, !forceRender);
2656
+ }
2657
+
2658
+ /**
2659
+ * Enter edit mode
2660
+ * Not available on inline picker or when the picker element is hidden
2661
+ */
2662
+ enterEditMode() {
2663
+ if (this.inline || !this.picker.active || this.editMode) {
2664
+ return;
2665
+ }
2666
+ this.editMode = true;
2667
+ this.inputField.classList.add('in-edit');
2668
+ }
2669
+
2670
+ /**
2671
+ * Exit from edit mode
2672
+ * Not available on inline picker
2673
+ * @param {Object} [options] - function options
2674
+ * - update: {boolean} - whether to call update() after exiting
2675
+ * If false, input field is revert to the existing selection
2676
+ * default: false
2677
+ */
2678
+ exitEditMode(options = undefined) {
2679
+ if (this.inline || !this.editMode) {
2680
+ return;
2681
+ }
2682
+ const opts = Object.assign({update: false}, options);
2683
+ delete this.editMode;
2684
+ this.inputField.classList.remove('in-edit');
2685
+ if (opts.update) {
2686
+ this.update(opts);
2687
+ }
2688
+ }
2689
+ }
2690
+
2691
+ // filter out the config options inapproprite to pass to Datepicker
2692
+ function filterOptions(options) {
2693
+ const newOpts = Object.assign({}, options);
2694
+
2695
+ delete newOpts.inputs;
2696
+ delete newOpts.allowOneSidedRange;
2697
+ delete newOpts.maxNumberOfDates; // to ensure each datepicker handles a single date
2698
+
2699
+ return newOpts;
2700
+ }
2701
+
2702
+ function setupDatepicker(rangepicker, changeDateListener, el, options) {
2703
+ registerListeners(rangepicker, [
2704
+ [el, 'changeDate', changeDateListener],
2705
+ ]);
2706
+ new Datepicker(el, options, rangepicker);
2707
+ }
2708
+
2709
+ function onChangeDate(rangepicker, ev) {
2710
+ // to prevent both datepickers trigger the other side's update each other
2711
+ if (rangepicker._updating) {
2712
+ return;
2713
+ }
2714
+ rangepicker._updating = true;
2715
+
2716
+ const target = ev.target;
2717
+ if (target.datepicker === undefined) {
2718
+ return;
2719
+ }
2720
+
2721
+ const datepickers = rangepicker.datepickers;
2722
+ const setDateOptions = {render: false};
2723
+ const changedSide = rangepicker.inputs.indexOf(target);
2724
+ const otherSide = changedSide === 0 ? 1 : 0;
2725
+ const changedDate = datepickers[changedSide].dates[0];
2726
+ const otherDate = datepickers[otherSide].dates[0];
2727
+
2728
+ if (changedDate !== undefined && otherDate !== undefined) {
2729
+ // if the start of the range > the end, swap them
2730
+ if (changedSide === 0 && changedDate > otherDate) {
2731
+ datepickers[0].setDate(otherDate, setDateOptions);
2732
+ datepickers[1].setDate(changedDate, setDateOptions);
2733
+ } else if (changedSide === 1 && changedDate < otherDate) {
2734
+ datepickers[0].setDate(changedDate, setDateOptions);
2735
+ datepickers[1].setDate(otherDate, setDateOptions);
2736
+ }
2737
+ } else if (!rangepicker.allowOneSidedRange) {
2738
+ // to prevent the range from becoming one-sided, copy changed side's
2739
+ // selection (no matter if it's empty) to the other side
2740
+ if (changedDate !== undefined || otherDate !== undefined) {
2741
+ setDateOptions.clear = true;
2742
+ datepickers[otherSide].setDate(datepickers[changedSide].dates, setDateOptions);
2743
+ }
2744
+ }
2745
+ datepickers[0].picker.update().render();
2746
+ datepickers[1].picker.update().render();
2747
+ delete rangepicker._updating;
2748
+ }
2749
+
2750
+ /**
2751
+ * Class representing a date range picker
2752
+ */
2753
+ class DateRangePicker {
2754
+ /**
2755
+ * Create a date range picker
2756
+ * @param {Element} element - element to bind a date range picker
2757
+ * @param {Object} [options] - config options
2758
+ */
2759
+ constructor(element, options = {}) {
2760
+ const inputs = Array.isArray(options.inputs)
2761
+ ? options.inputs
2762
+ : Array.from(element.querySelectorAll('input'));
2763
+ if (inputs.length < 2) {
2764
+ return;
2765
+ }
2766
+
2767
+ element.rangepicker = this;
2768
+ this.element = element;
2769
+ this.inputs = inputs.slice(0, 2);
2770
+ this.allowOneSidedRange = !!options.allowOneSidedRange;
2771
+
2772
+ const changeDateListener = onChangeDate.bind(null, this);
2773
+ const cleanOptions = filterOptions(options);
2774
+ // in order for initial date setup to work right when pcicLvel > 0,
2775
+ // let Datepicker constructor add the instance to the rangepicker
2776
+ const datepickers = [];
2777
+ Object.defineProperty(this, 'datepickers', {
2778
+ get() {
2779
+ return datepickers;
2780
+ },
2781
+ });
2782
+ setupDatepicker(this, changeDateListener, this.inputs[0], cleanOptions);
2783
+ setupDatepicker(this, changeDateListener, this.inputs[1], cleanOptions);
2784
+ Object.freeze(datepickers);
2785
+ // normalize the range if inital dates are given
2786
+ if (datepickers[0].dates.length > 0) {
2787
+ onChangeDate(this, {target: this.inputs[0]});
2788
+ } else if (datepickers[1].dates.length > 0) {
2789
+ onChangeDate(this, {target: this.inputs[1]});
2790
+ }
2791
+ }
2792
+
2793
+ /**
2794
+ * @type {Array} - selected date of the linked date pickers
2795
+ */
2796
+ get dates() {
2797
+ return this.datepickers.length === 2
2798
+ ? [
2799
+ this.datepickers[0].dates[0],
2800
+ this.datepickers[1].dates[0],
2801
+ ]
2802
+ : undefined;
2803
+ }
2804
+
2805
+ /**
2806
+ * Set new values to the config options
2807
+ * @param {Object} options - config options to update
2808
+ */
2809
+ setOptions(options) {
2810
+ this.allowOneSidedRange = !!options.allowOneSidedRange;
2811
+
2812
+ const cleanOptions = filterOptions(options);
2813
+ this.datepickers[0].setOptions(cleanOptions);
2814
+ this.datepickers[1].setOptions(cleanOptions);
2815
+ }
2816
+
2817
+ /**
2818
+ * Destroy the DateRangePicker instance
2819
+ * @return {DateRangePicker} - the instance destroyed
2820
+ */
2821
+ destroy() {
2822
+ this.datepickers[0].destroy();
2823
+ this.datepickers[1].destroy();
2824
+ unregisterListeners(this);
2825
+ delete this.element.rangepicker;
2826
+ }
2827
+
2828
+ /**
2829
+ * Get the start and end dates of the date range
2830
+ *
2831
+ * The method returns Date objects by default. If format string is passed,
2832
+ * it returns date strings formatted in given format.
2833
+ * The result array always contains 2 items (start date/end date) and
2834
+ * undefined is used for unselected side. (e.g. If none is selected,
2835
+ * the result will be [undefined, undefined]. If only the end date is set
2836
+ * when allowOneSidedRange config option is true, [undefined, endDate] will
2837
+ * be returned.)
2838
+ *
2839
+ * @param {String} [format] - Format string to stringify the dates
2840
+ * @return {Array} - Start and end dates
2841
+ */
2842
+ getDates(format = undefined) {
2843
+ const callback = format
2844
+ ? date => formatDate(date, format, this.datepickers[0].config.locale)
2845
+ : date => new Date(date);
2846
+
2847
+ return this.dates.map(date => date === undefined ? date : callback(date));
2848
+ }
2849
+
2850
+ /**
2851
+ * Set the start and end dates of the date range
2852
+ *
2853
+ * The method calls datepicker.setDate() internally using each of the
2854
+ * arguments in start→end order.
2855
+ *
2856
+ * When a clear: true option object is passed instead of a date, the method
2857
+ * clears the date.
2858
+ *
2859
+ * If an invalid date, the same date as the current one or an option object
2860
+ * without clear: true is passed, the method considers that argument as an
2861
+ * "ineffective" argument because calling datepicker.setDate() with those
2862
+ * values makes no changes to the date selection.
2863
+ *
2864
+ * When the allowOneSidedRange config option is false, passing {clear: true}
2865
+ * to clear the range works only when it is done to the last effective
2866
+ * argument (in other words, passed to rangeEnd or to rangeStart along with
2867
+ * ineffective rangeEnd). This is because when the date range is changed,
2868
+ * it gets normalized based on the last change at the end of the changing
2869
+ * process.
2870
+ *
2871
+ * @param {Date|Number|String|Object} rangeStart - Start date of the range
2872
+ * or {clear: true} to clear the date
2873
+ * @param {Date|Number|String|Object} rangeEnd - End date of the range
2874
+ * or {clear: true} to clear the date
2875
+ */
2876
+ setDates(rangeStart, rangeEnd) {
2877
+ const [datepicker0, datepicker1] = this.datepickers;
2878
+ const origDates = this.dates;
2879
+
2880
+ // If range normalization runs on every change, we can't set a new range
2881
+ // that starts after the end of the current range correctly because the
2882
+ // normalization process swaps start↔︎end right after setting the new start
2883
+ // date. To prevent this, the normalization process needs to run once after
2884
+ // both of the new dates are set.
2885
+ this._updating = true;
2886
+ datepicker0.setDate(rangeStart);
2887
+ datepicker1.setDate(rangeEnd);
2888
+ delete this._updating;
2889
+
2890
+ if (datepicker1.dates[0] !== origDates[1]) {
2891
+ onChangeDate(this, {target: this.inputs[1]});
2892
+ } else if (datepicker0.dates[0] !== origDates[0]) {
2893
+ onChangeDate(this, {target: this.inputs[0]});
2894
+ }
2895
+ }
2896
+ }
2897
+
2898
+ const verdocsFieldDateCss = ".datepicker{display:none}.datepicker.active{display:block}.datepicker-dropdown{position:absolute;top:0;left:0;z-index:20;padding-top:4px}.datepicker-dropdown.datepicker-orient-top{padding-top:0;padding-bottom:4px}.datepicker-picker{display:inline-block;border-radius:4px;background-color:white}.datepicker-dropdown .datepicker-picker{-webkit-box-shadow:0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);box-shadow:0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1)}.datepicker-picker span{display:block;-ms-flex:1;flex:1;border:0;border-radius:4px;cursor:default;text-align:center;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker-main{padding:2px}.datepicker-footer{-webkit-box-shadow:inset 0 1px 1px rgba(10, 10, 10, 0.1);box-shadow:inset 0 1px 1px rgba(10, 10, 10, 0.1);background-color:whitesmoke}.datepicker-grid,.datepicker-view .days-of-week,.datepicker-view,.datepicker-controls{display:-ms-flexbox;display:flex}.datepicker-grid{-ms-flex-wrap:wrap;flex-wrap:wrap}.datepicker-view .days .datepicker-cell,.datepicker-view .dow{-ms-flex-preferred-size:14.2857142857%;flex-basis:14.2857142857%}.datepicker-view.datepicker-grid .datepicker-cell{-ms-flex-preferred-size:25%;flex-basis:25%}.datepicker-cell,.datepicker-view .week{height:2.25rem;line-height:2.25rem}.datepicker-title{-webkit-box-shadow:inset 0 -1px 1px rgba(10, 10, 10, 0.1);box-shadow:inset 0 -1px 1px rgba(10, 10, 10, 0.1);background-color:whitesmoke;padding:0.375rem 0.75rem;text-align:center;font-weight:700}.datepicker-header .datepicker-controls{padding:2px 2px 0}.datepicker-controls .button{display:-ms-inline-flexbox;display:inline-flex;position:relative;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin:0;border:1px solid #dbdbdb;border-radius:4px;-webkit-box-shadow:none;box-shadow:none;background-color:white;cursor:pointer;padding:calc(0.375em - 1px) 0.75em;height:2.25em;vertical-align:top;text-align:center;line-height:1.5;white-space:nowrap;color:#363636;font-size:1rem}.datepicker-controls .button:focus,.datepicker-controls .button:active{outline:none}.datepicker-controls .button:hover{border-color:#b5b5b5;color:#363636}.datepicker-controls .button:focus{border-color:#3273dc;color:#363636}.datepicker-controls .button:focus:not(:active){-webkit-box-shadow:0 0 0 0.125em rgba(50, 115, 220, 0.25);box-shadow:0 0 0 0.125em rgba(50, 115, 220, 0.25)}.datepicker-controls .button:active{border-color:#4a4a4a;color:#363636}.datepicker-controls .button[disabled]{cursor:not-allowed}.datepicker-header .datepicker-controls .button{border-color:transparent;font-weight:bold}.datepicker-header .datepicker-controls .button:hover{background-color:#f9f9f9}.datepicker-header .datepicker-controls .button:focus:not(:active){-webkit-box-shadow:0 0 0 0.125em rgba(255, 255, 255, 0.25);box-shadow:0 0 0 0.125em rgba(255, 255, 255, 0.25)}.datepicker-header .datepicker-controls .button:active{background-color:#f2f2f2}.datepicker-header .datepicker-controls .button[disabled]{-webkit-box-shadow:none;box-shadow:none}.datepicker-footer .datepicker-controls .button{margin:calc(0.375rem - 1px) 0.375rem;border-radius:2px;width:100%;font-size:0.75rem}.datepicker-controls .view-switch{-ms-flex:auto;flex:auto}.datepicker-controls .prev-btn,.datepicker-controls .next-btn{padding-right:0.375rem;padding-left:0.375rem;width:2.25rem}.datepicker-controls .prev-btn.disabled,.datepicker-controls .next-btn.disabled{visibility:hidden}.datepicker-view .dow{height:1.5rem;line-height:1.5rem;font-size:0.875rem;font-weight:700}.datepicker-view .week{width:2.25rem;color:#b5b5b5;font-size:0.75rem}@media (max-width: 22.5rem){.datepicker-view .week{width:1.96875rem}}.datepicker-grid{width:15.75rem}@media (max-width: 22.5rem){.calendar-weeks+.days .datepicker-grid{width:13.78125rem}}.datepicker-cell:not(.disabled):hover{background-color:#f9f9f9;cursor:pointer}.datepicker-cell.focused:not(.selected){background-color:#e8e8e8}.datepicker-cell.selected,.datepicker-cell.selected:hover{background-color:#3273dc;color:#fff;font-weight:600}.datepicker-cell.disabled{color:#dbdbdb}.datepicker-cell.prev:not(.disabled),.datepicker-cell.next:not(.disabled){color:#7a7a7a}.datepicker-cell.prev.selected,.datepicker-cell.next.selected{color:#e6e6e6}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today){border-radius:0;background-color:whitesmoke}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today):not(.disabled):hover{background-color:#eeeeee}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today).focused{background-color:#e8e8e8}.datepicker-cell.today:not(.selected){background-color:#00d1b2}.datepicker-cell.today:not(.selected):not(.disabled){color:#fff}.datepicker-cell.today.focused:not(.selected){background-color:#00c4a7}.datepicker-cell.range-end:not(.selected),.datepicker-cell.range-start:not(.selected){background-color:#b5b5b5;color:#fff}.datepicker-cell.range-end.focused:not(.selected),.datepicker-cell.range-start.focused:not(.selected){background-color:#afafaf}.datepicker-cell.range-start{border-radius:4px 0 0 4px}.datepicker-cell.range-end{border-radius:0 4px 4px 0}.datepicker-cell.range{border-radius:0;background-color:#dbdbdb}.datepicker-cell.range:not(.disabled):not(.focused):not(.today):hover{background-color:#d5d5d5}.datepicker-cell.range.disabled{color:#c2c2c2}.datepicker-cell.range.focused{background-color:#cfcfcf}.datepicker-view.datepicker-grid .datepicker-cell{height:4.5rem;line-height:4.5rem}.datepicker-input.in-edit{border-color:#2366d1}.datepicker-input.in-edit:focus,.datepicker-input.in-edit:active{-webkit-box-shadow:0 0 0.25em 0.25em rgba(35, 102, 209, 0.2);box-shadow:0 0 0.25em 0.25em rgba(35, 102, 209, 0.2)}verdocs-field-date{font-family:sans-serif;font-family:var(--verdocs-font);width:64px;height:15px;display:block;font-size:11px;position:relative;letter-spacing:0.3px;background-color:transparent;-webkit-transform-origin:bottom left;transform-origin:bottom left}verdocs-field-date input{-webkit-box-sizing:border-box;box-sizing:border-box;color:rgba(0, 0, 0, 0.87);font-weight:500;-webkit-transform-origin:0 0;transform-origin:0 0;height:100%;width:100%;background:none;font-size:11px;border:1px solid #ccc;-webkit-appearance:none;-moz-appearance:none;appearance:none}verdocs-field-date input.hide{display:none}verdocs-field-date.required input{border:1px solid var(--verdocs-required-color)}verdocs-field-date.focused{-webkit-animation:verdocs-field-pulse 0.75s 2;animation:verdocs-field-pulse 0.75s 2}";
2899
+
2900
+ const VerdocsFieldDate = class {
2901
+ constructor(hostRef) {
2902
+ registerInstance(this, hostRef);
2903
+ this.fieldFocus = createEvent(this, "fieldFocus", 7);
2904
+ this.fieldBlur = createEvent(this, "fieldBlur", 7);
2905
+ this.fieldChange = createEvent(this, "fieldChange", 7);
2906
+ this.fieldInput = createEvent(this, "fieldInput", 7);
2907
+ /**
2908
+ * A placeholder to assist the user in completing the field.
2909
+ */
2910
+ this.placeholder = 'Select Date';
2911
+ /**
2912
+ * Sets the tabIndex of the input element.
2913
+ */
2914
+ this.order = 1;
2915
+ /**
2916
+ * Sets the value of the input element.
2917
+ */
2918
+ this.value = '';
2919
+ /**
2920
+ * If true, the field will be marked required.
2921
+ */
2922
+ this.required = false;
2923
+ /**
2924
+ * Sets the disabled attribute of the input element.
2925
+ */
2926
+ this.disabled = false;
2927
+ this.focused = false;
2928
+ }
2929
+ async focusField() {
2930
+ this.focused = true;
2931
+ this.el.focus();
2932
+ this.fieldFocus.emit(true);
2933
+ }
2934
+ componentDidLoad() {
2935
+ new Datepicker(this.el, {
2936
+ autohide: true,
2937
+ todayHighlight: true,
2938
+ });
2939
+ this.el.addEventListener('changeDate', (e) => {
2940
+ console.log('changeDate', e.detail.date.toISOString());
2941
+ });
2942
+ }
2943
+ handleBlur() {
2944
+ this.focused = false;
2945
+ this.fieldBlur.emit(true);
2946
+ }
2947
+ handleFocus() {
2948
+ this.focused = true;
2949
+ this.fieldFocus.emit(true);
2950
+ }
2951
+ handleChange(e) {
2952
+ this.fieldChange.emit(e.target.value);
2953
+ }
2954
+ handleInput(e) {
2955
+ this.fieldInput.emit(e.target.value);
2956
+ }
2957
+ // NOTE: We don't use a "date" field here because browsers vary widely in their formatting of it.
2958
+ render() {
2959
+ return (h(Host, { class: { focused: this.focused, required: this.required, storybook: !!(window === null || window === void 0 ? void 0 : window['STORYBOOK_ENV']) } }, h("input", { type: "text", value: "", placeholder: this.placeholder, required: this.required, ref: el => (this.el = el), onBlur: () => this.handleBlur(), onFocus: () => this.handleFocus(), onChange: e => this.handleChange(e), onInput: e => this.handleInput(e) })));
2960
+ }
2961
+ };
2962
+ VerdocsFieldDate.style = verdocsFieldDateCss;
2963
+
2964
+ export { VerdocsFieldDate as verdocs_field_date };